From b1d048ca5cf2535f72a6462a28e03ac83b2a0252 Mon Sep 17 00:00:00 2001 From: LIghtJUNction Date: Sun, 22 Mar 2026 19:50:26 +0800 Subject: [PATCH] chore: resolve merge conflicts (prefer HEAD) --- .github/workflows/unit_tests.yml | 37 + .gitignore | 1 + astrbot/core/astr_agent_run_util.py | 9 +- astrbot/core/astr_main_agent.py | 65 + astrbot/core/astr_main_agent_resources.py | 13 + astrbot/core/computer/computer_client.py | 2 +- astrbot/core/config/default.py | 66 + astrbot/core/db/vec_db/faiss_impl/vec_db.py | 6 + astrbot/core/pipeline/scheduler.py | 1 + astrbot/core/platform/astr_message_event.py | 21 + .../core/platform/sources/lark/lark_event.py | 74 +- .../platform/sources/telegram/tg_adapter.py | 4 +- .../sources/weixin_oc/weixin_oc_adapter.py | 926 +++ .../sources/weixin_oc/weixin_oc_client.py | 228 + .../sources/weixin_oc/weixin_oc_event.py | 86 + .../core/provider/sources/openai_source.py | 3 + .../provider/sources/whisper_api_source.py | 18 +- astrbot/core/skills/skill_manager.py | 31 +- astrbot/core/utils/media_utils.py | 2 + changelogs/v4.21.0.md | 109 + changelogs/v4.22.0.md | 37 + dashboard/package.json | 3 +- dashboard/pnpm-lock.yaml | 6104 +++++++++++++++++ .../mdi-subset/materialdesignicons-subset.css | 10 +- .../materialdesignicons-webfont-subset.woff | Bin 16172 -> 16252 bytes .../materialdesignicons-webfont-subset.woff2 | Bin 12996 -> 13068 bytes .../components/extension/MarketPluginCard.vue | 166 +- .../components/extension/PinnedPluginItem.vue | 183 + .../extension/PluginSortControl.vue | 1 + .../src/components/shared/ExtensionCard.vue | 15 +- .../src/components/shared/QrCodeViewer.vue | 90 + .../en-US/features/config-metadata.json | 24 + .../locales/en-US/features/extension.json | 10 + .../i18n/locales/en-US/features/platform.json | 7 + .../ru-RU/features/config-metadata.json | 24 + .../locales/ru-RU/features/extension.json | 11 +- .../i18n/locales/ru-RU/features/platform.json | 25 +- .../zh-CN/features/config-metadata.json | 24 + .../locales/zh-CN/features/extension.json | 15 +- .../i18n/locales/zh-CN/features/platform.json | 7 + dashboard/src/stores/common.js | 1 + dashboard/src/utils/platformUtils.js | 3 + dashboard/src/views/PlatformPage.vue | 75 +- .../views/extension/InstalledPluginsTab.vue | 194 + .../src/views/extension/MarketPluginsTab.vue | 23 + .../src/views/extension/useExtensionPage.js | 167 +- .../src/views/persona/FolderBreadcrumb.vue | 25 +- dashboard/src/views/persona/FolderCard.vue | 36 +- dashboard/src/views/persona/FolderTree.vue | 72 +- docs/.vitepress/config.mjs | 2 + docs/en/platform/weixin_oc.md | 74 + docs/zh/platform/weixin_oc.md | 80 + docs/zh/platform/weixin_qr_entry.png | Bin 0 -> 46799 bytes pyproject.toml | 3 +- scripts/run_pytests_ci.sh | 35 + tests/test_computer_skill_sync.py | 34 +- tests/test_plugin_manager.py | 4 +- tests/test_skill_manager_sandbox_cache.py | 2 +- tests/test_skill_metadata_enrichment.py | 6 +- tests/test_tool_loop_agent_runner.py | 83 + tests/test_whisper_api_source.py | 72 + tests/unit/test_computer.py | 4 + tests/unit/test_faiss_vec_db.py | 20 + 63 files changed, 9249 insertions(+), 224 deletions(-) create mode 100644 .github/workflows/unit_tests.yml create mode 100644 astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py create mode 100644 astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py create mode 100644 astrbot/core/platform/sources/weixin_oc/weixin_oc_event.py create mode 100644 changelogs/v4.21.0.md create mode 100644 changelogs/v4.22.0.md create mode 100644 dashboard/pnpm-lock.yaml create mode 100644 dashboard/src/components/extension/PinnedPluginItem.vue create mode 100644 dashboard/src/components/shared/QrCodeViewer.vue create mode 100644 docs/en/platform/weixin_oc.md create mode 100644 docs/zh/platform/weixin_oc.md create mode 100644 docs/zh/platform/weixin_qr_entry.png create mode 100644 scripts/run_pytests_ci.sh create mode 100644 tests/test_whisper_api_source.py create mode 100644 tests/unit/test_faiss_vec_db.py diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml new file mode 100644 index 000000000..dfaf43d68 --- /dev/null +++ b/.github/workflows/unit_tests.yml @@ -0,0 +1,37 @@ +name: Unit Tests + +on: + push: + branches: + - master + paths-ignore: + - 'README*.md' + - 'changelogs/**' + - 'dashboard/**' + pull_request: + workflow_dispatch: + +jobs: + unit-tests: + name: Run pytest suite + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: '3.12' + + - name: Install uv + run: | + python -m pip install --upgrade pip + python -m pip install uv + + - name: Run tests + run: | + chmod +x scripts/run_pytests_ci.sh + bash ./scripts/run_pytests_ci.sh ./tests diff --git a/.gitignore b/.gitignore index c71527b6a..1e6b7221d 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,4 @@ GenieData/ .env dashboard/warker.js +dashboard/bun.lock diff --git a/astrbot/core/astr_agent_run_util.py b/astrbot/core/astr_agent_run_util.py index d269185b2..113ca67c1 100644 --- a/astrbot/core/astr_agent_run_util.py +++ b/astrbot/core/astr_agent_run_util.py @@ -182,8 +182,13 @@ async def run_agent( # 对于其他情况,暂时先不处理 continue elif resp.type == "tool_call": - if agent_runner.streaming: - # 用来标记流式响应需要分节 + if agent_runner.streaming and show_tool_use: + # 向下游平台发送 "break" 分段信号(空 MessageChain,不携带数据)。 + # 平台适配器收到后会关闭当前流式消息,并在后续文本到来时创建新消息。 + # 仅在 show_tool_use 为 True 时才发送:此时紧接着会通过 + # astr_event.send() 独立发送工具状态消息(如"🔨 调用工具: xxx"), + # 需要分段才能保证消息顺序正确。 + # 若 show_tool_use 为 False,不会有独立消息插入,无需分段。 yield MessageChain(chain=[], type="break") tool_info = _extract_chain_json_data(resp.data["chain"]) diff --git a/astrbot/core/astr_main_agent.py b/astrbot/core/astr_main_agent.py index ba62f815a..015989626 100644 --- a/astrbot/core/astr_main_agent.py +++ b/astrbot/core/astr_main_agent.py @@ -438,6 +438,7 @@ async def _request_img_caption( async def _ensure_img_caption( + event: AstrMessageEvent, req: ProviderRequest, cfg: dict, plugin_context: Context, @@ -526,6 +527,57 @@ async def _compress_image_for_provider( return url_or_path +def _get_image_compress_args( + provider_settings: dict[str, object] | None, +) -> tuple[bool, int, int]: + if not isinstance(provider_settings, dict): + return True, IMAGE_COMPRESS_DEFAULT_MAX_SIZE, IMAGE_COMPRESS_DEFAULT_QUALITY + + enabled = provider_settings.get("image_compress_enabled", True) + if not isinstance(enabled, bool): + enabled = True + + raw_options = provider_settings.get("image_compress_options", {}) + options = raw_options if isinstance(raw_options, dict) else {} + + max_size = options.get("max_size", IMAGE_COMPRESS_DEFAULT_MAX_SIZE) + if not isinstance(max_size, int): + max_size = IMAGE_COMPRESS_DEFAULT_MAX_SIZE + max_size = max(max_size, 1) + + quality = options.get("quality", IMAGE_COMPRESS_DEFAULT_QUALITY) + if not isinstance(quality, int): + quality = IMAGE_COMPRESS_DEFAULT_QUALITY + quality = min(max(quality, 1), 100) + + return enabled, max_size, quality + + +async def _compress_image_for_provider( + url_or_path: str, + provider_settings: dict[str, object] | None, +) -> str: + try: + enabled, max_size, quality = _get_image_compress_args(provider_settings) + if not enabled: + return url_or_path + return await compress_image(url_or_path, max_size=max_size, quality=quality) + except Exception as exc: # noqa: BLE001 + logger.error("Image compression failed: %s", exc) + return url_or_path + + +def _is_generated_compressed_image_path( + original_path: str, + compressed_path: str | None, +) -> bool: + if not compressed_path or compressed_path == original_path: + return False + if compressed_path.startswith("http") or compressed_path.startswith("data:image"): + return False + return os.path.exists(compressed_path) + + async def _process_quote_message( event: AstrMessageEvent, req: ProviderRequest, @@ -565,6 +617,8 @@ async def _process_quote_message( if image_seg: try: prov = None + path = None + compress_path = None if img_cap_prov_id: prov = plugin_context.get_provider_by_id(img_cap_prov_id) if prov is None: @@ -588,6 +642,16 @@ async def _process_quote_message( logger.warning("No provider found for image captioning in quote.") except BaseException as exc: logger.error("处理引用图片失败: %s", exc) + finally: + if ( + compress_path + and compress_path != path + and os.path.exists(compress_path) + ): + try: + os.remove(compress_path) + except Exception as exc: # noqa: BLE001 + logger.warning("Fail to remove temporary compressed image: %s", exc) quoted_content = "\n".join(content_parts) quoted_text = f"\n{quoted_content}\n" @@ -656,6 +720,7 @@ async def _decorate_llm_request( img_cap_prov_id: str = cfg.get("default_image_caption_provider_id") or "" if img_cap_prov_id and req.image_urls: await _ensure_img_caption( + event, req, cfg, plugin_context, diff --git a/astrbot/core/astr_main_agent_resources.py b/astrbot/core/astr_main_agent_resources.py index 8f21d4140..9a1c9c7b8 100644 --- a/astrbot/core/astr_main_agent_resources.py +++ b/astrbot/core/astr_main_agent_resources.py @@ -34,6 +34,7 @@ from astrbot.core.computer.tools import ( RunBrowserSkillTool, SyncSkillReleaseTool, ) +from astrbot.core.knowledge_base.kb_helper import KBHelper from astrbot.core.message.message_event_result import MessageChain from astrbot.core.platform.message_session import MessageSession from astrbot.core.star.context import Context @@ -397,6 +398,18 @@ class SendMessageToUserTool(FunctionTool[AstrAgentContext]): return f"Message sent to session {target_session}" +def check_all_kb(kb_list: list[KBHelper | None]) -> bool: + """检查是否所有的知识库都为空 + Args: + kb_list: 所选的知识库 + Returns: + bool: 是否全为空 + """ + return not any( + kb and (kb.kb.doc_count != 0 or kb.kb.chunk_count != 0) for kb in kb_list + ) + + async def retrieve_knowledge_base( query: str, umo: str, diff --git a/astrbot/core/computer/computer_client.py b/astrbot/core/computer/computer_client.py index 06527ff46..88aecefc8 100644 --- a/astrbot/core/computer/computer_client.py +++ b/astrbot/core/computer/computer_client.py @@ -224,7 +224,7 @@ def parse_description(text: str) -> str: if end_idx is None: return "" - frontmatter = "\n".join(lines[1:end_idx]) + frontmatter = "\\n".join(lines[1:end_idx]) try: import yaml except ImportError: diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index 5a5f71ad5..43f980c64 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -24,6 +24,38 @@ except metadata.PackageNotFoundError: __version__ = "unknown" VERSION = __version__ DB_PATH = os.path.join(get_astrbot_data_path(), "data_v4.db") +PERSONAL_WECHAT_CONFIG_METADATA = { + "weixin_oc_base_url": { + "description": "Base URL", + "type": "string", + "hint": "默认值: https://ilinkai.weixin.qq.com", + }, + "weixin_oc_bot_type": { + "description": "扫码参数 bot_type", + "type": "string", + "hint": "默认值: 3", + }, + "weixin_oc_qr_poll_interval": { + "description": "二维码状态轮询间隔(秒)", + "type": "int", + "hint": "每隔多少秒轮询一次二维码状态。", + }, + "weixin_oc_long_poll_timeout_ms": { + "description": "getUpdates 长轮询超时时间(毫秒)", + "type": "int", + "hint": "会话消息拉取接口超时参数。", + }, + "weixin_oc_api_timeout_ms": { + "description": "HTTP 请求超时(毫秒)", + "type": "int", + "hint": "通用 API 请求超时参数。", + }, + "weixin_oc_token": { + "description": "登录后 token(可留空)", + "type": "string", + "hint": "扫码登录成功后会自动写入;高级场景可手动填写。", + }, +} WEBHOOK_SUPPORTED_PLATFORMS = [ "qq_official_webhook", @@ -386,6 +418,16 @@ CONFIG_METADATA_2 = { "callback_server_host": "0.0.0.0", "port": 6198, }, + "个人微信": { + "id": "weixin_personal", + "type": "weixin_oc", + "enable": False, + "weixin_oc_base_url": "https://ilinkai.weixin.qq.com", + "weixin_oc_bot_type": "3", + "weixin_oc_qr_poll_interval": 1, + "weixin_oc_long_poll_timeout_ms": 35_000, + "weixin_oc_api_timeout_ms": 15_000, + }, "飞书(Lark)": { "id": "lark", "type": "lark", @@ -891,6 +933,7 @@ CONFIG_METADATA_2 = { "type": "bool", "hint": "Webhook 模式下使用 AstrBot 统一 Webhook 入口,无需单独开启端口。回调地址为 /api/platform/webhook/{webhook_uuid}。", }, + **PERSONAL_WECHAT_CONFIG_METADATA, "webhook_uuid": { "invisible": True, "description": "Webhook UUID", @@ -3454,6 +3497,29 @@ CONFIG_METADATA_3 = { }, "slider": {"min": 1, "max": 100, "step": 1}, }, + "provider_settings.image_compress_enabled": { + "description": "启用图片压缩", + "type": "bool", + "hint": "启用后,发送给多模态模型前会先压缩本地大图片。", + }, + "provider_settings.image_compress_options.max_size": { + "description": "最大边长", + "type": "int", + "hint": "压缩后图片的最长边,单位为像素。超过该尺寸时会按比例缩放。", + "condition": { + "provider_settings.image_compress_enabled": True, + }, + "slider": {"min": 256, "max": 4096, "step": 64}, + }, + "provider_settings.image_compress_options.quality": { + "description": "压缩质量", + "type": "int", + "hint": "JPEG 输出质量,范围为 1-100。值越高,画质越好,文件也越大。", + "condition": { + "provider_settings.image_compress_enabled": True, + }, + "slider": {"min": 1, "max": 100, "step": 1}, + }, "provider_tts_settings.dual_output": { "description": "开启 TTS 时同时输出语音和文字内容", "type": "bool", diff --git a/astrbot/core/db/vec_db/faiss_impl/vec_db.py b/astrbot/core/db/vec_db/faiss_impl/vec_db.py index 09463249b..672bafbac 100644 --- a/astrbot/core/db/vec_db/faiss_impl/vec_db.py +++ b/astrbot/core/db/vec_db/faiss_impl/vec_db.py @@ -74,6 +74,12 @@ class FaissVecDB(BaseVecDB): metadatas = metadatas or [{} for _ in contents] ids = ids or [str(uuid.uuid4()) for _ in contents] + if not contents: + logger.debug( + "No contents provided for batch insert; skipping embedding generation." + ) + return [] + start = time.time() logger.debug(f"Generating embeddings for {len(contents)} contents...") vectors = await self.embedding_provider.get_embeddings_batch( diff --git a/astrbot/core/pipeline/scheduler.py b/astrbot/core/pipeline/scheduler.py index 52c6a1349..f83ae7df2 100644 --- a/astrbot/core/pipeline/scheduler.py +++ b/astrbot/core/pipeline/scheduler.py @@ -92,4 +92,5 @@ class PipelineScheduler: logger.debug("pipeline 执行完毕。") finally: + event.cleanup_temporary_local_files() active_event_registry.unregister(event) diff --git a/astrbot/core/platform/astr_message_event.py b/astrbot/core/platform/astr_message_event.py index 8117fb612..02ef609c6 100644 --- a/astrbot/core/platform/astr_message_event.py +++ b/astrbot/core/platform/astr_message_event.py @@ -1,6 +1,7 @@ import abc import asyncio import hashlib +import os import re import uuid from collections.abc import AsyncGenerator @@ -89,6 +90,8 @@ class AstrMessageEvent(abc.ABC): """在此次事件中是否有过至少一次发送消息的操作""" self.call_llm = False """是否在此消息事件中禁止默认的 LLM 请求""" + self._temporary_local_files: list[str] = [] + """Temporary local files created during this event and safe to delete when it finishes.""" self.plugins_name: list[str] | None = None """该事件启用的插件名称列表。None 表示所有插件都启用。空列表表示没有启用任何插件。""" @@ -229,6 +232,24 @@ class AstrMessageEvent(abc.ABC): logger.info(f"清除 {self.get_platform_name()} 的额外信息: {self._extras}") self._extras.clear() + def track_temporary_local_file(self, path: str) -> None: + if path and path not in self._temporary_local_files: + self._temporary_local_files.append(path) + + def cleanup_temporary_local_files(self) -> None: + paths = list(self._temporary_local_files) + self._temporary_local_files.clear() + for path in paths: + try: + if os.path.exists(path): + os.remove(path) + except OSError as e: + logger.warning( + "Failed to remove temporary local file %s: %s", + path, + e, + ) + def is_private_chat(self) -> bool: """是否是私聊。""" return self.get_message_type() == MessageType.FRIEND_MESSAGE diff --git a/astrbot/core/platform/sources/lark/lark_event.py b/astrbot/core/platform/sources/lark/lark_event.py index 9e449f116..2673efcc3 100644 --- a/astrbot/core/platform/sources/lark/lark_event.py +++ b/astrbot/core/platform/sources/lark/lark_event.py @@ -791,6 +791,8 @@ class LarkMessageEvent(AstrMessageEvent): last_sent = "" done = False text_changed = asyncio.Event() + sender_task = None + fallback_used = False # 回退路径已处理 Metric,避免重复上报 async def _sender_loop() -> None: """信号驱动的文本发送循环,有新内容就发,RTT 自然限流。""" @@ -807,7 +809,32 @@ class LarkMessageEvent(AstrMessageEvent): if delta != snapshot: text_changed.set() - sender_task = asyncio.create_task(_sender_loop()) + async def _consume_rest_and_fallback(gen, initial_text: str) -> None: + """Card creation failed; consume remaining chunks and send non-streaming.""" + nonlocal fallback_used + fallback_used = True + buffer = MessageChain().message(initial_text) if initial_text else None + async for chain in gen: + if not isinstance(chain, MessageChain): + continue + if buffer is None: + buffer = chain + else: + buffer.chain.extend(chain.chain) + if buffer: + buffer.squash_plain() + await self.send(buffer) + await Metric.upload(msg_event_tick=1, adapter_name=self.platform_meta.name) + self._has_send_oper = True + + async def _flush_and_close_card() -> None: + """补发最终文本并关闭当前卡片的流式模式。""" + nonlocal sequence + if delta and delta != last_sent: + sequence += 1 + await self._update_streaming_text(card_id, delta, sequence) + sequence += 1 + await self._close_streaming_mode(card_id, sequence) try: async for chain in generator: @@ -821,20 +848,49 @@ class LarkMessageEvent(AstrMessageEvent): for comp in chain.chain: if isinstance(comp, Plain): delta += comp.text + + # Lazy card creation on first text token + if card_id is None: + card_id = await self._create_streaming_card() + if not card_id: + logger.warning( + "[Lark] 无法创建流式卡片,回退到非流式发送" + ) + await _consume_rest_and_fallback(generator, delta) + return + + sent = await self._send_card_message( + card_id, + reply_message_id=self.message_obj.message_id, + ) + if not sent: + logger.error( + "[Lark] 发送流式卡片消息失败,回退到非流式发送" + ) + await _consume_rest_and_fallback(generator, delta) + return + + logger.info("[Lark] 流式输出: 使用 CardKit 流式卡片") + sender_task = asyncio.create_task(_sender_loop()) + text_changed.set() finally: done = True text_changed.set() - await sender_task + if sender_task: + await sender_task - # Step 4: 必要时补发最终文本 + 关闭流式模式 - if delta and delta != last_sent: - sequence += 1 - await self._update_streaming_text(card_id, delta, sequence) + # If no text was produced at all, no card was created + if card_id is None: + if not fallback_used: + await Metric.upload( + msg_event_tick=1, adapter_name=self.platform_meta.name + ) + self._has_send_oper = True + return - sequence += 1 - await self._close_streaming_mode(card_id, sequence) + await _flush_and_close_card() - # Step 5: 内联父类 send_streaming 的副作用 + # 内联父类 send_streaming 的副作用 await Metric.upload(msg_event_tick=1, adapter_name=self.platform_meta.name) self._has_send_oper = True diff --git a/astrbot/core/platform/sources/telegram/tg_adapter.py b/astrbot/core/platform/sources/telegram/tg_adapter.py index 576e4ea92..62ce69d50 100644 --- a/astrbot/core/platform/sources/telegram/tg_adapter.py +++ b/astrbot/core/platform/sources/telegram/tg_adapter.py @@ -8,7 +8,7 @@ from typing import cast from apscheduler.schedulers.asyncio import AsyncIOScheduler from telegram import BotCommand, Update from telegram.constants import ChatType -from telegram.error import InvalidToken, Unauthorized +from telegram.error import Forbidden, InvalidToken from telegram.ext import ApplicationBuilder, ContextTypes, ExtBot, filters from telegram.ext import MessageHandler as TelegramMessageHandler @@ -183,7 +183,7 @@ class TelegramPlatformAdapter(Platform): ) except asyncio.CancelledError: raise - except (Unauthorized, InvalidToken) as e: + except (Forbidden, InvalidToken) as e: logger.error( f"Telegram token is invalid or unauthorized: {e}. Polling stopped." ) diff --git a/astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py b/astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py new file mode 100644 index 000000000..b9caa0b09 --- /dev/null +++ b/astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py @@ -0,0 +1,926 @@ +from __future__ import annotations + +import asyncio +import base64 +import hashlib +import io +import time +import uuid +from dataclasses import dataclass +from pathlib import Path +from typing import TYPE_CHECKING, Any, cast +from urllib.parse import quote + +import qrcode as qrcode_lib + +from astrbot import logger +from astrbot.api.event import MessageChain +from astrbot.api.message_components import File, Image, Plain, Record, Video +from astrbot.api.platform import ( + AstrBotMessage, + MessageMember, + MessageType, + Platform, + PlatformMetadata, + register_platform_adapter, +) +from astrbot.core import astrbot_config +from astrbot.core.platform.astr_message_event import MessageSesion +from astrbot.core.utils.astrbot_path import get_astrbot_temp_path + +from .weixin_oc_client import WeixinOCClient +from .weixin_oc_event import WeixinOCMessageEvent + +if TYPE_CHECKING: # pragma: no cover - typing-only helper + pass + + +@dataclass +class OpenClawLoginSession: + session_key: str + qrcode: str + qrcode_img_content: str + started_at: float + status: str = "wait" + bot_token: str | None = None + account_id: str | None = None + base_url: str | None = None + user_id: str | None = None + error: str | None = None + + +@register_platform_adapter( + "weixin_oc", + "个人微信", + support_streaming_message=False, +) +class WeixinOCAdapter(Platform): + IMAGE_ITEM_TYPE = 2 + VOICE_ITEM_TYPE = 3 + FILE_ITEM_TYPE = 4 + VIDEO_ITEM_TYPE = 5 + IMAGE_UPLOAD_TYPE = 1 + VIDEO_UPLOAD_TYPE = 2 + FILE_UPLOAD_TYPE = 3 + + def __init__( + self, + platform_config: dict, + platform_settings: dict, + event_queue: asyncio.Queue, + ) -> None: + super().__init__(platform_config, event_queue) + + self.settings = platform_settings + self.base_url = str( + platform_config.get("weixin_oc_base_url", "https://ilinkai.weixin.qq.com") + ).rstrip("/") + self.bot_type = str(platform_config.get("weixin_oc_bot_type", "3")) + self.qr_poll_interval = max( + 1, + int(platform_config.get("weixin_oc_qr_poll_interval", 1)), + ) + self.long_poll_timeout_ms = int( + platform_config.get("weixin_oc_long_poll_timeout_ms", 35_000), + ) + self.api_timeout_ms = int( + platform_config.get("weixin_oc_api_timeout_ms", 15_000), + ) + self.cdn_base_url = str( + platform_config.get( + "weixin_oc_cdn_base_url", + "https://novac2c.cdn.weixin.qq.com/c2c", + ) + ).rstrip("/") + + self.metadata = PlatformMetadata( + name="weixin_oc", + description="个人微信", + id=cast(str, self.config.get("id", "weixin_oc")), + support_streaming_message=False, + ) + + self._shutdown_event = asyncio.Event() + self._login_session: OpenClawLoginSession | None = None + self._sync_buf = "" + self._qr_expired_count = 0 + self._context_tokens: dict[str, str] = {} + self._last_inbound_error = "" + + self.token = str(platform_config.get("weixin_oc_token", "")).strip() or None + self.account_id = ( + str(platform_config.get("weixin_oc_account_id", "")).strip() or None + ) + self._load_account_state() + self.client = WeixinOCClient( + adapter_id=self.meta().id, + base_url=self.base_url, + cdn_base_url=self.cdn_base_url, + api_timeout_ms=self.api_timeout_ms, + token=self.token, + ) + + if self.token: + logger.info( + "weixin_oc adapter %s loaded with token from config.", + self.meta().id, + ) + + def _sync_client_state(self) -> None: + self.client.base_url = self.base_url + self.client.cdn_base_url = self.cdn_base_url + self.client.api_timeout_ms = self.api_timeout_ms + self.client.token = self.token + + def _load_account_state(self) -> None: + if not self.token: + token = str(self.config.get("weixin_oc_token", "")).strip() + if token: + self.token = token + if not self.account_id: + account_id = str(self.config.get("weixin_oc_account_id", "")).strip() + if account_id: + self.account_id = account_id + sync_buf = str(self.config.get("weixin_oc_sync_buf", "")).strip() + if sync_buf: + self._sync_buf = sync_buf + saved_base = str(self.config.get("weixin_oc_base_url", "")).strip() + if saved_base: + self.base_url = saved_base.rstrip("/") + + async def _save_account_state(self) -> None: + self.config["weixin_oc_token"] = self.token or "" + self.config["weixin_oc_account_id"] = self.account_id or "" + self.config["weixin_oc_sync_buf"] = self._sync_buf + self.config["weixin_oc_base_url"] = self.base_url + + for platform in astrbot_config.get("platform", []): + if not isinstance(platform, dict): + continue + if platform.get("id") != self.config.get("id"): + continue + if platform.get("type") != self.config.get("type"): + continue + platform["weixin_oc_token"] = self.token or "" + platform["weixin_oc_account_id"] = self.account_id or "" + platform["weixin_oc_sync_buf"] = self._sync_buf + platform["weixin_oc_base_url"] = self.base_url + break + + self._sync_client_state() + astrbot_config.save_config() + + def _is_login_session_valid( + self, login_session: OpenClawLoginSession | None + ) -> bool: + if not login_session: + return False + return (time.time() - login_session.started_at) * 1000 < 5 * 60_000 + + def _resolve_inbound_media_dir(self) -> Path: + media_dir = Path(get_astrbot_temp_path()) + media_dir.mkdir(parents=True, exist_ok=True) + return media_dir + + @staticmethod + def _normalize_inbound_filename(file_name: str, fallback_name: str) -> str: + normalized = Path(file_name or "").name.strip() + return normalized or fallback_name + + def _save_inbound_media( + self, + content: bytes, + *, + prefix: str, + file_name: str, + fallback_suffix: str, + ) -> Path: + normalized_name = self._normalize_inbound_filename( + file_name, + f"{prefix}{fallback_suffix}", + ) + stem = Path(normalized_name).stem or prefix + suffix = Path(normalized_name).suffix or fallback_suffix + target = ( + self._resolve_inbound_media_dir() + / f"{prefix}_{uuid.uuid4().hex}_{stem}{suffix}" + ) + target.write_bytes(content) + return target + + @staticmethod + def _build_plain_text_item(text: str) -> dict[str, Any]: + return { + "type": 1, + "text_item": { + "text": text, + }, + } + + async def _prepare_media_item( + self, + user_id: str, + media_path: Path, + upload_media_type: int, + item_type: int, + file_name: str, + ) -> dict[str, Any]: + raw_bytes = media_path.read_bytes() + raw_size = len(raw_bytes) + raw_md5 = hashlib.md5(raw_bytes).hexdigest() + file_key = uuid.uuid4().hex + aes_key_hex = uuid.uuid4().bytes.hex() + ciphertext_size = self.client.aes_padded_size(raw_size) + + payload = await self.client.request_json( + "POST", + "ilink/bot/getuploadurl", + payload={ + "filekey": file_key, + "media_type": upload_media_type, + "to_user_id": user_id, + "rawsize": raw_size, + "rawfilemd5": raw_md5, + "filesize": ciphertext_size, + "no_need_thumb": True, + "aeskey": aes_key_hex, + "base_info": { + "channel_version": "astrbot", + }, + }, + token_required=True, + timeout_ms=self.api_timeout_ms, + ) + logger.debug( + "weixin_oc(%s): getuploadurl response user=%s media_type=%s raw_size=%s raw_md5=%s filekey=%s file=%s upload_param_len=%s", + self.meta().id, + user_id, + upload_media_type, + raw_size, + raw_md5, + file_key, + media_path.name, + len(str(payload.get("upload_param", ""))), + ) + upload_param = str(payload.get("upload_param", "")).strip() + if not upload_param: + raise RuntimeError("getuploadurl returned empty upload_param") + + encrypted_query_param = await self.client.upload_to_cdn( + upload_param, + file_key, + aes_key_hex, + media_path, + ) + logger.debug( + "weixin_oc(%s): prepared media item type=%s file=%s user=%s mid_size=%s upload_param_len=%s query_len=%s", + self.meta().id, + item_type, + media_path.name, + user_id, + ciphertext_size, + len(upload_param), + len(encrypted_query_param), + ) + + aes_key_b64 = base64.b64encode(aes_key_hex.encode("utf-8")).decode("utf-8") + media_payload = { + "encrypt_query_param": encrypted_query_param, + "aes_key": aes_key_b64, + "encrypt_type": 1, + } + + if item_type == self.IMAGE_ITEM_TYPE: + return { + "type": self.IMAGE_ITEM_TYPE, + "image_item": { + "media": media_payload, + "mid_size": ciphertext_size, + }, + } + if item_type == self.VIDEO_ITEM_TYPE: + return { + "type": self.VIDEO_ITEM_TYPE, + "video_item": { + "media": media_payload, + "video_size": ciphertext_size, + }, + } + + file_len = str(raw_size) + return { + "type": self.FILE_ITEM_TYPE, + "file_item": { + "media": media_payload, + "file_name": file_name, + "len": file_len, + }, + } + + async def _resolve_inbound_media_component( + self, + item: dict[str, Any], + ) -> Image | Video | File | Record | None: + item_type = int(item.get("type") or 0) + + if item_type == self.IMAGE_ITEM_TYPE: + image_item = cast(dict[str, Any], item.get("image_item", {}) or {}) + media = cast(dict[str, Any], image_item.get("media", {}) or {}) + encrypted_query_param = str(media.get("encrypt_query_param", "")).strip() + if not encrypted_query_param: + return None + image_aes_key = str(image_item.get("aeskey", "")).strip() + if image_aes_key: + aes_key_value = base64.b64encode(bytes.fromhex(image_aes_key)).decode( + "utf-8" + ) + else: + aes_key_value = str(media.get("aes_key", "")).strip() + if aes_key_value: + content = await self.client.download_and_decrypt_media( + encrypted_query_param, + aes_key_value, + ) + else: + content = await self.client.download_cdn_bytes(encrypted_query_param) + image_path = self._save_inbound_media( + content, + prefix="weixin_oc_img", + file_name="image.jpg", + fallback_suffix=".jpg", + ) + return Image.fromFileSystem(str(image_path)) + + if item_type == self.VIDEO_ITEM_TYPE: + video_item = cast(dict[str, Any], item.get("video_item", {}) or {}) + media = cast(dict[str, Any], video_item.get("media", {}) or {}) + encrypted_query_param = str(media.get("encrypt_query_param", "")).strip() + aes_key_value = str(media.get("aes_key", "")).strip() + if not encrypted_query_param or not aes_key_value: + return None + content = await self.client.download_and_decrypt_media( + encrypted_query_param, + aes_key_value, + ) + video_path = self._save_inbound_media( + content, + prefix="weixin_oc_video", + file_name="video.mp4", + fallback_suffix=".mp4", + ) + return Video.fromFileSystem(str(video_path)) + + if item_type == self.FILE_ITEM_TYPE: + file_item = cast(dict[str, Any], item.get("file_item", {}) or {}) + media = cast(dict[str, Any], file_item.get("media", {}) or {}) + encrypted_query_param = str(media.get("encrypt_query_param", "")).strip() + aes_key_value = str(media.get("aes_key", "")).strip() + if not encrypted_query_param or not aes_key_value: + return None + file_name = self._normalize_inbound_filename( + str(file_item.get("file_name", "")).strip(), + "file.bin", + ) + content = await self.client.download_and_decrypt_media( + encrypted_query_param, + aes_key_value, + ) + file_path = self._save_inbound_media( + content, + prefix="weixin_oc_file", + file_name=file_name, + fallback_suffix=".bin", + ) + return File(name=file_name, file=str(file_path)) + + if item_type == self.VOICE_ITEM_TYPE: + voice_item = cast(dict[str, Any], item.get("voice_item", {}) or {}) + media = cast(dict[str, Any], voice_item.get("media", {}) or {}) + encrypted_query_param = str(media.get("encrypt_query_param", "")).strip() + aes_key_value = str(media.get("aes_key", "")).strip() + if not encrypted_query_param or not aes_key_value: + return None + content = await self.client.download_and_decrypt_media( + encrypted_query_param, + aes_key_value, + ) + voice_path = self._save_inbound_media( + content, + prefix="weixin_oc_voice", + file_name="voice.silk", + fallback_suffix=".silk", + ) + return Record.fromFileSystem(str(voice_path)) + + return None + + async def _resolve_media_file_path( + self, segment: Image | Video | File + ) -> Path | None: + try: + if isinstance(segment, File): + path = await segment.get_file() + elif isinstance(segment, (Image, Video)): + path = await segment.convert_to_file_path() + else: + path = "" + except Exception as e: + logger.warning("weixin_oc(%s): media resolve failed: %s", self.meta().id, e) + return None + + if not path: + return None + media_path = Path(path) + if not media_path.exists() or not media_path.is_file(): + return None + return media_path + + async def _send_items_to_session( + self, + user_id: str, + item_list: list[dict[str, Any]], + ) -> bool: + if not self.token: + logger.warning("weixin_oc(%s): missing token, skip send", self.meta().id) + return False + if not item_list: + logger.warning( + "weixin_oc(%s): empty message payload is ignored", + self.meta().id, + ) + return False + context_token = self._context_tokens.get(user_id) + if not context_token: + logger.warning( + "weixin_oc(%s): context token missing for %s, skip send", + self.meta().id, + user_id, + ) + return False + await self.client.request_json( + "POST", + "ilink/bot/sendmessage", + payload={ + "base_info": { + "channel_version": "astrbot", + }, + "msg": { + "from_user_id": "", + "to_user_id": user_id, + "client_id": uuid.uuid4().hex, + "message_type": 2, + "message_state": 2, + "context_token": context_token, + "item_list": item_list, + }, + }, + token_required=True, + headers={}, + ) + return True + + async def _send_media_segment( + self, + user_id: str, + segment: Image | Video | File, + text: str | None = None, + ) -> bool: + if not self.token: + logger.warning( + "weixin_oc(%s): missing token, skip media send", self.meta().id + ) + return False + media_path = await self._resolve_media_file_path(segment) + if media_path is None: + logger.warning( + "weixin_oc(%s): skip media segment, media file not resolvable", + self.meta().id, + ) + return False + + item_type = self.IMAGE_ITEM_TYPE + upload_media_type = self.IMAGE_UPLOAD_TYPE + if isinstance(segment, Video): + item_type = self.VIDEO_ITEM_TYPE + upload_media_type = self.VIDEO_UPLOAD_TYPE + elif isinstance(segment, File): + item_type = self.FILE_ITEM_TYPE + upload_media_type = self.FILE_UPLOAD_TYPE + + file_name = ( + segment.name + if isinstance(segment, File) and segment.name + else media_path.name + ) + try: + media_item = await self._prepare_media_item( + user_id, + media_path, + upload_media_type, + item_type, + file_name, + ) + except Exception as e: + logger.error("weixin_oc(%s): prepare media failed: %s", self.meta().id, e) + return False + + if text: + await self._send_items_to_session( + user_id, + [self._build_plain_text_item(text)], + ) + return await self._send_items_to_session(user_id, [media_item]) + + async def _start_login_session(self) -> OpenClawLoginSession: + endpoint = "ilink/bot/get_bot_qrcode" + params = {"bot_type": self.bot_type} + logger.info("weixin_oc(%s): request QR code from %s", self.meta().id, endpoint) + data = await self.client.request_json( + "GET", + endpoint, + params=params, + token_required=False, + timeout_ms=15_000, + ) + qrcode = str(data.get("qrcode", "")).strip() + qrcode_url = str(data.get("qrcode_img_content", "")).strip() + if not qrcode or not qrcode_url: + raise RuntimeError("qrcode response missing qrcode or qrcode_img_content") + qr_console_url = ( + f"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=" + f"{quote(qrcode_url)}" + ) + logger.info( + "weixin_oc(%s): QR session started, qr_link=%s 请使用手机微信扫码登录,二维码有效期 5 分钟,过期后会自动刷新。", + self.meta().id, + qr_console_url, + ) + try: + qr = qrcode_lib.QRCode(border=1) + qr.add_data(qrcode_url) + qr.make(fit=True) + qr_buffer = io.StringIO() + qr.print_ascii(out=qr_buffer, tty=False) + logger.info( + "weixin_oc(%s): terminal QR code:\n%s", + self.meta().id, + qr_buffer.getvalue(), + ) + except Exception as e: + logger.warning( + "weixin_oc(%s): failed to render terminal QR code: %s", + self.meta().id, + e, + ) + login_session = OpenClawLoginSession( + session_key=str(uuid.uuid4()), + qrcode=qrcode, + qrcode_img_content=qrcode_url, + started_at=time.time(), + ) + self._login_session = login_session + self._qr_expired_count = 0 + self._last_inbound_error = "" + return login_session + + async def _poll_qr_status(self, login_session: OpenClawLoginSession) -> None: + endpoint = "ilink/bot/get_qrcode_status" + logger.debug("weixin_oc(%s): poll qrcode status", self.meta().id) + data = await self.client.request_json( + "GET", + endpoint, + params={"qrcode": login_session.qrcode}, + token_required=False, + timeout_ms=self.long_poll_timeout_ms, + headers={"iLink-App-ClientVersion": "1"}, + ) + status = str(data.get("status", "wait")).strip() + login_session.status = status + if status == "expired": + self._qr_expired_count += 1 + if self._qr_expired_count > 3: + login_session.error = "二维码已过期,超过重试次数,等待下次重试" + self._login_session = None + return + logger.warning( + "weixin_oc(%s): qr expired, refreshing (%s/%s)", + self.meta().id, + self._qr_expired_count, + 3, + ) + new_session = await self._start_login_session() + self._login_session = new_session + return + + if status == "confirmed": + bot_token = data.get("bot_token") + account_id = data.get("ilink_bot_id") + base_url = data.get("baseurl") + user_id = data.get("ilink_user_id") + if not bot_token: + login_session.error = "登录返回成功但未返回 bot_token" + return + login_session.bot_token = str(bot_token) + login_session.account_id = str(account_id) if account_id else None + login_session.base_url = str(base_url) if base_url else self.base_url + login_session.user_id = str(user_id) if user_id else None + self.token = login_session.bot_token + self.account_id = login_session.account_id + if login_session.base_url: + self.base_url = login_session.base_url.rstrip("/") + await self._save_account_state() + + def _message_text_from_item_list( + self, item_list: list[dict[str, Any]] | None + ) -> str: + if not item_list: + return "" + text_parts: list[str] = [] + for item in item_list: + item_type = int(item.get("type") or 0) + if item_type == 1: + text = str(item.get("text_item", {}).get("text", "")).strip() + if text: + text_parts.append(text) + elif item_type == 2: + text_parts.append("[图片]") + elif item_type == 3: + voice_text = str(item.get("voice_item", {}).get("text", "")).strip() + if voice_text: + text_parts.append(voice_text) + else: + text_parts.append("[语音]") + elif item_type == 4: + text_parts.append("[文件]") + elif item_type == 5: + text_parts.append("[视频]") + else: + ref = item.get("ref_msg") + if isinstance(ref, dict): + ref_item = ref.get("message_item") + if isinstance(ref_item, dict): + ref_text = str(self._message_text_from_item_list([ref_item])) + if ref_text: + text_parts.append(f"[引用:{ref_text}]") + return "\n".join(text_parts).strip() + + async def _item_list_to_components( + self, item_list: list[dict[str, Any]] | None + ) -> list[Any]: + if not item_list: + return [] + parts: list[Any] = [] + for item in item_list: + item_type = int(item.get("type") or 0) + if item_type == 1: + text = str(item.get("text_item", {}).get("text", "")).strip() + if text: + parts.append(Plain(text)) + continue + try: + media_component = await self._resolve_inbound_media_component(item) + except Exception as e: + logger.warning( + "weixin_oc(%s): resolve inbound media failed: %s", + self.meta().id, + e, + ) + media_component = None + if media_component is not None: + parts.append(media_component) + return parts + + async def _handle_inbound_message(self, msg: dict[str, Any]) -> None: + from_user_id = str(msg.get("from_user_id", "")).strip() + if not from_user_id: + logger.debug("weixin_oc: skip message with empty from_user_id.") + return + + context_token = str(msg.get("context_token", "")).strip() + if context_token: + self._context_tokens[from_user_id] = context_token + + item_list = cast(list[dict[str, Any]], msg.get("item_list", [])) + components = await self._item_list_to_components(item_list) + text = self._message_text_from_item_list(item_list) + message_id = str(msg.get("message_id") or msg.get("msg_id") or uuid.uuid4().hex) + create_time = msg.get("create_time_ms") or msg.get("create_time") + if isinstance(create_time, (int, float)) and create_time > 1_000_000_000_000: + ts = int(float(create_time) / 1000) + elif isinstance(create_time, (int, float)): + ts = int(create_time) + else: + ts = int(time.time()) + + abm = AstrBotMessage() + abm.self_id = self.meta().id + abm.sender = MessageMember(user_id=from_user_id, nickname=from_user_id) + abm.type = MessageType.FRIEND_MESSAGE + abm.session_id = from_user_id + abm.message_id = message_id + abm.message = components + abm.message_str = text + abm.timestamp = ts + abm.raw_message = msg + + self.commit_event( + WeixinOCMessageEvent( + message_str=text, + message_obj=abm, + platform_meta=self.meta(), + session_id=abm.session_id, + platform=self, + ) + ) + + async def _poll_inbound_updates(self) -> None: + data = await self.client.request_json( + "POST", + "ilink/bot/getupdates", + payload={ + "base_info": { + "channel_version": "astrbot", + }, + "get_updates_buf": self._sync_buf, + }, + token_required=True, + timeout_ms=self.long_poll_timeout_ms, + ) + ret = int(data.get("ret") or 0) + errcode = data.get("errcode", 0) + if ret != 0 and ret is not None: + errmsg = str(data.get("errmsg", "")) + self._last_inbound_error = f"ret={ret}, errcode={errcode}, errmsg={errmsg}" + logger.warning( + "weixin_oc(%s): getupdates error: %s", + self.meta().id, + self._last_inbound_error, + ) + return + if errcode and int(errcode) != 0: + errmsg = str(data.get("errmsg", "")) + self._last_inbound_error = f"ret={ret}, errcode={errcode}, errmsg={errmsg}" + logger.warning( + "weixin_oc(%s): getupdates error: %s", + self.meta().id, + self._last_inbound_error, + ) + return + + if data.get("get_updates_buf"): + self._sync_buf = str(data.get("get_updates_buf")) + await self._save_account_state() + + for msg in data.get("msgs", []) if isinstance(data.get("msgs"), list) else []: + if self._shutdown_event.is_set(): + return + if not isinstance(msg, dict): + continue + await self._handle_inbound_message(msg) + + def _message_chain_to_text(self, message_chain: MessageChain) -> str: + text = "" + for segment in message_chain.chain: + if isinstance(segment, Plain): + text += segment.text + return text.strip() + + async def _send_to_session( + self, user_id: str, text: str, _components: list[Any] | None = None + ) -> bool: + if not text: + text = self._message_chain_to_text(MessageChain(_components or [])) + if not text: + logger.warning( + "weixin_oc(%s): message without plain text is ignored", + self.meta().id, + ) + return False + return await self._send_items_to_session( + user_id, + [self._build_plain_text_item(text)], + ) + + async def send_by_session( + self, + session: MessageSesion, + message_chain: MessageChain, + ) -> None: + target_user = session.session_id + pending_text = "" + has_supported_segment = False + for segment in message_chain.chain: + if isinstance(segment, Plain): + pending_text += segment.text + continue + + if isinstance(segment, (Image, Video, File)): + has_supported_segment = True + await self._send_media_segment( + target_user, + segment, + text=pending_text.strip() or None, + ) + pending_text = "" + continue + + logger.debug( + "weixin_oc(%s): unsupported outbound segment type %s", + self.meta().id, + type(segment).__name__, + ) + + if pending_text: + has_supported_segment = True + await self._send_to_session(target_user, pending_text.strip()) + + if not has_supported_segment: + logger.warning( + "weixin_oc(%s): outbound message ignored, no supported segments", + self.meta().id, + ) + await super().send_by_session(session, message_chain) + + def meta(self) -> PlatformMetadata: + return self.metadata + + async def run(self) -> None: + try: + while not self._shutdown_event.is_set(): + if not self.token: + if not self._is_login_session_valid(self._login_session): + try: + self._login_session = await self._start_login_session() + self._qr_expired_count = 0 + except Exception as e: + logger.error( + "weixin_oc(%s): start login failed: %s", + self.meta().id, + e, + ) + await asyncio.sleep(5) + continue + + current_login = self._login_session + if current_login is None: + continue + + try: + await self._poll_qr_status(current_login) + except asyncio.TimeoutError: + logger.debug( + "weixin_oc(%s): qr status long-poll timeout", + self.meta().id, + ) + except Exception as e: + logger.error( + "weixin_oc(%s): poll qr status failed: %s", + self.meta().id, + e, + ) + current_login.error = str(e) + await asyncio.sleep(2) + + if self.token: + logger.info( + "weixin_oc(%s): login confirmed, account=%s", + self.meta().id, + self.account_id or "", + ) + continue + + if current_login.error: + await asyncio.sleep(2) + else: + await asyncio.sleep(self.qr_poll_interval) + continue + + await self._poll_inbound_updates() + except asyncio.CancelledError: + raise + except Exception as e: + logger.exception("weixin_oc(%s): run failed: %s", self.meta().id, e) + finally: + await self.client.close() + + async def terminate(self) -> None: + self._shutdown_event.set() + + def get_stats(self) -> dict: + stat = super().get_stats() + login_session = self._login_session + stat["weixin_oc"] = { + "configured": bool(self.token), + "account_id": self.account_id, + "base_url": self.base_url, + "qr_session_key": login_session.session_key if login_session else None, + "qr_status": login_session.status if login_session else None, + "qrcode": login_session.qrcode if login_session else None, + "qrcode_img_content": login_session.qrcode_img_content + if login_session + else None, + "qr_error": login_session.error if login_session else None, + "sync_buf_len": len(self._sync_buf), + "last_error": self._last_inbound_error, + } + return stat diff --git a/astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py b/astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py new file mode 100644 index 000000000..5ea30d911 --- /dev/null +++ b/astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py @@ -0,0 +1,228 @@ +from __future__ import annotations + +import base64 +import hashlib +import json +import random +from pathlib import Path +from typing import Any, cast +from urllib.parse import quote + +import aiohttp +from Crypto.Cipher import AES + +from astrbot import logger + + +class WeixinOCClient: + def __init__( + self, + *, + adapter_id: str, + base_url: str, + cdn_base_url: str, + api_timeout_ms: int, + token: str | None = None, + ) -> None: + self.adapter_id = adapter_id + self.base_url = base_url + self.cdn_base_url = cdn_base_url + self.api_timeout_ms = api_timeout_ms + self.token = token + self._http_session: aiohttp.ClientSession | None = None + + async def ensure_http_session(self) -> None: + if self._http_session is None or self._http_session.closed: + timeout = aiohttp.ClientTimeout(total=self.api_timeout_ms / 1000) + self._http_session = aiohttp.ClientSession(timeout=timeout) + + async def close(self) -> None: + if self._http_session is not None and not self._http_session.closed: + await self._http_session.close() + self._http_session = None + + def _build_base_headers(self, token_required: bool = False) -> dict[str, str]: + headers = { + "Content-Type": "application/json", + "AuthorizationType": "ilink_bot_token", + "X-WECHAT-UIN": base64.b64encode( + str(random.getrandbits(32)).encode("utf-8") + ).decode("utf-8"), + } + if token_required and self.token: + headers["Authorization"] = f"Bearer {self.token}" + return headers + + def _resolve_url(self, endpoint: str) -> str: + return f"{self.base_url.rstrip('/')}/{endpoint.lstrip('/')}" + + def _build_cdn_upload_url(self, upload_param: str, file_key: str) -> str: + return ( + f"{self.cdn_base_url}/upload?" + f"encrypted_query_param={quote(upload_param)}&filekey={quote(file_key)}" + ) + + def _build_cdn_download_url(self, encrypted_query_param: str) -> str: + return ( + f"{self.cdn_base_url}/download?" + f"encrypted_query_param={quote(encrypted_query_param)}" + ) + + @staticmethod + def aes_padded_size(size: int) -> int: + return size + (16 - (size % 16) or 16) + + @staticmethod + def pkcs7_pad(data: bytes, block_size: int = 16) -> bytes: + pad_len = block_size - (len(data) % block_size) + if pad_len == 0: + pad_len = block_size + return data + bytes([pad_len]) * pad_len + + @staticmethod + def pkcs7_unpad(data: bytes, block_size: int = 16) -> bytes: + if not data: + return data + pad_len = data[-1] + if pad_len <= 0 or pad_len > block_size: + return data + if data[-pad_len:] != bytes([pad_len]) * pad_len: + return data + return data[:-pad_len] + + @staticmethod + def parse_media_aes_key(aes_key_value: str) -> bytes: + normalized = aes_key_value.strip() + if not normalized: + raise ValueError("empty media aes key") + padded = normalized + "=" * (-len(normalized) % 4) + decoded = base64.b64decode(padded) + if len(decoded) == 16: + return decoded + decoded_text = decoded.decode("ascii", errors="ignore") + if len(decoded) == 32 and all( + c in "0123456789abcdefABCDEF" for c in decoded_text + ): + return bytes.fromhex(decoded_text) + raise ValueError("unsupported media aes key format") + + async def upload_to_cdn( + self, + upload_param: str, + file_key: str, + aes_key_hex: str, + media_path: Path, + ) -> str: + raw_data = media_path.read_bytes() + logger.debug( + "weixin_oc(%s): prepare CDN upload file=%s size=%s md5=%s filekey=%s", + self.adapter_id, + media_path.name, + len(raw_data), + hashlib.md5(raw_data).hexdigest(), + file_key, + ) + cipher = AES.new(bytes.fromhex(aes_key_hex), AES.MODE_ECB) + encrypted = cipher.encrypt(self.pkcs7_pad(raw_data)) + logger.debug( + "weixin_oc(%s): encrypt done aes_key_len=%s plain_size=%s cipher_size=%s", + self.adapter_id, + len(bytes.fromhex(aes_key_hex)), + len(raw_data), + len(encrypted), + ) + + await self.ensure_http_session() + assert self._http_session is not None + timeout = aiohttp.ClientTimeout(total=self.api_timeout_ms / 1000) + cdn_url = self._build_cdn_upload_url(upload_param, file_key) + + async with self._http_session.post( + cdn_url, + data=encrypted, + headers={"Content-Type": "application/octet-stream"}, + timeout=timeout, + ) as resp: + detail = await resp.text() + logger.debug( + "weixin_oc(%s): CDN upload response status=%s url=%s x-error-message=%s x-encrypted-param=%s body=%s", + self.adapter_id, + resp.status, + cdn_url, + resp.headers.get("x-error-message"), + resp.headers.get("x-encrypted-param"), + detail[:512], + ) + if resp.status >= 400 and resp.status < 500: + raise RuntimeError( + f"upload media to cdn failed: {resp.status} {detail}" + ) + if resp.status != 200: + raise RuntimeError( + f"upload media to cdn failed: {resp.status} {detail}" + ) + download_param = resp.headers.get("x-encrypted-param") + if not download_param: + raise RuntimeError( + "upload media to cdn failed: missing x-encrypted-param" + ) + return download_param + + async def download_cdn_bytes(self, encrypted_query_param: str) -> bytes: + await self.ensure_http_session() + assert self._http_session is not None + timeout = aiohttp.ClientTimeout(total=self.api_timeout_ms / 1000) + async with self._http_session.get( + self._build_cdn_download_url(encrypted_query_param), + timeout=timeout, + ) as resp: + if resp.status >= 400: + detail = await resp.text() + raise RuntimeError( + f"download media from cdn failed: {resp.status} {detail}" + ) + return await resp.read() + + async def download_and_decrypt_media( + self, + encrypted_query_param: str, + aes_key_value: str, + ) -> bytes: + encrypted = await self.download_cdn_bytes(encrypted_query_param) + key = self.parse_media_aes_key(aes_key_value) + cipher = AES.new(key, AES.MODE_ECB) + return self.pkcs7_unpad(cipher.decrypt(encrypted)) + + async def request_json( + self, + method: str, + endpoint: str, + *, + params: dict[str, Any] | None = None, + payload: dict[str, Any] | None = None, + token_required: bool = False, + timeout_ms: int | None = None, + headers: dict[str, str] | None = None, + ) -> dict[str, Any]: + await self.ensure_http_session() + assert self._http_session is not None + req_timeout = timeout_ms if timeout_ms is not None else self.api_timeout_ms + timeout = aiohttp.ClientTimeout(total=req_timeout / 1000) + merged_headers = self._build_base_headers(token_required=token_required) + if headers: + merged_headers.update(headers) + + async with self._http_session.request( + method, + self._resolve_url(endpoint), + params=params, + json=payload, + headers=merged_headers, + timeout=timeout, + ) as resp: + text = await resp.text() + if resp.status >= 400: + raise RuntimeError(f"{method} {endpoint} failed: {resp.status} {text}") + if not text: + return {} + return cast(dict[str, Any], json.loads(text)) diff --git a/astrbot/core/platform/sources/weixin_oc/weixin_oc_event.py b/astrbot/core/platform/sources/weixin_oc/weixin_oc_event.py new file mode 100644 index 000000000..abe3b5a06 --- /dev/null +++ b/astrbot/core/platform/sources/weixin_oc/weixin_oc_event.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +import asyncio +from typing import TYPE_CHECKING + +from astrbot.api.event import AstrMessageEvent, MessageChain +from astrbot.api.message_components import ( + At, + BaseMessageComponent, + File, + Image, + Plain, + Record, + Video, +) + +if TYPE_CHECKING: # pragma: no cover - typing helper + from .weixin_oc_adapter import WeixinOCAdapter + + +class WeixinOCMessageEvent(AstrMessageEvent): + def __init__( + self, + message_str, + message_obj, + platform_meta, + session_id, + platform: WeixinOCAdapter, + ) -> None: + super().__init__(message_str, message_obj, platform_meta, session_id) + self.platform = platform + + @staticmethod + def _segment_to_text(segment: BaseMessageComponent) -> str: + if isinstance(segment, Plain): + return segment.text + if isinstance(segment, Image): + return "[图片]" + if isinstance(segment, File): + return f"[文件:{segment.name}]" + if isinstance(segment, Video): + return "[视频]" + if isinstance(segment, Record): + return "[音频]" + if isinstance(segment, At): + return f"@{segment.name or segment.qq}" + return "[消息]" + + @staticmethod + def _build_plain_text(message: MessageChain) -> str: + return "".join( + WeixinOCMessageEvent._segment_to_text(seg) for seg in message.chain + ) + + async def send(self, message: MessageChain) -> None: + if not message.chain: + return + await self.platform.send_by_session(self.session, message) + await super().send(message) + + async def send_streaming(self, generator, use_fallback: bool = False): + if not use_fallback: + buffer = None + async for chain in generator: + if not buffer: + buffer = chain + else: + buffer.chain.extend(chain.chain) + if not buffer: + return None + await self.send(buffer) + return await super().send_streaming(generator, use_fallback) + + buffer = "" + async for chain in generator: + if not isinstance(chain, MessageChain): + continue + for component in chain.chain: + if not isinstance(component, Plain): + await self.send(MessageChain(chain=[component])) + await asyncio.sleep(1.2) + continue + buffer += component.text + if buffer.strip(): + await self.send(MessageChain([Plain(buffer)])) + return await super().send_streaming(generator, use_fallback) diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index 233347bbd..6e918b14e 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -394,6 +394,9 @@ class ProviderOpenAIOfficial(Provider): cached = cached if isinstance(cached, int) else 0 # ptd.cached_tokens 可能为None prompt_tokens = getattr(usage, "prompt_tokens", 0) or 0 # 安全 completion_tokens = getattr(usage, "completion_tokens", 0) or 0 + cached = cached or 0 + prompt_tokens = prompt_tokens or 0 + completion_tokens = completion_tokens or 0 return TokenUsage( input_other=prompt_tokens - cached, input_cached=cached, diff --git a/astrbot/core/provider/sources/whisper_api_source.py b/astrbot/core/provider/sources/whisper_api_source.py index d3aae9ff3..80305440b 100644 --- a/astrbot/core/provider/sources/whisper_api_source.py +++ b/astrbot/core/provider/sources/whisper_api_source.py @@ -7,6 +7,7 @@ from openai import NOT_GIVEN, AsyncOpenAI from astrbot.core import logger from astrbot.core.utils.astrbot_path import get_astrbot_temp_path from astrbot.core.utils.io import download_file +from astrbot.core.utils.media_utils import convert_audio_to_wav from astrbot.core.utils.tencent_record_helper import ( convert_to_pcm_wav, tencent_silk_to_wav, @@ -81,7 +82,22 @@ class ProviderOpenAIWhisperAPI(STTProvider): if not await anyio.Path(audio_url).exists(): raise FileNotFoundError(f"文件不存在: {audio_url}") - if audio_url.endswith(".amr") or audio_url.endswith(".silk") or is_tencent: + lower_audio_url = audio_url.lower() + + if lower_audio_url.endswith(".opus"): + temp_dir = get_astrbot_temp_path() + output_path = os.path.join( + temp_dir, + f"whisper_api_{uuid.uuid4().hex[:8]}.wav", + ) + logger.info("Converting opus file to wav using convert_audio_to_wav...") + await convert_audio_to_wav(audio_url, output_path) + audio_url = output_path + elif ( + lower_audio_url.endswith(".amr") + or lower_audio_url.endswith(".silk") + or is_tencent + ): file_format = await self._get_audio_format(audio_url) # 判断是否需要转换 diff --git a/astrbot/core/skills/skill_manager.py b/astrbot/core/skills/skill_manager.py index ed61399c2..bc72bcaec 100644 --- a/astrbot/core/skills/skill_manager.py +++ b/astrbot/core/skills/skill_manager.py @@ -6,6 +6,7 @@ import re import shlex import shutil import tempfile +import uuid import zipfile from dataclasses import dataclass from datetime import datetime, timezone @@ -54,6 +55,29 @@ def _is_ignored_zip_entry(name: str) -> bool: return parts[0] == "__MACOSX" +def _normalize_skill_markdown_path(skill_dir: Path) -> Path | None: + """Return the canonical `SKILL.md` path for a skill directory. + + If only legacy `skill.md` exists, it is renamed to `SKILL.md` in-place. + """ + canonical = skill_dir / "SKILL.md" + entries = set() + if skill_dir.exists(): + entries = {entry.name for entry in skill_dir.iterdir()} + if "SKILL.md" in entries: + return canonical + legacy = skill_dir / "skill.md" + if "skill.md" not in entries: + return None + try: + tmp = skill_dir / f".{uuid.uuid4().hex}.tmp_skill_md" + legacy.rename(tmp) + tmp.rename(canonical) + except OSError: + return legacy + return canonical + + @dataclass class SkillInfo: name: str @@ -371,8 +395,8 @@ class SkillManager: if not entry.is_dir(): continue skill_name = entry.name - skill_md = entry / "SKILL.md" - if not skill_md.exists(): + skill_md = _normalize_skill_markdown_path(entry) + if skill_md is None: continue active = skill_configs.get(skill_name, {}).get("active", True) if skill_name not in skill_configs: @@ -463,7 +487,7 @@ class SkillManager: def is_sandbox_only_skill(self, name: str) -> bool: skill_dir = Path(self.skills_root) / name - skill_md_exists = (skill_dir / "SKILL.md").exists() + skill_md_exists = _normalize_skill_markdown_path(skill_dir) is not None if skill_md_exists: return False cache = self._load_sandbox_skills_cache() @@ -577,6 +601,7 @@ class SkillManager: continue zf.extract(member, tmp_dir) src_dir = Path(tmp_dir) / skill_name + _normalize_skill_markdown_path(src_dir) if not src_dir.exists(): raise ValueError("Skill folder not found after extraction.") dest_dir = Path(self.skills_root) / skill_name diff --git a/astrbot/core/utils/media_utils.py b/astrbot/core/utils/media_utils.py index 2c79413c3..b7a402424 100644 --- a/astrbot/core/utils/media_utils.py +++ b/astrbot/core/utils/media_utils.py @@ -14,6 +14,8 @@ import anyio from PIL import Image as PILImage +from PIL import Image as PILImage + from astrbot import logger from astrbot.core.utils.astrbot_path import get_astrbot_temp_path diff --git a/changelogs/v4.21.0.md b/changelogs/v4.21.0.md new file mode 100644 index 000000000..feaa0fc59 --- /dev/null +++ b/changelogs/v4.21.0.md @@ -0,0 +1,109 @@ +## What's Changed + +### 新增 + +- 为插件市场新增分类筛选并优化界面组件。([#6762](https://github.com/AstrBotDevs/AstrBot/pull/6762)) +- 新增 Kimi Coding Plan Provider(兼容 Anthropic API)。([#6559](https://github.com/AstrBotDevs/AstrBot/pull/6559)) +- 统一并重命名 `skill.md` 文件为 `SKILL.md`。([#6757](https://github.com/AstrBotDevs/AstrBot/pull/6757)) +- 新增 Ollama 关闭思考模式开关。([#5941](https://github.com/AstrBotDevs/AstrBot/pull/5941)) +- 新增小米 MiMo TTS 与 STT Provider。([#6643](https://github.com/AstrBotDevs/AstrBot/pull/6643)) +- 新增多模态上下文 token 计数能力(图片、音频与思维链)。([#6596](https://github.com/AstrBotDevs/AstrBot/pull/6596)) +- 新增按元信息名称安装插件并校验可导入标识符。([#6530](https://github.com/AstrBotDevs/AstrBot/pull/6530)) + +### 优化 + +- 降低 `kook_type` 中 `StrEnum` 到 `(str, Enum)` 以兼容旧版本 Python。([#6512](https://github.com/AstrBotDevs/AstrBot/pull/6512)) +- 优化 WebChat 消息处理:提前保存消息并增强流式补全。([#6698](https://github.com/AstrBotDevs/AstrBot/pull/6698)) +- 优化 Dashboard 中移动端 persona 选择器布局。([#5907](https://github.com/AstrBotDevs/AstrBot/pull/5907)) +- 优化 Dashboard,减少 MDI icon font 范围并自托管 Google Fonts。([#6532](https://github.com/AstrBotDevs/AstrBot/pull/6532)) +- 使用 Pydantic 重构 KOOK 适配器数据模型以提升消息结构解析与校验性能。([#5719](https://github.com/AstrBotDevs/AstrBot/pull/5719)) +- 调整文档术语与表达(“消息平台”改为“机器人”等)并优化更新说明文字。([#6568](https://github.com/AstrBotDevs/AstrBot/pull/6568)) + +### 修复 + +- 修复 web search tools 中被禁用系统函数时未正确生效的问题。([#6584](https://github.com/AstrBotDevs/AstrBot/pull/6584)) +- 跳过空的知识库嵌入批次,避免不必要计算。([#6106](https://github.com/AstrBotDevs/AstrBot/pull/6106)) +- 修复 Feishu opus 文件在 Whisper API STT 场景下未正确转换的问题。([#6078](https://github.com/AstrBotDevs/AstrBot/pull/6078)) +- 修复 Lark 在工具调用中断时卡片创建与重续流程。([#6743](https://github.com/AstrBotDevs/AstrBot/pull/6743)) +- 修复 Windows 环境下 skill 文件编码兼容问题。([#6058](https://github.com/AstrBotDevs/AstrBot/pull/6058)) +- 修复 WebChat 单独渲染的 HTML 回复被错误显示的问题。([#6074](https://github.com/AstrBotDevs/AstrBot/pull/6074)) +- 修复 Gemini 数组 schema 缺少 `items` 字段的问题。([#6051](https://github.com/AstrBotDevs/AstrBot/pull/6051)) +- 修复 skills 使用硬编码工作区路径的问题,改为使用缓存中的真实沙箱路径。([#6331](https://github.com/AstrBotDevs/AstrBot/pull/6331)) +- 修复 subagent 工具调用超时传递,修正 `tool_call_timeout` 并将默认超时从 60 秒提升到 120 秒。([#6713](https://github.com/AstrBotDevs/AstrBot/pull/6713)) +- 修复 `skills-like` 下缺失 `extra_user_content_parts` 时未注入图片说明的问题。([#6710](https://github.com/AstrBotDevs/AstrBot/pull/6710)) +- 修复 `/stop` 后继续处理后续 follow-up 消息的问题。([#6704](https://github.com/AstrBotDevs/AstrBot/pull/6704)) +- 修复核心流程在 stop 时中断子代理工具等待的行为。([#5850](https://github.com/AstrBotDevs/AstrBot/pull/5850)) +- 修复 Windows 平台 stdio MCP 服务 `PATHEXT` 丢失的问题。([#5822](https://github.com/AstrBotDevs/AstrBot/pull/5822)) +- 修复 Telegram 轮询重启机制,失败时自动恢复循环。([#6648](https://github.com/AstrBotDevs/AstrBot/pull/6648)) +- 修复 `/stop` 后 follow-up 状态未清理导致后续触发继续运行的问题。([#6656](https://github.com/AstrBotDevs/AstrBot/pull/6656)) +- 修复 OpenAI 配置日志,改进代理与 API Base 的可读性与排障能力。([#6669](https://github.com/AstrBotDevs/AstrBot/pull/6669)) +- 修复长工具调用中截断逻辑误删唯一 user 消息的问题。([#6198](https://github.com/AstrBotDevs/AstrBot/pull/6198)) +- 修复截断器移除唯一用户消息导致部分 provider 返回 `400` 的问题。([#6581](https://github.com/AstrBotDevs/AstrBot/pull/6581)) +- 修复 ID 白名单为空时提示文案不清晰的问题。([#6611](https://github.com/AstrBotDevs/AstrBot/pull/6611)) +- 修复 MoonshotAI 官方 API 下 OpenAI token usage 缺失问题。([#6618](https://github.com/AstrBotDevs/AstrBot/pull/6618)) +- 提升 Wecom AI Bot 流式可读性与速度(限流处理),改善卡顿与显示体验。([#6610](https://github.com/AstrBotDevs/AstrBot/pull/6610)) +- 修复 Wecom 长连接回复消失的问题。([#6606](https://github.com/AstrBotDevs/AstrBot/pull/6606)) +- 修复 Windows 打包运行时 pip/native 构建环境配置问题。([#6575](https://github.com/AstrBotDevs/AstrBot/pull/6575)) +- 修复仅在显式配置时传递 embedding `dimensions`,避免无效参数干扰。([#6432](https://github.com/AstrBotDevs/AstrBot/pull/6432)) +- 修复 `register_agent` 装饰器导致的 `NameError`。([#5765](https://github.com/AstrBotDevs/AstrBot/pull/5765)) +- 修复默认 persona 场景下的 subagent 查询失败问题。([#5672](https://github.com/AstrBotDevs/AstrBot/pull/5672)) +- 修复 Windows 下 skill 读取失败问题。([#6490](https://github.com/AstrBotDevs/AstrBot/pull/6490)) +- 修复 `SKILL.md` 多行 frontmatter 解析问题。([#6460](https://github.com/AstrBotDevs/AstrBot/pull/6460)) +- 修复 SQLite `database is locked` 问题,新增繁忙超时处理。([#6474](https://github.com/AstrBotDevs/AstrBot/pull/6474)) +- 修复工作流限制仅允许上游仓库触发的报错场景。([#6531](https://github.com/AstrBotDevs/AstrBot/pull/6531)) + +--- + +## What's Changed (EN) + +### New Features + +- Added category filtering for market plugins and enhanced UI components. +- Normalized and renamed `skill.md` files to `SKILL.md`. +- Added a toggle to disable thinking mode in Ollama. +- Added Xiaomi MiMo TTS & STT providers. +- Added Kimi Coding Plan provider with Anthropic API compatibility. +- Added context token counting support for multimodal content (images, audio, and chain-of-thought). +- Added plugin installation by metadata name and validated importable identifiers. + +### Improvements + +- Refactored `StrEnum` to `(str, Enum)` in `kook_type` for backward compatibility. +- Enhanced WebChat message handling with proactive saving and streaming completion. +- Simplified dashboard persona selector layout for mobile screens. +- Subset MDI icon font and self-hosted Google Fonts in dashboard. +- Implemented Pydantic data models for KOOK adapter for better retrieval and schema validation. +- Updated documentation wording for incomplete updates terminology. + +### Bug Fixes + +- Fixed disabled system functions in web search tools. +- Skipped empty knowledge-base embedding batches. +- Converted Feishu opus files for Whisper API STT. +- Deferred Lark card creation and renewal on tool call break. +- Added fallback for Windows skill file encodings. +- Rendered standalone HTML replies as code in WebChat. +- Ensured Gemini array schemas always include `items`. +- Fixed skills path resolution to use cached sandbox path instead of hardcoded workspace root. +- Passed `tool_call_timeout` to subagent handsoff/cron/background tasks and increased default timeout to 120 seconds. +- Fixed `skills-like` re-query missing `extra_user_content_parts` causing image caption not injected. +- Rejected follow-up messages after `/stop` request. +- Interrupted subagent tool waits on stop. +- Preserved `PATHEXT` for stdio MCP servers on Windows. +- Added automatic restart for Telegram polling loop on failure. +- Fixed follow-up persistence logic after `/stop` trigger. +- Improved OpenAI proxy/API base logging. +- Prevented truncation logic from removing the only user message in long tool-calling conversations. +- Fixed truncation removing the only user message and returning `400` for some providers. +- Updated ID whitelist empty-configuration hint wording. +- Fixed token usage with MoonshotAI official API. +- Improved Wecom AI Bot streaming readability and speed via throttling. +- Prevented Wecom AI Bot long connection replies from disappearing. +- Set packaged Windows runtime build env for pip native builds. +- Only pass embedding dimensions when explicitly configured. +- Fixed `register_agent` decorator `NameError`. +- Fixed subagent lookup failure when using default persona. +- Fixed reading skills on Windows. +- Fixed multiline frontmatter parsing in `SKILL.md`. +- Fixed SQLite `database is locked` with busy timeout. +- Restricted workflows to upstream repo. diff --git a/changelogs/v4.22.0.md b/changelogs/v4.22.0.md new file mode 100644 index 000000000..19be6d472 --- /dev/null +++ b/changelogs/v4.22.0.md @@ -0,0 +1,37 @@ +## What's Changed + +### 新增 + +- 新增**微信个人号**接入能力(微信官方提供)。([#6777](https://github.com/AstrBotDevs/AstrBot/pull/6777)) +- 新增图片压缩能力,支持图片尺寸、JPEG 质量限制。([#6794](https://github.com/AstrBotDevs/AstrBot/pull/6794)) +- 新增 WebUI 已安装插件置顶与拖拽重排能力。([#6776](https://github.com/AstrBotDevs/AstrBot/pull/6776)) + +### 优化 + +- 知识库为空时自动跳过检索,避免无效搜索调用。([#6750](https://github.com/AstrBotDevs/AstrBot/pull/6750)) +- 修复 `frontmatter` 转义换行符保留行为并更新相关测试与 CI 工作流(含文档与配置同步)。([#6783](https://github.com/AstrBotDevs/AstrBot/pull/6783)) + +### 修复 + +- Telegram 适配器改为导入 `Forbidden`,替代已弃用的 `Unauthorized`(兼容性修正)。([#6769](https://github.com/AstrBotDevs/AstrBot/pull/6769)) +- 处理 OpenAI Provider 中 `token usage metrics` 为 `None` 时的异常场景。([#6788](https://github.com/AstrBotDevs/AstrBot/pull/6788)) +- 保留全部 `CallToolResult` 的 `content` 项,避免工具调用上下文内容丢失。([#6149](https://github.com/AstrBotDevs/AstrBot/pull/6149)) + +## What's Changed (EN) + +### New Features + +- Added WeChat personal account support, including QR-code driven setup, message flow refactor, and media handling improvements.([#6777](https://github.com/AstrBotDevs/AstrBot/pull/6777)) +- Added pinning and drag-sorting for installed WebUI plugins.([#6776](https://github.com/AstrBotDevs/AstrBot/pull/6776)) +- Added image compression with max-size handling and temporary-file lifecycle management for improved image efficiency.([#6794](https://github.com/AstrBotDevs/AstrBot/pull/6794)) + +### Improvements + +- Skipped search execution when the entire knowledge base is empty.([#6750](https://github.com/AstrBotDevs/AstrBot/pull/6750)) +- Preserved escaped newlines in `frontmatter`, with related test and CI workflow updates.([#6783](https://github.com/AstrBotDevs/AstrBot/pull/6783)) + +### Bug Fixes + +- Replaced deprecated Telegram adapter import of `Unauthorized` with `Forbidden`.([#6769](https://github.com/AstrBotDevs/AstrBot/pull/6769)) +- Handled `None` values in OpenAI provider `token usage metrics`.([#6788](https://github.com/AstrBotDevs/AstrBot/pull/6788)) +- Kept all `CallToolResult.content` items to prevent losing tool-call context.([#6149](https://github.com/AstrBotDevs/AstrBot/pull/6149)) diff --git a/dashboard/package.json b/dashboard/package.json index 61e6d169e..55b8e48e0 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -14,6 +14,7 @@ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" }, "dependencies": { + "qrcode": "^1.5.4", "@guolao/vue-monaco-editor": "^1.5.4", "@tiptap/starter-kit": "2.1.7", "@tiptap/vue-3": "2.1.7", @@ -73,4 +74,4 @@ "immutable": "4.3.8", "lodash-es": "4.17.23" } -} \ No newline at end of file +} diff --git a/dashboard/pnpm-lock.yaml b/dashboard/pnpm-lock.yaml new file mode 100644 index 000000000..775b52a2f --- /dev/null +++ b/dashboard/pnpm-lock.yaml @@ -0,0 +1,6104 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + immutable: 4.3.8 + lodash-es: 4.17.23 + +importers: + + .: + dependencies: + '@guolao/vue-monaco-editor': + specifier: ^1.5.4 + version: 1.6.0(monaco-editor@0.52.2)(vue@3.3.4) + '@tiptap/starter-kit': + specifier: 2.1.7 + version: 2.1.7(@tiptap/pm@2.27.2) + '@tiptap/vue-3': + specifier: 2.1.7 + version: 2.1.7(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(vue@3.3.4) + apexcharts: + specifier: 3.42.0 + version: 3.42.0 + axios: + specifier: 1.13.5 + version: 1.13.5 + axios-mock-adapter: + specifier: ^1.22.0 + version: 1.22.0(axios@1.13.5) + chance: + specifier: 1.1.11 + version: 1.1.11 + date-fns: + specifier: 2.30.0 + version: 2.30.0 + dompurify: + specifier: ^3.3.2 + version: 3.3.2 + event-source-polyfill: + specifier: ^1.0.31 + version: 1.0.31 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + js-md5: + specifier: ^0.8.3 + version: 0.8.3 + katex: + specifier: ^0.16.27 + version: 0.16.28 + lodash: + specifier: 4.17.23 + version: 4.17.23 + markdown-it: + specifier: ^14.1.1 + version: 14.1.1 + markstream-vue: + specifier: ^0.0.6 + version: 0.0.6(katex@0.16.28)(mermaid@11.12.2)(shiki@3.22.0)(stream-markdown@0.0.13(shiki@3.22.0))(stream-monaco@0.0.17(monaco-editor@0.52.2))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4) + mermaid: + specifier: ^11.12.2 + version: 11.12.2 + monaco-editor: + specifier: ^0.52.2 + version: 0.52.2 + pinia: + specifier: 2.1.6 + version: 2.1.6(typescript@5.1.6)(vue@3.3.4) + pinyin-pro: + specifier: ^3.26.0 + version: 3.28.0 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + shiki: + specifier: ^3.20.0 + version: 3.22.0 + stream-markdown: + specifier: ^0.0.13 + version: 0.0.13(shiki@3.22.0) + vee-validate: + specifier: 4.11.3 + version: 4.11.3(vue@3.3.4) + vite-plugin-vuetify: + specifier: 2.1.3 + version: 2.1.3(vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)(vuetify@3.7.11) + vue: + specifier: 3.3.4 + version: 3.3.4 + vue-i18n: + specifier: ^11.1.5 + version: 11.2.8(vue@3.3.4) + vue-router: + specifier: 4.2.4 + version: 4.2.4(vue@3.3.4) + vue3-apexcharts: + specifier: 1.4.4 + version: 1.4.4(apexcharts@3.42.0)(vue@3.3.4) + vue3-print-nb: + specifier: 0.1.4 + version: 0.1.4 + vuetify: + specifier: 3.7.11 + version: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@2.1.3)(vue@3.3.4) + yup: + specifier: 1.2.0 + version: 1.2.0 + devDependencies: + '@mdi/font': + specifier: 7.2.96 + version: 7.2.96 + '@rushstack/eslint-patch': + specifier: 1.3.3 + version: 1.3.3 + '@types/chance': + specifier: 1.1.3 + version: 1.1.3 + '@types/dompurify': + specifier: ^3.0.5 + version: 3.2.0 + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@types/node': + specifier: ^20.5.7 + version: 20.19.32 + '@vitejs/plugin-vue': + specifier: 5.2.4 + version: 5.2.4(vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4) + '@vue/eslint-config-prettier': + specifier: 8.0.0 + version: 8.0.0(@types/eslint@9.6.1)(eslint@8.48.0)(prettier@3.0.2) + '@vue/eslint-config-typescript': + specifier: 11.0.3 + version: 11.0.3(eslint-plugin-vue@9.17.0(eslint@8.48.0))(eslint@8.48.0)(typescript@5.1.6) + '@vue/tsconfig': + specifier: ^0.4.0 + version: 0.4.0 + eslint: + specifier: 8.48.0 + version: 8.48.0 + eslint-plugin-vue: + specifier: 9.17.0 + version: 9.17.0(eslint@8.48.0) + prettier: + specifier: 3.0.2 + version: 3.0.2 + sass: + specifier: 1.66.1 + version: 1.66.1 + sass-loader: + specifier: 13.3.2 + version: 13.3.2(sass@1.66.1)(webpack@5.105.0) + subset-font: + specifier: ^2.4.0 + version: 2.4.0 + typescript: + specifier: 5.1.6 + version: 5.1.6 + vite: + specifier: 6.4.1 + version: 6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0) + vite-plugin-webfont-dl: + specifier: ^3.12.0 + version: 3.12.0(vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0)) + vue-cli-plugin-vuetify: + specifier: 2.5.8 + version: 2.5.8(sass-loader@13.3.2(sass@1.66.1)(webpack@5.105.0))(vue@3.3.4)(vuetify-loader@2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0))(webpack@5.105.0) + vue-tsc: + specifier: 1.8.8 + version: 1.8.8(typescript@5.1.6) + vuetify-loader: + specifier: ^2.0.0-alpha.9 + version: 2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0) + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + + '@cacheable/memory@2.0.8': + resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==} + + '@cacheable/utils@2.4.0': + resolution: {integrity: sha512-PeMMsqjVq+bF0WBsxFBxr/WozBJiZKY0rUojuaCoIaKnEl3Ju1wfEwS+SV1DU/cSe8fqHIPiYJFif8T3MVt4cQ==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.48.0': + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@guolao/vue-monaco-editor@1.6.0': + resolution: {integrity: sha512-w2IiJ6eJGGeuIgCK6EKZOAfhHTTUB5aZwslzwGbZ5e89Hb4avx6++GkLTW8p84Sng/arFMjLPPxSBI56cFudyQ==} + peerDependencies: + '@vue/composition-api': ^1.7.2 + monaco-editor: '>=0.43.0' + vue: ^2.6.14 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.0': + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + + '@intlify/core-base@11.2.8': + resolution: {integrity: sha512-nBq6Y1tVkjIUsLsdOjDSJj4AsjvD0UG3zsg9Fyc+OivwlA/oMHSKooUy9tpKj0HqZ+NWFifweHavdljlBLTwdA==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.2.8': + resolution: {integrity: sha512-A5n33doOjmHsBtCN421386cG1tWp5rpOjOYPNsnpjIJbQ4POF0QY2ezhZR9kr0boKwaHjbOifvyQvHj2UTrDFQ==} + engines: {node: '>= 16'} + + '@intlify/shared@11.2.8': + resolution: {integrity: sha512-l6e4NZyUgv8VyXXH4DbuucFOBmxLF56C/mqh2tvApbzl2Hrhi1aTDcuv5TKdxzfHYmpO3UB0Cz04fgDT9vszfw==} + engines: {node: '>= 16'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@mdi/font@7.2.96': + resolution: {integrity: sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w==} + + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + + '@monaco-editor/loader@1.7.0': + resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + cpu: [x64] + os: [win32] + + '@rushstack/eslint-patch@1.3.3': + resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} + + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} + + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} + + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} + + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} + + '@shikijs/monaco@3.22.0': + resolution: {integrity: sha512-4Bi/Gr5+ZVGmILq4ksyWtNbylfHxYB0BDMLR76UsaKOkWNJ/1w+c2s7bIjYnBNydyLVRlp28qntqEvB9EaJu3g==} + + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} + + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tiptap/core@2.27.2': + resolution: {integrity: sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.27.2': + resolution: {integrity: sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.27.2': + resolution: {integrity: sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bubble-menu@2.27.2': + resolution: {integrity: sha512-VkwlCOcr0abTBGzjPXklJ92FCowG7InU8+Od9FyApdLNmn0utRYGRhw0Zno6VgE9EYr1JY4BRnuSa5f9wlR72w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-bullet-list@2.27.2': + resolution: {integrity: sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-code-block@2.27.2': + resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.27.2': + resolution: {integrity: sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-document@2.27.2': + resolution: {integrity: sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.27.2': + resolution: {integrity: sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-floating-menu@2.27.2': + resolution: {integrity: sha512-GUN6gPIGXS7ngRJOwdSmtBRBDt9Kt9CM/9pSwKebhLJ+honFoNA+Y6IpVyDvvDMdVNgBchiJLs6qA5H97gAePQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.27.2': + resolution: {integrity: sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.27.2': + resolution: {integrity: sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.27.2': + resolution: {integrity: sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.27.2': + resolution: {integrity: sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.27.2': + resolution: {integrity: sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.27.2': + resolution: {integrity: sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-list-item@2.27.2': + resolution: {integrity: sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-ordered-list@2.27.2': + resolution: {integrity: sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.27.2': + resolution: {integrity: sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-strike@2.27.2': + resolution: {integrity: sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.27.2': + resolution: {integrity: sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.27.2': + resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} + + '@tiptap/starter-kit@2.1.7': + resolution: {integrity: sha512-z2cmJRSC7ImaTGWrHv+xws9y1wIG0OCPosBYpmpwlEfA3JG3axWFmVRJlWnsQV4eSMi3QY3vaPgBAnrR4IxRhQ==} + + '@tiptap/vue-3@2.1.7': + resolution: {integrity: sha512-JJRXWKLJ8mopb0uZV4JXyOW6vKQnarYoCj0hsy9ZT2LhSuLlPXY0D40NAbFVMMbQssewUtgPUFgVZ/TusMEysQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + vue: ^3.0.0 + + '@types/chance@1.1.3': + resolution: {integrity: sha512-X6c6ghhe4/sQh4XzcZWSFaTAUOda38GQHmq9BUanYkOE/EO7ZrkazwKmtsj3xzTjkLWmwULE++23g3d3CCWaWw==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/dompurify@3.2.0': + resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} + deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/node@20.19.32': + resolution: {integrity: sha512-Ez8QE4DMfhjjTsES9K2dwfV258qBui7qxUsoaixZDiTzbde4U12e1pXGNu/ECsUIOi5/zoCxAQxIhQnaUQ2VvA==} + + '@types/node@20.19.37': + resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@1.10.10': + resolution: {integrity: sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==} + + '@volar/source-map@1.10.10': + resolution: {integrity: sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==} + + '@volar/typescript@1.10.10': + resolution: {integrity: sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==} + + '@vue/compiler-core@3.3.4': + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + + '@vue/compiler-core@3.5.27': + resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} + + '@vue/compiler-dom@3.3.4': + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + + '@vue/compiler-dom@3.5.27': + resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} + + '@vue/compiler-sfc@3.3.4': + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + + '@vue/compiler-ssr@3.3.4': + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/eslint-config-prettier@8.0.0': + resolution: {integrity: sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==} + peerDependencies: + eslint: '>= 8.0.0' + prettier: '>= 3.0.0' + + '@vue/eslint-config-typescript@11.0.3': + resolution: {integrity: sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vue: ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@1.8.8': + resolution: {integrity: sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity-transform@3.3.4': + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + + '@vue/reactivity@3.3.4': + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + + '@vue/reactivity@3.5.27': + resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} + + '@vue/runtime-core@3.3.4': + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + + '@vue/runtime-dom@3.3.4': + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + + '@vue/server-renderer@3.3.4': + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + + '@vue/shared@3.3.4': + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + + '@vue/shared@3.5.27': + resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} + + '@vue/tsconfig@0.4.0': + resolution: {integrity: sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==} + + '@vue/typescript@1.8.8': + resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==} + + '@vuetify/loader-shared@1.7.1': + resolution: {integrity: sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==} + peerDependencies: + vue: ^3.0.0 + vuetify: ^3.0.0-beta.4 + + '@vuetify/loader-shared@2.1.2': + resolution: {integrity: sha512-X+1jBLmXHkpQEnC0vyOb4rtX2QSkBiFhaFXz8yhQqN2A4vQ6k2nChxN4Ol7VAY5KoqMdFoRMnmNdp/1qYXDQig==} + peerDependencies: + vue: ^3.0.0 + vuetify: '>=3' + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yr/monotone-cubic-spline@1.0.3': + resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + alien-signals@2.0.8: + resolution: {integrity: sha512-844G1VLkk0Pe2SJjY0J8vp8ADI73IM4KliNu2OGlYzWpO28NexEUvjHTcFjFX3VXoiUtwTbHxLNI9ImkcoBqzA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + apexcharts@3.42.0: + resolution: {integrity: sha512-hYhzZqh2Efny9uiutkGU2M/EarJ4Nn8s6dxZ0C7E7N+SV4d1xjTioXi2NLn4UKVJabZkb3HnpXDoumXgtAymwg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios-mock-adapter@1.22.0: + resolution: {integrity: sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==} + peerDependencies: + axios: '>= 0.17.0' + + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} + hasBin: true + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + cacheable@2.3.3: + resolution: {integrity: sha512-iffYMX4zxKp54evOH27fm92hs+DeC1DhXmNVN8Tr94M/iZIV42dqTHSR2Ik4TOSPyOAwKr7Yu3rN9ALoLkbWyQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001778: + resolution: {integrity: sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chance@1.1.11: + resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decache@4.6.2: + resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dompurify@3.3.2: + resolution: {integrity: sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==} + engines: {node: '>=20'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.307: + resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enhanced-resolve@5.20.0: + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@9.17.0: + resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-source-polyfill@1.0.31: + resolution: {integrity: sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat-cache@6.1.20: + resolution: {integrity: sha512-AhHYqwvN62NVLp4lObVXGVluiABTHapoB57EyegZVmazN+hhGhLTn3uZbOofoTw4DSDvVCadzzyChXhOAvy8uQ==} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + fontverter@2.0.0: + resolution: {integrity: sha512-DFVX5hvXuhi1Jven1tbpebYTCT9XYnvx6/Z+HFUPb7ZRMCW+pj2clU9VMhoTPgWKPhAs7JJDSk3CW1jNUvKCZQ==} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + harfbuzzjs@0.4.15: + resolution: {integrity: sha512-p1edvnlc+vpRe2kz7OKzcscf0gyFiDZpco+miDxAiiZ67cu1oNlbuOkmP/A/i1l/w938VrkF2FdZ8scNcnkPrQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hashery@1.5.0: + resolution: {integrity: sha512-nhQ6ExaOIqti2FDWoEMWARUqIKyjr2VcZzXShrI+A3zpeiuPWzx6iPftt44LhP74E5sW36B75N6VHbvRtpvO6Q==} + engines: {node: '>=20'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@4.3.8: + resolution: {integrity: sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-md5@0.8.3: + resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + markdown-it-container@4.0.0: + resolution: {integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==} + + markdown-it-footnote@4.0.0: + resolution: {integrity: sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==} + + markdown-it-ins@4.0.0: + resolution: {integrity: sha512-sWbjK2DprrkINE4oYDhHdCijGT+MIDhEupjSHLXe5UXeVr5qmVxs/nTUVtgi0Oh/qtF+QKV0tNWDhQBEPxiMew==} + + markdown-it-mark@4.0.0: + resolution: {integrity: sha512-YLhzaOsU9THO/cal0lUjfMjrqSMPjjyjChYM7oyj4DnyaXEzA8gnW6cVJeyCrCVeyesrY2PlEdUYJSPFYL4Nkg==} + + markdown-it-sub@2.0.0: + resolution: {integrity: sha512-iCBKgwCkfQBRg2vApy9vx1C1Tu6D8XYo8NvevI3OlwzBRmiMtsJ2sXupBgEA7PPxiDwNni3qIUkhZ6j5wofDUA==} + + markdown-it-sup@2.0.0: + resolution: {integrity: sha512-5VgmdKlkBd8sgXuoDoxMpiU+BiEt3I49GItBzzw7Mxq9CxvnhE/k09HFli09zgfFDRixDQDfDxi0mgBCXtaTvA==} + + markdown-it-task-checkbox@1.0.6: + resolution: {integrity: sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw==} + + markdown-it-ts@0.0.3: + resolution: {integrity: sha512-nZpRTJj4S6bN0I5wsNBtgzDKx+HYBBSsvKjGdYw7/tPdrzfo3gUTt3ZbeAjPGeZaC6a4LFi4JdhTVeLm3F6TIQ==} + engines: {node: '>=18'} + + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + markstream-vue@0.0.6: + resolution: {integrity: sha512-5YrpNrTRdbO0YvKPx2sNu4pq+y+UZ1CPbf9Znoydt3ZL7c7zfBhmViCij+VmAmBrr3VLAgD2HToU8PAtuWySxg==} + peerDependencies: + '@antv/infographic': ^0.2.3 + katex: '>=0.16.22' + mermaid: '>=11' + shiki: ^3.13.0 + stream-markdown: '>=0.0.13' + stream-monaco: '>=0.0.17' + vue: '>=3.0.0' + vue-i18n: '>=9' + peerDependenciesMeta: + '@antv/infographic': + optional: true + katex: + optional: true + mermaid: + optional: true + shiki: + optional: true + stream-markdown: + optional: true + stream-monaco: + optional: true + vue-i18n: + optional: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@11.12.2: + resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + null-loader@4.0.1: + resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@2.1.6: + resolution: {integrity: sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + + pinyin-pro@3.28.0: + resolution: {integrity: sha512-mMRty6RisoyYNphJrTo3pnvp3w8OMZBrXm9YSWkxhAfxKj1KZk2y8T2PDIZlDDRsvZ0No+Hz6FI4sZpA6Ey25g==} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@3.0.2: + resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} + engines: {node: '>=14'} + hasBin: true + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + prosemirror-changeset@2.4.0: + resolution: {integrity: sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.1: + resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.4: + resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==} + + prosemirror-menu@1.3.0: + resolution: {integrity: sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.5: + resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.11.0: + resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} + + prosemirror-view@1.41.6: + resolution: {integrity: sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qified@0.6.0: + resolution: {integrity: sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==} + engines: {node: '>=20'} + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + querystring@0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-loader@13.3.2: + resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + + sass@1.66.1: + resolution: {integrity: sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==} + engines: {node: '>=14.0.0'} + hasBin: true + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + + stream-markdown-parser@0.0.59-beta.3: + resolution: {integrity: sha512-F++KEcHsXeWjKLKw8id6L1JVqQH22fslEZRNbt1NAMUwr8KTI/vOE3UuXYGnJDyXt0yv5JXbO4KdXrvMlWM0qQ==} + + stream-markdown@0.0.13: + resolution: {integrity: sha512-XYhBEtKA76L6q3Uegvu8QOiUDAV4bfF1TcP3rot8eK0AR1+WGHBB6IfT9GJeLFJ7+qZgrH+WxQp/8lZ6CXjeeg==} + peerDependencies: + shiki: '>=3.13.0' + + stream-monaco@0.0.17: + resolution: {integrity: sha512-xpMiFAQEDLxRjNOXobomP9vEJmv5tWU8oN54+SHqL+eeHMNugU7fpmUIqZRSh53p+a/ZYt+DE75jgHwlKOXEuQ==} + hasBin: true + peerDependencies: + monaco-editor: ^0.52.2 + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + subset-font@2.4.0: + resolution: {integrity: sha512-DA/45nIj4NiseVdfHxVdVGL7hvNo3Ol6HjEm3KSYtPyDcsr6jh8Q37vSgz+A722wMfUd6nL8kgsi7uGv9DExXQ==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg.draggable.js@2.2.2: + resolution: {integrity: sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==} + engines: {node: '>= 0.8.0'} + + svg.easing.js@2.0.0: + resolution: {integrity: sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==} + engines: {node: '>= 0.8.0'} + + svg.filter.js@2.0.2: + resolution: {integrity: sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==} + engines: {node: '>= 0.8.0'} + + svg.js@2.7.1: + resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==} + + svg.pathmorphing.js@0.1.3: + resolution: {integrity: sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==} + engines: {node: '>= 0.8.0'} + + svg.resize.js@1.4.3: + resolution: {integrity: sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==} + engines: {node: '>= 0.8.0'} + + svg.select.js@2.1.2: + resolution: {integrity: sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==} + engines: {node: '>= 0.8.0'} + + svg.select.js@3.0.1: + resolution: {integrity: sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==} + engines: {node: '>= 0.8.0'} + + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.4.0: + resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + vee-validate@4.11.3: + resolution: {integrity: sha512-YhWORdZRE1GL6vXKj3r9f+Y8fJH5JMwMUJ4DFS44+WcTtiNXggyE3pyJPlZBqS9AgYGZ47EOv4UczkLxHqufiw==} + peerDependencies: + vue: ^3.3.4 + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-plugin-vuetify@2.1.3: + resolution: {integrity: sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: '>=5' + vue: ^3.0.0 + vuetify: '>=3' + + vite-plugin-webfont-dl@3.12.0: + resolution: {integrity: sha512-0jxsr8ycuoK/uV5Y3ytttTRhgvfZo8v3O4JZBlVc4C7QWIws/vCLVR4B3ag+TGVkLNQya6hXfY3UnZge3M8vmA==} + peerDependencies: + vite: ^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + 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 + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-cli-plugin-vuetify@2.5.8: + resolution: {integrity: sha512-uqi0/URJETJBbWlQHD1l0pnY7JN8Ytu+AL1fw50HFlGByPa8/xx+mq19GkFXA9FcwFT01IqEc/TkxMPugchomg==} + peerDependencies: + sass-loader: '*' + vue: '*' + vuetify-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + sass-loader: + optional: true + vuetify-loader: + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-i18n@11.2.8: + resolution: {integrity: sha512-vJ123v/PXCZntd6Qj5Jumy7UBmIuE92VrtdX+AXr+1WzdBHojiBxnAxdfctUFL+/JIN+VQH4BhsfTtiGsvVObg==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.2.4: + resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} + peerDependencies: + vue: ^3.2.0 + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@1.8.8: + resolution: {integrity: sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==} + hasBin: true + peerDependencies: + typescript: '*' + + vue3-apexcharts@1.4.4: + resolution: {integrity: sha512-TH89uZrxGjaDvkaYAISvj8+k6Bf1rUKFillc8oJirs5XZEPiwM1ELKZQ786wz0rfPqkSHHny2lqqUCK7Rw+LcQ==} + peerDependencies: + apexcharts: '> 3.0.0' + vue: '> 3.0.0' + + vue3-print-nb@0.1.4: + resolution: {integrity: sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==} + + vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + + vuetify-loader@2.0.0-alpha.9: + resolution: {integrity: sha512-M4u2XX9coe1U51jLKek54eJTo7wnroNfglh6sQplRTslhQRKQM3k84oh87D0VHqTzoTzlKPHP0sIWdpklwaEEQ==} + engines: {node: '>=12'} + deprecated: vuetify-loader has been renamed to webpack-plugin-vuetify for Vuetify 3 + peerDependencies: + '@vue/compiler-sfc': ^3.2.6 + vuetify: ^3.0.0-alpha.11 + webpack: ^5.0.0 + + vuetify@3.7.11: + resolution: {integrity: sha512-50Z2SNwPXbkGmve4CwxOs4sySZGgLwQYIDsKx+coSrfIBqz8IyXgxRFQdrvgoehIwUjGTNqaPZymuK5rMFkfHA==} + engines: {node: ^12.20 || >=14.13} + peerDependencies: + typescript: '>=4.7' + vite-plugin-vuetify: '>=1.0.0' + vue: ^3.3.0 + webpack-plugin-vuetify: '>=2.0.0' + peerDependenciesMeta: + typescript: + optional: true + vite-plugin-vuetify: + optional: true + webpack-plugin-vuetify: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + engines: {node: '>=10.13.0'} + + wawoff2@2.0.1: + resolution: {integrity: sha512-r0CEmvpH63r4T15ebFqeOjGqU4+EgTx4I510NtK35EMciSdcTxCw3Byy3JnBonz7iyIFZ0AbVo0bbFpEVuhCYA==} + hasBin: true + + webpack-sources@3.3.4: + resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} + engines: {node: '>=10.13.0'} + + webpack@5.105.0: + resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + woff2sfnt-sfnt2woff@1.0.0: + resolution: {integrity: sha512-edK4COc1c1EpRfMqCZO1xJOvdUtM5dbVb9iz97rScvnTevqEB3GllnLWCmMVp1MfQBdF1DFg/11I0rSyAdS4qQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yup@1.2.0: + resolution: {integrity: sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.28.6': {} + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@braintree/sanitize-url@7.1.2': {} + + '@cacheable/memory@2.0.8': + dependencies: + '@cacheable/utils': 2.4.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.4.0': + dependencies: + hashery: 1.5.0 + keyv: 5.6.0 + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.23 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.23 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.48.0)': + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.48.0': {} + + '@floating-ui/core@1.7.4': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.5': + dependencies: + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@guolao/vue-monaco-editor@1.6.0(monaco-editor@0.52.2)(vue@3.3.4)': + dependencies: + '@monaco-editor/loader': 1.7.0 + monaco-editor: 0.52.2 + vue: 3.3.4 + vue-demi: 0.14.10(vue@3.3.4) + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + mlly: 1.8.0 + + '@intlify/core-base@11.2.8': + dependencies: + '@intlify/message-compiler': 11.2.8 + '@intlify/shared': 11.2.8 + + '@intlify/message-compiler@11.2.8': + dependencies: + '@intlify/shared': 11.2.8 + source-map-js: 1.2.1 + + '@intlify/shared@11.2.8': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + + '@mdi/font@7.2.96': {} + + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + + '@monaco-editor/loader@1.7.0': + dependencies: + state-local: 1.0.7 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pkgr/core@0.2.9': {} + + '@popperjs/core@2.11.8': {} + + '@remirror/core-constants@3.0.0': {} + + '@rollup/rollup-android-arm-eabi@4.59.0': + optional: true + + '@rollup/rollup-android-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-x64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.59.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.59.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.59.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.59.0': + optional: true + + '@rushstack/eslint-patch@1.3.3': {} + + '@shikijs/core@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/monaco@3.22.0': + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + optional: true + + '@shikijs/themes@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/types@3.22.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tiptap/core@2.27.2(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-blockquote@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bold@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bubble-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + tippy.js: 6.3.7 + + '@tiptap/extension-bullet-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-code@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-document@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-dropcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-floating-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + tippy.js: 6.3.7 + + '@tiptap/extension-gapcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-hard-break@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-heading@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-history@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-horizontal-rule@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-italic@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-list-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-ordered-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-paragraph@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-strike@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/pm@2.27.2': + dependencies: + prosemirror-changeset: 2.4.0 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.1 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.4 + prosemirror-menu: 1.3.0 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6) + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + '@tiptap/starter-kit@2.1.7(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-blockquote': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bold': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bullet-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-document': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-dropcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-gapcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-hard-break': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-heading': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-history': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-horizontal-rule': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-italic': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-list-item': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-ordered-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-paragraph': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-strike': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + transitivePeerDependencies: + - '@tiptap/pm' + + '@tiptap/vue-3@2.1.7(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(vue@3.3.4)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-bubble-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-floating-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + vue: 3.3.4 + + '@types/chance@1.1.3': {} + + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/dompurify@3.2.0': + dependencies: + dompurify: 3.3.2 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.8': {} + + '@types/geojson@7946.0.16': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/node@20.19.32': + dependencies: + undici-types: 6.21.0 + + '@types/node@20.19.37': + dependencies: + undici-types: 6.21.0 + + '@types/semver@7.7.1': {} + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.1.6))(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + debug: 4.4.3 + eslint: 8.48.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.4 + tsutils: 3.21.0(typescript@5.1.6) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + debug: 4.4.3 + eslint: 8.48.0 + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + debug: 4.4.3 + eslint: 8.48.0 + tsutils: 3.21.0(typescript@5.1.6) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.4 + tsutils: 3.21.0(typescript@5.1.6) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.48.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + eslint: 8.48.0 + eslint-scope: 5.1.1 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)': + dependencies: + vite: 6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0) + vue: 3.3.4 + + '@volar/language-core@1.10.10': + dependencies: + '@volar/source-map': 1.10.10 + + '@volar/source-map@1.10.10': + dependencies: + muggle-string: 0.3.1 + + '@volar/typescript@1.10.10': + dependencies: + '@volar/language-core': 1.10.10 + path-browserify: 1.0.1 + + '@vue/compiler-core@3.3.4': + dependencies: + '@babel/parser': 7.29.0 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-core@3.5.27': + dependencies: + '@babel/parser': 7.29.0 + '@vue/shared': 3.5.27 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.3.4': + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/compiler-dom@3.5.27': + dependencies: + '@vue/compiler-core': 3.5.27 + '@vue/shared': 3.5.27 + + '@vue/compiler-sfc@3.3.4': + dependencies: + '@babel/parser': 7.29.0 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.3.4': + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/devtools-api@6.6.4': {} + + '@vue/eslint-config-prettier@8.0.0(@types/eslint@9.6.1)(eslint@8.48.0)(prettier@3.0.2)': + dependencies: + eslint: 8.48.0 + eslint-config-prettier: 8.10.2(eslint@8.48.0) + eslint-plugin-prettier: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@8.48.0))(eslint@8.48.0)(prettier@3.0.2) + prettier: 3.0.2 + transitivePeerDependencies: + - '@types/eslint' + + '@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@9.17.0(eslint@8.48.0))(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.1.6))(eslint@8.48.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + eslint: 8.48.0 + eslint-plugin-vue: 9.17.0(eslint@8.48.0) + vue-eslint-parser: 9.4.3(eslint@8.48.0) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@vue/language-core@1.8.8(typescript@5.1.6)': + dependencies: + '@volar/language-core': 1.10.10 + '@volar/source-map': 1.10.10 + '@vue/compiler-dom': 3.5.27 + '@vue/reactivity': 3.5.27 + '@vue/shared': 3.5.27 + minimatch: 9.0.5 + muggle-string: 0.3.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.1.6 + + '@vue/reactivity-transform@3.3.4': + dependencies: + '@babel/parser': 7.29.0 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.21 + + '@vue/reactivity@3.3.4': + dependencies: + '@vue/shared': 3.3.4 + + '@vue/reactivity@3.5.27': + dependencies: + '@vue/shared': 3.5.27 + + '@vue/runtime-core@3.3.4': + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/runtime-dom@3.3.4': + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.2.3 + + '@vue/server-renderer@3.3.4(vue@3.3.4)': + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + + '@vue/shared@3.3.4': {} + + '@vue/shared@3.5.27': {} + + '@vue/tsconfig@0.4.0': {} + + '@vue/typescript@1.8.8(typescript@5.1.6)': + dependencies: + '@volar/typescript': 1.10.10 + '@vue/language-core': 1.8.8(typescript@5.1.6) + transitivePeerDependencies: + - typescript + + '@vuetify/loader-shared@1.7.1(vue@3.3.4)(vuetify@3.7.11)': + dependencies: + find-cache-dir: 3.3.2 + upath: 2.0.1 + vue: 3.3.4 + vuetify: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@2.1.3)(vue@3.3.4) + + '@vuetify/loader-shared@2.1.2(vue@3.3.4)(vuetify@3.7.11)': + dependencies: + upath: 2.0.1 + vue: 3.3.4 + vuetify: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@2.1.3)(vue@3.3.4) + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + + acorn-import-phases@1.0.4(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + acorn@8.16.0: {} + + ajv-formats@2.1.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.18.0): + dependencies: + ajv: 8.18.0 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@2.0.8: + optional: true + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + apexcharts@3.42.0: + dependencies: + '@yr/monotone-cubic-spline': 1.0.3 + svg.draggable.js: 2.2.2 + svg.easing.js: 2.0.0 + svg.filter.js: 2.0.2 + svg.pathmorphing.js: 0.1.3 + svg.resize.js: 1.4.3 + svg.select.js: 3.0.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asynckit@0.4.0: {} + + axios-mock-adapter@1.22.0(axios@1.13.5): + dependencies: + axios: 1.13.5 + fast-deep-equal: 3.1.3 + is-buffer: 2.0.5 + + axios@1.13.5: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.10.0: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001778 + electron-to-chromium: 1.5.307 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + buffer-from@1.1.2: {} + + cacheable@2.3.3: + dependencies: + '@cacheable/memory': 2.0.8 + '@cacheable/utils': 2.4.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.6.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsite@1.0.0: {} + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001778: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chance@1.1.11: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.23 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.23 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + crelt@1.0.6: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.13: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.23 + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.28.6 + + dayjs@1.11.19: {} + + de-indent@1.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decache@4.6.2: + dependencies: + callsite: 1.0.0 + + decamelize@1.2.0: {} + + deep-is@0.1.4: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dijkstrajs@1.0.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dompurify@3.3.2: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.307: {} + + emoji-regex@8.0.0: {} + + emojis-list@3.0.0: {} + + enhanced-resolve@5.20.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@4.5.0: {} + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.0.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@8.10.2(eslint@8.48.0): + dependencies: + eslint: 8.48.0 + + eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@8.48.0))(eslint@8.48.0)(prettier@3.0.2): + dependencies: + eslint: 8.48.0 + prettier: 3.0.2 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 8.10.2(eslint@8.48.0) + + eslint-plugin-vue@9.17.0(eslint@8.48.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.48.0) + eslint: 8.48.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.4 + vue-eslint-parser: 9.4.3(eslint@8.48.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.48.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.48.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + event-source-polyfill@1.0.31: {} + + events@3.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-loader@6.2.0(webpack@5.105.0): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.105.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat-cache@6.1.20: + dependencies: + cacheable: 2.3.3 + flatted: 3.3.3 + hookified: 1.15.1 + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} + + fontverter@2.0.0: + dependencies: + wawoff2: 2.0.1 + woff2sfnt-sfnt2woff: 1.0.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + hachure-fill@0.5.2: {} + + harfbuzzjs@0.4.15: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hashery@1.5.0: + dependencies: + hookified: 1.15.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + highlight.js@11.11.1: {} + + hookified@1.15.1: {} + + html-void-elements@3.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + immutable@4.3.8: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + interpret@1.4.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@2.0.5: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isexe@2.0.0: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.19.37 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-md5@0.8.3: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + katex@0.16.28: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + + khroma@2.1.0: {} + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + loader-runner@4.3.1: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.23: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.23: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + markdown-it-container@4.0.0: {} + + markdown-it-footnote@4.0.0: {} + + markdown-it-ins@4.0.0: {} + + markdown-it-mark@4.0.0: {} + + markdown-it-sub@2.0.0: {} + + markdown-it-sup@2.0.0: {} + + markdown-it-task-checkbox@1.0.6: {} + + markdown-it-ts@0.0.3: + dependencies: + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-it@14.1.1: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + marked@16.4.2: {} + + markstream-vue@0.0.6(katex@0.16.28)(mermaid@11.12.2)(shiki@3.22.0)(stream-markdown@0.0.13(shiki@3.22.0))(stream-monaco@0.0.17(monaco-editor@0.52.2))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4): + dependencies: + '@floating-ui/dom': 1.7.5 + stream-markdown-parser: 0.0.59-beta.3 + vue: 3.3.4 + optionalDependencies: + katex: 0.16.28 + mermaid: 11.12.2 + shiki: 3.22.0 + stream-markdown: 0.0.13(shiki@3.22.0) + stream-monaco: 0.0.17(monaco-editor@0.52.2) + vue-i18n: 11.2.8(vue@3.3.4) + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdurl@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid@11.12.2: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.0 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19 + dompurify: 3.3.2 + katex: 0.16.28 + khroma: 2.1.0 + lodash-es: 4.17.23 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + monaco-editor@0.52.2: {} + + ms@2.1.3: {} + + muggle-string@0.3.1: {} + + nanoid@3.3.11: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-releases@2.0.36: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + null-loader@4.0.1(webpack@5.105.0): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.105.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + orderedmap@2.1.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-manager-detector@1.6.0: {} + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-data-parser@0.1.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pinia@2.1.6(typescript@5.1.6)(vue@3.3.4): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.3.4 + vue-demi: 0.14.10(vue@3.3.4) + optionalDependencies: + typescript: 5.1.6 + + pinyin-pro@3.28.0: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pngjs@5.0.0: {} + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@3.0.2: {} + + property-expr@2.0.6: {} + + property-information@7.1.0: {} + + prosemirror-changeset@2.4.0: + dependencies: + prosemirror-transform: 1.11.0 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-gapcursor@1.4.1: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.6 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.4: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.1 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.3.0: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-tables@1.8.5: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.6 + + prosemirror-transform@1.11.0: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.6: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + qified@0.6.0: + dependencies: + hookified: 1.15.1 + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + querystring@0.2.1: {} + + queue-microtask@1.2.3: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.6.2: + dependencies: + resolve: 1.22.11 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@2.0.0: {} + + resolve-from@4.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + robust-predicates@3.0.2: {} + + rollup@4.59.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 + fsevents: 2.3.3 + + rope-sequence@1.3.4: {} + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + safer-buffer@2.1.2: {} + + sass-loader@13.3.2(sass@1.66.1)(webpack@5.105.0): + dependencies: + neo-async: 2.6.2 + webpack: 5.105.0 + optionalDependencies: + sass: 1.66.1 + + sass@1.66.1: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.8 + source-map-js: 1.2.1 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.18.0 + ajv-formats: 2.1.1(ajv@8.18.0) + ajv-keywords: 5.1.0(ajv@8.18.0) + + semver@6.3.1: {} + + semver@7.7.4: {} + + set-blocking@2.0.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shiki@3.22.0: + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + state-local@1.0.7: {} + + stream-markdown-parser@0.0.59-beta.3: + dependencies: + markdown-it-container: 4.0.0 + markdown-it-footnote: 4.0.0 + markdown-it-ins: 4.0.0 + markdown-it-mark: 4.0.0 + markdown-it-sub: 2.0.0 + markdown-it-sup: 2.0.0 + markdown-it-task-checkbox: 1.0.6 + markdown-it-ts: 0.0.3 + + stream-markdown@0.0.13(shiki@3.22.0): + dependencies: + shiki: 3.22.0 + + stream-monaco@0.0.17(monaco-editor@0.52.2): + dependencies: + '@shikijs/monaco': 3.22.0 + alien-signals: 2.0.8 + monaco-editor: 0.52.2 + shiki: 3.22.0 + optional: true + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + stylis@4.3.6: {} + + subset-font@2.4.0: + dependencies: + fontverter: 2.0.0 + harfbuzzjs: 0.4.15 + lodash: 4.17.23 + p-limit: 3.1.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg.draggable.js@2.2.2: + dependencies: + svg.js: 2.7.1 + + svg.easing.js@2.0.0: + dependencies: + svg.js: 2.7.1 + + svg.filter.js@2.0.2: + dependencies: + svg.js: 2.7.1 + + svg.js@2.7.1: {} + + svg.pathmorphing.js@0.1.3: + dependencies: + svg.js: 2.7.1 + + svg.resize.js@1.4.3: + dependencies: + svg.js: 2.7.1 + svg.select.js: 2.1.2 + + svg.select.js@2.1.2: + dependencies: + svg.js: 2.7.1 + + svg.select.js@3.0.1: + dependencies: + svg.js: 2.7.1 + + synckit@0.11.12: + dependencies: + '@pkgr/core': 0.2.9 + + tapable@2.3.0: {} + + terser-webpack-plugin@5.4.0(webpack@5.105.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.46.0 + webpack: 5.105.0 + + terser@5.46.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + tiny-case@1.0.3: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toposort@2.0.2: {} + + trim-lines@3.0.1: {} + + ts-dedent@2.2.0: {} + + tslib@1.14.1: {} + + tsutils@3.21.0(typescript@5.1.6): + dependencies: + tslib: 1.14.1 + typescript: 5.1.6 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@2.19.0: {} + + type-fest@4.41.0: {} + + typescript@5.1.6: {} + + uc.micro@2.1.0: {} + + ufo@1.6.3: {} + + undici-types@6.21.0: {} + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + upath@2.0.1: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + + vee-validate@4.11.3(vue@3.3.4): + dependencies: + '@vue/devtools-api': 6.6.4 + type-fest: 4.41.0 + vue: 3.3.4 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-plugin-vuetify@2.1.3(vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)(vuetify@3.7.11): + dependencies: + '@vuetify/loader-shared': 2.1.2(vue@3.3.4)(vuetify@3.7.11) + debug: 4.4.3 + upath: 2.0.1 + vite: 6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0) + vue: 3.3.4 + vuetify: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@2.1.3)(vue@3.3.4) + transitivePeerDependencies: + - supports-color + + vite-plugin-webfont-dl@3.12.0(vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0)): + dependencies: + axios: 1.13.5 + clean-css: 5.3.3 + flat-cache: 6.1.20 + picocolors: 1.1.1 + vite: 6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0) + transitivePeerDependencies: + - debug + + vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.59.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.32 + fsevents: 2.3.3 + sass: 1.66.1 + terser: 5.46.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + vue-cli-plugin-vuetify@2.5.8(sass-loader@13.3.2(sass@1.66.1)(webpack@5.105.0))(vue@3.3.4)(vuetify-loader@2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0))(webpack@5.105.0): + dependencies: + null-loader: 4.0.1(webpack@5.105.0) + semver: 7.7.4 + shelljs: 0.8.5 + vue: 3.3.4 + webpack: 5.105.0 + optionalDependencies: + sass-loader: 13.3.2(sass@1.66.1)(webpack@5.105.0) + vuetify-loader: 2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0) + + vue-demi@0.14.10(vue@3.3.4): + dependencies: + vue: 3.3.4 + + vue-eslint-parser@9.4.3(eslint@8.48.0): + dependencies: + debug: 4.4.3 + eslint: 8.48.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + lodash: 4.17.23 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + + vue-i18n@11.2.8(vue@3.3.4): + dependencies: + '@intlify/core-base': 11.2.8 + '@intlify/shared': 11.2.8 + '@vue/devtools-api': 6.6.4 + vue: 3.3.4 + + vue-router@4.2.4(vue@3.3.4): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.3.4 + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-tsc@1.8.8(typescript@5.1.6): + dependencies: + '@vue/language-core': 1.8.8(typescript@5.1.6) + '@vue/typescript': 1.8.8(typescript@5.1.6) + semver: 7.7.4 + typescript: 5.1.6 + + vue3-apexcharts@1.4.4(apexcharts@3.42.0)(vue@3.3.4): + dependencies: + apexcharts: 3.42.0 + vue: 3.3.4 + + vue3-print-nb@0.1.4: + dependencies: + vue: 3.3.4 + + vue@3.3.4: + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + + vuetify-loader@2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0): + dependencies: + '@vue/compiler-sfc': 3.3.4 + '@vuetify/loader-shared': 1.7.1(vue@3.3.4)(vuetify@3.7.11) + decache: 4.6.2 + file-loader: 6.2.0(webpack@5.105.0) + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + null-loader: 4.0.1(webpack@5.105.0) + querystring: 0.2.1 + upath: 2.0.1 + vuetify: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@2.1.3)(vue@3.3.4) + webpack: 5.105.0 + transitivePeerDependencies: + - vue + + vuetify@3.7.11(typescript@5.1.6)(vite-plugin-vuetify@2.1.3)(vue@3.3.4): + dependencies: + vue: 3.3.4 + optionalDependencies: + typescript: 5.1.6 + vite-plugin-vuetify: 2.1.3(vite@6.4.1(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)(vuetify@3.7.11) + + w3c-keyname@2.2.8: {} + + watchpack@2.5.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wawoff2@2.0.1: + dependencies: + argparse: 2.0.1 + + webpack-sources@3.3.4: {} + + webpack@5.105.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.20.0 + es-module-lexer: 2.0.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.4.0(webpack@5.105.0) + watchpack: 2.5.1 + webpack-sources: 3.3.4 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + which-module@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + woff2sfnt-sfnt2woff@1.0.0: + dependencies: + pako: 1.0.11 + + word-wrap@1.2.5: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + xml-name-validator@4.0.0: {} + + y18n@4.0.3: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yocto-queue@0.1.0: {} + + yup@1.2.0: + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 + + zwitch@2.0.4: {} diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css index 7f734b049..52a052cfa 100644 --- a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css +++ b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css @@ -1,4 +1,4 @@ -/* Auto-generated MDI subset – 229 icons */ +/* Auto-generated MDI subset – 231 icons */ /* Do not edit manually. Run: pnpm run subset-icons */ @font-face { @@ -692,6 +692,14 @@ content: "\F03F6"; } +.mdi-pin::before { + content: "\F0403"; +} + +.mdi-pin-outline::before { + content: "\F0931"; +} + .mdi-play::before { content: "\F040A"; } diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff index 20cd8f5c89e20145b7b71d6d4945f994e33da535..85c2ed9fdfa09200ceb1892ce611e8570eb76b5e 100644 GIT binary patch delta 15739 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 delta 15629 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

H~bspLd2A_P`v~9=P4(5YT4%esa9XLz9 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 diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 index 5ddf299e2e5732a119e94a28a6e69731fe6de79c..376e47ce72445b88b80adb0605c7e6319dcebd22 100644 GIT binary patch literal 13068 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

e}-wIw&OMNDf;Y`8XQ&b$2Ir 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 literal 12996 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 G00022_Fpgn diff --git a/dashboard/src/components/extension/MarketPluginCard.vue b/dashboard/src/components/extension/MarketPluginCard.vue index 3f03fe3f9..949f5c7e8 100644 --- a/dashboard/src/components/extension/MarketPluginCard.vue +++ b/dashboard/src/components/extension/MarketPluginCard.vue @@ -41,37 +41,12 @@ const handleInstall = (plugin) => { - - {{ tm("market.recommended") }} - -

+
{ >
-
-
- +
+
+
{{ plugin.display_name?.length ? plugin.display_name @@ -111,7 +69,16 @@ const handleInstall = (plugin) => { ? plugin.name : plugin.trimmedName }} - +
+ + {{ tm("market.recommended") }} +
{ /> {{ plugin.version }}
+
+ + {{ plugin.stars }} +
@@ -170,8 +149,7 @@ const handleInstall = (plugin) => {
{ style="height: 20px" > ✓ {{ tm("status.installed") }} - + diff --git a/dashboard/src/components/extension/PluginSortControl.vue b/dashboard/src/components/extension/PluginSortControl.vue index 87410066d..2d4d78dd3 100644 --- a/dashboard/src/components/extension/PluginSortControl.vue +++ b/dashboard/src/components/extension/PluginSortControl.vue @@ -92,6 +92,7 @@ const toggleOrder = () => { .plugin-sort-control__select { min-width: 180px; + width: 190px; max-width: 220px; } diff --git a/dashboard/src/components/shared/ExtensionCard.vue b/dashboard/src/components/shared/ExtensionCard.vue index 49f330a09..3de3d913d 100644 --- a/dashboard/src/components/shared/ExtensionCard.vue +++ b/dashboard/src/components/shared/ExtensionCard.vue @@ -1,5 +1,5 @@ + + diff --git a/dashboard/src/i18n/locales/en-US/features/config-metadata.json b/dashboard/src/i18n/locales/en-US/features/config-metadata.json index 8d47eeaaa..7332d33b1 100644 --- a/dashboard/src/i18n/locales/en-US/features/config-metadata.json +++ b/dashboard/src/i18n/locales/en-US/features/config-metadata.json @@ -634,6 +634,30 @@ "description": "Send Replies via Webhook Only", "hint": "When enabled, all WeCom AI Bot replies are sent through msg_push_webhook_url. The message push webhook supports more message types (such as images, files, etc.). If you do not need the typing effect, it is strongly recommended to use this option. " }, + "weixin_oc_base_url": { + "description": "API Base URL", + "hint": "Default: https://ilinkai.weixin.qq.com" + }, + "weixin_oc_bot_type": { + "description": "bot_type (QR login parameter)", + "hint": "Default: 3" + }, + "weixin_oc_qr_poll_interval": { + "description": "QR status poll interval (seconds)", + "hint": "Polling interval in seconds for QR code status." + }, + "weixin_oc_long_poll_timeout_ms": { + "description": "getUpdates long-poll timeout (ms)", + "hint": "Timeout parameter for polling messages." + }, + "weixin_oc_api_timeout_ms": { + "description": "HTTP timeout (ms)", + "hint": "Generic API request timeout." + }, + "weixin_oc_token": { + "description": "Token after login (optional)", + "hint": "Automatically written after QR login; can be filled manually for advanced scenarios." + }, "kook_bot_token": { "description": "Bot Token", "type": "string", diff --git a/dashboard/src/i18n/locales/en-US/features/extension.json b/dashboard/src/i18n/locales/en-US/features/extension.json index 07affcd62..9ad049db5 100644 --- a/dashboard/src/i18n/locales/en-US/features/extension.json +++ b/dashboard/src/i18n/locales/en-US/features/extension.json @@ -96,6 +96,16 @@ "market": { "recommended": "🥳 Recommended", "allPlugins": "📦 All Extensions", + "category": "Category", + "categories": { + "all": "All", + "ai_tools": "AI Tools", + "entertainment": "Entertainment", + "productivity": "Productivity", + "integrations": "Integrations", + "utilities": "Utilities", + "other": "Other" + }, "showFullName": "Full Name", "devDocs": "Extension Development Docs", "submitRepo": "Submit Extension Repository", diff --git a/dashboard/src/i18n/locales/en-US/features/platform.json b/dashboard/src/i18n/locales/en-US/features/platform.json index 64448ca1e..a62b2f680 100644 --- a/dashboard/src/i18n/locales/en-US/features/platform.json +++ b/dashboard/src/i18n/locales/en-US/features/platform.json @@ -123,6 +123,13 @@ "unknown": "Unknown", "errors": "error(s)" }, + "platformQr": { + "title": "QR Login", + "show": "Show QR", + "status": "QR Status", + "waiting": "Waiting for QR", + "close": "Close" + }, "errorDialog": { "title": "Error Details", "platformId": "Platform ID", diff --git a/dashboard/src/i18n/locales/ru-RU/features/config-metadata.json b/dashboard/src/i18n/locales/ru-RU/features/config-metadata.json index afffef80c..a204118db 100644 --- a/dashboard/src/i18n/locales/ru-RU/features/config-metadata.json +++ b/dashboard/src/i18n/locales/ru-RU/features/config-metadata.json @@ -630,6 +630,30 @@ "description": "Отправлять ответы только через Webhook", "hint": "Все ответы WeCom AI Bot будут идти через вебхук пуш-сообщений. Поддерживает больше типов контента." }, + "weixin_oc_base_url": { + "description": "URL API iLink", + "hint": "Значение по умолчанию: https://ilinkai.weixin.qq.com" + }, + "weixin_oc_bot_type": { + "description": "bot_type (параметр входа по QR)", + "hint": "Значение по умолчанию: 3" + }, + "weixin_oc_qr_poll_interval": { + "description": "Интервал опроса статуса QR (сек)", + "hint": "Пауза между запросами статуса QR-кода." + }, + "weixin_oc_long_poll_timeout_ms": { + "description": "Таймаут long-poll getUpdates (мс)", + "hint": "Параметр таймаута запроса получения сообщений." + }, + "weixin_oc_api_timeout_ms": { + "description": "Таймаут HTTP запроса (мс)", + "hint": "Общий таймаут для HTTP запросов." + }, + "weixin_oc_token": { + "description": "Token после входа (опционально)", + "hint": "Автоматически сохраняется после QR логина; для сложных сценариев можно ввести вручную." + }, "kook_bot_token": { "description": "Токен бота", "type": "string", diff --git a/dashboard/src/i18n/locales/ru-RU/features/extension.json b/dashboard/src/i18n/locales/ru-RU/features/extension.json index 2ff06f573..7d3e0602f 100644 --- a/dashboard/src/i18n/locales/ru-RU/features/extension.json +++ b/dashboard/src/i18n/locales/ru-RU/features/extension.json @@ -96,6 +96,15 @@ "market": { "recommended": "🥳 Рекомендуем", "allPlugins": "📦 Все плагины", + "categories": { + "all": "Все", + "ai_tools": "AI Tools", + "entertainment": "Развлечения", + "productivity": "Продуктивность", + "integrations": "Интеграции", + "utilities": "Утилиты", + "other": "Другое" + }, "showFullName": "Полное имя", "devDocs": "Документация для разработчиков", "submitRepo": "Добавить репозиторий", @@ -355,4 +364,4 @@ "pluginChangelog": { "menuTitle": "Журнал изменений" } -} \ No newline at end of file +} diff --git a/dashboard/src/i18n/locales/ru-RU/features/platform.json b/dashboard/src/i18n/locales/ru-RU/features/platform.json index 04c7613a9..42bcae42e 100644 --- a/dashboard/src/i18n/locales/ru-RU/features/platform.json +++ b/dashboard/src/i18n/locales/ru-RU/features/platform.json @@ -116,14 +116,21 @@ "error": "Ошибка" }, "runtimeStatus": { - "running": "Работает", - "error": "Ошибка", - "pending": "Ожидание", - "stopped": "Остановлен", - "unknown": "Неизвестно", - "errors": "ошибок" - }, - "errorDialog": { + "running": "Работает", + "error": "Ошибка", + "pending": "Ожидание", + "stopped": "Остановлен", + "unknown": "Неизвестно", + "errors": "ошибок" + }, + "platformQr": { + "title": "QR вход", + "show": "Показать QR", + "status": "Статус QR", + "waiting": "Ожидание QR", + "close": "Закрыть" + }, + "errorDialog": { "title": "Детали ошибки", "platformId": "ID платформы", "errorCount": "Кол-во ошибок", @@ -132,4 +139,4 @@ "traceback": "Стек вызовов", "close": "Закрыть" } -} \ No newline at end of file +} diff --git a/dashboard/src/i18n/locales/zh-CN/features/config-metadata.json b/dashboard/src/i18n/locales/zh-CN/features/config-metadata.json index 27bafd0dc..de22ecffb 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/config-metadata.json +++ b/dashboard/src/i18n/locales/zh-CN/features/config-metadata.json @@ -636,6 +636,30 @@ "description": "仅使用 Webhook 发送消息", "hint": "可选。启用后,企业微信智能机器人的所有回复都改为通过消息推送 Webhook 发送。消息推送 Webhook 支持更多的消息类型(如图片、文件等)。如果不需要打字机效果,强烈建议使用此选项。" }, + "weixin_oc_base_url": { + "description": "Base URL 地址", + "hint": "默认值: https://ilinkai.weixin.qq.com" + }, + "weixin_oc_bot_type": { + "description": "扫码参数 bot_type", + "hint": "默认值: 3" + }, + "weixin_oc_qr_poll_interval": { + "description": "二维码状态轮询间隔(秒)", + "hint": "每隔多少秒轮询一次二维码状态。" + }, + "weixin_oc_long_poll_timeout_ms": { + "description": "getUpdates 长轮询超时时间(毫秒)", + "hint": "会话消息拉取接口超时参数。" + }, + "weixin_oc_api_timeout_ms": { + "description": "HTTP 请求超时(毫秒)", + "hint": "通用 API 请求超时参数。" + }, + "weixin_oc_token": { + "description": "登录后 token(可留空)", + "hint": "扫码登录成功后会自动写入;高级场景可手动填写。" + }, "kook_bot_token": { "description": "机器人 Token", "type": "string", diff --git a/dashboard/src/i18n/locales/zh-CN/features/extension.json b/dashboard/src/i18n/locales/zh-CN/features/extension.json index f42173ffa..6f38591f4 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/extension.json +++ b/dashboard/src/i18n/locales/zh-CN/features/extension.json @@ -9,7 +9,8 @@ "handlersOperation": "管理行为" }, "titles": { - "installedAstrBotPlugins": "已安装的 AstrBot 插件" + "installedAstrBotPlugins": "已安装的 AstrBot 插件", + "pinnedPlugins": "置顶插件" }, "failedPlugins": { "title": "加载失败插件({count})", @@ -53,6 +54,8 @@ "refresh": "刷新", "updateAll": "更新全部插件", "deleteSource": "删除源", + "pin": "置顶", + "unpin": "取消置顶", "reshuffle": "随机一发" }, "status": { @@ -96,6 +99,16 @@ "market": { "recommended": "🥳 推荐", "allPlugins": "📦 全部插件", + "category": "分类", + "categories": { + "all": "全部", + "ai_tools": "AI 增强", + "entertainment": "娱乐", + "productivity": "效率", + "integrations": "外部集成", + "utilities": "生活实用", + "other": "其他" + }, "showFullName": "完整名称", "devDocs": "插件开发文档", "submitRepo": "提交插件仓库", diff --git a/dashboard/src/i18n/locales/zh-CN/features/platform.json b/dashboard/src/i18n/locales/zh-CN/features/platform.json index f26d9507d..75dc5a2a6 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/platform.json +++ b/dashboard/src/i18n/locales/zh-CN/features/platform.json @@ -123,6 +123,13 @@ "unknown": "未知", "errors": "个错误" }, + "platformQr": { + "title": "二维码登录", + "show": "查看二维码", + "status": "二维码状态", + "waiting": "等待二维码", + "close": "关闭" + }, "errorDialog": { "title": "错误详情", "platformId": "平台 ID", diff --git a/dashboard/src/stores/common.js b/dashboard/src/stores/common.js index f75790e0a..9d1322533 100644 --- a/dashboard/src/stores/common.js +++ b/dashboard/src/stores/common.js @@ -177,6 +177,7 @@ export const useCommonStore = defineStore({ "updated_at": pluginData?.updated_at ? pluginData.updated_at : "", "display_name": pluginData?.display_name ? pluginData.display_name : "", "astrbot_version": pluginData?.astrbot_version ? pluginData.astrbot_version : "", + "category": pluginData?.category ? pluginData.category : "", "support_platforms": Array.isArray(pluginData?.support_platforms) ? pluginData.support_platforms : Array.isArray(pluginData?.support_platform) diff --git a/dashboard/src/utils/platformUtils.js b/dashboard/src/utils/platformUtils.js index 87523f3ad..04cb226fa 100644 --- a/dashboard/src/utils/platformUtils.js +++ b/dashboard/src/utils/platformUtils.js @@ -12,6 +12,8 @@ export function getPlatformIcon(name) { return new URL('@/assets/images/platform_logos/onebot.png', import.meta.url).href } else if (name === 'qq_official' || name === 'qq_official_webhook') { return new URL('@/assets/images/platform_logos/qq.png', import.meta.url).href + } else if (name === 'weixin_oc' || name === 'weixin_oc') { + return new URL('@/assets/images/platform_logos/wechat.png', import.meta.url).href } else if (name === 'wecom' || name === 'wecom_ai_bot') { return new URL('@/assets/images/platform_logos/wecom.png', import.meta.url).href } else if (name === 'weixin_official_account') { @@ -50,6 +52,7 @@ export function getTutorialLink(platformType) { "qq_official": "https://docs.astrbot.app/platform/qqofficial/websockets.html", "aiocqhttp": "https://docs.astrbot.app/platform/aiocqhttp/napcat.html", "wecom": "https://docs.astrbot.app/platform/wecom.html", + "weixin_oc": "https://docs.astrbot.app/platform/weixin_oc.html", "wecom_ai_bot": "https://docs.astrbot.app/platform/wecom_ai_bot.html", "lark": "https://docs.astrbot.app/platform/lark.html", "telegram": "https://docs.astrbot.app/platform/telegram.html", diff --git a/dashboard/src/views/PlatformPage.vue b/dashboard/src/views/PlatformPage.vue index 59b9d6be0..be173ab30 100644 --- a/dashboard/src/views/PlatformPage.vue +++ b/dashboard/src/views/PlatformPage.vue @@ -230,6 +230,30 @@ + + + + mdi-qrcode + {{ tm('platformQr.title') }} + + +
+ {{ tm('platformQr.status') }}: {{ getPlatformQrLoginStat(currentQrPlatformId)?.qr_status || tm('platformQr.waiting') }} +
+ +
+ + + + {{ tm('platformQr.close') }} + + +
+
+ { this.getPlatformStats(); - }, 10000); + }, 5000); // 监听语言切换事件,重新加载配置以获取插件的 i18n 数据 window.addEventListener('astrbot-locale-changed', this.handleLocaleChange); @@ -463,8 +491,8 @@ export default { }); }, - getPlatformStats() { - axios.get('/api/platform/stats').then((res) => { + async getPlatformStats() { + await axios.get('/api/platform/stats').then((res) => { if (res.data.status === 'ok') { // 将数组转换为以 id 为 key 的对象,方便查找 const stats = {}; @@ -482,6 +510,31 @@ export default { return this.platformStats[platformId] || null; }, + hasQrPayload(platformId) { + const stat = this.getPlatformQrLoginStat(platformId); + return Boolean(stat?.qrcode_img_content || stat?.qrcode); + }, + + getPlatformQrLoginStat(platformId) { + const stat = this.getPlatformStat(platformId); + if (stat?.weixin_oc) { + return stat.weixin_oc; + } + if (stat && typeof stat === "object") { + for (const value of Object.values(stat)) { + if (value && typeof value === "object" && ("qrcode_img_content" in value || "qrcode" in value)) { + return value; + } + } + } + return null; + }, + + openPlatformQrDialog(platformId) { + this.currentQrPlatformId = platformId; + this.showQrDialog = true; + }, + getStatusColor(status) { switch (status) { case 'running': return 'success'; @@ -740,4 +793,14 @@ export default { max-height: 300px; overflow-y: auto; } + +.platform-qr-chip { + margin-top: 4px; +} + +.platform-qr-status { + font-size: 13px; + margin-bottom: 10px; + color: rgba(0, 0, 0, 0.7); +} diff --git a/dashboard/src/views/extension/InstalledPluginsTab.vue b/dashboard/src/views/extension/InstalledPluginsTab.vue index 2d36ea69d..804767a8a 100644 --- a/dashboard/src/views/extension/InstalledPluginsTab.vue +++ b/dashboard/src/views/extension/InstalledPluginsTab.vue @@ -1,9 +1,11 @@