From 5fc7b33b3ba3effca4e0272aad96c199279d3a3d Mon Sep 17 00:00:00 2001 From: ZHENG XIAOYI Date: Fri, 6 Feb 2026 14:06:49 +0800 Subject: [PATCH] Initial commit --- .gitignore | 46 + README.md | 107 ++ index.html | 13 + package.json | 29 + pnpm-lock.yaml | 2444 +++++++++++++++++++++++++ src/App.tsx | 51 + src/assets/img/beian.png | Bin 0 -> 1403 bytes src/assets/img/favicon.ico | Bin 0 -> 9662 bytes src/assets/img/logo.png | Bin 0 -> 46771 bytes src/components/AdminLayout.tsx | 148 ++ src/components/styles/AdminLayout.css | 85 + src/main.tsx | 14 + src/pages/AdminQuery.tsx | 100 + src/pages/Dashboard.tsx | 111 ++ src/pages/Generate.tsx | 274 +++ src/pages/Login.tsx | 126 ++ src/pages/Manage.tsx | 427 +++++ src/pages/Profile.tsx | 202 ++ src/pages/PublicQuery.tsx | 181 ++ src/pages/styles/Login.css | 88 + src/pages/styles/PublicQuery.css | 149 ++ src/services/api.ts | 207 +++ src/styles/global.css | 25 + src/types/index.ts | 91 + src/vite-env.d.ts | 26 + tsconfig.json | 25 + tsconfig.node.json | 10 + vite.config.ts | 25 + 28 files changed, 5004 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 src/App.tsx create mode 100644 src/assets/img/beian.png create mode 100644 src/assets/img/favicon.ico create mode 100644 src/assets/img/logo.png create mode 100644 src/components/AdminLayout.tsx create mode 100644 src/components/styles/AdminLayout.css create mode 100644 src/main.tsx create mode 100644 src/pages/AdminQuery.tsx create mode 100644 src/pages/Dashboard.tsx create mode 100644 src/pages/Generate.tsx create mode 100644 src/pages/Login.tsx create mode 100644 src/pages/Manage.tsx create mode 100644 src/pages/Profile.tsx create mode 100644 src/pages/PublicQuery.tsx create mode 100644 src/pages/styles/Login.css create mode 100644 src/pages/styles/PublicQuery.css create mode 100644 src/services/api.ts create mode 100644 src/styles/global.css create mode 100644 src/types/index.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f0492e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Dependencies +node_modules/ +.pnp +.pnp.js + +# Production builds +dist/ +build/ + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +pnpm-debug.log* + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Test coverage +coverage +*.lcov + +# OS files +Thumbs.db + +# Temporary files +tmp/ +temp/ +*.tmp +*.temp diff --git a/README.md b/README.md new file mode 100644 index 0000000..c6eab6e --- /dev/null +++ b/README.md @@ -0,0 +1,107 @@ +# 授权管理系统 - 前端应用 + +浙江贝凡企业授权管理系统的前端应用,基于 React + TypeScript + Ant Design。 + +## 技术栈 + +- **React 19**: UI 框 +- **TypeScript**: 类型系统 +- **Ant Design 6**: UI 组件库 +- **Vite 7**: 构建工具 +- **React Router v7**: 路由管理 +- **Axios**: HTTP 客户端 +- **QRCode**: 二维码生成 + +## 项目结构 + +``` +frontend/ +├── src/ +│ ├── components/ # 通用组件 +│ │ └── AdminLayout.tsx +│ ├── pages/ # 页面组件 +│ │ ├── Login.tsx +│ │ ├── PublicQuery.tsx +│ │ ├── Dashboard.tsx +│ │ ├── Generate.tsx +│ │ ├── Manage.tsx +│ │ ├── AdminQuery.tsx +│ │ └── Profile.tsx +│ ├── services/ # API 服务层 +│ │ └── api.ts +│ ├── types/ # TypeScript 类型定义 +│ │ └── index.ts +│ ├── assets/ # 静态资源 +│ ├── styles/ # 样式文件 +│ ├── App.tsx # 主应用组件 +│ └── main.tsx # 应用入口 +├── package.json # 项目配置 +├── tsconfig.json # TypeScript 配置 +├── vite.config.ts # Vite 配置 +└── index.html # HTML 入口 +``` + +## 安装 + +```bash +pnpm install +``` + +## 开发 + +启动开发服务器: + +```bash +pnpm dev +``` + +开发服务器将在 http://localhost:5173 运行 + +## 构建 + +构建生产版本: + +```bash +pnpm build +``` + +## 预览 + +预览生产构建: + +```bash +pnpm preview +``` + +## 环境变量 + +可以在 `.env` 文件中配置: + +```env +VITE_API_BASE_URL=/api +``` + +## 功能特性 + +### 公开页面 + +- 用户登录 +- 公开查询序列号(支持二维码扫描) + +### 管理后台 + +- 控制台(数据统计) +- 生成二维码和序列号 + - 支持自动生成和自定义前缀 + - 支持自定义二维码颜色 +- 企业管理 + - 查看企业详情 + - 查看序列号列表 + - 吊销企业/序列号 + - 查看序列号二维码 +- 序列号查询 +- 用户资料管理 + +## License + +MIT diff --git a/index.html b/index.html new file mode 100644 index 0000000..73f4b00 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + 溯源管理系统 + + + +
+ + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..8487960 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "trace-frontend", + "version": "1.0.0", + "description": "浙江贝凡企业授权管理系统 - 前端", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@ant-design/icons": "^6.1.0", + "antd": "^6.2.3", + "axios": "^1.13.4", + "qrcode": "^1.5.4", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.13.0" + }, + "devDependencies": { + "@types/qrcode": "^1.5.6", + "@types/react": "^19.2.11", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.3", + "typescript": "^5.9.3", + "vite": "^7.3.1" + }, + "author": "", + "license": "MIT" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..2f6515e --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2444 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@ant-design/icons': + specifier: ^6.1.0 + version: 6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + antd: + specifier: ^6.2.3 + version: 6.2.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + axios: + specifier: ^1.13.4 + version: 1.13.4 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + react-router-dom: + specifier: ^7.13.0 + version: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + devDependencies: + '@types/qrcode': + specifier: ^1.5.6 + version: 1.5.6 + '@types/react': + specifier: ^19.2.11 + version: 19.2.13 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.13) + '@vitejs/plugin-react': + specifier: ^5.1.3 + version: 5.1.3(vite@7.3.1(@types/node@25.2.1)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.2.1) + +packages: + + '@ant-design/colors@8.0.1': + resolution: {integrity: sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==} + + '@ant-design/cssinjs-utils@2.0.2': + resolution: {integrity: sha512-Mq3Hm6fJuQeFNKSp3+yT4bjuhVbdrsyXE2RyfpJFL0xiYNZdaJ6oFaE3zFrzmHbmvTd2Wp3HCbRtkD4fU+v2ZA==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + '@ant-design/cssinjs@2.0.3': + resolution: {integrity: sha512-HAo8SZ3a6G8v6jT0suCz1270na6EA3obeJWM4uzRijBhdwdoMAXWK2f4WWkwB28yUufsfk3CAhN1coGPQq4kNQ==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/fast-color@3.0.1': + resolution: {integrity: sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==} + engines: {node: '>=8.x'} + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons@6.1.0': + resolution: {integrity: sha512-KrWMu1fIg3w/1F2zfn+JlfNDU8dDqILfA5Tg85iqs1lf8ooyGlbkA+TkwfOKKgqpUmAiRY1PTFpuOU2DAIgSUg==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/react-slick@2.0.0': + resolution: {integrity: sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==} + peerDependencies: + react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@rc-component/async-validator@5.1.0': + resolution: {integrity: sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==} + engines: {node: '>=14.x'} + + '@rc-component/cascader@1.11.0': + resolution: {integrity: sha512-VDiEsskThWi8l0/1Nquc9I4ytcMKQYAb9Jkm6wiX5O5fpcMRsm+b8OulBMbr/b4rFTl/2y2y4GdKqQ+2whD+XQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/checkbox@1.0.1': + resolution: {integrity: sha512-08yTH8m+bSm8TOqbybbJ9KiAuIATti6bDs2mVeSfu4QfEnyeF6X0enHVvD1NEAyuBWEAo56QtLe++MYs2D9XiQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/collapse@1.2.0': + resolution: {integrity: sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/color-picker@3.0.3': + resolution: {integrity: sha512-V7gFF9O7o5XwIWafdbOtqI4BUUkEUkgdBwp6favy3xajMX/2dDqytFaiXlcwrpq6aRyPLp5dKLAG5RFKLXMeGA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/context@2.0.1': + resolution: {integrity: sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/dialog@1.8.3': + resolution: {integrity: sha512-ek1ai9PYSyQ9/3RW6jE62lB8rGb9Qw/NTC8/03HbLbosNboknqTuyppbBvUwJFLWeW307F7xBQ6IJJV4OWWmXw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/drawer@1.4.1': + resolution: {integrity: sha512-kNJQie/QjJO5wGeWrZQwSGeuo8staxXx1nYN+dpK2UY7i8teo5PQdZ6ukKSnnW9vmPXsLn3F5nKYRbf43e8+5g==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/dropdown@1.0.2': + resolution: {integrity: sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + '@rc-component/form@1.6.2': + resolution: {integrity: sha512-OgIn2RAoaSBqaIgzJf/X6iflIa9LpTozci1lagLBdURDFhGA370v0+T0tXxOi8YShMjTha531sFhwtnrv+EJaQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/image@1.6.0': + resolution: {integrity: sha512-tSfn2ZE/oP082g4QIOxeehkmgnXB7R+5AFj/lIFr4k7pEuxHBdyGIq9axoCY9qea8NN0DY6p4IB/F07tLqaT5A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/input-number@1.6.2': + resolution: {integrity: sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/input@1.1.2': + resolution: {integrity: sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@rc-component/mentions@1.6.0': + resolution: {integrity: sha512-KIkQNP6habNuTsLhUv0UGEOwG67tlmE7KNIJoQZZNggEZl5lQJTytFDb69sl5CK3TDdISCTjKP3nGEBKgT61CQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/menu@1.2.0': + resolution: {integrity: sha512-VWwDuhvYHSnTGj4n6bV3ISrLACcPAzdPOq3d0BzkeiM5cve8BEYfvkEhNoM0PLzv51jpcejeyrLXeMVIJ+QJlg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mini-decimal@1.1.0': + resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} + engines: {node: '>=8.x'} + + '@rc-component/motion@1.1.6': + resolution: {integrity: sha512-aEQobs/YA0kqRvHIPjQvOytdtdRVyhf/uXAal4chBjxDu6odHckExJzjn2D+Ju1aKK6hx3pAs6BXdV9+86xkgQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mutate-observer@2.0.1': + resolution: {integrity: sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/notification@1.2.0': + resolution: {integrity: sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/overflow@1.0.0': + resolution: {integrity: sha512-GSlBeoE0XTBi5cf3zl8Qh7Uqhn7v8RrlJ8ajeVpEkNe94HWy5l5BQ0Mwn2TVUq9gdgbfEMUmTX7tJFAg7mz0Rw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/pagination@1.2.0': + resolution: {integrity: sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/picker@1.9.0': + resolution: {integrity: sha512-OLisdk8AWVCG9goBU1dWzuH5QlBQk8jktmQ6p0/IyBFwdKGwyIZOSjnBYo8hooHiTdl0lU+wGf/OfMtVBw02KQ==} + engines: {node: '>=12.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + + '@rc-component/portal@2.2.0': + resolution: {integrity: sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==} + engines: {node: '>=12.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/progress@1.0.2': + resolution: {integrity: sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/qrcode@1.1.1': + resolution: {integrity: sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/rate@1.0.1': + resolution: {integrity: sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/resize-observer@1.1.1': + resolution: {integrity: sha512-NfXXMmiR+SmUuKE1NwJESzEUYUFWIDUn2uXpxCTOLwiRUUakd62DRNFjRJArgzyFW8S5rsL4aX5XlyIXyC/vRA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/segmented@1.3.0': + resolution: {integrity: sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@rc-component/select@1.5.2': + resolution: {integrity: sha512-7wqD5D4I2+fc5XoB4nzDDK656QPlDnFAUaxLljkU1wwSpi4+MZxndv9vgg7NQfveuuf0/ilUdOjuPg7NPl7Mmg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/slider@1.0.1': + resolution: {integrity: sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/steps@1.2.2': + resolution: {integrity: sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/switch@1.0.3': + resolution: {integrity: sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/table@1.9.1': + resolution: {integrity: sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/tabs@1.7.0': + resolution: {integrity: sha512-J48cs2iBi7Ho3nptBxxIqizEliUC+ExE23faspUQKGQ550vaBlv3aGF8Epv/UB1vFWeoJDTW/dNzgIU0Qj5i/w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/textarea@1.1.2': + resolution: {integrity: sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tooltip@1.4.0': + resolution: {integrity: sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/tour@2.3.0': + resolution: {integrity: sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tree-select@1.6.0': + resolution: {integrity: sha512-UvEGmZT+gcVvRwImAZg3/sXw9nUdn4FmCs1rSIMWjEXEIAo0dTGmIyWuLCvs+1rGe9AZ7CHMPiQUEbdadwV0fw==} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/tree@1.1.0': + resolution: {integrity: sha512-HZs3aOlvFgQdgrmURRc/f4IujiNBf4DdEeXUlkS0lPoLlx9RoqsZcF0caXIAMVb+NaWqKtGQDnrH8hqLCN5zlA==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/trigger@3.9.0': + resolution: {integrity: sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/upload@1.1.0': + resolution: {integrity: sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/util@1.8.2': + resolution: {integrity: sha512-mx0F1VSqatbucxAcM2+/d4MAGJv/CpXxM9sAebUJkrgQLHsffY97o6gFx8cy+vqVTT/Hr8/6A8j3IYp6n5754g==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/virtual-list@1.0.2': + resolution: {integrity: sha512-uvTol/mH74FYsn5loDGJxo+7kjkO4i+y4j87Re1pxJBs0FaeuMuLRzQRGaXwnMcV1CxpZLi2Z56Rerj2M00fjQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@25.2.1': + resolution: {integrity: sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==} + + '@types/qrcode@1.5.6': + resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.13': + resolution: {integrity: sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==} + + '@vitejs/plugin-react@5.1.3': + resolution: {integrity: sha512-NVUnA6gQCl8jfoYqKqQU5Clv0aPw14KkZYCsX6T9Lfu9slI0LOU10OTwFHS/WmptsMMpshNd/1tuWsHQ2Uk+cg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + antd@6.2.3: + resolution: {integrity: sha512-q92r7/hcQAR2iv6CCysdz7c2Pdl/3nhslc3azF9e6AEl4knO6v+nlaeor1oF2jBanZ/tiw2m3NprOVUgPDvyhg==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.13.4: + resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001768: + resolution: {integrity: sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.286: + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-mobile@5.0.0: + resolution: {integrity: sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react-router-dom@7.13.0: + resolution: {integrity: sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.13.0: + resolution: {integrity: sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + +snapshots: + + '@ant-design/colors@8.0.1': + dependencies: + '@ant-design/fast-color': 3.0.1 + + '@ant-design/cssinjs-utils@2.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@ant-design/cssinjs': 2.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@babel/runtime': 7.28.6 + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@ant-design/cssinjs@2.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + csstype: 3.2.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + stylis: 4.3.6 + + '@ant-design/fast-color@3.0.1': {} + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons@6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@ant-design/colors': 8.0.1 + '@ant-design/icons-svg': 4.4.2 + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@ant-design/react-slick@2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + clsx: 2.1.1 + json2mq: 0.2.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + throttle-debounce: 5.0.2 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@emotion/hash@0.8.0': {} + + '@emotion/unitless@0.7.5': {} + + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-ia32@0.27.3': + optional: true + + '@esbuild/linux-loong64@0.27.3': + optional: true + + '@esbuild/linux-mips64el@0.27.3': + optional: true + + '@esbuild/linux-ppc64@0.27.3': + optional: true + + '@esbuild/linux-riscv64@0.27.3': + optional: true + + '@esbuild/linux-s390x@0.27.3': + optional: true + + '@esbuild/linux-x64@0.27.3': + optional: true + + '@esbuild/netbsd-arm64@0.27.3': + optional: true + + '@esbuild/netbsd-x64@0.27.3': + optional: true + + '@esbuild/openbsd-arm64@0.27.3': + optional: true + + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + + '@esbuild/sunos-x64@0.27.3': + optional: true + + '@esbuild/win32-arm64@0.27.3': + optional: true + + '@esbuild/win32-ia32@0.27.3': + optional: true + + '@esbuild/win32-x64@0.27.3': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@rc-component/async-validator@5.1.0': + dependencies: + '@babel/runtime': 7.28.6 + + '@rc-component/cascader@1.11.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/select': 1.5.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/tree': 1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/checkbox@1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/collapse@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/color-picker@3.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@ant-design/fast-color': 3.0.1 + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/context@2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/dialog@1.8.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/drawer@1.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/dropdown@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/form@1.6.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/async-validator': 5.1.0 + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/image@1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/input-number@1.6.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/mini-decimal': 1.1.0 + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/input@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/mentions@1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/input': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/menu': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/textarea': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/menu@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/overflow': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/mini-decimal@1.1.0': + dependencies: + '@babel/runtime': 7.28.6 + + '@rc-component/motion@1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/mutate-observer@2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/notification@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/overflow@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/pagination@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/picker@1.9.0(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/overflow': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + dayjs: 1.11.19 + + '@rc-component/portal@2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/progress@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/qrcode@1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/rate@1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/resize-observer@1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/segmented@1.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/select@1.5.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/overflow': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/virtual-list': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/slider@1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/steps@1.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/switch@1.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/table@1.9.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/context': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/virtual-list': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/tabs@1.7.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/dropdown': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/menu': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/textarea@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/input': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/tooltip@1.4.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/tour@2.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/tree-select@1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/select': 1.5.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/tree': 1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/tree@1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/virtual-list': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/trigger@3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/upload@1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rc-component/util@1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + is-mobile: 5.0.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-is: 18.3.1 + + '@rc-component/virtual-list@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@rolldown/pluginutils@1.0.0-rc.2': {} + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/estree@1.0.8': {} + + '@types/node@25.2.1': + dependencies: + undici-types: 7.16.0 + + '@types/qrcode@1.5.6': + dependencies: + '@types/node': 25.2.1 + + '@types/react-dom@19.2.3(@types/react@19.2.13)': + dependencies: + '@types/react': 19.2.13 + + '@types/react@19.2.13': + dependencies: + csstype: 3.2.3 + + '@vitejs/plugin-react@5.1.3(vite@7.3.1(@types/node@25.2.1))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.2 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.1(@types/node@25.2.1) + transitivePeerDependencies: + - supports-color + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + antd@6.2.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@ant-design/colors': 8.0.1 + '@ant-design/cssinjs': 2.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@ant-design/cssinjs-utils': 2.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@ant-design/fast-color': 3.0.1 + '@ant-design/icons': 6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@ant-design/react-slick': 2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@babel/runtime': 7.28.6 + '@rc-component/cascader': 1.11.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/checkbox': 1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/collapse': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/color-picker': 3.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/dialog': 1.8.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/drawer': 1.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/dropdown': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/form': 1.6.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/image': 1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/input': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/input-number': 1.6.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/mentions': 1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/menu': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/motion': 1.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/mutate-observer': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/notification': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/pagination': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/picker': 1.9.0(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/progress': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/qrcode': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/rate': 1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/resize-observer': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/segmented': 1.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/select': 1.5.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/slider': 1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/steps': 1.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/switch': 1.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/table': 1.9.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/tabs': 1.7.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/textarea': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/tooltip': 1.4.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/tour': 2.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/tree': 1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/tree-select': 1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/upload': 1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rc-component/util': 1.8.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + dayjs: 1.11.19 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + scroll-into-view-if-needed: 3.1.0 + throttle-debounce: 5.0.2 + transitivePeerDependencies: + - date-fns + - luxon + - moment + + asynckit@0.4.0: {} + + axios@1.13.4: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + baseline-browser-mapping@2.9.19: {} + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001768 + electron-to-chromium: 1.5.286 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001768: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compute-scroll-into-view@3.1.1: {} + + convert-source-map@2.0.0: {} + + cookie@1.1.1: {} + + csstype@3.2.3: {} + + dayjs@1.11.19: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + delayed-stream@1.0.0: {} + + dijkstrajs@1.0.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.286: {} + + emoji-regex@8.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + + escalade@3.2.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + follow-redirects@1.15.11: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + is-fullwidth-code-point@3.0.0: {} + + is-mobile@5.0.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json2mq@0.2.0: + dependencies: + string-convert: 0.2.1 + + json5@2.2.3: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + node-releases@2.0.27: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + path-exists@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pngjs@5.0.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + proxy-from-env@1.1.0: {} + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react-is@18.3.1: {} + + react-refresh@0.18.0: {} + + react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-router: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + cookie: 1.1.1 + react: 19.2.4 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) + + react@19.2.4: {} + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + + scheduler@0.27.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + semver@6.3.1: {} + + set-blocking@2.0.0: {} + + set-cookie-parser@2.7.2: {} + + source-map-js@1.2.1: {} + + string-convert@0.2.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + stylis@4.3.6: {} + + throttle-debounce@5.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + typescript@5.9.3: {} + + undici-types@7.16.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + vite@7.3.1(@types/node@25.2.1): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.2.1 + fsevents: 2.3.3 + + which-module@2.0.1: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + y18n@4.0.3: {} + + yallist@3.1.1: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..d4a6190 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,51 @@ +import { BrowserRouter, Routes, Route, Navigate, Outlet } from 'react-router-dom'; +import { authApi } from './services/api'; +import LoginPage from './pages/Login'; +import AdminLayout from './components/AdminLayout'; +import PublicQueryPage from './pages/PublicQuery'; +import DashboardPage from './pages/Dashboard'; +import GeneratePage from './pages/Generate'; +import ManagePage from './pages/Manage'; +import AdminQueryPage from './pages/AdminQuery'; +import ProfilePage from './pages/Profile'; + +const PrivateRoute = () => { + const user = authApi.getCurrentUser(); + if (!user) { + return ; + } + return ; +}; + +const AdminRoutes = () => { + return ( + + + + ); +}; + +function App() { + return ( + + + } /> + } /> + } /> + + }> + }> + } /> + } /> + } /> + } /> + } /> + } /> + + + + + ); +} + +export default App; \ No newline at end of file diff --git a/src/assets/img/beian.png b/src/assets/img/beian.png new file mode 100644 index 0000000000000000000000000000000000000000..2a13ba2f4b92c4b531945a66e3e35e3ead3739f9 GIT binary patch literal 1403 zcmV->1%&#EP)OmFb0;G+d=2euy)cVjh{yJKZrd}noklB1~I~M zd*Iw5A@r@E47IO}f%*@p@Jx)Mdh7(KwK9h?&H%c+rbB*i1aRDTI20QU&l)3V6a5Y9 zt}ZYoLj`MYk|T#A7~w_+L-y{4&}u&!WZY<|pJEIR0yEx1Uj3A};EwJdNrUZFkX8l* zHzEMS!$N`e#$JPgJ~RCcs?G=sAOmNu899?20~{9tS;_A3OOz#4aigG2I0I^r2|!us z49#&4Q2mAxbnlo4RX29P@XC_nqk&1>K&!}%*3Y1(+}IODb9^2n#p&U|879DXA0K#D zWCyt`&7s8h9jNo01F|3+kc$^U!+v{Uts5b9lQ(c&C=}=KgZ_()Kvj4+ML&aNKZx6i zJl2Yl2ju}^YI__;juOLFM+@kT5@VldO3ezHkB9?S>Aj#VY+}m;B$XP?? zxN%T4$p}iOy$+QxG_IHqmA13M-@p>M@nKM&69R)Z0ie9J2DDXslk_!c&n?oFu$Yn7 z)OEmWd?Ds=G7Nu8xDmcQZUZ=ta{}+lt6?nX2^_cOg%H>o76q))6WX$Q%Ja*it2DIe z|DeAVq%H{`B+^svj5H*;g7T;U9#)8bLc4Yg{E`D zE~35ntsT+-p#J;&bICyKE=GE!LC~7x1**#)pvmVcFRlhnp%?Eb7f_t|7@BnlgS21q z;L&<@v{ioaNVSuvIdXyMe-LZ0G$Ng{n4?6MC+sKcE2|iJSmp*j*H(ija|LL1*N8fO z84Rzqr_=+~1y0ae?gQP5-7Tb7eL9>l7HL5AKj`-(OAee!Dq=i5$<0XHZ-^q*rG&^& zI@b_onyZSavqhjd_h|{~$QS34uIl3li8MWWDPfVifXF`&_zeY2VF9#&n4wDY>AqhbmT|z+-Ny2@8HxH`dsI{zWS8Y4G zLbdiqhjfkADYF)XZLP8}t)S!h2uOfDE}?ejk51YyA4FC~?Nq}<<(1^jZ=dge$(;~N z*MdbZYqP)aob&DT+xzUZ_dW+4jxzj-MjiNDacuQF9M?GSAV8KAekrAH3_9h1Z-V@DetxUbbv* zt}d|7td=^{3F+R(sI;az>R!{NiuY$#;TIXrbug#8PQ&*9PY2Q?2OUja9%`8%z7dei zE+OoRsTO#>~J_PJEx!-?r4}h zcXnD8|0$!hb$c|eP}IQC)*OfyJi^Xd8cm<2{)Un>;3dp9pF!*l)OE;4oGh;i?|gZ2y>o^ko_G4BF0IOjohQ=aaz<-m#ivTdD(r`- z`)5-H+_9u)aa+A+=4-=dt~y}mLD_g9)!xwXxz>eRuB{e*)#!^;Ul`-?ULT#HHaxf0 zM$J1G&3BXRX!N-`HR?-xjk-gRt6h3L(4{AW+qL?@j=wLRJ6RXLwlyBmiCPi~sidzg z9TC2lf!|Exw_>fSiKlK~5L#3+){!+_`*OO#GOEC`h`%{aV0l9tYplnyZ8at51_&O(v6{ak=)~D2l%wQKSQ$WbwcVky{@4qpH4ki#>N*bKaKI zTqBS-VkUgg+U>-X;qdI7=KO88BscK=44v{(h^eOL`fuvvq?Q9$Igh`sG38ye zI#S)DiytBeP#h?Zfh}m<1XF z#-@-no>;Z(-(#b^xuGOFuMtDnYQ$8lvSr)a`> zOTxb;uPb*^KA9wnX+*XjCGrjV-36iBWkD_+m83xnKj|Ps2aqTZFt^cX#bWZR++d@ta=tvc|8g&z1L&cl|D6)YFAF#$g?BS(&= zW`jXD{9pqv>OJmJMU=#^2Y)>Qz1x|!t6b6{bGw@Z+e|a+OJe-YK z>z%tXCfk^7p4NSF#MD!SkLy8m;Mvrr_tq|7K8wa>;eWJGXnu|#@(2&DLCz3ZOWgg3 zw(BGHd0jjXpM-xwFZ5B~H#u3~(l_vDmQMJRqSV{X@rwo6+`?|@K==z-i@`&Q#HPzr z;mZ9SKV;@>gAF$BQjWO!BDXIv66epbWqzK2F^$V=(zBB`wbp7?sQkmGVEJ$|;u_Ay z+{4ZD-1npm`N5W_@|NWzE_U}#HSFt6iRd8Q+n0v~e_qF$8laf+4&{N;e*0MvUho6|8N%=O4E*m(#7K%i6!#EA_uJ#9@?2Dj zrZsVV=)VrIJuhx&U7H?f$B&J$??13^BA2z!5B>x4*zag>rb#CDVq4t1v%Nw2+*El} z-@^{a70nT8Q&N*QrJ_nFAW~KF;@mJa{@9deD!3^AW`$*lR4eP&?oJUE}r|?-yYaqzDCEW%ch682NR|s9+VNDB22UHtHW%>x56>U8-V5W21&JrUHSwoWKRu25 z>1n;8ZkvzhK6><{FK>F}n??MU?7mwY*zu!Bx@}xGPu2;aM@>{9`&;Y4efss%bG64) z_^zAss|=Ft+)DYCo>4al2Z}X=RX>ou1@sZQTm#I7I4Vg8PK3kTW~VjRi#!MD$ngnx z((UPfN>=(tWTk-ETNrUGy@MSc9hWi2R&RRvTYPV(5M#b}+YRhb!*37RxJ&u!8ebTD z;bRLw_JS^qw>@mJ;pSnts`+tYn4jdHE2{*+RMF;+dBDUOG?npU=0uL6HilE$px-$4>Z*Iks3k(3;pj!`Gph z!#v);EhH$ZR<7gtkpmFBek#hZ-ECpV9)~TkzT*k_Ebw3V?!h-l&A5kZGq!7c7km7n z`#-SIoc%YQnN34^3AX2cltp|rqss7I3n%Y2Jf1y|i;z$D5gRgU+E{B+ z)QfbJ`mkpE$5dnIa#ihHa$B(c)(q88gx`>NDc;>nMZTt1p1@e-idVSZM#slr9_;C6 z|MAoo@_qKDI`zoe$R}HxVs05V|NFcyqnHX^@-g4f$RBBxB>nOlMcMPVqV&Qa2p8c7 z7kjZc`j`T811~4JAGPNIQ#^$e9{=7>@NfA1eLI>BDT2H?PBAoRNC#c6tyL1n5^f^$ zQD11+9W>v|+q-W1_~-~befku8qT}n(SvXDYf9;pjl`QtcnbMfrRvk{+->89~&kI&P zvnJ@@dS|WoEAQ92?_}3|)-v6{;X6TZ*P2Mxjy1vHjx`Y?JgcE!FZOs|Yr@_?rl3Yj z_*Qz6^N(k&7&_Vz?U*+DdAGebs7(DP84-5z8VcvN8vd{J0ULCH$ zIqwa=2Jj;~Z??sK&y&2;Z<5Htlv^@5Yo-hj)%er?L}lMI6pLiU;Hs*9cV{EQUamLA ziSyi(Bty=(Q(m&$r*e;bpv%VZ_3ryOoF5+I=K$2N`I!5kr;aau zZw@(s$T48QV6N9o`^*~ORjoC_4QAZenT>it3g>BE=}gi6Hfno(J2t5U;!#xIm#nM% zJnHu!W>j%2odbBkA^jm9|8>ak@9qo*x;q0PzpuN~=i9j%@%>Z6kMjUxWAB!fD&(pD zrdl)~m4;}3PQZY8&xzxy_T{r-*L~dnh_|`8`{h#n%M+EeS`wZSGm85XL*((2VkYG= zIych!&{{j#m)4MKJVPAM;Z7zCPC0_wi88wIX(Y0xT2zojZK8MxpXb;){{77FFZ?*E zx$3BP=RQRG(=%xD&cK=*y6kKWSDF@nocH1$o&!sD$QttRfr;gTn|y@dn-pc)*i7z! zWG~3YxF(!`C?}GR_87V=T2Zq?$60<1bqr!T^gzt9?^LW@Twp$5-+fEGP7!$dIo8~Y@uoR6Fdo8!)M9p#0|KH7)M;f`eT3gqOyyuO&I zkF1)4&hl87HgZl#@TCtxv~ilkDrpV`$-9Pgh;i8P0$7P^C`rh z#*+EVOjUe^_VI-8)BXbGA(!T+{AMNs|41{IS`PV{|vc$&feZ4UrS> zKQ{tjk?7fK$A0+{V%`d?-)cwx+Gr*`Jg$2D-M64#*yvGuHY&>AjfzZ!XYr-8?(=g| zkKdZZl4Hw6T?Y&x;A)EbR;6iebon4^gTMKXWU8Js^)=bFA7|K`k^;Or;#M~ESPP5wc4g23NE{42IEu*D2 z*mSAqyomFaHO~nMjc-u&X~=6Wb1wSYKtEMcR1z< z(JQ&c*|pZK`DcaV?YYgRVx*8uco|#ofH=pu+4qL!_4vO@>=Dj;IvyFm8t=m$Z20OP zaQaV74GzbV3UK^RR#^XLF*>`*srpkKj&Zut0cSKf@v?W0aK8SXlUL%Fi1ift@M``( qjA8T}=6^%}G`s{p;(5uWoe!%|Rf7rCA3C&n+ixTm8dndF`!Hs~H-M}mu{>RlV&SfW46)>7bYK7i;a#u$Mhasjr{XDgKn*h!D_h{G4M-u)5l%2_JmB8 zZxk29>nerVzZ=MF>kH_*@*VvI(+Iu2_>=3s%V{hZ!W@kvuVBZTWe6{3219Tjp?X_p zunYt;<5EF<6$o>c#%7N@V%WBV6ublPrL^3z`=IqX>I*KgxfFil#l@C**C$v0|D-oA zC!KSFlN?oZ7Rp#*O#lMfI7lsNIvd*rzcz=yE|a8Sb86Tzn+~TG=a~P=Gk^J^>AX3t zillp%`OdwZ7@ph1E=BUbQ0Jy#6^bM#jn)PQce)%OzZ8{#yK4oCDBDMNQ?^znWMY?t zY>Lxhz>k?(7dRcGvpvIq3$RyX?T_N1amMHopHfwf5cac>03}!K-dNU^T2MB(a}@ zDCJ%#WN`6>yosxlR7P~+Vwm*v<)n-JYl_+V%7$xZsc zUc3+`q><|4SZwPJHmh7{Y`kVtE(L2wB{| znY44^74l|8Sg(*5VYv>A#v0r5#N{L^my?A2@ZCiN_5S_8!zpwWC%v(+%f`HdELv&SE|mU2BV9914uaG{%CMB$2&=hCGIp$RU9 zFZ#t8eEc!1s4`XHVzOGzi?d7GLo7@O{SLTL3)<_y&q^9cJiORZ-^FK_gfDlbKiPuH zSi$-!1Y&Y|4rEDhR7#;s8oj|5g`9@dXS_T@(4Sy20m>xvStm&UoocqzwJA^v&mi~m&X zd1qUVeLQ=8$1 z^RJO&?TqAgnd1)I2^|PCJc~5geTOgy_8Wpfg$z%GQ|cQXSrKrT;5dUACmO!VS*~#I zDa=wsixtZH(M7nof0DeWNb$PN$jjwYtV^ff{iTMe#YQ^_Wb`sz?N=DO@qM`*lSf{v zLZ-xs1rEGz1_#(KZ`aCK&O+yTLhzlvqqHqxhaslXP|REQdF}Dc`;eugtfGBI!eh4Z z&SkNb{aL4Pl%~&3IJWGBS@!02H znApPexAHj)lMP?;P305Tf^$N%U#hGL7yLY|93d7B7c4|piZ!#n#%bVK=6Ktg=)qQ* z*exdw#5#I>VX;TgvN;P+fB1U-g^B1X8{WvN^bMsKbX7Ji&igtx1>@1mW9k2v!&w+j z+3H4In#zQ=sFlm$&-eL_3W%9}@M?-*b0VZeJBPPl;b` z9EeQ%5kV#s8{5QF)qK}-dmlkgZ(Ueq8)YGKP2*cO)nf9CI=+`~yzTg>x^YAMFdGzG zB~J0LhlH~ZC%`prX)V>+W}cqniFT?oaK+Gk`2X2W7dci4`nyG3XkchFOva#2?qc0_pPX?Ya9|-(XEcNbz_{24q z&-n~Bx{67E=l#vVvm#6Ks~;0xL#C$a1o?a!2E9%4zV--9b9XsDjTWdLO1}9JXrk}x zD6hACE0f-NG1wFZ(0`Gjq zFHUyWe2r6yoBRQ?ed)|?+Yn@VXB}3Bvmdg*SE{zAgJ! zsTUntci9_we>r>zLNaD8@Uv=$>=eZHa)3D<%D3Uh_3lJ zzO%dG_N%w1X3+M(iTi#jt_gRTd?P5>X4HzkHxxd1>k;8>cg@YnR~qYg`7+v-KQ>gn zyS1yFKB@m>TaS=_sVu9AJYx7JycLcMjT`b_QT)1kKljf#e=!uxtiHKz$={xLmt`ZKR-2sHQ^dRqS|&|%1-}*;`{d}Ad+$)$Sw(%&fVHLy zA$x(|FlW+0Y2SDM7UStHqh~R<`?)E0Ciz*hp7ix=4De<$){0x}=s*_5!?tR{>pZSG zA=m3^$3tjsXxi?}Q5l8ZvyJDKqhLF!=PU&G2D#2SEQB}LHJn%zO~xZza+?XWA3m3@8?2l0Hqzm`nx!I)(d{x(e0qKS}!} z`PG>^jiDyqusNG?`At{HpCWbMY4n=rh66rzy$WcVDDILybz+KC;-a5rhXL-4g%6&5 zyN!wSzr?R&UTLGg{VR1`auVS+tAGlJ%xg*n?KQI%j z%5yk>sU2orhMo27eY*Qet*H9kzD{UFMqYP^>zi z7DU&+;jf61-~`LkUGYA}8?$`RSgVd|XL-aF{x(vU+*-kRjpf4MAyi!Ns_0#xV-JAZ zQc8_#+p`B|-@6`c-#PDtOpijQ%To=YY}#fN?VO2feUk0?gss;X-Zo-hWn)o7615L4 zE2G6yc=7H|1!o}uz^W-J>2FjxG|f1e3oG!|Me2fN;qym^aYGnQu|N@q*v9#s#>8HE zbf7=N%WJF@&G^|+bwhm?6?>^41MNl@NiO|8Uq;142W|ZlfED?>90k@yIYhQ5a#o%+ zZ%=xkPL%vR@|%}#%lIofiT0E2yaCJ?2_&N_yzi)da_z!q<+a!#k^<|$1FtL5vxTSA z*?4_m-}oU<+{P?L_bzvIZ)Yc|kS#@OQjn7yp?KgIw8GzS^!qOwzm4J|dO@;OlnuE| zC{DLVTGjQ*D~fSKg31gb&u{BzPkTz%-Gx?8(H}{?L(wor%3WRwpR{XPGHe~}P^&zo z{pyR%_)6%jM{SEW{&=BFS3It;-n_8Op1)vHt-8RWVe@x*7;_0clMFe%tc`b~QG32i z^YR={OP*Un7aM4POsfBvfh@#m)Q}8v3hs_m3lX!bPi;_}eT&AdGC)59$1-rxY*D+?N%g1KKM1-{T78|u!apseEQT0v*=;ktpGLG$^c&OtZ^LjN^dRL)Q$!FAoEA zH)Z?c0$2bGLk_ONy2sO^jLa1dh^{uc7ylT;#yO68ZGq4pJNRnp4Xmtvt4;_7Y9OH=@)zc)#u|^nOzVLf2BSCbnLQP z6|=ju@J;IK82(#d09`=Hj8UFW1o20_=B#yQSafuevZ2GZ_f43(On*T? zq{)n+b8b3^1*2`rQ+vDxa*W@z7QvGKhR$bLnjp`G$xhqKj6^ z=}F)4@UsE2C4-m6#~^w;$E1@7GSlaio0t`NEJwzs_xOG&&xq68|p;$Im+J!72(Oz zS&lD#?=}$cuaxJvosLo*=j|>+6#5fFrfyXy2t*$@D^2(aiOPPJ6`4zQy*}>k>6v9B zrY&o0gS@XV=Gw{$=w1~};DuVJ zKI@d8*3mPE9|Z-*wYWjr?o>Q{`?iPYis0?)1dbLlbB4aF7|FZqYLaVOb^OkXeqZ9L z&BtS*BNdb;X%&=SjySBQbqog3#F%Oxqq|IzwH~kblY~nkbkhR*)Q`NU~^`ZJ>kRC$hpC5Rfo93mG%`!?Fi%7ZDvJdPp zs-)b}ilc)zw^5Wa@ml2G$PzsRdu{IdV1(n9dZBhW`mBhNhE&yPQ&)pD^g;)1hmh#V0fy+H!af;|#Or@n&QbjhJ*lH% z|BU~8UJ|9r&aDVxI^;sJ35QQSqB1RCEg{(h)7SVc=dT(n03;_~@40L0Se;A*kiKIF zbfZs0;s3PX;~UWOrPnSSYU^{{ulg%#Y&@+W5sKeI@V=oOwHG*qNqUdyYL8mw2n-0^ zl#e#`(U+3mEHzm|zPl1&CCt*R=mf0j*da*8*xCJ{!&-XGC&3_c@UHw_b&yDP?daEO z0^b}K%1Z_j4&d`an`7DNf>K97A0~3+c@C(;Zgy7}zupi}s?0nx649Xvry|*KE$sHM zwAuK0`l3=bB36w_&GhNr$J5#6l-~x7+jHkfoeukd)Avlic`=S3v{9IHk8-jlSDD(~ zP5o~7KT2cPg#stqs}TAGrW+(2JeKr1|-h$ZvC`rD8lW@@H{napC8ZSvM%{dm^ z0IDJlPUlw?x9bXyk|JIZs6{JtcyqM)^Nq1rPy|%9-NS3Ab8%Gf9 zhsul@n$dU|Jek^60C{ToZwWNi;)PwO6V~h>9**E<$>1!c4?k72CzD-bqv=dS`VLma zzuAzwsqWVLT$ts?lW*A#fD}rlY>l-Xe^)_L$H(6L`Q9KR)AMmr65xxm*)!?aK)LYE zdCJzr8~zN)CJ3a>vcXGrfSq3Qp(`IqZ{$-e=?+a?a%$HkpzhxzH!0Pxx9Q8t7#lx* zeVjHY2Ecvw?Pb4wa^?hcVHTO3IU`mh(|>QH2wq~|jpVrrvveFEutri^cJFjYb`I{a zpdCs-{Ncr8Ry>Tj8xgWmJntL9ldda&*XNuLH^6MgxW#rK6jB|_6b&gkS%YnFKT{%_zS;3ZS&7+#~wcdp6zt}Rt2 zXUxdVo{pI85#JX1qS0KSj+KFa2Wv)^C7~}+=i_hL60G}So~JzyZwr?ZNnnjsuwmK9 zhqzwGo<7SpGm0PwwDGF_t4|H?`DE|=A76C}#d%d$Hr9Cr?scj98Efl`HW2VUmkTe zoSSAnibQ1hEHcYo+s224>=PmXDDjBhq;m^hcvb$>fu~?{djEr2_=dQ9+1>j6$_fYz zE=R1pB>z%KvQ1Q*$Xp$Z(Fdcs8z8kt4UYB)DmvZcKEqY|px9helD^Df@6)on7*-t| za5@=(Tz=^1I1ON7#iK$rX%2xcNu>N5ZPAj@;j4iwZq>jKV}t2+ z1Q8Km1ovZNJY{fvYx$6L{l>4KqNaHE){foe!mL6RqM-p`+7=Km z9E!?!lH;afcR!wX~88EL78Uj%89n&MmF&28_0ZL4l)0(!&7_c0T|B(KBde# z?q)t6^`Ez`u#6Bt4Q4wdo)I0VY<#Z(>F)0)y6VnwQO!E+PHCN|< zynk^uYKz5sObmSgrW*PWaLp@oK$zk!VhdMq9x5~-8{&_uYW+kw5(jfGFS zn8Ep$Nc*3ITvnO1I52)0ewx{L4ih}-U=64&Bx!pI zrwJ4KP);VAPl+kWh8DS;We1EyBUqdDOOUVOUIgDf%C+O5(`|lef|3+vtgzVqO4A;^sFb#TQGrx8+V<4-P&WWy%^`te zCY~rt@q;VEge^A8iF1kg;8M(qS2JVRvCxo59RHy81;374@$`zLzxeG3O6k&FH7iNS zs`k*y>BPXrAjq~|*mdkWSf!9t{gY3oZCn6hG_jOBv3$rF#b*Exr?V@_Scz5ZImaRb zzRr;;6c(qQ}v9Y_M9F(o}$!~#+2%d76-t6$b+?aeLt z53ar|)ib;(d?jeQ7Tb8I;i`Y#YL+XQGm;xJbmlY2$m>i?DK3^1g}?x1rza7qkH@E{{WQFt& zFu)DK34G#5{qm>8a6|0PCiM0J=??fHEDxeNG=kR!%>Vm`8KY=yT9j9bzZ3c*McOk| zX9yKkP`CEkF>8178}LHf4UdD5Xl`c|>qA$vZT3$jr&ZS#eXj#bg>ZIJ*)SE94AaxN zz=_=?nf72bvYBI9LX5DlzAwixc~#1gOfiwRo8q!1C|9RnYNA4o1Nrpby%sV0w9aJ? zmzOnwne9AIP2wp7#sbLH>S2DWgXS{n-6P$DR=#ei@gaL6w;nnaHnne*vAYbiuAaZ2Za&@en^!%0mA)+S z%g4`&3(+A6WI$2D;IR>b=AT)pVd@|^d7jxPo|%m6<jdi2vUS=H1M9- z6Mo}2w)U2FXd8Wv3sXNn7ABRbuFUPFR~Id0-2Fw_+7E1wtIKiP|GK$_+x*xL7+Dw- zO{N3l%_!)>;0j69y~P?=1bMyi_$>dtx0||`s_#>GhmA4P-iJZK6ssThF%oh=ZJ)Xq z#NJTCJ3D~J1tHrO3Ju}+H;d@b)K3A0!x=zFj#*@}7}Q2p zwyR3n3Z(wfEG!Ov?3ieva`SpEFyo^V5RryMrtcxme!K8M6NZn-GgwLrjr$_PD8j>l zU-+^XD~@NzGrkLx91~5=_onphSMFVt45$*)K<^M(yhiff^+IloT5ak%YE$Zvj<-Qy#Rj0k1farwy&NE}eE*ll#f=o><NB`0{b`!+9|Kb8HE?$Eb5}j=FvCG+u#(G=e&>fbO;T z6Q8Ctguu435a8C-4D+BTZzz0H*SG@(($ZdWC8>9XyN32*SUs+_h!x{bXHC*6QEhxq z52p;`cEZt$jvw_B3*Q8ms9E8N56Q@PccQDc^kC7r27@P1@V^Ut0-8d+)s`>{uEoaS zZv0uu7(3#_^caPbm=hsbt9JTQoE|awjBrlax+;QiKVk&J^4rak>nI9@RzNfx#KmWT z3P<2OD_6cx)7hZFOQ!lU*0>?SP5vn?k}?R}!?P+q^}{y~{>;ne=|OLCvd$;RfXq>F zScrmSrs?GAukT2wUs^=>>%Lrrb=(Xgi0;?uUoaA5Ex^Zt$Un^`t4w5IY4mqu+>&V< zqbH$m77n~-95xJdfKNpTD%$}TSftW;WbgM5{+a`KHT%nLvKF!GNqq!8mN<;|40apP zqIvYG$|Nox$Kg|Nu=+J)F}WByWy8rF_{tfi69*FFBBe1j?ooEFkU6*DBvSJ4J!&oA)jXhA(|e^oq$e@|bY)u|VO54s@k z(^*mlWD@nqIPx@#gkV0E8y4DPS-{$bJ8hs1hH3pO=1aVOX0J9IuKjp)wZxdBJzq83 z@|)Ue5=BuoKk%-%(fDn8u_@NluKUJ;O#)e1qaO2CUI&Ww$B1#J^ zu~p~OT^qt#H`@{?K(-h>`eTFNsrUrkZlol~^2Yp%gmU)xD`hw1_+16#trvMfEA)!K zwi)Hyqd-i9VH^;HHhxQRV)G&8l*~fZ+GyV%^u)w4&BGXe~;Ce3xvC-w78+ELgCE>9Xjb;y~P7MvX<~qfE~!` z9a!6Um;Q2B%gmr>`VIgV*@|ZDmK_DRRbz=k%5`u^LS08q-M+O{*=NZ-qtiHIyP|3&@pxpf3wbfa6BF zlb^qK#&Ii8jDw`o;fR!|gijkWkfVGM2WK#0PuUClcG2yy&fi(H4Zv#8jy52>Z{`TZ zA4VJu+FRddUkt{2ev~Yw&)vUUw9wZE-@!yRn_~k+Gnyv$F&dr!c$?CR_^{ilu7hDt z_eCV|pM#z*e83ftu&mo%ku&^v3xzMkdL%#b@#-9x1qF*WfBm;8F(}cmktakm1759$ z8+1Na$c5*w*h$`f1R-WMpk|NM5#*G(G=;jLWKvipbHMWbVUg=@_7C3*0pAMBhQa)B z8Q-terpN7%g0ys7#4u&R5+r$`FNU6~Srs9Ds33znozt1!3JyTRQSO z%l-3FUvORYNC-_|)j8FjQW~^eJX+y2Nw!yYoaFm^y)_1r?U|xA-1!-OCFJ>yT;j8P z-)JBqFX)Yw&taHzr*Dfbjdp|<5<2Q>67Tog9s0Ylx2-*>cT)miAoj0k|En-bu0&|Y zFf>d!qnWzkO1TLMg|lM&e#F$6*vtg1bIA(p9B>@kByb^UU1MCS(we^HjocF)-p3tc z^e?IZ-lsF_?ouY4B~XN;-Yuj9J21l9E24JaR73hsZGuKk!cQ;7FRXTNAQ@~z?SRxE z#}a0*&u@lrIwXYwh%=^rd<58t=bx7YPqX!;31~qv4i_W^MV4<(68;^6o*(DJw@{|& zbX^4XPrTW&efwFNKSmER|9FE_e(*x<6;gb_#TDg7&KQp;JE(zT|Dw>{UF>I;XR2h~xyl za>((k9c+CKaAVluPj7jw{g<5b-UoU$$n*99CNxjM$ER-({)#W`+yqSmB5s}5z&L&$ z)J%RDeM!P4m-a@*KU6u!RYdgeUxkl&F4NvWn>Rc!S9$z;8niH>K9Rrz*xK>Gegge8 zpa_Ol|4Go90^#hh$TWWtF`|CB$+#*%WnfV()LMEEI{$tp#y1+Pf7M7NXqY@9uoGVS`fYREugqp7TNA2WB}^He1f6=sR*T zhQXUMTJM6U-KS&qiSwt`ui;qxT&k`}J{h@XsL!t(FQyQ?P(zed7KSqhJ=mK>If3Ye zq*82PomZY;K;YlVMJV_$FTVdtP@N9gUhc{Aes0)$pUG2bHD1WE_9leo=43Sas6!;p z`+JryEk_d3pr9^U#90^yV1M{<*>#`PBORB1^s~oy6{A^X2#dh%^;dT+?h#LnKaG>CgjyAjV6^rFV)O4V?Sq8==aTurJYcI|q< z8t;$V^se%O(B1o#V=3E>VYEY|l44NJp>2b1tD~0oo>Sih3kRK{43N+?#U6m2{4>R` z&Nt?U^&v|C=wAi?b#xO+5|lQ(IuhHD2SWXg>^Vly$4OdpRp^iL1`+nU_QhVbQThA> ztxTfMLxfHGK7Z~zE9M784G^sNXJ*fpPk`1^ruTEFeX)v!=@FFtsZToVcX3l(by@D3r`7AGx>(#q$y^QNZ=_UeZ9yga;#5 z;7+Uj;wl04feHczIV&z#WEJ79&{1|4M+_6W3OFd~oZNpDuYK?5rsQs9}7{w&Kn=!=!Ssj_~CF^--p0^o(vOk7w%f^`*?+dLPQX>G5PP`_heLCUYUKuR)S@TFP_pNL?_8NMOX`>Kxme_Wi6N|VOJ(lV6QFzs z+D13I{sypI-avTos~b^ZE@@mZevdRq!+-YTqFok=3^oDT+B#oN`1c3Qf zY~gMf3V)ZGRb(kvqC_QP_)i#xA1Jo_;(IuPUAL8`qQlMwvEHBJmbwj5&(Br+%KK0- zsZYKCWoNlKy_>uK$Q5(9<=W@M{+f>tjLKIXU54&Jz9(zg%1@^*(8JUZ))!7|L|VkY zKN{2aEef~Qw~R-H0eC>?!>%Ky7*Ci#vHO!Y^G(56D16z-_NPs);N5U_OwB`nP1l$y zRjJo@7SSWM)@B#0__2XP?COe3ZDkVE6^J={j`@MM{yhellwZz~{{N7(q0%{%VFD4u zW$xGfb4ZG9I_EYABZxyPW&vX~6xz(>6{##!tr7USO`#dL<{plV7(*T*w_)Uzu&}#o_xd`y zN3H(|Yr5ttU){d*SLkl_L*xCJUAR~9f}TO@by)ThGf4BGEhU2*`b z_9)UX$oE|eW;F5Ipk!Z#d7mlbI~gnJTH{mu*w^W;VfP0_2uC~hdtV%dZQK&S0q(TK zk?QE-Bkv&n^p|g+qT~1i==HV-9o@Sa z;ZS%Dl8G4U2DnvpXvG&AfvzWSeDq}jqHg4sx&`H_kQe#$B0-$lpxS@F8fkWCX`7Y} zR;x*fVkr#ty@syP6I${To7i=#NDOsa=aF@(0tIN#$tk@Ca!_@1e@4@gKYmp!QNj*D zA)CnlI-}bj9MfWt(M5xnb1-{8p3?pUitu5{3)^RsPD(%&f0p<>z+Sg9>7Q|3PYI>}x*jwA^6gVjKvm(t2`^xDJi^Oq%58sNrzE4^mm6Cv#gH z>?Wfk`+$ck+wdQ+=6e3*if1%aGS=eT-aEpd*;9>?VuX*H7a0s{=`B5I0eCeQmlC|Q zKw~asNT8coji2gKr*(LElj4lRS(tv`GsQwJ{f;~Ff^?prO}hg)etCHl539hj ziHzf~OxhGJytBPM#mxNp z+ikWt>mEuXxnqnPQrC-~t4~g|dedqU0e6?}-xE>=Ku|ulb~mNQ?zYfwS6TFv6x%Uv zI}9TSD`+Mbdo+}xsTbbWrCdJ?y7o}eE{g(Q@+U<8=ug-JKcC{X`>*D(ILh@n0==VV zTN?API(5H$cT*~pxH%j%Ng?w5wH0ZgvF*T)>i2O+%|XA2G}5idkucktYav^=8B z8|1l;%;noyvXuGg=B~04_0Q)%;DUV!`1WV{j_`naUyw0Cd*`>lA2zawtLJk$Q;;eo zZG5^qu%P6a)(iM7}uVsh61C&nXuO^alkVn|uk1}$}USZr-A@`W(_$-UrutBTEKPE!9Tmi&;E^j(h zT~WX_^*6-(yB|PK=m`I>61QsH0DvLl7)KXv1K^vi>oXmJ;;We!4)c>MQpGY=lekwv zk^&6)naS~+smXYy}n7GRi5lRu@>tfJ=ewb2(0&QYSAC0DboWmXh7OOxVXTq>AeJi&=xDyVZ zSV?5)vv8>y-jbab69x^-9he%lk-lZ@x<)4IOwAdtheJ5~kOa0OieVX4T&OZx2bOu{ z`Z;vt+j9V_0sOpLYcA4jQhg2z?e?`suT;H!s>4JveVu=5ys5)b7vAUGwiVJIc#_&Fp>G9p>#*c)aA(P#JD}+8>ob9>S zJo%di)}2eJj9h)KSUaIssC5{kx3+8`l~DxC8O}gFAq!*r#6|P^i!!3ZoAc$VY3bOQ z8*UQ@<%B4Oj{^P)8DcJOD!zN)sCLlh!4loll@?UM7m$jhk;tjw4%+AA!;Lf9`W`G< zFmV@Bow~M0>qCvwfn}wlMe3NuuO_pEd%DD=-2RzWcCm5 z18givQd@kMPn7Ds_LZrik`@m!Wxs9Yy>yx!)BpTrEL@Ap(w$``p8ZRV<3(TX*wB!E zCL7eG93P)GVaM)7ILzu3-Qs-uZx4xQe~k`)W0!q9$aMU`oSjGLS|c6DG@u1=t=xQ9 zTKjO5zJfjiZfNuK)iKGZHI6>!3K z1+hcI{?8Ekl3jC=`WeOmSf9tE8mOFHuV{580E=~v@CP&Cfu9>WQ@_}KcD8ILGI=Y+ zA8}J_)c9pX0WF>nUQysx2VT=eY$u#htuE&(t;r-rCHs=_&)$z5ATFKU{aYleD%xQpDaLQG4+A2Rfef!iRnkFmhsE9~U!$fqiAqZGcL5IKo(MiLfDZC}d{y|{- z8fM&wqGdm5YmvCnT99q`!FZlsgIT>BpfjEbJQ+cQWGU@$XG?=9~pgG|w z)+j*XAh6UU@UGraJ$t8tgdpo!_?6$CBH|$C{LJ^Ort!GuT395v$lybz>lO1iu%FA4 zQ^)Z@Vn51fp!}K=8F()2k;Ebkhyn)#{xym5a*aJR^upUa;Bv`~#hLcLrsx}gR<*c1 zZFXKhOF5j{4lypW^scOA8F%YU=lGn~mdsvQoO}E>CNC&BQS?McfcX=Jvm(y6hYL9# zV3C%_nSWXs5nO3}@6myZCVe{_s42XrSd}>ZPTn=f;?Y{*bEe(pF91S10G?yzPa*sf zaj3l;Nt?LY`_1Br@6?|4s?l-z%jt`ysdnSH6RtQNFV}jdSlsQ%j_g!M+aOA%w?Q#A z-AH~{L4XH|`pLeVexh=wXYg-6_^b@(Zs z+TNeaQ3^0Uk261D^+AGI!s-zP zHwTx&a5b=}Y_QLdkH@?>sy6TOhCCKyfQfwjw`7At{hn$;nf?3KM1S@MR#?p6C;7Mp|*&^6#AXYsV@%`BDA~eBlBe2Vc#24&N zx#@NVjK%?i5-zotI!C8<>W!6Hs~=jjenQ-DoI^TWR`B%*9DyS~&Z9=5CGkw2;N948 zv*Y|=u9NPjqy9$ngwr4KazFcU^5l(A{&^fXu>|p49X*Ra-)$lbK0P?QSs$=RVI)O< z6HdqNgX_Hd=noT=3+E`iANr5Nc`6*^USgYi++f4Yz3GSFxy6sUXG#Uje)_s>KvPJr z)NViR2HU|$+TTxjyKwnN9kM^vMeE399L6I^z6qFr%HDQ}aN* zsLB=I7Fz;*lMb;EmPf0hf$R0ug-B=3Z?|8-Bl%ZnjMi6YK!yowF9O0aAJbRKQJ^oT z@;mOqWF`gV6aZ<3Bv(PUjNMc6aFN2EFD zao=>%m z+#)ogjGPrr9=rz2KDKEo!tZ8)mRm>l+=iSYbqeY?5V-=#(CH3=2PU*&^ovN%jByg zmh=?hd1g{`hBB8wgFA>8NZ9*Un9`{H^El9`D*R_67eTd??J)l^`G)JdBY3=VBAwNK z-cf{)Inhm>ezDBveDdAXz7_7 zPj(}2J=eWyfpG82Zri(smn@x@Ea28rw!zQG&CKJUG)}W+Je)ip5fKN^&^%ns5y-c4 zt}eUIA#G)>WyX0xjeE18mrtIqy(6k0xRTXgSy(MDj}WB~xP%&r&x_&Xdp84u3QqKW*JOH#_$+ zGvgNJTI}`QVIu1jnNCfM?yi_|m8H}1{}WX?@ndT@;2tENda%P2EcDGUeH@rN)B^-H z0XgN3!A<}5I}xkUe$v^z*~xVFrR|@cGh474}U5zv)s}v&=4?BsFKZ%y{cSjz;_2&}DKnCMjMq?n53jjR+l|ahz zsPztFCog?7@TAueLFCZ01T?>Vh9jbs0Bg7=#eHQ1`Nz$^y|4Jr(@420#5XvCw*$lV|@F2BY`Wt9&2R{b7M6pTo!k=MJI=C5NuCR@^>VwQ}9SL6a0a>-Y9( zt00mUQ{9950Wc&zpjq@xxAukAZRo|?$v3WAf2;$~9R4Nm>x-5kx?ABLT+m>OJZ;0F zEsaN%3`rVRcm#UI(K67{w0SxU3=ktV#A-Mvyy@Q`)O{%*oBQCLf8hLp6Q;JVBjHBSG7!+sWC&Xz%7o*`nYfxWFnyE=QxW5FNmL*V)J3;tIOW3%n ziip#X2Hqn)IP`4vj>N%=f9^(kS=!FzCw$c*yCkrbe*r{9+B)`ltd&PZgqmCCp*WKVSXcf%G5 zS?Vgu5@#3<)yxzZ5iHhs6C_VT;Y*Sc6da!d+WIwtAf8aQR}#|SYqZI(X3gL#Vox8( zq4f21C*6I%3 zi8_TmjUh{z#q(`5t5d%TsMWS>;9nB{BuIIg|eZuZIHlJ zf}I0z#ztA1&xUKn4lH(@u^B5zjBgk;4w@q2yHI3(8y^xR!4Ug*!k`%((R=->X8DfQ zsi#1wW3T!Xa72j(!UIwDj?dn0M_fj+{0 zFDu=!&l2Zxf6uYE+_QrNUDVwVw+Ld=KCf3z9~{W`D_ivhmW{5_r0QFh{c`Nl`N2tF z|724+&^4w;6GHfun&Tsbc$NN-ADo(mei;>65})-=neU7&A~Xw2i$#6!v293kFVH`e zczq}AahXT!BNJcyB%_W*oqt1r*4}ME}99}_4~M-oa&lAT6}HF8XQ$)H3#(%mf0#U z5q>7UWfF12s>#%MZIU8j#ItGZDfe3<&UY)SgPMgxE*&T`q9*6=V4u_sm1SyZF8!bU z1~239Q1G9zIH1IaO8n{T$J7O z_R=jK(j_b%N=Yx$wICra9ZMr99TF1KAsqtJ2rNjabPB@4(%mf}Qooz$`@aA4;XZrL zoSAE`xn>Sn!^Zkov}`fG*O`rm_6*geO=Y`Mxe-V-KItUG35}C{q3YspJtciHyEjBr zysMsUdZsL&=g?Q~xtW#SAs6C)K%(i?`h2>&VU*#17q9rDzMA2l?_q1(`C74`-C3ks z`rc{lqFT~<>2}6<#Ar!s{VIsiya$&1wRqeIT4^ zwW#two*K_oLm)u52wnSWu$U$Yn`U~(S%@jqAICc{1}^Px7x{RW{>h2xK*I8<*RvjRN^g1u5RO- zztb!~vqLXmx;;B)`1jW`_j#`Wn(9`mZH~y{k*Z}|>fQ0YW``Ah;J+rCt_Fs`M=hgQ z{>L%i{r=xZer}Z0(p|j0%E=H&TY7judL1E^K0l65mZ5!HOiMl_YW@(|Z4Z*b0s2of zjX~HtWbEfU>(alQz#4j`i7_OT66^~=?}#`5!KtF#r0yH5okpERtEou2+Fy3s`)wgB z)b7vBK3Nx8vzM3g=+1m;eA;DGsj(>o8W_`^pLk}#&+CWy9OKl8^*0dut+JIqzaA$$ z6{f)3jCkmlIOB@TSpIj=K`&k*{E47uPMR{{;>RfA?cuTD@!jB!JB-Wc;kIQ&Ki7N7 z?>6$AaVst9K6b*E*k`%peu*oz6YkIz>h&ieY|1doSR12ojXGrvYvRsUUxU7sa(S;( z(Qe}$k7jc7@$JEOhg&S&wPjvTet<}6id_52%RBX2A&tCcXI#eX1soG2D1jT;d7}n* zWC`C}qi{|K0-5^yFBj~M`6Az7Hc!3(+#fEqIYUG~&8yPLuyIoJ}9m(}W^0Ne}kg}Pd|TnXI;IPE-c)6xyA6$;Qaoob+Pr~BjE?}W^p!Wk+gvOnClv| z4LRcqn_y{-NE#gA)YB*vL%O*Hd*2EHfXq%442CuSzy{nQBOs4jO| zkkEg_f9o@Q`|$AihyDeQb5b+M^f>9$-z9uqRxcr6#j<|sxZ;D#I6`e%C^kTh{IxSm z_4TW2O0vX<(`7+l?HG)l!J?QlUn7|e<1h7L^Ua@skX8X3%f%oFf%(ivcj7=`Uu!C5 zMPL`Y5Ey7>p=s1mazmLc1jbQTsVny$SadR{)Dovu;3kqG{eA2CoowigkD=L3^L2aR z3Dfybil*<)Q^Nb(xb)J&`L;HxJp4ljfq3p(R9zBCuTWJ2h$si+<;%|-aGf$VNRj_2 zV__9p5Zl#2D-vVS#8{}$xUL_V#h@YYRtsj}AG+LgYnpOUo8q;4F-iSy@qIZ5sN}mf z4bhW72-|Ios1-w@Q0;t+CH<10m>rIwibemy{$bzu_g`}bw;v)1eXj)?taq@MAKok8 zjeBdz@}t^?Dbh$thB!wO#ypO0>*Sa}(xzw-$mo?Z^hU$_C3URv%&ZfT!Mb)oVf-pO zXF*gNb;#sbHs$cW+~O7BOIz`!?6fdJ_kV^ESn_P+*n2dVKqwohvk67Jz&2;kC+PAi z<-a{G>N7pzdKV`(Cnzm=Rp)!CVN%Bk{=)*Qwozk z^srsjDDT>)2X#ZR@=p&&o3wGL@*~%*G`x#?d3!BDSJ+kNj@r&%(XMfvu)Z&)z#kW0 zU>6FN5NH|a;|qZ{*4_p2$d#g}B2O;5wJ(xyzSA?saJ9jSYIKJvq)&aT%o_O3J{)13 zvm9RsrJW%8fR>L->0JtM-XLN-!YTppST*dEPJuF@Mwk_~W|hh-s{P4 z9~{}4tz1q*HoC`+m&&#Ege$B47gax03X`WZ_^V2c1a>nE{%5e(^fKhaVtFc%zpZth z*r4EeT=US%1u-5Br68zXF6oneE({{t5ExbDf!C}}|3^-B@yI26A*zWurLwyTYBEri zn{nB*u#nz?*yaiXV*jF3HP+1<@}ICdu*@XaV4gF64sYHe%vlxP4a zW#|!pov)Za-2NvZg#bZI@BouYzWgD>=F@0am}1h(4N|_499<16`z6Kne6!i`Xg$t< zEbC$Cn{j)gN}TlFf+?3yT6jfsAG2TxaVLZ@X?q|_c+~Z?UOouKULaa?mF$tF&ZoC| zi<)6y-7sUtLx1vdg<3EPW%T7o1zlv{7t(CK9`CTovhOI7fD4Hp7XpsCqhHWZZzX1g z61Mz%$|jf?6e6q06nJpwV_;Z=YG_YbRb!5S0t7(8g!^rTU4F?>6dcpK+wB!_4gdSB zyG@-QqMg6u4oH6BIF;c9n;n~l`^Ot`4?iPDqnG~{52xuIcURvxTo2VtyL){BzHUkU zl;d(?$uakZd z`Ur)&%{fQ@6t7$?L-Su8eLnJv2P5r0^X!_&%gd~f)fxxCtbF{o#jDG*s+ z2@F{aGDAnWl5+I7sHNcPW?Y7=U;jE)f<6uliC>?I#O(Ri?ae0DoO%c1yW6Dg6+XWVTB8O_QG77?yVDSD*u5&iuj$WsM>| zlvV6ZA?iC^;*>{|=>US~!8Kf^a8Li!YBhO!((IE~Xm<)&LrrV79yl;sMjyDDT+2H- zwA%t*uyZ`h8W7jYjE~^dQ=u~o?3J?mIF%?e@j8d_M0uq?<=vl&<54g*!`=M0%EY=o zKh@m7lEALDD&{(-XKyct{&jeraDDW!Rn2f2`1%x!iK#K%T+O`!O8n?aq)>yjwUt6^S z0@11&MY^KumI|5iaXYoy?^Z@^tz^`VM^!e=9JOz(6{+;-nRskQ1fDGQm_~+Kg}yq6 zXrzrg?*R_np0JpO_HptIOU-^F3YM(i%gVkbg$lqv3L6(U`Dbvd^JSPS!hkV65-g2? z&Nz#E0PR*%SDG?vws(bNJVi~#rB3fh?jcO44<#s%Zne9D0KPRkVh3PF1HK+M{P6J`Y^&!k_#KjFqx!n{@;r z?A+oNYI2F!QVhR^+Lm>{`6rAk51dBl&KDw)Oj4)i9h)1TOZ<0+&xO2iWFIK;2C>5~ zp+d{gKut-h8hcs^Bp@BbCyihFkoUgPw|Bj3PX?cM!@#K1GoS;eMm<@my_&vX>eVs z_|VxqoILq;-^}Y0)^<(sp6*Yakp3UEfA(gLOv(9idu}Y`_p3_S5Fuu(a13=uDFMJY4;25qVqM8c6<830}qXWN|Cnf z&p&RT=L8ZF9bN$fB~TPm_iT1N8wd<61F|BIrH3ieA5PRc7;-{=R!byfny(HV2?MYI z2qx8~`JM6fco?(SRWHt5WH9kXJ!Tt(krbq&DrXl1)r}I)pZ;Ea`{SLUw}YI4a8_84 z|79efn3%Xr*8SMsL&>1MA~xW&1^a0A{YsWN^DVeDD6gAwV^KC;1%sA>JPrgV?u{hy zG{L>S6Lsg&EJK=(9lN&fg(1EWhH1iaFkI2P>T%;u@DU}iivEi=wtuLAJ>W3>h${1p z?4>eu^i0fGZ5`us%)@9u4JocFh=KK18S^4dv02Ll12J3{T+$G(Ww)f$Z;NS(XGfel zE)D`S=GSutcTlE1ccwDn{-wYpUfjlc%&?N|R|Nqp)K;ue1*tGL>REUt2t_4bkQ`Wm zNn7eJ+JPfjwil|>zq5+5tkcU)!U2b%gP;MVne{#i(JTO9S2tTvd%U;a@|k77=#4$J z2OpE=_osqIHe8ebn;DrW$oZr8x(62nB?U12M}K}sydYc$A|HCjHA;`O7Cyb%aR_eGDpliTJwY9STKqQ%xovNb<%$1oCg8JZ+^cN?tQ= z`c8tErq16N#rsV!{@KS>e_qwG(B2|63M^Xzcb`NA{tHQ3zr95MSo{k!>8!CI3l70jG&NYFx;lk@kWeqHBC^Aw0AJo@eC!LqIb}Oae7A2UYu|vdc{zA zAne|Ok@BXjalu}w*dY1ovQ6dEjUOp3CmQ9o?H80b7cx#?z z`Uj7&o-`5-JpIZ@5dS;`79721HB>zRS%9)EfS0UB9IWAK_!;Wl?(jbl^6zD?3n&O| z0SOh({~rSMd134IepdaH(SgKq@m>bwi(sf7p)FKhiM>n{_&9czn?L%0U!L(K{=N&R z_L4fR&6LybrO+}UEFs}~_XfLAMmeeAh0Hy66$W=y5{4mrS)ENxI<+k&rna`fbxX+% z&bnj!dvmEvfO1G2Z!; zm!zxlM9dhfu*BpAfy>zkgj&yR61jwrFB23gFvyH)W(*G6@n$hL&urD z*N)xLXQA>^A+f>DmTQ+w!F4clrip;cnkySlD^8YZ0h#nL!6%l$bZ4=I3l*9((bokY z&gDE!PpU=+?>IsoUiUOJI>~K&D|8V|;gA_SSd4a+@rN$lIwCw!F5;pqcv% z&?KDsLZD8jvnQg&@ygc~-MwNnU&ZTM36Py5+Pn26uYt`Nk-SB7W}XX&x)T7%7#HHoL*xab>WyrBW6ERC zEUiN+UfBn)=492a1sIv(SW-wjC`fMbj+sx#SoM*a!IoWtj!WG2S7~TGo&TDb1z*l> zwAugJh-ppPZJV{v0@{#4RhfTQQ4sh`AJjbMF#9>5(!aHVr2o)gG%6{Ks1uGJ=cJ3^5+`uV1GEn z#Q;xqwwo)hu$!V%&b*p38fCPm8d`!0e$pkh$(pW_rR%)mBvEXF^KUe}`?D`Y5zO@})8t?M=qMA3CG6OKo|y z52rpLag{M_t0Xl<1L1R2t5Cpk)GHlCu|d6nMd?-rNSW(~%G^)|9VeIq$IDG^LCfTL zuscbI2D**sG`BV#7t2LRzM7%jwi>M&aZIT!*LK63Ceu#)Od$LTrI)#}7)r+OAxP|9 zySEKV06cv1pS=DrK(OOH0Hc8Z3ZzVV7p)maVQAR(uxfX{QBz<9eq5sn7c03ETQUP% zCci)|QBGVVfHtxI_X~x;*CuZhCI^i;Vsyi1!oV60thb+{;$z*JHfgcnpklBz7Jtg# z0P?BgI0n48wdE=Y8qo%26`#i&Fc*Pr*7g=R*A3M9sTB)h#T<4+Mvj-4l(d38jhy%P z^|<`@P<5wW6kv|d5ibDh!q5KA_fw#%rvwQ01RK|%0Mim>g{781GaKKf&~-EDv%!_CfIFT$}8f5N`$~v2GBbxoJe);sVy}&+5ipDfAPIYnJPoS+ukFcpMb5vPT4P#Y@E?^#mCkMk1I-a zfPz^3VX5C#12ndyxD9{V3pwUToXg+cqC)*EsrAtCT1ZOJ$ru}pgIGtZRXSXDTpu~5 z=S&BEfFFkissiRMgN*8IMiAeV&C$AtzMTT1FASsva z>OZ@MPO!mwoB*tC8P5p=#+KH#mgEm5l8wLN_$TWA>Y|<`=}M@u{w=_zs1O-*#q*@t zCv6Iwo6aTW#qr=ha!EQx64j5j50XO{6ws6GKi-0e=ybCCG#~6D6f}fWTaP>so(}D` zbli1#oxQBSg;o18$E{;1JhKE32mz_4;05P3NHV05HG#60Ydd5PK=h9KbEKug#P@`q|}kEafDXb zncvR~VvqtWjVJ{d$(!es5EGLh7&N9y6dAfmDC|AC>F2ed;g=L|atYFm6;sh}FiILQ z!GJTg^`|_ly$T~#*2jF6zX+YqoLgineUf(u7?3^A>DXYQbiU`J9cji|J{_lj@iqIy zK(AZd=Hc_!uBUBM_fPcsdOb0a_6%qfn3^00Z-2)|!Kicr%ZYgodW)`=H8PlCt-Hl_ z=(Ccw7WBJfVXAC~U@gYq%rR5hK0E4!8*A3|i;$xXF)$rTNyW;U)bMqYeGhu*3<%T? z@GXv`2S?lh+clz$mtR*~NBC09jYpnKu!OWX(ka{RHoej|n-*zw+@2&N_R&{U4DXt_ zG1v>)4+<6h!`v7yhzI2S4!=PBtn;`pqe#Wu{VFUn9i52r>ercZevb|zt*2+lSBrov zZO1@OK_iOKebBm?ByV&8RV0LlpGv|PtPYZIvVe6g`W1I4ESHL86Qi+zmQ<}5$S zgF=%a@t)R|E;^*r=3bl053{*{?=@nNd~G#PqzH*Rwx(??&U7t1#scrhx8wm4wHl`l zuurZoGpfF>m8$d4VjyKFq5Ns1z_AG?0^w57TPjFzyUGMV|C4-g4@{wKbnY_0Tu>jc z*Q)gcQ|FbPX_o+KN6vNhdHSt!HPq!V(JZG3`^!qqXEG?Duo@KM($0pymOM-+$ZJ2g z{9h24)j#Fq62}`SOK!~$9)EgnRvB6mgZr&(V*CCZzh7vb^&cE$YAyroDY&%VjJ3JuvKZ^J}vJ_s^-yv`lpeb0`d|_31d?lqrVk>AX2vz6687G9Ktg$?dZ> zPKB;_<)l>fSU9~aTdNl-O<4ydsPc`wKh7!A0zsY%lzD>Ch>Sgc9!;d+U09Oy)R#{` zR-bM=$v{v75>unqL#f1SI<0(o*XidlH#?8F*Z1R6r^!h@Szr88u7f-7Oj>tuXmcAE z7XmLMjN51t$1aRypNxa@_@n7~pT66Mzc%zF*$T(sXhbljYabcf)?{5Plc< zmiZN|L4nrZ&K*w)0c6dQ5aA;uW|au zkLRa>=M{B55)U2^K_dRSVOQ-_o5OA<|6OHx*OdCrc0{lGf5)Pi2HaTPAtzaGo_gFr3pT9KkY|!4ZGzzmRQ<$Y>vb_5*t4MDIfkN$U-fuUDBI1*R zC~VGTdQnRlmxs~HD-9N1Zd1H%hSfh*0+ij>y|3lcht)=82GD>$YW2STvh3O~B014F zp_Y&uHIIbVl&^&fWLq@xxAD(nZ?+OF~&Uu#4D`lsJ{VI{Wirq$@TTqjMSWMB=< zb6wxbU27X-4ubyZe4Bn-!vG?J10F<|jq%B*>Mh^B4f6N)dnxHx?9E495TugWiEJjDX8e9xs~s`p zbFg6YZTkEA1Ua2zAuftAp$d^<%PgQ4m_P$7x;mk|2QL)}MsRw`S^*J~-y8)5#zUGg zj3|OafYgSQLI$Hn8LYagoOTFdXEU=7xQ$rSyC&>>^s5fA66(WMeB{cm!U=H^OA5Ls z)|s!s7zoPY<)n@4Fx!b#Ub@TFVTR9C0~HHWQ*j->POn8Tjigfog|{DTgCk~;6?GtU z#ztXuUrQk0(&e2%8Y%09(Z%E(!l^xUuu(wCkvb;(XT?k1{YPM+5=J4M->aRv%`?yY z=hx=4r`N#o!wMQ(z-T$w9n;@U)uSl=!1K(9UB1r(!(*mIu0R^K3qnee3{9xtQ6&=O zP|1SF6?CF8p*Xd?_8&#&YlW3%KO5=t!e>}k>+4>|Diq=DX4!Ck=NVQ|wqhM0$(K$V zdv1f?E#u0=qD;>%g_i^*o+Athj=l?pitrMk#}!L2-i_z0258XpLF#1>(ScSWNB!t z&VXBtQ$0#zI{dR?uFavGO2MsGhUS;i+&&b?o%ph4rK%E`F@#-3C+qcM7G+$l9?L+o zf$|~}$Qj>UkfMM}(7RvV03o~aNmW=a|2j>s5ZPFR^iylf>;G(8;&~JXh~qztN@|j!0MCb#fs&QYJcW?K zHi~vm3}Td1I*X$tW6~yjFqW5e18%<002=DqUtK$5T=ei2B$MNiq1Ow3nctT3KpC3| z1EkYEax~`YHMID%|L3qWVf9mHPKrDz3G-8X_Kk1tvw|)2bl)O6{*Eu%t|3~Rcc#`B z>6Xt_&QBh0^U?u_IK^;r`~#32>s;fZ@!>HwjGCpSbRP?fDG^)BxY z1>1YD?MQJ!IfKT(X`N&gXYeYuly`~Towo|h?l4lYN)eJI3x+@n6DyKhMiS5cYrBYU z;9M%mAG_)z0cBmVg<5CsI~q4;eh{aZ`SlBzNHM-`RG9!{O|noZ2MZzhZ65TDR(NK% zThGMzc&2WPV5-{lviwgs%;n$GRr;gOf>|?xGL8OL>pb|!8XRR?S z84TQx1^n9eeab|)a?x?34?>O~4pjqBYP9PK>JMd|><;hiq&IHs8QO1^&zo%DFLV$G z83EK%qaA6KATH3aSUC<1i*`=^wDwca37M*wxBVuNc31_dIS=&4vmQutrR?!%ta}~j z3T$~Bg{dR$Q$sdbW>m=xTL5b7!xL0g-Rme=?UcE$v&2L`N2Hw>CEC!0-Z3U}52e>t zSQxtysbcyePcebQL^9g{zKL>#v|N8wd`m;@&U5Iu@bB=Mfc;fMQ5QmoHUP%l^5x#@ z=bAI2pya88`{a9tl8K!lQ`@hEMXrTPZ~qp571eU3DspdA*_RMRykK8f-^yAL1F8Y3 z!)L=AqXAf(_YG=VAvJU7?~&o!)@rrX4$s~+nO3Im7)~F+sqt`Q(K4 zR0Ap#2u>?NMLm1bJGV5IJ-6uglxou_70GB7QZT?);K3Vs8$tiCu<7b|44^9W`qrTf z1jWD7{v#6qtcG`C+r4_9eRo)n&q)mH=xrD$d;}>OwOHf2+uS-#J3rhmVO0CMF9KTusf{EPswV1pe z0W>ZO#zCJNeA{%ty}D%&?@7~=lW zc4~Surf+vRSf07{d{kN>^oAJ3X>D%o7Y1Pw(XFOws#>P?>4|5d2vjd%_|of)ArtYf98p7M^Xg zQzW)|Wj2JQdkMe2iX@c$PT5%3CC&i2|Ev3hYNWpD*ANy|qHf-UiQ`cRN_$#>rWM3} z)|jf8DcUCpawhH_EUeUc3e;1`*b&eExWzWPyUYL+%ZYl?#Hy#LLh%(#4pITOd zMak0i?4HHQWDjzwu_5xG9eyhntb`nPCf);W&Cf7K2{5qHrX#f_CYW5*LW;6@Ix!~K zI0)eh5GGdqV^95b0&V}@z=tpAsrix(?sLZv<#Fk8d_p6NK-bBCmF=|L=dlbA_af<7 zf%pBb7&AV=Z#WXUAKHL_!H?mN7tUwfSjos*pNy^fi=Q83N9q&JGeZdal6HLKQG1%O z4+-G)GW={@KB1#!wm;#G^PFFE&y?>cpsLN@@gbHcW@V`{?JkgN5M;?-Agbl6)vMou zJ$F??T&tiX0M;di235pVGGj6`=j=#Ev_vD>;_9V4F#qekjTA^KcsqR2-ClD$6o7}@ zb4MNHhcL_NuP+F_@5r4l>TkA}t?92*6i0h~V zZPfPR?Ucm*9}m+&o7)WiOosa|->b6rYiAtfaqp4p79ezOd|=?&yzB`k9-t-Wp_fej z{I#f3joEU52p}a%Sn4{Fph z)%2!?jgRSzpvf_>_65T;kzYT;b<^Mab9{u=Mn5Em$aM|t9gG=yse!tfC6X-oV_Hua zRh#@uwzG;e(A~6xikR7k#vYQ$UuQ;*0QI)a`SI3=1H!|*UDF4=^PiUbqpvk3EpvRf zyr+)ZU(D<;o$^$_aPf9pY_;F=+yYAYTa!=TNz)kKBwYEut)?r_^Q43jLF((@9*+X# zi+Ek4lK3lJlbv6wQOYqUWHrYTj{gh_Gt(*MKidLvD!_p005|z{ zX$Y+L#w~@Dy6m0xiSjHOHVxo%B$QZ0GV5Q8OTRt@%A{$87slg&8;a*D-O(CgO(%FW zxA(T=VgSpXp!#WP_Y7XmA>Hsr2fx|%8AJNF_KAg?8$SQ*IhKbT#NDWi$oqv;vkZV; zuAyunE+^R0`Y$AWdpH=sc>qSu0JgR8(56S4sGfr-i22>JywZ&lx5!~oTiy#4aq<-T zwg+6B=>6w;aMt&QtrY7nscHr+MzeWz#P2sro^pLWxPv#fM7@KY(}*lC2dM_`uKHq$ zDO7O&Bs#*1$toSgRCh-e;B&bZPFxeE;KbeXIgk?kL@Wg1AAs*CHkNa?GJjEhsex6y zT7UJ>6PLdHca$&_Al>*5L>=P~d0cYmZb%ET0?&FLc2B4b)i@G)UNI#yHD{()~g;pd#~B*Nsv39R3lrGqAJQEQF+uk03frkWW=D^;QHcKMkoP5aFQk2 zi-=~9Fn_ucWW!0Q(FBs#B?xlxx}UuVta_z z2kGA&Pgum`Gz|tP+gkL!r&0jt?mMH5^J1BBp@hZ}Io5#R5$6FhN^NrchT=r8zp%ZvZtH zeIPS903n8z)oXWH@z$Muz(jq z$3Pl^EsMPxBf(`&40>t`9{*{aBoG61Qpm$`gwTzGv@NAr8N5bMfP%U#Y=WeAoVOt) zhk#70mtP!1-VEYLVax=_)ahQzdIRmM2Y%dUR{}lK=Z}{f{|eSnWV~V&2K|NwP=GH$ zA_+9+LlxWvRT*71Gxr(?J~mL~W7VwIGu(tljP|5SmmaU++LZrl+dXb|seZXg{6!+v z0Y!Ic=&*$qFJiPcz*ISuU)a_!Vx*AS8SJqyKiW%F3mS^{QFCDAQ;qR- zc5VAKe8Js&fxiUkXq{r3$cEC}PX>-Nu7l?@$RsmjfTp`1tYIV4L`Mk#F4c%p1s9fJ=m4z?1wy1H`$W@^m}Js(RaSV4tlIB(5`1^HqzTdWd(a# zdCrIyJi2W&0xgzK$FN3|^hL;N)dd_~$1(pp#`AqF8p>u21&6vSZ!${!28toii&nzNlx{t3Im7tVe0bM{+C4v;=WlZ%W;l?_9nAy(|`LYk>@9 zt^xd%kO{`5G0ZG-V4+%^R{sk=~fU{I=p6UyE}Ms3|QI&QWwQ0W_#)!$>%ce&GVBl%z8x{`Rn!rqbO$ zU+B;MP$oEy@cJR{t2+~LKuJ&kn;OnA9*QjsPN|JD6wR9)0HI*`y#e>}LwtBS&+10Q zo$?mm4A3u!S5S^U9}m4N^xr8!pVbqU-OFi%OW~0ieuPyVVir&y=~5a;ul>~EHT}vN z&dD`Nos1$0<$-gn)eKXb0_FW^zh&piBJ~mxiHa_oQpYzLzBbkWG6+29T=nN>qul>P zL|1J$4AzykGgH=%p)#RFW8eaHJI$i@eil8^FITQ$DOYs`HbFgc(t$Zncp_uALeQk8 zv(>wX&R+k9XRP~SR6mzAof>~pd6ccu*uqUbUYMfcRCb9qX=+_-bbH6?HaV!x#=SZUl;9bb_*}zXYG2m1tp8(50pwx=bbi2jDbeix z8)*sXyWKIe03^3#UywS5D@BOv#NP6o3Z*UR3%&*??nYJIR`L z;Us)~r&uA3iqEQBr)na02E?Ltk+yx?k&n{XtBhRVFE}d}ZyIv>De12lwd7#MD|rO* zy1<#^-bm>>Zl8kjn;80-|sd=~#=FsQs1jmC9rv(+{f)SB5v)+Rm<>n%vvQqZ^ zb@TUpSk8M4b1;D270F5WY$>f%%qK?_4k1aD6+OqEV`FeWW_xS`D`BBCGsADP?bK)h zEMHZwK=f1HP4Xip$&)snlsXuiW3CTk{L8~pPKW){-O=kuG)YD~z3Mn{G|5->rT<~H zZas9`N3Y}n?a(TRBb4zlBV_RUA_`v42g`&Sim*H{Wu{WG&WFs0qL$!`ONsW+`xlba z_^?5N6cv#0CUPqRviq)og5z-_DFG2LBp$8xy>Q9XUggYgOb4DTGc;VhszKC#P6jgF z48URsQS!R2AW1NfmnG&*pfO@Y@x&Rl1DW@AyGX~c z*6ogmfb;NO1gB{2i;Byi$nfjK!0STq$I{29>P@2pT2+`fhiXr~N6HGa64gPdWr&$D zoJhM~h$pl3Isj#}k9KfXuaF0vnYyC;ZTd~jnw4@Nhc&@>`?eV}I%5`ixWwG`2v?R{ zinGrp7i%LMhlBcElKIFcP+yp2#RLTcAi!|Sl?ePO;L@YO!KqvWJfPtfJPn)*^ZrG@Xg(b@u6jbz2KXEsK$AMD#}Ph_z8?3zWIFVyJ~($)w*f zWJ$)3hoYNT6%~EcPuqlvD2y8CWWd)w2;E)4CiMoQ)7~qNs%TdSAOPCh_9tZNpCv>+ zRhmEKKgIqA)cp|f=ULNf7ZI}~d=idJKx@I4XJEOF=~Z~k2+g;SDFb<7BQ2+^Ys!&_ z>#*W$#KWb*`Jax54ih*EU8n;L$`_Snz-eu5+mA{9<~toHh~+$${f;j7xzpBZe2N5V zSS@H_qX|PMcE-DSQSL247?)d+`sSBKFH^1^gZK&RD2r+ieX$z{IAIw)8<-kLA)H#m zUoeyb$K1q3$zu>#d9A}9@*KEwf=T9zwbL_xI-dc|WnoSVG#AOY|yLD|vD^#Grx)&?d!9pdkYe7b@ zumAZjAvy^-3gy^Pn(EFow6cta`?A&#%3a?|4f?wB0IfqDW|~A0LL+OZu2hAJe~}>9 z=VhdeGM>z$HIKR*(N7L_is$u8O0GQeM3iHHB$sQL?9m%IGw&>;aPmF_T3M)Ol{yo* z1acc+{c3ZX1Xz`471}@ir$Er+0`A^qR%`J-OLUpcwXU0ohCZZwc*I|>E)jhe9NI>%34vEE=M-XIokIhLUie(LZy%Cs8CYb0UM&YybWQpgM|R+(=;F2(Eby z6K9|SnZI_XWtD@>1lv;bMXZglsD2n`=orZ{mNW=w2nKdU5G?Y3c=-gOSE3!n6bhGV z?6akj$zg4rt{PDO5nLbLfc*g=2#2Uc%=W6q9YlDvKG@1IZ+bZpyo9y*g3xqyXJP5xDE$7e;N5m4*B zBV#xE^GUaNsZ*0SRO4Oi89OswD=@EB4rti;1_%W_agJVp2Gj6O&j7FKk>T;W zc1vwPwd8dZ=CUqX!Ge;NUNUrhsJ-4*=oXA656^zcz_aR!T#V0a+ayW`Qfb~iu^irW zeh{wq%*|f7z*aKB^@&$Wj_ zS9PxyGs_yi6mollp`R2%vj5KoVMpk^sU!3rr?J#Hn<41kj^(Pd=b#AU7cPAzhh6J4 z`!^ICTKmyxztDfK50{38dm`Mu&2sf=PaYEaw`>wZR8lJ_x$R{wc~S)kR#i8ZlC#lg z9f{VGyFo_aWod@~xfF|+5-l=3gQIFGaMU*82FV@c)UxV+W75=i8+1ar2VV@3)K0+bFH>jN5ocrRfMjgF-Q$~l5t?;kug ztf}@GQJjhKTNN>Z6e$u6dP0ph)ruY?iY(}tIUMA-X{Z_cxRG>bJowM!1iW0;hhq8a z;`4{X7pSNTQK=M^k}{--|Mv2*mI(8pj2n~hpkM5#P<0}tY%;_F zZ?mqsz%SP3D{H3KwxZo2sY<;N^588M(_()nw=*hu)+g_L4Mw78$xEXo2fh@0Yueny zGw`9L1mr_xNrQ9L=tBWdDYqG9V`M$^u19>7^}x%D0)^13&kEEV{KN zLTAIrP5%iZdg7vw^ECkY-4<+HMgZ_7vE(qe`9k1Jn}C|4TlZSXlX5AS$;r&@AYwnp z81ButCLO>$DC<=QC85XFN{^5js|w^tx)B+c^8y4AwxA-piu^kCXs|r^5PYPv9jrC( z0!Flu3$rkCH3^67_-8=bKs>_9#?mcm#6Do;mS8xo+JR(kum zL0)tYpUvKBc8d2FW5&E1%C9ph%>bIb!h=4*#E)hTWsjDSfvcmUm z{JVbL@CsS=;eRf3=dXoJ8lE8{b#oDoEFWQ^)_+|+J zN?mlBuu+#V?v{qI4r!L%gzGqAITOdq5Ls1mChL7*;*km`GIknf9&B8vEvw9bw}GUZ zyhU5Z2W8BmFUnxNY3nZud}FeH^}}lAVEaJ+twrkWlTU&}Hwcq*?Yf zNXkegnlD60vY`!ozPkxv_mynq4eZF?rrMlXF(hNJOQbCvqIMOn-h`HVVQ&m6W=>3C zvIp@UW>H|{L=_9aphfRyem2f`+MqilPoYW_4>f#_uB$#^idGz#3M#OlqaKP5@ z+kNIYd7LszKA>!TJ>1<=19~%rr0ZIe6t7*|J%H|8bFe>ofR?(+95-4hb27i?C&aXA zdG!4Q4=46is=#P%IR;6o68X?YtOJZn56qKXNg%ZhB14}1=KX#B1vAL(rtJHuauAQ| z`)0CbN2@gtZ4G2?()&3O9z2xAW57a3tYn3fRYJlENI}U+chPpH3e4nConNLYw!g%@i$z@* z>iP0WGA@AL%Wa_DkA@CqV-0vs^HGQ1140veW^lA=F2|OUY9Na4zP%qDLPStjm5wOL zOg7%Sw^vJ3*0OqL9(vJ9@p4r!Q&}nWRkvD9jR&iF!vzb{l=kGyerND~J=Z=4sLdOhOqMJcOF#i!?cI$KyNz!RkwzNSaL5Arj+k2pcvcaQ?=K)#1*6`pfb7kW8ZTQAd0F6@$A5Y=rk4F zCR3L`&g6mI->cC(lxm>Rjv9&SbbpmuospmeF;VL*UIRKE35Hqw(aZuL6hWX_csGaw zRFW#hnFA_`0w96r8xiTps=hf$2I{B;s6K7NM@?XYSG6i(Iv~IiHobD1ux+YB0S^g4 zV4Vrg?q4sbsoxpWyZ@y}?afyQuPpVA9BDXLZnL6mOqY-WT_o`bm~`JTaJvx%CD!zh zPgrc2-vwP4RgKjD>2}azLWQaTqDZn`Dq9B8-{F5wfPeR!m&|1C4_eqc`I+dbQFPQE z1@tZ^&#r6`of8unlMoL{pju-Wm<;SyuIM4JGZFgz#lG)OBSwQ&yU ziK^LI&r?7tz4B!F=2=%l*Xt!V18JaAxI+J<#c=!^ z6YF8aSCoq}cV4kW^dDrNWtiEAinzP8$(@} zrw2{Bb2WKMD!#GRk$~oIXQSAM`SAty9^p!D98*WXt(9uhiWXzL`(EivI6~)PKu$fl z3DZn!J>zOqx9~Anl<@f7|6W!g@$aa2nH5Uxin1^V`CXRs;~*)gcVV7@6@CUnkS4Eu zBw{Roo$r^m?K>b!=1n6mn0{oZeU3BJHD0Cg*@uJt92QOq?mJ8#%dof=W(NU(f! z2Zv@d&hz&m@cAgv%8~{?O|+8OiJhv`=eSx&l-L;=$A1;)d4%C5cBSoMLCmH%J}fB; zNb6ZfkJtbzDl9IPC4=!lFbasnP~>}4LA)$yM%zMMm82duT(WNNyxXh-S|3D6vAEbj z^l{MgL-g%rHit;&&~bp^G7zXQ6+eT$K2Y*Mx`eMXZo~0BCXFOuj+9OUO_|@6VTmun zu3(2Jb}Rv|I2iQ@!2}$}K_KrkimfgZMnCcFtk)92gv21&wW3dn?b3AFRZ!5WMgQK* zF?26r|05cxVC1l-xEX9u_ZbCJ+zvOP`aX`44ulk|0V=|U1)e8 zT-~=8qNi#5r4Fo2i@p$hAYNihRnP5k1dSLo*)2L9M4!&L9ij&naXBP85)@Y12_r^5 zxE8IrG0)rR=8gUuMHvb1wM064c(s!46kS89@pMeRt$hZEMO2>=<|nESr_L$8in?V)Hz$P;w!!f7Ozw^FbIRc;xg1r28f63*_{`bsh=03+>id zYdj-jpQ;Xd3Lv5JsE5YV(Qid9SOHc~oy(;<%|bc9oJ>vN{|8VZ3*32Zjz!YDl(5a) z>q-KL8pzi@qD-7NdGO5$3DT)y6N`b7G^xEn2IVv)=Y6mSNwi!b9jf(lX34Q%djbdp zp{)ELIF#P%V>-~&1YXW$TPPPf=G@$V#=dX9jnm32BY~x(WFzo;mcjLZgy#as8>Vs) zz4Kse;D1!_n)z#(qma-K&Rkrqw?G*wwGtgA8FTbk$$T5zE7s1y4RuM=krM7~cJpoA z@T`oAYlR(S5eH|0Q1*%)4hV`0qK&68$&rnLX1;dM`W<06SVVnCyfm$7b3WO!emL&Yl zg@D<5Xi_b_Z%P8a|F@-t^Ka4?3qO*WC+gKC9;R1o?xc3{ja&;yrJ}*BU6$={vr<_U zep9X8M81_hpiI}zx~BkWQ*LW z-!Y9J4cfIZ$aJpw_?lE*&zRn|`=eFBno_ks!w#agI0 zUaZir5bLwmd)y5VcqC!g?t?i9c;Fq_@YLv&M6uIyt))z^lv@MBKsT%sHdgoXZJgk? zz&^QhyjNkwg=o&NoWcDnZbOn7K{cI(`4KC5j8s4s!)LYov(W~#(K(lPGcfy;eNC7+ z?%vi3V)-^@pdM3q*XTobYV3Y%HBrP5P&2B!d>uOx@aD;Z8l;EH;}ml$EJ2Wz7$^?= za}$5r85TwhTKzfqY3FuS_17ZV5f!NHZLma$~P{yZsf`Q<1|1&wPLAe|O#OvYE$QyIRbNpr?jmFB+gI9Q}@ zS^L+OvVv?uf+_LeOtTE=5yPu>hM!(&bH79+tnyDVC_KG;e$6kv1=> zD{vQW1>Dp<@CXUP6)Lz`L<*1*?)EsmmX0uH{6d_>KnIvaKHB0yoX7sbz9`>&l+EPZ z*BTAA`9jY+0$|YRc;wC+dyv%PaG>ClSMXO>^J(5yhC5yp>vxCWmlEAw_sCqQQ&^i^ z=iFCG+?@qi?Qby(>@tz*SpXN?_7LLuk+jILc3->lW5yf_J8YfpWi6aZBFlJq^Q6g{ z{^^55* zU~suxzH8Eg@8%W?ro+Fe3ok>>0 zPj021G7LeyZ!S!QA68#WjUx@c{yCvX$nREj6_6mNk?YoF^P>N#p_}j=O$7Dg@E>2+ z>?_m1ewhhUeW+<@MF5#D#L8nx6c3V(@YT10>ND2a(-5Ok8r*Ef+0I2j6}h>i9wAQP z8XY2jtA(+0k)pl7F7qZPJAihQflOYO$SMn7+fnn3hJAK2$!)_Z*|xZMywjTk6k<0& zu_&ZFMcOu}ej_ZjzwSTg^+`pt3SXh}&gJYM_2eK1zpTY#HWS?R%sNa21-nwZI`%o# zqjNV3wi883$0EtC4KU|y&pn9{0#vuDp4 zZJu}y`s_FTJ7TwgXUhE)PwAsWqw!)n zeqT3>>>o2wNojO^VhJ6EM3IBzY-GyI5V7_;2K1|z`wAs~6%$e%-ljRc-eS(yU!4Er3LIy&0ec)EKrIKHhGvsd?3aL|s;fC6KOl0xe4-0M2}mYl9kv^>ks74lIoRb+R4jn)Qp`KeBr@ zY}U%Y+}Rs~qhp)DY`rILB27fnlMb#U`^MpLu~r6VCN0`=X{f6c?KN&-a$WvQxHE^U zeE)C%D-*2d_!w*AfcsCA?p#R`#Iwwsxv1msJ$M)S+EeLGS9EJpRvM5k!2T#%=isMi zF5!0J`~bwCJ0`PPA&#;_cZqbT-H@;Q9n{_L1SzOc`1e~5RJ%phAcMGzj}p_%vp0V0 zt{|>%N=}ze6mDPAS5NK}3cmwmV>JmyhSll-_QV(jXodhbY zNl5gSs%-LlRPsRWz7Xm?EUR(ZaZ?P)QYozr$e zg9=h|a!1m>Y*CYWUb~fCH9U085@cV(QY-ocUP=izVXUJhFZ~PkUI?uaDVd{L^5PaE zHhkCdz1AJKg+Sq0kg=FTnT9Ka)bg`7iFnVu&|HL zh%st(bctq{xL)UkckNwy^DU!^Poz-sGsS3)0P;{hy3&A8ZK}=KKe}FhZGsk(wGHT} z?lJ#h3bBAlG2!EBs(%9N$ouAA5>RK}sQSKFT+HM74w~r7F9V6UG5nFTRrsjjFwBipTfM1>b(?YJ3~wD7-lhh+`R9s% zTZlBlb!YQ4+{!1;noM(OoP5}NSRt?SjGoGCN#1`PBu}t})Z<^cq`5n(bI%k6kpSZg zOHu*50`3|mK7E?Rn^S=l=N`Iqm%pJED{%H1fXZ(_es*a1mea5f9haV>v` z+Bsjh-E^9%7fM0}ARMyW6bT3V-Dd|r|2g8sp8P7vMz=Fnwn&#J1nv&4lt37 zlxEHbZ4^HudX=J6x-IwynpF%qfwm9(JMuoi#hb$W+6y{IVkdm02C!iW=!trVX3NN0 z>TEk#?ONXT`OHNEY#sHu|BXk_i;^*+uAq1COZ-wZ3B9`N2+yV#;0? z89o|O(KxXs3-(*}u)LVm-~H4#sfS--?SS4ntn3OX5~fY7r*KE}^&jH`%2i{MsKVlg z!rKoRIgoU$=m$pp6*XqeJ4n&R)EVJ^2S+cIGss48^DD(R$$I7VPS z;zpAU@C3+3y-I?Os>k)pd6)lg2n$6XhJ07jY7_8$^C0kK=}?dB4pDR&zIPyuIzFljWeejOk?ctzoJc57UzmBWmWF zRq%3b(_N*0_}81TF^ah*bN!sPx4sPND00?YuPZlWZ3NYMw~9;Y9r8;Fa{@1e zh}F_C&bLyJ(uF8uSA3wZarExm6srD$Oi-)Xyu>n98Gp>+#KB(>oksknBa@}bU<0`R zVUB;*-_X9rId(LAKMDi${40o=}98+A$~;pd|Hg-G`?k6>4O*Dsa(Bq zO{QhbklabaBd=!mJCb5}&>y(CH;cG@t1!|})jG2~?%v|C?siclsCjJS9b)f4LhzmK zWxILNDT9vxp{bZb?o1HHqn-r>vo*A&7*)J$QT z*vb<{%in{ym>y3lI_$a-Yp(3?PVhBy*gRSsNG3u+EzCs!+wz*@)hO9 zj(nN8JoG|ag!0G-!LZ&LdI>G%6!wLXDVu6^ZND1y_W8QLBMH4yX*W=cS6K7n`eXVI z1{pM>0+WhOIq}$K98-v85wI{CQ+)TU%?}x_|NRvGQ7aMHL>F!ANw;bS)^syGiDj?% z#hIGGRI^Shc(sJ7NvO2CFlM30C>bM=MDZ}|B9y@_F5g$z@4VudE5)S$EP6hT*!@RJ zzTTQ{^3$#A+hy4GTA^VrU%*V$PB(ymYY5q^By=MfQn=>4+VSJKM#hn}!ulQ({PWeG zlBE$G)W=ZF5LA$mqgmVyH}5^#){~pbR+$tJOuVj}K~aD0S$ehGO{+}9MY^!RjJ7|- zFd1SP^ZuPD>n4SLEKn2YWWpl8rE6;Y4mvo+J148l+$^BIESsg_^e}`DM2!)Jna8N8 zhk1ZH+YpLhET=8wn<5iqevHcyY}9UO!xLls{bX&_?XQ1`-V-C>7 zrflRuI`!KXZR%mN-zg!p&7I%M4(Mj+v|fb1G8)e)d|)=QpG0dl>u5U{MT3LIZ#lnD z+D)B*WjsIcJjD96N9GDs9r+ZBg%`}f7R(w@b+Zv`VcjPfNA<9IuFU}{aKPSKWCH39 zeCj6zkqDAj9&0-6uAl-N80wnp2_pAD6TZl>S0v&6WP@>fZ9(4;I47w_bF~}BUab4Y z?cafusI5V?wQ2i@3ni;w-*e0LgF*e`r>&NKRKD-gX;(oZa`3d=mE|A5rXr|J92qAM zeiW$61(-iuxH>F*?2_S&`;0nG;iFm&2xt{O;jl4x^{Z-JHe3& zH}}L)7cSK#38}FNJcfN2h0NnNr%gCumTw&B!S zBLK7d=lpf{fu zYFf3IjUolamRNSF7x=A?kXpX(&iwMO5 zFqe1EwIMPl{LXQICX@Z51=BZu|9&w_CQASlx4P~AZ+J)WcC*evKK_T#Zb3aYG(oz! z^;qShPVZGOB}1Fz0;2Gw-@s`g_dn#>3lgwbJuU z&ftt*aoB1W|0^)}dz*vhrt#hvRJQ%CY4V{;FXPvk`hURzKJg<>Nu98x0;fak3d$_} zVm2PsO~up-Np>ERn;lpl#4!OrbJaJ35L$vBV#W#ISZ(b6s*MuWT`1Y5`(^odnY$v1 z3tX;INaNP&-@h}P=9$r;XecCUwBmPI90Th#2cXme|(^`U-|c5P7$@epQsvTgqJ0;QeUu{I9scHaHX5J$XX4o zJ#DBa)1Y&k*>5X-pwR0_XA}1FU8Js0_PR(68Mxo^uMiXaaYI0b{89J=H0#j*lbKzO z8W*7~8s}PutG#DlDArf}?wQxo5NqKwK(nl>79Jy zx_6HV$B)@9R`(odY`yP9fLpxQ`%L7=k8>nUX{eR{flHTG4`($L3{mUS|D3kLpr|i* zjhkmt>12tcwaq%fB3$SJL4Jd~-eSXZ4QnM--v|rsl;=jBTh6I_{g1yTpim`*W!~+x zO=j4Q?aOAiq$4l;RJO``x`|k-je; zVT+PhlPSNQ{ntN1P<0OX^jQDatLj)m5pIdlM9nyB{?WGs(mB%bYuTD2$Z*mUYx#7` z?Q1RG-$F}gpXW#nSU}Tjxfi5HT6piex~LAxk1B&cMK~Gm$=@42EGV+jF*P9J^vRlb zSN$-!-(gtzP8$TBA4*2%3qMshC zaoQkwYx-<=6_ESJkZ)yAbuJJBk&Dv$6o~@BN#kxQk*FGmB!5afvgLUSLlHSoHyK8* zMbIIXGEpi5C+&`N{szS>*D_n|h?n0u20nh`V0MF3PMfuA_>$hRCW&>fV};Q|+8;Ry z2E6J_>64&}76$dj;SF)@)UBC>y0-m-e(jTK`9Hv8-R_!SmR6}m(q=4adZ^M1hp_n3 zb^ikFWqCF4+A3|B{~2EX%-kpe(!cBf_{>)c>$Mxc^1~k@-I<^XP7BQivoy{RCQezC zUo&iJ+7gveo%OdMLfnyFp0nq4y<64TR&kW|rs0D}%bM7h>XW8me%vZ<-uB=3Pk2O? zKV0Z*GjHAtr_c&~vg&RZ_R8=dt@iS19_E+0t!}bErO@_niM_AO3UT@uLeGig zL|w%NW82Q4?14ff$@BZ@pV?^6K_WFvi8YL1F3gjDL`>r#@vby&c&_k8p zh$m~$wb{c3Y!%PYMx6mGnuN5XCnq_jr#`8{Ph=xPB$ za)wNV@W-lSQCE)XjWu%WjmXb0YezsuBJgkG(q}&>!;{HltnCd)!PPe^XOn=&&i_qV z`fNg0_IWyPEaD2S@j2LrGq9IINUqfnB@za_b3(Q^;0S5e89vI0emYX^{do5bNfbBE zglwlGDHGNC?@0v#+>>ZR6HAu-_^Fa=IKC&XQWO1u(5KFzQ+Ds!=#iG4IyZ|c+$gc$ znp`+%C6}{>7XnOSN?LY#GMOT={halx@8b;k>d28&L&`EHSdWg75{Z%H)#CsEcc`Jn z;TH|A>O&{Db7}~mVfRu{484DHX+wmLda8mL(*0Hf1a*=mPdatDs0JyF}itNe2=3@Lrk^TY-{K z>Oo~pFcco(Sftvhwk0(mWja~vZ5P25l0H%WkmY=fUIQIGK#N>MvXaY2N=}`aATbUR zN0!xkH}u)-z+YMkYge%I(|$hJUEz!r_~_Ch)qI*1>S)cE>dlrx#2meq z(pY2RBA+fl6?681_Eg;R+{Foo@CkXiz`K%^OHR=}*QPy|kWf#TEXdJF@~p8 z(k@ThJA0~4S@8Xl|HUcUasjdiz6y07z0+VJiAbV+lp~fbE=V|2_qHNu=mkB$b=}ec z;gFTjk0C}KYak-Pu=Q923^(6IJa=HWXGap}xKoPw$Xo#6MpKomT*Mb%J{Q zR#RuJGvpG$mp&RkdiGst9Vg`AqVa>dkfyJ?b^XTsSQfCU!C)i<;tNg3*JVig=JM1~ zJ8H%tZ8S^h>e-*|-hc$C%q}3IF4{zgG|-w|S*?-66MylyMvsP~WQDUr`jwvQDIl903(mKxH>mIit=5AbpxEFm zQ)|;6nZ;k>BwBvxq213u_ zkZm;}eWN+lNn1u4V5{qRKLAMbU&$c-2n;JJ+ylDZd%18s8O>}~|4Rzna*3Kwe8q>( z-RFSMwAlQXcZ2WAU_*$OY(c!~&At7>bB2UAaiSjO12%{bX$@(eqKwU}DGw&#$D}=n ze^#r1?57sGuS@r6B3EpE|7OI9_*_?sqI*&YoL)_p5ueW# z;=%#H477oGxNG$#r{NKdPOE;XBi?^=E>{67fhN|wZ^qZu{ zEhmz}2il>Q3(f-5QwuAqWAQ?=`M3NZ{66B(IH$EjI#>Yc@HSip&i}1JY?WTTF?Q@e zMUDY{*z!KoG!-nB?cBL+f;@4Qv9jZbH9A#S9Q!%D%lvFwt*_;5ZoUiOA9he?u`fBO(Rf#5p)`R-$ zk>kTG;i>s7e(TysS&@hV^~X<6{eWIQXgz=9+7, + label: '控制台', + onClick: () => navigate('/admin/dashboard'), + }, + { + key: 'generate', + icon: , + label: '生成二维码', + onClick: () => navigate('/admin/generate'), + }, + { + key: 'manage', + icon: , + label: '企业管理', + onClick: () => navigate('/admin/manage'), + }, + { + key: 'query', + icon: , + label: '序列号查询', + onClick: () => navigate('/admin/query'), + }, + ]; + + const handleLogout = () => { + Modal.confirm({ + title: '确认退出', + icon: , + content: '您确定要退出登录吗?', + okText: '确定', + cancelText: '取消', + onOk: async () => { + try { + await authApi.logout(); + message.success('已退出登录'); + navigate('/login'); + } catch (error) { + message.error('退出失败'); + } + }, + }); + }; + + const userMenuItems = [ + { + key: 'profile', + icon: , + label: '用户资料', + onClick: () => navigate('/admin/profile'), + }, + { + key: 'changePassword', + icon: , + label: '修改密码', + onClick: () => { + message.info('修改密码功能即将上线'); + }, + }, + { + type: 'divider' as const, + }, + { + key: 'logout', + icon: , + label: '退出登录', + onClick: handleLogout, + danger: true, + }, + ]; + + const getSelectedKey = () => { + const path = location.pathname; + if (path.includes('/dashboard')) return 'dashboard'; + if (path.includes('/generate')) return 'generate'; + if (path.includes('/manage')) return 'manage'; + if (path.includes('/query')) return 'query'; + if (path.includes('/profile')) return 'profile'; + return 'dashboard'; + }; + + return ( + + +
+ Logo +
+ + + + +
+
+ {menuItems.find((item) => item.key === getSelectedKey())?.label} +
+
+ +
+ } /> + {user?.name || user?.username} +
+
+
+
+ + + + +
+ + ); +} + +export default AdminLayout; \ No newline at end of file diff --git a/src/components/styles/AdminLayout.css b/src/components/styles/AdminLayout.css new file mode 100644 index 0000000..6f386f2 --- /dev/null +++ b/src/components/styles/AdminLayout.css @@ -0,0 +1,85 @@ +.admin-layout { + min-height: 100vh; +} + +.admin-sider { + position: fixed; + height: 100vh; + left: 0; + top: 0; + z-index: 1000; + background: #f5f7fa; +} + +.logo { + height: 64px; + display: flex; + align-items: center; + justify-content: center; + background: #ffffff; + padding: 0 16px; + border-bottom: 1px solid #e8e8e8; +} + +.logo-text { + color: #165dff; + font-size: 18px; + font-weight: bold; +} + +.admin-menu { + border-right: 0; + background: #f5f7fa; +} + +.admin-header { + background: white; + padding: 0 24px; + display: flex; + align-items: center; + justify-content: space-between; + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); + position: sticky; + top: 0; + z-index: 999; + margin-left: 256px; + width: calc(100% - 256px); +} + +.header-title { + font-size: 20px; + font-weight: 600; + color: #000000; +} + +.header-right { + display: flex; + align-items: center; +} + +.user-info { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + padding: 8px 12px; + border-radius: 6px; + transition: background 0.3s; +} + +.user-info:hover { + background: #f5f5f5; +} + +.username { + color: #000000; + font-size: 14px; +} + +.admin-content { + margin: 24px; + padding: 24px; + background: #f0f2f5; + min-height: calc(100vh - 112px); + margin-left: 280px; +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..abdd47e --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { ConfigProvider } from 'antd'; +import zhCN from 'antd/locale/zh_CN'; +import App from './App'; +import './styles/global.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + , +); \ No newline at end of file diff --git a/src/pages/AdminQuery.tsx b/src/pages/AdminQuery.tsx new file mode 100644 index 0000000..e211e6c --- /dev/null +++ b/src/pages/AdminQuery.tsx @@ -0,0 +1,100 @@ +import { useState } from 'react'; +import { Form, Input, Button, Card, message, Result, Alert } from 'antd'; +import { SearchOutlined } from '@ant-design/icons'; +import { serialApi } from '@/services/api'; +import type { Serial } from '@/types'; + +function AdminQueryPage() { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [result, setResult] = useState(null); + const [error, setError] = useState(null); + + const handleQuery = async (values: { serialNumber: string }) => { + setLoading(true); + setError(null); + setResult(null); + + try { + const data = await serialApi.query(values.serialNumber.trim()); + setResult(data); + message.success('查询成功!'); + } catch (err: any) { + setError(err.message || '查询失败'); + } finally { + setLoading(false); + } + }; + + return ( +
+ +
+ + + + + + + +
+
+ + {result && ( + + + + +

序列号: {result.serialNumber}

+

企业名称: {result.companyName}

+

授权状态: 有效

+

有效期至: {new Date(result.validUntil).toLocaleString('zh-CN')}

+

创建时间: {new Date(result.createdAt).toLocaleString('zh-CN')}

+
+ } + type="success" + showIcon + /> + + )} + + {error && ( + + + + )} + + ); +} + +export default AdminQueryPage; \ No newline at end of file diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx new file mode 100644 index 0000000..3b6ed0c --- /dev/null +++ b/src/pages/Dashboard.tsx @@ -0,0 +1,111 @@ +import { useEffect, useState } from 'react'; +import { Card, Row, Col, Statistic, Table, Spin, message } from 'antd'; +import { TeamOutlined, KeyOutlined, CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons'; +import { dashboardApi } from '@/services/api'; +import type { DashboardStats } from '@/types'; + +function DashboardPage() { + const [loading, setLoading] = useState(true); + const [stats, setStats] = useState(null); + + useEffect(() => { + loadStats(); + }, []); + + const loadStats = async () => { + setLoading(true); + try { + const data = await dashboardApi.getStats(); + setStats(data); + } catch (error: any) { + message.error(error.message || '加载数据失败'); + } finally { + setLoading(false); + } + }; + + if (loading) { + return ( +
+ +
+ ); + } + + return ( +
+ + + + } + valueStyle={{ color: '#1890ff' }} + /> + + + + + } + valueStyle={{ color: '#52c41a' }} + /> + + + + + } + valueStyle={{ color: '#52c41a' }} + /> + + + + + } + valueStyle={{ color: '#ff4d4f' }} + /> + + + + + + ( + + {status === 'active' ? '有效' : '无效'} + + ), + }, + { + title: '创建时间', + dataIndex: 'createdAt', + key: 'createdAt', + render: (date: string) => new Date(date).toLocaleString('zh-CN'), + }, + ]} + dataSource={stats?.recentSerials || []} + rowKey="id" + pagination={false} + /> + + + ); +} + +export default DashboardPage; \ No newline at end of file diff --git a/src/pages/Generate.tsx b/src/pages/Generate.tsx new file mode 100644 index 0000000..5e7bd17 --- /dev/null +++ b/src/pages/Generate.tsx @@ -0,0 +1,274 @@ +import { useState } from 'react'; +import { Form, Input, Button, Card, Radio, InputNumber, DatePicker, message, Modal, Space, ColorPicker, Divider } from 'antd'; +import { QrcodeOutlined } from '@ant-design/icons'; +import QRCode from 'qrcode'; +import type { Color } from 'antd/es/color-picker'; +import { useNavigate } from 'react-router-dom'; + +function GeneratePage() { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [generatedData, setGeneratedData] = useState(null); + const [qrCodeDataUrl, setQrCodeDataUrl] = useState(''); + const [modalVisible, setModalVisible] = useState(false); + const [qrColor, setQrColor] = useState('#000000'); + const navigate = useNavigate(); + + const colorPresets = [ + '#000000', + '#165DFF', + '#52C41A', + '#FAAD14', + '#FF4D4F', + '#722ED1', + '#EB2F96', + ]; + + const handleGenerate = async (values: any) => { + setLoading(true); + try { + const token = localStorage.getItem('authToken'); + const headers: any = { + 'Content-Type': 'application/json', + }; + if (token) { + headers.Authorization = `Bearer ${token}`; + } + + const payload = { + companyName: values.companyName, + quantity: values.quantity, + validDays: values.validOption === 'days' ? values.validDays : undefined, + serialPrefix: values.serialOption === 'custom' ? values.serialPrefix : undefined, + }; + + const response = await fetch('/api/serials/generate', { + method: 'POST', + headers, + body: JSON.stringify(payload), + }); + + const data = await response.json(); + + if (data.serials) { + setGeneratedData(data); + + if (data.serials && data.serials.length > 0) { + const baseUrl = window.location.origin; + const queryUrl = `${baseUrl}/query?serial=${data.serials[0].serialNumber}`; + const qrCode = await QRCode.toDataURL(queryUrl, { + color: { + dark: qrColor, + light: '#ffffff', + }, + }); + setQrCodeDataUrl(qrCode); + } + + setModalVisible(true); + message.success('生成成功!'); + } else { + throw new Error(data.error || '生成失败'); + } + } catch (error: any) { + message.error(error.message || '生成失败'); + } finally { + setLoading(false); + } + }; + + const handleDownloadQR = () => { + const link = document.createElement('a'); + link.download = `qrcode-${generatedData?.serials?.[0]?.serialNumber}.png`; + link.href = qrCodeDataUrl; + link.click(); + }; + + const handleViewQuery = () => { + if (generatedData?.serials?.[0]?.serialNumber) { + navigate(`/query?serial=${generatedData.serials[0].serialNumber}`); + setModalVisible(false); + form.resetFields(); + } + }; + + return ( +
+ +
+ + + + + + + 自动生成 + 自定义前缀 + + + + prevValues.serialOption !== currentValues.serialOption} + > + {({ getFieldValue }) => + getFieldValue('serialOption') === 'custom' ? ( + + + + ) : null + } + + + + + + + + + 按天数 + 按日期 + + + + prevValues.validOption !== currentValues.validOption} + > + {({ getFieldValue }) => + getFieldValue('validOption') === 'days' ? ( + + + + ) : ( + + + + ) + } + + + +
+
+ {colorPresets.map((color) => ( +
setQrColor(color)} + style={{ + width: '32px', + height: '32px', + backgroundColor: color, + border: qrColor === color ? '2px solid #165DFF' : '2px solid #d9d9d9', + borderRadius: '4px', + cursor: 'pointer', + transition: 'all 0.2s', + }} + /> + ))} +
+ + { + const hexColor = color.toHexString(); + setQrColor(hexColor); + }} + showText + /> +
+ + + + + + + + + setModalVisible(false)} + footer={null} + width={600} + > + {generatedData && ( +
+ +
+

企业名称: {generatedData.companyName || generatedData.serials?.[0]?.companyName}

+

生成数量: {generatedData.serials?.length || 0}

+ {generatedData.serials && generatedData.serials.length > 0 && ( +

有效期至: {new Date(generatedData.serials[0].validUntil).toLocaleString('zh-CN')}

+ )} +
+ + {qrCodeDataUrl && ( +
+ QR Code + {generatedData.serials && generatedData.serials.length > 0 && ( +

{generatedData.serials[0].serialNumber}

+ )} +
+ )} + + + + + + +
+
+ )} +
+
+ ); +} + +export default GeneratePage; \ No newline at end of file diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx new file mode 100644 index 0000000..5d62df0 --- /dev/null +++ b/src/pages/Login.tsx @@ -0,0 +1,126 @@ +import { useState } from 'react'; +import { Form, Input, Button, Card, message, Checkbox } from 'antd'; +import { UserOutlined, LockOutlined, LoginOutlined } from '@ant-design/icons'; +import { useNavigate } from 'react-router-dom'; +import { authApi } from '@/services/api'; +import './styles/Login.css'; +import logo from '@/assets/img/logo.png?url'; +import beian from '@/assets/img/beian.png?url'; + +function LoginPage() { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const navigate = useNavigate(); + + const handleLogin = async (values: { username: string; password: string; remember?: boolean }) => { + setLoading(true); + try { + await authApi.login(values.username, values.password); + + if (values.remember) { + localStorage.setItem('rememberedUsername', values.username); + } else { + localStorage.removeItem('rememberedUsername'); + } + + message.success('登录成功!'); + setTimeout(() => { + navigate('/admin/dashboard'); + }, 500); + } catch (error: any) { + message.error(error.message || '登录失败,请重试'); + } finally { + setLoading(false); + } + }; + + return ( +
+ +
+
+ Logo +
+

+ 用户登录 +

+

请输入您的账户信息

+
+ +
+ + } + placeholder="请输入您的用户名" + size="large" + /> + + + + } + placeholder="请输入您的密码" + size="large" + /> + + + + 记住我 + + + + + + + +
+ 浙江贝凡网络科技提供云和AI服务 +
+
+ +
+

