commit 92f239fcc4ef6b459f3dd96d9789ed276ec30c6b Author: MiFaZhan Date: Thu Oct 22 15:16:43 2026 +0800 chore: 初始开源发布 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1a3c575 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +node_modules +.vitepress/cache +.vitepress/dist +.vitepress/.temp +dist +*.zip +*.tar +*.war +*.log +.DS_Store +.playwright-mcp/ +.kilo/ +.git/ +.gitignore +Dockerfile +README.md +npm-debug.log* diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..692dbb1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +node_modules +.vitepress/cache +.vitepress/dist +.vitepress/.temp +dist +*.zip +*.tar +*.war +*.log +.DS_Store + +.playwright-mcp/ +.kilo/ +.playwright-cli/ +# 开源版附加排除 +.apitest-output/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..5e4086a --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmmirror.com/ diff --git a/.vitepress/config.mts b/.vitepress/config.mts new file mode 100644 index 0000000..12ae586 --- /dev/null +++ b/.vitepress/config.mts @@ -0,0 +1,122 @@ +import { defineConfig } from 'vitepress' + +const webManualItems = [ + { text: '快速开始', link: '/manual/web/' }, + { text: '首页与通用操作', link: '/manual/web/home' }, + { text: '卡信息', link: '/manual/web/card-info' }, + { text: '智能诊断', link: '/manual/web/intelligent-diagnosis' }, + { text: '业务受理与达量断网', link: '/manual/web/business-operations' }, + { text: '企业、用户与角色', link: '/manual/web/enterprise-management' }, + { text: '工单管理', link: '/manual/web/work-orders' }, + { text: 'API 凭证与执行日志', link: '/manual/web/api-and-logs' }, + { text: '常见问题', link: '/manual/web/faq' }, +] + +const miniProgramManualItems = [ + { text: '快速开始', link: '/manual/mini-program/' }, + { text: '首页公开查卡', link: '/manual/mini-program/home' }, + { text: '公开卡片详情', link: '/manual/mini-program/devices' }, + { text: '卡片排查', link: '/manual/mini-program/diagnosis' }, + { text: '常见问题', link: '/manual/mini-program/faq' }, +] + +function manualSidebar(_active: 'web' | 'mini' | 'both' = 'both') { + return [ + { + text: 'Web端', + collapsed: false, + items: webManualItems, + }, + { + text: '小程序端', + collapsed: false, + items: miniProgramManualItems, + }, + ] +} + +export default defineConfig({ + srcDir: './docs', + base: '/docs/', + title: 'iotLCM', + description: 'iotLCM documentation center', + lang: 'zh-CN', + cleanUrls: true, + lastUpdated: false, + head: [ + ['link', { rel: 'icon', type: 'image/png', href: '/docs/favicon.png' }] + ], + vite: { + plugins: [ + { + name: 'serve-root-favicon-in-dev', + configureServer(server) { + server.middlewares.use('/favicon.ico', (_request, response) => { + response.writeHead(302, { Location: '/docs/favicon.png' }) + response.end() + }) + } + } + ] + }, + themeConfig: { + logo: undefined, + nav: [ + { text: '文档首页', link: '/' }, + { text: '使用手册', link: '/manual/' }, + { text: 'OpenAPI', link: '/openapi/' }, + { text: '共享 Token 接口', link: '/openapi/operator/shared-token/' } + ], + sidebar: { + '/manual/': manualSidebar(), + '/manual/web/': manualSidebar('web'), + '/manual/mini-program/': manualSidebar('mini'), + '/openapi/operator/': [ + { + text: '共享 Token 接口', + collapsed: false, + items: [ + { text: '概览', link: '/openapi/operator/' }, + { text: '共享 Token 接口', link: '/openapi/operator/shared-token/' }, + { text: '白名单转发', link: '/openapi/operator/mobile-v5/' }, + ] + }, + ], + '/openapi/': [ + { + text: 'V3 接口', + collapsed: false, + items: [ + { text: '概览与鉴权', link: '/openapi/v3/' }, + { text: '获取调用凭证', link: '/openapi/v3/token' }, + { text: '查询类', link: '/openapi/v3/query' }, + { text: '业务类', link: '/openapi/v3/common' }, + ] + }, + { + text: '旧版兼容接口', + collapsed: false, + items: [ + { text: '概览与鉴权', link: '/openapi/legacy/' }, + { text: '查询类', link: '/openapi/legacy/query' }, + ] + }, + ] + }, + outline: { + level: [2, 3], + label: '本页目录' + }, + docFooter: { + prev: '上一页', + next: '下一页' + }, + search: { + provider: 'local' + }, + footer: { + message: 'iotLCM 文档中心', + copyright: '' + } + } +}) diff --git a/.vitepress/theme/custom.css b/.vitepress/theme/custom.css new file mode 100644 index 0000000..7c81db9 --- /dev/null +++ b/.vitepress/theme/custom.css @@ -0,0 +1,198 @@ +/* 截图点击放大(medium-zoom)—— 全站生效,范围由 .vitepress/theme/index.ts 的 ZOOM_SELECTOR 定义 */ + +/* 叠加层必须盖住导航和侧边栏:默认主题 --vp-z-index-nav 为 30、 + --vp-z-index-sidebar 为 60,所以取 100。 */ +.medium-zoom-overlay { + z-index: 100; +} + +.medium-zoom-image--opened { + z-index: 101; +} + +/* JS 尚未挂载 medium-zoom 时也提前给出「可点击」的鼠标提示 */ +.vp-doc img:not(a img):not(.no-zoom) { + cursor: zoom-in; +} + +/* 单张图片保持原始尺寸,并在正文区域水平居中。 */ +.vp-doc img { + display: block; + margin: 24px auto; +} + +/* 单行只有一张图片时缩放到内容区域的 40%。 */ +.vp-doc p > img:only-child, +.vp-doc li > img:only-child { + width: 40%; + max-width: 40%; + height: auto; +} + +/* Web 端手册截图恢复为内容区域全宽展示。 */ +.vp-doc img[src*="/images/manual/"]:not([src*="mini-program"]) { + width: 100%; + max-width: 100%; + height: auto; +} + +/* 同一行包含两张图片时,整行缩放到内容区域的 40%。 */ +.vp-doc p:has(> img:nth-child(2):last-child) { + display: flex; + width: 80%; + max-width: 80%; + height: auto; + line-height: 0; + margin: 32px auto; + align-items: center; + justify-content: center; + gap: 8px; +} + +.vp-doc p:has(> img:nth-child(2):last-child) > img { + width: calc(50% - 4px); + max-width: calc(50% - 4px); + height: auto; + margin: 0; +} + +/* Markdown 内嵌的双图网格统一缩放到内容区域的 80%。 */ +.vp-doc div[style*="repeat(2"] { + width: 80% !important; + max-width: 80% !important; + margin: 32px auto !important; +} + +.vp-doc div[style*="repeat(2"] img { + width: 100% !important; + max-width: 100% !important; + height: auto; + margin: 0 !important; +} + +.vp-doc div[style*="repeat(3"] img { + margin: 0 !important; +} + +.vp-doc div[style*="repeat(2"] figcaption, +.vp-doc div[style*="repeat(3"] figcaption { + margin-top: 6px; + color: var(--vp-c-brand-1); + font-size: 16px; + font-weight: 600; + line-height: 1.4; +} + +.vp-doc[class*="_docs_openapi_"] table { + display: table; + width: 100%; + max-width: 100%; + table-layout: auto; +} + +.openapi-page .custom-block.warning, +.openapi-page .custom-block.danger { + background-color: var(--vp-code-block-bg); +} + +.openapi-page .custom-block.warning code, +.openapi-page .custom-block.danger code { + background-color: var(--vp-code-bg); +} + +@media (max-width: 767px) { + .vp-doc[class*="_docs_openapi_"] table { + display: block; + overflow-x: auto; + } +} + +.manual-entry-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 20px; + margin: 28px 0 36px; +} + +.manual-entry-card { + display: flex; + min-height: 190px; + padding: 24px; + flex-direction: column; + border: 1px solid var(--vp-c-divider); + border-radius: 10px; + background: var(--vp-c-bg-soft); + color: inherit; + text-decoration: none; + transition: border-color 0.2s, box-shadow 0.2s, transform 0.2s; +} + +.manual-entry-card:hover { + border-color: var(--vp-c-brand-1); + box-shadow: 0 8px 24px rgb(60 90 180 / 12%); + transform: translateY(-2px); +} + +.manual-entry-title { + color: var(--vp-c-brand-1); + font-size: 22px; + font-weight: 700; +} + +.manual-entry-desc { + margin-top: 12px; + color: var(--vp-c-text-2); + font-size: 14px; + line-height: 1.7; +} + +.manual-entry-link { + margin-top: auto; + padding-top: 18px; + color: var(--vp-c-brand-1); + font-size: 14px; + font-weight: 600; +} + +.mini-program-entry { + display: flex; + width: min(100%, 520px); + margin: 28px auto 12px; + flex-direction: column; + align-items: center; + text-align: center; +} + +.vp-doc .mini-program-entry + h2 { + margin-top: 12px; +} + +.mini-program-entry__qr { + margin: 0; +} + +.mini-program-entry__qr img { + width: 196px; + max-width: 58vw; + margin: 0 auto; +} + +.mini-program-entry__qr figcaption { + margin-top: 12px; + color: var(--vp-c-brand-1); + font-size: 15px; + font-weight: 600; +} + +.mini-program-entry__hint { + margin: 14px 0 0; + color: var(--vp-c-text-2); + font-size: 14px; + line-height: 1.7; +} + +@media (max-width: 640px) { + .manual-entry-grid { + grid-template-columns: 1fr; + } +} diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts new file mode 100644 index 0000000..b2e27c5 --- /dev/null +++ b/.vitepress/theme/index.ts @@ -0,0 +1,78 @@ +import DefaultTheme from 'vitepress/theme' +import mediumZoom from 'medium-zoom' +import { onContentUpdated } from 'vitepress' +import { onMounted } from 'vue' +import type { Theme } from 'vitepress' + +import './custom.css' + +/** + * 参与「点击放大」的图片范围。 + * + * `.vp-doc` 是 VitePress 默认主题给正文容器加的类名,使用手册 9 页与接口文档 + * 全部页面共用这一套布局,所以在这里定义一次即对全站生效。 + * + * 排除项: + * a img 图片本身是链接(如带外链的截图),点击应跳转而不是放大 + * .no-zoom 需要单独关闭放大的图片,示例: + * `xx` + */ +const ZOOM_SELECTOR = '.vp-doc img:not(a img):not(.no-zoom)' + +/** + * 全站只保留一个 medium-zoom 实例,但【必须惰性创建】。 + * + * 两个坑叠在一起,才得到这个写法: + * + * 1. 不能在模块顶层创建实例。medium-zoom 1.1.0 的工厂函数第一件事就是读 + * `window.Promise`(dist/medium-zoom.min.js 里即 `var Promise = window.Promise || ...`), + * 而主题模块在 `vitepress build` 时会被 Node 端 SSR 打包并执行 —— 没有 window, + * 直接 `ReferenceError: window is not defined` 构建失败。 + * 所以实例只能在浏览器生命周期回调里创建。 + * + * 2. 也不能每次路由切换都 `mediumZoom(...)` 新建。每个实例都会在 document 上注册 + * click / keyup / scroll、在 window 上注册 resize 监听器,且没有卸载入口 + * (见 dist/medium-zoom.esm.js:576-581)。翻 N 个页面就会留下 N 组永不释放的 + * 全局监听器。正确做法是复用实例,路由切换时只做 attach —— attach 内部会跳过 + * 已挂载的图片(dist/medium-zoom.esm.js:199-204),因此重复调用是幂等的。 + */ +let zoom: ReturnType | null = null + +const attachZoom = () => { + if (typeof window === 'undefined') return + if (!zoom) { + zoom = mediumZoom({ + background: 'var(--vp-c-bg)', + margin: 24, + }) + } + zoom.attach(ZOOM_SELECTOR) +} + +const closeZoomOnClick = (event: MouseEvent) => { + const target = event.target as Element | null + if (!zoom || !target) return + if (target.closest('.medium-zoom-image--opened, .medium-zoom-overlay')) { + void zoom.close() + } +} + +const theme: Theme = { + extends: DefaultTheme, + setup() { + // onContentUpdated 由 VitePress 在「新页面内容挂载完成后」触发,覆盖首次进入 + // 与 SPA 客户端路由切换。它挂在路由组件的 onVnodeMounted 上 + // (见 vitepress/dist/client/app/components/Content.js:13-20), + // 比 watch(route.path) + nextTick 更可靠 —— 后者可能在异步页面组件挂载前就执行, + // 导致某些页面图片没挂上监听、点击放大静默失效。 + onContentUpdated(attachZoom) + + // 兜底:主题 setup 时内容已就绪(不经过 onVnodeMounted 的极端情况)也能挂上 + onMounted(attachZoom) + if (typeof document !== 'undefined') { + document.addEventListener('click', closeZoomOnClick, true) + } + }, +} + +export default theme diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1365cfc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM node:22-alpine AS builder + +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ + && apk add --no-cache git + +WORKDIR /app + +COPY package*.json .npmrc ./ +RUN npm ci + +COPY . . +RUN npm run docs:build + +FROM nginx:1.27-alpine + +COPY --from=builder /app/.vitepress/dist /usr/share/nginx/html +COPY docker/nginx.conf /etc/nginx/conf.d/default.conf diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5657309 --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# iotlcm-docs + +iotLCM 物联网卡全生命周期管理平台的**使用手册与 OpenAPI 合同**。 + +- **使用手册**:Web 管理端(企业客户视角)与小程序端的操作说明,含截图 +- **OpenAPI 合同**:V3 接口、旧版兼容接口、运营商能力代理(白名单转发 / 共享 Token)的鉴权方式、请求参数与响应结构 + +## 技术栈 + +VitePress 1.6 + Vue 3,产物为纯静态站点。 + +## 目录结构 + +```text +iotlcm-docs/ +├── docs/ # 文档源(VitePress srcDir) +│ ├── index.md # 文档首页 +│ ├── manual/ # 使用手册 +│ │ ├── web/ # Web 管理端 +│ │ └── mini-program/ # 小程序端 +│ ├── openapi/ # OpenAPI 合同 +│ │ ├── v3/ # V3 接口 +│ │ ├── legacy/ # 旧版兼容接口 +│ │ └── operator/ # 运营商能力代理 +│ └── public/ # 静态资源(favicon、截图) +├── .vitepress/ # VitePress 配置与主题定制 +├── docker/ # nginx 配置 +├── Dockerfile +└── docker-compose.yml +``` + +## 本地开发 + +```bash +npm ci +npm run dev # http://127.0.0.1:5173/ +``` + +构建与预览: + +```bash +npm run build # 产物在 .vitepress/dist +npm run preview +``` + +站点部署在子路径 `/docs/`(见 `.vitepress/config.mts` 的 `base`)。本地开发时根路径会自动重定向 favicon。 + +## 容器化部署 + +```bash +docker build -t iotlcm-docs . +docker run -d -p 8080:80 iotlcm-docs +``` + +多阶段构建:Node 阶段执行 `vitepress build`,最终镜像只含 nginx 与静态产物。 + +`docker-compose.yml` 里的镜像名需替换成你自己的镜像仓库地址;对外署时请用不可变标签(commit sha)而不是 `latest`。 + +## 文档里的占位符 + +文档中的服务地址、凭据等均为占位示例: + +| 占位 | 含义 | +| --- | --- | +| `iotlcm.example.com` | Web 管理端地址 | +| `api.iotlcm.example.com` | OpenAPI 服务地址 | +| `YOUR_APP_ID` / `YOUR_APP_SECRET` | 平台分配的应用凭据 | +| `YOUR_ACCESS_TOKEN` / `YOUR_TRANSID` | 调用方凭据与流水号 | +| `141****5152` | 示例手机号 | + +替换成你自己的环境即可。 + +## 相关项目 + +- [iotlcm-openapi](https://git.5iot.com/iotlcm-public/iotlcm-openapi) —— OpenAPI 服务实现 +- [iotlcm-admin-svr](https://git.5iot.com/iotlcm-public/iotlcm-admin-svr) —— Web 管理端后端 + +## License + +[Apache License 2.0](./LICENSE) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..335b99f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +services: + docs: + image: your-registry/iotlcm/iotlcm-docs:latest + container_name: iotlcm-docs + restart: unless-stopped + networks: + - iotlcm-network + +networks: + iotlcm-network: + external: true + name: iotlcm-network diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 0000000..04e9641 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,11 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri.html $uri/ =404; + } +} diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..2adf626 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,26 @@ +--- +layout: home + +hero: + name: iotLCM + text: 文档中心 + tagline: iotLCM 平台文档与接口规范。 + actions: + - theme: brand + text: 使用手册 + link: /manual/ + - theme: alt + text: OpenAPI 接口文档 + link: /openapi/ + - theme: alt + text: 共享 Token 接口文档 + link: /openapi/operator/ + +features: + - title: 使用手册 + details: 按使用端提供 Web 管理平台与小程序端手册,覆盖查卡、诊断、业务管理和账号服务。 + - title: OpenAPI 接口文档 + details: 客户开放接口的鉴权方式、请求参数、响应结构、调用示例与兼容接口说明。 + - title: 共享 Token 接口文档 + details: 共享 Token 获取与白名单转发说明。 +--- diff --git a/docs/manual/index.md b/docs/manual/index.md new file mode 100644 index 0000000..ff0612a --- /dev/null +++ b/docs/manual/index.md @@ -0,0 +1,23 @@ +--- +layout: home + +hero: + name: iotLCM 使用手册 + text: 操作指南 + tagline: 按使用端查看卡片查询、业务管理与移动服务说明。 + actions: + - theme: brand + text: Web端手册 + link: /manual/web/ + - theme: alt + text: 小程序端手册 + link: /manual/mini-program/ + +features: + - title: 版本选型指引 + details: 使用浏览器登录企业管理后台,请阅读 Web 端手册;使用 IOTLCM 物联卡用户服务小程序,请阅读小程序端手册。不同端的功能入口、权限和页面结构有所区别。 + - title: Web端 + details: 面向企业管理员和业务人员,覆盖首页、卡信息、智能诊断、业务受理、企业管理、工单、API 凭证与执行日志。 + - title: 小程序端 + details: 对应 iotlcm-app v1.0.1,覆盖首页公开查卡、扫码与拍照识别、卡片详情、卡片排查和账号密码登录;办理、绑定、微信登录及注册等功能暂未开放。 +--- diff --git a/docs/manual/mini-program/devices.md b/docs/manual/mini-program/devices.md new file mode 100644 index 0000000..7ba107b --- /dev/null +++ b/docs/manual/mini-program/devices.md @@ -0,0 +1,39 @@ +# 卡片详情 + +从首页查询结果点击“详情”后进入卡片详情页。首页会以公开来源打开详情,因此未登录或公开来源都会使用受限展示模式。 + +## 公开详情展示内容 + +公开模式包含两组信息: + +- 基础信息:卡号、卡状态、在线状态; +- 流量信息:已用流量。 + +![卡片详情中的基础信息和流量信息](/images/manual/mini-program/card-details-traffic.png) + +卡号可能已经脱敏,页面显示什么就以什么为准。点击或长按卡号行可以复制当前显示值。 + +公开模式不会展示完整 IMSI、IMEI、备注、总流量、剩余流量、会话信息、APN、IPv4、IPv6 和服务状态,也不会提供重启、开通数据、停用数据等操作按钮。 + +## 登录后详情 + +登录并通过权限校验后,设备列表和卡片详情可以展示更完整的账号范围数据,例如 MSISDN、ICCID、IMSI、设备 IMEI、套餐流量和同步时间。字段是否出现取决于接口返回值和账号权限。 + +
+
+ 登录后的设备列表和账号范围数据 +
+
+ 全部设备中的账号范围数据 +
+
+ 登录后的卡片详情账号范围数据 +
+
+ + +## 查不到详情时 + +- 确认查询号码没有空格或遗漏字符; +- 从首页重新查询后再点击“详情”; +- 若页面提示当前账号没有权限,请使用公开查询,或联系账号管理员确认数据范围。 diff --git a/docs/manual/mini-program/diagnosis.md b/docs/manual/mini-program/diagnosis.md new file mode 100644 index 0000000..6e385c1 --- /dev/null +++ b/docs/manual/mini-program/diagnosis.md @@ -0,0 +1,61 @@ +# 卡片排查 + +卡片排查用于根据卡片状态、在线状态、流量和设备信息整理处理方向。 + +## 进入排查 + +可以从以下位置进入: + +1. 首页点击“卡片排查”,手动输入卡号; +2. 首页查询成功后点击“卡片排查”,系统会带入当前查询值; + +![首页查询结果中的卡片排查入口](/images/manual/mini-program/diagnosis-entry-from-query-v2.png) + +3. 直接打开卡片排查页,在输入框填写 `ICCID`、`MSISDN` 或 `IMSI`。 + +
+
+ 从首页常用入口进入卡片排查 +
首页卡片排查入口
+
+
+ 卡片排查页手动输入卡号 +
输入卡号开始排查
+
+
+ +点击“开始排查”提交。排查过程中不要连续重复点击。 + +## 结果摘要 + +普通用户或未登录用户通常可以看到: + +- 卡片状态; +- 在线状态; +- 已用流量或流量状态; + +管理员账号可能看到更多卡片、数据服务、停机冻结和限制策略信息。页面会按实际接口返回值隐藏没有数据的字段。 + +## 流量使用分析 + +当前页面提供“近1个月、近3个月、近6个月”三个周期。**`v1.0.1` 默认只对顶层管理员显示流量趋势模块;其他账号即使登录,也不保证看到该模块。** + +有数据时会显示周期总用量、日均或月均用量、单期峰值和趋势图;没有数据时显示“暂无历史流量数据”。趋势只用于辅助排查,不等同于实时计费结果。 + +## 排查结果的处理方向 + +| 结果 | 建议核对 | +| --- | --- | +| 在线 | 继续核对设备业务表现和应用侧请求 | +| 离线 | 检查设备供电、开机状态、信号、天线和 APN | +| 未查询到会话 | 稍后重试,并确认设备是否产生数据会话;不等同于卡已销户 | +| 流量不足或用量异常 | 核对套餐流量、设备上报和业务使用情况 | +| 机卡分离 | 核对卡片与设备的使用关系 | +| 区域受限 | 核对业务限制区域、订购状态和触发状态 | +| 停机或冻结 | 根据页面提示联系业务管理员确认 | + +## 当前版本限制 + +排查页的“重启卡”“开通数据服务”“停用数据服务”按钮只有在登录且账号拥有对应权限时才会出现。业务办理路由、套餐、预警、订单和工单在 `v1.0.1` 中暂未开放。 + +排查接口或流量接口提示请求过于频繁时,请等待一段时间后再试,不要连续提交。 diff --git a/docs/manual/mini-program/faq.md b/docs/manual/mini-program/faq.md new file mode 100644 index 0000000..931fc34 --- /dev/null +++ b/docs/manual/mini-program/faq.md @@ -0,0 +1,45 @@ +# 常见问题 + +## v1.0.1 有哪些可用功能? + +无需登录即可在首页手动输入、扫码或拍照识别卡号,并查看公开详情和卡片排查结果。已有账号可以使用账号密码登录,查看权限范围内的设备数据。 + +## 为什么底部没有“办理”Tab? + +`v1.0.1` 关闭了办理 Tab。套餐续费、加油包、套餐变更、停复机、预警、订单、工单和客户管理等路由也暂未开放,直接访问会提示当前版本暂未开放此功能。 + +## 为什么设备页看不到卡片? + +设备页读取登录账号的卡片范围。未登录时请回到首页使用公开查卡;登录后仍为空时,请确认账号已分配卡片或具备相应权限。 + +## 支持哪些查卡方式? + +首页支持输入 `ICCID`、`MSISDN`、`IMSI` 或 `IMEI`,也支持扫码读取内容和从相机或相册拍照识别 ICCID。 + +## 拍照识别失败怎么办? + +请拍摄单张、平整、完整、无反光的卡片,并确保 ICCID 清晰。识别超时或频繁请求时等待后重试;也可以改用扫码或手动输入。 + +## 公开详情为什么字段少? + +公开模式只展示卡号、卡状态、在线状态和已用流量。完整 IMSI、IMEI、会话、APN、IP、服务状态等字段属于受限数据。 + +## 为什么不能绑定卡片或执行重启? + +卡片绑定和“更多操作”在 `v1.0.1` 中统一关闭。即使登录,当前版本也不会提供绑定、套餐办理、停复机、数据服务变更和预警配置入口。 + +## 为什么看不到流量趋势? + +流量趋势模块当前只对顶层管理员开放,且接口必须返回有效历史数据。其他账号或没有历史数据时不会显示趋势图。 + +## 为什么排查显示离线或未查询到会话? + +先检查设备供电、开机状态、信号、天线和 APN,再稍后重新排查。“未查询到会话”只表示当前没有查到数据会话,不等同于卡片已销户。 + +## 账号密码登录有什么限制? + +当前版本只开放已有账号的账号密码登录;微信登录和注册账号未开放。忘记密码页面会提示短信服务接入后开放,请联系管理员或客服处理账号问题。 + +## 排查结果是否是最终结论? + +不是。排查结果仅用于辅助判断,最终以运营商和业务系统状态为准。请勿在查询、排查和反馈内容中提交身份证号、银行卡号或其他无关敏感信息。 diff --git a/docs/manual/mini-program/home.md b/docs/manual/mini-program/home.md new file mode 100644 index 0000000..e204b5b --- /dev/null +++ b/docs/manual/mini-program/home.md @@ -0,0 +1,67 @@ +# 首页查卡 + +首页是当前版本的主要使用入口。查询不要求登录,支持手动输入、微信小程序扫码和图片识别三种录入方式。 + +## 登录入口 + +首页和登录页都保留“未登录也可查卡”入口。需要查看账号名下设备时,再通过账号密码登录;微信登录和注册账号暂未开放。 + +## 手动查询 + +1. 在“卡片查询”输入框输入完整的 `ICCID`、`MSISDN`、`IMSI` 或 `IMEI`。 +2. 点击“查询”,等待查询完成。 + +![点击查询并等待查询完成](/images/manual/mini-program/query-complete.png) + +3. 查询成功后,结果区域显示卡号、使用流量和在线状态。 +4. 点击“详情”查看公开卡片详情,或点击“卡片排查”查看状态摘要。 + +
+
+ 查询结果中的详情和卡片排查入口 +
详情与卡片排查入口
+
+
+ 卡片详情页展示的公开字段 +
卡片详情
+
+
+ 卡片排查页展示的状态摘要 +
卡片排查
+
+
+ +输入内容请去除前后空格并核对末位字符。查询失败时先检查输入值,再重新提交。 + +## 扫码查询 + +1. 点击“扫码”。 + +![首页扫码入口](/images/manual/mini-program/scan-entry-highlight.png) + +2. 将卡片条码或二维码放入扫描区域。 +3. 扫描成功后,识别出的内容会自动填入输入框并立即发起查询。 + +光线不足、反光或距离不合适时可能扫描失败;此时请调整卡片位置,或改用手动输入。 + +## 拍照识别 ICCID + +1. 点击“拍照”。 + +![首页拍照入口](/images/manual/mini-program/photo-entry.png) + +2. 从相机或相册选择一张卡片图片。 +3. 确保图片中只有一张卡片,并且 ICCID 完整、清晰、无反光。 +4. 识别成功后,系统会将 ICCID 填入输入框并继续查询。 + +常见提示及处理方式: + +| 提示 | 处理方式 | +| --- | --- | +| 图片中存在多个可能的 ICCID | 重新拍摄单张卡片 | +| 未能识别清晰的 ICCID | 保持卡片平整、对焦清楚后重拍 | +| 图片识别超时或请求过于频繁 | 等待后重试,或使用扫码、手动输入 | + +## 首页结果 + +首页结果中的“剩余流量”按“剩余 / 套餐总量”展示;在线状态可能为在线、离线、未知或未查询到会话。结果区域的查询和排查说明均提示:内容仅供参考,以业务系统结果为准。 diff --git a/docs/manual/mini-program/index.md b/docs/manual/mini-program/index.md new file mode 100644 index 0000000..2548977 --- /dev/null +++ b/docs/manual/mini-program/index.md @@ -0,0 +1,99 @@ +--- +title: 小程序端使用手册 +--- + +# 小程序端使用手册 + +本文介绍 iotLCM 平台当前已开放的页面及操作功能,具体可用内容以账号实际权限为准。当前版本以**公开查卡和状态排查**为主,业务办理入口暂未开放。 + +
+
+ 扫码进入 iotLCM 小程序 +
扫码进入 iotLCM 小程序
+
+

使用微信扫一扫即可打开小程序,体验公开查卡和卡片状态排查功能。

+
+ +## 版本范围 + +| 页面或功能 | 当前状态 | 说明 | +| --- | --- | --- | +| 首页 | 已开放 | 手动输入、扫码、拍照识别并查询卡片 | +| 卡片详情 | 已开放 | 公开查询只展示卡号、卡状态、在线状态和已用流量 | +| 卡片排查 | 已开放 | 输入卡号查看状态摘要;流量趋势仅对管理员账号显示 | +| 账号密码登录 | 已开放 | 企业、代理商和终端用户使用已有账号登录 | +| 设备列表 | 登录后使用 | 显示当前账号权限范围内的卡片;未登录不要用此页进行公开查卡 | +| 办理、订单、工单、预警、开停数据等 | 暂未开放 | 入口或路由会提示“当前版本暂未开放此功能” | +| 微信登录、注册、绑定卡片、卡片更多操作 | 暂未开放 | 本版本不提供这些入口 | + +## 推荐流程 + +1. 打开小程序首页,在“卡片查询”中输入 ICCID、MSISDN、IMSI 或 IMEI。 + +![小程序首页卡片查询输入框](/images/manual/mini-program/home-card-query.png) + +2. 也可以点击“扫码”读取卡片条码,或点击“拍照”识别卡片上的 ICCID。 + + ![首页扫码和拍照入口](/images/manual/mini-program-scan-photo-entry.png) + +3. 点击“查询”,查看卡号、卡状态、使用流量和在线状态。 + +![点击查询查看卡号、卡状态、使用流量和在线状态](/images/manual/mini-program/query-result.png) + +4. 需要查看公开字段时点击“详情”;需要判断异常原因时点击“卡片排查”。 + +
+
+ 首页查询结果中的详情和卡片排查入口 +
首页入口
+
+
+ 卡片详情页展示的公开字段 +
卡片详情
+
+
+ 卡片排查页展示的状态摘要 +
卡片排查
+
+
+ +5. 如果需要停复机、开通数据服务、套餐办理、预警或工单,请等待后续版本开放。 + +## 账号密码登录 + +1. 在需要账号数据的页面进入登录页,或在首页点击登录入口。 + +
+
+ 从首页底部的我的入口进入登录 +
首页“我的”入口
+
+
+ 登录页中的账号密码登录入口 +
账号密码登录
+
+
+ +2. 输入已有账号和密码,完成页面要求的安全验证后点击“登录”。 + +![账号密码登录表单](/images/manual/mini-program/account-password-login.png) + +3. 如果同一账号匹配多个登录身份,按页面提示选择本次要进入的账号。 +4. 登录成功后返回原页面;设备页会按账号权限加载卡片数据。 + +![登录后设备页按账号权限加载卡片数据](/images/manual/mini-program/devices-page.png) + +当前版本不开放注册和微信登录。“忘记密码”页面会提示短信服务接入后开放,无法登录时请联系账号管理员或客服。 + +## 使用边界 + +- 公开查询和排查结果仅供辅助判断,最终以运营商和业务系统状态为准。 +- 未登录查询不会展示完整 IMSI、IMEI、APN、IP、套餐内部信息等受限字段。 +- 请勿在查询、排查或反馈内容中提交身份证号、银行卡号等无关敏感信息;密码只应填写在登录表单中。 + +## 阅读指引 + +- [首页查卡、扫码与拍照](./home) +- [卡片详情](./devices) +- [卡片排查](./diagnosis) +- [常见问题](./faq) diff --git a/docs/manual/web/api-and-logs.md b/docs/manual/web/api-and-logs.md new file mode 100644 index 0000000..1b47516 --- /dev/null +++ b/docs/manual/web/api-and-logs.md @@ -0,0 +1,53 @@ +# API 凭证与执行日志 + +## 我的 API 凭证 + +**入口:** 左侧菜单 → **我的 API 凭证**。 + +![我的 API 凭证页面](/images/manual/api-credentials-entry.png) + +页面显示本企业的企业 ID、企业名称、`appKey`(API 账号标识)和 `appSecret`(API 密钥),并提供复制按钮。接口鉴权和请求格式请配合 [OpenAPI 接口文档](/openapi/) 使用。 + +::: warning appKey ≠ appId +- **`appKey`** 和 **`appSecret`** 仅用于调用 `/openapi/v3/query/token` 换取 token +- **`appId`**(客户组织编码,如 `CUS-202601-0001`)由 token 接口返回,调用其他接口时在请求体中传入 +- 不要把 `appKey` 当作 `appId` 使用,两者是不同的概念 +::: + +### 安全要求 + +- `appSecret` 等同接口密码,只能提供给获准的开发和运维人员。 +- 不要把凭证写入前端代码、公开仓库、工单正文、聊天截图或日志。 +- 服务端应通过环境变量或密钥管理服务保存凭证。 +- 不同环境不要共用同一份配置文件。 +- 怀疑泄露时立即停止相关调用并联系平台支持更换凭证。 + +复制后粘贴到配置前,检查是否带入多余空格或换行。接口返回鉴权失败时,先核对企业对应的 appId 与 appSecret 是否配套,再检查签名、时间戳和请求地址。 + +## 执行日志(暂未开放) + +**入口:** 左侧菜单 → **执行日志**。 + +批量续费、套餐变更、加油包、重启、停复机、划拨、达量断网等任务提交后,均应通过执行日志确认最终结果。 + +### 查询批次 + +可按关键字、批次编号、批次类型、异步处理状态和创建时间查询。列表显示: + +- 批次编号和批次类型。 +- 来源方式,如 Excel 或批量输入。 +- 运行结果和异步状态。 +- 总数量、开始时间和结束时间。 + +点击批次编号可查看逐卡明细,包括行号、ICCID、MSISDN、IMSI、明细状态和异常原因。点击“查看”可查看批次概要、失败原因、源文件、结果文件和处理时间。 + +### 处理失败任务 + +1. 用提交时记录的批次号查询。 +2. 确认批次已结束,避免把“处理中”误判为失败。 +3. 点击批次号查看失败卡及异常原因。 +4. 下载结果文件,修正卡号、状态、套餐或模板数据。 +5. 只重提失败且可修正的卡,不要整批重复提交。 +6. 无法处理的上游错误通过工单反馈,并附批次号和失败原因。 + +常见失败原因包括卡号不属于当前企业、卡状态不允许办理、套餐不匹配、余额不足、模板字段错误、上游超时或重复业务仍在处理中。 diff --git a/docs/manual/web/business-operations.md b/docs/manual/web/business-operations.md new file mode 100644 index 0000000..ca7862c --- /dev/null +++ b/docs/manual/web/business-operations.md @@ -0,0 +1,99 @@ +# 业务受理与达量断网 + +## 业务受理入口 + +左侧菜单 → **通讯管理 → 业务受理**。 + +![业务受理入口](/images/manual/business-acceptance-entry.png) + +页面按“套餐及数据”“生命周期”“预警中心”展示业务入口。每个入口都有独立按钮权限,未授权的入口不会显示。 + +可能出现的业务包括: + +| 分类 | 业务 | 用途 | +| --- | --- | --- | +| 套餐及数据 | 续费套餐 | 延长当前套餐或购买可续费套餐 | +| 套餐及数据 | 变更套餐 | 将卡切换到其他可购套餐 | +| 套餐及数据 | 加油包订购 | 为单卡或流量池购买叠加包 | +| 套餐及数据 | 开停数据 | 开启或关闭数据通信服务 | +| 套餐及数据 | 达量断网 | 设置达到指定流量后断网 | +| 生命周期 | 重启 | 向运营商提交卡重启 | +| 生命周期 | 自主停机/自主复机 | 暂停或恢复卡服务 | +| 生命周期 | 转销户 | 将卡转为销户状态 | +| 生命周期 | 划拨 | 将卡划拨给目标下级企业 | +| 生命周期 | 退订 | 退订符合条件的套餐或业务 | +| 预警中心 | 流量预警配置 | 配置单卡流量阈值预警 | +| 预警中心 | 流量池预警配置 | 配置流量池阈值预警 | + +## 通用办理方式(部分开放) + +不同业务会提供以下一种或多种数据来源: + +- **Excel:** 先下载页面提供的最新模板,按模板填写后上传 `.xls` 或 `.xlsx` 文件。不要修改表头或合并单元格。 +- **批量输入:** 通常每行一个 ICCID;部分业务支持每行填写 `ICCID MSISDN IMSI`。 +- **连续号段:** 填写 ICCID、MSISDN 或 IMSI 的起始值和结束值,适合连续卡段。 + +标准操作流程: + +1. 选择业务入口和数据来源。 +2. 上传文件或输入卡号,提交预处理。 +3. 记录系统返回的批次号。 +4. 核对有效数量、失败数量、目标套餐、购买时长、生效方式、金额和余额等信息。 +5. 确认无误后提交正式任务。 +6. 前往“执行日志”查询批次最终状态和失败原因。 + +::: warning 提交前确认 +批量任务可能影响通信、套餐、费用或卡生命周期。提交前应抽查卡号、目标企业、套餐编码、阈值、生效方式和付款方式。不要重复提交仍在处理中的批次。 +::: + +## 续费、变更与加油包(暂未开放) + +### 续费套餐 + +支持 Excel 或批量输入。预处理后选择可续费套餐、续费年限、续费日期和付款方式。余额支付时必须确认余额充足;线下支付时按页面要求完成线下确认。 + +### 变更套餐 + +支持 Excel、批量输入和连续号段。预处理后选择新套餐、购买时长、赠送时长和“立即生效/次月生效”。变更前重点确认生效方式,避免影响当前套餐剩余资源。 + +### 加油包订购 + +可选择“单卡加油包”或“流量池加油包”。单卡 Excel 需填写 ICCID 和加油包套餐编码;流量池 Excel 需填写流量池编码和套餐编码。预处理后核对数量、单价、总金额、付款账户和余额。 + +## 生命周期和数据服务(部分开放) + +重启、自主停机、自主复机、开停数据、转销户和退订通常支持 Excel 或批量输入。生命周期任务提交后不会立即在列表全部完成,应通过批次号在执行日志中跟踪。 + +- 重启适合设备长时间不在线且卡状态正常的场景。 +- 自主停机和关闭数据会中断通信,恢复前请确认业务窗口。 +- 转销户通常不可逆或需要人工处理,提交前必须复核卡号。 +- 划拨前确认目标企业,任务完成后卡的数据归属和可见范围会变化。 + +## 达量断网批量配置(部分开放) + +在“业务受理”点击“达量断网”,可通过 Excel、批量输入或连续号段批量配置: + +1. 选择开启或关闭。 +2. 开启时填写阈值,单位为 MB,阈值必须大于 0,最多保留 3 位小数。 +3. 填写卡号或上传模板后提交。 +4. 记录批次号并在执行日志中检查结果。 + +关闭配置表示不再按该阈值触发断网,不等同于立即恢复所有因其他原因停机的卡。 + +## 达量断网页面(部分开放) + +**入口:** 左侧菜单 → **通讯管理 → 达量断网**。 + +![达量断网入口](/images/manual/data-usage-cutoff-entry.png) + +该页面用于查看和维护已有配置: + +- 可按 MSISDN、ICCID、IMSI、IMEI 或配置状态查询。 +- 列表显示通道、所属公司、当前套餐、配置状态和阈值。 +- 有编辑权限时,可修改开启/关闭状态及阈值。 +- 有删除权限时,可删除该卡的达量断网配置。 +- 有导出权限时,可按当前条件导出配置。 + +批量新增或修改建议从“业务受理 → 达量断网”完成;单卡核对和调整可在本页面完成。 + +![业务受理中的达量断网批量输入](/images/manual/business-operations-batch-threshold.png) diff --git a/docs/manual/web/card-info.md b/docs/manual/web/card-info.md new file mode 100644 index 0000000..73fd937 --- /dev/null +++ b/docs/manual/web/card-info.md @@ -0,0 +1,84 @@ +# 卡信息 + +## 页面入口 + +左侧菜单 → **通讯管理 → 卡信息**。 + +该页面是日常查卡的主要入口,可查询卡的身份标识、运营商状态、套餐、流量、归属企业、通道和到期情况。 +![日常查卡页面入口](/images/manual/card-info-main-entry.png) + +## 查询卡片 + +常用查询条件如下: + +| 条件 | 用法 | +| --- | --- | +| 卡号 | 输入 MSISDN、ICCID 或 IMSI 任一标识 | +| 卡状态 | 按运营商卡状态筛选 | +| IMEI | 按终端设备号查询 | +| 所属通道 | 按运营商或接入通道筛选,支持搜索 | +| 时间类型、时间范围 | 按所选业务时间区间筛选 | +| 查询条件、起始号段、结束号段 | 选择号段类型,并按起止号段范围筛选卡片 | +| 备注信息 | 按备注内容筛选 | +| 维度、维度状态、维度值 | 按指定业务维度进行组合筛选 | +| 排序值、排序类型 | 指定排序字段及升降序 | + +查询不到卡时,先确认使用的是完整卡号,再清空状态、时间和通道等附加条件重试。 + +## 列表信息 + +| 字段 | 说明 | +| --- | --- | +| ICCID | SIM 卡芯片的唯一识别码,业务办理和故障定位最常用 | +| MSISDN | 运营商分配的移动号码,也常称卡号 | +| IMSI | SIM 卡在移动网络中的用户识别码 | +| 卡状态 | 运营商侧当前生命周期状态 | +| 类型 | “单卡”表示独立计量,“池卡”表示参与流量池共享 | +| 通道 | 卡接入的运营商或上游通道 | +| 所属公司 | 当前卡归属的企业 | +| 套餐 | 当前主套餐名称 | +| 总流量、已用流量、剩余流量 | 当前套餐流量,单位为 MB | +| 到期时间 | 当前套餐预计到期日期 | +| 出库时间 | 卡片分配出库日期 | +| 备注信息 | 企业维护的业务备注 | + +列表中的流量不是实时会话流量。需要最新结果时,执行“同步用量”后再刷新。 + +## 查看卡详情 + +点击目标卡右侧“查看”。详情上方展示:MSISDN、ICCID、IMSI、IMEI、卡状态、网络类型、流量同步时间、套餐总流量、到期时间、出库时间、当前套餐、已用流量、剩余流量、所属企业、所属通道、达量断网配置状态、限额、备注。 + +![在卡信息列表点击“查看”打开卡详情](/images/manual/card-info-view-entry.png) + +详情下方包含以下页签: + +- **会话信息:** APN、IPv4、IPv6、接入方式、在线状态、会话建立时间、实时 IMEI、开关机状态等。点击“刷新”重新查询;“未查询到会话”通常表示设备当前未建立数据会话,并不等同于卡已销户。 +- **归属信息:** 当前套餐编号、套餐名称、所属企业和所属通道(所属通道不予展示)。 +- **主套餐:** 订单编号、套餐名称、套餐类型、订购状态、生效时间和到期时间。 +- **叠加套餐:** 加油包名称、总流量、支付方式和交易时间。 +- **变更历史:** 变更前后套餐、订购状态和办理时间。 + +![卡详情页签](/images/manual/card-detail-tabs.png) + +## 常用操作 + +页面上的操作按钮以账号权限为准。 + +- **备注:** 编辑本企业对卡片的业务备注,便于按项目、设备或使用场景检索。 +- **同步用量:** 向上游请求最新用量。同步成功后查看“流量同步时间”是否更新。 +- **同步状态:** 向上游请求最新运营商卡状态。 +- **导出:** 按当前筛选条件导出卡信息。 +- **诊断:** 在卡详情点击“诊断”,系统会携带当前 ICCID 跳转到智能诊断并自动查询。 + +“批量操作”当前仍显示为待接入功能。 + +![卡信息列表更多操作菜单](/images/manual/card-info-more-actions.png) + +## 查看数据异常时 + +1. 先核对卡号和所属企业。 +2. 查看卡状态、套餐到期时间及流量同步时间。 +3. 分别执行“同步状态”和“同步用量”。 +4. 打开详情刷新会话信息。 +5. 进入[智能诊断](./intelligent-diagnosis)做完整排查。 +6. 仍有异常时创建工单,并提供 ICCID、异常时间和已完成的操作。 diff --git a/docs/manual/web/enterprise-management.md b/docs/manual/web/enterprise-management.md new file mode 100644 index 0000000..5c194fb --- /dev/null +++ b/docs/manual/web/enterprise-management.md @@ -0,0 +1,102 @@ +# 企业、用户与角色 + +## 企业信息 + +**入口:** 左侧菜单 → **企业管理 → 企业信息**。 + +![企业信息页面入口](/images/manual/enterprise-information-entry.png) + +该页面用于维护当前企业资料,分为单位信息和实名认证信息。 + +单位信息通常包括联系电话、邮箱、统一社会信用代码、组织所在地和详细地址。实名认证信息包括单位全称、行业、法人姓名、法人身份证号、单位类型、成立时间、开户行名称和开户行账号。 + +单位信息如需修改请联系管理员。 + +## 角色管理 + +**入口:** 左侧菜单 → **企业管理 → 角色管理**。 + +![角色管理页面入口](/images/manual/role-management-entry.png) + +角色用于把菜单和按钮权限批量授予用户。列表可按角色名称、权限字符和状态查询。 + +### 创建角色 + +1. 点击“新增”。 +![创建角色时点击新增](/images/manual/role-create-add-button.png) +2. 填写角色名称和角色权限字符。 +3. 设置角色状态。 +4. 在“菜单权限”中勾选该角色需要使用的页面和操作。 +5. 需要传递给直属下级企业时,按业务要求设置“下发给下一级”。 + + ![设置下发给下一级](/images/manual/role-management-distribute-to-child.png) + +6. 保存后回到“用户管理”,将角色分配给用户。 +![在用户管理中分配角色](/images/manual/assign-role-to-user.png) + +本级机构绑定的默认角色不能修改或删除。新增自定义角色时遵循最小权限原则,不要为普通查询人员授予企业删除、用户删除、角色修改或批量业务提交权限。 + +## 企业客户 + +**入口:** 左侧菜单 → **企业管理 → 企业客户**。 + +![企业客户页面入口](/images/manual/enterprise-customer-entry.jpg) + +该页面面向获准管理下级企业的客户。可按企业名称和状态查询,列表显示企业名称、登录账号、负责人、联系电话、邮箱、组织所在地、详细地址、创建时间和状态。 + +根据按钮权限,可执行: + +- **新增:** 创建直属企业客户之前,需在角色管理界面创建该企业客户同名角色,之后返回新增页面设置登录账号、初始密码、联系方式和企业地址等信息。 +![角色管理中创建企业客户同名角色](/images/manual/enterprise-customer-role-match.png) + +![新增企业客户页面](/images/manual/enterprise-customer-create-form.jpg) +- **修改:** 调整企业名称、登录账号、负责人。 + + ![修改企业客户信息](/images/manual/enterprise-customer-edit.png) + +- **重置密码:** 为该企业主账号设置新密码,密码长度为 5 至 20 位。 +![企业客户重置密码](/images/manual/enterprise-customer-reset-password.png) +- **企业管理:** 分两步维护单位信息和实名认证信息。 + + ![维护企业单位信息](/images/manual/enterprise-customer-manage.png) + +- **删除:** 删除前确认该企业没有仍在使用的卡、用户和业务数据。删除属于高风险操作。 +![企业客户删除确认](/images/manual/enterprise-customer-delete-confirm.png) + +新增企业后,应及时通知对方修改初始密码,并按需要创建角色和用户。 + +## 用户管理 + +**入口:** 左侧菜单 → **企业管理 → 用户管理**。 + +![用户管理入口](/images/manual/user-management-entry.png) + +可按用户名称、昵称、联系电话、状态和创建时间查询。列表显示用户名称、昵称、角色、联系电话、邮箱、状态和创建时间。 + +### 新增用户 + +1. 点击“新增”。 +2. 填写用户名称、初始密码、昵称、联系电话、邮箱、性别和备注。 +3. 设置账号状态。 +4. 至少选择一个角色后保存。 + +初始密码长度为 5 至 20 位。建议使用更长且不重复的密码,并要求用户首次登录后修改。 +![新增用户页面](/images/manual/user-create-form.png) + +### 维护用户 + +- “修改”可调整资料、状态和角色。 +- “重置密码”可设置新密码。 +- “删除”会使用户失去登录和数据访问能力,操作前确认账号不再使用。 + +![维护用户信息](/images/manual/user-management-maintain-user.png) + +## 建议的角色划分 + +| 角色 | 建议权限 | +| --- | --- | +| 查询人员 | 卡信息查看、智能诊断,只读查看执行日志 | +| 业务操作员 | 查询权限,以及已批准的业务受理按钮 | +| 工单人员 | 我的工单、沟通、工单记录 | +| 接口开发 | 我的 API 凭证,只读卡信息;凭证按需单独授权 | +| 企业管理员 | 用户、角色和企业资料管理;高风险权限严格控制 | diff --git a/docs/manual/web/faq.md b/docs/manual/web/faq.md new file mode 100644 index 0000000..0527033 --- /dev/null +++ b/docs/manual/web/faq.md @@ -0,0 +1,58 @@ +# 常见问题 + +## 登录后看不到某个菜单 + +平台按角色显示菜单。先联系本企业管理员检查用户是否绑定正确角色、角色是否正常以及菜单权限是否勾选。若整个企业都没有该功能,需要联系平台支持开通。 + +## 同事有按钮,我没有 + +页面权限和按钮权限分别控制。即使都能进入同一页面,新增、编辑、导出、同步、删除或业务提交按钮也可能不同。由企业管理员对比双方角色权限。 + +## 卡信息查询不到卡 + +1. 清空其他筛选条件。 +2. 使用完整 MSISDN、ICCID 或 IMSI 查询。 +3. 检查是否有前后空格或字符缺失。 +4. 确认该卡已划拨到当前企业,且账号有相应数据范围。 +5. 仍无结果时创建工单并提供卡号。 + +## 卡状态或流量没有更新 + +在“卡信息”中分别执行“同步状态”和“同步用量”,完成后刷新列表,并查看同步时间是否变化。运营商接口可能有延迟;短时间内不要反复同步。 + +## 智能诊断显示未查询到会话 + +表示当前没有查到数据会话,不一定是卡异常。检查设备供电、信号、APN 和天线,确认数据服务已开启后重启设备,再稍后诊断。 + +## 诊断提示运营商不支持 + +当前卡所属通道未提供该项实时查询能力。结合卡信息、同步时间、设备侧日志和其他诊断模块判断;需要运营商侧核实时提交工单。 + +## 批量业务提交后一直没有结果 + +记录批次号,进入“执行日志”查看异步状态。仍在处理中时请等待;已失败时查看批次明细和失败原因。不要在结果未明确前重复提交同一批卡。 + +## Excel 上传失败 + +- 使用页面当次下载的最新模板。 +- 文件格式必须为 `.xls` 或 `.xlsx`,且不超过页面限制。 +- 不修改表头、不合并单元格、不增加公式。 +- 卡号列按文本格式保存,避免科学计数法或末位被修改。 +- 根据失败提示修正后,仅重提失败数据。 + +## 达量断网开启后没有立即断网 + +确认阈值单位为 MB、配置任务已成功、卡用量已同步且确实达到阈值。运营商侧执行可能有延迟;同时检查卡是否受其他套餐或通道策略影响。 + +## 如何提交高质量工单 + +提供完整 ICCID、MSISDN、故障开始时间、影响数量、设备位置、复现步骤、诊断结果、执行日志批次号和必要截图。描述中避免使用“卡有问题”这类无法定位的表述,也不要发送密码或 API 凭证。 + +## 使用安全建议 + +- 为每位操作人员创建独立账号,不共享管理员账号。 +- 查询人员、业务操作员和管理员使用不同角色。 +- 定期停用离职或不再使用的账号。 +- 高风险批量任务实行复核,保留批次号和结果文件。 +- 导出的卡信息、企业资料和 API 凭证按敏感数据管理。 + diff --git a/docs/manual/web/home.md b/docs/manual/web/home.md new file mode 100644 index 0000000..bfd06f1 --- /dev/null +++ b/docs/manual/web/home.md @@ -0,0 +1,52 @@ +# 首页与通用操作 + +## 首页(暂未开放) + +**入口:** 登录后默认进入“首页”;如已授权,也可点击左侧“首页”。 + +首页用于快速掌握企业卡业务概况,通常包括: + +- SIM 卡总数、本月新增、本月数据用量、本月短信用量和 SIM 卡月活跃度。 +- 生命周期分布、流量池、物联卡位置分布等图表。 +- 欠费停机、主动停机、机卡分离停机、强制停机等业务预警。 +- 流量用尽关停、限额管控关停、封顶关停和套餐余量提醒等流量预警。 +- 卡信息、智能诊断等快捷入口。 + +首页数据用于概览和发现异常。处理单张卡时,应进入“卡信息”查看最新详情;预警统计与明细可能存在同步时间差。 + +## 列表页通用操作 + +### 查询与重置 + +1. 在查询区填写一个或多个条件。 +2. 点击“查询”;部分页面修改条件后会自动查询。 +3. 条件过多导致无结果时,点击“重置”后只保留卡号、批次号等关键条件重试。 + +卡号输入框通常支持 MSISDN、ICCID、IMSI。输入前后不要带空格;批量输入时一般每行一张卡。 + +![卡号查询](/images/manual/card-info-query-single.jpg) + +![按号段批量查询](/images/manual/card-info-query-batch.jpg) + +### 表格工具 + +列表右上角可能提供刷新、列设置、密度或全屏等工具。横向字段较多时可左右滚动,固定在右侧的“操作”列用于查看或办理业务。 + +![表格工具](/images/manual/table-tools.png) + +### 导出(暂未开放) + +“导出”通常按当前查询条件导出,而不是只导出当前页。建议先缩小查询范围再导出,并妥善保管包含卡号、设备号和企业信息的文件。 + +### 状态与数据时间 + +卡状态、流量、会话和执行结果来自不同上游接口,更新时间可能不同。判断数据是否最新时,优先查看“同步时间”“开始时间”“结束时间”等时间字段,不要只看页面打开时间。 + +## 权限与数据范围 + +- 菜单权限决定页面是否显示。 +- 按钮权限决定是否能新增、编辑、导出、同步或删除。 +- 数据权限决定能看到本企业、下级企业还是仅本人数据。 +- 同一企业内不同用户看到的菜单和数据可能不同。 + +企业管理员可通过“企业管理 → 用户管理”和“角色管理”调整本企业用户权限。涉及平台未向企业开放的功能时,需要联系平台支持。 diff --git a/docs/manual/web/index.md b/docs/manual/web/index.md new file mode 100644 index 0000000..92f92e3 --- /dev/null +++ b/docs/manual/web/index.md @@ -0,0 +1,90 @@ +# Web 端使用手册 + +本手册面向 iotLCM Web 管理平台的企业客户,说明登录平台后各页面的入口、信息含义和常用操作。 + +::: info 权限说明 +平台按企业、角色和用户分配权限。左侧菜单、页面按钮可能因企业实际授权不同而不同;看不到某项功能时,先联系本企业管理员确认角色权限。按钮以页面实际显示为准。 +::: + +## 登录平台 + +![iotLCM 管理平台登录页面](/images/manual/login-page.png) + +1. 访问 [iotLCM 管理平台](https://iotlcm.example.com/)。 +2. 输入平台分配的账号和密码登录。 +3. 首次登录后建议立即修改初始密码,并确认绑定的手机号、邮箱是否正确。 +4. 登录后通过左侧菜单进入业务页面;顶部标签可在已打开页面间切换。 + +若提示账号停用、密码错误或无可用菜单,请联系本企业管理员;企业管理员无法处理时,可通过工单联系平台支持。 + +## 功能地图(部分开放) + +| 菜单 | 页面 | 主要用途 | +| --- | --- | --- | +| 顶级菜单 | 首页 | 查看卡量、用量、生命周期和预警概览 | +| 通讯管理 | 业务受理 | 批量办理套餐、数据服务、生命周期和预警业务 | +| 通讯管理 | 卡信息 | 查询卡、查看套餐和会话、同步状态与用量 | +| 通讯管理 | 达量断网 | 查询、编辑和导出单卡达量断网配置 | +| 通讯管理 | 智能诊断 | 按 MSISDN、ICCID 或 IMSI 一键排查卡和网络状态 | +| 企业管理 | 企业信息 | 维护本企业基础资料和实名认证资料 | +| 企业管理 | 用户管理 | 管理本企业用户及其角色 | +| 企业管理 | 角色管理 | 配置角色菜单权限和状态 | +| 企业管理 | 企业客户 | 管理直属企业客户、登录账号和企业资料 | +| 工单管理 | 我的工单 | 创建工单、沟通、跟踪处理和评价 | +| 工单管理 | 工单记录 | 查询工单的状态变更与操作轨迹 | +| 顶级菜单 | 我的 API 凭证 | 查看并复制本企业接口凭证 | +| 顶级菜单 | 执行日志 | 跟踪批量任务结果及逐卡失败原因 | + +“工单问题沟通”是从“我的工单”进入的详情页面,不在左侧单独显示。 + +## 推荐使用流程 + +### 日常查卡 + +1. 进入“通讯管理 → 卡信息”。 +2. 用 MSISDN、ICCID、IMSI 或 IMEI 查询目标卡。 +3. 打开“查看”,核对卡状态、套餐、用量、到期时间和同步时间。 +4. 数据较旧时使用“同步用量”或“同步状态”,再刷新查看。 + +![卡信息同步操作示意图](/images/manual/card-info-sync-actions.png) + +### 排查不能联网 + +1. 从卡详情点击“诊断”,或进入“通讯管理 → 智能诊断”。 + + ![从卡详情进入智能诊断](/images/manual/card-detail-diagnosis-entry-new.png) + + ![从通讯管理进入智能诊断](/images/manual/intelligent-diagnosis-entry-new.jpg) + +2. 输入卡号并执行“一键诊断”。 + + ![输入卡号并执行一键诊断](/images/manual/intelligent-diagnosis-submit.jpg) + +3. 依次查看 SIM 卡状态、通信服务、实时流量、策略限制和网络连接。 + + ![智能诊断结果页面](/images/manual/intelligent-diagnosis-result.png) + +4. 仍无法定位时创建工单,并附上卡号、故障时间、诊断结果和终端现象。 + + ![进入我的工单并创建工单](/images/manual/work-order-create-entry-new.jpg) + + ![填写创建工单信息](/images/manual/work-order-create-form-new.jpg) + +### 办理批量业务(暂未开放) + +1. 进入“通讯管理 → 业务受理”,选择已授权的业务。 +2. 下载最新 Excel 模板,或使用批量输入、连续号段方式提交卡号。 +3. 对需要预处理的业务先核对有效数量、失败项、套餐、价格和生效方式。 +4. 确认提交后记录批次号。 +5. 进入“执行日志”按批次号查看最终结果。 + +## 阅读指引 + +- [首页与通用操作](./home):了解查询、重置、导出和数据刷新规则。 +- [卡信息](./card-info):了解卡列表字段、卡详情和会话信息。 +- [智能诊断](./intelligent-diagnosis):了解入口、诊断步骤和结果判断。 +- [业务受理与达量断网](./business-operations):了解批量业务及达量断网配置。 +- [企业、用户与角色](./enterprise-management):了解组织和账号权限管理。 +- [工单管理](./work-orders):了解问题提交、沟通、关闭和评价。 +- [API 凭证与执行日志](./api-and-logs):了解凭证保管和批次追踪。 +- [常见问题](./faq):快速排查菜单、数据、任务和诊断问题。 diff --git a/docs/manual/web/intelligent-diagnosis.md b/docs/manual/web/intelligent-diagnosis.md new file mode 100644 index 0000000..e2f5c48 --- /dev/null +++ b/docs/manual/web/intelligent-diagnosis.md @@ -0,0 +1,71 @@ +# 智能诊断 + +## 入口 + +有两种进入方式: + +1. 左侧菜单 → **通讯管理 → 智能诊断**。 + + ![从左侧菜单进入智能诊断](/images/manual/intelligent-diagnosis-menu.png) + +2. 左侧菜单 → **通讯管理 → 卡信息** → 找到目标卡 → “查看” → “诊断”。第二种方式会自动带入 ICCID 并开始查询。 + + ![从卡详情进入智能诊断](/images/manual/card-detail-diagnosis-entry-attachment.png) + +## 开始诊断 + +1. 输入 MSISDN、ICCID 或 IMSI 任一完整标识。 +2. 点击“一键诊断”。 +3. 等待页面提示“诊断完成”。不同上游能力返回速度可能不同,请勿连续重复点击。 +4. 展开各诊断模块查看状态、详细字段和提示。 + +诊断完成后,页面顶部显示 MSISDN、ICCID、IMSI 和实时 IMEI;下方同时查询近 7 天、近 30 天和近 6 个月的流量趋势。 + +![智能诊断输入卡号并执行一键诊断](/images/manual/intelligent-diagnosis-submit-button.png) + +## 诊断结果 + +![智能诊断结果总览](/images/manual/intelligent-diagnosis-result-attachment.png) + +### SIM 卡状态 + +关注卡状态、停机原因、是否冻结、冻结原因和冻结操作时间。若卡处于停机、冻结、待激活或销户状态,应先处理卡生命周期问题,再排查终端网络。 + +### 通信服务 + +关注 APN、IPv4、IPv6、通信服务状态、在线状态、会话状态、会话建立时间、接入方式和实时 IMEI。 + +- 通信服务关闭时,需先办理开通或复机。 +- 没有会话时,检查设备是否开机、天线和信号是否正常、APN 是否正确。 +- 实时 IMEI 与预期设备不一致时,确认是否换机、换卡或发生机卡分离。 + +### 实时流量 + +展示已用流量、剩余流量和同步时间。历史趋势用于判断设备是否持续上报、是否出现突增或长时间无流量。 + +### 策略限制 + +展示区域限制订购、触发状态、限制区域和人联网访问限制等。卡和设备均正常但仍无法联网时,应重点检查此模块。 + +### 网络连接 + +展示开关机状态、设备状态和机卡绑定状态。出现关机、设备异常或机卡分离时,优先在终端侧核查供电、信号、插卡和绑定关系。 + +## 推荐排查顺序 + +1. **卡是否可用:** 卡状态、冻结和停机原因。 +2. **服务是否开启:** 数据通信服务和套餐是否有效。 +3. **流量是否充足:** 剩余流量、达量限制和到期时间。 +4. **策略是否限制:** 区域、人联网及其他策略。 +5. **设备是否在线:** 开关机、设备状态、会话和实时 IMEI。 +6. **趋势是否异常:** 对比近 7 天、30 天、6 个月流量。 + +## 结果提示说明 + +- **查询成功但未返回数值:** 上游已响应,但本次没有可展示的数据;结合同步时间和其他模块判断。 +- **未查询到会话:** 当前没有在线数据会话,可稍后重试并检查终端。 +- **运营商暂不支持/不支持查询:** 当前通道没有对应实时查询能力,不代表卡一定异常。 +- **查询暂时未完成:** 可能是上游忙、缓存或接口超时,稍后重试。 +- **系统无记录:** 先检查卡号是否完整以及卡是否归属当前企业。 + +需要提交工单时,建议附上诊断时间、完整 ICCID、异常模块、终端所在地、设备指示灯或日志,以及问题首次出现时间。 diff --git a/docs/manual/web/work-orders.md b/docs/manual/web/work-orders.md new file mode 100644 index 0000000..cc37410 --- /dev/null +++ b/docs/manual/web/work-orders.md @@ -0,0 +1,61 @@ +# 工单管理 + +## 我的工单 + +**入口:** 左侧菜单 → **工单管理 → 我的工单**。 + +![我的工单页面入口](/images/manual/work-orders-entry.png) + +可按工单编号、工单类型和当前处理状态查询。列表显示工单编号、类型、标题、关联业务号、创建人、当前状态、首次响应时间和创建时间。 + +常见状态包括已分派、处理中、已解决和已完结;取消后的工单也会保留记录。 + +## 创建工单 + +1. 点击“创建工单”。 +2. 选择工单类型,如卡问题、套餐问题、订单问题、系统问题或其他问题。 +3. 填写关联业务 ID。卡问题建议填写完整 ICCID,并在问题描述中补充 MSISDN。 +4. 填写清晰的工单标题和问题描述。 +5. 按需上传截图、日志或结果文件。 +6. 核对创建人信息后提交。 + +问题描述建议包含:发生时间、影响范围、卡号、设备所在地、预期结果、实际现象、已执行的同步或诊断操作。不要在附件中上传 API 密钥、账号密码等敏感信息。 + +![创建工单表单](/images/manual/work-order-create-form-attachment.png) + +## 沟通与处理 + +点击工单右侧“沟通”;工单已结束时按钮显示为“查看”。工单问题沟通页会显示历史消息、附件、工单信息和处理轨迹。 + +![工单沟通入口](/images/manual/work-order-communication-entry.png) + +- 在输入区填写回复内容,或按权限上传附件后发送。 +- 平台回复后可继续补充信息,尽量在同一工单中保持上下文完整。 +- 有转单权限时,可把工单转交其他处理方。 +- 问题确认解决后可执行“解决”;不再需要处理时可“取消”。 +- 工单完成后可“关闭”,并按 1 至 5 分提交满意度和评价内容。 + +![工单沟通与处理操作](/images/manual/work-orders-communication.png) + +![已关闭工单的服务评价入口](/images/manual/work-orders-closed-evaluation.png) + +按钮是否出现取决于工单当前状态和用户权限。已完结或已取消的工单通常只能查看。 + +## 工单记录 + +**入口:** 左侧菜单 → **工单管理 → 工单记录**。 + +![工单记录页面入口](/images/manual/work-orders-records-entry.png) + +该页面用于审计工单流转,可按工单编号和操作类型查询。主要字段包括操作类型、操作机构、操作用户、目标部门、目标用户、变更前状态和变更后状态。 + +常见操作类型为创建、分派、处理、完成、关单和取消。需要核对“谁在何时改变了工单状态”时,以此页面记录为准;如已授权,可查看详情或导出当前查询结果。 + +## 何时新建工单 + +- 同一张卡完成状态同步和智能诊断后仍无法联网。 +- 批量任务在执行日志中失败,错误原因无法自行处理。 +- 套餐、费用或归属与实际业务不符。 +- 页面持续报错,且刷新或重新登录后仍可复现。 + +同一问题不要重复创建多个工单。补充信息应在原工单的沟通页继续发送。 diff --git a/docs/openapi/index.md b/docs/openapi/index.md new file mode 100644 index 0000000..70ad687 --- /dev/null +++ b/docs/openapi/index.md @@ -0,0 +1,23 @@ +--- +layout: home + +hero: + name: iotLCM OpenAPI + text: 接口文档 + tagline: 对接说明:鉴权方式、请求参数、响应结构与示例。 + actions: + - theme: brand + text: V3 接口(推荐) + link: /openapi/v3/ + - theme: alt + text: 旧版兼容接口 + link: /openapi/legacy/ + +features: + - title: 版本选型指引 + details: 新接入推荐使用 V3。V3 接口位于 /openapi/v3/query,通过 X-Access-Token 鉴权,调用时需在请求体中传入 token 接口返回的 appId(⚠️ 注意区分:appKey 用于获取 token,appId 由 token 接口返回并在后续调用中传入),数据权限按账号所属客户隔离;旧版兼容接口位于 /route/open,通过请求 body verify 入参鉴权,仅作为存量客户兼容保留。 + - title: V3 接口 + details: 鉴权、获取客户调用凭证、查询 SIM 卡信息、查询 SIM 流量限制、查询 SIM IMEI(单卡 / 批量)、查询 SIM 流量用量。 + - title: 旧版兼容接口 + details: 查询 SIM 详情、查询 SIM 账期用量、查询 SIM 历史月用量、查询 SIM 状态、查询 SIM 在线会话、查询卡列表信息。 +--- diff --git a/docs/openapi/legacy/index.md b/docs/openapi/legacy/index.md new file mode 100644 index 0000000..5862219 --- /dev/null +++ b/docs/openapi/legacy/index.md @@ -0,0 +1,133 @@ +--- +title: 概览与鉴权 +description: iotLCM 旧版兼容接口概览与鉴权说明 +outline: deep +--- + +# 概览与鉴权 + +本文档收录历史 `/route/open/*` 路径下仍在维护的兼容接口。鉴权通过请求体 `verify` 中的 `appId`、`password` 和 `timeStamp` 完成;`sign` 为历史兼容字段,当前服务不校验。 + +这些接口由 iotLCM OpenAPI 服务实现并提供,与 V3 接口同域(`api.iotlcm.example.com`),仅请求路径与鉴权方式不同。 + +## 服务地址 + +```text +https://api.iotlcm.example.com +``` + +完整请求 URL: + +```text +https://api.iotlcm.example.com/route/open/{接口名} +``` + +## 统一鉴权 + +以下各接口的“请求示例”均为完整 JSON 请求体,调用时请设置 `Content-Type: application/json`;`verify.sign` 可传空字符串 `""`。 + +所有接口通过请求体 `verify` 字段鉴权: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| appId | string | 用于唯一标识请求 | +| password | string | 密码 | +| timeStamp | string | 时间戳,`"" + System.currentTimeMillis()` | +| sign | string | 当前服务不校验,可传空字符串 `""`。 | + +### 历史签名规则(仅供参考) + +当前服务不要求计算签名,也无需提供 `accessKey`。以下为历史客户端示例中的签名算法,仅供维护已有签名逻辑时参考。 + +```text +appId={appId}&password={password}&timeStamp={timeStamp}&key={accessKey} +``` + +对拼接后的字符串计算 MD5,并将结果转为大写,即为 `sign`。`sign` 不参与签名计算;`accessKey` 仅用于签名,不放入请求体的 `verify` 字段。 + +## 统一返回结构 + +```json +{ + "status": 0, + "message": "", + "result": {} +} +``` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| status | number | 业务状态码,成功为 `0` | +| message | string | 错误或提示信息 | +| result | any | 业务数据 | + +## 公共字典 + +卡状态编码(适用于 `cardInfo`、`simStatus`、`queryCardInfoList` 响应中的 `statusId` / `statusCode` / `status`): + +| 编码 | 说明 | +| --- | --- | +| 1 | 库存 | +| 2 | 可测试 | +| 3 | 待激活 | +| 4 | 已激活 | +| 5 | 已停机 | +| 6 | 预销户 | +| 7 | 已销户 | +| 8 | 未知 | + +## 请求案例 + +以下为历史 Java 示例,保留原有 `verify` 块与 `sign` 的生成方式供参考。调用当前服务时,可直接设置 `verify.sign` 为 `""`,省略签名计算。 + +```java +// 服务器请求地址 +protected static String server_Ip = "https://api.iotlcm.example.com/route/open"; +// appId +public static String appId = null; +// 密钥密码 +public static String password = null; + +/** + * Sign 加密类 + */ +public static String getSign(Map map, String key) { + List list = new ArrayList<>(map.keySet()); + Collections.sort(list); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < list.size(); i++) { + String k = list.get(i); + String v = (String) map.get(k); + sb.append(k).append("=").append(v).append("&"); + } + String signstr = sb.append("key=").append(key).toString(); + String sign = MD5Util.MD5Encode(signstr).toUpperCase(); + return sign; +} + +public static void main(String[] args) { + Map map = new HashMap<>(); + Map parmap = new HashMap<>(); + Map verify = new HashMap<>(); + + String appId = "test"; + String password = "uhbhkh223123"; + String accessKey = "1234567896132"; + String timeStamp = "" + System.currentTimeMillis(); + + verify.put("password", password); + verify.put("appId", appId); + verify.put("timeStamp", timeStamp); + verify.put("sign", getSign(verify, accessKey)); + + parmap.put("type", "iccid"); + parmap.put("cardno", "89860423123123132135"); + + map.put("verify", verify); + map.put("Param", parmap); + + server_Ip += "/cardInfo"; + String result = HttpUtil.post(server_Ip, JSON.toJSONString(map)); + System.out.println(result); +} +``` diff --git a/docs/openapi/legacy/query.md b/docs/openapi/legacy/query.md new file mode 100644 index 0000000..3485d29 --- /dev/null +++ b/docs/openapi/legacy/query.md @@ -0,0 +1,389 @@ +--- +title: 查询类 +description: iotLCM 旧版兼容查询类接口 +outline: deep +--- + +# 查询类 + +## 查询 SIM 详情 + +```http +POST /route/open/cardInfo +``` + +简要描述:查询物联卡基础信息。 + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| type | string | 查询类型:`msisdn` / `iccid` / `imsi` / `vid` | +| cardno | string | 对应的查询值 | + +请求示例: + +```json +{ + "Param": { + "type": "iccid", + "cardno": "898604F4152391115474" + }, + "verify": { + "timeStamp": "1784097284347", + "password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc", + "appId": "YOUR_APP_ID", + "sign": "" + } +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| vid | string | 本地卡记录 ID | +| msisdn | string | MSISDN | +| iccid | string | ICCID | +| imsi | string | IMSI | +| imei | string | IMEI | +| deptName | string | 当前归属组织名称 | +| statusId | number | 状态编码,参考公共字典 | +| packageId | string | 当前套餐编码 | +| packageName | string | 当前套餐名称 | +| used | number | 当前周期已用流量,单位 MB | +| remaining | number | 当前周期剩余流量,单位 MB | +| type | string | 卡类型名称 | +| packetArr | array | 资费计划,未配置时返回 `null` | +| remark | string | 备注 | +| grouping | string | 分组,未配置时为空字符串 | +| deliverDate | string | 发货日期,未配置时为空字符串 | +| activateDate | string | 激活日期 | +| expireTime | string | 到期时间 | + +响应示例: + +```json +{ + "status": 0, + "message": "", + "result": { + "vid": "3933", + "msisdn": "1441543605474", + "iccid": "898604F4152391115474", + "imsi": "460087436015474", + "imei": "", + "deptName": "示例企业", + "statusId": 4, + "packageId": "yd-100m-3y", + "packageName": "每月100m3年", + "used": 0.875, + "remaining": 99.125, + "type": "", + "packetArr": null, + "remark": "测试卡", + "grouping": "", + "deliverDate": "", + "activateDate": "2026-06-01", + "expireTime": "2029-01-31 23:59:59" + } +} +``` + +## 查询 SIM 账期用量 + +```http +POST /route/open/simDataUsage +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| iccid | string | ICCID | + +请求示例: + +```json +{ + "Param": { + "iccid": "898604F4152391115474" + }, + "verify": { + "timeStamp": "1784097284347", + "password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc", + "appId": "YOUR_APP_ID", + "sign": "" + } +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| useUnit | string | 单位,当前为 `MB` | +| useAmount | number | 当前周期已用流量 | + +响应示例: + +```json +{ + "status": 0, + "message": "", + "result": { + "useUnit": "MB", + "useAmount": 0.875 + } +} +``` + +## 查询 SIM 历史月用量 + +```http +POST /route/open/simDataUsageMonthly +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| iccid | string | ICCID | +| dateTime | string | 查询月份,格式 `yyyyMM`(示例:`202509`) | + +请求示例: + +```json +{ + "Param": { + "iccid": "898604F4152391115474", + "dateTime": "202509" + }, + "verify": { + "timeStamp": "1784097284347", + "password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc", + "appId": "YOUR_APP_ID", + "sign": "" + } +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| useUnit | string | 单位,当前为 `MB` | +| useAmount | number | 指定月份用量 | + +响应示例: + +```json +{ + "status": 0, + "message": "", + "result": { + "useUnit": "MB", + "useAmount": 0 + } +} +``` + +## 查询 SIM 状态 + +```http +POST /route/open/simStatus +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| iccid | string | ICCID | + +请求示例: + +```json +{ + "Param": { + "iccid": "898604F4152391115474" + }, + "verify": { + "timeStamp": "1784097284347", + "password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc", + "appId": "YOUR_APP_ID", + "sign": "" + } +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| statusMessage | string | 状态描述 | +| statusCode | number | 状态编码,参考公共字典 | + +响应示例: + +```json +{ + "status": 0, + "message": "", + "result": { + "statusMessage": "已激活", + "statusCode": 4 + } +} +``` + +## 查询 SIM 在线会话 + +```http +POST /route/open/simSession +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| iccid | string | ICCID | + +请求示例: + +```json +{ + "Param": { + "iccid": "898604F4152391115474" + }, + "verify": { + "timeStamp": "1784097284347", + "password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc", + "appId": "YOUR_APP_ID", + "sign": "" + } +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| typeName | string | 运营商系统类型,未上报时为空字符串 | +| imei | string | IMEI,未上报时为空字符串 | +| statusMessage | string | 状态描述,未上报时为空字符串 | +| statusCode | number | 状态码,未上报时为 `0` | +| data | object | 会话详情 | + +`data` 字段: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| apnId | string | APN ID | +| rat | string | 接入方式 | +| ipv6 | string | IPv6 地址 | +| ip | string | IPv4 地址 | +| ipv6Prefix | string | IPv6 前缀 | +| status | string | 在线状态 | +| createDate | string | 会话创建时间 | + +响应示例: + +```json +{ + "status": 0, + "message": "", + "result": { + "typeName": "", + "imei": "", + "statusMessage": "", + "statusCode": 0, + "data": { + "apnId": "", + "rat": "", + "ipv6": "", + "ip": "", + "ipv6Prefix": "", + "status": "", + "createDate": "" + } + } +} +``` + +## 查询卡列表信息 + +```http +POST /route/open/queryCardInfoList +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| iccid | `array` | ICCID 列表,最多支持 100 个 | + +请求示例: + +```json +{ + "Param": { + "iccid": [ + "898604F4152391115473", + "898604F4152391115474" + ] + }, + "verify": { + "timeStamp": "1784097284347", + "password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc", + "appId": "YOUR_APP_ID", + "sign": "" + } +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| iccid | string | ICCID | +| activateDate | string | 激活日期 | +| dueExpireTime | string | 到期时间 | +| imei | string | IMEI | +| imsi | string | IMSI | +| msisdn | string | MSISDN | +| type | string | 卡类型 | +| remarks | string | 备注 | +| status | number | 状态编码,参考公共字典 | + +响应示例: + +```json +{ + "status": 0, + "message": "", + "result": [ + { + "iccid": "898604F4152391115473", + "activateDate": "2023-05-11", + "dueExpireTime": "", + "imei": "", + "imsi": "460087436015473", + "msisdn": "1441543605473", + "type": "", + "remarks": "测试卡", + "status": 4 + }, + { + "iccid": "898604F4152391115474", + "activateDate": "2026-06-01", + "dueExpireTime": "2029-01-31 23:59:59", + "imei": "", + "imsi": "460087436015474", + "msisdn": "1441543605474", + "type": "", + "remarks": "测试卡", + "status": 4 + } + ] +} +``` diff --git a/docs/openapi/operator/index.md b/docs/openapi/operator/index.md new file mode 100644 index 0000000..fca39c0 --- /dev/null +++ b/docs/openapi/operator/index.md @@ -0,0 +1,14 @@ +--- +title: 共享 Token 接口概览 +description: 共享 Token 接口与白名单转发说明 +outline: deep +--- + +# 共享 Token 接口概览 + +本目录包含共享 Token 获取接口和白名单转发说明。 + +## 接口文档 + +- [共享 Token 接口](./shared-token/) +- [白名单转发](./mobile-v5/) diff --git a/docs/openapi/operator/mobile-v5/index.md b/docs/openapi/operator/mobile-v5/index.md new file mode 100644 index 0000000..00b3af0 --- /dev/null +++ b/docs/openapi/operator/mobile-v5/index.md @@ -0,0 +1,138 @@ +--- +title: 白名单转发 +description: 通过 api.iotlcm.example.com 访问中国移动物联网能力开放平台 V5 接口 +outline: deep +--- + +# 白名单转发 + +本目录说明如何通过 `api.iotlcm.example.com` 访问中国移动物联网能力开放平台 V5 接口。平台仅提供安全代理转发,不改变中国移动 V5 接口的请求方法、请求参数、响应结构和业务语义。 + +## 服务地址 + +客户侧统一使用: + +```text +https://api.iotlcm.example.com +``` + +V5 接口的请求路径保持与中国移动官方接口一致,将官方域名替换为平台域名即可: + +```text +https://api.iotlcm.example.com/v5/{官方接口路径} +``` + +例如,官方接口路径为 `/v5/ec/query/sim-basic-info` 时,客户侧请求路径为: + +```http +POST https://api.iotlcm.example.com/v5/ec/query/sim-basic-info +``` + +平台会将该请求转发至: + +```text +https://api.iot.10086.cn/v5/ec/query/sim-basic-info +``` + +> [!IMPORTANT] 使用 POST 时务必携带 JSON 请求体 +> 中国移动 V5 接口对 `POST` 只接受 JSON 格式。通过代理请求时必须设置 +> `Content-Type: application/json`,并在请求体中传入参数; +> 未带该请求头或使用表单编码(`application/x-www-form-urlencoded`)会返回 +> `{"status":"11012","message":"POST请求仅支持JSON格式","result":[]}`。 +> +> 若使用 `GET`,则以 Query 参数传参,无需设置 `Content-Type`。 + +## 调用前准备 + +调用 V5 业务接口前,需要先从平台取得以下信息: + +| 参数 | 说明 | +| --- | --- | +| `appid` | 第三方应用唯一标识 | +| `password` | 应用密钥 | +| `transid` | 按官方规则生成的事务编码 | +| `token` | 通过共享 Token 接口获取的运营商令牌 | + +其中 `transid` 由客户生成,通常遵循 `appid + YYYYMMDDHHMISS + 8位数字序列`;中国移动通常不校验此事务编号。具体规则及字段约束以中国移动当前发布的接口文档为准。 + + + +## 业务接口示例 + +以下接口字段摘自中国移动 V5 接口清单,用于说明代理路径的写法。完整接口、字段、错误码和版本变更请以官方文档为准。 + +### 单卡基本信息查询 + +```http +POST https://api.iotlcm.example.com/v5/ec/query/sim-basic-info +``` + +请求参数: + +| 参数 | 类型 | 说明 | +| --- | --- | --- | +| `transid` | string | 事务编码 | +| `token` | string | V5 Token | +| `msisdn` | string | 物联卡号码 | +| `iccid` | string | ICCID;与 `msisdn`、`imsi` 按官方规则选择 | +| `imsi` | string | IMSI | + +请求示例: + +```json +{ + "transid": "YOUR_TRANSID", + "token": "YOUR_ACCESS_TOKENf3515b3bdaeca904dd2e904061b65e8153", + "iccid": "898608501624D0000009" +} +``` + +响应主要字段: + +| 参数 | 类型 | 说明 | +| --- | --- | --- | +| `status` | string | `0` 表示成功,非 `0` 表示失败 | +| `message` | string | 错误或提示信息 | +| `result` | array | 查询结果 | +| `result[].msisdn` | string | 物联卡号码 | +| `result[].iccid` | string | ICCID | +| `result[].imsi` | string | IMSI | +| `result[].activeDate` | string | 首次激活日期 | +| `result[].openDate` | string | 开卡时间 | + +响应示例: + +```json +{ + "status": "0", + "message": "正确", + "result": [ + { + "msisdn": "1442206200009", + "imsi": "460240406200009", + "iccid": "898608501624D0000009", + "activeDate": "2025-03-26 15:49:50", + "openDate": "2025-03-13 16:52:10", + "remark": "" + } + ] +} +``` + + + +## 请求与响应约定 + +- V5 接口支持的请求方法、参数位置(Query 或 Form)、参数格式和字段大小写均以中国移动官方文档为准。 +- `GET` 与 `POST` 均可通过本代理访问。使用 `POST` 时**必须**设置 `Content-Type: application/json` 并携带 JSON 请求体,否则返回 `11012`;使用表单编码亦不被接受。 +- 代理会以平台固定出口地址访问中国移动,因此客户端侧的来源 IP 无需加入中国移动白名单;请勿在请求中自行添加 `X-Forwarded-For`、`X-Real-IP` 等来源标识请求头,中国移动会依据其判定 IP 鉴权,携带非白名单地址将返回 `12003`。 +- 平台不将 V5 响应包装成 iotLCM V3 的 `code/message/data` 结构,客户应直接按照中国移动 V5 响应结构解析。 +- 运营商 Token 具有有效期,收到 Token 失效类错误后应重新获取,不建议长期缓存。 + +## 官方资料 + +接口完整清单、参数定义、返回示例、错误码和 SDK 示例请参阅: + +[中国移动物联网能力开放平台 V5 接口文档下载页面](https://api.iot.10086.cn/api/index.html#/resourceCenter/docDownload) + +平台代理入口仅替换访问域名,不替代中国移动官方接口规范。 diff --git a/docs/openapi/operator/shared-token/index.md b/docs/openapi/operator/shared-token/index.md new file mode 100644 index 0000000..83c1272 --- /dev/null +++ b/docs/openapi/operator/shared-token/index.md @@ -0,0 +1,87 @@ +--- +title: 共享 Token 接口 +description: 共享 Token 接口说明 +outline: deep +--- + +# 共享 Token 接口 + +本接口用于获取平台已开放共享权限的移动运营商访问 Token。客户无需直接维护运营商应用密钥,平台根据客户已授权的通道配置完成校验并向运营商申请 Token。 + +## 服务地址 + +```text +https://api.iotlcm.example.com +``` + +HTTP(`http://api.iotlcm.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。 + +## 接口信息 + +```http +POST /openapi/v3/query/operator-token +``` + +请求头:`Content-Type: application/json`。 + +请求体: + +| 参数 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 平台分配的客户应用标识 | +| `chanKey` | string | 已开通共享 Token 权限的通道标识 | + +请求示例: + +```json +{ + "appId": "7s9g2p5n8z1d4m6r", + "chanKey": "channel_010" +} +``` + +响应中的 `data.accessToken` 用于调用移动运营商 V5 接口。Token 的有效期以 `data.tokenExpire` 为准,请勿将 Token 写入代码仓库或日志。 + +响应示例: +失败时,接口返回的 `data` 为 `{}`,不是 `null`;例如 `code=50` 表示平台侧获取运营商 Token 失败。 + +```json +{ + "code": 0, + "message": "", + "data": { + "chanAlias": "中国移动物联网", + "chanKey": "channel_010", + "accessToken": "YOUR_ACCESS_TOKENf3515b3bdaeca904dd2e904061b65e8153", + "tokenExpire": "2026-09-09 16:00:00" + }, + "error": null +} +``` + +## 字段说明 + +| 参数 | 类型 | 说明 | +| --- | --- | --- | +| `code` | number | 平台业务状态码,`0` 表示成功;`50` 表示平台侧获取运营商 Token 失败 | +| `message` | string | 错误或提示信息 | +| `data` | object | 成功时返回 Token 信息;失败时返回空对象 `{}`,不是 `null` | +| `data.chanAlias` | string | 通道名称 | +| `data.chanKey` | string | 通道标识 | +| `data.accessToken` | string | 移动运营商接口访问 Token | +| `data.tokenExpire` | string | Token 过期时间 | +| `error` | any | 错误详情;无错误时通常为 `null` | + +## 调用示例 + +```bash +curl --request POST \ + --url https://api.iotlcm.example.com/openapi/v3/query/operator-token \ + --header 'Content-Type: application/json' \ + --data '{ + "appId": "7s9g2p5n8z1d4m6r", + "chanKey": "channel_010" + }' +``` + +共享 Token 仅适用于已开通共享权限的通道。若通道未授权、客户应用标识与通道不匹配,或运营商 Token 获取失败,接口将返回失败信息。 diff --git a/docs/openapi/shared-operator-token.md b/docs/openapi/shared-operator-token.md new file mode 100644 index 0000000..5549f5f --- /dev/null +++ b/docs/openapi/shared-operator-token.md @@ -0,0 +1,10 @@ +--- +title: 共享 Token 接口 +description: 共享 Token 接口文档兼容入口 +sidebar: false +search: false +--- + +# 共享 Token 接口 + +文档已归档到运营商接口模块,请访问[共享 Token 接口](./operator/shared-token/)。 diff --git a/docs/openapi/v3/common.md b/docs/openapi/v3/common.md new file mode 100644 index 0000000..9bcdc65 --- /dev/null +++ b/docs/openapi/v3/common.md @@ -0,0 +1,344 @@ +--- +title: 业务类 +description: iotLCM V3 业务类接口 +outline: deep +--- + +# 业务类 + +## 服务地址 + +```text +https://api.iotlcm.example.com +``` + +HTTP(`http://api.iotlcm.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。 + +## 鉴权 + +先调用 `/openapi/v3/query/token` 获取访问令牌,再在请求头中传入 `X-Access-Token`。请求体中的 `appId` 必须与凭证所属客户一致。 + +## 统一返回结构 + +```json +{ + "code": 0, + "message": "", + "data": {}, + "error": null +} +``` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `code` | number | 业务状态码,成功为 `0` | +| `message` | string | 错误或提示信息 | +| `data` | object | 业务数据 | +| `error` | any | 错误详情 | + +## 单卡套餐续费 + +```http +POST /openapi/v3/change/sim-subscribe +``` + +单卡续费按串行方式执行,接口等待本卡处理完成后直接返回结果。 + +请求参数: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 客户组织编码 | +| `iccid` | string | ICCID | +| `msisdn` | string | MSISDN/卡号 | +| `imsi` | string | IMSI | +| `packageId` | string | 目标套餐编码 | +| `validity` | integer | 续费时长,单位为年,最小值为 `1` | +| `remark` | string | 续费备注 | + +> `iccid`、`msisdn`、`imsi` 至少传一个。 + +请求示例: + +```json +{ + "appId": "CUS-202608-0001", + "iccid": "89860401785462635152", + "packageId": "001", + "validity": 1, + "remark": "客户单卡续费" +} +``` + +响应字段: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `orderId` | string | 订单 ID | +| `orderSn` | string | 订单号 | +| `iccid` | string | 续费卡 ICCID | +| `planName` | string | 续费套餐名称 | +| `effectiveType` | string | 生效类型 | +| `effectiveDate` | string | 套餐生效日期 | +| `expireDate` | string | 套餐到期日期 | +| `amount` | number | 续费金额 | +| `status` | string | 续费状态,成功为 `success`,失败为 `failed` | +| `errorCode` | string | 失败时返回的错误编码 | +| `errorMessage` | string | 失败时返回的错误说明 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "orderId": "54", + "orderSn": "REN20260910153546001000001", + "iccid": "89860401785462635152", + "planName": "中移-1G", + "effectiveType": "immediate", + "effectiveDate": "2026-09-10 15:35:46", + "expireDate": "2027-09-10 15:35:46", + "amount": 0, + "status": "success" + }, + "error": null +} +``` + +失败时仍按统一返回结构返回 `data`,并通过 `status=failed` 和 `errorMessage` 说明失败原因。 + +```json +{ + "code": 0, + "message": "", + "data": { + "orderId": "0", + "orderSn": "", + "iccid": "89860401785462635152", + "planName": "", + "effectiveType": "", + "effectiveDate": "", + "expireDate": "", + "amount": 0, + "status": "failed", + "errorCode": "RENEW_FAILED", + "errorMessage": "卡片不存在或无权限" + }, + "error": null +} +``` + +## 单卡限额变更 + +```http +POST /openapi/v3/change/sim-traffic-cutoff +``` + +单卡配置按串行方式执行,接口等待本卡处理完成后直接返回配置结果。 + +请求参数: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 客户组织编码 | +| `iccid` | string | ICCID | +| `msisdn` | string | MSISDN/卡号 | +| `imsi` | string | IMSI | +| `trafficCutoffStatus` | integer | `0` 删除,`1` 开启,`2` 关闭 | +| `trafficCutoffThreshold` | number | 达量阈值,单位为 MB;开启时必须大于 `0` | +| `remark` | string | 配置备注 | + +> `iccid`、`msisdn`、`imsi` 三码至少传一个。trafficCutoffStatus=0 表示取消达量断网配置。 + +请求示例: + +```json +{ + "appId": "CUS-202608-0001", + "iccid": "89860401785462635152", + "trafficCutoffStatus": 1, + "trafficCutoffThreshold": 1024, + "remark": "客户开启达量断网" +} +``` + +响应字段: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `success` | boolean | 是否配置成功 | +| `iccid` | string | 平台卡 ICCID | +| `msisdn` | string | MSISDN | +| `imsi` | string | IMSI | +| `trafficCutoffStatus` | integer | `0` 删除,`1` 已开启,`2` 已关闭 | +| `trafficCutoffThreshold` | number | 达量阈值,单位为 MB | +| `trafficCutoffThresholdUnit` | string | 阈值单位,固定为 `MB` | +| `message` | string | 处理结果说明 | +| `errorCode` | string | 失败时的错误编码 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "success": true, + "iccid": "89860401785462635152", + "msisdn": "141****5152", + "imsi": "460045462635152", + "trafficCutoffStatus": 1, + "trafficCutoffThreshold": 1024, + "trafficCutoffThresholdUnit": "MB", + "message": "traffic cutoff configuration succeeded" + }, + "error": null +} +``` + +失败时仍返回同一响应结构,`success=false`,`message` 为失败原因。 + +```json +{ + "code": 0, + "message": "", + "data": { + "success": false, + "iccid": "89860401785462635152", + "trafficCutoffStatus": 1, + "trafficCutoffThreshold": 1024, + "trafficCutoffThresholdUnit": "MB", + "message": "卡片不存在或无权限", + "errorCode": "TRAFFIC_CUTOFF_FAILED" + }, + "error": null +} +``` + +## 物联网卡批量套餐续费 + +```http +POST /openapi/v3/change/batch-sim-subscribe +``` + +批量续费只创建异步批次,不等待所有卡执行完成。请保存响应中的 `batchNo`,再通过批次查询接口跟踪处理结果。 + +批量接口提交成功后只返回批次信息;卡片执行成功或失败请通过批次查询接口获取。 + +请求参数: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 客户组织编码 | +| `cards` | array | 续费卡列表 | +| `cards[].iccid` | string | ICCID | +| `cards[].msisdn` | string | MSISDN/卡号 | +| `cards[].imsi` | string | IMSI | +| `packageId` | string | 目标套餐编码 | +| `validity` | integer | 续费时长,单位为年 | +| `remark` | string | 续费备注 | + +> 每个 `cards[]` 明细中的`iccid`、`msisdn`、`imsi` 三码至少传一个。 + +请求示例: + +```json +{ + "appId": "CUS-202608-0001", + "cards": [ + { + "iccid": "89860401785462635152" + } + ], + "packageId": "001", + "validity": 1, + "remark": "客户批量续费" +} +``` + +响应字段: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `batchNo` | string | 系统生成的续费批次号 | +| `batchType` | integer | 批次类型,续费为 `101` | +| `total` | integer | 提交的卡数量 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "batchNo": "REN20260910153546001000002", + "batchType": 101, + "total": 1 + }, + "error": null +} +``` + +## 物联网卡批量限额变更 + +```http +POST /openapi/v3/change/batch-sim-traffic-cutoff +``` + +批量配置只创建异步批次,不等待所有卡执行完成。请保存响应中的 `batchNo`,再通过批次查询接口跟踪处理结果。 + +批量接口提交成功后只返回批次信息;卡片执行成功或失败请通过批次查询接口获取。 + +请求参数: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 客户组织编码 | +| `cards` | array | 配置卡列表,单次最多 1000 张 | +| `cards[].iccid` | string | ICCID | +| `cards[].msisdn` | string | MSISDN/卡号 | +| `cards[].imsi` | string | IMSI | +| `trafficCutoffStatus` | integer | `0` 删除,`1` 开启,`2` 关闭 | +| `trafficCutoffThreshold` | number | 达量阈值,单位为 MB;开启时必须大于 `0` | +| `remark` | string | 配置批次备注 | + +> 每个 `cards[]` 明细中的`iccid`、`msisdn`、`imsi` 三码至少传一个。`trafficCutoffStatus=0`时表示取消达量断网配置。 + +请求示例: + +```json +{ + "appId": "CUS-202608-0001", + "cards": [ + { + "iccid": "89860401785462635152" + } + ], + "trafficCutoffStatus": 1, + "trafficCutoffThreshold": 1024, + "remark": "客户批量开启达量断网" +} +``` + +响应字段: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `batchNo` | string | 系统生成的达量断网配置批次号 | +| `batchType` | integer | 批次类型,达量断网配置为 `41` | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "batchNo": "TCC20260910153546001000001", + "batchType": 41 + }, + "error": null +} +``` diff --git a/docs/openapi/v3/index.md b/docs/openapi/v3/index.md new file mode 100644 index 0000000..19ef818 --- /dev/null +++ b/docs/openapi/v3/index.md @@ -0,0 +1,79 @@ +--- +title: 概览与鉴权 +description: iotLCM V3 接口概览与鉴权说明 +outline: deep +--- + +# 概览与鉴权 + +## 服务地址 + +```text +https://api.iotlcm.example.com +``` + +HTTP(`http://api.iotlcm.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。 + +## 统一返回结构 + +V3 返回格式: + +```json +{ + "code": 0, + "message": "", + "data": {}, + "error": null +} +``` + +字段说明: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| code | number | 业务状态码,成功为 `0` | +| message | string | 错误或提示信息 | +| data | object | 业务数据 | +| error | any | 错误信息字段 | + +## 公共字典 + +卡状态编码 + +| 编码 | 说明 | +| :-: | :-: | +| 0 | 未知 | +| 1 | 待激活 | +| 2 | 已激活 | +| 4 | 停机 | +| 6 | 可测试 | +| 7 | 库存 | +| 8 | 预销户 | +| 9 | 已销户 | + +## V3 鉴权 + +V3 路由前缀: + +```text +/openapi/v3/query +/openapi/v3/change +``` + +文档中的“请求示例”仅展示请求 body;调用 V3 POST 接口时,请设置 `Content-Type: application/json` 并将示例 JSON 作为请求体发送。请求路径和鉴权请求头见各接口说明。 + +除获取 token 接口外,其他 V3 接口需要请求头: + +```http +X-Access-Token: {accessToken} +``` + +也支持传入带 `Bearer ` 前缀的值,服务端会去掉前缀。 + +::: info 重要:请求体中的 appId 必须正确 +先调用 `/openapi/v3/query/token` 获取 token,接口响应中会返回 `data.appId`(客户组织编码,格式如 `CUS-202601-0001`)。**后续调用所有 V3 接口时,请求体都必须传入这个 `appId` 值**,且要与 token 所属的客户组织匹配,否则返回 `code: 61 "登录已过期"`。 + +⚠️ **不要把 `appKey`(API 账号标识)当成 `appId` 使用。** `appKey` 只用于获取 token。 +::: + +权限控制:调用接口需具备对应接口资源的访问权限,权限与 API 账号所属权限组关联。未配置资源时,按当前开放策略放行。 diff --git a/docs/openapi/v3/query.md b/docs/openapi/v3/query.md new file mode 100644 index 0000000..bf04327 --- /dev/null +++ b/docs/openapi/v3/query.md @@ -0,0 +1,783 @@ +--- +title: 查询类 +description: iotLCM V3 查询类接口 +outline: deep +--- + +# 查询类 + +## 单卡基本信息查询 + +```http +POST /openapi/v3/query/sim-info +``` + +请求头: + +```http +X-Access-Token: {accessToken} +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| appId | string | 客户组织编码 | +| iccid | string | ICCID,`iccid`、`msisdn`、`imsi` 至少传一个 | +| msisdn | string | MSISDN | +| imsi | string | IMSI | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "iccid": "898604F4152391115474" +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `data.iccid` | string | ICCID | +| `data.msisdn` | string | MSISDN | +| `data.imsi` | string | IMSI | +| `data.imei` | string | IMEI | +| `data.username` | string | 当前归属客户/组织名称 | +| `data.location` | string | 归属地 | +| `data.planCategory` | string | 套餐分类 | +| `data.currentPlanName` | string | 当前套餐名称 | +| `data.plangroup` | string | 套餐分组,未配置时为空字符串 | +| `data.planid` | string | 当前套餐编码 | +| `data.appid` | string | 归属客户组织编码 | +| `data.allowPlanChange` | number | 是否允许改套餐,未启用时返回 `0` | +| `data.lastSyncTime` | string | 状态最后同步时间 | +| `data.accessType` | string | 接入方式 | +| `data.cardStatus` | string | 卡状态 | +| `data.cardType` | any | 卡类型 | +| `data.networkType` | any | 网络类型 | +| `data.activationDate` | string | 出库/激活相关日期 | +| `data.activeDate` | string | 当前套餐生效日期 | +| `data.validityPeriod` | number | 有效期,按月份计算 | +| `data.expiryDate` | string | 当前套餐到期日期 | +| `data.testPeriod` | number | 测试期,未启用时返回 `0` | +| `data.testPeriodExpiryDate` | any | 测试期到期时间,未启用时返回 `null` | +| `data.silentPeriod` | number | 沉默期,未启用时返回 `0` | +| `data.silentPeriodExpiryDate` | any | 沉默期到期时间,未启用时返回 `null` | +| `data.dataService` | number | 数据服务状态,`1` 启用,`0` 禁用 | +| `data.planData` | number | 套餐总流量,单位 MB | +| `data.usedData` | number | 已用流量,单位 MB | +| `data.remainingData` | string | 剩余流量,单位 MB | +| `data.smsService` | number | 短信服务状态 | +| `data.planSMS` | number | 套餐短信总量 | +| `data.usedSMS` | number | 已用短信数 | +| `data.remainingSMS` | string | 剩余短信数 | +| `data.voiceService` | number | 语音服务状态 | +| `data.planMinutes` | number | 套餐语音分钟数 | +| `data.usedMinutes` | number | 已用语音分钟数 | +| `data.remainingMinutes` | string | 剩余语音分钟数 | +| `data.internationalRoamingService` | number | 国际漫游服务状态 | +| `data.planInternationalData` | number | 国际漫游套餐流量 | +| `data.usedInternationalData` | number | 已用国际漫游流量 | +| `data.remainingInternationalData` | string | 剩余国际漫游流量 | +| `data.description` | any | 备注描述,未填写时返回 `null` | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "iccid": "898604F4152391115474", + "imei": "", + "username": "示例企业", + "location": "370100000000", + "planCategory": "移动小流量", + "currentPlanName": "每月100m3年", + "plangroup": "", + "planid": "yd-100m-3y", + "appid": "CUS-202601-0001", + "allowPlanChange": 0, + "lastSyncTime": "2026-06-24 00:03:19", + "accessType": "", + "cardStatus": "已激活", + "cardType": "", + "networkType": "", + "activationDate": "2026-06-01", + "activeDate": "2026-06-01", + "validityPeriod": 32, + "expiryDate": "2029-01-31", + "testPeriod": 0, + "testPeriodExpiryDate": null, + "silentPeriod": 0, + "silentPeriodExpiryDate": null, + "dataService": 1, + "planData": 100, + "usedData": 0.875, + "remainingData": "99.1", + "smsService": 1, + "planSMS": 0, + "usedSMS": 0, + "remainingSMS": "0", + "voiceService": 1, + "planMinutes": 0, + "usedMinutes": 0, + "remainingMinutes": "0", + "internationalRoamingService": 0, + "planInternationalData": 0, + "usedInternationalData": 0, + "remainingInternationalData": "0.0", + "description": null + }, + "error": null +} +``` + + +## 单卡状态信息查询 + +```http +POST /openapi/v3/query/sim-status +``` + +请求头: + +```http +X-Access-Token: {accessToken} +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | token 返回的客户组织编码 | +| `iccid` | string | ICCID;与 `msisdn`、`imsi` 至少传一个 | +| `msisdn` | string | MSISDN | +| `imsi` | string | IMSI | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "iccid": "898604F4152391115474" +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `code` | number | 业务状态码,成功为 `0` | +| `message` | string | 错误或提示信息 | +| `data.iccid` | string | ICCID,查询命中时返回 | +| `data.lifeCycle` | number | 卡生命周期状态编码 | +| `data.lifeCycleName` | string | 卡生命周期状态文字 | +| `error` | any | 错误信息字段 | + +响应示例(查询命中): + +```json +{ + "code": 0, + "message": "", + "data": { + "iccid": "898604F4152391115474", + "lifeCycle": 2, + "lifeCycleName": "已激活" + }, + "error": null +} +``` + +响应示例(未命中): + +```json +{ + "code": 50, + "message": "查询sim卡信息失败,请确认ICCID,MSISDN,IMSI是否正确", + "data": {}, + "error": null +} +``` + +`lifeCycleName` 为状态文字;`lifeCycle` 是此接口的状态编码,不要与其他接口或字典中的状态编码混用。 + +## 单卡流量限额查询 + +```http +POST /openapi/v3/query/sim-limit +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 客户组织编码 | +| `iccid` | string | ICCID | +| `msisdn` | string | MSISDN | +| `imsi` | string | IMSI | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "iccid": "898604F4152391115474" +} +``` + +响应字段: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `data.trafficCutoffStatus` | integer | 达量断网状态:`0` 未配置、`1` 已开启、`2` 已关闭 | +| `data.trafficCutoffName` | string | 状态名称,返回 `未配置`、`已开启` 或 `已关闭` | +| `data.trafficCutoffThreshold` | number | 达量断网阈值,单位 MB | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "trafficCutoffStatus": 1, + "trafficCutoffName": "已开启", + "trafficCutoffThreshold": 1024 + }, + "error": null +} +``` + +## 单卡实时终端 IMEI 查询 + +```http +POST /openapi/v3/query/sim-imei +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| appId | string | 客户组织编码 | +| iccid | string | ICCID | +| msisdn | string | MSISDN | +| imsi | string | IMSI | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "iccid": "898604F4152391115474" +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `data.imei` | string | IMEI | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "imei": "" + }, + "error": null +} +``` + +## 单卡本月流量使用量查询 + +```http +POST /openapi/v3/query/sim-usage +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| appId | string | 客户组织编码 | +| iccid | string | ICCID | +| msisdn | string | MSISDN | +| imsi | string | IMSI | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "iccid": "898604F4152391115474" +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `data.useUnit` | string | 流量单位,固定为 `MB` | +| `data.useAmount` | number | 当前周期已用流量 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "useUnit": "MB", + "useAmount": 0.875 + }, + "error": null +} +``` + +## 物联网卡批量状态信息查询 + +```http +POST /openapi/v3/query/sim-status-batch +``` + +单次最多查询 1000 张卡。每张卡至少提供 `iccid`、`msisdn`、`imsi` 中的一个;同一条记录提供多个标识时,必须对应同一张卡。 + +请求头: + +```http +X-Access-Token: {accessToken} +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | token 返回的客户组织编码,示例为 `CUS-202601-0001` | +| `cards` | array | 卡片标识列表;示例包含 3 张卡,单次最多 1000 项 | +| `cards[].iccid` | string | ICCID;示例中每项均使用 ICCID,实际调用时与 `msisdn`、`imsi` 至少传一个 | +| `cards[].msisdn` | string | MSISDN,可代替 ICCID 标识卡片 | +| `cards[].imsi` | string | IMSI,可代替 ICCID 标识卡片 | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "cards": [ + { + "iccid": "898604F4152391115473" + }, + { + "iccid": "898604F4152391115474" + }, + { + "iccid": "8986112223600594371" + } + ] +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `code` | number | 业务状态码,成功为 `0` | +| `message` | string | 错误或提示信息 | +| `data.total` | integer | 本次请求的卡片总数;示例为 `3` | +| `data.matchedCount` | integer | 匹配成功的卡片数量;示例为 `3` | +| `data.notFoundCount` | integer | 未匹配成功的卡片数量;示例为 `0` | +| `data.items` | array | 每张卡的查询结果;示例依次对应请求中的 3 张卡 | +| `data.items[].matched` | boolean | 是否匹配成功;示例中均为 `true` | +| `data.items[].iccid` | string | 匹配成功时返回的 ICCID | +| `data.items[].lifeCycle` | number | 匹配成功时返回的卡生命周期状态编码;示例中 `2` 为已激活 | +| `data.items[].lifeCycleName` | string | 匹配成功时返回的卡生命周期状态文字 | +| `data.items[].errorCode` | string | 匹配失败时返回的错误码;示例均匹配成功,因此未返回 | +| `data.items[].errorMessage` | string | 匹配失败时返回的错误说明;示例均匹配成功,因此未返回 | +| `error` | any | 错误信息字段 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "total": 3, + "matchedCount": 3, + "notFoundCount": 0, + "items": [ + { + "matched": true, + "iccid": "898604F4152391115473", + "lifeCycle": 2, + "lifeCycleName": "已激活" + }, + { + "matched": true, + "iccid": "898604F4152391115474", + "lifeCycle": 2, + "lifeCycleName": "已激活" + }, + { + "matched": true, + "iccid": "8986112223600594371", + "lifeCycle": 2, + "lifeCycleName": "已激活" + } + ] + }, + "error": null +} +``` + +## 物联网卡批量流量信息查询 + +```http +POST /openapi/v3/query/sim-usage-batch +``` + +单次最多查询 1000 张卡。请求体需传入 `appId` 和 `cards` 数组;数组中的每张卡至少提供 `iccid`、`msisdn`、`imsi` 中的一个。同一条记录提供多个标识时,必须对应同一张卡。 + +请求头: + +```http +X-Access-Token: {accessToken} +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | token 返回的客户组织编码 | +| `cards` | array | 卡片标识列表,单次最多 1000 项 | +| `cards[].iccid` | string | ICCID;每项与 `msisdn`、`imsi` 至少传一个 | +| `cards[].msisdn` | string | MSISDN,可代替 ICCID 标识卡片 | +| `cards[].imsi` | string | IMSI,可代替 ICCID 标识卡片 | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "cards": [ + { + "iccid": "898604F4152391115474" + }, + { + "iccid": "898604F4152391115473" + }, + { + "iccid": "8986112223600594371" + } + ] +} +``` + +响应结构(流量单位为 MB): + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `code` | number | 业务状态码,成功为 `0` | +| `message` | string | 错误或提示信息 | +| `data.total` | integer | 本次请求的卡片总数 | +| `data.matchedCount` | integer | 匹配成功的卡片数量 | +| `data.notFoundCount` | integer | 未匹配成功的卡片数量 | +| `data.items` | array | 每张卡的查询结果 | +| `data.items[].matched` | boolean | 是否匹配成功 | +| `data.items[].iccid` | string | 匹配成功时返回的 ICCID | +| `data.items[].useUnit` | string | 流量单位,示例为 `MB` | +| `data.items[].useAmount` | number | 流量使用量 | +| `data.items[].errorCode` | string | 匹配失败时返回的错误码;匹配成功时不返回 | +| `data.items[].errorMessage` | string | 匹配失败时返回的错误说明;匹配成功时不返回 | +| `error` | any | 错误信息字段 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "total": 3, + "matchedCount": 3, + "notFoundCount": 0, + "items": [ + { + "matched": true, + "iccid": "898604F4152391115474", + "useUnit": "MB", + "useAmount": 0.875 + }, + { + "matched": true, + "iccid": "898604F4152391115473", + "useUnit": "MB", + "useAmount": 12.5 + }, + { + "matched": true, + "iccid": "8986112223600594371", + "useUnit": "MB", + "useAmount": 36.25 + } + ] + }, + "error": null +} +``` + +## 物联网卡批量 IMEI 查询 + +```http +POST /openapi/v3/query/sim-imei-batch +``` + +单次最多查询 1000 张卡。每张卡至少提供 `iccid`、`msisdn`、`imsi` 中的一个;同一条记录提供多个标识时,必须对应同一张卡。 + +请求头: + +```http +X-Access-Token: {accessToken} +``` + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | token 返回的客户组织编码 | +| `cards` | array | 卡片标识列表,单次最多 1000 项 | +| `cards[].iccid` | string | ICCID;每项与 `msisdn`、`imsi` 至少传一个 | +| `cards[].msisdn` | string | MSISDN,可代替 ICCID 标识卡片 | +| `cards[].imsi` | string | IMSI,可代替 ICCID 标识卡片 | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "cards": [ + { + "iccid": "898604F4152391115474" + }, + { + "iccid": "898604F4152391115473" + }, + { + "msisdn": "1441543605474" + } + ] +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `code` | number | 业务状态码,成功为 `0` | +| `message` | string | 错误或提示信息 | +| `data.total` | integer | 本次请求的卡片总数 | +| `data.matchedCount` | integer | 匹配成功的卡片数量 | +| `data.notFoundCount` | integer | 未匹配成功的卡片数量 | +| `data.items` | array | 每张卡的查询结果,顺序与请求中的 `cards` 一致 | +| `data.items[].matched` | boolean | 是否匹配成功 | +| `data.items[].iccid` | string | 匹配成功时返回的 ICCID | +| `data.items[].imei` | string | IMEI;尚未采集到该卡 IMEI 时为空字符串 | +| `data.items[].errorCode` | string | 匹配失败时返回的错误码;匹配成功时不返回 | +| `data.items[].errorMessage` | string | 匹配失败时返回的错误说明;匹配成功时不返回 | +| `error` | any | 错误信息字段 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "total": 3, + "matchedCount": 2, + "notFoundCount": 1, + "items": [ + { + "matched": true, + "iccid": "898604F4152391115474", + "imei": "" + }, + { + "matched": true, + "iccid": "898604F4152391115473", + "imei": "865466070817587" + }, + { + "matched": false, + "imei": "", + "errorCode": "CARD_NOT_FOUND", + "errorMessage": "卡片不存在或无权限" + } + ] + }, + "error": null +} +``` + +## 物联网卡批量限额信息查询 + +```http +POST /openapi/v3/query/traffic-cutoff-config +``` + +根据卡片标识批量查询当前达量断网配置。`cards[]` 中的 `iccid`、`msisdn`、`imsi` 三码至少传一个。 + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 客户组织编码 | +| `cards` | array | 卡片标识列表 | +| `cards[].iccid` | string | ICCID | +| `cards[].msisdn` | string | MSISDN | +| `cards[].imsi` | string | IMSI | +| `includeUsage` | boolean | 是否返回套餐和流量使用信息 | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "cards": [ + { + "iccid": "898604F4152391115474" + }, + { + "iccid": "898604F4152391115475" + }, + { + "iccid": "898604F4152391115476" + } + ], + "includeUsage": true +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `data.total` | integer | 请求中的卡片数量 | +| `data.matchedCount` | integer | 匹配成功的卡片数量 | +| `data.notFoundCount` | integer | 未匹配成功的卡片数量 | +| `data.items` | array | 每张卡的查询结果 | +| `data.items[].matched` | boolean | 是否匹配成功 | +| `data.items[].iccid` | string | 平台返回的 ICCID | +| `data.items[].trafficCutoffStatus` | integer | 达量断网状态:`0` 未配置、`1` 已开启、`2` 已关闭 | +| `data.items[].trafficCutoffStatusName` | string | 达量断网状态名称 | +| `data.items[].trafficCutoffThreshold` | number | 达量断网阈值,单位 MB | +| `data.items[].trafficCutoffThresholdUnit` | string | 阈值单位,固定为 `MB` | +| `data.items[].packageTotalFlowMb` | number | 套餐总流量;`includeUsage=true` 时返回 | +| `data.items[].usedFlowMb` | number | 已用流量;`includeUsage=true` 时返回 | +| `data.items[].remainingFlowMb` | number | 剩余流量;`includeUsage=true` 时返回 | +| `data.items[].errorCode` | string | 匹配失败时返回 | +| `data.items[].errorMessage` | string | 匹配失败时返回 | + +响应示例: + +以下状态、阈值和流量数值用于展示批量响应结构,实际结果以接口查询为准。 + +```json +{ + "code": 0, + "message": "", + "data": { + "total": 3, + "matchedCount": 3, + "notFoundCount": 0, + "items": [ + { + "matched": true, + "iccid": "898604F4152391115474", + "trafficCutoffStatus": 0, + "trafficCutoffStatusName": "未配置", + "trafficCutoffThreshold": 0, + "trafficCutoffThresholdUnit": "MB", + "packageTotalFlowMb": 0, + "usedFlowMb": 18, + "remainingFlowMb": 0 + }, + { + "matched": true, + "iccid": "898604F4152391115475", + "trafficCutoffStatus": 1, + "trafficCutoffStatusName": "已开启", + "trafficCutoffThreshold": 100, + "trafficCutoffThresholdUnit": "MB", + "packageTotalFlowMb": 200, + "usedFlowMb": 80, + "remainingFlowMb": 120 + }, + { + "matched": true, + "iccid": "898604F4152391115476", + "trafficCutoffStatus": 2, + "trafficCutoffStatusName": "已关闭", + "trafficCutoffThreshold": 50, + "trafficCutoffThresholdUnit": "MB", + "packageTotalFlowMb": 100, + "usedFlowMb": 30, + "remainingFlowMb": 70 + } + ] + }, + "error": null +} +``` + +## 批次状态查询 + +```http +POST /openapi/v3/query/batch-status +``` + +根据指定批次号查询异步处理状态,支持续费、达量断网等异步批次。 + +请求参数: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `appId` | string | 客户组织编码 | +| `batchNo` | string | 异步 API 返回的批次号 | + +请求示例: + +```json +{ + "appId": "CUS-202601-0001", + "batchNo": "REN20260910153546001000001" +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `data.batchNo` | string | 请求中的批次号 | +| `data.batchAsyncStatus` | integer | 异步状态:`0` 已创建、`1` 待处理、`2` 处理中、`3` 成功、`4` 失败、`5` 部分成功 | + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "batchNo": "REN20260910153546001000001", + "batchAsyncStatus": 3 + }, + "error": null +} +``` + diff --git a/docs/openapi/v3/token.md b/docs/openapi/v3/token.md new file mode 100644 index 0000000..3979185 --- /dev/null +++ b/docs/openapi/v3/token.md @@ -0,0 +1,57 @@ +--- +title: 获取调用凭证 +description: 使用 appKey、appSecret 换取 V3 接口调用凭证 +outline: deep +--- + +# 获取调用凭证 + +```http +POST /openapi/v3/query/token +``` + +说明:使用 `appKey`、`appSecret` 换取接口调用凭证。 + +请求体: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| appKey | string | API 账号标识,在管理后台申请获取 | +| appSecret | string | API 密钥,在管理后台申请获取 | +| refresh | string | 是否刷新 token:`1` 强制生成新 token,`0` 或留空时尽量复用已有 token | + +请求示例: + +```json +{ + "appKey": "YOUR_APP_ID", + "appSecret": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc" +} +``` + +响应结构: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| data.appId | string | 客户组织编码,**后续所有接口请求体中都要传入此值** | +| data.accessToken | string | 接口调用凭证,后续放入 `X-Access-Token` | + +::: info 注意:appId ≠ appKey +- **`appKey`**(如 `SDYZ`)只用于获取 token,调用 `/openapi/v3/query/token` 后就不再需要 +- **`appId`**(如 `CUS-202601-0001`)由 token 接口返回,后续调用 sim-info 等接口时,请求体中的 `appId` 字段必须填这个值 +- 如果传错会导致 `code: 61 "登录已过期"` 错误 +::: + +响应示例: + +```json +{ + "code": 0, + "message": "", + "data": { + "appId": "CUS-202601-0001", + "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJ1IjoiZWE3ZjJiZGY5MjQyNDFkZjg3NGIwZDMzNmZkN2UzMzEiLCJleHAiOjE3ODQ3MDAyODB9.JiYK-CXdXQKKU0UNhNOqKX5Hzyk4lVMtIpunQJDxlBI" + }, + "error": null +} +``` diff --git a/docs/public/favicon.png b/docs/public/favicon.png new file mode 100644 index 0000000..c93fb6d Binary files /dev/null and b/docs/public/favicon.png differ diff --git a/docs/public/images/manual/api-credentials-entry.png b/docs/public/images/manual/api-credentials-entry.png new file mode 100644 index 0000000..4f7fc6a Binary files /dev/null and b/docs/public/images/manual/api-credentials-entry.png differ diff --git a/docs/public/images/manual/assign-role-to-user.png b/docs/public/images/manual/assign-role-to-user.png new file mode 100644 index 0000000..775f014 Binary files /dev/null and b/docs/public/images/manual/assign-role-to-user.png differ diff --git a/docs/public/images/manual/business-acceptance-entry.png b/docs/public/images/manual/business-acceptance-entry.png new file mode 100644 index 0000000..262c284 Binary files /dev/null and b/docs/public/images/manual/business-acceptance-entry.png differ diff --git a/docs/public/images/manual/business-operations-batch-threshold.png b/docs/public/images/manual/business-operations-batch-threshold.png new file mode 100644 index 0000000..4cd14c9 Binary files /dev/null and b/docs/public/images/manual/business-operations-batch-threshold.png differ diff --git a/docs/public/images/manual/card-detail-diagnosis-entry-attachment.png b/docs/public/images/manual/card-detail-diagnosis-entry-attachment.png new file mode 100644 index 0000000..7039a6c Binary files /dev/null and b/docs/public/images/manual/card-detail-diagnosis-entry-attachment.png differ diff --git a/docs/public/images/manual/card-detail-diagnosis-entry-new.png b/docs/public/images/manual/card-detail-diagnosis-entry-new.png new file mode 100644 index 0000000..d1f0fca Binary files /dev/null and b/docs/public/images/manual/card-detail-diagnosis-entry-new.png differ diff --git a/docs/public/images/manual/card-detail-tabs.png b/docs/public/images/manual/card-detail-tabs.png new file mode 100644 index 0000000..a45e0f7 Binary files /dev/null and b/docs/public/images/manual/card-detail-tabs.png differ diff --git a/docs/public/images/manual/card-info-main-entry.png b/docs/public/images/manual/card-info-main-entry.png new file mode 100644 index 0000000..af7962b Binary files /dev/null and b/docs/public/images/manual/card-info-main-entry.png differ diff --git a/docs/public/images/manual/card-info-more-actions.png b/docs/public/images/manual/card-info-more-actions.png new file mode 100644 index 0000000..40372f1 Binary files /dev/null and b/docs/public/images/manual/card-info-more-actions.png differ diff --git a/docs/public/images/manual/card-info-query-batch.jpg b/docs/public/images/manual/card-info-query-batch.jpg new file mode 100644 index 0000000..1af0033 Binary files /dev/null and b/docs/public/images/manual/card-info-query-batch.jpg differ diff --git a/docs/public/images/manual/card-info-query-single.jpg b/docs/public/images/manual/card-info-query-single.jpg new file mode 100644 index 0000000..f2f8533 Binary files /dev/null and b/docs/public/images/manual/card-info-query-single.jpg differ diff --git a/docs/public/images/manual/card-info-sync-actions.png b/docs/public/images/manual/card-info-sync-actions.png new file mode 100644 index 0000000..cce733e Binary files /dev/null and b/docs/public/images/manual/card-info-sync-actions.png differ diff --git a/docs/public/images/manual/card-info-view-entry.png b/docs/public/images/manual/card-info-view-entry.png new file mode 100644 index 0000000..c6e92af Binary files /dev/null and b/docs/public/images/manual/card-info-view-entry.png differ diff --git a/docs/public/images/manual/data-usage-cutoff-entry.png b/docs/public/images/manual/data-usage-cutoff-entry.png new file mode 100644 index 0000000..34e61d5 Binary files /dev/null and b/docs/public/images/manual/data-usage-cutoff-entry.png differ diff --git a/docs/public/images/manual/enterprise-customer-create-form.jpg b/docs/public/images/manual/enterprise-customer-create-form.jpg new file mode 100644 index 0000000..1bbf7ae Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-create-form.jpg differ diff --git a/docs/public/images/manual/enterprise-customer-delete-confirm.png b/docs/public/images/manual/enterprise-customer-delete-confirm.png new file mode 100644 index 0000000..ed3c4da Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-delete-confirm.png differ diff --git a/docs/public/images/manual/enterprise-customer-edit.png b/docs/public/images/manual/enterprise-customer-edit.png new file mode 100644 index 0000000..77670a3 Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-edit.png differ diff --git a/docs/public/images/manual/enterprise-customer-entry.jpg b/docs/public/images/manual/enterprise-customer-entry.jpg new file mode 100644 index 0000000..c81ee81 Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-entry.jpg differ diff --git a/docs/public/images/manual/enterprise-customer-manage.png b/docs/public/images/manual/enterprise-customer-manage.png new file mode 100644 index 0000000..441237f Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-manage.png differ diff --git a/docs/public/images/manual/enterprise-customer-reset-password.png b/docs/public/images/manual/enterprise-customer-reset-password.png new file mode 100644 index 0000000..1622b32 Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-reset-password.png differ diff --git a/docs/public/images/manual/enterprise-customer-role-match.png b/docs/public/images/manual/enterprise-customer-role-match.png new file mode 100644 index 0000000..4f58a88 Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-role-match.png differ diff --git a/docs/public/images/manual/enterprise-information-entry.png b/docs/public/images/manual/enterprise-information-entry.png new file mode 100644 index 0000000..f6fc357 Binary files /dev/null and b/docs/public/images/manual/enterprise-information-entry.png differ diff --git a/docs/public/images/manual/intelligent-diagnosis-entry-new.jpg b/docs/public/images/manual/intelligent-diagnosis-entry-new.jpg new file mode 100644 index 0000000..20ab851 Binary files /dev/null and b/docs/public/images/manual/intelligent-diagnosis-entry-new.jpg differ diff --git a/docs/public/images/manual/intelligent-diagnosis-menu.png b/docs/public/images/manual/intelligent-diagnosis-menu.png new file mode 100644 index 0000000..3528dcd Binary files /dev/null and b/docs/public/images/manual/intelligent-diagnosis-menu.png differ diff --git a/docs/public/images/manual/intelligent-diagnosis-result-attachment.png b/docs/public/images/manual/intelligent-diagnosis-result-attachment.png new file mode 100644 index 0000000..226afd2 Binary files /dev/null and b/docs/public/images/manual/intelligent-diagnosis-result-attachment.png differ diff --git a/docs/public/images/manual/intelligent-diagnosis-result.png b/docs/public/images/manual/intelligent-diagnosis-result.png new file mode 100644 index 0000000..addcdc6 Binary files /dev/null and b/docs/public/images/manual/intelligent-diagnosis-result.png differ diff --git a/docs/public/images/manual/intelligent-diagnosis-submit-button.png b/docs/public/images/manual/intelligent-diagnosis-submit-button.png new file mode 100644 index 0000000..451ab1c Binary files /dev/null and b/docs/public/images/manual/intelligent-diagnosis-submit-button.png differ diff --git a/docs/public/images/manual/intelligent-diagnosis-submit.jpg b/docs/public/images/manual/intelligent-diagnosis-submit.jpg new file mode 100644 index 0000000..673183b Binary files /dev/null and b/docs/public/images/manual/intelligent-diagnosis-submit.jpg differ diff --git a/docs/public/images/manual/login-page.png b/docs/public/images/manual/login-page.png new file mode 100644 index 0000000..68d7838 Binary files /dev/null and b/docs/public/images/manual/login-page.png differ diff --git a/docs/public/images/manual/mini-program-scan-photo-entry.png b/docs/public/images/manual/mini-program-scan-photo-entry.png new file mode 100644 index 0000000..3582b5f Binary files /dev/null and b/docs/public/images/manual/mini-program-scan-photo-entry.png differ diff --git a/docs/public/images/manual/mini-program/account-password-login.png b/docs/public/images/manual/mini-program/account-password-login.png new file mode 100644 index 0000000..3185eaa Binary files /dev/null and b/docs/public/images/manual/mini-program/account-password-login.png differ diff --git a/docs/public/images/manual/mini-program/card-details-account-data-v2.jpg b/docs/public/images/manual/mini-program/card-details-account-data-v2.jpg new file mode 100644 index 0000000..0bb20a1 Binary files /dev/null and b/docs/public/images/manual/mini-program/card-details-account-data-v2.jpg differ diff --git a/docs/public/images/manual/mini-program/card-details-traffic.png b/docs/public/images/manual/mini-program/card-details-traffic.png new file mode 100644 index 0000000..95b390a Binary files /dev/null and b/docs/public/images/manual/mini-program/card-details-traffic.png differ diff --git a/docs/public/images/manual/mini-program/card-details-v2.jpg b/docs/public/images/manual/mini-program/card-details-v2.jpg new file mode 100644 index 0000000..d82c346 Binary files /dev/null and b/docs/public/images/manual/mini-program/card-details-v2.jpg differ diff --git a/docs/public/images/manual/mini-program/card-details.png b/docs/public/images/manual/mini-program/card-details.png new file mode 100644 index 0000000..005ddca Binary files /dev/null and b/docs/public/images/manual/mini-program/card-details.png differ diff --git a/docs/public/images/manual/mini-program/card-diagnosis-v2.jpg b/docs/public/images/manual/mini-program/card-diagnosis-v2.jpg new file mode 100644 index 0000000..e22ee57 Binary files /dev/null and b/docs/public/images/manual/mini-program/card-diagnosis-v2.jpg differ diff --git a/docs/public/images/manual/mini-program/card-diagnosis.jpg b/docs/public/images/manual/mini-program/card-diagnosis.jpg new file mode 100644 index 0000000..9c704c9 Binary files /dev/null and b/docs/public/images/manual/mini-program/card-diagnosis.jpg differ diff --git a/docs/public/images/manual/mini-program/devices-list-account-data-v2.jpg b/docs/public/images/manual/mini-program/devices-list-account-data-v2.jpg new file mode 100644 index 0000000..9f0963b Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-list-account-data-v2.jpg differ diff --git a/docs/public/images/manual/mini-program/devices-list-account-data.jpg b/docs/public/images/manual/mini-program/devices-list-account-data.jpg new file mode 100644 index 0000000..3279d12 Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-list-account-data.jpg differ diff --git a/docs/public/images/manual/mini-program/devices-page.png b/docs/public/images/manual/mini-program/devices-page.png new file mode 100644 index 0000000..048a818 Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-page.png differ diff --git a/docs/public/images/manual/mini-program/devices-search-account-data-v2.jpg b/docs/public/images/manual/mini-program/devices-search-account-data-v2.jpg new file mode 100644 index 0000000..33f3d9b Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-search-account-data-v2.jpg differ diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-home.png b/docs/public/images/manual/mini-program/diagnosis-entry-from-home.png new file mode 100644 index 0000000..c4d15f0 Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-entry-from-home.png differ diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v2.png b/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v2.png new file mode 100644 index 0000000..ab72c27 Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v2.png differ diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-query.jpg b/docs/public/images/manual/mini-program/diagnosis-entry-from-query.jpg new file mode 100644 index 0000000..4dd79d9 Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-entry-from-query.jpg differ diff --git a/docs/public/images/manual/mini-program/diagnosis-manual-input.jpg b/docs/public/images/manual/mini-program/diagnosis-manual-input.jpg new file mode 100644 index 0000000..db93e4f Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-manual-input.jpg differ diff --git a/docs/public/images/manual/mini-program/diagnosis-manual-input.png b/docs/public/images/manual/mini-program/diagnosis-manual-input.png new file mode 100644 index 0000000..ac515df Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-manual-input.png differ diff --git a/docs/public/images/manual/mini-program/home-card-query.png b/docs/public/images/manual/mini-program/home-card-query.png new file mode 100644 index 0000000..40e8358 Binary files /dev/null and b/docs/public/images/manual/mini-program/home-card-query.png differ diff --git a/docs/public/images/manual/mini-program/login-entry-home.jpg b/docs/public/images/manual/mini-program/login-entry-home.jpg new file mode 100644 index 0000000..849ea24 Binary files /dev/null and b/docs/public/images/manual/mini-program/login-entry-home.jpg differ diff --git a/docs/public/images/manual/mini-program/login-page-entry.jpg b/docs/public/images/manual/mini-program/login-page-entry.jpg new file mode 100644 index 0000000..5f90472 Binary files /dev/null and b/docs/public/images/manual/mini-program/login-page-entry.jpg differ diff --git a/docs/public/images/manual/mini-program/mini-program-code.jpg b/docs/public/images/manual/mini-program/mini-program-code.jpg new file mode 100644 index 0000000..09ea043 Binary files /dev/null and b/docs/public/images/manual/mini-program/mini-program-code.jpg differ diff --git a/docs/public/images/manual/mini-program/photo-entry.png b/docs/public/images/manual/mini-program/photo-entry.png new file mode 100644 index 0000000..c75f55a Binary files /dev/null and b/docs/public/images/manual/mini-program/photo-entry.png differ diff --git a/docs/public/images/manual/mini-program/query-actions-v2.jpg b/docs/public/images/manual/mini-program/query-actions-v2.jpg new file mode 100644 index 0000000..50e48fa Binary files /dev/null and b/docs/public/images/manual/mini-program/query-actions-v2.jpg differ diff --git a/docs/public/images/manual/mini-program/query-actions.jpg b/docs/public/images/manual/mini-program/query-actions.jpg new file mode 100644 index 0000000..1c4a079 Binary files /dev/null and b/docs/public/images/manual/mini-program/query-actions.jpg differ diff --git a/docs/public/images/manual/mini-program/query-and-entry.jpg b/docs/public/images/manual/mini-program/query-and-entry.jpg new file mode 100644 index 0000000..1c4a079 Binary files /dev/null and b/docs/public/images/manual/mini-program/query-and-entry.jpg differ diff --git a/docs/public/images/manual/mini-program/query-complete.png b/docs/public/images/manual/mini-program/query-complete.png new file mode 100644 index 0000000..09fb707 Binary files /dev/null and b/docs/public/images/manual/mini-program/query-complete.png differ diff --git a/docs/public/images/manual/mini-program/query-result.png b/docs/public/images/manual/mini-program/query-result.png new file mode 100644 index 0000000..b3214e7 Binary files /dev/null and b/docs/public/images/manual/mini-program/query-result.png differ diff --git a/docs/public/images/manual/mini-program/scan-entry-highlight.png b/docs/public/images/manual/mini-program/scan-entry-highlight.png new file mode 100644 index 0000000..5fccb90 Binary files /dev/null and b/docs/public/images/manual/mini-program/scan-entry-highlight.png differ diff --git a/docs/public/images/manual/role-create-add-button.png b/docs/public/images/manual/role-create-add-button.png new file mode 100644 index 0000000..7dbb043 Binary files /dev/null and b/docs/public/images/manual/role-create-add-button.png differ diff --git a/docs/public/images/manual/role-management-distribute-to-child.png b/docs/public/images/manual/role-management-distribute-to-child.png new file mode 100644 index 0000000..7e06952 Binary files /dev/null and b/docs/public/images/manual/role-management-distribute-to-child.png differ diff --git a/docs/public/images/manual/role-management-entry.png b/docs/public/images/manual/role-management-entry.png new file mode 100644 index 0000000..fe31ada Binary files /dev/null and b/docs/public/images/manual/role-management-entry.png differ diff --git a/docs/public/images/manual/table-tools.png b/docs/public/images/manual/table-tools.png new file mode 100644 index 0000000..4a54dc0 Binary files /dev/null and b/docs/public/images/manual/table-tools.png differ diff --git a/docs/public/images/manual/user-create-form.png b/docs/public/images/manual/user-create-form.png new file mode 100644 index 0000000..efd882b Binary files /dev/null and b/docs/public/images/manual/user-create-form.png differ diff --git a/docs/public/images/manual/user-management-entry.png b/docs/public/images/manual/user-management-entry.png new file mode 100644 index 0000000..919663d Binary files /dev/null and b/docs/public/images/manual/user-management-entry.png differ diff --git a/docs/public/images/manual/user-management-maintain-user.png b/docs/public/images/manual/user-management-maintain-user.png new file mode 100644 index 0000000..3782d5d Binary files /dev/null and b/docs/public/images/manual/user-management-maintain-user.png differ diff --git a/docs/public/images/manual/work-order-communication-entry.png b/docs/public/images/manual/work-order-communication-entry.png new file mode 100644 index 0000000..d5f8551 Binary files /dev/null and b/docs/public/images/manual/work-order-communication-entry.png differ diff --git a/docs/public/images/manual/work-order-create-entry-new.jpg b/docs/public/images/manual/work-order-create-entry-new.jpg new file mode 100644 index 0000000..4d9aae5 Binary files /dev/null and b/docs/public/images/manual/work-order-create-entry-new.jpg differ diff --git a/docs/public/images/manual/work-order-create-form-attachment.png b/docs/public/images/manual/work-order-create-form-attachment.png new file mode 100644 index 0000000..2331fbf Binary files /dev/null and b/docs/public/images/manual/work-order-create-form-attachment.png differ diff --git a/docs/public/images/manual/work-order-create-form-new.jpg b/docs/public/images/manual/work-order-create-form-new.jpg new file mode 100644 index 0000000..34a1344 Binary files /dev/null and b/docs/public/images/manual/work-order-create-form-new.jpg differ diff --git a/docs/public/images/manual/work-orders-closed-evaluation.png b/docs/public/images/manual/work-orders-closed-evaluation.png new file mode 100644 index 0000000..dd20264 Binary files /dev/null and b/docs/public/images/manual/work-orders-closed-evaluation.png differ diff --git a/docs/public/images/manual/work-orders-communication.png b/docs/public/images/manual/work-orders-communication.png new file mode 100644 index 0000000..8612f67 Binary files /dev/null and b/docs/public/images/manual/work-orders-communication.png differ diff --git a/docs/public/images/manual/work-orders-entry.png b/docs/public/images/manual/work-orders-entry.png new file mode 100644 index 0000000..2770e59 Binary files /dev/null and b/docs/public/images/manual/work-orders-entry.png differ diff --git a/docs/public/images/manual/work-orders-records-entry.png b/docs/public/images/manual/work-orders-records-entry.png new file mode 100644 index 0000000..9785430 Binary files /dev/null and b/docs/public/images/manual/work-orders-records-entry.png differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6da0799 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2525 @@ +{ + "name": "iotlcm-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "iotlcm-docs", + "devDependencies": { + "medium-zoom": "^1.1.0", + "vitepress": "^1.6.4" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.22.0.tgz", + "integrity": "sha512-BFR6zNowNKcY7Ou7TaJc9QWexES4YKPbmf/OTFofpdsdhz4x6q0lbxp3duO0EHnyrN7rE4ba/TSXuY+BDGu4+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.56.0.tgz", + "integrity": "sha512-7r4Z3NC7yU1oAQVWJNA2HX7tX481F3pJvCGyLIXiTdBcthz4Q/o21jwcMYDFkuI92UWTNBQQmHYgwHo1zS5dzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.56.0.tgz", + "integrity": "sha512-avmjXQSq+jadFO8Xl2em05/uQdQnEmHsJyOAdVbZkmVgpMfxL12aJwVVfGNwYr9nulcpuJN1X0lTaQ5wxuNGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.56.0.tgz", + "integrity": "sha512-v2TPStUhY//ripPjIVclZ8AWc7DEGooXULZGFlFu37zNatgHjw34oZZ+OSbbc/YHO+xZwPl62I1k8xH1m4S2eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.56.0.tgz", + "integrity": "sha512-P0ehROpM4Sem3Sqo5x2cKPgj67D3G3jy0rh1Amwkcvsfr6tkvIcdCmerieanqTF7NxUMPNFLkpIFeMO8Rpa50w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.56.0.tgz", + "integrity": "sha512-SXK3Vn3WVxyzbm31oePZBJkp1wpOyuWdd4B/Pv7n0aXDxmeSWhC1R1FC1517mMrFAIaPH4Rt0x6RUe7ZNjz8FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.56.0.tgz", + "integrity": "sha512-5+ZdX8garFnmycnZgKhtXHePEaLj5zqDxI/0lkhhluzCcvTn0/PvvTirTg8hHYetQHvn7GDyeAiqTAieMvMW4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.56.0.tgz", + "integrity": "sha512-+mKUdYvqOi0BcvpAEyCEw49vSBptufIcfibtHz2bdr1pI789M46Yt0uQEk/sxtK3teh71OQvVFHaTDzShUWewQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.56.0.tgz", + "integrity": "sha512-9g/zj+AZx5moFcdFIrYQoVrueXivjUcc3MQHtCYT8WhIuk1lUh1AyEhvJCS0XBZld09cLvd1AZ3BvDBpVpX2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.56.0.tgz", + "integrity": "sha512-Qf3Sr6f9A9uxCZUf3MXS0d2b877uYzEB5yxqpVGXAhcJnBCQjrRRon0KvefpGkxy+BshrIJs96OUoMtGqXTFDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.56.0.tgz", + "integrity": "sha512-GXWG1rWc5wu8hY4N33Y3b6ernY6sAdAvmKWN/zHAiACOx40WnpG0TVX5YazCAr/9gOYGInSiM2A0y2jy2xbiDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.56.0.tgz", + "integrity": "sha512-7t24cBxaInS3mZb7ddEaZT/tp6q+/aR4YttsQVyP1/i+LmwPR34atO35KjaLFCcRVrlP7sYOAqkCfg6lIRB+ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.56.0.tgz", + "integrity": "sha512-R7ePHgVYmDFjZpvrsVAfbDz/d4RxKAYZ5/vgLfIsCVRZRryjWl/3INOxpOICzitehQ5FjNtNjcLQTrmHPTcHBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.56.0.tgz", + "integrity": "sha512-PIOUXlSnrqM0S+WOgDRb4RzotydJH7ZoT6tOyL7tAO7qJOfvX5wsEW8Pe+PMKMwvuI4/gIyK9cg2H7lJXqnc4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.90", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.90.tgz", + "integrity": "sha512-zt2o2ZvQpHVvZJARIkZ51RnaHY2oqcPJMvHE+mVnxkSr+c33fnX4gciiXu+wyX5ei+s0qbVX1wD0DWBbaGBYMA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz", + "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.40", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz", + "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz", + "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.40", + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-ssr": "3.5.40", + "@vue/shared": "3.5.40", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz", + "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz", + "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.10" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz", + "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.10", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz", + "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz", + "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz", + "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz", + "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/runtime-core": "3.5.40", + "@vue/shared": "3.5.40", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz", + "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz", + "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.56.0.tgz", + "integrity": "sha512-PrqppUmhT4ENdas2pH9caE7efUcxy6EcSFhWzosiVuQBzu2tQ5yLTI6jwomT/1cuBnivzGfxiJCqDNN9FRRh+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.22.0", + "@algolia/client-abtesting": "5.56.0", + "@algolia/client-analytics": "5.56.0", + "@algolia/client-common": "5.56.0", + "@algolia/client-insights": "5.56.0", + "@algolia/client-personalization": "5.56.0", + "@algolia/client-query-suggestions": "5.56.0", + "@algolia/client-search": "5.56.0", + "@algolia/ingestion": "1.56.0", + "@algolia/monitoring": "1.56.0", + "@algolia/recommend": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/medium-zoom": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/medium-zoom/-/medium-zoom-1.1.0.tgz", + "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz", + "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz", + "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-sfc": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/server-renderer": "3.5.40", + "@vue/shared": "3.5.40" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4fced8c --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "iotlcm-docs", + "private": true, + "type": "module", + "scripts": { + "dev": "vitepress dev . --host 127.0.0.1", + "build": "vitepress build .", + "preview": "vitepress preview . --host 127.0.0.1", + "docs:dev": "vitepress dev . --host 127.0.0.1", + "docs:build": "vitepress build .", + "docs:preview": "vitepress preview . --host 127.0.0.1" + }, + "devDependencies": { + "medium-zoom": "^1.1.0", + "vitepress": "^1.6.4" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..af6a0aa --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1636 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + medium-zoom: + specifier: ^1.1.0 + version: 1.1.0 + vitepress: + specifier: ^1.6.4 + version: 1.6.4(@algolia/client-search@5.60.0)(postcss@8.5.30)(search-insights@2.17.3) + +packages: + + '@algolia/abtesting@1.26.0': + resolution: {integrity: sha512-h6ff/as504npvSqhLlh1qw3B8lFktXgr6AOL5vkP4WCLU1oH+VCBh2K4x4Kvewnwr7kchH6HgLm3CcS8ZAYi8A==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.60.0': + resolution: {integrity: sha512-eLrG+gFBLcr8S9JuDc75K3jC8irl7v5ZlxSlR4o7N2VCGfmEbKEfu/J/fIuf5MVHV4NOCutyHD7CbxyZEyIzFQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.60.0': + resolution: {integrity: sha512-6Cg5ChVTSz5lP8F+sseoCxL5Jedyo9TSi7crgNNABOFRwlgauVfvZircY712ywpLJCJ7Yw7smEN4eCt9eWRKRg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.60.0': + resolution: {integrity: sha512-GWW9ilvJJY1tVsyz8CRqRGFnl9WdLjxXXUexSvEBhfgoFf3JvFTPDPClfS4sB36AlIDJ4PnJvffbCyhqXB4l1g==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.60.0': + resolution: {integrity: sha512-YOG1UOQdbOiQMZE3AnquBiHQrSdOWEcwx8caisOFT/VZMj6UZOsu4RdOn6tBEmWDXagyPEc3u9d9zySxMR2+Xw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.60.0': + resolution: {integrity: sha512-TRFAnHeXuNoYffzeZUpLX6QFmUABIn/BlhdG+8JTn0x3T4KHVPGMsXkWNXOigrzLf03D+/Cb66tYnrcSsXRoMw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.60.0': + resolution: {integrity: sha512-p8hGUjBGy4qL9lbiEqDpci5hG5Ru74iTBtz731NapdSkhJRlVYdjSXIO5k8RvtipNSjXmFjjV8RsHceLd1oaPw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.60.0': + resolution: {integrity: sha512-MP9hqPQGnE04De15am/MXURtU/OudFkx4jrzlfiB9P+cUkDO/P/Opel0Kqwwwyzbu4OHaU2mIjAXkpaiRic7uQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.60.0': + resolution: {integrity: sha512-gwLAiDSsGd5fhBUz/XwRM7okBx7KQvlS4WWOIUiy4Rb6SiebEXf38Woha7+S0qBRxEjtH7JHgL6xvvnYWrGCpQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.60.0': + resolution: {integrity: sha512-s6l5VRvvebJeCmyapl9GBh7R8d4yimO1w7SfpIaejws8Xd+2Q2qS0NMiRWefHFO8hWqNUC0eQ/GQM+sbmS2Zmg==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.60.0': + resolution: {integrity: sha512-c4dZ8J0AslIIqENbwMwbcFVuLJoLlFBlRfU518sl0FZnmuJTkXQDBeGV/uLzZos1AbaxGYOlwGYwdGI+pPEMcA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.60.0': + resolution: {integrity: sha512-nz4eILpuYli7fsbYl5btdm8Gcdef5h38cuF4urKFpi94bFcDTdegJpYthJL3lENNsayJvLcLP3G6/oFT5ToNuQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.60.0': + resolution: {integrity: sha512-3MWvjJXSMIE3tuNJS4WLQuvHgeG56ZFoNKj4WUkOYea0aBU7kGVI4NrTyThagItI+yhQex+fxOjkAaSPRUAffA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.60.0': + resolution: {integrity: sha512-Cx3D6S8NzSi9es4MIFljvImq+Ae2vo9gHyX+6RMMA0U+xy+C62mYE03X9u+mX+XXkgTWbkURCbMtuFDYRDNRig==} + engines: {node: '>= 14.0.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@iconify-json/simple-icons@1.2.100': + resolution: {integrity: sha512-536pN2RCEQyy5bYwzayrs4e9egr8cmtVcbdSHLaQl/ULUsihzn1eZ0+Hhn50zgz9cbEotiynKsKQSEjFJ7qKmw==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-android-arm-eabi@4.64.6': + resolution: {integrity: sha512-FkO19Fowv/OQeJZPVfdetJaI3/VpbZmBsnmAlR/rQ+b3QwfiGQiOpVegpSRH331kelvHTVw9hXYG3DwjAaRzyQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.64.6': + resolution: {integrity: sha512-si5/Etm6MphPc2xYHnk455Shls/hoMjTy3mhXge4OPmvCw7TwC4KP4fKokAlKLV4XaQvLvgSHfafPcblLMYYdQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.64.6': + resolution: {integrity: sha512-PQCl3q7b0BgvVt72i2xrWM6I5KliwwVe4GpWW5QDGyUQawDS9aPZss/aGyFqBmxdRxlE8wDc9CaxiQ5DHRSp/Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.64.6': + resolution: {integrity: sha512-l9DFl1Itb1YYdSrP1K3U8ih44AOHa/p+Q4WMMDfGvH5qVWp+ajfgS1DlYo4yCRh8wJ2ZJv0Fqccf+ULAmMFjmg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.64.6': + resolution: {integrity: sha512-bR4GR3205N9+od0+l5Dd9/iZTDpJkIe6d6Ydp2qbcQZJLmKBdYQQRp8gbWpbMt92twKJY66o1vK4NkoKQODIrA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.64.6': + resolution: {integrity: sha512-XTVNaDzcFl2TeBglvxdGgsCv9JGtAGRAoJENmGBR/XvDH2mA2K0IXc2aMfP0dR8mexSXSKifJ85FixoXX1wfTw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.64.6': + resolution: {integrity: sha512-qWc6qbc+25ugG9vqPR9P422KJBbVfZ05mjcMggoq8tsfWP+eRfC+/tiDdIlRF5VL2pDVZWN9zAhWsmu7R1+7Dw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.64.6': + resolution: {integrity: sha512-V4Nwkp8844X/Xnww3PI1LYS0YPei8XQEVG70R+5MPZGO7AhYoun4hCN7Svs4U3wbQLZbwiz+9xRFhUZZdRl8Ww==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.64.6': + resolution: {integrity: sha512-xb72A1aPaaIsp+a88VtRae/ovIEXislbUMyp7b9AQQU7ZkP2m/+ik6DW9TQcJyw5R8/RIailF9zExYwkjR++UA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.64.6': + resolution: {integrity: sha512-pbcs1BVBwC43hZkjhjlF8Rx8m5G0KnhLZs9Azy/gqccP6UsNSzJr0hKGIAVPqzAH1O/NdPxxC9GVGb4msQg/aw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.64.6': + resolution: {integrity: sha512-EKOC8os6Vsg487ZLKUqzLF99Jsmnq6tu7O7mAELakNpcA+8KadktFf/JYdRuHe/DzCUXmN38pUKu4XBcKlqGbQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.64.6': + resolution: {integrity: sha512-v/SQ68GnSlr/HyjB79sNXesGDwkOPu9JjbHfmWaymCiM+nZsQ9TstG1KfA4MuEvTr2d3PoY8PhFxj9bt0e32JA==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.64.6': + resolution: {integrity: sha512-G3pmliMQ7r15zFFNwBlaT/xTdSLi4lfgI7CUrQueyKYheNVhrd8JrWCE6Ll8xf4AA1RZFqq+mNJYntiElsVOyA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.64.6': + resolution: {integrity: sha512-XQTB/IPoB/wG6x/wu9uomAt8YH61IAr5iZTubMiad/lu88sotq2ocz9hJd556+Jz2kIkF7ZQZIsUuWE3OWqtcA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.64.6': + resolution: {integrity: sha512-O5mpokth6+ydMuwiGtY8fIjvOBfH7u6SzmDNmZ3k6GK5C6iEAC2q2ZN/T5L9jYILx0IcCT0KnfMDihQ5yQFSBw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.64.6': + resolution: {integrity: sha512-aIFxbAD9v3TvIaEDsKmukjcDg1JS4/tFXw8SHyQQgzOwzWCQ4cyDK7Ju1pQKqUXDFkEu/BZCFDCDATsKhQcB/Q==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.64.6': + resolution: {integrity: sha512-fuNo1UwBc6BxnHDOxxguQL/InhheMN3RJcJMb0b4xP8r5Q3CNCrJbVg0eCIFuJ4e/zAfjR2gYbOfbzO/G7CIyw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.64.6': + resolution: {integrity: sha512-05v6wFKDKJPZs9xlytVrrRu6IbRuoSvlH9xNwEOafXsKyjBFZPvAcZz2VIAB/M+lblYeKa9iOYC4RDVdfcAAaw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.64.6': + resolution: {integrity: sha512-wJXKcdMjvkc/FaavZXNP1yW4i0pfOmhZAIWRSLG2yJ0PB0TWi7dkLErhX0u0vptDcXKKO/m1Y/YTeuyvb2MXwg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.64.6': + resolution: {integrity: sha512-cwg7/h0ThvJwy8CBkmACdiHAxRWpbsCmIsjOt+Zzx0hTnIcSUmKYEV03bGg+hD827OnwUsbKh1ZZDW754xWyBA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.64.6': + resolution: {integrity: sha512-T0RkYIJbdYXJEQFw+tMBO09KDFdgmNxkHsof3wWAABrvnx15Yh8RytmrgYy9+q9cBeBNZF66MMQZC+5nzEz6vg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.64.6': + resolution: {integrity: sha512-KlfpmF1AAIdAWxt8QQNClbpLFlAUfYOzqIuJ7IXEStMHpFRuH78RG6FjqPb3Rqhh0K89F5npvG+/i3Fjl6IveQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.64.6': + resolution: {integrity: sha512-MrTLjd7Jlt9/ZavJZYG61KQv9Iy9bzbY+yXy73Xvwoa2uP66wvDShkyBr5Chz/yrE6lbD/zHMuTmKQVNQqBApg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.64.6': + resolution: {integrity: sha512-8fWDH1CkPI8GdBKAxzHDza7UmgficsKo2+MVbvUgOGhB0629w5sHMg3Qu5y7TZsrYKHHWpz8fla4KvoT7WsO3Q==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.64.6': + resolution: {integrity: sha512-9/c9PWdr5GCIHkkxiHM1HjNBQMVdftP4O8QTcoUAaRza2FSqJ4axbf8QAnBuE6BIGQDl71SaRPeDdDYid5ecTw==} + cpu: [x64] + os: [win32] + + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.2.0': + resolution: {integrity: sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + + '@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 + + '@vue/compiler-core@3.5.44': + resolution: {integrity: sha512-k34nCytbK8PQ1gR2mGROYOw6Pnv/mumqIdrZ3x2tbyXZDWm7ViKGLTfdB+DRrWqEQsLgGJvn0WN9jBif5zCTLQ==} + + '@vue/compiler-dom@3.5.44': + resolution: {integrity: sha512-W5AoBFWdw1lQAKiHowkfgFKFab82oSRT6sGsPfw/q1GRjsy/ZJFLHGhJyBRIFN9APLTUduDH9U2JAiPOIyKuYg==} + + '@vue/compiler-sfc@3.5.44': + resolution: {integrity: sha512-dzHmQ4jXTpdr5FjIQUeykVakN/uzqFbUo9/C5ikBFg3a3PeM6uRxeczx1ZbXBML0/zJstEh3ygYipzR5Z7b2Pw==} + + '@vue/compiler-ssr@3.5.44': + resolution: {integrity: sha512-xr5gb1JVHlfXJwSlRz1FeP6uxoazdzHuMTVLE7up+4Vrqxk219CvxLPxD9NXBt47yvZW7+p4DXfyp4O1fkByIA==} + + '@vue/devtools-api@7.7.10': + resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} + + '@vue/devtools-kit@7.7.10': + resolution: {integrity: sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==} + + '@vue/devtools-shared@7.7.10': + resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==} + + '@vue/reactivity@3.5.44': + resolution: {integrity: sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw==} + + '@vue/runtime-core@3.5.44': + resolution: {integrity: sha512-uEa/ndwjhrrhnOfb2p+sZy6zeoamJOISqaLSJGk/8R6nABT1ZldpzcJoPzKj+zHVomVBPcmQYyC2r4LtvDV6CQ==} + + '@vue/runtime-dom@3.5.44': + resolution: {integrity: sha512-3fc4ARcXVhVBaJ3ujWiNZJARD6pkyRcwG+ZYhMzjKtKUp7MAY0HLwr7r3Smep3Li6ZaWT6ewdmx8XqdaD5oNZg==} + + '@vue/server-renderer@3.5.44': + resolution: {integrity: sha512-R4S1UoH4h5Frrauv8Z5XE5TxV9oBiUSgWIC4TyVK1FK+RocRnOLwFA5Xcmo2011RlgJp+AbZCnw6afrhlgRuUQ==} + + '@vue/shared@3.5.44': + resolution: {integrity: sha512-H82XLH0DjmSOdbEwO15x3QTo1f5PWEtv237eLpYKc0mqLu+B8hnq16lFWmuBmNurkeiG3wr+oM1FhOll/YVFRg==} + + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + + algoliasearch@5.60.0: + resolution: {integrity: sha512-LKEMSE7DDZ67w/2dp0wIROAMIejT6I+UESIbu+IjPVKHkgxzag08xU3zVvvJhWGWL2T3B+e3Ai8fqYG5UHKTGA==} + engines: {node: '>= 14.0.0'} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + 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==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + copy-anything@4.1.5: + resolution: {integrity: sha512-vePst2VLTSqPglW7Q98VwFpGiGpOHTyXIo81MO5VyLecA5zMbZw/P/V1vmwD1jksa2iJpn/YkDrJ3XhTfzUyhQ==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + 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==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + 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==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + medium-zoom@1.1.0: + resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} + + 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.3: + resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss@8.5.30: + resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.29.8: + resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} + peerDependencies: + preact-render-to-string: '>=5' + peerDependenciesMeta: + preact-render-to-string: + optional: true + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + + 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==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.64.6: + resolution: {integrity: sha512-fX1Vy+UNKdXn+xKDnu/HBXbHVr1AY8cSdQj9BU4kLv5aFCMqGpvrVbyUMmjN3DdzWhSAuTbcX8PCNEVaumthYA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + 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==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vue@3.5.44: + resolution: {integrity: sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/abtesting@1.26.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0) + '@algolia/client-search': 5.60.0 + algoliasearch: 5.60.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0)': + dependencies: + '@algolia/client-search': 5.60.0 + algoliasearch: 5.60.0 + + '@algolia/client-abtesting@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/client-analytics@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/client-common@5.60.0': {} + + '@algolia/client-insights@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/client-personalization@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/client-query-suggestions@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/client-search@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/ingestion@1.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/monitoring@1.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/recommend@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + '@algolia/requester-browser-xhr@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + + '@algolia/requester-fetch@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + + '@algolia/requester-node-http@5.60.0': + dependencies: + '@algolia/client-common': 5.60.0 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.60.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.60.0)(search-insights@2.17.3) + preact: 10.29.8 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - preact-render-to-string + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.60.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.60.0)(algoliasearch@5.60.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.60.0 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@iconify-json/simple-icons@1.2.100': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@rollup/rollup-android-arm-eabi@4.64.6': + optional: true + + '@rollup/rollup-android-arm64@4.64.6': + optional: true + + '@rollup/rollup-darwin-arm64@4.64.6': + optional: true + + '@rollup/rollup-darwin-x64@4.64.6': + optional: true + + '@rollup/rollup-freebsd-arm64@4.64.6': + optional: true + + '@rollup/rollup-freebsd-x64@4.64.6': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.64.6': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.64.6': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.64.6': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.64.6': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.64.6': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.64.6': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.64.6': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.64.6': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.64.6': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.64.6': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.64.6': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.64.6': + optional: true + + '@rollup/rollup-linux-x64-musl@4.64.6': + optional: true + + '@rollup/rollup-openbsd-x64@4.64.6': + optional: true + + '@rollup/rollup-openharmony-arm64@4.64.6': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.64.6': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.64.6': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.64.6': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.64.6': + optional: true + + '@shikijs/core@2.5.0': + dependencies: + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/transformers@2.5.0': + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.2.0': + 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/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.4.0': {} + + '@vitejs/plugin-vue@5.2.4(vite@5.4.21)(vue@3.5.44)': + dependencies: + vite: 5.4.21 + vue: 3.5.44 + + '@vue/compiler-core@3.5.44': + dependencies: + '@babel/parser': 7.29.9 + '@vue/shared': 3.5.44 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.2 + + '@vue/compiler-dom@3.5.44': + dependencies: + '@vue/compiler-core': 3.5.44 + '@vue/shared': 3.5.44 + + '@vue/compiler-sfc@3.5.44': + dependencies: + '@babel/parser': 7.29.9 + '@vue/compiler-core': 3.5.44 + '@vue/compiler-dom': 3.5.44 + '@vue/compiler-ssr': 3.5.44 + '@vue/shared': 3.5.44 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.30 + source-map-js: 1.2.2 + + '@vue/compiler-ssr@3.5.44': + dependencies: + '@vue/compiler-dom': 3.5.44 + '@vue/shared': 3.5.44 + + '@vue/devtools-api@7.7.10': + dependencies: + '@vue/devtools-kit': 7.7.10 + + '@vue/devtools-kit@7.7.10': + dependencies: + '@vue/devtools-shared': 7.7.10 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.10': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.44': + dependencies: + '@vue/shared': 3.5.44 + + '@vue/runtime-core@3.5.44': + dependencies: + '@vue/reactivity': 3.5.44 + '@vue/shared': 3.5.44 + + '@vue/runtime-dom@3.5.44': + dependencies: + '@vue/reactivity': 3.5.44 + '@vue/runtime-core': 3.5.44 + '@vue/shared': 3.5.44 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.44': + dependencies: + '@vue/compiler-ssr': 3.5.44 + '@vue/runtime-dom': 3.5.44 + '@vue/shared': 3.5.44 + + '@vue/shared@3.5.44': {} + + '@vueuse/core@12.8.2': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2 + vue: 3.5.44 + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.8.2(focus-trap@7.8.0)': + dependencies: + '@vueuse/core': 12.8.2 + '@vueuse/shared': 12.8.2 + vue: 3.5.44 + optionalDependencies: + focus-trap: 7.8.0 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/shared@12.8.2': + dependencies: + vue: 3.5.44 + transitivePeerDependencies: + - typescript + + algoliasearch@5.60.0: + dependencies: + '@algolia/abtesting': 1.26.0 + '@algolia/client-abtesting': 5.60.0 + '@algolia/client-analytics': 5.60.0 + '@algolia/client-common': 5.60.0 + '@algolia/client-insights': 5.60.0 + '@algolia/client-personalization': 5.60.0 + '@algolia/client-query-suggestions': 5.60.0 + '@algolia/client-search': 5.60.0 + '@algolia/ingestion': 1.60.0 + '@algolia/monitoring': 1.60.0 + '@algolia/recommend': 5.60.0 + '@algolia/requester-browser-xhr': 5.60.0 + '@algolia/requester-fetch': 5.60.0 + '@algolia/requester-node-http': 5.60.0 + + birpc@2.9.0: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + comma-separated-tokens@2.0.3: {} + + copy-anything@4.1.5: {} + + csstype@3.2.3: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + emoji-regex-xs@1.0.0: {} + + entities@7.0.1: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + estree-walker@2.0.2: {} + + focus-trap@7.8.0: + dependencies: + tabbable: 6.5.0 + + fsevents@2.3.3: + optional: true + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@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.2.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.5 + + hookable@5.5.3: {} + + html-void-elements@3.0.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + mark.js@8.11.1: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.4.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 + + medium-zoom@1.1.0: {} + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + 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.3: {} + + minisearch@7.2.0: {} + + mitt@3.0.1: {} + + nanoid@3.3.20: {} + + oniguruma-to-es@3.1.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.1.0 + regex-recursion: 6.0.2 + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + postcss@8.5.30: + dependencies: + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 + + preact@10.29.8: {} + + property-information@7.2.0: {} + + 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 + + rfdc@1.4.1: {} + + rollup@4.64.6: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.64.6 + '@rollup/rollup-android-arm64': 4.64.6 + '@rollup/rollup-darwin-arm64': 4.64.6 + '@rollup/rollup-darwin-x64': 4.64.6 + '@rollup/rollup-freebsd-arm64': 4.64.6 + '@rollup/rollup-freebsd-x64': 4.64.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.64.6 + '@rollup/rollup-linux-arm-musleabihf': 4.64.6 + '@rollup/rollup-linux-arm64-gnu': 4.64.6 + '@rollup/rollup-linux-arm64-musl': 4.64.6 + '@rollup/rollup-linux-loong64-gnu': 4.64.6 + '@rollup/rollup-linux-loong64-musl': 4.64.6 + '@rollup/rollup-linux-ppc64-gnu': 4.64.6 + '@rollup/rollup-linux-ppc64-musl': 4.64.6 + '@rollup/rollup-linux-riscv64-gnu': 4.64.6 + '@rollup/rollup-linux-riscv64-musl': 4.64.6 + '@rollup/rollup-linux-s390x-gnu': 4.64.6 + '@rollup/rollup-linux-x64-gnu': 4.64.6 + '@rollup/rollup-linux-x64-musl': 4.64.6 + '@rollup/rollup-openbsd-x64': 4.64.6 + '@rollup/rollup-openharmony-arm64': 4.64.6 + '@rollup/rollup-win32-arm64-msvc': 4.64.6 + '@rollup/rollup-win32-ia32-msvc': 4.64.6 + '@rollup/rollup-win32-x64-gnu': 4.64.6 + '@rollup/rollup-win32-x64-msvc': 4.64.6 + fsevents: 2.3.3 + + search-insights@2.17.3: {} + + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + source-map-js@1.2.2: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + superjson@2.2.6: + dependencies: + copy-anything: 4.1.5 + + tabbable@6.5.0: {} + + trim-lines@3.0.1: {} + + 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 + + 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@5.4.21: + dependencies: + esbuild: 0.21.5 + postcss: 8.5.30 + rollup: 4.64.6 + optionalDependencies: + fsevents: 2.3.3 + + vitepress@1.6.4(@algolia/client-search@5.60.0)(postcss@8.5.30)(search-insights@2.17.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.60.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.100 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 + '@types/markdown-it': 14.2.0 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21)(vue@3.5.44) + '@vue/devtools-api': 7.7.10 + '@vue/shared': 3.5.44 + '@vueuse/core': 12.8.2 + '@vueuse/integrations': 12.8.2(focus-trap@7.8.0) + focus-trap: 7.8.0 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.21 + vue: 3.5.44 + optionalDependencies: + postcss: 8.5.30 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - preact-render-to-string + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + vue@3.5.44: + dependencies: + '@vue/compiler-dom': 3.5.44 + '@vue/compiler-sfc': 3.5.44 + '@vue/runtime-dom': 3.5.44 + '@vue/server-renderer': 3.5.44 + '@vue/shared': 3.5.44 + + zwitch@2.0.4: {}