+ Copyright © 2026 浙江贝凡网络科技有限公司. All Rights Reserved. | + + 浙ICP备2025170226号-4 + +

+

+ + 备案图标 + 浙公网安备33011002018371号 + +

+
+
+ ); +} + +export default LoginPage; \ No newline at end of file diff --git a/src/pages/Manage.tsx b/src/pages/Manage.tsx new file mode 100644 index 0000000..8722480 --- /dev/null +++ b/src/pages/Manage.tsx @@ -0,0 +1,427 @@ +import { useEffect, useState } from 'react'; +import { Card, Table, Input, Select, Button, Space, message, Modal, Tag, Spin } from 'antd'; +import { TeamOutlined, DeleteOutlined, EyeOutlined, StopOutlined } from '@ant-design/icons'; +import type { Company } from '@/types'; +import QRCode from 'qrcode'; +import { useNavigate } from 'react-router-dom'; + +interface CompanyData { + companyName: string; + serialCount: number; + firstCreated: string; + lastCreated: string; + activeCount: number; + status: 'active' | 'disabled'; +} + +function ManagePage() { + const [companies, setCompanies] = useState([]); + const [loading, setLoading] = useState(true); + const [searchTerm, setSearchTerm] = useState(''); + const [selectedCompany, setSelectedCompany] = useState(null); + const [detailModalVisible, setDetailModalVisible] = useState(false); + const [detailLoading, setDetailLoading] = useState(false); + const [companyDetail, setCompanyDetail] = useState(null); + const [qrCodeModalVisible, setQrCodeModalVisible] = useState(false); + const [qrCodeDataUrl, setQrCodeDataUrl] = useState(''); + const [selectedSerial, setSelectedSerial] = useState(''); + const navigate = useNavigate(); + + useEffect(() => { + loadCompanies(); + }, [searchTerm]); + + const loadCompanies = async () => { + setLoading(true); + try { + // 直接使用 apiClient 来调用后端接口 + const token = localStorage.getItem('authToken'); + const headers: any = { + 'Content-Type': 'application/json', + }; + if (token) { + headers.Authorization = `Bearer ${token}`; + } + + let url = '/api/companies'; + if (searchTerm) { + url += `?search=${encodeURIComponent(searchTerm)}`; + } + + const response = await fetch(url, { headers }); + const data = await response.json(); + + if (data.data) { + setCompanies(data.data); + } else if (data.message) { + setCompanies([]); + } else { + throw new Error(data.error || '获取企业列表失败'); + } + } catch (error: any) { + console.error('Load companies error:', error); + message.error(error.message || '加载企业列表失败'); + setCompanies([]); + } finally { + setLoading(false); + } + }; + + const handleViewDetail = async (company: CompanyData) => { + setSelectedCompany(company); + setDetailModalVisible(true); + setDetailLoading(true); + + try { + const token = localStorage.getItem('authToken'); + const headers: any = { + 'Content-Type': 'application/json', + }; + if (token) { + headers.Authorization = `Bearer ${token}`; + } + + const response = await fetch(`/api/companies/${encodeURIComponent(company.companyName)}`, { headers }); + const data = await response.json(); + + if (data.data) { + setCompanyDetail(data.data); + } else { + throw new Error(data.error || '获取企业详情失败'); + } + } catch (error: any) { + message.error(error.message || '获取企业详情失败'); + } finally { + setDetailLoading(false); + } + }; + + const handleDelete = async (company: CompanyData) => { + Modal.confirm({ + title: '确认删除', + content: `确定要删除企业 "${company.companyName}" 吗?这将删除该企业的所有序列号!`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk: async () => { + try { + const token = localStorage.getItem('authToken'); + const headers: any = { + 'Content-Type': 'application/json', + }; + if (token) { + headers.Authorization = `Bearer ${token}`; + } + + const response = await fetch(`/api/companies/${encodeURIComponent(company.companyName)}`, { + method: 'DELETE', + headers, + }); + const data = await response.json(); + + if (data.message) { + message.success('删除成功'); + loadCompanies(); + } else { + throw new Error(data.error || '删除失败'); + } + } catch (error: any) { + message.error(error.message || '删除失败'); + } + }, + }); + }; + + const handleRevoke = async (company: CompanyData) => { + Modal.confirm({ + title: '确认吊销', + content: `确定要吊销企业 "${company.companyName}" 吗?这将使该企业的所有序列号失效!`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk: async () => { + try { + const token = localStorage.getItem('authToken'); + const headers: any = { + 'Content-Type': 'application/json', + }; + if (token) { + headers.Authorization = `Bearer ${token}`; + } + + const response = await fetch(`/api/companies/${encodeURIComponent(company.companyName)}/revoke`, { + method: 'POST', + headers, + }); + const data = await response.json(); + + if (data.message) { + message.success('吊销成功'); + loadCompanies(); + } else { + throw new Error(data.error || '吊销失败'); + } + } catch (error: any) { + message.error(error.message || '吊销失败'); + } + }, + }); + }; + + const handleViewQRCode = async (serialNumber: string) => { + try { + const baseUrl = window.location.origin; + const queryUrl = `${baseUrl}/query?serial=${serialNumber}`; + const qrCode = await QRCode.toDataURL(queryUrl); + setQrCodeDataUrl(qrCode); + setSelectedSerial(serialNumber); + setQrCodeModalVisible(true); + } catch (error) { + message.error('生成二维码失败'); + } + }; + + const handleQuerySerial = (serialNumber: string) => { + setQrCodeModalVisible(false); + navigate(`/query?serial=${serialNumber}`); + }; + + const handleRevokeSerial = async (serialNumber: string) => { + Modal.confirm({ + title: '确认吊销', + content: `确定要吊销序列号 "${serialNumber}" 吗?`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk: async () => { + try { + const token = localStorage.getItem('authToken'); + const headers: any = { + 'Content-Type': 'application/json', + }; + if (token) { + headers.Authorization = `Bearer ${token}`; + } + + const response = await fetch(`/api/serials/${encodeURIComponent(serialNumber)}/revoke`, { + method: 'POST', + headers, + }); + const data = await response.json(); + + if (data.message) { + message.success('吊销成功'); + if (selectedCompany) { + handleViewDetail(selectedCompany); + } + } else { + throw new Error(data.error || '吊销失败'); + } + } catch (error: any) { + message.error(error.message || '吊销失败'); + } + }, + }); + }; + + const columns = [ + { + title: '企业名称', + dataIndex: 'companyName', + key: 'companyName', + }, + { + title: '序列号数量', + dataIndex: 'serialCount', + key: 'serialCount', + }, + { + title: '状态', + dataIndex: 'status', + key: 'status', + render: (status: string) => ( + + {status === 'active' ? '正常' : '已吊销'} + + ), + }, + { + title: '创建时间', + dataIndex: 'firstCreated', + key: 'firstCreated', + render: (date: string) => new Date(date).toLocaleString('zh-CN'), + }, + { + title: '最后更新', + dataIndex: 'lastCreated', + key: 'lastCreated', + render: (date: string) => new Date(date).toLocaleString('zh-CN'), + }, + { + title: '操作', + key: 'actions', + render: (_: any, record: CompanyData) => ( + + + + + + ), + }, + ]; + + return ( +
+ + + 企业管理 + + } + extra={ + setSearchTerm(e.target.value)} + value={searchTerm} + /> + } + > +
`共 ${total} 家企业`, + }} + /> + + + setDetailModalVisible(false)} + footer={null} + width={800} + > + {detailLoading ? ( +
+ +
+ ) : companyDetail ? ( +
+

企业名称: {companyDetail.companyName}

+

序列号总数: {companyDetail.serialCount}

+

活跃序列号: {companyDetail.activeCount}

+

已吊销序列号: {companyDetail.disabledCount || 0}

+

已过期序列号: {companyDetail.expiredCount || 0}

+ + {companyDetail.serials && companyDetail.serials.length > 0 && ( +
+

序列号列表

+
( + + {isActive ? '有效' : '已吊销'} + + ), + }, + { + title: '有效期至', + dataIndex: 'validUntil', + key: 'validUntil', + render: (date: string) => new Date(date).toLocaleString('zh-CN'), + }, + { + title: '操作', + key: 'actions', + render: (_: any, record: any) => ( + + + {record.isActive && ( + + )} + + ), + }, + ]} + dataSource={companyDetail.serials} + rowKey="serialNumber" + pagination={false} + size="small" + /> + + )} + + ) : null} + + + setQrCodeModalVisible(false)} + footer={null} + width={400} + > +
+ {qrCodeDataUrl && ( + <> + QR Code handleQuerySerial(selectedSerial)} /> +

{selectedSerial}

+

点击二维码可查询序列号

+ + )} +
+
+ + ); +} + +export default ManagePage; \ No newline at end of file diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx new file mode 100644 index 0000000..fd50bf4 --- /dev/null +++ b/src/pages/Profile.tsx @@ -0,0 +1,202 @@ +import { useState, useEffect } from 'react'; +import { Form, Input, Button, Card, message, Avatar, Descriptions, Space, Modal } from 'antd'; +import { UserOutlined, LockOutlined } from '@ant-design/icons'; +import { authApi } from '@/services/api'; +import type { User } from '@/types'; + +function ProfilePage() { + const [profileForm] = Form.useForm(); + const [passwordForm] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [passwordModalVisible, setPasswordModalVisible] = useState(false); + const [user, setUser] = useState(null); + + useEffect(() => { + loadUserProfile(); + }, []); + + const loadUserProfile = () => { + const currentUser = authApi.getCurrentUser(); + if (currentUser) { + setUser(currentUser); + profileForm.setFieldsValue({ + username: currentUser.username, + name: currentUser.name, + email: currentUser.email, + role: currentUser.role, + createdAt: new Date(currentUser.createdAt).toLocaleString('zh-CN'), + }); + } + }; + + const handleUpdateProfile = async (values: any) => { + setLoading(true); + try { + const updatedUser = await authApi.updateProfile({ + name: values.name, + email: values.email, + }); + setUser(updatedUser); + message.success('更新资料成功!'); + } catch (error: any) { + message.error(error.message || '更新资料失败'); + } finally { + setLoading(false); + } + }; + + const handleChangePassword = async (values: any) => { + setLoading(true); + try { + await authApi.changePassword(values.currentPassword, values.newPassword); + message.success('修改密码成功!'); + setPasswordModalVisible(false); + passwordForm.resetFields(); + } catch (error: any) { + message.error(error.message || '修改密码失败'); + } finally { + setLoading(false); + } + }; + + return ( +
+ + 用户资料 + + } + style={{ marginBottom: '24px' }} + > + {user && ( + + + } size={64} /> + + {user.username} + {user.name} + {user.email || '-'} + {user.role} + + {new Date(user.createdAt).toLocaleString('zh-CN')} + + + )} + +
+ + + + + + + + + + + + + + + +
+ + + 修改密码 + + } + extra={ + + } + /> + + setPasswordModalVisible(false)} + footer={null} + > +
+ + + + + + + + + ({ + validator(_, value) { + if (!value || getFieldValue('newPassword') === value) { + return Promise.resolve(); + } + return Promise.reject(new Error('两次输入的密码不一致')); + }, + }), + ]} + > + + + + + + + + + + +
+
+ ); +} + +export default ProfilePage; \ No newline at end of file diff --git a/src/pages/PublicQuery.tsx b/src/pages/PublicQuery.tsx new file mode 100644 index 0000000..d662eb7 --- /dev/null +++ b/src/pages/PublicQuery.tsx @@ -0,0 +1,181 @@ +import { useState, useEffect } from 'react'; +import { Input, Button, Card, message, Spin, Result } from 'antd'; +import { QrcodeOutlined, SearchOutlined, ArrowLeftOutlined, CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons'; +import { serialApi } from '@/services/api'; +import type { Serial } from '@/types'; +import './styles/PublicQuery.css'; +import logo from '@/assets/img/logo.png?url'; +import beian from '@/assets/img/beian.png?url'; + +function PublicQueryPage() { + const [serialNumber, setSerialNumber] = useState(''); + const [loading, setLoading] = useState(false); + const [result, setResult] = useState(null); + const [error, setError] = useState(null); + const [showResult, setShowResult] = useState(false); + + const performQuery = async (serialToQuery: string) => { + setLoading(true); + setError(null); + setResult(null); + + try { + const data = await serialApi.query(serialToQuery); + setResult(data); + } catch (err: any) { + setError(err.message || '查询失败'); + setResult(null); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + const urlParams = new URLSearchParams(window.location.search); + const serialFromUrl = urlParams.get('serial'); + if (serialFromUrl) { + setSerialNumber(serialFromUrl); + setShowResult(true); + performQuery(serialFromUrl); + } + }, []); + + const handleQuery = async () => { + if (!serialNumber.trim()) { + message.error('请输入授权序列号'); + return; + } + setShowResult(true); + performQuery(serialNumber.trim()); + }; + + const handleReset = () => { + setShowResult(false); + setSerialNumber(''); + setResult(null); + setError(null); + }; + + return ( +
+ {!showResult ? ( + +
+
+ Logo +
+

+ 授权查询 +

+

请输入您的授权序列号进行查询

+
+ +
+ setSerialNumber(e.target.value)} + onPressEnter={handleQuery} + prefix={} + /> + +
+
+ ) : ( + +
+
+ Logo +
+
+ {loading ? ( +
+ +

正在查询授权信息...

+
+ ) : result ? ( +
+ {result.status !== 'active' ? ( + } + title="授权已吊销" + subTitle={`序列号验证通过,但已被吊销。企业:${result.companyName}`} + /> + ) : ( + } + title="授权有效" + subTitle="您的序列号已验证通过" + /> + )} + +
+
+ 序列号 + {result.serialNumber} +
+
+ 企业名称 + {result.companyName} +
+
+ 有效期至 + {new Date(result.validUntil).toLocaleString('zh-CN')} +
+
+ 授权状态 + + {result.status === 'active' ? '有效' : '已吊销'} + +
+
+
+ ) : ( +
+ } + title="无效序列号" + subTitle={error} + /> +
+ )} + + +
+ )} + +
+

+ Copyright © 2026 浙江贝凡网络科技有限公司. All Rights Reserved. | + + 浙ICP备2025170226号-4 + +

+

+ + 备案图标 + 浙公网安备33011002018371号 + +

+
+
+ ); +} + +export default PublicQueryPage; \ No newline at end of file diff --git a/src/pages/styles/Login.css b/src/pages/styles/Login.css new file mode 100644 index 0000000..8023c98 --- /dev/null +++ b/src/pages/styles/Login.css @@ -0,0 +1,88 @@ +.login-container { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 20px; + background: linear-gradient(135deg, #dbeafe 0%, #e0e7ff 100%); +} + +.login-card { + width: 100%; + max-width: 480px; + padding: 24px; + backdrop-filter: blur(10px); + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + border-radius: 24px; + animation: slideIn 0.5s ease-out; +} + +@keyframes slideIn { + from { + opacity: 0; + transform: translateY(-50px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.login-header { + margin-bottom: 32px; +} + +.login-logo { + text-align: left; + margin-bottom: 16px; +} + +.login-title { + font-size: clamp(1.5rem, 4vw, 2rem); + font-weight: bold; + color: #165DFF; + margin-bottom: 16px; + text-align: center; +} + +.login-subtitle { + color: #6B7280; + font-size: 14px; + text-align: center; +} + +.login-footer { + text-align: center; + margin-top: 16px; + color: #6B7280; + font-size: 14px; +} + +.copyright { + margin-top: 32px; + text-align: center; + color: #6B7280; + font-size: 14px; +} + +.copyright p { + margin: 8px 0; +} + +.copyright a { + color: #6B7280; + text-decoration: none; +} + +.copyright a:hover { + color: #165DFF; +} + +.copyright img { + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 4px; +} \ No newline at end of file diff --git a/src/pages/styles/PublicQuery.css b/src/pages/styles/PublicQuery.css new file mode 100644 index 0000000..b5f901a --- /dev/null +++ b/src/pages/styles/PublicQuery.css @@ -0,0 +1,149 @@ +.public-query-container { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + padding: 32px 20px; + background: linear-gradient(135deg, #dbeafe 0%, #e0e7ff 100%); +} + +.query-card { + width: 100%; + max-width: 480px; + padding: 24px; + backdrop-filter: blur(10px); + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + border-radius: 24px; +} + +.query-header { + margin-bottom: 32px; +} + +.query-logo { + text-align: left; + margin-bottom: 16px; +} + +.query-title { + font-size: clamp(1.5rem, 4vw, 2rem); + font-weight: bold; + color: #165DFF; + margin-bottom: 16px; + text-align: center; +} + +.query-subtitle { + color: #6B7280; + font-size: 14px; + text-align: center; +} + +.query-form { + display: flex; + flex-direction: column; + gap: 16px; +} + +.result-card { + width: 100%; + max-width: 480px; + padding: 16px; + backdrop-filter: blur(10px); + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + border-radius: 24px; + margin-top: 16px; + transform: scale(0); + transition: transform 0.3s ease-in-out; +} + +.result-card.show { + transform: scale(1); +} + +.result-header { + margin-bottom: 16px; +} + +.loading-container, +.success-container, +.error-container { + text-align: center; +} + +.loading-container p { + margin-top: 16px; + color: #6B7280; +} + +.result-details { + margin-top: 16px; + padding: 12px; + background: #F8FAFC; + border-radius: 12px; +} + +.detail-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 12px; + background: white; + border-radius: 8px; + margin-bottom: 8px; +} + +.detail-item:last-child { + margin-bottom: 0; +} + +.detail-item .label { + color: #374151; + font-weight: 500; +} + +.detail-item .value { + color: #111827; +} + +.detail-item .value.serial { + color: #165DFF; + font-family: 'Courier New', monospace; +} + +.detail-item .value.status { + color: #52c41a; + font-weight: bold; +} + +.copyright { + margin-top: 32px; + text-align: center; + color: #6B7280; + font-size: 14px; +} + +.copyright p { + margin: 8px 0; +} + +.copyright a { + color: #6B7280; + text-decoration: none; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 4px; +} + +.copyright a:hover { + color: #165DFF; +} + +.copyright img { + width: 16px; + height: 16px; +} \ No newline at end of file diff --git a/src/services/api.ts b/src/services/api.ts new file mode 100644 index 0000000..0b06645 --- /dev/null +++ b/src/services/api.ts @@ -0,0 +1,207 @@ +import axios from 'axios'; +import type { ApiResponse, AuthResponse, User } from '@/types'; + +const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api'; + +const apiClient = axios.create({ + baseURL: API_BASE_URL, + headers: { + 'Content-Type': 'application/json', + }, +}); + +apiClient.interceptors.request.use((config) => { + const token = localStorage.getItem('authToken'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}); + +apiClient.interceptors.response.use( + (response) => response, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('authToken'); + localStorage.removeItem('currentUser'); + window.location.href = '/login'; + } + if (error.response?.status === 404) { + const url = error.config?.url || ''; + if (url.includes('/query')) { + const customError = new Error('未找到该序列号,请检查输入是否正确'); + customError.name = 'NotFoundError'; + return Promise.reject(customError); + } + } + return Promise.reject(error); + } +); + +export const authApi = { + login: async (username: string, password: string) => { + const response = await apiClient.post('/auth/login', { username, password }); + // 后端返回的是 accessToken,前端期望的是 token + const token = response.data.accessToken || response.data.token; + const user = response.data.user; + + if (token && user) { + localStorage.setItem('authToken', token); + localStorage.setItem('currentUser', JSON.stringify(user)); + return user; + } + throw new Error('登录失败'); + }, + + logout: async () => { + try { + await apiClient.post('/auth/logout'); + } catch (error) { + console.error('Logout error:', error); + } + localStorage.removeItem('authToken'); + localStorage.removeItem('currentUser'); + }, + + getCurrentUser: (): User | null => { + const user = localStorage.getItem('currentUser'); + return user ? JSON.parse(user) : null; + }, + + updateProfile: async (data: { name?: string; email?: string }) => { + const response = await apiClient.put('/auth/profile', data); + const user = response.data; + if (user) { + localStorage.setItem('currentUser', JSON.stringify(user)); + return user; + } + throw new Error('更新资料失败'); + }, + + changePassword: async (currentPassword: string, newPassword: string) => { + const response = await apiClient.post('/auth/change-password', { currentPassword, newPassword }); + if (response.data.message) { + return true; + } + throw new Error(response.data.error || '修改密码失败'); + }, +}; + +export const serialApi = { + generate: async (data: { + companyName: string; + serialOption: 'auto' | 'custom'; + serialPrefix?: string; + quantity: number; + validOption: 'days' | 'date'; + validDays?: number; + validUntil?: string; + }) => { + // 根据后端接口调整参数 + const payload = { + companyName: data.companyName, + quantity: data.quantity, + validDays: data.validOption === 'days' ? data.validDays : undefined, + serialPrefix: data.serialOption === 'custom' ? data.serialPrefix : undefined, + }; + + const response = await apiClient.post('/serials/generate', payload); + if (response.data.serials) { + return response.data; + } + throw new Error(response.data.error || '生成序列号失败'); + }, + + query: async (serialNumber: string) => { + // 后端路径是正确的: /api/serials/:serialNumber/query + const response = await apiClient.get(`/serials/${encodeURIComponent(serialNumber)}/query`); + if (response.data.serial) { + return response.data.serial; + } + throw new Error(response.data.error || '查询序列号失败'); + }, + + list: async (companyId?: number) => { + let url = '/serials'; + if (companyId) url += `?companyId=${companyId}`; + const response = await apiClient.get(url); + if (response.data.data) { + return response.data.data; + } + throw new Error('获取序列号列表失败'); + }, + + delete: async (id: number) => { + // 后端没有单个删除接口,需要使用企业接口下的删除 + const response = await apiClient.delete(`/serials/${id}`); + if (response.data) { + return true; + } + throw new Error(response.data.error || '删除序列号失败'); + }, +}; + +export const companyApi = { + list: async (filter?: { search?: string; status?: 'all' | 'active' | 'expired' }) => { + let url = '/companies'; + if (filter?.search || filter?.status) { + const params = new URLSearchParams(); + if (filter.search) params.append('search', filter.search); + if (filter.status && filter.status !== 'all') params.append('status', filter.status); + url += `?${params.toString()}`; + } + const response = await apiClient.get(url); + if (response.data.data) { + return response.data.data; + } + throw new Error('获取企业列表失败'); + }, + + get: async (companyName: string) => { + const response = await apiClient.get(`/companies/${encodeURIComponent(companyName)}`); + if (response.data.data) { + return response.data.data; + } + throw new Error('获取企业详情失败'); + }, + + delete: async (companyName: string) => { + const response = await apiClient.delete(`/companies/${encodeURIComponent(companyName)}`); + if (response.data) { + return true; + } + throw new Error(response.data.error || '删除企业失败'); + }, +}; + +export const dashboardApi = { + getStats: async () => { + // 后端路径是 /api/companies/stats/overview + const response = await apiClient.get('/companies/stats/overview'); + if (response.data.data) { + const data = response.data.data; + // 转换数据格式以匹配前端期望 + return { + totalCompanies: data.overview?.totalCompanies || 0, + totalSerials: data.overview?.totalSerials || 0, + activeSerials: data.overview?.activeSerials || 0, + inactiveSerials: data.overview?.inactiveSerials || 0, + monthlyData: data.monthlyStats || [], + recentCompanies: data.recentCompanies?.map((c: any) => ({ + id: c.companyName, + name: c.companyName, + status: 'active' as const, + createdAt: c.lastCreated, + })) || [], + recentSerials: data.recentSerials?.map((s: any) => ({ + id: s.serialNumber, + serialNumber: s.serialNumber, + companyName: s.companyName, + status: s.isActive ? 'active' : 'inactive', + createdAt: s.createdAt, + })) || [], + }; + } + throw new Error('获取统计数据失败'); + }, +}; \ No newline at end of file diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..ebe7c1c --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,25 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} + +#root { + min-height: 100vh; +} + +html, body, #root { + height: 100%; +} \ No newline at end of file diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..7e438b7 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,91 @@ +export interface User { + id: number; + username: string; + name: string; + email?: string; + role: string; + createdAt: string; +} + +export interface Company { + id: number; + name: string; + status: 'active' | 'disabled'; + createdAt: string; + serials?: Serial[]; +} + +export interface Serial { + id: number; + serialNumber: string; + companyId: number; + companyName: string; + status: 'active' | 'disabled'; + validUntil: string; + createdAt: string; +} + +export interface GenerateSerialRequest { + companyName: string; + serialOption: 'auto' | 'custom'; + serialPrefix?: string; + quantity: number; + validOption: 'days' | 'date'; + validDays?: number; + validUntil?: string; +} + +export interface GenerateSerialResponse { + companyName: string; + serials: Array<{ + serialNumber: string; + validUntil: string; + }>; + qrCode: string; +} + +export interface AuthResponse { + token: string; + user: User; +} + +export interface LoginRequest { + username: string; + password: string; + remember?: boolean; +} + +export interface UpdateProfileRequest { + name?: string; + email?: string; +} + +export interface ChangePasswordRequest { + currentPassword: string; + newPassword: string; +} + +export interface ApiResponse { + success: boolean; + data?: T; + error?: string; +} + +export interface DashboardStats { + totalCompanies: number; + totalSerials: number; + activeSerials: number; + inactiveSerials: number; + monthlyData: Array<{ + month: string; + companies: number; + serials: number; + }>; + recentCompanies: Company[]; + recentSerials: Serial[]; +} + +export interface CompanyFilter { + search?: string; + status?: 'all' | 'active' | 'expired'; +} \ No newline at end of file diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..bd44d27 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,26 @@ +/// + +declare module '*.png' { + const value: string; + export default value; +} + +declare module '*.jpg' { + const value: string; + export default value; +} + +declare module '*.jpeg' { + const value: string; + export default value; +} + +declare module '*.gif' { + const value: string; + export default value; +} + +declare module '*.svg' { + const value: string; + export default value; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..33a9cc0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..099658c --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..2cd3346 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import path from 'path' + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + server: { + port: 5173, + proxy: { + '/api': { + target: 'http://localhost:3000', + changeOrigin: true, + }, + }, + }, + build: { + outDir: 'dist', + sourcemap: true, + }, +}) \ No newline at end of file