yangyi 1 سال پیش
کامیت
18e596ce2c
100فایلهای تغییر یافته به همراه20161 افزوده شده و 0 حذف شده
  1. 17 0
      .env.development
  2. 15 0
      .env.production
  3. 15 0
      .env.staging
  4. 24 0
      .gitignore
  5. 7 0
      README.md
  6. 10 0
      auto-imports.d.ts
  7. 64 0
      components.d.ts
  8. 18 0
      index.html
  9. 5861 0
      package-lock.json
  10. 41 0
      package.json
  11. 3787 0
      pnpm-lock.yaml
  12. 11 0
      public/ai.svg
  13. 14 0
      src/App.vue
  14. 97 0
      src/api/aiImage.ts
  15. 96 0
      src/api/aiSVG.ts
  16. 192 0
      src/api/conversation.ts
  17. 15 0
      src/api/design.ts
  18. 310 0
      src/api/product.ts
  19. 255 0
      src/api/user.ts
  20. BIN
      src/assets/components/common/login/SMS-icon.png
  21. BIN
      src/assets/components/common/login/account-icon.png
  22. BIN
      src/assets/components/common/login/wx-icon.png
  23. BIN
      src/assets/dear.png
  24. 3 0
      src/assets/imageGeneraterView/design.svg
  25. 3 0
      src/assets/imageGeneraterView/edit.svg
  26. 10 0
      src/assets/imageGeneraterView/imageGeneraterIcon.svg
  27. 3 0
      src/assets/imageGeneraterView/pencil.svg
  28. 3 0
      src/assets/imageGeneraterView/picture.svg
  29. BIN
      src/assets/logo.png
  30. 3 0
      src/assets/tabBar/Chat.svg
  31. 3 0
      src/assets/tabBar/Create.svg
  32. 1 0
      src/assets/tabBar/Else.svg
  33. 3 0
      src/assets/tabBar/Picture.svg
  34. BIN
      src/assets/user.jpeg
  35. 69 0
      src/components/AiChat/ChatPromptInput.vue
  36. 94 0
      src/components/AiChat/Conversation.vue
  37. 5 0
      src/components/AiChat/WelcomeContent.vue
  38. 269 0
      src/components/common/ai/CodeBlock.vue
  39. 42 0
      src/components/common/ai/HomeView.vue
  40. 157 0
      src/components/common/ai/MarkdownRenderer.vue
  41. 205 0
      src/components/common/ai/MessageBubble.vue
  42. 35 0
      src/components/common/ai/TypingIndicator.vue
  43. 93 0
      src/components/common/leftAside/Conversation.vue
  44. 80 0
      src/components/common/leftAside/Other.vue
  45. 80 0
      src/components/common/login/AccountLogin.vue
  46. 32 0
      src/components/common/login/GlobalLoginDialog.vue
  47. 91 0
      src/components/common/login/Register.vue
  48. 92 0
      src/components/common/login/ResetPassword.vue
  49. 88 0
      src/components/common/login/SMSLogin.vue
  50. 75 0
      src/components/common/login/WeChatLogin.vue
  51. 99 0
      src/components/common/login/WechatCallbackLogin.vue
  52. 25 0
      src/components/common/login/component/AccountFormItem.vue
  53. 72 0
      src/components/common/login/component/CodeFormItem.vue
  54. 61 0
      src/components/common/login/component/PasswordFormItem.vue
  55. 31 0
      src/components/common/login/component/SubmitFormBtn.vue
  56. 91 0
      src/components/create/CreateConversation.vue
  57. 95 0
      src/components/imageGenerater/ImageConversation.vue
  58. 177 0
      src/components/imageGenerater/ImageMessageBubble.vue
  59. 140 0
      src/components/imageGenerater/PromptInput.vue
  60. 35 0
      src/directives/permission.ts
  61. 65 0
      src/enums/bfApiMessage.ts
  62. 5 0
      src/enums/tabType.ts
  63. 8 0
      src/enums/toolbarType.ts
  64. 41 0
      src/enums/verification.ts
  65. 271 0
      src/layouts/components/aiChat/Design/LeftAsideBar.vue
  66. 208 0
      src/layouts/components/aiChat/Design/RightAsideBar.vue
  67. 213 0
      src/layouts/components/aiChat/LeftAsideBar.vue
  68. 105 0
      src/layouts/components/aiChat/RightAsideBar.vue
  69. 68 0
      src/layouts/components/aiChat/TabBar.vue
  70. 11 0
      src/layouts/components/aiChat/ThemeSwitch.vue
  71. 107 0
      src/layouts/components/imageGenerater/LeftAsideBar.vue
  72. 105 0
      src/layouts/components/imageGenerater/RightAsideBar.vue
  73. 42 0
      src/layouts/index.vue
  74. 24 0
      src/main.ts
  75. 71 0
      src/router/childrens/mainChildren.ts
  76. 15 0
      src/router/index.ts
  77. 5 0
      src/shims-vue.d.ts
  78. 88 0
      src/stores/chatConversation.ts
  79. 92 0
      src/stores/imageConversation.ts
  80. 6 0
      src/stores/index.ts
  81. 169 0
      src/stores/product.ts
  82. 90 0
      src/stores/svgConversation.ts
  83. 113 0
      src/stores/theme.ts
  84. 128 0
      src/stores/user.ts
  85. 82 0
      src/styles/components/common/login/GlobalLoginDialog.scss
  86. 47 0
      src/styles/style.css
  87. 180 0
      src/styles/theme.css
  88. 20 0
      src/types/chatConversation.ts
  89. 33 0
      src/types/conversation.ts
  90. 11 0
      src/types/conversationActions.ts
  91. 35 0
      src/types/imageConversation.ts
  92. 13 0
      src/types/svgConversation.ts
  93. 21 0
      src/utils/QRcode.ts
  94. 4042 0
      src/utils/area.ts
  95. 81 0
      src/utils/bfMessage.ts
  96. 91 0
      src/utils/common.ts
  97. 12 0
      src/utils/formatDate.ts
  98. 130 0
      src/utils/http.ts
  99. 32 0
      src/utils/httpStatus.ts
  100. 67 0
      src/utils/request.ts

+ 17 - 0
.env.development

@@ -0,0 +1,17 @@
+NODE_ENV = development
+
+VITE_APP_TITLE = '超腻害AI'
+
+VITE_APP_META_KEYWORDS = '超腻害AI'
+
+VITE_APP_IMG_ALT = '超腻害AI'
+
+VITE_API_BASE_URL = 'http://localhost:8080'
+
+VITE_APP_BASE_CDN = 'https://cdn.3dreal.cn'
+
+VITE_APP_BASE_OAUTH = 'https://oauth.3dreal.cn'
+
+VITE_API_DIY_BASE_URL = 'https://shop.api.3dreal.cn'
+
+VITE_API_DIY_REAL_URL = 'https://api.3dreal.cn'

+ 15 - 0
.env.production

@@ -0,0 +1,15 @@
+NODE_EVN = production
+
+VITE_APP_TITLE = '超腻害AI'
+
+VITE_APP_META_KEYWORDS = '超腻害AI'
+
+VITE_APP_IMG_ALT = '超腻害AI'
+
+VITE_API_BASE_URL = 'http://10.10.244.243:8081'
+
+VITE_APP_BASE_CDN = 'https://oss.yingxindiy.com'
+
+VITE_APP_BASE_OAUTH = 'https://oauth.3dreal.cn'
+
+VITE_APP_META_DESC = ''

+ 15 - 0
.env.staging

@@ -0,0 +1,15 @@
+NODE_ENV = staging
+
+VITE_APP_TITLE = '超腻害AI'
+
+VITE_APP_META_KEYWORDS = '超腻害AI'
+
+VITE_APP_IMG_ALT = '超腻害AI'
+
+VITE_API_BASE_URL = 'http://std-dev.yuansheji.cn'
+
+VITE_APP_BASE_CDN = 'https://cdn.3dreal.cn'
+
+VITE_APP_BASE_OAUTH = 'https://oauth.3dreal.cn'
+
+VITE_API_BASE_URL_MALL = 'http://mall-dev.yuansheji.cn'

+ 24 - 0
.gitignore

@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 7 - 0
README.md

@@ -0,0 +1,7 @@
+# Vue 3 + TypeScript + Vite
+
+## Node.JS -v v20.13.1
+
+## UI 组件库 Element-Plus
+
+## npm run dev

+ 10 - 0
auto-imports.d.ts

@@ -0,0 +1,10 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+// biome-ignore lint: disable
+export {}
+declare global {
+  const ElLoading: typeof import('element-plus/es')['ElLoading']
+}

+ 64 - 0
components.d.ts

@@ -0,0 +1,64 @@
+/* eslint-disable */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+// biome-ignore lint: disable
+export {}
+
+/* prettier-ignore */
+declare module 'vue' {
+  export interface GlobalComponents {
+    AccountFormItem: typeof import('./src/components/common/login/component/AccountFormItem.vue')['default']
+    AccountLogin: typeof import('./src/components/common/login/AccountLogin.vue')['default']
+    ChatPromptInput: typeof import('./src/components/AiChat/ChatPromptInput.vue')['default']
+    CodeBlock: typeof import('./src/components/common/ai/CodeBlock.vue')['default']
+    CodeFormItem: typeof import('./src/components/common/login/component/CodeFormItem.vue')['default']
+    Conversation: typeof import('./src/components/AiChat/Conversation.vue')['default']
+    CreateConversation: typeof import('./src/components/create/CreateConversation.vue')['default']
+    ElAside: typeof import('element-plus/es')['ElAside']
+    ElButton: typeof import('element-plus/es')['ElButton']
+    ElCard: typeof import('element-plus/es')['ElCard']
+    ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+    ElContainer: typeof import('element-plus/es')['ElContainer']
+    ElDialog: typeof import('element-plus/es')['ElDialog']
+    ElDivider: typeof import('element-plus/es')['ElDivider']
+    ElDropdown: typeof import('element-plus/es')['ElDropdown']
+    ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
+    ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
+    ElEmpty: typeof import('element-plus/es')['ElEmpty']
+    ElForm: typeof import('element-plus/es')['ElForm']
+    ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElHeader: typeof import('element-plus/es')['ElHeader']
+    ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElInput: typeof import('element-plus/es')['ElInput']
+    ElMain: typeof import('element-plus/es')['ElMain']
+    ElMenu: typeof import('element-plus/es')['ElMenu']
+    ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
+    ElOption: typeof import('element-plus/es')['ElOption']
+    ElPopover: typeof import('element-plus/es')['ElPopover']
+    ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+    ElSelect: typeof import('element-plus/es')['ElSelect']
+    GlobalLoginDialog: typeof import('./src/components/common/login/GlobalLoginDialog.vue')['default']
+    HomeView: typeof import('./src/components/common/ai/HomeView.vue')['default']
+    ImageConversation: typeof import('./src/components/imageGenerater/ImageConversation.vue')['default']
+    ImageMessageBubble: typeof import('./src/components/imageGenerater/ImageMessageBubble.vue')['default']
+    MarkdownRenderer: typeof import('./src/components/common/ai/MarkdownRenderer.vue')['default']
+    MessageBubble: typeof import('./src/components/common/ai/MessageBubble.vue')['default']
+    Other: typeof import('./src/components/common/leftAside/Other.vue')['default']
+    PasswordFormItem: typeof import('./src/components/common/login/component/PasswordFormItem.vue')['default']
+    PromptInput: typeof import('./src/components/imageGenerater/PromptInput.vue')['default']
+    Register: typeof import('./src/components/common/login/Register.vue')['default']
+    ResetPassword: typeof import('./src/components/common/login/ResetPassword.vue')['default']
+    RouterLink: typeof import('vue-router')['RouterLink']
+    RouterView: typeof import('vue-router')['RouterView']
+    SMSLogin: typeof import('./src/components/common/login/SMSLogin.vue')['default']
+    SubmitFormBtn: typeof import('./src/components/common/login/component/SubmitFormBtn.vue')['default']
+    TypingIndicator: typeof import('./src/components/common/ai/TypingIndicator.vue')['default']
+    WechatCallbackLogin: typeof import('./src/components/common/login/WechatCallbackLogin.vue')['default']
+    WeChatLogin: typeof import('./src/components/common/login/WeChatLogin.vue')['default']
+    WelcomeContent: typeof import('./src/components/AiChat/WelcomeContent.vue')['default']
+  }
+  export interface ComponentCustomProperties {
+    vLoading: typeof import('element-plus/es')['ElLoadingDirective']
+  }
+}

+ 18 - 0
index.html

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="src/assets/logo.png" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>AI demo</title>
+    <meta name="keywords" content="%VITE_APP_META_KEYWORDS%" />
+    <meta name="description" content="%VITE_APP_META_DESC%" />
+      <script src="https://cdn.3dreal.cn/sdk/3dreal-sdk-v3.0.0.js"></script>
+
+      <title>%VITE_APP_TITLE%</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 5861 - 0
package-lock.json

@@ -0,0 +1,5861 @@
+{
+  "name": "ai-web",
+  "version": "0.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "ai-web",
+      "version": "0.0.0",
+      "dependencies": {
+        "@element-plus/icons-vue": "^2.3.1",
+        "axios": "^1.6.5",
+        "echarts": "^5.6.0",
+        "element-plus": "^2.9.6",
+        "highlight.js": "^11.11.1",
+        "marked": "^15.0.7",
+        "normalize.css": "^8.0.1",
+        "pinia": "^3.0.1",
+        "pinia-plugin-persistedstate": "^4.2.0",
+        "vite-plugin-vue-devtools": "^7.7.2",
+        "vue": "^3.5.13",
+        "vue-router": "^4.5.0"
+      },
+      "devDependencies": {
+        "@iconify-json/ep": "^1.2.2",
+        "@types/node": "^22.13.10",
+        "@types/vue": "^1.0.31",
+        "@unocss/preset-wind4": "66.1.0-beta.8",
+        "@vitejs/plugin-vue": "^5.2.1",
+        "@vue/tsconfig": "^0.7.0",
+        "sass-embedded": "^1.85.1",
+        "typescript": "~5.7.2",
+        "unocss": "^66.1.0-beta.8",
+        "unplugin-auto-import": "^19.1.1",
+        "unplugin-icons": "^22.1.0",
+        "unplugin-vue-components": "^28.4.1",
+        "vite": "^6.2.0",
+        "vue-tsc": "^2.2.4"
+      }
+    },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@antfu/install-pkg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-1.0.0.tgz",
+      "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "package-manager-detector": "^0.2.8",
+        "tinyexec": "^0.3.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@antfu/utils": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-8.1.1.tgz",
+      "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.26.2",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+      "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+      "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.10",
+        "@babel/helper-compilation-targets": "^7.26.5",
+        "@babel/helper-module-transforms": "^7.26.0",
+        "@babel/helpers": "^7.26.10",
+        "@babel/parser": "^7.26.10",
+        "@babel/template": "^7.26.9",
+        "@babel/traverse": "^7.26.10",
+        "@babel/types": "^7.26.10",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
+      "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
+      "dependencies": {
+        "@babel/parser": "^7.27.0",
+        "@babel/types": "^7.27.0",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
+        "jsesc": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+      "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+      "dependencies": {
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz",
+      "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==",
+      "dependencies": {
+        "@babel/compat-data": "^7.26.8",
+        "@babel/helper-validator-option": "^7.25.9",
+        "browserslist": "^4.24.0",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz",
+      "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-member-expression-to-functions": "^7.25.9",
+        "@babel/helper-optimise-call-expression": "^7.25.9",
+        "@babel/helper-replace-supers": "^7.26.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+        "@babel/traverse": "^7.27.0",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+      "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+      "dependencies": {
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+      "dependencies": {
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+      "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "@babel/traverse": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+      "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+      "dependencies": {
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.26.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+      "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.26.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+      "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+      "dependencies": {
+        "@babel/helper-member-expression-to-functions": "^7.25.9",
+        "@babel/helper-optimise-call-expression": "^7.25.9",
+        "@babel/traverse": "^7.26.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+      "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+      "dependencies": {
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
+      "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
+      "dependencies": {
+        "@babel/template": "^7.27.0",
+        "@babel/types": "^7.27.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
+      "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
+      "dependencies": {
+        "@babel/types": "^7.27.0"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-decorators": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
+      "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.25.9",
+        "@babel/plugin-syntax-decorators": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-decorators": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
+      "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+      "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+      "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+      "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typescript": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz",
+      "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-create-class-features-plugin": "^7.27.0",
+        "@babel/helper-plugin-utils": "^7.26.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+        "@babel/plugin-syntax-typescript": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
+      "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/parser": "^7.27.0",
+        "@babel/types": "^7.27.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
+      "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.27.0",
+        "@babel/parser": "^7.27.0",
+        "@babel/template": "^7.27.0",
+        "@babel/types": "^7.27.0",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse/node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
+      "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@bufbuild/protobuf": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.5.tgz",
+      "integrity": "sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==",
+      "devOptional": true
+    },
+    "node_modules/@ctrl/tinycolor": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@element-plus/icons-vue": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
+      "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
+      "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
+      "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
+      "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
+      "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
+      "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
+      "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
+      "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
+      "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
+      "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
+      "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
+      "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
+      "cpu": [
+        "loong64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
+      "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
+      "cpu": [
+        "mips64el"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
+      "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
+      "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
+      "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
+      "cpu": [
+        "s390x"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
+      "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
+      "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
+      "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
+      "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
+      "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
+      "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
+      "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
+      "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
+      "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@floating-ui/core": {
+      "version": "1.6.9",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.9.tgz",
+      "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.6.13",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.13.tgz",
+      "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/core": "^1.6.0",
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz",
+      "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
+      "license": "MIT"
+    },
+    "node_modules/@iconify-json/ep": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/@iconify-json/ep/-/ep-1.2.2.tgz",
+      "integrity": "sha512-/IH1GjQKH5uK7lQAOjwPxdjkU98OWUWnHYCdg/EkeebBKEteotaOMeEz5pR1egqMcI7zPFdFBTcGyCHla1ddQw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@iconify/types": "*"
+      }
+    },
+    "node_modules/@iconify/types": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz",
+      "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@iconify/utils": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/@iconify/utils/-/utils-2.3.0.tgz",
+      "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@antfu/install-pkg": "^1.0.0",
+        "@antfu/utils": "^8.1.0",
+        "@iconify/types": "^2.0.0",
+        "debug": "^4.4.0",
+        "globals": "^15.14.0",
+        "kolorist": "^1.8.0",
+        "local-pkg": "^1.0.0",
+        "mlly": "^1.7.4"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nuxt/kit": {
+      "version": "3.16.0",
+      "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.16.0.tgz",
+      "integrity": "sha512-yPfhk58BG6wJhELkGOTCOlkMDbZkizk3IaINcyTKm+hBKiK3SheLt7S9HStNL+qZSfH2Cf7A8sYp6M72lOIEtA==",
+      "license": "MIT",
+      "dependencies": {
+        "c12": "^3.0.2",
+        "consola": "^3.4.0",
+        "defu": "^6.1.4",
+        "destr": "^2.0.3",
+        "errx": "^0.1.0",
+        "exsolve": "^1.0.2",
+        "globby": "^14.1.0",
+        "ignore": "^7.0.3",
+        "jiti": "^2.4.2",
+        "klona": "^2.0.6",
+        "knitwork": "^1.2.0",
+        "mlly": "^1.7.4",
+        "ohash": "^2.0.11",
+        "pathe": "^2.0.3",
+        "pkg-types": "^2.1.0",
+        "scule": "^1.3.0",
+        "semver": "^7.7.1",
+        "std-env": "^3.8.1",
+        "ufo": "^1.5.4",
+        "unctx": "^2.4.1",
+        "unimport": "^4.1.2",
+        "untyped": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      }
+    },
+    "node_modules/@polka/url": {
+      "version": "1.0.0-next.29",
+      "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+      "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="
+    },
+    "node_modules/@popperjs/core": {
+      "name": "@sxzz/popperjs-es",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
+    "node_modules/@quansync/fs": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-0.1.2.tgz",
+      "integrity": "sha512-ezIadUb1aFhwJLd++WVqVpi9rnlX8vnd4ju7saPhwLHJN1mJgOv0puePTGV+FbtSnWtwoHDT8lAm4kagDZmpCg==",
+      "dev": true,
+      "dependencies": {
+        "quansync": "^0.2.10"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sxzz"
+      }
+    },
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
+      "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz",
+      "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz",
+      "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz",
+      "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz",
+      "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz",
+      "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz",
+      "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz",
+      "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz",
+      "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz",
+      "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz",
+      "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz",
+      "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==",
+      "cpu": [
+        "loong64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz",
+      "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz",
+      "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==",
+      "cpu": [
+        "riscv64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz",
+      "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==",
+      "cpu": [
+        "s390x"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz",
+      "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz",
+      "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz",
+      "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz",
+      "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz",
+      "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@sec-ant/readable-stream": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+      "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="
+    },
+    "node_modules/@sindresorhus/merge-streams": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+      "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/lodash": {
+      "version": "4.17.16",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.16.tgz",
+      "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/lodash-es": {
+      "version": "4.17.12",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/lodash": "*"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "22.13.10",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.13.10.tgz",
+      "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~6.20.0"
+      }
+    },
+    "node_modules/@types/vue": {
+      "version": "1.0.31",
+      "resolved": "https://registry.npmmirror.com/@types/vue/-/vue-1.0.31.tgz",
+      "integrity": "sha512-unhlPKHFYEc+NA7nBz8yYSg7MOhWFJF2M/tzjb0rgVuK4pQzUBGmBp3IhfuhYDo3wr3dgA5sm9GUHmUJz2Hb9w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/web-bluetooth": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
+      "license": "MIT"
+    },
+    "node_modules/@unocss/astro": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-66.1.0-beta.10.tgz",
+      "integrity": "sha512-PDg1n4TeovElo4IqUpqNQA4K5pbLmgPceh8vjs6hUGmH3mwOdTYKYTWtcc2hFy40/6XSaKy0iiWuBogCyVU/EQ==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/reset": "66.1.0-beta.10",
+        "@unocss/vite": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "vite": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@unocss/astro/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/cli": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-66.1.0-beta.10.tgz",
+      "integrity": "sha512-B0E5W+xKhixQRIQWcFulmoFn7/KNMv7rLtP/ab3ltZ0Szw9Q+9I0WZIpW4UZmfHOIF7yqqnXxcUIhLvg6Ot3fQ==",
+      "dev": true,
+      "dependencies": {
+        "@ampproject/remapping": "^2.3.0",
+        "@unocss/config": "66.1.0-beta.10",
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/preset-uno": "66.1.0-beta.10",
+        "cac": "^6.7.14",
+        "chokidar": "^3.6.0",
+        "colorette": "^2.0.20",
+        "consola": "^3.4.2",
+        "magic-string": "^0.30.17",
+        "pathe": "^2.0.3",
+        "perfect-debounce": "^1.0.0",
+        "tinyglobby": "^0.2.12",
+        "unplugin-utils": "^0.2.4"
+      },
+      "bin": {
+        "unocss": "bin/unocss.mjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/cli/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/cli/node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/@unocss/cli/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/@unocss/config": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.1.0-beta.10.tgz",
+      "integrity": "sha512-+qx4zlVA9f1cCifoVXYmiHTI1y1rIxHgpiUdb0pI8OOdFsK6j0adua/hSdlvroXAoj2MNdE8WVEEv3L6MlDOpg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "unconfig": "^7.3.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/config/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/core": {
+      "version": "66.1.0-beta.8",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.8.tgz",
+      "integrity": "sha512-j56/9COPQ09+g0EittHtAmddRU4X0HgQ+Fz5hK+I894boljGNG6kI1vj5Gi0C/tllddrH/CbTdJ1K6RumSAK8w==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/extractor-arbitrary-variants": {
+      "version": "66.1.0-beta.8",
+      "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.1.0-beta.8.tgz",
+      "integrity": "sha512-h9cXkuK2bsEGoYGHl22iavRM8x2yp5Be0OiEFly1kkH9MPGx5cAGchsP18ij8BQJRaW4d6JXm99pHr6ILnteGw==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/inspector": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zAFrpQkzNz4uWxynVsnRdIBckVYHafYqUBzIVfuvwcK3rxHhkET5fVGQk70ww29CRX0bjy7x64wPggKsQ2wg2A==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/rule-utils": "66.1.0-beta.10",
+        "colorette": "^2.0.20",
+        "gzip-size": "^6.0.0",
+        "sirv": "^3.0.1",
+        "vue-flow-layout": "^0.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/inspector/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/inspector/node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yGC8uQT6ErjLsWMU3Nx7mjvftYukLL+TELM+pmYOFmbhasrdnnJI1kT/04dyUHQTlm3XCs8I7LhbYaVz7MmIXA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.10",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/postcss": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-66.1.0-beta.10.tgz",
+      "integrity": "sha512-MYbdqNozge5MY/cKO9A7b1WWef7Xw9GiwPWu+RpmBs7218dfowtfIIYzVyLEKWNoFW3iy5JjVm0oYfYCBKj9wg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/config": "66.1.0-beta.10",
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/rule-utils": "66.1.0-beta.10",
+        "css-tree": "^3.1.0",
+        "postcss": "^8.5.3",
+        "tinyglobby": "^0.2.12"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.21"
+      }
+    },
+    "node_modules/@unocss/postcss/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/postcss/node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yGC8uQT6ErjLsWMU3Nx7mjvftYukLL+TELM+pmYOFmbhasrdnnJI1kT/04dyUHQTlm3XCs8I7LhbYaVz7MmIXA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.10",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-attributify": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-66.1.0-beta.10.tgz",
+      "integrity": "sha512-Rue15+sGta598wezB9NEcKiLmBFNjaAiPYCsVUU2+3RrrF/H59Uq9RBgQ/9SDn9wCT+mxYcn/aIDaIQzDog1Tg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-attributify/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-icons": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-66.1.0-beta.10.tgz",
+      "integrity": "sha512-Ms5CawV26GNi5iN/l9eIohKLcqh5QCA8F5cgJs5zW3kQ31YorveOOyg3QTpHAC4Dln5sZ9/4RplAWObGr2ppiQ==",
+      "dev": true,
+      "dependencies": {
+        "@iconify/utils": "^2.3.0",
+        "@unocss/core": "66.1.0-beta.10",
+        "ofetch": "^1.4.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-icons/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-mini": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.1.0-beta.10.tgz",
+      "integrity": "sha512-KqYstZZnOTHvMWAt3Q0UgZipDvvcbYyjpkbSD4Ki8nzHNjF9OJnQHqGTfxvjbiw5Yl27wcB0v4ueOksMENhRrA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/extractor-arbitrary-variants": "66.1.0-beta.10",
+        "@unocss/rule-utils": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-mini/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-mini/node_modules/@unocss/extractor-arbitrary-variants": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.1.0-beta.10.tgz",
+      "integrity": "sha512-qxeScl5guWtlNNUxcOFI12WTLkivao/4vIJW2uJfxuDVlUlBtrB6dw/SL40CVlosZemvM24Boo4U/xjWeh/oCA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-mini/node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yGC8uQT6ErjLsWMU3Nx7mjvftYukLL+TELM+pmYOFmbhasrdnnJI1kT/04dyUHQTlm3XCs8I7LhbYaVz7MmIXA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.10",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-tagify": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-66.1.0-beta.10.tgz",
+      "integrity": "sha512-x71VI/PEUxihv8tAXnoPmq40Ysit6aAtslgTaUwy0smhfQfsM4uSC0c8BTrc1R0wZ8JSz+KIb6TbZNMvP52uvQ==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-tagify/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-typography": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-66.1.0-beta.10.tgz",
+      "integrity": "sha512-e74Uwy+0croYtvVOEGmQrPz6TAIX1QtMzh2Ngfq283zxg6Cy2PybvdXCa5mUqn9X76pPXs0sWvSo2fknFg/Gjw==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/preset-mini": "66.1.0-beta.10",
+        "@unocss/rule-utils": "66.1.0-beta.10"
+      }
+    },
+    "node_modules/@unocss/preset-typography/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-typography/node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yGC8uQT6ErjLsWMU3Nx7mjvftYukLL+TELM+pmYOFmbhasrdnnJI1kT/04dyUHQTlm3XCs8I7LhbYaVz7MmIXA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.10",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-uno": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-66.1.0-beta.10.tgz",
+      "integrity": "sha512-HzB5QB5KRmyZ8JVzLv4ZHMIPvSu7s9q+jb47W4gPJ0fhXUNJ7oVJIVPcYzBz+ppk98uNbUqOkJrnNE5BtUsiVg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/preset-wind3": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-uno/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-web-fonts": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yoXedApMV/TDNG2uLcl4awXs4uYs2isnXmSJabR32DIctknqXfHjzvpEoBz8e1AmlmBz4GEi0i1ounu8mL5nrw==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "ofetch": "^1.4.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-web-fonts/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-wind": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-66.1.0-beta.10.tgz",
+      "integrity": "sha512-JZItGFJTCyB9cjuM5YGtqlZQlbjqq0YSUvJU8BDLksoBw/o4hlFNSGnVfFKY9NM9s0NdA4bQWxlNLS9uLROIUw==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/preset-wind3": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-wind/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-wind3": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-wind3/-/preset-wind3-66.1.0-beta.10.tgz",
+      "integrity": "sha512-R8cp1FORCMTNbIT6UTPIVZfSk62Ns+KrjI8psGzZLhIpbrD57l5CixJKESHGP+Gwp8Ff94PLI9i547ZNT0oMKg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/preset-mini": "66.1.0-beta.10",
+        "@unocss/rule-utils": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-wind3/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-wind3/node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yGC8uQT6ErjLsWMU3Nx7mjvftYukLL+TELM+pmYOFmbhasrdnnJI1kT/04dyUHQTlm3XCs8I7LhbYaVz7MmIXA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.10",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/preset-wind4": {
+      "version": "66.1.0-beta.8",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.1.0-beta.8.tgz",
+      "integrity": "sha512-EWLC226yzh8nZAVm696K7voKth9/WJE6KiVtmwY1KYzthtU6JPEtaQaseIO3p97uJzTCUon9zVp8URA6jM6XEA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.8",
+        "@unocss/extractor-arbitrary-variants": "66.1.0-beta.8",
+        "@unocss/rule-utils": "66.1.0-beta.8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/reset": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-66.1.0-beta.10.tgz",
+      "integrity": "sha512-B3Xd1jjtzsifpeoFWrtKO+7yjdx0S/lHaaDtAoPxHe8RmQBbjFSWpVV7ohRCEzuZwG0gLJHh5lV+lP70CyFJaw==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.8",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.8.tgz",
+      "integrity": "sha512-NamsfYZKEiDFNyiHwlllz21nvDoI25oVCc4ihHUh0OkQohVgPshp8Amx3WNogDllQf3VqRC9l7pWO6kjLjRvIw==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.8",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-attributify-jsx": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.1.0-beta.10.tgz",
+      "integrity": "sha512-CiqpzJG3bhIMK/bNz8yX3HVv5rqIiXZZ+jqlyfHuioYomUp/Kogk8aQGId2yjJzIxCYKJIu2SlXqgIq3OqiZIQ==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-attributify-jsx/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-compile-class": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-66.1.0-beta.10.tgz",
+      "integrity": "sha512-6mdrgypeW7DfkcFQXuoi73bARvwv3lVgqXP3qcw2NZp3qrSjNXoWTlVG8wTmZlA3yibVkUQHKm/ss7wZMArnGg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-compile-class/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-directives": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-66.1.0-beta.10.tgz",
+      "integrity": "sha512-PVXVblXCVo6mjThQrTwHcoNuZvrxjkzW4qWzZQxrCiS+pQs31kod0UL9WFIUWc/xgyRgYUiLNlBBhdxDykNJjg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/rule-utils": "66.1.0-beta.10",
+        "css-tree": "^3.1.0"
+      }
+    },
+    "node_modules/@unocss/transformer-directives/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-directives/node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yGC8uQT6ErjLsWMU3Nx7mjvftYukLL+TELM+pmYOFmbhasrdnnJI1kT/04dyUHQTlm3XCs8I7LhbYaVz7MmIXA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.10",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-variant-group": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-66.1.0-beta.10.tgz",
+      "integrity": "sha512-S6a5qVZXBv6QxKX7y9hVTUhMseyWEqvLv/p6gkKGAlmnJfeQak8OZBAECHUIhiGzYltF3I8gjsRqx7XYy3yh+w==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/transformer-variant-group/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/vite": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-66.1.0-beta.10.tgz",
+      "integrity": "sha512-d0qHzjOucy4AjAbQmCoFyoY4JjFaGOfhGyerSzzU4/DjOhjUmxsO6KTaDrmAgMGErGegWVoxScxOVCEMuh1c/Q==",
+      "dev": true,
+      "dependencies": {
+        "@ampproject/remapping": "^2.3.0",
+        "@unocss/config": "66.1.0-beta.10",
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/inspector": "66.1.0-beta.10",
+        "chokidar": "^3.6.0",
+        "magic-string": "^0.30.17",
+        "tinyglobby": "^0.2.12",
+        "unplugin-utils": "^0.2.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
+      }
+    },
+    "node_modules/@unocss/vite/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@unocss/vite/node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/@unocss/vite/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+      "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^5.0.0 || ^6.0.0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@volar/language-core": {
+      "version": "2.4.12",
+      "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.12.tgz",
+      "integrity": "sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/source-map": "2.4.12"
+      }
+    },
+    "node_modules/@volar/source-map": {
+      "version": "2.4.12",
+      "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.12.tgz",
+      "integrity": "sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@volar/typescript": {
+      "version": "2.4.12",
+      "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.12.tgz",
+      "integrity": "sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.12",
+        "path-browserify": "^1.0.1",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@vue/babel-helper-vue-transform-on": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz",
+      "integrity": "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw=="
+    },
+    "node_modules/@vue/babel-plugin-jsx": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz",
+      "integrity": "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.26.5",
+        "@babel/plugin-syntax-jsx": "^7.25.9",
+        "@babel/template": "^7.26.9",
+        "@babel/traverse": "^7.26.9",
+        "@babel/types": "^7.26.9",
+        "@vue/babel-helper-vue-transform-on": "1.4.0",
+        "@vue/babel-plugin-resolve-type": "1.4.0",
+        "@vue/shared": "^3.5.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vue/babel-plugin-resolve-type": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.4.0.tgz",
+      "integrity": "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.26.5",
+        "@babel/parser": "^7.26.9",
+        "@vue/compiler-sfc": "^3.5.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sxzz"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+      "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/shared": "3.5.13",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+      "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+      "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/compiler-core": "3.5.13",
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.11",
+        "postcss": "^8.4.48",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+      "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/compiler-vue2": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
+      "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "de-indent": "^1.0.2",
+        "he": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.2.tgz",
+      "integrity": "sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.2"
+      }
+    },
+    "node_modules/@vue/devtools-core": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.2.tgz",
+      "integrity": "sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.2",
+        "@vue/devtools-shared": "^7.7.2",
+        "mitt": "^3.0.1",
+        "nanoid": "^5.0.9",
+        "pathe": "^2.0.2",
+        "vite-hot-client": "^0.2.4"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/@vue/devtools-core/node_modules/nanoid": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz",
+      "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.js"
+      },
+      "engines": {
+        "node": "^18 || >=20"
+      }
+    },
+    "node_modules/@vue/devtools-kit": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz",
+      "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-shared": "^7.7.2",
+        "birpc": "^0.2.19",
+        "hookable": "^5.5.3",
+        "mitt": "^3.0.1",
+        "perfect-debounce": "^1.0.0",
+        "speakingurl": "^14.0.1",
+        "superjson": "^2.2.1"
+      }
+    },
+    "node_modules/@vue/devtools-shared": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz",
+      "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==",
+      "license": "MIT",
+      "dependencies": {
+        "rfdc": "^1.4.1"
+      }
+    },
+    "node_modules/@vue/language-core": {
+      "version": "2.2.8",
+      "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.8.tgz",
+      "integrity": "sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "~2.4.11",
+        "@vue/compiler-dom": "^3.5.0",
+        "@vue/compiler-vue2": "^2.7.16",
+        "@vue/shared": "^3.5.0",
+        "alien-signals": "^1.0.3",
+        "minimatch": "^9.0.3",
+        "muggle-string": "^0.4.1",
+        "path-browserify": "^1.0.1"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/runtime-core": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "vue": "3.5.13"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
+      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
+      "license": "MIT"
+    },
+    "node_modules/@vue/tsconfig": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz",
+      "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "typescript": "5.x",
+        "vue": "^3.4.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/core": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "license": "MIT",
+      "dependencies": {
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.14.1",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz",
+      "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/alien-signals": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-1.0.4.tgz",
+      "integrity": "sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/async-validator": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+      "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
+      "license": "MIT"
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/axios": {
+      "version": "1.8.4",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
+      "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/birpc": {
+      "version": "0.2.19",
+      "resolved": "https://registry.npmmirror.com/birpc/-/birpc-0.2.19.tgz",
+      "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001688",
+        "electron-to-chromium": "^1.5.73",
+        "node-releases": "^2.0.19",
+        "update-browserslist-db": "^1.1.1"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer-builder": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz",
+      "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==",
+      "devOptional": true
+    },
+    "node_modules/bundle-name": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+      "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+      "dependencies": {
+        "run-applescript": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/c12": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/c12/-/c12-3.0.2.tgz",
+      "integrity": "sha512-6Tzk1/TNeI3WBPpK0j/Ss4+gPj3PUJYbWl/MWDJBThFvwNGNkXtd7Cz8BJtD4aRwoGHtzQD0SnxamgUiBH0/Nw==",
+      "license": "MIT",
+      "dependencies": {
+        "chokidar": "^4.0.3",
+        "confbox": "^0.1.8",
+        "defu": "^6.1.4",
+        "dotenv": "^16.4.7",
+        "exsolve": "^1.0.0",
+        "giget": "^2.0.0",
+        "jiti": "^2.4.2",
+        "ohash": "^2.0.5",
+        "pathe": "^2.0.3",
+        "perfect-debounce": "^1.0.0",
+        "pkg-types": "^2.0.0",
+        "rc9": "^2.1.2"
+      },
+      "peerDependencies": {
+        "magicast": "^0.3.5"
+      },
+      "peerDependenciesMeta": {
+        "magicast": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/cac": {
+      "version": "6.7.14",
+      "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+      "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001713",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz",
+      "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ]
+    },
+    "node_modules/chokidar": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz",
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+      "license": "MIT",
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/citty": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz",
+      "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+      "license": "MIT",
+      "dependencies": {
+        "consola": "^3.2.3"
+      }
+    },
+    "node_modules/colorette": {
+      "version": "2.0.20",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+      "dev": true
+    },
+    "node_modules/colorjs.io": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz",
+      "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
+      "devOptional": true
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/confbox": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
+      "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+      "license": "MIT"
+    },
+    "node_modules/consola": {
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+      "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+      "engines": {
+        "node": "^14.18.0 || >=16.10.0"
+      }
+    },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
+    },
+    "node_modules/copy-anything": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz",
+      "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+      "license": "MIT",
+      "dependencies": {
+        "is-what": "^4.1.8"
+      },
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/css-tree": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+      "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
+      "dev": true,
+      "dependencies": {
+        "mdn-data": "2.12.2",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "license": "MIT"
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+      "license": "MIT"
+    },
+    "node_modules/de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
+      "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/debug": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
+      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deep-pick-omit": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
+      "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==",
+      "license": "MIT"
+    },
+    "node_modules/default-browser": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
+      "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+      "dependencies": {
+        "bundle-name": "^4.1.0",
+        "default-browser-id": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/default-browser-id": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
+      "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/define-lazy-prop": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+      "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/defu": {
+      "version": "6.1.4",
+      "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz",
+      "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+      "license": "MIT"
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/destr": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.3.tgz",
+      "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==",
+      "license": "MIT"
+    },
+    "node_modules/dotenv": {
+      "version": "16.4.7",
+      "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz",
+      "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+      "dev": true
+    },
+    "node_modules/echarts": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
+      "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
+      "dependencies": {
+        "tslib": "2.3.0",
+        "zrender": "5.6.1"
+      }
+    },
+    "node_modules/echarts/node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.5.135",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.135.tgz",
+      "integrity": "sha512-8gXUdEmvb+WCaYUhA0Svr08uSeRjM2w3x5uHOc1QbaEVzJXB8rgm5eptieXzyKoVEtinLvW6MtTcurA65PeS1Q=="
+    },
+    "node_modules/element-plus": {
+      "version": "2.9.6",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.6.tgz",
+      "integrity": "sha512-D9zU28Ce0s/9O/Vp3ewemikxzFVA6gdZyMwmWijHijo+t5/9H3sHRTIm1WlfeNpFW2Yq0y8nHXD0fU5YxU6qlQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@ctrl/tinycolor": "^3.4.1",
+        "@element-plus/icons-vue": "^2.3.1",
+        "@floating-ui/dom": "^1.0.1",
+        "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+        "@types/lodash": "^4.14.182",
+        "@types/lodash-es": "^4.17.6",
+        "@vueuse/core": "^9.1.0",
+        "async-validator": "^4.2.5",
+        "dayjs": "^1.11.13",
+        "escape-html": "^1.0.3",
+        "lodash": "^4.17.21",
+        "lodash-es": "^4.17.21",
+        "lodash-unified": "^1.0.2",
+        "memoize-one": "^6.0.0",
+        "normalize-wheel-es": "^1.2.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/error-stack-parser-es": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz",
+      "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/errx": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/errx/-/errx-0.1.0.tgz",
+      "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==",
+      "license": "MIT"
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.0.tgz",
+      "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.25.0",
+        "@esbuild/android-arm": "0.25.0",
+        "@esbuild/android-arm64": "0.25.0",
+        "@esbuild/android-x64": "0.25.0",
+        "@esbuild/darwin-arm64": "0.25.0",
+        "@esbuild/darwin-x64": "0.25.0",
+        "@esbuild/freebsd-arm64": "0.25.0",
+        "@esbuild/freebsd-x64": "0.25.0",
+        "@esbuild/linux-arm": "0.25.0",
+        "@esbuild/linux-arm64": "0.25.0",
+        "@esbuild/linux-ia32": "0.25.0",
+        "@esbuild/linux-loong64": "0.25.0",
+        "@esbuild/linux-mips64el": "0.25.0",
+        "@esbuild/linux-ppc64": "0.25.0",
+        "@esbuild/linux-riscv64": "0.25.0",
+        "@esbuild/linux-s390x": "0.25.0",
+        "@esbuild/linux-x64": "0.25.0",
+        "@esbuild/netbsd-arm64": "0.25.0",
+        "@esbuild/netbsd-x64": "0.25.0",
+        "@esbuild/openbsd-arm64": "0.25.0",
+        "@esbuild/openbsd-x64": "0.25.0",
+        "@esbuild/sunos-x64": "0.25.0",
+        "@esbuild/win32-arm64": "0.25.0",
+        "@esbuild/win32-ia32": "0.25.0",
+        "@esbuild/win32-x64": "0.25.0"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "license": "MIT"
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "license": "MIT"
+    },
+    "node_modules/execa": {
+      "version": "9.5.2",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz",
+      "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==",
+      "dependencies": {
+        "@sindresorhus/merge-streams": "^4.0.0",
+        "cross-spawn": "^7.0.3",
+        "figures": "^6.1.0",
+        "get-stream": "^9.0.0",
+        "human-signals": "^8.0.0",
+        "is-plain-obj": "^4.1.0",
+        "is-stream": "^4.0.1",
+        "npm-run-path": "^6.0.0",
+        "pretty-ms": "^9.0.0",
+        "signal-exit": "^4.1.0",
+        "strip-final-newline": "^4.0.0",
+        "yoctocolors": "^2.0.0"
+      },
+      "engines": {
+        "node": "^18.19.0 || >=20.5.0"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/execa/node_modules/@sindresorhus/merge-streams": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+      "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/exsolve": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.4.tgz",
+      "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==",
+      "license": "MIT"
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.8"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz",
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/figures": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
+      "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+      "dependencies": {
+        "is-unicode-supported": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.9",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+      "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fs-extra": {
+      "version": "11.3.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
+      "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.14"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
+      "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+      "dependencies": {
+        "@sec-ant/readable-stream": "^0.4.1",
+        "is-stream": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/giget": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/giget/-/giget-2.0.0.tgz",
+      "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
+      "license": "MIT",
+      "dependencies": {
+        "citty": "^0.1.6",
+        "consola": "^3.4.0",
+        "defu": "^6.1.4",
+        "node-fetch-native": "^1.6.6",
+        "nypm": "^0.6.0",
+        "pathe": "^2.0.3"
+      },
+      "bin": {
+        "giget": "dist/cli.mjs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/globals": {
+      "version": "15.15.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-15.15.0.tgz",
+      "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/globby": {
+      "version": "14.1.0",
+      "resolved": "https://registry.npmmirror.com/globby/-/globby-14.1.0.tgz",
+      "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
+      "license": "MIT",
+      "dependencies": {
+        "@sindresorhus/merge-streams": "^2.1.0",
+        "fast-glob": "^3.3.3",
+        "ignore": "^7.0.3",
+        "path-type": "^6.0.0",
+        "slash": "^5.1.0",
+        "unicorn-magic": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+    },
+    "node_modules/gzip-size": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+      "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+      "dev": true,
+      "dependencies": {
+        "duplexer": "^0.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "devOptional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "he": "bin/he"
+      }
+    },
+    "node_modules/highlight.js": {
+      "version": "11.11.1",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+      "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/hookable": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
+      "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+      "license": "MIT"
+    },
+    "node_modules/human-signals": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz",
+      "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==",
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.3.tgz",
+      "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/immutable": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz",
+      "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==",
+      "devOptional": true
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+      "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-inside-container": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+      "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+      "dependencies": {
+        "is-docker": "^3.0.0"
+      },
+      "bin": {
+        "is-inside-container": "cli.js"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-plain-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+      "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-unicode-supported": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+      "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "4.1.16",
+      "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz",
+      "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+      "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+      "dependencies": {
+        "is-inside-container": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "node_modules/jiti": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.4.2.tgz",
+      "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+      "license": "MIT",
+      "bin": {
+        "jiti": "lib/jiti-cli.mjs"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz",
+      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+      "license": "MIT"
+    },
+    "node_modules/jsesc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/klona": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz",
+      "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/knitwork": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/knitwork/-/knitwork-1.2.0.tgz",
+      "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==",
+      "license": "MIT"
+    },
+    "node_modules/kolorist": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz",
+      "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+      "license": "MIT"
+    },
+    "node_modules/local-pkg": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz",
+      "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==",
+      "license": "MIT",
+      "dependencies": {
+        "mlly": "^1.7.4",
+        "pkg-types": "^2.0.1",
+        "quansync": "^0.2.8"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "license": "MIT"
+    },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+      "license": "MIT"
+    },
+    "node_modules/lodash-unified": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/lodash-es": "*",
+        "lodash": "*",
+        "lodash-es": "*"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.17",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
+      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/marked": {
+      "version": "15.0.8",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.8.tgz",
+      "integrity": "sha512-rli4l2LyZqpQuRve5C0rkn6pj3hT8EWPC+zkAxFTAJLxRbENfTAhEQq9itrmf1Y81QtAX5D/MYlGlIomNgj9lA==",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/mdn-data": {
+      "version": "2.12.2",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+      "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
+      "dev": true
+    },
+    "node_modules/memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+      "license": "MIT"
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+      "license": "MIT"
+    },
+    "node_modules/mlly": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz",
+      "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "pathe": "^2.0.1",
+        "pkg-types": "^1.3.0",
+        "ufo": "^1.5.4"
+      }
+    },
+    "node_modules/mlly/node_modules/pkg-types": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz",
+      "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+      "license": "MIT",
+      "dependencies": {
+        "confbox": "^0.1.8",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.1"
+      }
+    },
+    "node_modules/mrmime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+      "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "license": "MIT"
+    },
+    "node_modules/muggle-string": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz",
+      "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.9",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.9.tgz",
+      "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/node-fetch-native": {
+      "version": "1.6.6",
+      "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz",
+      "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==",
+      "license": "MIT"
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-wheel-es": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/normalize.css": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
+      "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
+    },
+    "node_modules/npm-run-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+      "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+      "dependencies": {
+        "path-key": "^4.0.0",
+        "unicorn-magic": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/npm-run-path/node_modules/path-key": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/nypm": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.6.0.tgz",
+      "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==",
+      "license": "MIT",
+      "dependencies": {
+        "citty": "^0.1.6",
+        "consola": "^3.4.0",
+        "pathe": "^2.0.3",
+        "pkg-types": "^2.0.0",
+        "tinyexec": "^0.3.2"
+      },
+      "bin": {
+        "nypm": "dist/cli.mjs"
+      },
+      "engines": {
+        "node": "^14.16.0 || >=16.10.0"
+      }
+    },
+    "node_modules/ofetch": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz",
+      "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==",
+      "dev": true,
+      "dependencies": {
+        "destr": "^2.0.3",
+        "node-fetch-native": "^1.6.4",
+        "ufo": "^1.5.4"
+      }
+    },
+    "node_modules/ohash": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz",
+      "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
+      "license": "MIT"
+    },
+    "node_modules/open": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
+      "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
+      "dependencies": {
+        "default-browser": "^5.2.1",
+        "define-lazy-prop": "^3.0.0",
+        "is-inside-container": "^1.0.0",
+        "is-wsl": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/package-manager-detector": {
+      "version": "0.2.11",
+      "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-0.2.11.tgz",
+      "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "quansync": "^0.2.7"
+      }
+    },
+    "node_modules/parse-ms": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz",
+      "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-type": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/path-type/-/path-type-6.0.0.tgz",
+      "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/pathe": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+      "license": "MIT"
+    },
+    "node_modules/perfect-debounce": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+      "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+      "license": "MIT"
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pinia": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.1.tgz",
+      "integrity": "sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^7.7.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.4.4",
+        "vue": "^2.7.0 || ^3.5.11"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pinia-plugin-persistedstate": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz",
+      "integrity": "sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@nuxt/kit": "^3.14.1592",
+        "deep-pick-omit": "^1.2.1",
+        "defu": "^6.1.4",
+        "destr": "^2.0.3"
+      },
+      "peerDependencies": {
+        "@pinia/nuxt": ">=0.9.0",
+        "pinia": ">=2.3.0"
+      },
+      "peerDependenciesMeta": {
+        "@pinia/nuxt": {
+          "optional": true
+        },
+        "pinia": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pkg-types": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz",
+      "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==",
+      "license": "MIT",
+      "dependencies": {
+        "confbox": "^0.2.1",
+        "exsolve": "^1.0.1",
+        "pathe": "^2.0.3"
+      }
+    },
+    "node_modules/pkg-types/node_modules/confbox": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.1.tgz",
+      "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==",
+      "license": "MIT"
+    },
+    "node_modules/postcss": {
+      "version": "8.5.3",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
+      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.8",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/pretty-ms": {
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz",
+      "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==",
+      "dependencies": {
+        "parse-ms": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "node_modules/quansync": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz",
+      "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/antfu"
+        },
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/sxzz"
+        }
+      ]
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/rc9": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz",
+      "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
+      "license": "MIT",
+      "dependencies": {
+        "defu": "^6.1.4",
+        "destr": "^2.0.3"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14.18.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rfdc": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "license": "MIT"
+    },
+    "node_modules/rollup": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.35.0.tgz",
+      "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.6"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.35.0",
+        "@rollup/rollup-android-arm64": "4.35.0",
+        "@rollup/rollup-darwin-arm64": "4.35.0",
+        "@rollup/rollup-darwin-x64": "4.35.0",
+        "@rollup/rollup-freebsd-arm64": "4.35.0",
+        "@rollup/rollup-freebsd-x64": "4.35.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.35.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.35.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.35.0",
+        "@rollup/rollup-linux-arm64-musl": "4.35.0",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.35.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.35.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.35.0",
+        "@rollup/rollup-linux-x64-gnu": "4.35.0",
+        "@rollup/rollup-linux-x64-musl": "4.35.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.35.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.35.0",
+        "@rollup/rollup-win32-x64-msvc": "4.35.0",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/run-applescript": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
+      "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/rxjs": {
+      "version": "7.8.2",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+      "devOptional": true,
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/sass-embedded": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.3.tgz",
+      "integrity": "sha512-3pZSp24ibO1hdopj+W9DuiWsZOb2YY6AFRo/jjutKLBkqJGM1nJjXzhAYfzRV+Xn5BX1eTI4bBTE09P0XNHOZg==",
+      "devOptional": true,
+      "dependencies": {
+        "@bufbuild/protobuf": "^2.0.0",
+        "buffer-builder": "^0.2.0",
+        "colorjs.io": "^0.5.0",
+        "immutable": "^5.0.2",
+        "rxjs": "^7.4.0",
+        "supports-color": "^8.1.1",
+        "sync-child-process": "^1.0.2",
+        "varint": "^6.0.0"
+      },
+      "bin": {
+        "sass": "dist/bin/sass.js"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "optionalDependencies": {
+        "sass-embedded-android-arm": "1.86.3",
+        "sass-embedded-android-arm64": "1.86.3",
+        "sass-embedded-android-ia32": "1.86.3",
+        "sass-embedded-android-riscv64": "1.86.3",
+        "sass-embedded-android-x64": "1.86.3",
+        "sass-embedded-darwin-arm64": "1.86.3",
+        "sass-embedded-darwin-x64": "1.86.3",
+        "sass-embedded-linux-arm": "1.86.3",
+        "sass-embedded-linux-arm64": "1.86.3",
+        "sass-embedded-linux-ia32": "1.86.3",
+        "sass-embedded-linux-musl-arm": "1.86.3",
+        "sass-embedded-linux-musl-arm64": "1.86.3",
+        "sass-embedded-linux-musl-ia32": "1.86.3",
+        "sass-embedded-linux-musl-riscv64": "1.86.3",
+        "sass-embedded-linux-musl-x64": "1.86.3",
+        "sass-embedded-linux-riscv64": "1.86.3",
+        "sass-embedded-linux-x64": "1.86.3",
+        "sass-embedded-win32-arm64": "1.86.3",
+        "sass-embedded-win32-ia32": "1.86.3",
+        "sass-embedded-win32-x64": "1.86.3"
+      }
+    },
+    "node_modules/sass-embedded-android-arm": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.3.tgz",
+      "integrity": "sha512-UyeXrFzZSvrGbvrWUBcspbsbivGgAgebLGJdSqJulgSyGbA6no3DWQ5Qpdd6+OAUC39BlpPu74Wx9s4RrVuaFw==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-arm64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.3.tgz",
+      "integrity": "sha512-q+XwFp6WgAv+UgnQhsB8KQ95kppvWAB7DSoJp+8Vino8b9ND+1ai3cUUZPE5u4SnLZrgo5NtrbPvN5KLc4Pfyg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-ia32": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.3.tgz",
+      "integrity": "sha512-gTJjVh2cRzvGujXj5ApPk/owUTL5SiO7rDtNLrzYAzi1N5HRuLYXqk3h1IQY3+eCOBjGl7mQ9XyySbJs/3hDvg==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-riscv64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.3.tgz",
+      "integrity": "sha512-Po3JnyiCS16kd6REo1IMUbFGYtvL9O0rmKaXx5vOuBaJD1LPy2LiSSp7TU7wkJ9IxsTDGzFaSeP1I9qb6D8VVg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-x64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.3.tgz",
+      "integrity": "sha512-+7h3jdDv/0kUFx0BvxYlq2fa7CcHiDPlta6k5OxO5K6jyqJwo9hc0Z052BoYEauWTqZ+vK6bB5rv2BIzq4U9nA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-arm64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.3.tgz",
+      "integrity": "sha512-EgLwV4ORm5Hr0DmIXo0Xw/vlzwLnfAiqD2jDXIglkBsc5czJmo4/IBdGXOP65TRnsgJEqvbU3aQhuawX5++x9A==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-x64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.3.tgz",
+      "integrity": "sha512-dfKhfrGPRNLWLC82vy/vQGmNKmAiKWpdFuWiePRtg/E95pqw+sCu6080Y6oQLfFu37Iq3MpnXiSpDuSo7UnPWA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.3.tgz",
+      "integrity": "sha512-+fVCIH+OR0SMHn2NEhb/VfbpHuUxcPtqMS34OCV3Ka99LYZUJZqth4M3lT/ppGl52mwIVLNYzR4iLe6mdZ6mYA==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.3.tgz",
+      "integrity": "sha512-tYq5rywR53Qtc+0KI6pPipOvW7a47ETY69VxfqI9BR2RKw2hBbaz0bIw6OaOgEBv2/XNwcWb7a4sr7TqgkqKAA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-ia32": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.3.tgz",
+      "integrity": "sha512-CmQ5OkqnaeLdaF+bMqlYGooBuenqm3LvEN9H8BLhjkpWiFW8hnYMetiqMcJjhrXLvDw601KGqA5sr/Rsg5s45g==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.3.tgz",
+      "integrity": "sha512-SEm65SQknI4pl+mH5Xf231hOkHJyrlgh5nj4qDbiBG6gFeutaNkNIeRgKEg3cflXchCr8iV/q/SyPgjhhzQb7w==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.3.tgz",
+      "integrity": "sha512-4zOr2C/eW89rxb4ozTfn7lBzyyM5ZigA1ZSRTcAR26Qbg/t2UksLdGnVX9/yxga0d6aOi0IvO/7iM2DPPRRotg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-ia32": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.3.tgz",
+      "integrity": "sha512-84Tcld32LB1loiqUvczWyVBQRCChm0wNLlkT59qF29nxh8njFIVf9yaPgXcSyyjpPoD9Tu0wnq3dvVzoMCh9AQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-riscv64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.3.tgz",
+      "integrity": "sha512-IxEqoiD7vdNpiOwccybbV93NljBy64wSTkUOknGy21SyV43C8uqESOwTwW9ywa3KufImKm8L3uQAW/B0KhJMWg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-x64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.3.tgz",
+      "integrity": "sha512-ePeTPXUxPK6JgHcUfnrkIyDtyt+zlAvF22mVZv6y1g/PZFm1lSfX+Za7TYHg9KaYqaaXDiw6zICX4i44HhR8rA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-riscv64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.3.tgz",
+      "integrity": "sha512-NuXQ72dwfNLe35E+RaXJ4Noq4EkFwM65eWwCwxEWyJO9qxOx1EXiCAJii6x8kkOh5daWuMU0VAI1B9RsJaqqQQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-x64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.3.tgz",
+      "integrity": "sha512-t8be9zJ5B82+og9bQmIQ83yMGYZMTMrlGA+uGWtYacmwg6w3093dk91Fx0YzNSZBp3Tk60qVYjCZnEIwy60x0g==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-win32-arm64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.3.tgz",
+      "integrity": "sha512-4ghuAzjX4q8Nksm0aifRz8hgXMMxS0SuymrFfkfJlrSx68pIgvAge6AOw0edoZoe0Tf5ZbsWUWamhkNyNxkTvw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-win32-ia32": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.3.tgz",
+      "integrity": "sha512-tCaK4zIRq9mLRPxLzBAdYlfCuS/xLNpmjunYxeWkIwlJo+k53h1udyXH/FInnQ2GgEz0xMXyvH3buuPgzwWYsw==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-win32-x64": {
+      "version": "1.86.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.3.tgz",
+      "integrity": "sha512-zS+YNKfTF4SnOfpC77VTb0qNZyTXrxnAezSoRV0xnw6HlY+1WawMSSB6PbWtmbvyfXNgpmJUttoTtsvJjRCucg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/scule": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+      "license": "MIT"
+    },
+    "node_modules/semver": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz",
+      "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sirv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
+      "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
+      "dependencies": {
+        "@polka/url": "^1.0.0-next.24",
+        "mrmime": "^2.0.0",
+        "totalist": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/slash": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/slash/-/slash-5.1.0.tgz",
+      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/speakingurl": {
+      "version": "14.0.1",
+      "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
+      "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/std-env": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.8.1.tgz",
+      "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==",
+      "license": "MIT"
+    },
+    "node_modules/strip-final-newline": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+      "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/strip-literal": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.0.0.tgz",
+      "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==",
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^9.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/superjson": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz",
+      "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "copy-anything": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "devOptional": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/sync-child-process": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz",
+      "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
+      "devOptional": true,
+      "dependencies": {
+        "sync-message-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/sync-message-port": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz",
+      "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==",
+      "devOptional": true,
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/tinyexec": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz",
+      "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+      "license": "MIT"
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.12",
+      "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.12.tgz",
+      "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.4.3",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/tinyglobby/node_modules/fdir": {
+      "version": "6.4.3",
+      "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.3.tgz",
+      "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tinyglobby/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/totalist": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+      "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "devOptional": true
+    },
+    "node_modules/typescript": {
+      "version": "5.7.3",
+      "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.7.3.tgz",
+      "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/ufo": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz",
+      "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
+      "license": "MIT"
+    },
+    "node_modules/unconfig": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.3.1.tgz",
+      "integrity": "sha512-LH5WL+un92tGAzWS87k7LkAfwpMdm7V0IXG2FxEjZz/QxiIW5J5LkcrKQThj0aRz6+h/lFmKI9EUXmK/T0bcrw==",
+      "dev": true,
+      "dependencies": {
+        "@quansync/fs": "^0.1.1",
+        "defu": "^6.1.4",
+        "jiti": "^2.4.2",
+        "quansync": "^0.2.8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/unctx": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmmirror.com/unctx/-/unctx-2.4.1.tgz",
+      "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==",
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "estree-walker": "^3.0.3",
+        "magic-string": "^0.30.17",
+        "unplugin": "^2.1.0"
+      }
+    },
+    "node_modules/unctx/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "6.20.0",
+      "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz",
+      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "devOptional": true,
+      "license": "MIT"
+    },
+    "node_modules/unicorn-magic": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+      "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/unimport": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/unimport/-/unimport-4.1.2.tgz",
+      "integrity": "sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==",
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "local-pkg": "^1.0.0",
+        "magic-string": "^0.30.17",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.3",
+        "picomatch": "^4.0.2",
+        "pkg-types": "^1.3.1",
+        "scule": "^1.3.0",
+        "strip-literal": "^3.0.0",
+        "tinyglobby": "^0.2.11",
+        "unplugin": "^2.2.0",
+        "unplugin-utils": "^0.2.4"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      }
+    },
+    "node_modules/unimport/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0"
+      }
+    },
+    "node_modules/unimport/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/unimport/node_modules/pkg-types": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz",
+      "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+      "license": "MIT",
+      "dependencies": {
+        "confbox": "^0.1.8",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.1"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/unocss": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/unocss/-/unocss-66.1.0-beta.10.tgz",
+      "integrity": "sha512-20S2TqwDbjO/DSAphraRpozI4cs29IFR7vIQJwAPk8FiJnW65uN+Pdvf+LMNHJM0Xw+lNQkYX/+O71BEO0eCPg==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/astro": "66.1.0-beta.10",
+        "@unocss/cli": "66.1.0-beta.10",
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/postcss": "66.1.0-beta.10",
+        "@unocss/preset-attributify": "66.1.0-beta.10",
+        "@unocss/preset-icons": "66.1.0-beta.10",
+        "@unocss/preset-mini": "66.1.0-beta.10",
+        "@unocss/preset-tagify": "66.1.0-beta.10",
+        "@unocss/preset-typography": "66.1.0-beta.10",
+        "@unocss/preset-uno": "66.1.0-beta.10",
+        "@unocss/preset-web-fonts": "66.1.0-beta.10",
+        "@unocss/preset-wind": "66.1.0-beta.10",
+        "@unocss/preset-wind3": "66.1.0-beta.10",
+        "@unocss/preset-wind4": "66.1.0-beta.10",
+        "@unocss/transformer-attributify-jsx": "66.1.0-beta.10",
+        "@unocss/transformer-compile-class": "66.1.0-beta.10",
+        "@unocss/transformer-directives": "66.1.0-beta.10",
+        "@unocss/transformer-variant-group": "66.1.0-beta.10",
+        "@unocss/vite": "66.1.0-beta.10"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@unocss/webpack": "66.1.0-beta.10",
+        "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@unocss/webpack": {
+          "optional": true
+        },
+        "vite": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unocss/node_modules/@unocss/core": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.10.tgz",
+      "integrity": "sha512-zYn5kmrmmaEQ81+CkoRcNYaMgUePb85RCIr3oty3yc4tFtJHymHuv+4NKoWWZzfhdfVKeK2y7U9wpLcfcbIiew==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/unocss/node_modules/@unocss/extractor-arbitrary-variants": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.1.0-beta.10.tgz",
+      "integrity": "sha512-qxeScl5guWtlNNUxcOFI12WTLkivao/4vIJW2uJfxuDVlUlBtrB6dw/SL40CVlosZemvM24Boo4U/xjWeh/oCA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/unocss/node_modules/@unocss/preset-wind4": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.1.0-beta.10.tgz",
+      "integrity": "sha512-MsxnYRkbRy3Sji8DUziKCHeqTNHhPyis7nLxZ63NYOS5fpvkfi4Rh69zus304a4/7rxH5BBJZrlLN7DH4IizgQ==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "66.1.0-beta.10",
+        "@unocss/extractor-arbitrary-variants": "66.1.0-beta.10",
+        "@unocss/rule-utils": "66.1.0-beta.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/unocss/node_modules/@unocss/rule-utils": {
+      "version": "66.1.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.10.tgz",
+      "integrity": "sha512-yGC8uQT6ErjLsWMU3Nx7mjvftYukLL+TELM+pmYOFmbhasrdnnJI1kT/04dyUHQTlm3XCs8I7LhbYaVz7MmIXA==",
+      "dev": true,
+      "dependencies": {
+        "@unocss/core": "^66.1.0-beta.10",
+        "magic-string": "^0.30.17"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/unplugin": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.2.0.tgz",
+      "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==",
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "webpack-virtual-modules": "^0.6.2"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      }
+    },
+    "node_modules/unplugin-auto-import": {
+      "version": "19.1.1",
+      "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.1.tgz",
+      "integrity": "sha512-sCGZZrSR1Bc8RfN8Q0RUDxXtC20rdAt7UB4lDyq8MNtKVHiXXh+5af6Nz4JRp9Q+7HjnbgQfQox0TkEymjdUAQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "local-pkg": "^1.0.0",
+        "magic-string": "^0.30.17",
+        "picomatch": "^4.0.2",
+        "unimport": "^4.1.2",
+        "unplugin": "^2.2.0",
+        "unplugin-utils": "^0.2.4"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@nuxt/kit": "^3.2.2",
+        "@vueuse/core": "*"
+      },
+      "peerDependenciesMeta": {
+        "@nuxt/kit": {
+          "optional": true
+        },
+        "@vueuse/core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-auto-import/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/unplugin-icons": {
+      "version": "22.1.0",
+      "resolved": "https://registry.npmmirror.com/unplugin-icons/-/unplugin-icons-22.1.0.tgz",
+      "integrity": "sha512-ect2ZNtk1Zgwb0NVHd0C1IDW/MV+Jk/xaq4t8o6rYdVS3+L660ZdD5kTSQZvsgdwCvquRw+/wYn75hsweRjoIA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@antfu/install-pkg": "^1.0.0",
+        "@iconify/utils": "^2.3.0",
+        "debug": "^4.4.0",
+        "local-pkg": "^1.0.0",
+        "unplugin": "^2.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@svgr/core": ">=7.0.0",
+        "@svgx/core": "^1.0.1",
+        "@vue/compiler-sfc": "^3.0.2 || ^2.7.0",
+        "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0",
+        "vue-template-compiler": "^2.6.12",
+        "vue-template-es2015-compiler": "^1.9.0"
+      },
+      "peerDependenciesMeta": {
+        "@svgr/core": {
+          "optional": true
+        },
+        "@svgx/core": {
+          "optional": true
+        },
+        "@vue/compiler-sfc": {
+          "optional": true
+        },
+        "svelte": {
+          "optional": true
+        },
+        "vue-template-compiler": {
+          "optional": true
+        },
+        "vue-template-es2015-compiler": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-utils": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz",
+      "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==",
+      "license": "MIT",
+      "dependencies": {
+        "pathe": "^2.0.2",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sxzz"
+      }
+    },
+    "node_modules/unplugin-utils/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/unplugin-vue-components": {
+      "version": "28.4.1",
+      "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-28.4.1.tgz",
+      "integrity": "sha512-niGSc0vJD9ueAnsqcfAldmtpkppZ09B6p2G1dL7X5S8KPdgbk1P+txPwaaDCe7N+eZh2VG1aAypLXkuJs3OSUg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "chokidar": "^3.6.0",
+        "debug": "^4.4.0",
+        "local-pkg": "^1.0.0",
+        "magic-string": "^0.30.17",
+        "mlly": "^1.7.4",
+        "tinyglobby": "^0.2.12",
+        "unplugin": "^2.2.0",
+        "unplugin-utils": "^0.2.4"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@babel/parser": "^7.15.8",
+        "@nuxt/kit": "^3.2.2",
+        "vue": "2 || 3"
+      },
+      "peerDependenciesMeta": {
+        "@babel/parser": {
+          "optional": true
+        },
+        "@nuxt/kit": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-vue-components/node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/unplugin-vue-components/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/untyped": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/untyped/-/untyped-2.0.0.tgz",
+      "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==",
+      "license": "MIT",
+      "dependencies": {
+        "citty": "^0.1.6",
+        "defu": "^6.1.4",
+        "jiti": "^2.4.2",
+        "knitwork": "^1.2.0",
+        "scule": "^1.3.0"
+      },
+      "bin": {
+        "untyped": "dist/cli.mjs"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/varint": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+      "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
+      "devOptional": true
+    },
+    "node_modules/vite": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmmirror.com/vite/-/vite-6.2.1.tgz",
+      "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==",
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.25.0",
+        "postcss": "^8.5.3",
+        "rollup": "^4.30.1"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "jiti": ">=1.21.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.16.0",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-hot-client": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz",
+      "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-inspect": {
+      "version": "0.8.9",
+      "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz",
+      "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==",
+      "dependencies": {
+        "@antfu/utils": "^0.7.10",
+        "@rollup/pluginutils": "^5.1.3",
+        "debug": "^4.3.7",
+        "error-stack-parser-es": "^0.1.5",
+        "fs-extra": "^11.2.0",
+        "open": "^10.1.0",
+        "perfect-debounce": "^1.0.0",
+        "picocolors": "^1.1.1",
+        "sirv": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1"
+      },
+      "peerDependenciesMeta": {
+        "@nuxt/kit": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-inspect/node_modules/@antfu/utils": {
+      "version": "0.7.10",
+      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz",
+      "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/vite-plugin-vue-devtools": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.2.tgz",
+      "integrity": "sha512-5V0UijQWiSBj32blkyPEqIbzc6HO9c1bwnBhx+ay2dzU0FakH+qMdNUT8nF9BvDE+i6I1U8CqCuJiO20vKEdQw==",
+      "dependencies": {
+        "@vue/devtools-core": "^7.7.2",
+        "@vue/devtools-kit": "^7.7.2",
+        "@vue/devtools-shared": "^7.7.2",
+        "execa": "^9.5.1",
+        "sirv": "^3.0.0",
+        "vite-plugin-inspect": "0.8.9",
+        "vite-plugin-vue-inspector": "^5.3.1"
+      },
+      "engines": {
+        "node": ">=v14.21.3"
+      },
+      "peerDependencies": {
+        "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-vue-inspector": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz",
+      "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==",
+      "dependencies": {
+        "@babel/core": "^7.23.0",
+        "@babel/plugin-proposal-decorators": "^7.23.0",
+        "@babel/plugin-syntax-import-attributes": "^7.22.5",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-transform-typescript": "^7.22.15",
+        "@vue/babel-plugin-jsx": "^1.1.5",
+        "@vue/compiler-dom": "^3.3.4",
+        "kolorist": "^1.8.0",
+        "magic-string": "^0.30.4"
+      },
+      "peerDependencies": {
+        "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+      }
+    },
+    "node_modules/vscode-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz",
+      "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vue": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+      "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-sfc": "3.5.13",
+        "@vue/runtime-dom": "3.5.13",
+        "@vue/server-renderer": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-flow-layout": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/vue-flow-layout/-/vue-flow-layout-0.1.1.tgz",
+      "integrity": "sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==",
+      "dev": true,
+      "peerDependencies": {
+        "vue": "^3.4.37"
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.0.tgz",
+      "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/vue-router/node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
+    "node_modules/vue-tsc": {
+      "version": "2.2.8",
+      "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.8.tgz",
+      "integrity": "sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/typescript": "~2.4.11",
+        "@vue/language-core": "2.2.8"
+      },
+      "bin": {
+        "vue-tsc": "bin/vue-tsc.js"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.0"
+      }
+    },
+    "node_modules/webpack-virtual-modules": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+      "license": "MIT"
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+    },
+    "node_modules/yoctocolors": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz",
+      "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/zrender": {
+      "version": "5.6.1",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz",
+      "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
+      "dependencies": {
+        "tslib": "2.3.0"
+      }
+    },
+    "node_modules/zrender/node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    }
+  }
+}

+ 41 - 0
package.json

@@ -0,0 +1,41 @@
+{
+  "name": "ai-web",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "@element-plus/icons-vue": "^2.3.1",
+    "axios": "^1.6.5",
+    "echarts": "^5.6.0",
+    "element-plus": "^2.9.6",
+    "highlight.js": "^11.11.1",
+    "marked": "^15.0.7",
+    "normalize.css": "^8.0.1",
+    "pinia": "^3.0.1",
+    "pinia-plugin-persistedstate": "^4.2.0",
+    "vite-plugin-vue-devtools": "^7.7.2",
+    "vue": "^3.5.13",
+    "vue-router": "^4.5.0"
+  },
+  "devDependencies": {
+    "@iconify-json/ep": "^1.2.2",
+    "@types/node": "^22.13.10",
+    "@types/vue": "^1.0.31",
+    "@unocss/preset-wind4": "66.1.0-beta.8",
+    "@vitejs/plugin-vue": "^5.2.1",
+    "@vue/tsconfig": "^0.7.0",
+    "sass-embedded": "^1.85.1",
+    "typescript": "~5.7.2",
+    "unocss": "^66.1.0-beta.8",
+    "unplugin-auto-import": "^19.1.1",
+    "unplugin-icons": "^22.1.0",
+    "unplugin-vue-components": "^28.4.1",
+    "vite": "^6.2.0",
+    "vue-tsc": "^2.2.4"
+  }
+}

+ 3787 - 0
pnpm-lock.yaml

@@ -0,0 +1,3787 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      '@element-plus/icons-vue':
+        specifier: ^2.3.1
+        version: 2.3.1(vue@3.5.13(typescript@5.7.3))
+      axios:
+        specifier: ^1.6.5
+        version: 1.8.2
+      element-plus:
+        specifier: ^2.9.6
+        version: 2.9.6(vue@3.5.13(typescript@5.7.3))
+      highlight.js:
+        specifier: ^11.11.1
+        version: 11.11.1
+      marked:
+        specifier: ^15.0.7
+        version: 15.0.7
+      normalize.css:
+        specifier: ^8.0.1
+        version: 8.0.1
+      pinia:
+        specifier: ^3.0.1
+        version: 3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
+      pinia-plugin-persistedstate:
+        specifier: ^4.2.0
+        version: 4.2.0(pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))
+      vite-plugin-vue-devtools:
+        specifier: ^7.7.2
+        version: 7.7.2(@nuxt/kit@3.16.0)(rollup@4.35.0)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))
+      vue:
+        specifier: ^3.5.13
+        version: 3.5.13(typescript@5.7.3)
+      vue-router:
+        specifier: ^4.5.0
+        version: 4.5.0(vue@3.5.13(typescript@5.7.3))
+    devDependencies:
+      '@iconify-json/ep':
+        specifier: ^1.2.2
+        version: 1.2.2
+      '@types/node':
+        specifier: ^22.13.10
+        version: 22.13.10
+      '@types/vue':
+        specifier: ^1.0.31
+        version: 1.0.31
+      '@unocss/preset-wind4':
+        specifier: 66.1.0-beta.8
+        version: 66.1.0-beta.8
+      '@vitejs/plugin-vue':
+        specifier: ^5.2.1
+        version: 5.2.1(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))
+      '@vue/tsconfig':
+        specifier: ^0.7.0
+        version: 0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
+      sass-embedded:
+        specifier: ^1.85.1
+        version: 1.85.1
+      typescript:
+        specifier: ~5.7.2
+        version: 5.7.3
+      unocss:
+        specifier: ^66.1.0-beta.8
+        version: 66.1.0-beta.8(postcss@8.5.3)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))
+      unplugin-auto-import:
+        specifier: ^19.1.1
+        version: 19.1.1(@nuxt/kit@3.16.0)(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3)))
+      unplugin-icons:
+        specifier: ^22.1.0
+        version: 22.1.0(@vue/compiler-sfc@3.5.13)
+      unplugin-vue-components:
+        specifier: ^28.4.1
+        version: 28.4.1(@babel/parser@7.26.10)(@nuxt/kit@3.16.0)(vue@3.5.13(typescript@5.7.3))
+      vite:
+        specifier: ^6.2.0
+        version: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+      vue-tsc:
+        specifier: ^2.2.4
+        version: 2.2.8(typescript@5.7.3)
+
+packages:
+
+  '@ampproject/remapping@2.3.0':
+    resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+    engines: {node: '>=6.0.0'}
+
+  '@antfu/install-pkg@1.0.0':
+    resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==}
+
+  '@antfu/utils@0.7.10':
+    resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
+  '@antfu/utils@8.1.1':
+    resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
+
+  '@babel/code-frame@7.26.2':
+    resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/compat-data@7.26.8':
+    resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/core@7.26.10':
+    resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/generator@7.26.10':
+    resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-annotate-as-pure@7.25.9':
+    resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-compilation-targets@7.26.5':
+    resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-create-class-features-plugin@7.26.9':
+    resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-member-expression-to-functions@7.25.9':
+    resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-imports@7.25.9':
+    resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-transforms@7.26.0':
+    resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-optimise-call-expression@7.25.9':
+    resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-plugin-utils@7.26.5':
+    resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-replace-supers@7.26.5':
+    resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+    resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-string-parser@7.25.9':
+    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-identifier@7.25.9':
+    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-option@7.25.9':
+    resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helpers@7.26.10':
+    resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/parser@7.26.10':
+    resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/plugin-proposal-decorators@7.25.9':
+    resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-decorators@7.25.9':
+    resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-import-attributes@7.26.0':
+    resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-import-meta@7.10.4':
+    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-jsx@7.25.9':
+    resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-typescript@7.25.9':
+    resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typescript@7.26.8':
+    resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/template@7.26.9':
+    resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/traverse@7.26.10':
+    resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/types@7.26.10':
+    resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@bufbuild/protobuf@2.2.3':
+    resolution: {integrity: sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==}
+
+  '@ctrl/tinycolor@3.6.1':
+    resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+    engines: {node: '>=10'}
+
+  '@element-plus/icons-vue@2.3.1':
+    resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  '@esbuild/aix-ppc64@0.25.1':
+    resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
+  '@esbuild/android-arm64@0.25.1':
+    resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm@0.25.1':
+    resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-x64@0.25.1':
+    resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/darwin-arm64@0.25.1':
+    resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.25.1':
+    resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/freebsd-arm64@0.25.1':
+    resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.25.1':
+    resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/linux-arm64@0.25.1':
+    resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.25.1':
+    resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.25.1':
+    resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.25.1':
+    resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.25.1':
+    resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.25.1':
+    resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.25.1':
+    resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.25.1':
+    resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.25.1':
+    resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-arm64@0.25.1':
+    resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.25.1':
+    resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-arm64@0.25.1':
+    resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.25.1':
+    resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/sunos-x64@0.25.1':
+    resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/win32-arm64@0.25.1':
+    resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.25.1':
+    resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.25.1':
+    resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
+  '@floating-ui/core@1.6.9':
+    resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+
+  '@floating-ui/dom@1.6.13':
+    resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
+
+  '@floating-ui/utils@0.2.9':
+    resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+  '@iconify-json/ep@1.2.2':
+    resolution: {integrity: sha512-/IH1GjQKH5uK7lQAOjwPxdjkU98OWUWnHYCdg/EkeebBKEteotaOMeEz5pR1egqMcI7zPFdFBTcGyCHla1ddQw==}
+
+  '@iconify/types@2.0.0':
+    resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+  '@iconify/utils@2.3.0':
+    resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
+
+  '@jridgewell/gen-mapping@0.3.8':
+    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/resolve-uri@3.1.2':
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/set-array@1.2.1':
+    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/sourcemap-codec@1.5.0':
+    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+  '@jridgewell/trace-mapping@0.3.25':
+    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
+  '@nuxt/kit@3.16.0':
+    resolution: {integrity: sha512-yPfhk58BG6wJhELkGOTCOlkMDbZkizk3IaINcyTKm+hBKiK3SheLt7S9HStNL+qZSfH2Cf7A8sYp6M72lOIEtA==}
+    engines: {node: '>=18.12.0'}
+
+  '@polka/url@1.0.0-next.28':
+    resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+
+  '@quansync/fs@0.1.2':
+    resolution: {integrity: sha512-ezIadUb1aFhwJLd++WVqVpi9rnlX8vnd4ju7saPhwLHJN1mJgOv0puePTGV+FbtSnWtwoHDT8lAm4kagDZmpCg==}
+    engines: {node: '>=20.0.0'}
+
+  '@rollup/pluginutils@5.1.4':
+    resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/rollup-android-arm-eabi@4.35.0':
+    resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/rollup-android-arm64@4.35.0':
+    resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/rollup-darwin-arm64@4.35.0':
+    resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/rollup-darwin-x64@4.35.0':
+    resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/rollup-freebsd-arm64@4.35.0':
+    resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/rollup-freebsd-x64@4.35.0':
+    resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.35.0':
+    resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-arm-musleabihf@4.35.0':
+    resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-arm64-gnu@4.35.0':
+    resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-arm64-musl@4.35.0':
+    resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-loongarch64-gnu@4.35.0':
+    resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==}
+    cpu: [loong64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.35.0':
+    resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-riscv64-gnu@4.35.0':
+    resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-s390x-gnu@4.35.0':
+    resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-x64-gnu@4.35.0':
+    resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-x64-musl@4.35.0':
+    resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-win32-arm64-msvc@4.35.0':
+    resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/rollup-win32-ia32-msvc@4.35.0':
+    resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-msvc@4.35.0':
+    resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==}
+    cpu: [x64]
+    os: [win32]
+
+  '@sec-ant/readable-stream@0.4.1':
+    resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
+
+  '@sindresorhus/merge-streams@2.3.0':
+    resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
+    engines: {node: '>=18'}
+
+  '@sindresorhus/merge-streams@4.0.0':
+    resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+    engines: {node: '>=18'}
+
+  '@sxzz/popperjs-es@2.11.7':
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+
+  '@types/estree@1.0.6':
+    resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+  '@types/lodash-es@4.17.12':
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+  '@types/lodash@4.17.16':
+    resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
+
+  '@types/node@22.13.10':
+    resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==}
+
+  '@types/vue@1.0.31':
+    resolution: {integrity: sha512-unhlPKHFYEc+NA7nBz8yYSg7MOhWFJF2M/tzjb0rgVuK4pQzUBGmBp3IhfuhYDo3wr3dgA5sm9GUHmUJz2Hb9w==}
+
+  '@types/web-bluetooth@0.0.16':
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
+  '@unocss/astro@66.1.0-beta.8':
+    resolution: {integrity: sha512-DduCTg44Dk9Mn2Soa4nzgiawWMlk/SZY+p850ChvyUZNugYoKZL0eqJZdhfeOhlKSSYIoC8YAUvLBeVEqjLRXw==}
+    peerDependencies:
+      vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+    peerDependenciesMeta:
+      vite:
+        optional: true
+
+  '@unocss/cli@66.1.0-beta.8':
+    resolution: {integrity: sha512-fBOxxlzb3LZMwVJKPQgNWVqIiKjf2SgJoS9yh8ai46nQCCNg6I2ubPr+Lap7kQzusy0f8qMdY1hf3ur0uq+kAQ==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  '@unocss/config@66.1.0-beta.8':
+    resolution: {integrity: sha512-o4Lhbpvho/kqt0NmpniQ9siOElDDClqXVIMaaQxWdGR8C7SjDjl/KkaG4EAMEvpfmW7z6an4pgGLOtkCUUwVhw==}
+    engines: {node: '>=14'}
+
+  '@unocss/core@66.1.0-beta.8':
+    resolution: {integrity: sha512-j56/9COPQ09+g0EittHtAmddRU4X0HgQ+Fz5hK+I894boljGNG6kI1vj5Gi0C/tllddrH/CbTdJ1K6RumSAK8w==}
+
+  '@unocss/extractor-arbitrary-variants@66.1.0-beta.8':
+    resolution: {integrity: sha512-h9cXkuK2bsEGoYGHl22iavRM8x2yp5Be0OiEFly1kkH9MPGx5cAGchsP18ij8BQJRaW4d6JXm99pHr6ILnteGw==}
+
+  '@unocss/inspector@66.1.0-beta.8':
+    resolution: {integrity: sha512-/ggP2MJERiXH4B6OfZe3gJWybrmYJu81+ooyveuqn6rle4l1mQNbFIdjxBYRAk4Z/v0JfJHPQiNCtDVRw+nwJQ==}
+
+  '@unocss/postcss@66.1.0-beta.8':
+    resolution: {integrity: sha512-zgBGVjULAVnV5G9nLwc/fAuGvKjAgSzRiaXktCW9qaLDVMrr9HJ3oQpFXyYEYcyKNQInQy1OoMQ0S7OHOlPYbg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      postcss: ^8.4.21
+
+  '@unocss/preset-attributify@66.1.0-beta.8':
+    resolution: {integrity: sha512-Lz82t+KOpp9MMF+G5rPVSP1gwxZaO+yQTdpsgA6PbdD77K1lWA2a7KPnxv7/Co5FO0aTG4ArrX0nhNG24nU93w==}
+
+  '@unocss/preset-icons@66.1.0-beta.8':
+    resolution: {integrity: sha512-5rnu8/DoVG4NEfIeEHHBNdxKiMS8SazKJczIZoxKatqoJ6Woexv2xCyqW6dLCTkhHAi6g9GrbjNMVDX3U9Fxfw==}
+
+  '@unocss/preset-mini@66.1.0-beta.8':
+    resolution: {integrity: sha512-xIk2OOweFi3TljlklHOKmMo3xQo8EFxUHWKbDVTbhyBwaJ/chXWqM4azkdW/zgo+mZaeD30ZvQh8/1TUlXYnSg==}
+
+  '@unocss/preset-tagify@66.1.0-beta.8':
+    resolution: {integrity: sha512-Ahr4Cv/kf73TFa4IZmCWq5dggWCeZ4VgZ2nLnVuO3894U+jt2nNb9Lb3hqFZNJeSbWYr2Kwz0hHkK986KL+Nzw==}
+
+  '@unocss/preset-typography@66.1.0-beta.8':
+    resolution: {integrity: sha512-PLgRtN4owWdxFchM6UYvUhcWXJ7Nj3pDpyobtkTfddb2HtIDClQpkrSWIh8kmCjjFiMrJPjNTPQka+gJL0UABQ==}
+
+  '@unocss/preset-uno@66.1.0-beta.8':
+    resolution: {integrity: sha512-3XavbUmH7wC1/21fQSevy09sqQwzS5MYai3l8UtvImSfLVW3ZZjqLU25lNlxvixR/Gaq42nG2lMsaYFh/bdaGw==}
+
+  '@unocss/preset-web-fonts@66.1.0-beta.8':
+    resolution: {integrity: sha512-sDeDaQeMPSVm7YbiNuOoboJKLszqPCwXaJwfQasqlAoBOL527Cp0iVTivImhcHsd4uXBRG5pxqB+d9pKqYAJeA==}
+
+  '@unocss/preset-wind3@66.1.0-beta.8':
+    resolution: {integrity: sha512-5Ssx/yT4Crg3S5TsK2ATKLM5zSfT7KQRhE8t2U23ifnLIH1EC4BvE13GdcC/Z4b0KFxwjVxRwZOVVal3a4f0ZA==}
+
+  '@unocss/preset-wind4@66.1.0-beta.8':
+    resolution: {integrity: sha512-EWLC226yzh8nZAVm696K7voKth9/WJE6KiVtmwY1KYzthtU6JPEtaQaseIO3p97uJzTCUon9zVp8URA6jM6XEA==}
+
+  '@unocss/preset-wind@66.1.0-beta.8':
+    resolution: {integrity: sha512-vTbedyKiwEsM6PzW8ixj0YyrDQ7CEnb7AcFl7k/osb12I9MV69+XZFyvg1JehExWLFSXUoBGlLeL1bJETekHFw==}
+
+  '@unocss/reset@66.1.0-beta.8':
+    resolution: {integrity: sha512-2HBIV3UXr18p6nXVhKEgQDGbHWlh7+Qp2n5Oq6jpqy+ke2rBhlwSn0qvsECfiuzogOzEy6nldTsNwQw8rJjjAA==}
+
+  '@unocss/rule-utils@66.1.0-beta.8':
+    resolution: {integrity: sha512-NamsfYZKEiDFNyiHwlllz21nvDoI25oVCc4ihHUh0OkQohVgPshp8Amx3WNogDllQf3VqRC9l7pWO6kjLjRvIw==}
+    engines: {node: '>=14'}
+
+  '@unocss/transformer-attributify-jsx@66.1.0-beta.8':
+    resolution: {integrity: sha512-hEkHXYLbXs7Wr+R4Uc/Hci+cPRIVZNsfs1ysAuFx7bl4LSnogiz4vN0qGhEE3+0ngcrUNaHy63RzhkbBZLZsUQ==}
+
+  '@unocss/transformer-compile-class@66.1.0-beta.8':
+    resolution: {integrity: sha512-89J/idQXI0X/6tofNjgd8NJD+LPk84ERH/PCqpkP5/rujvYd84jTnLZRicxhJzTJiKOwofFxo7IU+ndw/m/AlQ==}
+
+  '@unocss/transformer-directives@66.1.0-beta.8':
+    resolution: {integrity: sha512-XOQq16DniCbDzbtWgnOZrhaqya6Md1zW0qN1a0Hf+fzsnO9KiAJWW2KoQet+kVIg/myS7zwDf5MC8M2N3i2aig==}
+
+  '@unocss/transformer-variant-group@66.1.0-beta.8':
+    resolution: {integrity: sha512-8ZyCBY1iY3x+/nHeGnsEySYmsg9fc7thFKweOB2yrcQbQz53a+ule0NTPP8Y8x1+NSbzH1Mf66zn7emg0+Apcg==}
+
+  '@unocss/vite@66.1.0-beta.8':
+    resolution: {integrity: sha512-GIN9knnrRrnluIh2VJiNLZtW0lJeFRgf/RNOFjQbuAKZAPBLN6qyu6MWOdxAKX4vUL4iJOiEPzMjpxwSlF4wRA==}
+    peerDependencies:
+      vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+
+  '@vitejs/plugin-vue@5.2.1':
+    resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    peerDependencies:
+      vite: ^5.0.0 || ^6.0.0
+      vue: ^3.2.25
+
+  '@volar/language-core@2.4.12':
+    resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==}
+
+  '@volar/source-map@2.4.12':
+    resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==}
+
+  '@volar/typescript@2.4.12':
+    resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==}
+
+  '@vue/babel-helper-vue-transform-on@1.4.0':
+    resolution: {integrity: sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==}
+
+  '@vue/babel-plugin-jsx@1.4.0':
+    resolution: {integrity: sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+
+  '@vue/babel-plugin-resolve-type@1.4.0':
+    resolution: {integrity: sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@vue/compiler-core@3.5.13':
+    resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
+
+  '@vue/compiler-dom@3.5.13':
+    resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+
+  '@vue/compiler-sfc@3.5.13':
+    resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
+
+  '@vue/compiler-ssr@3.5.13':
+    resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
+
+  '@vue/compiler-vue2@2.7.16':
+    resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+  '@vue/devtools-api@6.6.4':
+    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+  '@vue/devtools-api@7.7.2':
+    resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==}
+
+  '@vue/devtools-core@7.7.2':
+    resolution: {integrity: sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==}
+    peerDependencies:
+      vue: ^3.0.0
+
+  '@vue/devtools-kit@7.7.2':
+    resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==}
+
+  '@vue/devtools-shared@7.7.2':
+    resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==}
+
+  '@vue/language-core@2.2.8':
+    resolution: {integrity: sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@vue/reactivity@3.5.13':
+    resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
+
+  '@vue/runtime-core@3.5.13':
+    resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
+
+  '@vue/runtime-dom@3.5.13':
+    resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
+
+  '@vue/server-renderer@3.5.13':
+    resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
+    peerDependencies:
+      vue: 3.5.13
+
+  '@vue/shared@3.5.13':
+    resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+  '@vue/tsconfig@0.7.0':
+    resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==}
+    peerDependencies:
+      typescript: 5.x
+      vue: ^3.4.0
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+      vue:
+        optional: true
+
+  '@vueuse/core@9.13.0':
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+
+  '@vueuse/metadata@9.13.0':
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+
+  '@vueuse/shared@9.13.0':
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+
+  acorn@8.14.1:
+    resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  alien-signals@1.0.4:
+    resolution: {integrity: sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==}
+
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+  asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  axios@1.8.2:
+    resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==}
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  birpc@0.2.19:
+    resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==}
+
+  brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  browserslist@4.24.4:
+    resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  buffer-builder@0.2.0:
+    resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==}
+
+  bundle-name@4.1.0:
+    resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+    engines: {node: '>=18'}
+
+  c12@3.0.2:
+    resolution: {integrity: sha512-6Tzk1/TNeI3WBPpK0j/Ss4+gPj3PUJYbWl/MWDJBThFvwNGNkXtd7Cz8BJtD4aRwoGHtzQD0SnxamgUiBH0/Nw==}
+    peerDependencies:
+      magicast: ^0.3.5
+    peerDependenciesMeta:
+      magicast:
+        optional: true
+
+  cac@6.7.14:
+    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+    engines: {node: '>=8'}
+
+  call-bind-apply-helpers@1.0.2:
+    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+    engines: {node: '>= 0.4'}
+
+  caniuse-lite@1.0.30001703:
+    resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==}
+
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
+  chokidar@4.0.3:
+    resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+    engines: {node: '>= 14.16.0'}
+
+  citty@0.1.6:
+    resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+
+  colorette@2.0.20:
+    resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+  colorjs.io@0.5.2:
+    resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
+
+  combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  confbox@0.2.1:
+    resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==}
+
+  consola@3.4.0:
+    resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==}
+    engines: {node: ^14.18.0 || >=16.10.0}
+
+  consola@3.4.2:
+    resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+    engines: {node: ^14.18.0 || >=16.10.0}
+
+  convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+  copy-anything@3.0.5:
+    resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+    engines: {node: '>=12.13'}
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  css-tree@3.1.0:
+    resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+  csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+  de-indent@1.0.2:
+    resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
+  debug@4.4.0:
+    resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  deep-pick-omit@1.2.1:
+    resolution: {integrity: sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==}
+
+  default-browser-id@5.0.0:
+    resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
+    engines: {node: '>=18'}
+
+  default-browser@5.2.1:
+    resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
+    engines: {node: '>=18'}
+
+  define-lazy-prop@3.0.0:
+    resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+    engines: {node: '>=12'}
+
+  defu@6.1.4:
+    resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+  delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  destr@2.0.3:
+    resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
+
+  dotenv@16.4.7:
+    resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
+    engines: {node: '>=12'}
+
+  dunder-proto@1.0.1:
+    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+    engines: {node: '>= 0.4'}
+
+  duplexer@0.1.2:
+    resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+
+  electron-to-chromium@1.5.114:
+    resolution: {integrity: sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA==}
+
+  element-plus@2.9.6:
+    resolution: {integrity: sha512-D9zU28Ce0s/9O/Vp3ewemikxzFVA6gdZyMwmWijHijo+t5/9H3sHRTIm1WlfeNpFW2Yq0y8nHXD0fU5YxU6qlQ==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  error-stack-parser-es@0.1.5:
+    resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==}
+
+  errx@0.1.0:
+    resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==}
+
+  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.25.1:
+    resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  escalade@3.2.0:
+    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+    engines: {node: '>=6'}
+
+  escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+  execa@9.5.2:
+    resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==}
+    engines: {node: ^18.19.0 || >=20.5.0}
+
+  exsolve@1.0.4:
+    resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fastq@1.19.1:
+    resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+  fdir@6.4.3:
+    resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
+  figures@6.1.0:
+    resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
+    engines: {node: '>=18'}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  follow-redirects@1.15.9:
+    resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
+  form-data@4.0.2:
+    resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
+    engines: {node: '>= 6'}
+
+  fs-extra@11.3.0:
+    resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==}
+    engines: {node: '>=14.14'}
+
+  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-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'}
+
+  get-stream@9.0.1:
+    resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
+    engines: {node: '>=18'}
+
+  giget@2.0.0:
+    resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
+    hasBin: true
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  globals@11.12.0:
+    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+    engines: {node: '>=4'}
+
+  globals@15.15.0:
+    resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+    engines: {node: '>=18'}
+
+  globby@14.1.0:
+    resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==}
+    engines: {node: '>=18'}
+
+  gopd@1.2.0:
+    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+    engines: {node: '>= 0.4'}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  gzip-size@6.0.0:
+    resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
+    engines: {node: '>=10'}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-symbols@1.1.0:
+    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+    engines: {node: '>= 0.4'}
+
+  has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+
+  highlight.js@11.11.1:
+    resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
+    engines: {node: '>=12.0.0'}
+
+  hookable@5.5.3:
+    resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+  human-signals@8.0.0:
+    resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==}
+    engines: {node: '>=18.18.0'}
+
+  ignore@7.0.3:
+    resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==}
+    engines: {node: '>= 4'}
+
+  immutable@5.0.3:
+    resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==}
+
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  is-docker@3.0.0:
+    resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    hasBin: true
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-inside-container@1.0.0:
+    resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+    engines: {node: '>=14.16'}
+    hasBin: true
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-plain-obj@4.1.0:
+    resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+    engines: {node: '>=12'}
+
+  is-stream@4.0.1:
+    resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
+    engines: {node: '>=18'}
+
+  is-unicode-supported@2.1.0:
+    resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+    engines: {node: '>=18'}
+
+  is-what@4.1.16:
+    resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+    engines: {node: '>=12.13'}
+
+  is-wsl@3.1.0:
+    resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
+    engines: {node: '>=16'}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  jiti@2.4.2:
+    resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+    hasBin: true
+
+  js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  js-tokens@9.0.1:
+    resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+  jsesc@3.1.0:
+    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+  klona@2.0.6:
+    resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
+    engines: {node: '>= 8'}
+
+  knitwork@1.2.0:
+    resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==}
+
+  kolorist@1.8.0:
+    resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+  local-pkg@1.1.1:
+    resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
+    engines: {node: '>=14'}
+
+  lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+  lodash-unified@1.0.3:
+    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+    peerDependencies:
+      '@types/lodash-es': '*'
+      lodash: '*'
+      lodash-es: '*'
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+  magic-string@0.30.17:
+    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+  marked@15.0.7:
+    resolution: {integrity: sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==}
+    engines: {node: '>= 18'}
+    hasBin: true
+
+  math-intrinsics@1.1.0:
+    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+    engines: {node: '>= 0.4'}
+
+  mdn-data@2.12.2:
+    resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
+
+  memoize-one@6.0.0:
+    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
+  mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  minimatch@9.0.5:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  mitt@3.0.1:
+    resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+  mlly@1.7.4:
+    resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
+
+  mrmime@2.0.1:
+    resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+    engines: {node: '>=10'}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  muggle-string@0.4.1:
+    resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+  nanoid@3.3.9:
+    resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  nanoid@5.1.5:
+    resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==}
+    engines: {node: ^18 || >=20}
+    hasBin: true
+
+  node-fetch-native@1.6.6:
+    resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==}
+
+  node-releases@2.0.19:
+    resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  normalize-wheel-es@1.2.0:
+    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
+  normalize.css@8.0.1:
+    resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==}
+
+  npm-run-path@6.0.0:
+    resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
+    engines: {node: '>=18'}
+
+  nypm@0.6.0:
+    resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==}
+    engines: {node: ^14.16.0 || >=16.10.0}
+    hasBin: true
+
+  ofetch@1.4.1:
+    resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==}
+
+  ohash@2.0.11:
+    resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
+  open@10.1.0:
+    resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
+    engines: {node: '>=18'}
+
+  package-manager-detector@0.2.11:
+    resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
+
+  parse-ms@4.0.0:
+    resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
+    engines: {node: '>=18'}
+
+  path-browserify@1.0.1:
+    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-key@4.0.0:
+    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+    engines: {node: '>=12'}
+
+  path-type@6.0.0:
+    resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
+    engines: {node: '>=18'}
+
+  pathe@2.0.3:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+  perfect-debounce@1.0.0:
+    resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  picomatch@4.0.2:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
+  pinia-plugin-persistedstate@4.2.0:
+    resolution: {integrity: sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==}
+    peerDependencies:
+      '@pinia/nuxt': '>=0.9.0'
+      pinia: '>=2.3.0'
+    peerDependenciesMeta:
+      '@pinia/nuxt':
+        optional: true
+      pinia:
+        optional: true
+
+  pinia@3.0.1:
+    resolution: {integrity: sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==}
+    peerDependencies:
+      typescript: '>=4.4.4'
+      vue: ^2.7.0 || ^3.5.11
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  pkg-types@1.3.1:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+  pkg-types@2.1.0:
+    resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
+
+  postcss@8.5.3:
+    resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  pretty-ms@9.2.0:
+    resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
+    engines: {node: '>=18'}
+
+  proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+  quansync@0.2.10:
+    resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
+
+  quansync@0.2.8:
+    resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  rc9@2.1.2:
+    resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  readdirp@4.1.2:
+    resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+    engines: {node: '>= 14.18.0'}
+
+  reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  rfdc@1.4.1:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+  rollup@4.35.0:
+    resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  run-applescript@7.0.0:
+    resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
+    engines: {node: '>=18'}
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  rxjs@7.8.2:
+    resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+
+  sass-embedded-android-arm64@1.85.1:
+    resolution: {integrity: sha512-27oRheqNA3SJM2hAxpVbs7mCKUwKPWmEEhyiNFpBINb5ELVLg+Ck5RsGg+SJmo130ul5YX0vinmVB5uPWc8X5w==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  sass-embedded-android-arm@1.85.1:
+    resolution: {integrity: sha512-GkcgUGMZtEF9gheuE1dxCU0ZSAifuaFXi/aX7ZXvjtdwmTl9Zc/OHR9oiUJkc8IW9UI7H8TuwlTAA8+SwgwIeQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [android]
+
+  sass-embedded-android-ia32@1.85.1:
+    resolution: {integrity: sha512-f3x16NyRgtXFksIaO/xXKrUhttUBv8V0XsAR2Dhdb/yz4yrDrhzw9Wh8fmw7PlQqECcQvFaoDr3XIIM6lKzasw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [ia32]
+    os: [android]
+
+  sass-embedded-android-riscv64@1.85.1:
+    resolution: {integrity: sha512-IP6OijpJ8Mqo7XqCe0LsuZVbAxEFVboa0kXqqR5K55LebEplsTIA2GnmRyMay3Yr/2FVGsZbCb6Wlgkw23eCiA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [android]
+
+  sass-embedded-android-x64@1.85.1:
+    resolution: {integrity: sha512-Mh7CA53wR3ADvXAYipFc/R3vV4PVOzoKwWzPxmq+7i8UZrtsVjKONxGtqWe9JG1mna0C9CRZAx0sv/BzbOJxWg==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [android]
+
+  sass-embedded-darwin-arm64@1.85.1:
+    resolution: {integrity: sha512-msWxzhvcP9hqGVegxVePVEfv9mVNTlUgGr6k7O7Ihji702mbtrH/lKwF4aRkkt4g1j7tv10+JtQXmTNi/pi9kA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  sass-embedded-darwin-x64@1.85.1:
+    resolution: {integrity: sha512-J4UFHUiyI9Z+mwYMwz11Ky9TYr3hY1fCxeQddjNGL/+ovldtb0yAIHvoVM0BGprQDm5JqhtUk8KyJ3RMJqpaAA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  sass-embedded-linux-arm64@1.85.1:
+    resolution: {integrity: sha512-jGadetB03BMFG2rq3OXub/uvC/lGpbQOiLGEz3NLb2nRZWyauRhzDtvZqkr6BEhxgIWtMtz2020yD8ZJSw/r2w==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  sass-embedded-linux-arm@1.85.1:
+    resolution: {integrity: sha512-X0fDh95nNSw1wfRlnkE4oscoEA5Au4nnk785s9jghPFkTBg+A+5uB6trCjf0fM22+Iw6kiP4YYmDdw3BqxAKLQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  sass-embedded-linux-ia32@1.85.1:
+    resolution: {integrity: sha512-7HlYY90d9mitDtNi5s+S+5wYZrTVbkBH2/kf7ixrzh2BFfT0YM81UHLJRnGX93y9aOMBL6DSZAIfkt1RsV9bkQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [ia32]
+    os: [linux]
+
+  sass-embedded-linux-musl-arm64@1.85.1:
+    resolution: {integrity: sha512-FLkIT0p18XOkR6wryJ13LqGBDsrYev2dRk9dtiU18NCpNXruKsdBQ1ZnWHVKB3h1dA9lFyEEisC0sooKdNfeOQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  sass-embedded-linux-musl-arm@1.85.1:
+    resolution: {integrity: sha512-5vcdEqE8QZnu6i6shZo7x2N36V7YUoFotWj2rGekII5ty7Nkaj+VtZhUEOp9tAzEOlaFuDp5CyO1kUCvweT64A==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  sass-embedded-linux-musl-ia32@1.85.1:
+    resolution: {integrity: sha512-N1093T84zQJor1yyIAdYScB5eAuQarGK1tKgZ4uTnxVlgA7Xi1lXV8Eh7ox9sDqKCaWkVQ3MjqU26vYRBeRWyw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [ia32]
+    os: [linux]
+
+  sass-embedded-linux-musl-riscv64@1.85.1:
+    resolution: {integrity: sha512-WRsZS/7qlfYXsa93FBpSruieuURIu7ySfFhzYfF1IbKrNAGwmbduutkHZh2ddm5/vQMvQ0Rdosgv+CslaQHMcw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [linux]
+
+  sass-embedded-linux-musl-x64@1.85.1:
+    resolution: {integrity: sha512-+OlLIilA5TnP0YEqTQ8yZtkW+bJIQYvzoGoNLUEskeyeGuOiIyn2CwL6G4JQB4xZQFaxPHb7JD3EueFkQbH0Pw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  sass-embedded-linux-riscv64@1.85.1:
+    resolution: {integrity: sha512-mKKlOwMGLN7yP1p0gB5yG/HX4fYLnpWaqstNuOOXH+fOzTaNg0+1hALg0H0CDIqypPO74M5MS9T6FAJZGdT6dQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [linux]
+
+  sass-embedded-linux-x64@1.85.1:
+    resolution: {integrity: sha512-uKRTv0z8NgtHV7xSren78+yoWB79sNi7TMqI7Bxd8fcRNIgHQSA8QBdF8led2ETC004hr8h71BrY60RPO+SSvA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  sass-embedded-win32-arm64@1.85.1:
+    resolution: {integrity: sha512-/GMiZXBOc6AEMBC3g25Rp+x8fq9Z6Ql7037l5rajBPhZ+DdFwtdHY0Ou3oIU6XuWUwD06U3ii4XufXVFhsP6PA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  sass-embedded-win32-ia32@1.85.1:
+    resolution: {integrity: sha512-L+4BWkKKBGFOKVQ2PQ5HwFfkM5FvTf1Xx2VSRvEWt9HxPXp6SPDho6zC8fqNQ3hSjoaoASEIJcSvgfdQYO0gdg==}
+    engines: {node: '>=14.0.0'}
+    cpu: [ia32]
+    os: [win32]
+
+  sass-embedded-win32-x64@1.85.1:
+    resolution: {integrity: sha512-/FO0AGKWxVfCk4GKsC0yXWBpUZdySe3YAAbQQL0lL6xUd1OiUY8Kow6g4Kc1TB/+z0iuQKKTqI/acJMEYl4iTQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  sass-embedded@1.85.1:
+    resolution: {integrity: sha512-0i+3h2Df/c71afluxC1SXqyyMmJlnKWfu9ZGdzwuKRM1OftEa2XM2myt5tR36CF3PanYrMjFKtRIj8PfSf838w==}
+    engines: {node: '>=16.0.0'}
+    hasBin: true
+
+  scule@1.3.0:
+    resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+  semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
+  semver@7.7.1:
+    resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  sirv@3.0.1:
+    resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
+    engines: {node: '>=18'}
+
+  slash@5.1.0:
+    resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+    engines: {node: '>=14.16'}
+
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  speakingurl@14.0.1:
+    resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+    engines: {node: '>=0.10.0'}
+
+  std-env@3.8.1:
+    resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==}
+
+  strip-final-newline@4.0.0:
+    resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
+    engines: {node: '>=18'}
+
+  strip-literal@3.0.0:
+    resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
+
+  superjson@2.2.2:
+    resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
+    engines: {node: '>=16'}
+
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
+  sync-child-process@1.0.2:
+    resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==}
+    engines: {node: '>=16.0.0'}
+
+  sync-message-port@1.1.3:
+    resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==}
+    engines: {node: '>=16.0.0'}
+
+  tinyexec@0.3.2:
+    resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+  tinyglobby@0.2.12:
+    resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
+    engines: {node: '>=12.0.0'}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  totalist@3.0.1:
+    resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+    engines: {node: '>=6'}
+
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+  typescript@5.7.3:
+    resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  ufo@1.5.4:
+    resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+  unconfig@7.3.1:
+    resolution: {integrity: sha512-LH5WL+un92tGAzWS87k7LkAfwpMdm7V0IXG2FxEjZz/QxiIW5J5LkcrKQThj0aRz6+h/lFmKI9EUXmK/T0bcrw==}
+
+  unctx@2.4.1:
+    resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==}
+
+  undici-types@6.20.0:
+    resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+  unicorn-magic@0.3.0:
+    resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+    engines: {node: '>=18'}
+
+  unimport@4.1.2:
+    resolution: {integrity: sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==}
+    engines: {node: '>=18.12.0'}
+
+  universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  unocss@66.1.0-beta.8:
+    resolution: {integrity: sha512-oxPwPLlJdGLDShJmbj75LUsYoQgnfqnaGEBBAhO2nJ4N2v1FJ9y2JNIzov3yE+qEyFqR8W8og4j7wSJ6P6+RBQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@unocss/webpack': 66.1.0-beta.8
+      vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+    peerDependenciesMeta:
+      '@unocss/webpack':
+        optional: true
+      vite:
+        optional: true
+
+  unplugin-auto-import@19.1.1:
+    resolution: {integrity: sha512-sCGZZrSR1Bc8RfN8Q0RUDxXtC20rdAt7UB4lDyq8MNtKVHiXXh+5af6Nz4JRp9Q+7HjnbgQfQox0TkEymjdUAQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@nuxt/kit': ^3.2.2
+      '@vueuse/core': '*'
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+      '@vueuse/core':
+        optional: true
+
+  unplugin-icons@22.1.0:
+    resolution: {integrity: sha512-ect2ZNtk1Zgwb0NVHd0C1IDW/MV+Jk/xaq4t8o6rYdVS3+L660ZdD5kTSQZvsgdwCvquRw+/wYn75hsweRjoIA==}
+    peerDependencies:
+      '@svgr/core': '>=7.0.0'
+      '@svgx/core': ^1.0.1
+      '@vue/compiler-sfc': ^3.0.2 || ^2.7.0
+      svelte: ^3.0.0 || ^4.0.0 || ^5.0.0
+      vue-template-compiler: ^2.6.12
+      vue-template-es2015-compiler: ^1.9.0
+    peerDependenciesMeta:
+      '@svgr/core':
+        optional: true
+      '@svgx/core':
+        optional: true
+      '@vue/compiler-sfc':
+        optional: true
+      svelte:
+        optional: true
+      vue-template-compiler:
+        optional: true
+      vue-template-es2015-compiler:
+        optional: true
+
+  unplugin-utils@0.2.4:
+    resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==}
+    engines: {node: '>=18.12.0'}
+
+  unplugin-vue-components@28.4.1:
+    resolution: {integrity: sha512-niGSc0vJD9ueAnsqcfAldmtpkppZ09B6p2G1dL7X5S8KPdgbk1P+txPwaaDCe7N+eZh2VG1aAypLXkuJs3OSUg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/parser': ^7.15.8
+      '@nuxt/kit': ^3.2.2
+      vue: 2 || 3
+    peerDependenciesMeta:
+      '@babel/parser':
+        optional: true
+      '@nuxt/kit':
+        optional: true
+
+  unplugin@2.2.0:
+    resolution: {integrity: sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==}
+    engines: {node: '>=18.12.0'}
+
+  untyped@2.0.0:
+    resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==}
+    hasBin: true
+
+  update-browserslist-db@1.1.3:
+    resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+
+  varint@6.0.0:
+    resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
+
+  vite-hot-client@0.2.4:
+    resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==}
+    peerDependencies:
+      vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+
+  vite-plugin-inspect@0.8.9:
+    resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@nuxt/kit': '*'
+      vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+
+  vite-plugin-vue-devtools@7.7.2:
+    resolution: {integrity: sha512-5V0UijQWiSBj32blkyPEqIbzc6HO9c1bwnBhx+ay2dzU0FakH+qMdNUT8nF9BvDE+i6I1U8CqCuJiO20vKEdQw==}
+    engines: {node: '>=v14.21.3'}
+    peerDependencies:
+      vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0
+
+  vite-plugin-vue-inspector@5.3.1:
+    resolution: {integrity: sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==}
+    peerDependencies:
+      vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0
+
+  vite@6.2.1:
+    resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==}
+    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+      jiti: '>=1.21.0'
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      sass-embedded: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.16.0
+      tsx: ^4.8.1
+      yaml: ^2.4.2
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      jiti:
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      sass-embedded:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+      tsx:
+        optional: true
+      yaml:
+        optional: true
+
+  vscode-uri@3.1.0:
+    resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+  vue-demi@0.14.10:
+    resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+
+  vue-flow-layout@0.1.1:
+    resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==}
+    peerDependencies:
+      vue: ^3.4.37
+
+  vue-router@4.5.0:
+    resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  vue-tsc@2.2.8:
+    resolution: {integrity: sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==}
+    hasBin: true
+    peerDependencies:
+      typescript: '>=5.0.0'
+
+  vue@3.5.13:
+    resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+  yoctocolors@2.1.1:
+    resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
+    engines: {node: '>=18'}
+
+snapshots:
+
+  '@ampproject/remapping@2.3.0':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@antfu/install-pkg@1.0.0':
+    dependencies:
+      package-manager-detector: 0.2.11
+      tinyexec: 0.3.2
+
+  '@antfu/utils@0.7.10': {}
+
+  '@antfu/utils@8.1.1': {}
+
+  '@babel/code-frame@7.26.2':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.25.9
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
+
+  '@babel/compat-data@7.26.8': {}
+
+  '@babel/core@7.26.10':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.10
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
+      '@babel/helpers': 7.26.10
+      '@babel/parser': 7.26.10
+      '@babel/template': 7.26.9
+      '@babel/traverse': 7.26.10
+      '@babel/types': 7.26.10
+      convert-source-map: 2.0.0
+      debug: 4.4.0
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/generator@7.26.10':
+    dependencies:
+      '@babel/parser': 7.26.10
+      '@babel/types': 7.26.10
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+      jsesc: 3.1.0
+
+  '@babel/helper-annotate-as-pure@7.25.9':
+    dependencies:
+      '@babel/types': 7.26.10
+
+  '@babel/helper-compilation-targets@7.26.5':
+    dependencies:
+      '@babel/compat-data': 7.26.8
+      '@babel/helper-validator-option': 7.25.9
+      browserslist: 4.24.4
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
+  '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-member-expression-to-functions': 7.25.9
+      '@babel/helper-optimise-call-expression': 7.25.9
+      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/traverse': 7.26.10
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-member-expression-to-functions@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.26.10
+      '@babel/types': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-imports@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.26.10
+      '@babel/types': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/traverse': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-optimise-call-expression@7.25.9':
+    dependencies:
+      '@babel/types': 7.26.10
+
+  '@babel/helper-plugin-utils@7.26.5': {}
+
+  '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-member-expression-to-functions': 7.25.9
+      '@babel/helper-optimise-call-expression': 7.25.9
+      '@babel/traverse': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.26.10
+      '@babel/types': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-string-parser@7.25.9': {}
+
+  '@babel/helper-validator-identifier@7.25.9': {}
+
+  '@babel/helper-validator-option@7.25.9': {}
+
+  '@babel/helpers@7.26.10':
+    dependencies:
+      '@babel/template': 7.26.9
+      '@babel/types': 7.26.10
+
+  '@babel/parser@7.26.10':
+    dependencies:
+      '@babel/types': 7.26.10
+
+  '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/template@7.26.9':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/parser': 7.26.10
+      '@babel/types': 7.26.10
+
+  '@babel/traverse@7.26.10':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.10
+      '@babel/parser': 7.26.10
+      '@babel/template': 7.26.9
+      '@babel/types': 7.26.10
+      debug: 4.4.0
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/types@7.26.10':
+    dependencies:
+      '@babel/helper-string-parser': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+
+  '@bufbuild/protobuf@2.2.3': {}
+
+  '@ctrl/tinycolor@3.6.1': {}
+
+  '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      vue: 3.5.13(typescript@5.7.3)
+
+  '@esbuild/aix-ppc64@0.25.1':
+    optional: true
+
+  '@esbuild/android-arm64@0.25.1':
+    optional: true
+
+  '@esbuild/android-arm@0.25.1':
+    optional: true
+
+  '@esbuild/android-x64@0.25.1':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.25.1':
+    optional: true
+
+  '@esbuild/darwin-x64@0.25.1':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.25.1':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.25.1':
+    optional: true
+
+  '@esbuild/linux-arm64@0.25.1':
+    optional: true
+
+  '@esbuild/linux-arm@0.25.1':
+    optional: true
+
+  '@esbuild/linux-ia32@0.25.1':
+    optional: true
+
+  '@esbuild/linux-loong64@0.25.1':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.25.1':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.25.1':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.25.1':
+    optional: true
+
+  '@esbuild/linux-s390x@0.25.1':
+    optional: true
+
+  '@esbuild/linux-x64@0.25.1':
+    optional: true
+
+  '@esbuild/netbsd-arm64@0.25.1':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.25.1':
+    optional: true
+
+  '@esbuild/openbsd-arm64@0.25.1':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.25.1':
+    optional: true
+
+  '@esbuild/sunos-x64@0.25.1':
+    optional: true
+
+  '@esbuild/win32-arm64@0.25.1':
+    optional: true
+
+  '@esbuild/win32-ia32@0.25.1':
+    optional: true
+
+  '@esbuild/win32-x64@0.25.1':
+    optional: true
+
+  '@floating-ui/core@1.6.9':
+    dependencies:
+      '@floating-ui/utils': 0.2.9
+
+  '@floating-ui/dom@1.6.13':
+    dependencies:
+      '@floating-ui/core': 1.6.9
+      '@floating-ui/utils': 0.2.9
+
+  '@floating-ui/utils@0.2.9': {}
+
+  '@iconify-json/ep@1.2.2':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify/types@2.0.0': {}
+
+  '@iconify/utils@2.3.0':
+    dependencies:
+      '@antfu/install-pkg': 1.0.0
+      '@antfu/utils': 8.1.1
+      '@iconify/types': 2.0.0
+      debug: 4.4.0
+      globals: 15.15.0
+      kolorist: 1.8.0
+      local-pkg: 1.1.1
+      mlly: 1.7.4
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jridgewell/gen-mapping@0.3.8':
+    dependencies:
+      '@jridgewell/set-array': 1.2.1
+      '@jridgewell/sourcemap-codec': 1.5.0
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@jridgewell/resolve-uri@3.1.2': {}
+
+  '@jridgewell/set-array@1.2.1': {}
+
+  '@jridgewell/sourcemap-codec@1.5.0': {}
+
+  '@jridgewell/trace-mapping@0.3.25':
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.19.1
+
+  '@nuxt/kit@3.16.0':
+    dependencies:
+      c12: 3.0.2
+      consola: 3.4.0
+      defu: 6.1.4
+      destr: 2.0.3
+      errx: 0.1.0
+      exsolve: 1.0.4
+      globby: 14.1.0
+      ignore: 7.0.3
+      jiti: 2.4.2
+      klona: 2.0.6
+      knitwork: 1.2.0
+      mlly: 1.7.4
+      ohash: 2.0.11
+      pathe: 2.0.3
+      pkg-types: 2.1.0
+      scule: 1.3.0
+      semver: 7.7.1
+      std-env: 3.8.1
+      ufo: 1.5.4
+      unctx: 2.4.1
+      unimport: 4.1.2
+      untyped: 2.0.0
+    transitivePeerDependencies:
+      - magicast
+
+  '@polka/url@1.0.0-next.28': {}
+
+  '@quansync/fs@0.1.2':
+    dependencies:
+      quansync: 0.2.10
+
+  '@rollup/pluginutils@5.1.4(rollup@4.35.0)':
+    dependencies:
+      '@types/estree': 1.0.6
+      estree-walker: 2.0.2
+      picomatch: 4.0.2
+    optionalDependencies:
+      rollup: 4.35.0
+
+  '@rollup/rollup-android-arm-eabi@4.35.0':
+    optional: true
+
+  '@rollup/rollup-android-arm64@4.35.0':
+    optional: true
+
+  '@rollup/rollup-darwin-arm64@4.35.0':
+    optional: true
+
+  '@rollup/rollup-darwin-x64@4.35.0':
+    optional: true
+
+  '@rollup/rollup-freebsd-arm64@4.35.0':
+    optional: true
+
+  '@rollup/rollup-freebsd-x64@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm-musleabihf@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-gnu@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-musl@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-loongarch64-gnu@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-gnu@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-s390x-gnu@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-gnu@4.35.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-musl@4.35.0':
+    optional: true
+
+  '@rollup/rollup-win32-arm64-msvc@4.35.0':
+    optional: true
+
+  '@rollup/rollup-win32-ia32-msvc@4.35.0':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.35.0':
+    optional: true
+
+  '@sec-ant/readable-stream@0.4.1': {}
+
+  '@sindresorhus/merge-streams@2.3.0': {}
+
+  '@sindresorhus/merge-streams@4.0.0': {}
+
+  '@sxzz/popperjs-es@2.11.7': {}
+
+  '@types/estree@1.0.6': {}
+
+  '@types/lodash-es@4.17.12':
+    dependencies:
+      '@types/lodash': 4.17.16
+
+  '@types/lodash@4.17.16': {}
+
+  '@types/node@22.13.10':
+    dependencies:
+      undici-types: 6.20.0
+
+  '@types/vue@1.0.31': {}
+
+  '@types/web-bluetooth@0.0.16': {}
+
+  '@unocss/astro@66.1.0-beta.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/reset': 66.1.0-beta.8
+      '@unocss/vite': 66.1.0-beta.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))
+    optionalDependencies:
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+    transitivePeerDependencies:
+      - vue
+
+  '@unocss/cli@66.1.0-beta.8':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@unocss/config': 66.1.0-beta.8
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/preset-uno': 66.1.0-beta.8
+      cac: 6.7.14
+      chokidar: 3.6.0
+      colorette: 2.0.20
+      consola: 3.4.2
+      magic-string: 0.30.17
+      pathe: 2.0.3
+      perfect-debounce: 1.0.0
+      tinyglobby: 0.2.12
+      unplugin-utils: 0.2.4
+
+  '@unocss/config@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      unconfig: 7.3.1
+
+  '@unocss/core@66.1.0-beta.8': {}
+
+  '@unocss/extractor-arbitrary-variants@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+
+  '@unocss/inspector@66.1.0-beta.8(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/rule-utils': 66.1.0-beta.8
+      colorette: 2.0.20
+      gzip-size: 6.0.0
+      sirv: 3.0.1
+      vue-flow-layout: 0.1.1(vue@3.5.13(typescript@5.7.3))
+    transitivePeerDependencies:
+      - vue
+
+  '@unocss/postcss@66.1.0-beta.8(postcss@8.5.3)':
+    dependencies:
+      '@unocss/config': 66.1.0-beta.8
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/rule-utils': 66.1.0-beta.8
+      css-tree: 3.1.0
+      postcss: 8.5.3
+      tinyglobby: 0.2.12
+
+  '@unocss/preset-attributify@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+
+  '@unocss/preset-icons@66.1.0-beta.8':
+    dependencies:
+      '@iconify/utils': 2.3.0
+      '@unocss/core': 66.1.0-beta.8
+      ofetch: 1.4.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@unocss/preset-mini@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/extractor-arbitrary-variants': 66.1.0-beta.8
+      '@unocss/rule-utils': 66.1.0-beta.8
+
+  '@unocss/preset-tagify@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+
+  '@unocss/preset-typography@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/preset-mini': 66.1.0-beta.8
+      '@unocss/rule-utils': 66.1.0-beta.8
+
+  '@unocss/preset-uno@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/preset-wind3': 66.1.0-beta.8
+
+  '@unocss/preset-web-fonts@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      ofetch: 1.4.1
+
+  '@unocss/preset-wind3@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/preset-mini': 66.1.0-beta.8
+      '@unocss/rule-utils': 66.1.0-beta.8
+
+  '@unocss/preset-wind4@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/extractor-arbitrary-variants': 66.1.0-beta.8
+      '@unocss/rule-utils': 66.1.0-beta.8
+
+  '@unocss/preset-wind@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/preset-wind3': 66.1.0-beta.8
+
+  '@unocss/reset@66.1.0-beta.8': {}
+
+  '@unocss/rule-utils@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      magic-string: 0.30.17
+
+  '@unocss/transformer-attributify-jsx@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+
+  '@unocss/transformer-compile-class@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+
+  '@unocss/transformer-directives@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/rule-utils': 66.1.0-beta.8
+      css-tree: 3.1.0
+
+  '@unocss/transformer-variant-group@66.1.0-beta.8':
+    dependencies:
+      '@unocss/core': 66.1.0-beta.8
+
+  '@unocss/vite@66.1.0-beta.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@unocss/config': 66.1.0-beta.8
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/inspector': 66.1.0-beta.8(vue@3.5.13(typescript@5.7.3))
+      chokidar: 3.6.0
+      magic-string: 0.30.17
+      tinyglobby: 0.2.12
+      unplugin-utils: 0.2.4
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+    transitivePeerDependencies:
+      - vue
+
+  '@vitejs/plugin-vue@5.2.1(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+      vue: 3.5.13(typescript@5.7.3)
+
+  '@volar/language-core@2.4.12':
+    dependencies:
+      '@volar/source-map': 2.4.12
+
+  '@volar/source-map@2.4.12': {}
+
+  '@volar/typescript@2.4.12':
+    dependencies:
+      '@volar/language-core': 2.4.12
+      path-browserify: 1.0.1
+      vscode-uri: 3.1.0
+
+  '@vue/babel-helper-vue-transform-on@1.4.0': {}
+
+  '@vue/babel-plugin-jsx@1.4.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10)
+      '@babel/template': 7.26.9
+      '@babel/traverse': 7.26.10
+      '@babel/types': 7.26.10
+      '@vue/babel-helper-vue-transform-on': 1.4.0
+      '@vue/babel-plugin-resolve-type': 1.4.0(@babel/core@7.26.10)
+      '@vue/shared': 3.5.13
+    optionalDependencies:
+      '@babel/core': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/babel-plugin-resolve-type@1.4.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/core': 7.26.10
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/parser': 7.26.10
+      '@vue/compiler-sfc': 3.5.13
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/compiler-core@3.5.13':
+    dependencies:
+      '@babel/parser': 7.26.10
+      '@vue/shared': 3.5.13
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-dom@3.5.13':
+    dependencies:
+      '@vue/compiler-core': 3.5.13
+      '@vue/shared': 3.5.13
+
+  '@vue/compiler-sfc@3.5.13':
+    dependencies:
+      '@babel/parser': 7.26.10
+      '@vue/compiler-core': 3.5.13
+      '@vue/compiler-dom': 3.5.13
+      '@vue/compiler-ssr': 3.5.13
+      '@vue/shared': 3.5.13
+      estree-walker: 2.0.2
+      magic-string: 0.30.17
+      postcss: 8.5.3
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.5.13':
+    dependencies:
+      '@vue/compiler-dom': 3.5.13
+      '@vue/shared': 3.5.13
+
+  '@vue/compiler-vue2@2.7.16':
+    dependencies:
+      de-indent: 1.0.2
+      he: 1.2.0
+
+  '@vue/devtools-api@6.6.4': {}
+
+  '@vue/devtools-api@7.7.2':
+    dependencies:
+      '@vue/devtools-kit': 7.7.2
+
+  '@vue/devtools-core@7.7.2(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@vue/devtools-kit': 7.7.2
+      '@vue/devtools-shared': 7.7.2
+      mitt: 3.0.1
+      nanoid: 5.1.5
+      pathe: 2.0.3
+      vite-hot-client: 0.2.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))
+      vue: 3.5.13(typescript@5.7.3)
+    transitivePeerDependencies:
+      - vite
+
+  '@vue/devtools-kit@7.7.2':
+    dependencies:
+      '@vue/devtools-shared': 7.7.2
+      birpc: 0.2.19
+      hookable: 5.5.3
+      mitt: 3.0.1
+      perfect-debounce: 1.0.0
+      speakingurl: 14.0.1
+      superjson: 2.2.2
+
+  '@vue/devtools-shared@7.7.2':
+    dependencies:
+      rfdc: 1.4.1
+
+  '@vue/language-core@2.2.8(typescript@5.7.3)':
+    dependencies:
+      '@volar/language-core': 2.4.12
+      '@vue/compiler-dom': 3.5.13
+      '@vue/compiler-vue2': 2.7.16
+      '@vue/shared': 3.5.13
+      alien-signals: 1.0.4
+      minimatch: 9.0.5
+      muggle-string: 0.4.1
+      path-browserify: 1.0.1
+    optionalDependencies:
+      typescript: 5.7.3
+
+  '@vue/reactivity@3.5.13':
+    dependencies:
+      '@vue/shared': 3.5.13
+
+  '@vue/runtime-core@3.5.13':
+    dependencies:
+      '@vue/reactivity': 3.5.13
+      '@vue/shared': 3.5.13
+
+  '@vue/runtime-dom@3.5.13':
+    dependencies:
+      '@vue/reactivity': 3.5.13
+      '@vue/runtime-core': 3.5.13
+      '@vue/shared': 3.5.13
+      csstype: 3.1.3
+
+  '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@vue/compiler-ssr': 3.5.13
+      '@vue/shared': 3.5.13
+      vue: 3.5.13(typescript@5.7.3)
+
+  '@vue/shared@3.5.13': {}
+
+  '@vue/tsconfig@0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))':
+    optionalDependencies:
+      typescript: 5.7.3
+      vue: 3.5.13(typescript@5.7.3)
+
+  '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@types/web-bluetooth': 0.0.16
+      '@vueuse/metadata': 9.13.0
+      '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.3))
+      vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3))
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/metadata@9.13.0': {}
+
+  '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3))
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  acorn@8.14.1: {}
+
+  alien-signals@1.0.4: {}
+
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  async-validator@4.2.5: {}
+
+  asynckit@0.4.0: {}
+
+  axios@1.8.2:
+    dependencies:
+      follow-redirects: 1.15.9
+      form-data: 4.0.2
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+
+  balanced-match@1.0.2: {}
+
+  binary-extensions@2.3.0: {}
+
+  birpc@0.2.19: {}
+
+  brace-expansion@2.0.1:
+    dependencies:
+      balanced-match: 1.0.2
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  browserslist@4.24.4:
+    dependencies:
+      caniuse-lite: 1.0.30001703
+      electron-to-chromium: 1.5.114
+      node-releases: 2.0.19
+      update-browserslist-db: 1.1.3(browserslist@4.24.4)
+
+  buffer-builder@0.2.0: {}
+
+  bundle-name@4.1.0:
+    dependencies:
+      run-applescript: 7.0.0
+
+  c12@3.0.2:
+    dependencies:
+      chokidar: 4.0.3
+      confbox: 0.1.8
+      defu: 6.1.4
+      dotenv: 16.4.7
+      exsolve: 1.0.4
+      giget: 2.0.0
+      jiti: 2.4.2
+      ohash: 2.0.11
+      pathe: 2.0.3
+      perfect-debounce: 1.0.0
+      pkg-types: 2.1.0
+      rc9: 2.1.2
+
+  cac@6.7.14: {}
+
+  call-bind-apply-helpers@1.0.2:
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+
+  caniuse-lite@1.0.30001703: {}
+
+  chokidar@3.6.0:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  chokidar@4.0.3:
+    dependencies:
+      readdirp: 4.1.2
+
+  citty@0.1.6:
+    dependencies:
+      consola: 3.4.0
+
+  colorette@2.0.20: {}
+
+  colorjs.io@0.5.2: {}
+
+  combined-stream@1.0.8:
+    dependencies:
+      delayed-stream: 1.0.0
+
+  confbox@0.1.8: {}
+
+  confbox@0.2.1: {}
+
+  consola@3.4.0: {}
+
+  consola@3.4.2: {}
+
+  convert-source-map@2.0.0: {}
+
+  copy-anything@3.0.5:
+    dependencies:
+      is-what: 4.1.16
+
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  css-tree@3.1.0:
+    dependencies:
+      mdn-data: 2.12.2
+      source-map-js: 1.2.1
+
+  csstype@3.1.3: {}
+
+  dayjs@1.11.13: {}
+
+  de-indent@1.0.2: {}
+
+  debug@4.4.0:
+    dependencies:
+      ms: 2.1.3
+
+  deep-pick-omit@1.2.1: {}
+
+  default-browser-id@5.0.0: {}
+
+  default-browser@5.2.1:
+    dependencies:
+      bundle-name: 4.1.0
+      default-browser-id: 5.0.0
+
+  define-lazy-prop@3.0.0: {}
+
+  defu@6.1.4: {}
+
+  delayed-stream@1.0.0: {}
+
+  destr@2.0.3: {}
+
+  dotenv@16.4.7: {}
+
+  dunder-proto@1.0.1:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  duplexer@0.1.2: {}
+
+  electron-to-chromium@1.5.114: {}
+
+  element-plus@2.9.6(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@ctrl/tinycolor': 3.6.1
+      '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.3))
+      '@floating-ui/dom': 1.6.13
+      '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+      '@types/lodash': 4.17.16
+      '@types/lodash-es': 4.17.12
+      '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3))
+      async-validator: 4.2.5
+      dayjs: 1.11.13
+      escape-html: 1.0.3
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+      lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
+      memoize-one: 6.0.0
+      normalize-wheel-es: 1.2.0
+      vue: 3.5.13(typescript@5.7.3)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+
+  entities@4.5.0: {}
+
+  error-stack-parser-es@0.1.5: {}
+
+  errx@0.1.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.25.1:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.25.1
+      '@esbuild/android-arm': 0.25.1
+      '@esbuild/android-arm64': 0.25.1
+      '@esbuild/android-x64': 0.25.1
+      '@esbuild/darwin-arm64': 0.25.1
+      '@esbuild/darwin-x64': 0.25.1
+      '@esbuild/freebsd-arm64': 0.25.1
+      '@esbuild/freebsd-x64': 0.25.1
+      '@esbuild/linux-arm': 0.25.1
+      '@esbuild/linux-arm64': 0.25.1
+      '@esbuild/linux-ia32': 0.25.1
+      '@esbuild/linux-loong64': 0.25.1
+      '@esbuild/linux-mips64el': 0.25.1
+      '@esbuild/linux-ppc64': 0.25.1
+      '@esbuild/linux-riscv64': 0.25.1
+      '@esbuild/linux-s390x': 0.25.1
+      '@esbuild/linux-x64': 0.25.1
+      '@esbuild/netbsd-arm64': 0.25.1
+      '@esbuild/netbsd-x64': 0.25.1
+      '@esbuild/openbsd-arm64': 0.25.1
+      '@esbuild/openbsd-x64': 0.25.1
+      '@esbuild/sunos-x64': 0.25.1
+      '@esbuild/win32-arm64': 0.25.1
+      '@esbuild/win32-ia32': 0.25.1
+      '@esbuild/win32-x64': 0.25.1
+
+  escalade@3.2.0: {}
+
+  escape-html@1.0.3: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  estree-walker@2.0.2: {}
+
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.6
+
+  execa@9.5.2:
+    dependencies:
+      '@sindresorhus/merge-streams': 4.0.0
+      cross-spawn: 7.0.6
+      figures: 6.1.0
+      get-stream: 9.0.1
+      human-signals: 8.0.0
+      is-plain-obj: 4.1.0
+      is-stream: 4.0.1
+      npm-run-path: 6.0.0
+      pretty-ms: 9.2.0
+      signal-exit: 4.1.0
+      strip-final-newline: 4.0.0
+      yoctocolors: 2.1.1
+
+  exsolve@1.0.4: {}
+
+  fast-glob@3.3.3:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fastq@1.19.1:
+    dependencies:
+      reusify: 1.1.0
+
+  fdir@6.4.3(picomatch@4.0.2):
+    optionalDependencies:
+      picomatch: 4.0.2
+
+  figures@6.1.0:
+    dependencies:
+      is-unicode-supported: 2.1.0
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  follow-redirects@1.15.9: {}
+
+  form-data@4.0.2:
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      es-set-tostringtag: 2.1.0
+      mime-types: 2.1.35
+
+  fs-extra@11.3.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.1
+
+  fsevents@2.3.3:
+    optional: true
+
+  function-bind@1.1.2: {}
+
+  gensync@1.0.0-beta.2: {}
+
+  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
+
+  get-stream@9.0.1:
+    dependencies:
+      '@sec-ant/readable-stream': 0.4.1
+      is-stream: 4.0.1
+
+  giget@2.0.0:
+    dependencies:
+      citty: 0.1.6
+      consola: 3.4.0
+      defu: 6.1.4
+      node-fetch-native: 1.6.6
+      nypm: 0.6.0
+      pathe: 2.0.3
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  globals@11.12.0: {}
+
+  globals@15.15.0: {}
+
+  globby@14.1.0:
+    dependencies:
+      '@sindresorhus/merge-streams': 2.3.0
+      fast-glob: 3.3.3
+      ignore: 7.0.3
+      path-type: 6.0.0
+      slash: 5.1.0
+      unicorn-magic: 0.3.0
+
+  gopd@1.2.0: {}
+
+  graceful-fs@4.2.11: {}
+
+  gzip-size@6.0.0:
+    dependencies:
+      duplexer: 0.1.2
+
+  has-flag@4.0.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
+
+  he@1.2.0: {}
+
+  highlight.js@11.11.1: {}
+
+  hookable@5.5.3: {}
+
+  human-signals@8.0.0: {}
+
+  ignore@7.0.3: {}
+
+  immutable@5.0.3: {}
+
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
+  is-docker@3.0.0: {}
+
+  is-extglob@2.1.1: {}
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-inside-container@1.0.0:
+    dependencies:
+      is-docker: 3.0.0
+
+  is-number@7.0.0: {}
+
+  is-plain-obj@4.1.0: {}
+
+  is-stream@4.0.1: {}
+
+  is-unicode-supported@2.1.0: {}
+
+  is-what@4.1.16: {}
+
+  is-wsl@3.1.0:
+    dependencies:
+      is-inside-container: 1.0.0
+
+  isexe@2.0.0: {}
+
+  jiti@2.4.2: {}
+
+  js-tokens@4.0.0: {}
+
+  js-tokens@9.0.1: {}
+
+  jsesc@3.1.0: {}
+
+  json5@2.2.3: {}
+
+  jsonfile@6.1.0:
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  klona@2.0.6: {}
+
+  knitwork@1.2.0: {}
+
+  kolorist@1.8.0: {}
+
+  local-pkg@1.1.1:
+    dependencies:
+      mlly: 1.7.4
+      pkg-types: 2.1.0
+      quansync: 0.2.8
+
+  lodash-es@4.17.21: {}
+
+  lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+    dependencies:
+      '@types/lodash-es': 4.17.12
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+
+  lodash@4.17.21: {}
+
+  lru-cache@5.1.1:
+    dependencies:
+      yallist: 3.1.1
+
+  magic-string@0.30.17:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  marked@15.0.7: {}
+
+  math-intrinsics@1.1.0: {}
+
+  mdn-data@2.12.2: {}
+
+  memoize-one@6.0.0: {}
+
+  merge2@1.4.1: {}
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  mime-db@1.52.0: {}
+
+  mime-types@2.1.35:
+    dependencies:
+      mime-db: 1.52.0
+
+  minimatch@9.0.5:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  mitt@3.0.1: {}
+
+  mlly@1.7.4:
+    dependencies:
+      acorn: 8.14.1
+      pathe: 2.0.3
+      pkg-types: 1.3.1
+      ufo: 1.5.4
+
+  mrmime@2.0.1: {}
+
+  ms@2.1.3: {}
+
+  muggle-string@0.4.1: {}
+
+  nanoid@3.3.9: {}
+
+  nanoid@5.1.5: {}
+
+  node-fetch-native@1.6.6: {}
+
+  node-releases@2.0.19: {}
+
+  normalize-path@3.0.0: {}
+
+  normalize-wheel-es@1.2.0: {}
+
+  normalize.css@8.0.1: {}
+
+  npm-run-path@6.0.0:
+    dependencies:
+      path-key: 4.0.0
+      unicorn-magic: 0.3.0
+
+  nypm@0.6.0:
+    dependencies:
+      citty: 0.1.6
+      consola: 3.4.0
+      pathe: 2.0.3
+      pkg-types: 2.1.0
+      tinyexec: 0.3.2
+
+  ofetch@1.4.1:
+    dependencies:
+      destr: 2.0.3
+      node-fetch-native: 1.6.6
+      ufo: 1.5.4
+
+  ohash@2.0.11: {}
+
+  open@10.1.0:
+    dependencies:
+      default-browser: 5.2.1
+      define-lazy-prop: 3.0.0
+      is-inside-container: 1.0.0
+      is-wsl: 3.1.0
+
+  package-manager-detector@0.2.11:
+    dependencies:
+      quansync: 0.2.8
+
+  parse-ms@4.0.0: {}
+
+  path-browserify@1.0.1: {}
+
+  path-key@3.1.1: {}
+
+  path-key@4.0.0: {}
+
+  path-type@6.0.0: {}
+
+  pathe@2.0.3: {}
+
+  perfect-debounce@1.0.0: {}
+
+  picocolors@1.1.1: {}
+
+  picomatch@2.3.1: {}
+
+  picomatch@4.0.2: {}
+
+  pinia-plugin-persistedstate@4.2.0(pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))):
+    dependencies:
+      '@nuxt/kit': 3.16.0
+      deep-pick-omit: 1.2.1
+      defu: 6.1.4
+      destr: 2.0.3
+    optionalDependencies:
+      pinia: 3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
+    transitivePeerDependencies:
+      - magicast
+
+  pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@vue/devtools-api': 7.7.2
+      vue: 3.5.13(typescript@5.7.3)
+    optionalDependencies:
+      typescript: 5.7.3
+
+  pkg-types@1.3.1:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.7.4
+      pathe: 2.0.3
+
+  pkg-types@2.1.0:
+    dependencies:
+      confbox: 0.2.1
+      exsolve: 1.0.4
+      pathe: 2.0.3
+
+  postcss@8.5.3:
+    dependencies:
+      nanoid: 3.3.9
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  pretty-ms@9.2.0:
+    dependencies:
+      parse-ms: 4.0.0
+
+  proxy-from-env@1.1.0: {}
+
+  quansync@0.2.10: {}
+
+  quansync@0.2.8: {}
+
+  queue-microtask@1.2.3: {}
+
+  rc9@2.1.2:
+    dependencies:
+      defu: 6.1.4
+      destr: 2.0.3
+
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
+  readdirp@4.1.2: {}
+
+  reusify@1.1.0: {}
+
+  rfdc@1.4.1: {}
+
+  rollup@4.35.0:
+    dependencies:
+      '@types/estree': 1.0.6
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.35.0
+      '@rollup/rollup-android-arm64': 4.35.0
+      '@rollup/rollup-darwin-arm64': 4.35.0
+      '@rollup/rollup-darwin-x64': 4.35.0
+      '@rollup/rollup-freebsd-arm64': 4.35.0
+      '@rollup/rollup-freebsd-x64': 4.35.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.35.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.35.0
+      '@rollup/rollup-linux-arm64-gnu': 4.35.0
+      '@rollup/rollup-linux-arm64-musl': 4.35.0
+      '@rollup/rollup-linux-loongarch64-gnu': 4.35.0
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.35.0
+      '@rollup/rollup-linux-s390x-gnu': 4.35.0
+      '@rollup/rollup-linux-x64-gnu': 4.35.0
+      '@rollup/rollup-linux-x64-musl': 4.35.0
+      '@rollup/rollup-win32-arm64-msvc': 4.35.0
+      '@rollup/rollup-win32-ia32-msvc': 4.35.0
+      '@rollup/rollup-win32-x64-msvc': 4.35.0
+      fsevents: 2.3.3
+
+  run-applescript@7.0.0: {}
+
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  rxjs@7.8.2:
+    dependencies:
+      tslib: 2.8.1
+
+  sass-embedded-android-arm64@1.85.1:
+    optional: true
+
+  sass-embedded-android-arm@1.85.1:
+    optional: true
+
+  sass-embedded-android-ia32@1.85.1:
+    optional: true
+
+  sass-embedded-android-riscv64@1.85.1:
+    optional: true
+
+  sass-embedded-android-x64@1.85.1:
+    optional: true
+
+  sass-embedded-darwin-arm64@1.85.1:
+    optional: true
+
+  sass-embedded-darwin-x64@1.85.1:
+    optional: true
+
+  sass-embedded-linux-arm64@1.85.1:
+    optional: true
+
+  sass-embedded-linux-arm@1.85.1:
+    optional: true
+
+  sass-embedded-linux-ia32@1.85.1:
+    optional: true
+
+  sass-embedded-linux-musl-arm64@1.85.1:
+    optional: true
+
+  sass-embedded-linux-musl-arm@1.85.1:
+    optional: true
+
+  sass-embedded-linux-musl-ia32@1.85.1:
+    optional: true
+
+  sass-embedded-linux-musl-riscv64@1.85.1:
+    optional: true
+
+  sass-embedded-linux-musl-x64@1.85.1:
+    optional: true
+
+  sass-embedded-linux-riscv64@1.85.1:
+    optional: true
+
+  sass-embedded-linux-x64@1.85.1:
+    optional: true
+
+  sass-embedded-win32-arm64@1.85.1:
+    optional: true
+
+  sass-embedded-win32-ia32@1.85.1:
+    optional: true
+
+  sass-embedded-win32-x64@1.85.1:
+    optional: true
+
+  sass-embedded@1.85.1:
+    dependencies:
+      '@bufbuild/protobuf': 2.2.3
+      buffer-builder: 0.2.0
+      colorjs.io: 0.5.2
+      immutable: 5.0.3
+      rxjs: 7.8.2
+      supports-color: 8.1.1
+      sync-child-process: 1.0.2
+      varint: 6.0.0
+    optionalDependencies:
+      sass-embedded-android-arm: 1.85.1
+      sass-embedded-android-arm64: 1.85.1
+      sass-embedded-android-ia32: 1.85.1
+      sass-embedded-android-riscv64: 1.85.1
+      sass-embedded-android-x64: 1.85.1
+      sass-embedded-darwin-arm64: 1.85.1
+      sass-embedded-darwin-x64: 1.85.1
+      sass-embedded-linux-arm: 1.85.1
+      sass-embedded-linux-arm64: 1.85.1
+      sass-embedded-linux-ia32: 1.85.1
+      sass-embedded-linux-musl-arm: 1.85.1
+      sass-embedded-linux-musl-arm64: 1.85.1
+      sass-embedded-linux-musl-ia32: 1.85.1
+      sass-embedded-linux-musl-riscv64: 1.85.1
+      sass-embedded-linux-musl-x64: 1.85.1
+      sass-embedded-linux-riscv64: 1.85.1
+      sass-embedded-linux-x64: 1.85.1
+      sass-embedded-win32-arm64: 1.85.1
+      sass-embedded-win32-ia32: 1.85.1
+      sass-embedded-win32-x64: 1.85.1
+
+  scule@1.3.0: {}
+
+  semver@6.3.1: {}
+
+  semver@7.7.1: {}
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
+  signal-exit@4.1.0: {}
+
+  sirv@3.0.1:
+    dependencies:
+      '@polka/url': 1.0.0-next.28
+      mrmime: 2.0.1
+      totalist: 3.0.1
+
+  slash@5.1.0: {}
+
+  source-map-js@1.2.1: {}
+
+  speakingurl@14.0.1: {}
+
+  std-env@3.8.1: {}
+
+  strip-final-newline@4.0.0: {}
+
+  strip-literal@3.0.0:
+    dependencies:
+      js-tokens: 9.0.1
+
+  superjson@2.2.2:
+    dependencies:
+      copy-anything: 3.0.5
+
+  supports-color@8.1.1:
+    dependencies:
+      has-flag: 4.0.0
+
+  sync-child-process@1.0.2:
+    dependencies:
+      sync-message-port: 1.1.3
+
+  sync-message-port@1.1.3: {}
+
+  tinyexec@0.3.2: {}
+
+  tinyglobby@0.2.12:
+    dependencies:
+      fdir: 6.4.3(picomatch@4.0.2)
+      picomatch: 4.0.2
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  totalist@3.0.1: {}
+
+  tslib@2.8.1: {}
+
+  typescript@5.7.3: {}
+
+  ufo@1.5.4: {}
+
+  unconfig@7.3.1:
+    dependencies:
+      '@quansync/fs': 0.1.2
+      defu: 6.1.4
+      jiti: 2.4.2
+      quansync: 0.2.8
+
+  unctx@2.4.1:
+    dependencies:
+      acorn: 8.14.1
+      estree-walker: 3.0.3
+      magic-string: 0.30.17
+      unplugin: 2.2.0
+
+  undici-types@6.20.0: {}
+
+  unicorn-magic@0.3.0: {}
+
+  unimport@4.1.2:
+    dependencies:
+      acorn: 8.14.1
+      escape-string-regexp: 5.0.0
+      estree-walker: 3.0.3
+      local-pkg: 1.1.1
+      magic-string: 0.30.17
+      mlly: 1.7.4
+      pathe: 2.0.3
+      picomatch: 4.0.2
+      pkg-types: 1.3.1
+      scule: 1.3.0
+      strip-literal: 3.0.0
+      tinyglobby: 0.2.12
+      unplugin: 2.2.0
+      unplugin-utils: 0.2.4
+
+  universalify@2.0.1: {}
+
+  unocss@66.1.0-beta.8(postcss@8.5.3)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@unocss/astro': 66.1.0-beta.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))
+      '@unocss/cli': 66.1.0-beta.8
+      '@unocss/core': 66.1.0-beta.8
+      '@unocss/postcss': 66.1.0-beta.8(postcss@8.5.3)
+      '@unocss/preset-attributify': 66.1.0-beta.8
+      '@unocss/preset-icons': 66.1.0-beta.8
+      '@unocss/preset-mini': 66.1.0-beta.8
+      '@unocss/preset-tagify': 66.1.0-beta.8
+      '@unocss/preset-typography': 66.1.0-beta.8
+      '@unocss/preset-uno': 66.1.0-beta.8
+      '@unocss/preset-web-fonts': 66.1.0-beta.8
+      '@unocss/preset-wind': 66.1.0-beta.8
+      '@unocss/preset-wind3': 66.1.0-beta.8
+      '@unocss/preset-wind4': 66.1.0-beta.8
+      '@unocss/transformer-attributify-jsx': 66.1.0-beta.8
+      '@unocss/transformer-compile-class': 66.1.0-beta.8
+      '@unocss/transformer-directives': 66.1.0-beta.8
+      '@unocss/transformer-variant-group': 66.1.0-beta.8
+      '@unocss/vite': 66.1.0-beta.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))
+    optionalDependencies:
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - vue
+
+  unplugin-auto-import@19.1.1(@nuxt/kit@3.16.0)(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3))):
+    dependencies:
+      local-pkg: 1.1.1
+      magic-string: 0.30.17
+      picomatch: 4.0.2
+      unimport: 4.1.2
+      unplugin: 2.2.0
+      unplugin-utils: 0.2.4
+    optionalDependencies:
+      '@nuxt/kit': 3.16.0
+      '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3))
+
+  unplugin-icons@22.1.0(@vue/compiler-sfc@3.5.13):
+    dependencies:
+      '@antfu/install-pkg': 1.0.0
+      '@iconify/utils': 2.3.0
+      debug: 4.4.0
+      local-pkg: 1.1.1
+      unplugin: 2.2.0
+    optionalDependencies:
+      '@vue/compiler-sfc': 3.5.13
+    transitivePeerDependencies:
+      - supports-color
+
+  unplugin-utils@0.2.4:
+    dependencies:
+      pathe: 2.0.3
+      picomatch: 4.0.2
+
+  unplugin-vue-components@28.4.1(@babel/parser@7.26.10)(@nuxt/kit@3.16.0)(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      chokidar: 3.6.0
+      debug: 4.4.0
+      local-pkg: 1.1.1
+      magic-string: 0.30.17
+      mlly: 1.7.4
+      tinyglobby: 0.2.12
+      unplugin: 2.2.0
+      unplugin-utils: 0.2.4
+      vue: 3.5.13(typescript@5.7.3)
+    optionalDependencies:
+      '@babel/parser': 7.26.10
+      '@nuxt/kit': 3.16.0
+    transitivePeerDependencies:
+      - supports-color
+
+  unplugin@2.2.0:
+    dependencies:
+      acorn: 8.14.1
+      webpack-virtual-modules: 0.6.2
+
+  untyped@2.0.0:
+    dependencies:
+      citty: 0.1.6
+      defu: 6.1.4
+      jiti: 2.4.2
+      knitwork: 1.2.0
+      scule: 1.3.0
+
+  update-browserslist-db@1.1.3(browserslist@4.24.4):
+    dependencies:
+      browserslist: 4.24.4
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
+  varint@6.0.0: {}
+
+  vite-hot-client@0.2.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)):
+    dependencies:
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+
+  vite-plugin-inspect@0.8.9(@nuxt/kit@3.16.0)(rollup@4.35.0)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)):
+    dependencies:
+      '@antfu/utils': 0.7.10
+      '@rollup/pluginutils': 5.1.4(rollup@4.35.0)
+      debug: 4.4.0
+      error-stack-parser-es: 0.1.5
+      fs-extra: 11.3.0
+      open: 10.1.0
+      perfect-debounce: 1.0.0
+      picocolors: 1.1.1
+      sirv: 3.0.1
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+    optionalDependencies:
+      '@nuxt/kit': 3.16.0
+    transitivePeerDependencies:
+      - rollup
+      - supports-color
+
+  vite-plugin-vue-devtools@7.7.2(@nuxt/kit@3.16.0)(rollup@4.35.0)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@vue/devtools-core': 7.7.2(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))(vue@3.5.13(typescript@5.7.3))
+      '@vue/devtools-kit': 7.7.2
+      '@vue/devtools-shared': 7.7.2
+      execa: 9.5.2
+      sirv: 3.0.1
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+      vite-plugin-inspect: 0.8.9(@nuxt/kit@3.16.0)(rollup@4.35.0)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))
+      vite-plugin-vue-inspector: 5.3.1(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1))
+    transitivePeerDependencies:
+      - '@nuxt/kit'
+      - rollup
+      - supports-color
+      - vue
+
+  vite-plugin-vue-inspector@5.3.1(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)):
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10)
+      '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.10)
+      '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.26.10)
+      '@vue/compiler-dom': 3.5.13
+      kolorist: 1.8.0
+      magic-string: 0.30.17
+      vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1)
+    transitivePeerDependencies:
+      - supports-color
+
+  vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(sass-embedded@1.85.1):
+    dependencies:
+      esbuild: 0.25.1
+      postcss: 8.5.3
+      rollup: 4.35.0
+    optionalDependencies:
+      '@types/node': 22.13.10
+      fsevents: 2.3.3
+      jiti: 2.4.2
+      sass-embedded: 1.85.1
+
+  vscode-uri@3.1.0: {}
+
+  vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      vue: 3.5.13(typescript@5.7.3)
+
+  vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      vue: 3.5.13(typescript@5.7.3)
+
+  vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@vue/devtools-api': 6.6.4
+      vue: 3.5.13(typescript@5.7.3)
+
+  vue-tsc@2.2.8(typescript@5.7.3):
+    dependencies:
+      '@volar/typescript': 2.4.12
+      '@vue/language-core': 2.2.8(typescript@5.7.3)
+      typescript: 5.7.3
+
+  vue@3.5.13(typescript@5.7.3):
+    dependencies:
+      '@vue/compiler-dom': 3.5.13
+      '@vue/compiler-sfc': 3.5.13
+      '@vue/runtime-dom': 3.5.13
+      '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3))
+      '@vue/shared': 3.5.13
+    optionalDependencies:
+      typescript: 5.7.3
+
+  webpack-virtual-modules@0.6.2: {}
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  yallist@3.1.1: {}
+
+  yoctocolors@2.1.1: {}

+ 11 - 0
public/ai.svg

@@ -0,0 +1,11 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_374_4653)">
+<path d="M11.8986 24.2667C11.8771 24.3257 11.8524 24.383 11.8301 24.4428C11.7544 24.6425 11.6891 24.8485 11.6222 25.0505C11.5815 25.1708 11.5369 25.2887 11.4979 25.4082C11.4541 25.5505 11.4182 25.6936 11.376 25.8359C11.3218 26.023 11.2645 26.207 11.2143 26.3965C11.196 26.4672 11.1825 26.5372 11.1649 26.6087C11.0988 26.8713 11.0343 27.1363 10.9793 27.4036C10.9745 27.4256 10.9722 27.4484 10.9666 27.4719C10.7635 28.4673 10.6312 29.4846 10.5771 30.527C10.5739 30.6072 10.5747 30.6906 10.5715 30.7715C10.5603 31.0459 10.5508 31.3203 10.5508 31.5978C14.3926 31.5978 17.9914 30.5781 21.0924 28.8053V21.1927C21.0924 21.1927 20.7571 15.6643 24.289 13.279C24.3336 13.2499 24.3758 13.2264 24.4197 13.1996C21.4573 15.6384 22.0419 21.1912 22.0419 21.1927H28.8063C30.6017 18.1313 31.6341 14.5802 31.6349 10.7884V10.7876C22.6051 10.7884 14.9032 16.3923 11.8986 24.2667Z" fill="black"/>
+<path d="M19.7438 7.71445C19.7653 7.65548 19.7916 7.59809 19.8131 7.53913C19.8888 7.33944 19.9533 7.13346 20.021 6.93063C20.0617 6.81034 20.1063 6.6932 20.1445 6.57291C20.1891 6.43061 20.2257 6.28753 20.2672 6.14523C20.3221 5.95812 20.3787 5.77415 20.4289 5.58547C20.4472 5.51393 20.4607 5.44396 20.4775 5.3732C20.5444 5.10905 20.6081 4.84489 20.6639 4.57759C20.6678 4.55479 20.6718 4.53278 20.6758 4.50998C20.8797 3.51389 21.012 2.49657 21.0661 1.45488C21.0693 1.37469 21.0677 1.29135 21.0717 1.21038C21.0836 0.935214 21.0924 0.660837 21.0924 0.384102C17.2506 0.384102 13.6525 1.40378 10.5508 3.17504V10.7884C10.5508 10.7884 10.8869 16.3168 7.35337 18.7021C7.30956 18.7312 7.26734 18.7548 7.22432 18.7815C10.1859 16.342 9.60125 10.7916 9.60125 10.7884H2.83688C1.04144 13.8506 0.00830078 17.401 0.00830078 21.1927V21.1935C9.03888 21.1927 16.7392 15.5896 19.7438 7.71445Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0_374_4653">
+<rect width="32" height="32" fill="white"/>
+</clipPath>
+</defs>
+</svg>

+ 14 - 0
src/App.vue

@@ -0,0 +1,14 @@
+<script setup lang="ts">
+import GlobalLoginDialog from "@/components/common/login/GlobalLoginDialog.vue";
+import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
+const locale = zhCn;
+
+</script>
+
+<template>
+  <el-config-provider :locale="locale">
+    <router-view></router-view>
+    <!-- 全局登陆组件  -->
+    <global-login-dialog />
+  </el-config-provider>
+</template>

+ 97 - 0
src/api/aiImage.ts

@@ -0,0 +1,97 @@
+import { ImageConversationMesg } from "@/types/imageConversation";
+import { realApi } from "@/utils/request.ts";
+
+/**
+ * 生成图片
+ */
+export function createImage(data: {
+  number?: number;
+  prompt: string;
+  conversationId?: string;
+}): Promise<ImageConversationMesg> {
+  data.conversationId = data.conversationId ?? ""; // 设置默认值
+  data.number = data.number ?? 1; // 设置默认值
+  return realApi.post({
+    url: "/api/createImage/create",
+    data,
+  });
+}
+
+/**
+ * 请求图片url,携带token
+ */
+export function getImageUrl(url: string) {
+  return realApi.get({
+    url,
+  });
+}
+/**
+ * 查询历史会话
+ */
+export function getImageConversations() {
+  return realApi.get({
+    url: "/api/createImage/list",
+  });
+}
+
+/**
+ * 根据当前会话查看对话记录
+ */
+export function getImageConversationById(
+  conversationId: string
+): Promise<ImageConversationMesg[]> {
+  return realApi.get({
+    url: "/api/createImage/getConversationIdByList",
+    params: { conversationId },
+  });
+}
+
+/**
+ * 删除会话
+ */
+export function deleteImageConversation(conversationsId: string) {
+  return realApi.del({
+    url: `/api/createImage/delete?conversationsId=${conversationsId}`,
+  });
+}
+
+/**
+ * 终止会话
+ */
+export function stopImageConversation(conversationsId: string) {
+  return realApi.post({
+    url: "/api/createImage/stop",
+    params: { conversationsId },
+  });
+}
+
+/**
+ * 修改标题
+ */
+export function updateImageTitle(data: { messageId: string; message: string }) {
+  const { message, messageId } = data;
+  return realApi.put({
+    url: `/api/createImage/updatePictureDialogue?messageId=${messageId}&message=${message}`,
+    params: data,
+  });
+}
+
+// 数据部分的接口
+interface CreateImageData {
+  id: number;
+  conversationsId: string;
+  message: string;
+  sentAt: string | null;
+  number: number;
+  pictureDialogueItemList: PictureDialogueItem[];
+  taskId: string;
+}
+
+// 图片对话项的接口
+export interface PictureDialogueItem {
+  id: number;
+  pictureDialogueId: number;
+  imagesId: number;
+  url: string;
+  taskId: string | null;
+}

+ 96 - 0
src/api/aiSVG.ts

@@ -0,0 +1,96 @@
+import useSVGConversationStore from "@/stores/svgConversation";
+import { SVGConversationItem } from "@/types/svgConversation";
+import { realApi } from "@/utils/request.ts";
+
+/**
+ * 生成SVG图片
+ * @param {Object} data - 请求体数据
+ * @param {string} data.text - 待发送的文本关键词
+ * @param {string} data.conversationId - 待发送的会话ID;如果为空,则创建新对话
+ * @param {string} data.width - 响应的图片宽度
+ * @param {string} data.height - 响应的图片高度
+ * @param {File} data.file - 需要修改的上传的文件
+ * @param {string} data.type - 图片类型
+ */
+export function createSVG(data: {
+  text: string;
+  conversationId?: string;
+  width: string;
+  height: string;
+  file: File;
+  type: string;
+}) {
+  return realApi.post({
+    url: "/svg/create",
+    data,
+  });
+}
+
+/**
+ * 查询历史会话
+ */
+export function getSVGConversations(): Promise<SVGConversationItem[]> {
+  return realApi.get({
+    url: "/svg/history/messages",
+  });
+}
+
+/**
+ * 根据当前会话查看对话记录
+ */
+export function getSVGConversationById(conversationId: string) {
+  return realApi.get({
+    url: "/svg/getScholarSvgList",
+    params: { conversationId },
+  });
+}
+
+/**
+ * 删除会话
+ */
+export function deleteSVGConversation(conversationsId: string) {
+  return realApi.del({
+    url: `/svg/deleteScholarSvg?conversationsId=${conversationsId}`,
+  });
+}
+
+/**
+ * 终止会话
+ */
+export function stopSVGConversation(conversationsId: string) {
+  return realApi.post({
+    url: "/svg/stop",
+    params: { conversationsId },
+  });
+}
+
+/**
+ * 修改标题
+ */
+export function updateSVGTitle(data: { messageId: string; message: string }) {
+  const { message, messageId } = data;
+  return realApi.put({
+    url: `/api/createSVG/updatePictureDialogue?messageId=${messageId}&message=${message}`,
+    params: data,
+  });
+}
+
+// 数据部分的接口
+interface CreateSVGData {
+  id: number;
+  conversationsId: string;
+  message: string;
+  sentAt: string | null;
+  number: number;
+  pictureDialogueItemList: PictureDialogueItem[];
+  taskId: string;
+}
+
+// 图片对话项的接口
+export interface PictureDialogueItem {
+  id: number;
+  pictureDialogueId: number;
+  SVGsId: number;
+  url: string;
+  taskId: string | null;
+}

+ 192 - 0
src/api/conversation.ts

@@ -0,0 +1,192 @@
+import { userStore } from "@/stores/user";
+import { realApi } from "@/utils/request.ts";
+import axios from "axios";
+
+// 定义 API 响应的接口
+interface ApiResponse<T = any> {
+  code: number;
+  message: string;
+  data: T;
+}
+
+// 请求参数接口
+interface ConversationData {
+  conversationId?: string;
+  userMessage?: string;
+  Authorization?: string;
+}
+
+export interface Conversation {
+  conversationId: string;
+  userId: number;
+  startedAt: string;
+  endedAt: string | null;
+  messageId: number;
+  status: "ongoing" | "completed" | "cancelled";
+  messages: string;
+  messageList: Message[] | null;
+}
+export interface SSEData {
+  // event: string;
+  // conversation_id: string;
+  // message_id: string;
+  // created_at: number;
+  // task_id: string;
+  // id: string;
+  // answer: string;
+  // from_variable_selector: string | null;
+  id:string;//消息id
+  conversationId:string;//会话ID
+  content:string;//内容,json格式的字符串
+  role:1|2;//角色,1用户,2ai
+  timestamp:string;//时间戳
+  status:number;//状态,0最终状态,1分析涉及的数据表,2组织sql,3查询数据,4处理数据
+}
+
+// 消息类型
+export interface Message {
+  text: string;
+  sender: "user" | "ai"; // 消息发送者
+  sentAt: string; // ISO 8601 格式的字符串表示日期和时间
+}
+
+/**
+ * 获取单个会话的所有信息
+ */
+export const getConversationHistory = (conversationId: string) => {
+  return axios.get(import.meta.env.VITE_API_BASE_URL + "/ai/message",{
+    headers:{
+      Authorization:"Bearer " + userStore().token,
+      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e"
+    },
+    params:{
+      conversationId
+    }
+  }).then(res=>{
+    let list = res.data.data.data.list;
+    return list;
+  });
+  // return realApi.get({
+  //   url: "/message/getList",
+  //   params: { conversationId },
+  // });
+};
+
+/**
+ * 文生文,发送消息
+ * @param conversationId string
+ * @param userMessage string
+ * @param onMessage function
+ * @returns Promise<string | undefined>
+ */
+export const sendMessage = async (
+  conversationId: string,
+  userMessage: string,
+  onMessage: (text: string) => void,
+  getId: (taskId: string, conversationId: string) => void
+): Promise<string | undefined> => {
+  const token = userStore().token;
+  const response = await fetch(
+    import.meta.env.VITE_API_BASE_URL + `/ai?conversationId=${conversationId}&content=${userMessage}`,
+    {
+      method: "GET",
+      headers: {
+        "Content-Type": "application/json",
+        Accept: "text/event-stream",
+        Authorization: `Bearer ${token}`,
+        clientid:'e5cd7e4891bf95d1d19206ce24a7b32e'
+      },
+      // body: JSON.stringify({
+      //   inputs: {},
+      //   query: userMessage,
+      //   response_mode: "streaming",
+      //   conversation_id: conversationId,
+      // }),
+    }
+  );
+
+  const reader = response.body?.getReader();
+  const decoder = new TextDecoder();
+
+  if (!reader) return;
+
+  let buffer = "";
+  let taskIdAssigned = false; // 标志位,确保只赋值一次
+
+  while (true) {
+    const { value, done } = await reader.read();
+    if (done) break;
+    console.log(buffer)
+    buffer += decoder.decode(value, { stream: true });
+    
+    // 按行解析 SSE
+    const lines = buffer.split("\n");
+    buffer = lines.pop() || ""; // 保留未完整解析的部分
+
+    for (const line of lines) {
+      // onMessage(line.replace("data:", "").trim());
+      if (line.startsWith("data:")) {
+        let data = line.replace("data:", "").trim();
+        try {
+          const jsonData: SSEData = JSON.parse(data);
+          onMessage(data);
+          // if (jsonData.content) {
+          //   onMessage(jsonData.content); // 逐步更新 UI
+          // }
+
+          // 只在第一次遇到 conversation_id 时赋值
+          if (jsonData.conversationId && !taskIdAssigned) {
+            taskIdAssigned = true; // 赋值后标记为已赋值
+            getId(jsonData.task_id, jsonData.conversationId); // 获取 taskId 和 conversationId
+          }
+        } catch (error) {
+          console.error("JSON 解析失败", error);
+        }
+      }
+    }
+  }
+};
+
+// 删除会话消息 (DELETE /api/conversations/delete/messages)
+export const deleteMessages = (conversationId: string) => {
+  return realApi.del({
+    url: "/api/conversations/delete/messages?conversationId=" + conversationId,
+  });
+};
+
+/**
+ * 获取所有的会话
+ *
+ */
+export const getConversationList = async (): Promise<Conversation[]> => {
+  return axios.get(import.meta.env.VITE_API_BASE_URL + "/ai/conversation/history",{
+    headers:{
+      Authorization:"Bearer " + userStore().token,
+      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e"
+    }
+  }).then(res=>{
+    let list  =res.data.data.data.list;
+    return list;
+  });
+  // return await realApi.get({
+  //   url: "/api/conversations/history/messages",
+  // });
+};
+
+/**
+ * 终止会话
+ * @param taskId string
+ */
+export const abortConversation = (taskId: string) => {
+  return realApi.put({
+    url: "/api/conversations/stop",
+    params: { taskId },
+  });
+};
+
+export const updateConversationTitle = (messageId: number, message: string) => {
+  return realApi.put({
+    url: "/message/edit",
+    data: { messageId, message },
+  });
+};

+ 15 - 0
src/api/design.ts

@@ -0,0 +1,15 @@
+import { mallApi } from "@/utils/request.ts";
+
+/**
+ * 获取商品数据
+ */
+export const fetchProductList = (params: {pageNo: number, pageSize: number}): Promise<string> => {
+    try {
+        return mallApi.get({
+            url: "/product/getProductAndModel",
+            params
+        });
+    } catch (error) {
+        throw error;
+    }
+};

+ 310 - 0
src/api/product.ts

@@ -0,0 +1,310 @@
+import {mallApi} from "@/utils/request.ts";
+
+
+export interface PriceDetailList {
+    id: string
+    maxQuantity: number
+    minQuantity: number
+    pricePerItem: number
+    productId: string
+    unit: string
+}
+
+export interface StoreInfo {
+    id: string;
+    name: string;
+    logo: string;
+}
+
+export interface AttrValueItem {
+    name: string;
+    imgUrl: string;
+}
+
+export interface ProductSku {
+    attributeName: string
+    price: number;
+    stock: number;
+    val:string;
+    value: string | string [];
+    list: AttrValueItem[]
+    id: string;
+    selectIndex: number;
+    productAttribute: Object,
+    activeAttr: Boolean
+}
+
+/**
+ * @Description: 构建商品详情
+ * @author:汪明
+ * @date 2024/4/1 11:10
+ */
+export class ProductInfo {
+    readonly id = '';
+    readonly name = ''; // 商品名称
+    readonly msrp: string = '0'; // 建议售价
+    readonly pic: string = ''; // 商品主图
+    readonly albumPic: string[] = [];
+    readonly detailMobile: string[] = [];
+    readonly bindModelStatus:boolean = false
+    readonly store: StoreInfo = { // 商品所在店铺信息
+        id: '',
+        name: '',
+        logo: ''
+    }
+    readonly productCommodityPriceDetailList: PriceDetailList[] = []; // 商品区间价格
+    readonly productSkuList: ProductSku[] = []
+    readonly productThreeDSkuList: ProductSku[] = []
+    readonly modelId = '';
+
+    constructor(data?: any) {
+        if (data) {
+            console.log(data);
+            this.id = data.id;
+            this.name = data.name || '';
+            this.msrp = (data.msrp || 0).toFixed(2);
+            this.albumPic = [data.pic, ...data.albumPic] || []
+            this.store = data.store || this.store;
+            this.productCommodityPriceDetailList = data.productCommodityPriceDetailList || [];
+            this.detailMobile = data.detailMobile ? this.stringToArray(data.detailMobile) : [];
+            this.bindModelStatus = data.bindModelStatus;
+            this.productSkuList = this.transformSku(data.productAttributeValueList) || []
+            this.productThreeDSkuList = this.transformSku(data.product3dAttributeValueList) || []
+            this.modelId = data.modelId
+            console.log('this.productSkuList=', this.productSkuList);
+        }
+    }
+
+    private stringToArray(str: string, symbol: string = ','): string [] {
+        if (str) {
+            return str.split(symbol)
+        } else {
+            return []
+        }
+    }
+
+    private transformSku(data: ProductSku[]): ProductSku[] {
+        const limitedData = data.slice(0, 3); // 只取前三个元素
+        return limitedData.map(item => {
+            const values = this.stringToArray(item.value as string);
+            let transformedValue: AttrValueItem[] = values.map(val => {
+                const strList: string[] = this.stringToArray(val, '_');
+                return {
+                    name: strList[0],
+                    imgUrl: strList[1] ? strList[1] : ''
+                }
+            });
+            return {
+                ...item,
+                selectIndex: 0,
+                val:transformedValue[0].name,
+                activeAttr: true,
+                list: transformedValue
+            };
+        });
+    }
+}
+
+
+/**
+ * 获取产品分类
+ * @returns 产品分类的 Promise
+ */
+export interface CateList {
+    id: string,
+    name: string
+}
+
+export const getCateList = (): Promise<CateList[]> => {
+    try {
+        return mallApi.get<CateList[]>({
+            url: '/public/getAll',
+            config: {requireToken: false}
+        })
+    } catch (error) {
+        throw error
+    }
+};
+
+
+/**
+ * 获取全部周边产品
+ * @returns 全部周边产品的 Promise
+ */
+export interface GetAroundData {
+    count: string,
+    list: AroundList[]
+}
+
+export interface AroundList {
+    id: string,
+    name: string,
+    pic: string,
+    price: string
+}
+export const getAroundList = (cateId: string, pageNo: number, pageSize: number): Promise<GetAroundData> => {
+    try {
+        return mallApi.get<GetAroundData>({
+            url: `/public/getAllList`,
+            config: {requireToken: false},
+            params: {
+                categoryId: cateId,
+                pageNo,
+                pageSize
+            }
+        })
+    } catch (error) {
+        throw error
+    }
+}
+
+// 获取3d设计页面的商品分类数据
+export const getThreeDAroundList = (params: any) :Promise<GetAroundData> => {
+   try {
+       return mallApi.get<GetAroundData>({
+           url: `/public/getAllList`,
+           config: {requireToken: false},
+           params
+       })
+   } catch (error) {
+       throw error
+   }
+}
+
+/**
+ * 获取爆款推荐
+ * @returns 爆款推荐的 Promise
+ */
+export interface RecomendationList {
+    id: string,
+    name: string,
+    pic: string,
+    url: string
+    price: number,
+    storeId: string
+}
+
+export const getRecommendationList = (): Promise<RecomendationList[]> => {
+    try {
+        return mallApi.get<RecomendationList[]>({
+            url: '/public/getHomeList',
+            config: {requireToken: false}
+        })
+    } catch (error) {
+        throw error;
+    }
+};
+
+/**
+ * 获取商品详情页内容
+ * @returns 爆款推荐的 Promise
+ */
+export const getProductDetail = (productId: string): Promise<ProductInfo> => {
+    try {
+        return mallApi.get<ProductInfo>({
+            url: `/product/${productId}`,
+            config: {requireToken: false}
+        })
+    } catch (error) {
+        throw error;
+    }
+};
+
+/**
+ * @Description: 商品详情页商品推荐
+ * @author:翁庚荣
+ * @date 2024/3/19 14:52
+ * @returns Promise
+ */
+export const getProductRecommend = (productId: string): Promise<AroundList[]> => {
+    try {
+        return mallApi.get<AroundList[]>({
+            url: `/product/recommend/${productId}`,
+            config: {requireToken: false}
+        })
+    } catch (error) {
+        throw error;
+    }
+}
+
+/**
+ * @Description: 根据商品名称获取商品列表数据
+ * @author:陈宇颢
+ * @date 2024/4/2 17:02
+ * @returns Promise
+ */
+export interface SearchQueryKey {
+    pageNo: number,
+    pageSize: number,
+    total: number,
+    key: string
+}
+
+export const getProductByName = (data: SearchQueryKey): Promise<GetAroundData> => {
+    try {
+        return mallApi.get<GetAroundData>({
+            url: `/product/list`,
+            config: {requireToken: false},
+            params: {
+                pageNo: data.pageNo,
+                key: data.key,
+                pageSize: data.pageSize
+            }
+        })
+    } catch (error) {
+        throw error;
+    }
+}
+
+/**
+ * @Description: 根据商品ID,获取3d模型数据
+ * @author:汪明
+ * @date 2024/4/19 9:21
+ * @param {string}  productId 商品id
+ * @param {string}  storeId 店铺id
+ * @returns Promise<GetAroundData>
+ */
+export const getModelDetail = (productId: string, storeId: string) => {
+    try {
+        return mallApi.get({
+            url: `/product/model/${productId}`,
+            config: {
+                requireToken: false,
+                Tenant: storeId
+            }
+        })
+    } catch (error) {
+        throw error
+    }
+}
+
+/**
+ * @Description: 查询设计界面我的图库
+ * @author:翁庚荣
+ * @date 2024/5/21 15:54
+ */
+export const getLibraryImages = (data: any) => {
+    try {
+        return mallApi.get({
+            url: `/album/pic/list`,
+            params: data
+        })
+    } catch (error) {
+
+    }
+}
+/**
+ * @Description: 删除我的图库的图片
+ * @author:翁庚荣
+ * @date 2024/5/21 15:54
+ * @param {string}  id 图片id
+ */
+
+export const deleteLibraryImageById = (id: string) => {
+    try {
+        return mallApi.get({url: `/album/pic/${id}`})
+    } catch (error) {
+        throw error
+    }
+}
+

+ 255 - 0
src/api/user.ts

@@ -0,0 +1,255 @@
+import { PhonePasswordInfo } from "@/enums/verification.ts";
+import {realApi, threeRealApi} from "@/utils/request.ts";
+import axios from "axios";
+
+export class Address {
+  province = "";
+  city = "";
+  country = "";
+
+  constructor(obj?: Partial<Address>) {
+    console.log("obj=", obj);
+    if (obj) {
+      this.province = obj.province || "";
+      this.city = obj.city || "";
+      this.country = obj.country || "";
+    }
+  }
+
+  toString() {
+    console.log(this);
+    return `{"province":"${this.province}","city":"${this.city}", "country":"${this.country}"}`;
+  }
+}
+
+export class UserInfo {
+  readonly id: number = 0;
+  readonly name: string = "";
+  readonly avatar: string = "";
+  readonly gender: number = 0;
+  readonly phone: string = "";
+  readonly address!: Address;
+}
+
+/**
+ * 用户账户登录
+ * @param data 登录请求数据
+ * @returns 登录请求的 Promise
+ */
+export const login = (data: any): Promise<string> => {
+  data.clientId = 'e5cd7e4891bf95d1d19206ce24a7b32e';
+  data.grantType = 'password';
+  try {
+    return axios.post('http://localhost:8080/auth/login',data).then(res=>{
+      return res.data
+    });
+    // return instanceReal.post('/auth/login',data);
+    // return realApi.post({
+    //   url: "/auth/login",
+    //   data,
+    // });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 手机验证码登录
+ * @param data 手机验证码登录请求数据
+ * @returns 手机验证码登录请求的 Promise
+ */
+export const phoneLogin = (data: object): Promise<string> => {
+  try {
+    return realApi.post<string>({
+      url: "/user/phoneLogin",
+      data,
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 发送验证码
+ * @param data 发送验证码请求数据
+ * @returns 发送验证码请求的 Promise
+ */
+export const sendCode = (data: object) => {
+  try {
+    return realApi.post({
+      url: "/user/authCode",
+      data,
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 获取用户信息
+ * @returns 获取用户信息请求的 Promise
+ */
+export const getUserInfo = (): Promise<UserInfo> => {
+  try {
+    return realApi.get<UserInfo>({
+      url: "/user/info",
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 注册用户
+ * @param data 发送验证码请求数据
+ * @returns 获取用户信息请求的 Promise
+ */
+export const register = (data: PhonePasswordInfo) => {
+  try {
+    return realApi.post({
+      url: "/user/register",
+      data,
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 重置密码
+ * @param data 发送验证码请求数据
+ * @returns 获取用户信息请求的 Promise
+ */
+export const resetPassword = (data: PhonePasswordInfo) => {
+  try {
+    return realApi.put({
+      url: "/user/forgetPassword",
+      data,
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 提交用户信息
+ * @param data 用户信息的数据
+ * @returns 提交用户信息请求的 Promise
+ */
+
+export const submitUserInfo = (data: object) => {
+  try {
+    return realApi.put({
+      url: "/user/info",
+      data,
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 更改用户手机号码
+ * @param data 用户手机号码的数据
+ * @returns 更改用户手机号码请求的 Promise
+ */
+
+export const submitPhoneInfo = (data: object) => {
+  try {
+    return realApi.put({
+      url: "/user/phone",
+      data,
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * 修改用户密码
+ * @param data 用户密码的数据
+ * @returns 更改用户密码请求的 Promise
+ */
+
+export const sumbitChangePassword = (data: object) => {
+  try {
+    return realApi.put({
+      url: "/user/resetPassword",
+      data,
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * @Description: 获取sdk Token
+ * @author:翁庚荣
+ * @date 2024/4/29 15:27
+ * @param {string} appId
+ * @param {string} appSecret
+ */
+interface AccessTokenInfo {
+  accessToken: string;
+  expiration: string;
+}
+export const getAccessToken = (
+  appId: string,
+  appSecret: string
+): Promise<AccessTokenInfo> => {
+  try {
+    return threeRealApi.get<AccessTokenInfo>({
+      url: "/api/getAccessToken",
+      params: {
+        appId,
+        appSecret,
+      },
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * @Description: 微信绑定验证
+ * @author:汪明
+ * @date 2024/5/6 19:11
+ * @param {string} code
+ */
+export class WechatTokenWrapper {
+  token?: string;
+  openId = "";
+  type = "";
+  message = "";
+}
+
+export const wechatLogin = async (
+  code?: string
+): Promise<WechatTokenWrapper> => {
+  try {
+    const scope = "snsapi_login";
+    return realApi.get<WechatTokenWrapper>({
+      url: "/oauth/wechat",
+      params: {
+        code,
+        scope,
+      },
+    });
+  } catch (error) {
+    throw error;
+  }
+};
+
+/**
+ * @Description: 手机号绑定微信
+ * @author:汪明
+ * @date 2024/5/6 20:19
+ * @param {object} data
+ */
+
+export const bindPhone = (data: object) => {
+  return realApi.post({
+    url: "/oauth/bindPhone",
+    data,
+  });
+};

BIN
src/assets/components/common/login/SMS-icon.png


BIN
src/assets/components/common/login/account-icon.png


BIN
src/assets/components/common/login/wx-icon.png


BIN
src/assets/dear.png


+ 3 - 0
src/assets/imageGeneraterView/design.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.99637 12.3125C9.83642 12.1667 10.5006 11.7188 10.989 10.9688L15.7069 3.15625C15.9023 2.84378 15.9805 2.51045 15.9414 2.15625C15.8828 1.80212 15.7363 1.50001 15.5018 1.24994C15.2283 0.999939 14.9255 0.86455 14.5934 0.84375C14.2808 0.82295 13.978 0.927116 13.685 1.15625L6.73991 6.68756C6.01708 7.29169 5.64589 8.08333 5.62636 9.0625L8.99637 12.3125ZM8.43956 13.125L5.04031 9.84375C4.14166 9.90625 3.38953 10.2604 2.78391 10.9062C2.19783 11.5729 1.89497 12.3854 1.87543 13.3438C1.87543 13.4688 1.88525 13.5938 1.90479 13.7188C1.92432 13.9896 1.85594 14.2396 1.69965 14.4688C1.54336 14.6979 1.33822 14.8229 1.08426 14.8438H0.937717C0.66421 14.8438 0.439551 14.9375 0.263726 15.125C0.0879021 15.3125 0 15.5521 0 15.8438C0 16.1354 0.0879021 16.375 0.263726 16.5625C0.439551 16.75 0.66421 16.8438 0.937717 16.8438H5.1575C6.09523 16.8229 6.86693 16.4792 7.47255 15.8125C8.0977 15.1667 8.42002 14.3438 8.43956 13.3438C8.43956 13.3021 8.43956 13.2604 8.43956 13.2188C8.43956 13.1771 8.43956 13.1458 8.43956 13.125Z" fill="black"/>
+</svg>

+ 3 - 0
src/assets/imageGeneraterView/edit.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0.4375 15.3125C0.145833 15.0208 0 14.6667 0 14.25C0 13.8542 0.145833 13.5 0.4375 13.1875L12.3438 1.28125C12.6563 0.989583 13.0104 0.84375 13.4062 0.84375C13.8021 0.84375 14.1563 0.989583 14.4688 1.28125L15.5625 2.37494C15.8542 2.66667 16 3.02089 16 3.43756C16 3.83336 15.8542 4.18747 15.5625 4.49994L3.65625 16.4062C3.34375 16.6979 2.98958 16.8438 2.59375 16.8438C2.17708 16.8438 1.82292 16.6979 1.53125 16.4062L0.4375 15.3125ZM10.875 6.71875L14.1562 3.43756L13.4062 2.68756L10.125 5.96875L10.875 6.71875Z" fill="black"/>
+</svg>

+ 10 - 0
src/assets/imageGeneraterView/imageGeneraterIcon.svg

@@ -0,0 +1,10 @@
+<svg width="128" height="129" viewBox="0 0 128 129" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_831_58)">
+<path d="M113.529 56.0855C114.575 56.5839 115.463 57.3625 116.093 58.3349C116.724 59.3073 117.073 60.4353 117.101 61.5938C117.129 62.7524 116.835 63.896 116.253 64.8978C115.67 65.8996 114.821 66.7203 113.8 67.2689L80.1072 85.3552L65.0655 117.586C64.4326 118.953 63.3286 120.046 61.9556 120.664C60.5826 121.283 59.0327 121.386 57.5898 120.955L56.7232 120.616C55.4262 120.01 54.3758 118.978 53.7465 117.692L37.4311 84.368L3.72282 69.3186C2.34854 68.7084 1.23935 67.6245 0.597483 66.2647C-0.0443832 64.9049 -0.176173 63.3597 0.226142 61.9108L0.550188 61.0442C1.17434 59.6396 2.29265 58.5133 3.69268 57.8791L38.3957 42.2043L51.7721 8.19454C52.3194 6.79561 53.3507 5.63967 54.6785 4.93707C56.0062 4.23448 57.5421 4.03192 59.0066 4.36628L59.8883 4.64511C61.3297 5.21082 62.5108 6.28993 63.2041 7.67456L79.2557 39.8154L113.529 56.0931V56.078V56.0855ZM101.215 61.9636L73.0687 48.6249L71.4108 47.8336L70.5893 46.1908L58.0646 21.1488L47.4916 48.1049L46.7004 50.1095L44.7335 50.9987L16.8731 63.5687L43.5202 75.4755L45.2685 76.2517L46.1201 77.985L59.2929 104.881L71.245 79.2736L71.9835 77.6836L73.5284 76.8471L101.215 61.9786V61.9711V61.9636ZM11.613 111.844L3.11241 108.053L11.613 104.21C13.9023 103.175 15.6975 101.288 16.6168 98.95L19.8573 90.7057L23.9493 98.9048C24.9064 100.826 26.4889 102.371 28.4332 103.298L37.1975 107.458L28.4784 112.145C26.6457 113.126 25.1787 114.672 24.296 116.554L20.4526 124.791L16.3531 116.411C15.3597 114.385 13.6878 112.772 11.628 111.852L11.613 111.844ZM98.3141 98.1135L89.8135 94.3154L98.3216 90.4721C100.605 89.4392 102.397 87.5581 103.318 85.227L106.558 76.9827L110.65 85.1668C111.608 87.0884 113.19 88.6333 115.134 89.5602L123.899 93.7276L115.172 98.3999C113.341 99.3836 111.877 100.933 110.997 102.816L107.154 111.06L103.054 102.673C102.061 100.647 100.389 99.0334 98.3292 98.1135H98.3141Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0_831_58">
+<rect width="128" height="128" fill="white" transform="translate(0 0.5)"/>
+</clipPath>
+</defs>
+</svg>

+ 3 - 0
src/assets/imageGeneraterView/pencil.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.8385 9.27694L13.214 9.62089L12.1498 10.684L10.209 12.6227L9.14478 13.6858L8.7691 13.3418L8.08046 12.6227L1.85134 6.40016C1.51745 6.06663 1.27748 5.68098 1.1314 5.24322L0.0357746 1.45971C-0.0476981 1.18871 0.0149034 0.948986 0.223585 0.740528C0.432267 0.53207 0.682736 0.45911 0.97489 0.521648L4.73117 1.64732C5.19026 1.77239 5.58674 2.0017 5.92064 2.33523L12.1498 8.55776L12.8385 9.27694ZM5.01288 4.02374L4.73117 3.30456C4.60596 3.20033 4.47026 3.12737 4.32418 3.08568L1.85134 2.3665L2.57128 4.80546C2.63388 4.95138 2.70692 5.08687 2.79039 5.21195L3.51034 5.49337V4.49277C3.5312 4.20093 3.69815 4.03416 4.01116 3.99247H5.01288V4.02374ZM11.3673 15.9058L10.8976 15.4681L10.209 14.749L9.83342 14.4049L10.8976 13.3418L12.8385 11.4031L13.9027 10.3401L14.247 10.684L14.967 11.4031L15.4364 11.8409C15.8121 12.2578 16 12.7373 16 13.2793C16 13.8004 15.8121 14.2695 15.4364 14.6864L14.1844 15.9058C13.788 16.3019 13.3184 16.5 12.7758 16.5C12.2541 16.5 11.7846 16.3019 11.3673 15.9058ZM9.86472 10.6527L5.3572 6.15001C5.12766 5.9624 4.89805 5.9624 4.6685 6.15001C4.45982 6.40016 4.45982 6.63988 4.6685 6.86919L9.17608 11.3719C9.40563 11.5595 9.63518 11.5595 9.86472 11.3719C10.0734 11.1426 10.0734 10.9028 9.86472 10.6527Z" fill="black"/>
+</svg>

+ 3 - 0
src/assets/imageGeneraterView/picture.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="15" viewBox="0 0 16 15" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 2.84375C0.0208333 2.28122 0.21875 1.81249 0.59375 1.43756C0.96875 1.06249 1.4375 0.86455 2 0.84375H14C14.5625 0.86455 15.0313 1.06249 15.4062 1.43756C15.7813 1.81249 15.9792 2.28122 16 2.84375V12.8438C15.9792 13.4062 15.7813 13.875 15.4062 14.25C15.0313 14.625 14.5625 14.8229 14 14.8438H2C1.4375 14.8229 0.96875 14.625 0.59375 14.25C0.21875 13.875 0.0208333 13.4062 0 12.8438V2.84375ZM10.125 6.1875C9.95833 5.95833 9.75 5.84375 9.5 5.84375C9.22917 5.84375 9.02083 5.95833 8.875 6.1875L6.15625 10.1562L5.34375 9.125C5.17708 8.9375 4.97917 8.84375 4.75 8.84375C4.52083 8.84375 4.32292 8.9375 4.15625 9.125L2.15625 11.625C1.98958 11.875 1.95833 12.1354 2.0625 12.4062C2.20833 12.6771 2.4375 12.8229 2.75 12.8438H5.75H13.25C13.5417 12.8438 13.7604 12.7083 13.9062 12.4375C14.0313 12.1667 14.0209 11.9167 13.875 11.6875L10.125 6.1875ZM3.5 5.84375C4.0625 5.82292 4.5 5.57292 4.8125 5.09375C5.0625 4.59375 5.0625 4.09375 4.8125 3.59375C4.5 3.11455 4.0625 2.86455 3.5 2.84375C2.9375 2.86455 2.5 3.11455 2.1875 3.59375C1.9375 4.09375 1.9375 4.59375 2.1875 5.09375C2.5 5.57292 2.9375 5.82292 3.5 5.84375Z" fill="black"/>
+</svg>

BIN
src/assets/logo.png


+ 3 - 0
src/assets/tabBar/Chat.svg

@@ -0,0 +1,3 @@
+<svg width="18" height="15" viewBox="0 0 18 15" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.8307 10.2312C7.4257 10.1947 8.75671 9.72077 9.82571 8.80927C10.8947 7.91607 11.4467 6.78587 11.4837 5.41867C11.4467 4.05147 10.8947 2.92127 9.82571 2.02807C8.75671 1.11657 7.4257 0.642671 5.8307 0.606171C4.2367 0.642671 2.90572 1.11657 1.83672 2.02807C0.767716 2.92127 0.214711 4.05147 0.178711 5.41867C0.196711 6.49417 0.559717 7.43297 1.26572 8.23507C1.15672 8.50857 1.0217 8.73637 0.858704 8.91867C0.731704 9.08277 0.613715 9.21037 0.504715 9.30147C0.450715 9.35617 0.414713 9.39257 0.396713 9.41087C0.377713 9.42907 0.368713 9.43817 0.368713 9.43817H0.341705C0.196705 9.56577 0.151704 9.72977 0.205704 9.93037C0.278704 10.1127 0.414708 10.213 0.613708 10.2312C1.22971 10.213 1.79171 10.1036 2.29871 9.90307C2.55171 9.79367 2.77871 9.68427 2.97771 9.57497C3.82971 9.99427 4.7807 10.213 5.8307 10.2312ZM12.3527 5.41867C12.2987 6.98637 11.7187 8.28067 10.6137 9.30147C9.49071 10.3224 8.1137 10.9148 6.4837 11.0789C6.8277 12.1179 7.48871 12.9565 8.46671 13.5945C9.44571 14.2507 10.5957 14.588 11.9177 14.6062C12.9687 14.588 13.9207 14.3692 14.7717 13.95C14.9707 14.0593 15.1977 14.1687 15.4507 14.2781C15.9577 14.4786 16.5197 14.588 17.1357 14.6062C17.3347 14.588 17.4707 14.4877 17.5427 14.3054C17.5977 14.1048 17.5427 13.9408 17.3797 13.8132V13.7859C17.3617 13.7859 17.3527 13.7859 17.3527 13.7859C17.3347 13.7676 17.2987 13.7311 17.2447 13.6765C17.1357 13.5854 17.0177 13.4578 16.8907 13.2937C16.7277 13.0932 16.5927 12.8653 16.4837 12.6101C17.1897 11.808 17.5517 10.8692 17.5707 9.79367C17.5337 8.49937 17.0267 7.40567 16.0487 6.51247C15.0707 5.61917 13.8297 5.10877 12.3257 4.98117C12.3437 5.12707 12.3527 5.27287 12.3527 5.41867Z" fill="black"/>
+</svg>

+ 3 - 0
src/assets/tabBar/Create.svg

@@ -0,0 +1,3 @@
+<svg width="19" height="14" viewBox="0 0 19 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M1.15328 12.6602C0.836497 12.405 0.67749 12.0951 0.67749 11.7305C0.67749 11.3842 0.836497 11.0742 1.15328 10.8008L14.0954 0.382799C14.4358 0.127599 14.8209 0 15.2507 0C15.6806 0 16.0657 0.127599 16.4048 0.382799L17.5937 1.3398C17.9117 1.5951 18.0695 1.905 18.0695 2.2695C18.0695 2.6159 17.9117 2.9258 17.5937 3.1992L4.65157 13.6172C4.31242 13.8724 3.9273 14 3.49746 14C3.04527 14 2.66017 13.8724 2.34215 13.6172L1.15328 12.6602ZM12.4991 5.1406L16.0657 2.2695L15.2507 1.6133L11.6841 4.4844L12.4991 5.1406Z" fill="#6B7280"/>
+</svg>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
src/assets/tabBar/Else.svg


+ 3 - 0
src/assets/tabBar/Picture.svg

@@ -0,0 +1,3 @@
+<svg width="15" height="13" viewBox="0 0 15 13" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0.928223 1.75C0.946223 1.2578 1.11923 0.847599 1.44823 0.519499C1.77623 0.191399 2.18622 0.0182 2.67822 0H13.1782C13.6702 0.0182 14.0802 0.191399 14.4082 0.519499C14.7372 0.847599 14.9102 1.2578 14.9282 1.75V10.5C14.9102 10.9922 14.7372 11.4023 14.4082 11.7305C14.0802 12.0586 13.6702 12.2318 13.1782 12.25H2.67822C2.18622 12.2318 1.77623 12.0586 1.44823 11.7305C1.11923 11.4023 0.946223 10.9922 0.928223 10.5V1.75ZM9.78722 4.6758C9.64222 4.4753 9.45922 4.375 9.24022 4.375C9.00322 4.375 8.82123 4.4753 8.69423 4.6758L6.31522 8.1485L5.60422 7.2461C5.45822 7.082 5.28523 7 5.08423 7C4.88323 7 4.71022 7.082 4.56522 7.2461L2.81522 9.4336C2.66922 9.6523 2.64222 9.8802 2.73322 10.1172C2.86022 10.3542 3.06123 10.4818 3.33423 10.5H5.95923H12.5222C12.7772 10.5 12.9692 10.3815 13.0962 10.1446C13.2052 9.9076 13.1962 9.6888 13.0692 9.4883L9.78722 4.6758ZM3.99022 4.375C4.48322 4.3568 4.86622 4.1381 5.13922 3.7188C5.35822 3.2813 5.35822 2.8438 5.13922 2.4063C4.86622 1.987 4.48322 1.7682 3.99022 1.75C3.49822 1.7682 3.11522 1.987 2.84222 2.4063C2.62322 2.8438 2.62322 3.2813 2.84222 3.7188C3.11522 4.1381 3.49822 4.3568 3.99022 4.375Z" fill="#6B7280"/>
+</svg>

BIN
src/assets/user.jpeg


+ 69 - 0
src/components/AiChat/ChatPromptInput.vue

@@ -0,0 +1,69 @@
+<template>
+  <div class="chat-prompt-input">
+    <input type="text" class="input-box" placeholder="请输入..." v-model="inputText" @keyup.enter="handleSend" />
+    <button class="send-button" @click="handleSend">发送</button>
+  </div>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+
+const inputText = ref('')
+const emit = defineEmits(['send'])
+
+const handleSend = () => {
+  if (inputText.value.trim()) {
+    emit('send', inputText.value)
+    inputText.value = ''
+  }
+}
+</script>
+
+<style scoped>
+.chat-prompt-input {
+  position: fixed;
+  bottom: 0;
+  left: 50%;
+  transform: translateX(-50%);
+  width: 928px;
+  height: 74.01px;
+  display: flex;
+  align-items: center;
+  padding: 10px;
+  background-color: #fff;
+  border-radius: 8px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.input-box {
+  flex: 1;
+  height: 100%;
+  padding: 0 15px;
+  border: 1px solid #e0e0e0;
+  border-radius: 6px;
+  font-size: 14px;
+  outline: none;
+  transition: border-color 0.3s;
+}
+
+.input-box:focus {
+  border-color: #1a73e8;
+}
+
+.send-button {
+  margin-left: 10px;
+  padding: 0 20px;
+  height: 100%;
+  background-color: #1a73e8;
+  color: white;
+  border: none;
+  border-radius: 6px;
+  cursor: pointer;
+  font-size: 14px;
+  transition: background-color 0.3s;
+}
+
+.send-button:hover {
+  background-color: #1557b0;
+}
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 94 - 0
src/components/AiChat/Conversation.vue


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 5 - 0
src/components/AiChat/WelcomeContent.vue


+ 269 - 0
src/components/common/ai/CodeBlock.vue

@@ -0,0 +1,269 @@
+<template>
+  <div class="code-block" :class="{ 'dark': isDark }">
+    <div class="code-header">
+      <span class="language">{{ language }}</span>
+      <v-btn
+        variant="text"
+        size="small"
+        class="copy-btn"
+        @click="copyCode"
+        :color="copied ? 'success' : 'default'"
+      >
+        <v-icon size="16" :class="{ 'mr-1': !copied }">
+          {{ copied ? 'mdi-check' : 'mdi-content-copy' }}
+        </v-icon>
+        <span v-if="!copied">复制</span>
+        <span v-else class="success-text">已复制</span>
+      </v-btn>
+    </div>
+    <pre class="code-content"><code ref="codeRef" v-html="highlightedCode"></code></pre>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, watch, computed } from 'vue'
+import hljs from 'highlight.js'
+import 'highlight.js/styles/vs2015.css'
+
+// 注册常用的编程语言
+import 'highlight.js/lib/languages/javascript'
+import 'highlight.js/lib/languages/typescript'
+import 'highlight.js/lib/languages/python'
+import 'highlight.js/lib/languages/java'
+import 'highlight.js/lib/languages/cpp'
+import 'highlight.js/lib/languages/csharp'
+import 'highlight.js/lib/languages/php'
+import 'highlight.js/lib/languages/ruby'
+import 'highlight.js/lib/languages/go'
+import 'highlight.js/lib/languages/rust'
+import 'highlight.js/lib/languages/sql'
+import 'highlight.js/lib/languages/xml'
+import 'highlight.js/lib/languages/css'
+import 'highlight.js/lib/languages/json'
+import 'highlight.js/lib/languages/yaml'
+import 'highlight.js/lib/languages/markdown'
+import 'highlight.js/lib/languages/bash'
+import 'highlight.js/lib/languages/shell'
+import 'highlight.js/lib/languages/dockerfile'
+
+const props = defineProps<{
+  code: string
+  language?: string
+  isDark?: boolean
+}>()
+
+const codeRef = ref<HTMLElement | null>(null)
+const copied = ref(false)
+
+const highlightedCode = computed(() => {
+  if (!props.code) return ''
+  try {
+    if (props.language && hljs.getLanguage(props.language)) {
+      return hljs.highlight(props.code, {
+        language: props.language,
+        ignoreIllegals: true
+      }).value
+    } else {
+      // 如果没有指定语言或语言不支持,尝试自动检测
+      return hljs.highlightAuto(props.code).value
+    }
+  } catch (e) {
+    console.warn('Failed to highlight code:', e)
+    return props.code // 如果高亮失败,返回原始代码
+  }
+})
+
+const copyCode = async () => {
+  try {
+    await navigator.clipboard.writeText(props.code)
+    copied.value = true
+    setTimeout(() => {
+      copied.value = false
+    }, 2000)
+  } catch (err) {
+    console.warn('Failed to copy code:', err)
+  }
+}
+
+// 监听代码变化,确保滚动条重置
+watch(() => props.code, () => {
+  if (codeRef.value) {
+    codeRef.value.scrollLeft = 0
+  }
+})
+</script>
+
+<style scoped>
+.code-block {
+  margin: 1rem 0;
+  border-radius: 8px;
+  overflow: hidden;
+  background: #1e1e1e;
+  font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
+  transition: all 0.3s ease;
+  border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.code-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 8px 16px;
+  background: rgba(255, 255, 255, 0.05);
+  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.language {
+  font-size: 12px;
+  color: #89ddff;
+  text-transform: uppercase;
+  letter-spacing: 1px;
+  font-weight: 500;
+}
+
+.copy-btn {
+  opacity: 0.8;
+  transition: all 0.2s ease;
+  color: #a9b7c6 !important;
+  font-size: 12px !important;
+  min-width: 64px !important;
+  padding: 0 8px !important;
+}
+
+.copy-btn:hover {
+  opacity: 1;
+  background: rgba(255, 255, 255, 0.1) !important;
+}
+
+.copy-btn .v-icon {
+  margin-right: 4px;
+}
+
+.code-content {
+  margin: 0;
+  padding: 16px;
+  overflow-x: auto;
+  font-size: 14px;
+  line-height: 1.6;
+  background: #1e1e1e;
+  color: #d4d4d4;
+}
+
+/* 自定义滚动条 */
+.code-content::-webkit-scrollbar {
+  height: 6px;
+  width: 6px;
+}
+
+.code-content::-webkit-scrollbar-track {
+  background: rgba(255, 255, 255, 0.05);
+}
+
+.code-content::-webkit-scrollbar-thumb {
+  background: rgba(255, 255, 255, 0.2);
+  border-radius: 3px;
+}
+
+.code-content::-webkit-scrollbar-thumb:hover {
+  background: rgba(255, 255, 255, 0.3);
+}
+
+/* 代码高亮自定义样式 */
+:deep(.hljs) {
+  background: transparent;
+  color: #d4d4d4;
+  text-shadow: none;
+  font-family: inherit;
+}
+
+:deep(.hljs-keyword) {
+  color: #569cd6;
+  font-weight: bold;
+}
+
+:deep(.hljs-string) {
+  color: #ce9178;
+}
+
+:deep(.hljs-number) {
+  color: #b5cea8;
+}
+
+:deep(.hljs-function) {
+  color: #dcdcaa;
+}
+
+:deep(.hljs-title) {
+  color: #4ec9b0;
+}
+
+:deep(.hljs-class) {
+  color: #4ec9b0;
+}
+
+:deep(.hljs-params) {
+  color: #9cdcfe;
+}
+
+:deep(.hljs-comment) {
+  color: #6a9955;
+  font-style: italic;
+}
+
+:deep(.hljs-built_in) {
+  color: #4ec9b0;
+}
+
+:deep(.hljs-variable) {
+  color: #9cdcfe;
+}
+
+:deep(.hljs-operator) {
+  color: #d4d4d4;
+}
+
+:deep(.hljs-punctuation) {
+  color: #d4d4d4;
+}
+
+:deep(.hljs-property) {
+  color: #9cdcfe;
+}
+
+:deep(.hljs-literal) {
+  color: #569cd6;
+}
+
+:deep(.hljs-attr) {
+  color: #9cdcfe;
+}
+
+:deep(.hljs-tag) {
+  color: #569cd6;
+}
+
+/* 深色主题适配 */
+.dark {
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+}
+
+.dark .code-header {
+  background: rgba(0, 0, 0, 0.2);
+}
+
+.dark .language {
+  color: #89ddff;
+}
+
+.dark .copy-btn {
+  color: #a9b7c6 !important;
+}
+
+.dark .copy-btn:hover {
+  background: rgba(255, 255, 255, 0.1) !important;
+}
+
+.success-text {
+  color: #4caf50 !important;
+}
+</style> 

+ 42 - 0
src/components/common/ai/HomeView.vue

@@ -0,0 +1,42 @@
+<template>
+  <div class="home-container">
+    <div class="quick-tips">
+      <v-chip variant="outlined" color="#9C27B0" @click="router.push('/chat')">
+        🤖 你好!让我来帮你解决问题
+      </v-chip>
+      <v-chip variant="outlined" color="#2196F3" @click="router.push('/chat')">
+        💡 需要编程帮助吗?
+      </v-chip>
+      <v-chip variant="outlined" color="#4CAF50" @click="router.push('/chat')">
+        📚 有什么想学习的知识?
+      </v-chip>
+      <v-chip variant="outlined" color="#FF9800" @click="router.push('/chat')">
+        🎨 需要创意灵感吗?
+      </v-chip>
+    </div>
+    <!-- 其他内容 -->
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useRouter } from 'vue-router'
+const router = useRouter()
+</script>
+
+<style scoped>
+.quick-tips {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 12px;
+  margin-bottom: 24px;
+}
+
+.v-chip {
+  cursor: pointer;
+  transition: transform 0.2s;
+}
+
+.v-chip:hover {
+  transform: translateY(-2px);
+}
+</style>

+ 157 - 0
src/components/common/ai/MarkdownRenderer.vue

@@ -0,0 +1,157 @@
+<template>
+  <div class="markdown-container">
+    <div class="markdown-body">
+      <template v-for="(block, index) in blocks" :key="index">
+        <code-block v-if="block.type === 'code'" :code="block.content" :language="block.language" />
+        <div v-else v-html="block.content" style="color: #000;"></div>
+      </template>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue'
+import { marked } from 'marked'
+import CodeBlock from './CodeBlock.vue'
+
+const props = defineProps<{
+  content: string
+}>()
+
+interface Block {
+  type: 'code' | 'text'
+  content: string
+  language?: string
+}
+
+const blocks = computed<Block[]>(() => {
+  const tokens = marked.lexer(props.content)
+  return tokens.map(token => {
+    if (token.type === 'code') {
+      return {
+        type: 'code',
+        content: token.text,
+        language: token.lang || 'plaintext'
+      }
+    }
+    return {
+      type: 'text',
+      content: marked.parser([token])
+    }
+  })
+})
+</script>
+
+<style>
+.markdown-container {
+  width: 100%;
+}
+
+.markdown-body {
+  font-size: 16px;
+  line-height: 1.6;
+  word-wrap: break-word;
+  /* padding: 16px; */
+}
+
+.markdown-body p {
+  margin: 1em 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+}
+
+.markdown-body h2 {
+  font-size: 1.5em;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+  margin: 1em 0;
+}
+
+.markdown-body li {
+  margin: 0.5em 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+  margin: 1em 0;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  height: auto;
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+  margin: 1em 0;
+  width: 100%;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+/* 深色模式适配 */
+@media (prefers-color-scheme: dark) {
+  .markdown-body {
+    color: #c9d1d9;
+  }
+
+  .markdown-body blockquote {
+    color: #8b949e;
+    border-left-color: #30363d;
+  }
+
+  .markdown-body a {
+    color: #58a6ff;
+  }
+
+  .markdown-body table th,
+  .markdown-body table td {
+    border-color: #30363d;
+  }
+
+  .markdown-body table tr:nth-child(2n) {
+    background-color: #161b22;
+  }
+}
+</style>

+ 205 - 0
src/components/common/ai/MessageBubble.vue

@@ -0,0 +1,205 @@
+<template>
+  <div class="message" :class="{ 'user-message': isUser }">
+    <div class="message-content">
+      <div class="avatar" v-if="isUser">
+        <img src="@/assets/dear.png" alt="AI Avatar" class="avatar-img" />
+      </div>
+      <div class="avatar" v-else>
+        <img src="@/assets/user.jpeg" alt="User Avatar" class="avatar-img" />
+      </div>
+      <div class="bubble-wrapper" :class="{'user-bubble-wrapper':isUser}" >
+        <div class="bubble">
+          <MarkdownRenderer v-if="isUser" :content="message.text"  />
+          <div v-html="message.text" v-else></div>
+          <!-- <div v-html="message.text" v-else>{{ message.text }}</div> -->
+        </div>
+        <div class="message-time" :class="{ 'user-time': isUser }">
+          {{ message.sentAt }}
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue';
+import MarkdownRenderer from './MarkdownRenderer.vue'
+
+const props = defineProps<{
+  message: {
+    text: string,
+    sender: 'user' | 'ai',
+    sentAt: string
+  }
+}>()
+const isUser = computed(() => props.message.sender === 'user')
+</script>
+
+<style scoped>
+.message {
+  position: relative;
+  margin: 8px 0;
+  padding: 5px;
+  animation: fadeIn 0.3s ease;
+
+  display: flex;
+  flex-direction: column;
+  width: 95%;
+  padding-bottom: 16px;
+}
+
+.user-message {
+  align-items: flex-end;
+
+}
+
+.message-content {
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-between;
+  gap: 5px;
+  flex-direction: row;
+  width: 100%;
+  /* 默认头像在左,消息在右 */
+}
+
+.user-message .message-content {
+  flex-direction: row-reverse;
+  /* 用户消息时头像在右,消息在左 */
+}
+
+.avatar {
+  width: 36px;
+  height: 36px;
+  border-radius: 50%;
+  background: transparent;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+  overflow: hidden;
+}
+
+.avatar-img {
+  width: 36px;
+  height: 36px;
+  object-fit: cover;
+}
+
+.bubble-wrapper {
+  width: 95%;
+  flex: 1;
+  min-width: 0;
+  background-color: #fff;
+  color: #000;
+  border: 1px solid #6366f1;
+  border-radius: 10px;
+  padding-left: 10px;
+}
+.user-bubble-wrapper {
+  background: #F5EFE6;
+
+}
+.user-message .bubble-wrapper {
+  flex: unset;
+}
+
+.bubble {
+  /* padding: 14px 18px; */
+  position: relative;
+  transition: all 0.3s ease;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
+  font-size: 16px;
+  line-height: 1.7;
+  letter-spacing: 0.3px;
+  word-spacing: 1px;
+  color: #2c3e50;
+}
+
+.user-message .bubble {
+  color: #6366f1;
+  font-weight: 400;
+  letter-spacing: 0.4px;
+}
+
+.message-time {
+  position: absolute;
+  font-size: 0.75rem;
+  color: #666;
+  margin-top: 4px;
+  text-align: left;
+  left: 50px;
+}
+
+.user-time {
+  text-align: right;
+  right: 55px;
+}
+
+@keyframes fadeIn {
+  from {
+    opacity: 0;
+    transform: translateY(10px);
+  }
+
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+:deep(.v-theme--dark) {
+  .avatar {
+    background: #2d3748;
+  }
+
+  .bubble {
+    color: #e2e8f0;
+  }
+
+  .user-message .bubble {
+    color: #7c3aed;
+  }
+
+  .message-time {
+    color: #a0aec0;
+  }
+}
+
+:deep(.markdown-body) {
+  background: transparent !important;
+  color: inherit;
+}
+
+:deep(.markdown-body ol) {
+  padding-left: 1.2em;
+  margin: 0;
+  list-style-position: outside;
+}
+
+:deep(.markdown-body ol li) {
+  margin: 4px 0;
+  padding-left: 0.3em;
+}
+
+:deep(.markdown-body pre) {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+.user-message :deep(.markdown-body) {
+  color: white;
+}
+
+.user-message :deep(.markdown-body pre) {
+  background-color: rgba(255, 255, 255, 0.1);
+}
+
+.user-message :deep(.markdown-body code) {
+  background-color: rgba(255, 255, 255, 0.2);
+}
+
+.user-message :deep(.markdown-body blockquote) {
+  border-left-color: rgba(255, 255, 255, 0.3);
+  color: rgba(255, 255, 255, 0.8);
+}
+</style>

+ 35 - 0
src/components/common/ai/TypingIndicator.vue

@@ -0,0 +1,35 @@
+<template>
+  <div class="typing-indicator">
+    <div class="dot"></div>
+    <div class="dot"></div>
+    <div class="dot"></div>
+  </div>
+</template>
+
+<style scoped>
+.typing-indicator {
+  display: flex;
+  gap: 4px;
+  padding: 12px;
+  margin: 10px;
+  width: fit-content;
+  background-color: #f0f0f0;
+  border-radius: 10px;
+}
+
+.dot {
+  width: 8px;
+  height: 8px;
+  background-color: #666;
+  border-radius: 50%;
+  animation: bounce 1.4s infinite ease-in-out;
+}
+
+.dot:nth-child(1) { animation-delay: -0.32s; }
+.dot:nth-child(2) { animation-delay: -0.16s; }
+
+@keyframes bounce {
+  0%, 80%, 100% { transform: scale(0); }
+  40% { transform: scale(1); }
+}
+</style> 

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 93 - 0
src/components/common/leftAside/Conversation.vue


+ 80 - 0
src/components/common/leftAside/Other.vue

@@ -0,0 +1,80 @@
+<template>
+    <div class="other">
+        <div v-for="(item, index) in favorites" :key="`${id}-${index}`" class="favorite"
+            :class="{ active: props.activeIndex === `${id}-${index}` }"
+            @click="$emit('setActiveIndex', `${id}-${index}`)">
+            <div class="left">
+                <svg width="15" height="15" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+                    <path :d="item.svgPath" fill="#4B5563" />
+                </svg>
+                <span>{{ item.label }}</span>
+            </div>
+            <svg width="9" height="12" viewBox="0 0 9 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+                <path
+                    d="M8.3751 5.38381C8.56253 5.56307 8.65625 5.76784 8.65625 6C8.65625 6.23216 8.56253 6.43785 8.3751 6.61613L2.3751 11.759C2.16596 11.9196 1.92711 12 1.65625 12C1.38539 12 1.14654 11.9196 0.937395 11.759C0.749967 11.5807 0.65625 11.375 0.65625 11.1429C0.65625 10.9107 0.749967 10.7059 0.937395 10.5267L6.25054 6L0.937395 1.47327C0.749967 1.29499 0.65625 1.08931 0.65625 0.857143C0.65625 0.62498 0.749967 0.420217 0.937395 0.240952C1.14654 0.0802988 1.38539 0 1.65625 0C1.92711 0 2.16596 0.0802988 2.3751 0.240952L8.3751 5.38381Z"
+                    fill="#4B5563" />
+            </svg>
+        </div>
+    </div>
+</template>
+
+<script setup lang='ts'>
+import { useId } from 'vue';
+const props = defineProps<{
+    activeIndex: string | null;
+}>();
+defineEmits<{ setActiveIndex: [index: string] }>()
+const favorites = [
+    {
+        label: "我的款式",
+        svgPath: "M3.6643 14C3.39926 14 3.14508 13.8771 2.95766 13.6583C2.77025 13.4395 2.66497 13.1428 2.66497 12.8333V10.8889H2.67496V7.65023C2.63032 7.66112 2.59101 7.67123 2.54971 7.67668L2.48508 7.68134C2.32186 7.68134 2.15863 7.61368 2.02939 7.48846L1.96809 7.42079L0.185944 5.18624C0.072197 5.04689 0.00618407 4.86367 0.000413026 4.6713C-0.00535802 4.47892 0.0495138 4.29076 0.154632 4.14246L0.213259 4.06857L3.04338 0.22947C3.15175 0.098903 3.29719 0.0189798 3.45244 0.00469205L3.53306 2.5452e-05H5.26124C5.51974 2.5452e-05 5.76424 0.168803 5.88749 0.42858L5.94279 0.538247L6.02074 0.667358C6.22927 0.986246 6.63366 1.39302 7.34319 1.39302C8.15332 1.39302 8.56638 0.861024 8.7436 0.538247L8.79889 0.429358C8.90815 0.197581 9.10269 0.0389144 9.33587 0.00624777L9.42514 2.5452e-05H11.2346C11.3953 -0.00152284 11.5506 0.0676181 11.6697 0.193692L11.7243 0.260581L14.4458 4.09968C14.5667 4.23204 14.641 4.41224 14.6541 4.6051C14.6673 4.79795 14.6185 4.98962 14.5171 5.14268L14.4598 5.21657L12.609 7.3749C12.4725 7.52812 12.2826 7.6199 12.092 7.6199L11.9968 7.60434V12.4577C11.9966 12.4707 11.9955 12.4837 11.9934 12.4966L11.9921 12.8333C11.9921 13.1428 11.8868 13.4395 11.6994 13.6583C11.512 13.8771 11.2578 14 10.9928 14H3.6643ZM10.2086 4.66668H9.11202C8.86818 4.66668 8.66098 4.93346 8.66098 5.23135V5.79135C8.66098 6.4509 9.11202 7.00001 9.66032 7.00001C9.94014 7.00001 10.2086 6.85846 10.4038 6.60801C10.5744 6.3879 10.6597 6.09001 10.6597 5.79135V5.2469C10.6597 4.93346 10.4525 4.66668 10.2086 4.66668Z"
+    },
+    { label: "我的图库", svgPath: "M12.4578 10.9375C12.4578 11.1825 12.2966 11.375 12.0914 11.375H2.56484C2.35966 11.375 2.19844 11.1825 2.19844 10.9375V10.64C2.19844 10.5437 2.22775 10.4475 2.27905 10.3775L4.36756 7.16625C4.44084 7.06125 4.55077 7 4.65336 7C4.76328 7 4.86587 7.0525 4.93916 7.1575L6.00174 8.68875C6.07502 8.79375 6.17761 8.84625 6.2802 8.84625C6.39013 8.84625 6.50005 8.785 6.57333 8.67125L8.68383 5.41625C8.76444 5.3025 8.86703 5.25 8.97695 5.25C9.08687 5.25 9.1968 5.31125 9.27008 5.425L12.3845 10.3862C12.4285 10.4562 12.4578 10.5525 12.4578 10.6487V10.9375ZM5.49609 2.625C6.10433 2.625 6.59531 3.21125 6.59531 3.9375C6.59531 4.66375 6.10433 5.25 5.49609 5.25C4.88786 5.25 4.39687 4.66375 4.39687 3.9375C4.39687 3.21125 4.88786 2.625 5.49609 2.625ZM13.1906 1.75H9.09713C8.90294 1.75 8.7168 1.65812 8.57904 1.49362L7.54284 0.256375C7.47483 0.175079 7.39407 0.110591 7.30517 0.0665995C7.21627 0.0226081 7.12097 -2.30848e-05 7.02474 1.76697e-08H1.46563C0.659531 1.76697e-08 0 0.7875 0 1.75V12.25C0 13.2125 0.659531 14 1.46563 14H13.1906C13.9967 14 14.6562 13.2125 14.6562 12.25V3.5C14.6562 2.53312 14.0004 1.75 13.1906 1.75Z" },
+    {
+        label: "收藏夹", svgPath: "M8.12098 0.793762C7.95688 0.483762 7.69258 0.318781 7.32798 0.300781C6.98168 0.318781 6.71738 0.483762 6.53508 0.793762L4.78508 4.40277L0.847583 5.00372C0.501183 5.05872 0.273285 5.25074 0.163985 5.57874C0.054585 5.92474 0.127485 6.22477 0.382685 6.48077L3.22649 9.29675L2.54288 13.2897C2.50638 13.6357 2.62488 13.9178 2.89828 14.1368C3.18998 14.3368 3.49988 14.3558 3.82798 14.1918L7.32798 12.3328L10.8552 14.1918C11.1652 14.3558 11.466 14.3368 11.7576 14.1368C12.0493 13.9178 12.1678 13.6357 12.113 13.2897L11.4568 9.29675L14.3005 6.48077C14.5375 6.22477 14.6105 5.92474 14.5193 5.57874C14.3917 5.25074 14.1547 5.05872 13.8083 5.00372L9.87098 4.40277L8.12098 0.793762Z"
+    },
+    {
+        label: "我的点赞", svgPath: "M8.95979 0.202999C9.34148 0.275999 9.63722 0.458996 9.84712 0.749996C10.057 1.042 10.1239 1.36998 10.0476 1.73498L9.99033 2.06298C9.83759 2.79198 9.5609 3.47601 9.16016 4.11401H13.2822C13.6639 4.13201 13.9883 4.25897 14.2555 4.49597C14.5036 4.75097 14.6372 5.06102 14.6562 5.42602C14.6372 5.95502 14.3891 6.34699 13.912 6.60199C14.2365 6.85699 14.4081 7.19501 14.4272 7.61401C14.4272 7.94201 14.3223 8.22399 14.1124 8.46099C13.9025 8.69799 13.6352 8.84398 13.3108 8.89898C13.4444 9.09998 13.5112 9.32697 13.5112 9.58197C13.4731 10.202 13.1582 10.621 12.5666 10.84C12.5856 10.931 12.5952 11.023 12.5952 11.114C12.5761 11.478 12.4425 11.788 12.1944 12.043C11.9273 12.28 11.6028 12.408 11.2212 12.426H8.44451C7.87197 12.426 7.35671 12.28 6.8987 11.989L5.81099 11.278C5.0094 10.749 4.59913 10.02 4.58008 9.09002V8.05102V6.73901V6.05499C4.59913 5.21599 4.94261 4.53296 5.61062 4.00396L5.81099 3.84002C6.59343 3.23902 7.08964 2.47296 7.29954 1.54296L7.35671 1.24298C7.43302 0.877977 7.62387 0.596015 7.92924 0.395015C8.23461 0.194015 8.5781 0.129999 8.95979 0.202999ZM0.916016 4.55102H2.74805C3.01521 4.55102 3.23463 4.63299 3.40642 4.79699C3.57822 4.96099 3.66406 5.17102 3.66406 5.42602V11.551C3.66406 11.806 3.57822 12.016 3.40642 12.18C3.23463 12.344 3.01521 12.426 2.74805 12.426H0.916016C0.648853 12.426 0.42943 12.344 0.257637 12.18C0.0858452 12.016 0 11.806 0 11.551V5.42602C0 5.17102 0.0858452 4.96099 0.257637 4.79699C0.42943 4.63299 0.648853 4.55102 0.916016 4.55102Z"
+    },
+]
+const id = useId()
+
+</script>
+
+<style>
+.other {
+    width: 100%;
+    margin-top: auto;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.favorite {
+    cursor: pointer;
+    box-sizing: border-box;
+    padding: 0 20px;
+    height: 36px;
+    font-size: 13px;
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .left {
+        display: flex;
+        align-items: center;
+        gap: 20px;
+    }
+}
+
+.favorite:hover {
+    background-color: #fff;
+}
+
+.favorite.active {
+    background-color: #e0e0e0;
+    /* 高亮背景色 */
+}
+</style>

+ 80 - 0
src/components/common/login/AccountLogin.vue

@@ -0,0 +1,80 @@
+<script setup lang="ts">
+import {reactive, ref} from 'vue'
+import {LoginType, userStore} from "@/stores/user.ts";
+import type {FormInstance} from 'element-plus'
+import {debounce} from "@/utils/common.ts";
+import AccountFormItem from "@/components/common/login/component/AccountFormItem.vue";
+import PasswordFormItem from "@/components/common/login/component/PasswordFormItem.vue";
+import SubmitFormBtn from "@/components/common/login/component/SubmitFormBtn.vue";
+
+const user = userStore()
+const ruleFormRef = ref<FormInstance>()
+
+const form = reactive({
+  username: '',
+  password: '',
+});
+const buttonLoading = ref(false);
+
+const debouncedSubmitForm = debounce(submitForm, 500);
+
+/**
+ * 提交表单并进行验证
+ * @param formEl 表单实例
+ * @param callBack 验证通过后的回调函数
+ */
+async function submitForm(formEl: FormInstance | undefined, callBack: () => void) {
+  // 检查表单实例是否存在
+  if (!formEl) {
+    return;
+  }
+  // 表单验证
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      const {username, password} = form;
+      try {
+        // 调用用户登录方法
+        await user.login({username, password});
+      } catch (error) {
+        console.error('Login failed:', error);
+      }
+      // 如果有回调函数,执行回调
+      callBack && callBack();
+    } else {
+      console.error('Form validation failed:', fields);
+      // 如果有回调函数,执行回调
+      callBack && callBack();
+    }
+  });
+}
+
+
+</script>
+<template>
+  <div class="bf-login-dialog-box">
+    <h1 class="title">账号密码登录</h1>
+    <div class="bf-login-form">
+      <el-form :model="form" ref="ruleFormRef">
+        <!-- <AccountFormItem v-model:phone="form.username"/> -->
+        <AccountFormItem prop-name="username" v-model:phone="form.username"/>
+        <!-- <PasswordFormItem v-model:password="form.password"/> -->
+        <PasswordFormItem v-model:button-loading="buttonLoading"  @submit-click="debouncedSubmitForm(ruleFormRef, $event)" prop-name="password" v-model:password="form.password"/>
+        <SubmitFormBtn v-model:button-loading="buttonLoading"  @submit-click="debouncedSubmitForm(ruleFormRef, $event)"/>
+      </el-form>
+      <div class="bf-login-footer-btn">
+        <!-- <a class="forget-pwd" @click="user.loginType = LoginType.RESET_PASSWORD">忘记密码</a> -->
+        <a class="sign-up" @click="user.loginType = LoginType.REGISTER">立即注册</a>
+      </div>
+      <!-- <div class="bf-login-process">
+        <a class="wx-login" @click="user.loginType = LoginType.WECHAT_LOGIN"><img
+            src="@/assets/components/common/login/wx-icon.png" style="background: rgba(107, 182, 87, 1);">微信登录</a>
+        <a class="SMS-login" @click="user.loginType = LoginType.SMS_LOGIN"><img
+            src="@/assets/components/common/login/SMS-icon.png">短信登录</a>
+      </div> -->
+    </div>
+  </div>
+</template>
+
+
+<style scoped lang="scss">
+</style>

+ 32 - 0
src/components/common/login/GlobalLoginDialog.vue

@@ -0,0 +1,32 @@
+<template>
+  <el-dialog v-model="user.showLoginModel" :show-close="false" append-to-body class="bf-login-wrap"  align-center :lock-scroll="false"	>
+    <!-- 关闭登陆弹出框按钮 -->
+    <el-icon @click="user.showLogin()" class="bf-login-close" color="rgba(196, 196, 196, 1)">
+      <Close/>
+    </el-icon>
+    <!-- 账号密码登录    -->
+    <AccountLogin v-if="user.loginType === LoginType.ACCOUNT_LOGIN"/>
+    <!-- 验证码登陆 -->
+    <SMSLogin v-if="user.loginType === LoginType.SMS_LOGIN"/>
+    <!-- 注册 -->
+    <Register v-if="user.loginType === LoginType.REGISTER"/>
+    <!-- 微信登陆 -->
+    <WeChatLogin v-if="user.loginType === LoginType.WECHAT_LOGIN"/>
+    <!-- 修改密码 -->
+    <ResetPassword v-if="user.loginType === LoginType.RESET_PASSWORD"/>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import {LoginType, userStore} from "@/stores/user.ts";
+import {Close} from "@element-plus/icons-vue";
+
+const user = userStore()
+
+</script>
+
+<style scoped>
+
+</style>
+<!-- 登陆框公共样式 -->
+<style src="@/styles/components/common/login/GlobalLoginDialog.scss"></style>

+ 91 - 0
src/components/common/login/Register.vue

@@ -0,0 +1,91 @@
+<script setup lang="ts">
+import {reactive, ref} from 'vue'
+import {debounce} from "@/utils/common.ts";
+import {register, sendCode} from "@/api/user.ts";
+import {AuthCodeType} from "@/enums/verification.ts";
+import {ElMessage, type FormInstance} from "element-plus";
+import {LoginType, userStore} from "@/stores/user.ts";
+import AccountFormItem from "@/components/common/login/component/AccountFormItem.vue";
+import CodeFormItem from "@/components/common/login/component/CodeFormItem.vue";
+import PasswordFormItem from "@/components/common/login/component/PasswordFormItem.vue";
+import SubmitFormBtn from "@/components/common/login/component/SubmitFormBtn.vue";
+
+const form = reactive({
+  phone: '',
+  code: '',
+  password: '',
+  confirmPassword: ''
+});
+const user = userStore();
+const ruleFormRef = ref<FormInstance>();
+
+const debouncedSendAuthCode = debounce(sendAuthCode, 500);
+
+async function sendAuthCode(sendAuthCodeCallBack: () => void) {
+  if (!ruleFormRef.value?.validateField) return;
+  await ruleFormRef.value.validateField('phone', async (valid) => {
+    if (valid) {
+      const {phone} = form;
+      await sendCode({phone, type: AuthCodeType.REGISTER});
+      if (sendAuthCodeCallBack) {
+        sendAuthCodeCallBack()
+      }
+    } else {
+      ElMessage.error('请输入正确的手机号码');
+    }
+  });
+}
+
+const debouncedSubmitForm = debounce(submitForm, 500);
+function submitForm(formEl: FormInstance | undefined, callBack: () => void) {
+  if (!formEl) return;
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      try {
+        const {phone, password, code} = form;
+        await register({phone, password, code})
+        ElMessage.success('注册成功')
+        user.loginType = LoginType.ACCOUNT_LOGIN;
+      } catch (e) {
+        console.log(e);
+      }
+      callBack && callBack()
+    } else {
+      callBack && callBack()
+      // ElMessage.error('注册失败,请稍后重试')
+      console.log('error submit!', fields);
+    }
+  });
+}
+
+
+</script>
+<template>
+  <div class="bf-login-dialog-box">
+    <h1 class="title">注册</h1>
+    <div class="bf-login-form">
+      <el-form :model="form" ref="ruleFormRef">
+        <AccountFormItem prop-name="phone" v-model:phone="form.phone"/>
+        <CodeFormItem v-model:code="form.code" @sendAuthCode="debouncedSendAuthCode"/>
+        <PasswordFormItem prop-name="password" v-model:password="form.password"></PasswordFormItem>
+        <PasswordFormItem prop-name="confirmPassword" v-model:password="form.confirmPassword" v-model:confirm-password="form.password" placeholder="请确认登陆密码"></PasswordFormItem>
+        <SubmitFormBtn @submit-click="debouncedSubmitForm(ruleFormRef, $event)">立即注册</SubmitFormBtn>
+      </el-form>
+      <div class="bf-register-account">
+        <span>已有账户?</span>
+        <a @click="user.loginType = LoginType.ACCOUNT_LOGIN">立即登录</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+
+<style scoped lang="scss">
+.bf-register-account {
+  margin-top: -30px;
+
+  a {
+    color: #409EFF;
+  }
+}
+</style>

+ 92 - 0
src/components/common/login/ResetPassword.vue

@@ -0,0 +1,92 @@
+<script setup lang="ts">
+import {reactive, ref} from 'vue'
+import AccountFormItem from "@/components/common/login/component/AccountFormItem.vue";
+import PasswordFormItem from "@/components/common/login/component/PasswordFormItem.vue";
+import CodeFormItem from "@/components/common/login/component/CodeFormItem.vue";
+import {LoginType, userStore} from "@/stores/user.ts";
+import {ElMessage, FormInstance} from "element-plus";
+import {debounce} from "@/utils/common.ts";
+import { resetPassword, sendCode} from "@/api/user.ts";
+import {AuthCodeType} from "@/enums/verification.ts";
+import SubmitFormBtn from "@/components/common/login/component/SubmitFormBtn.vue";
+
+const form = reactive({
+  phone: '',
+  code: '',
+  password: '',
+  confirmPassword: ''
+});
+const user = userStore();
+const ruleFormRef = ref<FormInstance>();
+
+const debouncedSendAuthCode = debounce(sendAuthCode, 500);
+
+async function sendAuthCode(sendAuthCodeCallBack: () => void) {
+  if (!ruleFormRef.value?.validateField) return;
+  await ruleFormRef.value.validateField('phone', async (valid) => {
+    if (valid) {
+      const {phone} = form;
+      await sendCode({phone, type: AuthCodeType.FORGOTTEN_PASSWORD});
+      if (sendAuthCodeCallBack) {
+        sendAuthCodeCallBack()
+      }
+    } else {
+      ElMessage.error('请输入正确的手机号码');
+    }
+  });
+}
+
+const debouncedSubmitForm = debounce(submitForm, 500);
+function submitForm(formEl: FormInstance | undefined, callBack: () => void) {
+  if (!formEl) return;
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      try {
+        const {phone, password, code} = form;
+        await resetPassword({phone, password, code})
+        ElMessage.success('修改成功')
+        user.loginType = LoginType.ACCOUNT_LOGIN;
+      }catch (e) {
+      }
+      callBack && callBack()
+    } else {
+      // ElMessage.error('修改失败,请稍后重试')
+      console.log('error submit!', fields);
+      callBack && callBack()
+    }
+  });
+}
+
+
+</script>
+<template>
+  <div class="bf-login-dialog-box">
+    <h1 class="title">重置密码</h1>
+    <div class="bf-login-form">
+      <el-form :model="form" ref="ruleFormRef">
+        <AccountFormItem prop-name="phone" v-model:phone="form.phone"/>
+        <CodeFormItem v-model:code="form.code" @sendAuthCode="debouncedSendAuthCode"/>
+        <PasswordFormItem prop-name="password" v-model:password="form.password"></PasswordFormItem>
+        <PasswordFormItem prop-name="confirmPassword" v-model:password="form.confirmPassword" v-model:confirm-password="form.password" placeholder="请确认登陆密码"></PasswordFormItem>
+        <SubmitFormBtn @submit-click="debouncedSubmitForm(ruleFormRef, $event)">
+          确认
+        </SubmitFormBtn>
+      </el-form>
+      <div class="bf-register-account">
+        <span>已有账户?</span>
+        <a @click="user.loginType = LoginType.ACCOUNT_LOGIN">立即登录</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+
+<style scoped lang="scss">
+.bf-register-account {
+  margin-top: -30px;
+
+  a {
+    color: #409EFF;
+  }
+}
+</style>

+ 88 - 0
src/components/common/login/SMSLogin.vue

@@ -0,0 +1,88 @@
+<script setup lang="ts">
+import {reactive, ref} from 'vue';
+import type {FormInstance} from "element-plus";
+import {ElMessage} from 'element-plus';
+import {debounce} from "@/utils/common.ts";
+import {sendCode} from "@/api/user.ts";
+import {LoginType, userStore} from "@/stores/user.ts";
+import {AuthCodeType} from "@/enums/verification.ts";
+import CodeFormItem from "@/components/common/login/component/CodeFormItem.vue";
+import AccountFormItem from "@/components/common/login/component/AccountFormItem.vue";
+import SubmitFormBtn from "@/components/common/login/component/SubmitFormBtn.vue";
+
+const user = userStore();
+const form = reactive({
+  phone: '',
+  code: '',
+});
+
+const ruleFormRef = ref<FormInstance>();
+
+// 登陆
+const debouncedSubmitForm = debounce(async function submitForm(formEl: FormInstance | undefined, callBack: () => void) {
+  if (!formEl) return;
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      const {phone, code} = form;
+      try {
+        // 调用用户登录方法
+        await user.login({phone, code});
+      } catch (error) {
+        console.error('Login failed:', error);
+      }
+      // 如果有回调函数,执行回调
+      callBack && callBack();
+    } else {
+      console.error('Form validation failed:', fields);
+      // 如果有回调函数,执行回调
+      callBack && callBack();
+    }
+  });
+}, 500);
+
+const buttonLoading = ref(false);
+
+const debouncedSendAuthCode = debounce(async function sendAuthCode(sendAuthCodeCallBack: () => void) {
+  if (!ruleFormRef.value?.validateField) return;
+  await ruleFormRef.value.validateField('phone', async (valid) => {
+    if (valid) {
+      const {phone} = form;
+      await sendCode({phone, type: AuthCodeType.PHONE_LOGIN});
+      if (sendAuthCodeCallBack) {
+        sendAuthCodeCallBack();
+      }
+    } else {
+      ElMessage.error('请输入正确的手机号码');
+    }
+  });
+}, 500)
+// 获取验证码
+
+
+</script>
+
+<template>
+  <div class="bf-login-dialog-box">
+    <h1 class="title">验证码登录</h1>
+    <div class="bf-login-form">
+      <el-form :model="form" ref="ruleFormRef">
+        <AccountFormItem prop-name="phone" v-model:phone="form.phone"/>
+        <CodeFormItem v-model:code="form.code" @sendAuthCode="debouncedSendAuthCode"/>
+        <SubmitFormBtn v-model:button-loading="buttonLoading" @submit-click="debouncedSubmitForm(ruleFormRef, $event)"/>
+      </el-form>
+      <div class="bf-login-footer-btn">
+        <a class="forget-pwd" @click="user.loginType = LoginType.RESET_PASSWORD">忘记密码</a>
+        <a class="sign-up" @click="user.loginType = LoginType.REGISTER">立即注册</a>
+      </div>
+      <div class="bf-login-process">
+        <a class="wx-login" @click="user.loginType = LoginType.WECHAT_LOGIN"><img
+            src="@/assets/components/common/login/wx-icon.png" style="background: rgba(107, 182, 87, 1);">微信登录</a>
+        <a class="SMS-login" @click="user.loginType = LoginType.ACCOUNT_LOGIN"><img
+            src="@/assets/components/common/login/account-icon.png">账户登陆</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="scss">
+</style>

+ 75 - 0
src/components/common/login/WeChatLogin.vue

@@ -0,0 +1,75 @@
+<script setup lang="ts">
+import { onMounted } from 'vue';
+import { LoginType, userStore } from "@/stores/user.ts";
+import wechatConfig from '@/utils/wechat-config.ts';
+
+// 微信回调地址
+const wechatCallback = window.location.origin + '/wechatCallBack';
+// 二维码状态
+// const wxLoginQrCode = ref('');
+
+onMounted(() => {
+  // 在组件挂载时执行的逻辑
+  console.log(oauthURL());
+});
+
+// 构造微信扫码登录的授权URL
+const oauthURL = () => {
+  const redirectURL = `${wechatCallback}?target=${btoa(window.location.href)}`;
+  return `${wechatConfig.oauth}/wechat.html?appid=${wechatConfig.wxPCAppId}&redirect_uri=${redirectURL}&response_type=code&scope=snsapi_login&state=&isMp=false&href=https://oauth.3dreal.cn/style/diy.css`;
+};
+// 用户 store
+const user = userStore();
+</script>
+
+<template>
+  <div class="bf-login-dialog-box">
+    <h1 class="title">微信扫码登录</h1>
+    <div class="bf-login-form">
+      <div class="bf-wechat-code">
+        <iframe :src="oauthURL()" sandbox="allow-top-navigation allow-scripts allow-same-origin"></iframe>
+      </div>
+<!--      <div class="bf-refresh-btn">-->
+<!--        <a @click="getQrCode">-->
+<!--          <el-icon><Refresh /></el-icon>-->
+<!--          <b style="vertical-align: middle">刷新</b>-->
+<!--        </a>-->
+<!--      </div>-->
+      <div class="bf-login-process">
+        <a class="wx-login" @click="user.loginType = LoginType.ACCOUNT_LOGIN"><img src="@/assets/components/common/login/account-icon.png" style="background: rgba(107, 182, 87, 1);">账户登录</a>
+        <a class="SMS-login" @click="user.loginType = LoginType.SMS_LOGIN"><img src="@/assets/components/common/login/SMS-icon.png">短信登录</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="scss">
+.bf-wechat-code {
+  text-align: center;
+  padding-top: 20px;
+  margin-bottom: 50px;
+}
+
+.bf-refresh-btn {
+  margin: 50px 0;
+  text-align: center;
+  a {
+    //color: $primary-color;
+    i {
+      vertical-align: middle;
+    }
+  }
+}
+
+.impowerBox .qrcode {
+  width: 50px;
+  box-shadow: 0 0 29px 0 rgba(3, 65, 157, 0.1);
+  border: 1px solid rgba(216, 221, 228, .5);
+}
+
+iframe {
+  height: 330px;
+  width: 100%;
+  border: 0;
+}
+</style>

+ 99 - 0
src/components/common/login/WechatCallbackLogin.vue

@@ -0,0 +1,99 @@
+<script setup lang="ts">
+import {reactive, ref} from 'vue'
+import {debounce} from "@/utils/common.ts";
+import {bindPhone, sendCode} from "@/api/user.ts";
+import {AuthCodeType} from "@/enums/verification.ts";
+import {ElMessage, type FormInstance} from "element-plus";
+import {LoginType, userStore} from "@/stores/user.ts";
+import AccountFormItem from "@/components/common/login/component/AccountFormItem.vue";
+import CodeFormItem from "@/components/common/login/component/CodeFormItem.vue";
+import SubmitFormBtn from "@/components/common/login/component/SubmitFormBtn.vue";
+import {useRoute} from "vue-router";
+const route = useRoute();
+const props = defineProps(['openId'])
+const form = reactive({
+  phone: '',
+  code: '',
+  openId: props.openId
+});
+console.log(form);
+const user = userStore();
+
+const ruleFormRef = ref<FormInstance>();
+
+const debouncedSendAuthCode = debounce(sendAuthCode, 500);
+
+async function sendAuthCode(sendAuthCodeCallBack: () => void) {
+  if (!ruleFormRef.value?.validateField) return;
+  await ruleFormRef.value.validateField('phone', async (valid) => {
+    if (valid) {
+      const {phone} = form;
+      await sendCode({phone, type: AuthCodeType.WECHAT_LAUNCH});
+      if (sendAuthCodeCallBack) {
+        sendAuthCodeCallBack()
+      }
+    } else {
+      ElMessage.error('请输入正确的手机号码');
+    }
+  });
+}
+
+const debouncedSubmitForm = debounce(submitForm, 500);
+
+function submitForm(formEl: FormInstance | undefined, callBack: () => void) {
+  if (!formEl) return;
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      try {
+        const {phone, openId, code} = form;
+        const res = await bindPhone({phone, openId: props.openId, code})
+        console.log('res=', res.token);
+        ElMessage.success('绑定成功');
+        localStorage.setItem('TOKEN', `${res.token}`);
+        location.href = '/'
+      } catch (e) {
+        console.log(e);
+      }
+      callBack && callBack()
+    } else {
+      callBack && callBack()
+      // ElMessage.error('注册失败,请稍后重试')
+      console.log('error submit!', fields);
+    }
+  });
+}
+
+
+</script>
+<template>
+  <div class="bf-login-dialog-box">
+    <h1 class="title">绑定手机</h1>
+    <div class="bf-login-form">
+      <el-form :model="form" ref="ruleFormRef">
+        <AccountFormItem prop-name="phone" v-model:phone="form.phone" placeholder="请输入手机号码"/>
+        <CodeFormItem v-model:code="form.code" @sendAuthCode="debouncedSendAuthCode"/>
+        <SubmitFormBtn @submit-click="debouncedSubmitForm(ruleFormRef, $event)">确认</SubmitFormBtn>
+      </el-form>
+      <div class="bf-register-account">
+        <span>已有账户?</span>
+        <a @click="user.loginType = LoginType.ACCOUNT_LOGIN">立即登录</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+
+<style scoped lang="scss">
+.bf-login-dialog-box{
+  padding: 40px;
+}
+.bf-register-account {
+  margin-top: -30px;
+
+  a {
+    color: #409EFF;
+  }
+}
+</style>
+<!-- 登陆框公共样式 -->
+<style src="@/assets/styles/components/common/login/GlobalLoginDialog.scss"></style>

+ 25 - 0
src/components/common/login/component/AccountFormItem.vue

@@ -0,0 +1,25 @@
+<script setup lang="ts">
+const props = defineProps(['propName', 'placeholder']);
+const phone = defineModel('phone')
+// defineProps({
+//   placeholder: {
+//     type: String,
+//     default: '请输入用户名称/手机号'
+//   }
+// })
+
+</script>
+
+<template>
+  <el-form-item :prop="props.propName" :rules="[
+       { required: true, message: '请输入你的用户名称/手机号'},
+      //  { pattern: /^1([345789])\d{9}$/, message: '请输入正确的手机号' }
+      ]">
+    <el-input v-model.number="phone" clearable  :placeholder="placeholder || '请输入用户名称/手机号'"/>
+    <!-- <el-input v-model.number="phone"  minlength="11"  oninput="this.value = this.value.replace(/[^0-9]/g, '')" clearable maxlength="11" :placeholder="placeholder || '请输入用户名称/手机号'"/> -->
+  </el-form-item>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 72 - 0
src/components/common/login/component/CodeFormItem.vue

@@ -0,0 +1,72 @@
+<template>
+  <div class="verification-code-input">
+    <el-form-item prop="code" :rules="[
+          { required: true, message: '请输入验证码'}
+        ]">
+      <!-- 输入框 -->
+      <el-input @keydown.enter="debouncedSendAuthCode" class="bf-login-form-code" oninput="this.value = this.value.replace(/[^0-9]/g, '')" minlength="6"
+                maxlength="6" v-model.number="code" clearable
+                placeholder="请输入验证码"/>
+      <!-- 获取验证码按钮 -->
+      <el-button @click="debouncedSendAuthCode" class="bf-login-form-code-btn" type="primary"
+                 :disabled="countdownActive">
+        {{ countdownActive ? `${remainingTime} 秒后重新获取` : '获取验证码' }}
+      </el-button>
+    </el-form-item>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {ref, onBeforeUnmount} from 'vue';
+import {debounce} from "@/utils/common.ts";
+
+// 使用 defineEmits 声明组件可以发射的事件
+const emits = defineEmits(['sendAuthCode']);
+
+// 组件内部的状态
+const code = defineModel('code');
+const countdown = ref<NodeJS.Timeout | null>(null);
+const countdownDuration = 60;
+const remainingTime = ref(countdownDuration);
+const countdownActive = ref(false);
+
+// 防抖处理获取验证码的函数
+const debouncedSendAuthCode = debounce(sendAuthCode, 500);
+
+// 发送验证码的函数
+function sendAuthCode() {
+  // 如果正在倒计时,直接返回,防止连续点击
+  if (countdownActive.value) return;
+
+  // 通过发射事件通知父组件,同时传递启动倒计时的回调函数
+  emits('sendAuthCode', startCountdown);
+}
+
+// 启动倒计时的函数
+function startCountdown() {
+  countdownActive.value = true;
+
+  // 设置间隔为1秒的定时器,更新剩余时间
+  countdown.value = setInterval(() => {
+    remainingTime.value--;
+
+    // 当剩余时间为0时清除定时器,重置状态
+    if (remainingTime.value <= 0) {
+      clearInterval(countdown.value!);
+      countdownActive.value = false;
+      remainingTime.value = countdownDuration;
+    }
+  }, 1000);
+}
+
+// 在组件销毁前清除倒计时器
+onBeforeUnmount(() => {
+  clearInterval(countdown.value!);
+});
+</script>
+
+<style scoped lang="scss">
+:deep(.el-form-item__content) {
+  flex-wrap: unset;
+}
+</style>

+ 61 - 0
src/components/common/login/component/PasswordFormItem.vue

@@ -0,0 +1,61 @@
+<script setup lang="ts">
+import { defineModel } from 'vue';
+
+// 定义组件的 props
+const props = defineProps(['propName', 'placeholder']);
+
+// 使用 defineModel 定义与父组件 v-model 绑定的变量
+const password = defineModel('password');
+const confirmPassword = defineModel('confirmPassword');
+
+// 定义表单项的验证规则数组
+const formItemRules: any = [
+  // 规则1: 必填验证
+  { required: true, message: '请输入你的密码' },
+  // 规则2: 密码长度验证
+  { min: 6, message: '密码长度过低' }
+];
+
+// 如果是确认密码项,添加一条自定义验证规则
+if (props.propName === 'confirmPassword') {
+  formItemRules.push({
+    // 自定义验证规则,异步验证两次密码是否一致
+    validator: async (rule: any, value: string, callback: Function) => {
+      console.log(rule);
+      if (value === confirmPassword.value) {
+        callback(); // 验证通过
+      } else {
+        callback(new Error('两次密码输入不一致')); // 验证不通过,返回错误提示
+      }
+    }
+  });
+}
+const buttonLoading = defineModel('buttonLoading', {type: Boolean, required:  true} )
+const emits = defineEmits(['submitClick'])
+
+const handleButtonClick = () => {
+  // 设置loading状态
+  buttonLoading.value = true;
+  emits('submitClick', () => {
+    // 操作完成后重置loading状态
+    buttonLoading.value = false;
+  });
+};
+</script>
+
+<template>
+  <!-- 使用 el-form-item 包裹 el-input,绑定验证规则 -->
+  <el-form-item :prop="props.propName" :rules="formItemRules">
+    <el-input
+        v-model.trim="password"
+        @keydown.enter="handleButtonClick"
+        minlength="6"
+        type="password"
+        show-password
+        clearable
+        :placeholder="props.placeholder || '请输入登陆密码'"
+    />
+  </el-form-item>
+</template>
+
+<style scoped lang="scss"></style>

+ 31 - 0
src/components/common/login/component/SubmitFormBtn.vue

@@ -0,0 +1,31 @@
+<script setup lang="ts">
+const emits = defineEmits(['submitClick'])
+const buttonLoading = defineModel('buttonLoading', {type: Boolean, required:  true} )
+const handleButtonClick = () => {
+  // 设置loading状态
+  buttonLoading.value = true;
+  emits('submitClick', () => {
+    // 操作完成后重置loading状态
+    buttonLoading.value = false;
+  });
+};
+</script>
+
+<template>
+  <el-form-item>
+    <el-button
+        type="primary"
+        class="bf-login-submit-btn"
+        @click="handleButtonClick"
+        :loading="buttonLoading"
+    >
+      <slot>
+        登陆
+      </slot>
+    </el-button>
+  </el-form-item>
+</template>
+
+<style scoped lang="scss">
+
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 91 - 0
src/components/create/CreateConversation.vue


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 95 - 0
src/components/imageGenerater/ImageConversation.vue


+ 177 - 0
src/components/imageGenerater/ImageMessageBubble.vue

@@ -0,0 +1,177 @@
+<template>
+    <div class="message" :class="{ 'user-message': isUser }">
+        <div class="message-content">
+            <div class="avatar" v-if="isUser">
+                <img src="@/assets/dear.png" alt="AI Avatar" class="avatar-img" />
+            </div>
+            <div class="avatar" v-else>
+                <img src="@/assets/user.jpeg" alt="User Avatar" class="avatar-img" />
+            </div>
+            <div class="bubble-wrapper">
+                <div class="bubble">
+                    <span v-if="props.imageMessage.sender === 'ai'">
+                        <img :src="url" alt="AI Image">
+                    </span>
+                    <span v-else>
+                        {{ text }}
+                    </span>
+                </div>
+                <div class="message-time" :class="{ 'user-time': isUser }">
+                    {{ props.imageMessage.sentAt }}
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup lang="ts">
+
+import { ImageMessage } from '@/stores/imageConversation';
+import { computed } from 'vue';
+
+const props = defineProps<{
+    imageMessage: ImageMessage;
+}>();
+const text = computed(() => {
+    if ("text" in props.imageMessage) {
+        return props.imageMessage.text
+    }
+})
+const url = computed(() => {
+    if ("url" in props.imageMessage) {
+        return props.imageMessage.url
+    }
+})
+const isUser = computed(() => props.imageMessage.sender === 'user');
+</script>
+
+
+<style scoped>
+.message {
+    position: relative;
+    margin: 8px 0;
+    padding: 5px;
+    animation: fadeIn 0.3s ease;
+
+    display: flex;
+    flex-direction: column;
+    width: fit-content;
+    padding-bottom: 16px;
+}
+
+.user-message {
+    align-items: flex-end;
+    width: 100%;
+}
+
+.message-content {
+    display: flex;
+    align-items: flex-start;
+    justify-content: space-between;
+    gap: 5px;
+    flex-direction: row;
+    width: 100%;
+    /* 默认头像在左,消息在右 */
+}
+
+.user-message .message-content {
+    flex-direction: row-reverse;
+    /* 用户消息时头像在右,消息在左 */
+}
+
+.avatar {
+    width: 36px;
+    height: 36px;
+    border-radius: 50%;
+    background: transparent;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-shrink: 0;
+    overflow: hidden;
+}
+
+.avatar-img {
+    width: 36px;
+    height: 36px;
+    object-fit: cover;
+}
+
+.bubble-wrapper {
+    width: 95%;
+    flex: 1;
+    min-width: 0;
+    background: #F5EFE6;
+    color: #000;
+    border: 1px solid #6366f1;
+    border-radius: 10px;
+    /* padding-left: 10px; */
+}
+
+.user-message .bubble-wrapper {
+    padding: 0 20px;
+    flex: unset;
+}
+
+.bubble {
+    /* padding: 14px 18px; */
+    position: relative;
+    transition: all 0.3s ease;
+    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
+    font-size: 16px;
+    line-height: 1.7;
+    letter-spacing: 0.3px;
+    word-spacing: 1px;
+    color: #2c3e50;
+}
+
+.user-message .bubble {
+    color: #6366f1;
+    font-weight: 400;
+    letter-spacing: 0.4px;
+}
+
+.message-time {
+    position: absolute;
+    font-size: 0.75rem;
+    color: #666;
+    margin-top: 4px;
+    text-align: left;
+    left: 50px;
+}
+
+.user-time {
+    text-align: right;
+    right: 55px;
+}
+
+@keyframes fadeIn {
+    from {
+        opacity: 0;
+        transform: translateY(10px);
+    }
+
+    to {
+        opacity: 1;
+        transform: translateY(0);
+    }
+}
+
+:deep(.v-theme--dark) {
+    .avatar {
+        background: #2d3748;
+    }
+
+    .bubble {
+        color: #e2e8f0;
+    }
+
+    .user-message .bubble {
+        color: #7c3aed;
+    }
+
+    .message-time {
+        color: #a0aec0;
+    }
+}
+</style>

+ 140 - 0
src/components/imageGenerater/PromptInput.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="input-wrapper">
+    <div class="input-section">
+      <div class="example-tags">
+        <span class="tag" @click="selectTag('适合礼裙的款式图')">适合礼裙的款式图</span>
+        <span class="tag" @click="selectTag('用于童装的猫咪图')">用于童装的猫咪图</span>
+        <span class="tag" @click="selectTag('常见的球服设计图')">常见的球服设计图</span>
+      </div>
+      <div class="input-container">
+        <input type="text" class="prompt-input" placeholder="输入您想要创作的图片描述" v-model="inp"
+          @keyup.enter="$emit('send', inp)" />
+        <div class="button-group">
+          <button class="upload-btn">
+            <img src="@/assets/imageGeneraterView/imageGeneraterIcon.svg" alt="upload" />
+          </button>
+          <el-button native-type="submit" type="primary" @click="$emit('send', inp)" :disabled="is">发送</el-button>
+
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, watch } from 'vue'
+const inp = defineModel('modelValue', {
+  type: String,
+  required: true
+})
+const props = defineProps({
+  isSending: {
+    type: Boolean,
+    default: false
+  },
+  handleUserMessage: {
+    type: Function
+  }
+})
+const emits = defineEmits(['send'])
+const selectTag = (tag) => {
+  emits('send', tag)
+}
+const is = ref(false)
+watch(() => props.isSending, (newVal) => {
+  console.log(`output->isSending`, newVal)
+  is.value = newVal
+}, { immediate: true })
+</script>
+
+<style scoped>
+.input-wrapper {
+  position: absolute;
+  bottom: 0;
+  left: 50%;
+  transform: translateX(-50%);
+  width: 830px;
+  display: flex;
+  justify-content: center;
+  margin-bottom: 20px;
+}
+
+.input-section {
+  width: 100%;
+  max-width: 800px;
+}
+
+.example-tags {
+  display: flex;
+  gap: 12px;
+  margin-bottom: 12px;
+}
+
+.tag {
+  font-size: 14px;
+  color: #666;
+  cursor: pointer;
+  transition: color 0.3s;
+}
+
+.tag:hover {
+  color: #333;
+}
+
+.input-container {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  background-color: #f5f5f5;
+  border-radius: 12px;
+  padding: 12px;
+}
+
+.prompt-input {
+  flex: 1;
+  border: none;
+  background: none;
+  outline: none;
+  font-size: 14px;
+  color: #333;
+}
+
+.prompt-input::placeholder {
+  color: #999;
+}
+
+.button-group {
+  display: flex;
+  gap: 8px;
+}
+
+.upload-btn {
+  background: none;
+  border: none;
+  padding: 8px;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.upload-btn img {
+  width: 20px;
+  height: 20px;
+}
+
+.send-btn {
+  background-color: #007AFF;
+  color: white;
+  border: none;
+  border-radius: 8px;
+  padding: 8px 16px;
+  font-size: 14px;
+  cursor: pointer;
+  transition: background-color 0.3s;
+}
+
+.send-btn:hover {
+  background-color: #0056b3;
+}
+</style>

+ 35 - 0
src/directives/permission.ts

@@ -0,0 +1,35 @@
+import type { Directive, DirectiveBinding } from 'vue'
+import { userStore } from '@/stores/user'
+
+export const vAuth: Directive = {
+  mounted(el: HTMLElement, binding: DirectiveBinding) {
+    el.addEventListener('click', async (e: Event) => {
+      e.stopPropagation()
+
+      const user = userStore();
+      const callback = binding.value
+
+      if (typeof callback !== 'function') {
+        return
+      }
+
+      if (!user.checkUserLoggedIn) {
+        // 这里调用你现有的显示登录框方法
+        user.showLoginModel = true
+        return
+      }
+
+      try {
+        await callback(e)
+      } catch (error) {
+        console.error('操作执行失败:', error)
+      }
+    })
+  }
+}
+
+export default {
+  install(app: any) {
+    app.directive('auth', vAuth)
+  }
+}

+ 65 - 0
src/enums/bfApiMessage.ts

@@ -0,0 +1,65 @@
+/**
+ * @Description: 后端提示信息
+ * @author:wm
+ * @date 2024/3/15 14:46
+*/
+enum BfApiMessage {
+    COMPLETED = "操作已完成。",
+    FAILED = "操作失败。",
+    REGISTER_COMPLETED = "注册完成。",
+    REGISTER_USER_EXISTED = "该手机号码已存在。",
+    REGISTER_USER_NOT_EXISTED = "该手机号码不存在。",
+    REGISTER_FAILED = "注册失败。",
+    LOGIN_ERROR = "登录失败,请确认手机号和密码填写是否正确",
+    LOGIN_COMPLETION = "登录完成。",
+    COVER_NOT_NULL = "封面不为空。",
+    NAME_NOT_NULL = "名称不为空。",
+    PARAMETERS_ERROR = "参数有误,请确认参数是否已经填写完毕。",
+    AUTH_CODE_ERROR = "验证码错误",
+    USER_EXISTED = "用户已存在。",
+    USER_NOT_EXISTED = "用户不存在。",
+    OBJECT_EXISTED = "关联已存在。",
+    RESET_PASSWORD_ERROR = "重设密码失败。",
+    USER_IDENTITY_AUTH_COMPLETED = "认证已提交完成,请等候消息。",
+    USER_IDENTITY_AUTH_FAILED = "认证失败。",
+    USER_IMAGE_TYPE_ERROR = "图片类型有误。",
+    USER_UPLOAD_ID_CARD_SUCCESS = "上传身份证信息完成。",
+    USER_IMAGE_IS_NOT_EXISTED = "用户头像不存在。",
+    GOODS_IS_NOT_FOR_SELL = "此产品已下架。",
+    BEYOND_THE_LIMIT = "已经超过限制。",
+    CAPACITY_LIMIT = "你的容量已到达限制数量。",
+    CONTENT_TYPE_ERROR = "内容类型错误。",
+    FILE_IS_NOT_EXIST = "文件不存在。",
+    SHARE_CHECK_ENCRYPT_ERROR = "检查加密有误。",
+    SHARE_TYPE_ERROR = "分享类型错误。",
+    ID_NOT_BELONG_UID = "ID不属于UID",
+    SHARE_LINK_NEED_PASSWORD = "请输入密码。",
+    SHARE_LINK_PASSWORD_WRONG = "密码错误。",
+    LINK_HAS_EXPIRED = "链接已过期",
+    COPY_FAILED = "复制失败。",
+    COPY_SUCCESS = "复制完成。",
+    PASSWORD_ERROR = "密码错误。",
+    FORM_ERROR = "请确认提交的信息无误。",
+    FORM_ERROR_ENCLOSURE = "请添加附件",
+    REQUEST_NOT_EXISTED = "请求不存在。",
+    USER_EXPIRED = "用户已过期,请重新登录。",
+    REQUEST_TIME_OUT = "请求超时,请确认是否能够连接到网络。",
+    UNKNOWN_ERROR = "抱歉,服务器开小差啦。",
+    SERVER_ERROR = "抱歉,服务器开小差啦。",
+    ERROR_REQUEST = "抱歉,服务器开小差啦。",
+    ERR_NETWORK = "抱歉,服务器开小差啦。",
+    LIBRARY_DATA_NOT_EXIST = "模型云库数据不存在。",
+    NO_PERMISSION = "权限不足",
+    PAY_ERROR = "支付失败。",
+    NO_MORE_MODELS = "已经加载了所有的模型啦。",
+    ENCODE_MODEL_ERROR = "请上传三角形网格格式的obj。",
+    SAVE_SUCCESS = "保存完成。",
+    ERROR_ATTR_ITEM = "请至少添加一项规格值",
+    STORE_NOT_EXIST = "该店铺不存在",
+    OAUTH_FALSE = "授权失败",
+    OAUTH_BIND_PHONE = "请绑定手机号",
+    OAUTH_ALREADY_BIND_PHONE = "已绑定手机",
+    LIBRARY_USE_ERROR = "模型库使用错误",
+    TEXT_CONTAIONS_SENSITIVE_CHARACTERS ="文中保函敏感词"
+}
+export default BfApiMessage;

+ 5 - 0
src/enums/tabType.ts

@@ -0,0 +1,5 @@
+export enum TabType {
+    THEME,
+    IMAGE_TEMPLATE,
+    PICTURES
+}

+ 8 - 0
src/enums/toolbarType.ts

@@ -0,0 +1,8 @@
+export enum ToolbarType  {
+    PRODUCT,
+    TEMPLATE,
+    LAYER,
+    GALLERY,
+    UPLOAD,
+    TEXT
+}

+ 41 - 0
src/enums/verification.ts

@@ -0,0 +1,41 @@
+export enum AuthCodeType {
+    REGISTER = 1,
+    FORGOTTEN_PASSWORD = 2,
+    PHONE_CHANGING = 3,
+    WECHAT_LAUNCH = 4,
+    PHONE_LOGIN = 5,
+    RESET_PASSWORD = 6,
+    SUPPLIER_AUTH = 7,
+    DESIGNER_MANAGE = 8,
+    PLM_MANAGE = 9
+}
+
+export interface UserAuthInfo {
+    username: string;
+    password: string;
+}
+
+export interface AuthCodeRequestInfo {
+    phone: string;
+    type: AuthCodeType;
+}
+
+export interface PhoneAuthInfo {
+    phone: string;
+    code: string;
+}
+
+export interface WechatPhoneBindingInfo extends PhoneAuthInfo {
+    openId: string;
+}
+
+export interface PhonePasswordInfo extends PhoneAuthInfo {
+    password: string;
+}
+
+export class WechatTokenWrapper {
+    token?: string;
+    openId = '';
+    type = '';
+    message = '';
+}

+ 271 - 0
src/layouts/components/aiChat/Design/LeftAsideBar.vue

@@ -0,0 +1,271 @@
+<script setup lang="ts">
+import Other from '@/components/common/leftAside/Other.vue'
+import Conversation from '@/components/common/leftAside/Conversation.vue'
+import { getSVGConversations } from '@/api/aiSVG'
+import { onMounted, ref, watch, computed } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { userStore } from '@/stores/user'
+import useCreateConversationStore from '@/stores/svgConversation'
+import { useThreeProduct } from "@/stores/product.ts";
+import { cdnUrl } from "@/utils/common.ts"
+import { ConversationActions } from '@/types/conversationActions'
+
+const user = userStore()
+const createConversationStore = useCreateConversationStore()
+const route = useRoute()
+const router = useRouter()
+/**
+ * 封装获取会话列表的方法
+ */
+const getConversations = async () => {
+  const res = await getSVGConversations()
+  createConversationStore.saveConversationList(res)
+}
+
+/**
+ * 如果用户首次登录成功,获取会话列表
+ */
+watch(() => user.checkUserLoggedIn, (value) => {
+  if (value) {
+    getConversations()
+  }
+}, { immediate: true })
+
+
+
+
+
+/**
+ * 封装新建对话的方法
+ */
+const newChat = async () => {
+  //如果当前就是新会话,不做任何处理
+  if (createConversationStore.conversationId === "-1") {
+    return;
+  }
+  createConversationStore.newConversation()
+  createConversationStore.conversationId = '-1'
+  router.push({ name: 'AiCreate', query: { conversationId: -1 } })
+}
+const $useThreeProduct = useThreeProduct();
+const useTheme = (template: any) => {
+  $fabricEditor.setTheme({ ...template })
+}
+const dataList = computed(() => $useThreeProduct.getThemeList)
+const searchValue = ref<string>('')
+const handleSearch = () => {
+  $useThreeProduct.getSearchValue(searchValue.value)
+  dataList.value = $useThreeProduct.searchValues
+}
+
+// 封装方法对象,符合 ConversationActions 接口
+const actions: ConversationActions = {
+  updateConversationTitle: async (messageId, title, isEdit) => {
+    await createConversationStore.updateConversationMesg(messageId, title)
+    isEdit.value = false
+  },
+  deleteConversation: async (conversationId) => {
+    createConversationStore.deleteConversation(conversationId)
+  },
+  onSelect: (conversationId) => {
+    createConversationStore.conversationId = conversationId
+    setActiveIndex(conversationId) // 设置当前高亮的索引
+
+    router.push({ name: 'AiCreate', query: { conversationId } })
+  }
+}
+const activeIndex = ref('')
+const setActiveIndex = (index: string) => {
+  activeIndex.value = index // 设置当前高亮的索引
+}
+</script>
+<template>
+  <aside id="aside">
+    <button type="button" v-auth="() => newChat()" class="new-chat">新建对话</button>
+    <div class="sys-theme-list">
+      <div class="sticker-container">
+        <!--        <div class="sticker-header">-->
+        <!--          <span>主体设计</span>-->
+        <!--          <span>我的图库</span>-->
+        <!--        </div>-->
+        <div class="sticker-search">
+          <input type="text" v-model="searchValue" @keyup.enter="handleSearch" placeholder="贴图名称/编号">
+          <svg @click="handleSearch" width="16" height="16" viewBox="0 0 16 16" fill="none"
+            xmlns="http://www.w3.org/2000/svg">
+            <path
+              d="M15.7 14.3L11.5 10.1C12.4 9 13 7.6 13 6C13 2.7 10.3 0 7 0C3.7 0 1 2.7 1 6C1 9.3 3.7 12 7 12C8.6 12 10 11.4 11.1 10.5L15.3 14.7C15.5 14.9 15.8 14.9 16 14.7C16.1 14.5 16.1 14.3 15.7 14.3ZM2 6C2 3.2 4.2 1 7 1C9.8 1 12 3.2 12 6C12 8.8 9.8 11 7 11C4.2 11 2 8.8 2 6Z"
+              fill="#9CA3AF" />
+          </svg>
+        </div>
+        <div class="sticker-grid">
+          <div class="sticker-item" v-for="template in dataList" @click="useTheme(template)" :key="template.id">
+            <img :src="cdnUrl(template.cover)" :alt="template.name" />
+          </div>
+          <el-empty v-if="!dataList.length"
+            style="position: absolute; top: 50%;left: 50%;transform: translate(-50%, -50%);" image-size="80"
+            description="暂无数据" />
+        </div>
+      </div>
+    </div>
+    <el-divider />
+    <div class="histort-conversation-title" style="align-self: flex-start;margin-left:16px ;">历史会话</div>
+    <el-scrollbar max-height="400px" style="width: 100%;max-height: 400px;">
+      <div class="history">
+        <el-menu>
+          <el-menu-item v-for="conversation in createConversationStore.conversationList"
+            :key="conversation.conversationId">
+            <Conversation :conversation :actions :activeIndex @setActiveIndex="setActiveIndex" />
+          </el-menu-item>
+        </el-menu>
+      </div>
+    </el-scrollbar>
+
+    <Other :activeIndex @setActiveIndex="setActiveIndex" />
+  </aside>
+</template>
+
+<style scoped>
+#aside {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-items: center;
+  align-items: center;
+  background-color: #EEEAEA;
+
+  .new-chat {
+    width: 231px;
+    height: 36px;
+    margin-top: 13px;
+    border-radius: 15px;
+    padding-top: 9px;
+    padding-right: 77px;
+    padding-bottom: 9px;
+    padding-left: 77px;
+    background-color: #000000;
+    color: #FFFFFF;
+    font-size: 15px;
+  }
+
+  .sys-theme-list {
+    width: 100%;
+    padding: 26px 10px 10px 10px;
+    box-sizing: border-box;
+  }
+}
+
+.history {
+  margin-left: 10px;
+
+  .el-menu-item {
+    background-color: #EEEAEA;
+
+    .dialog {
+      width: 100%;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      font-size: 13px;
+    }
+  }
+
+
+}
+
+.histort-conversation-title {
+  font-family: Inter;
+  font-weight: 300;
+  font-size: 12px;
+
+}
+
+.sticker-container {
+  background-color: #FFFFFF;
+  border-radius: 8px;
+  padding: 12px;
+  width: 100%;
+  box-sizing: border-box;
+  max-width: 100%;
+}
+
+.sticker-header {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-bottom: 12px;
+  font-size: 14px;
+  font-weight: 500;
+  color: #4B5563;
+}
+
+.sticker-header span {
+  flex: 1;
+  cursor: pointer;
+  text-align: center;
+}
+
+.sticker-search {
+  position: relative;
+  margin-bottom: 12px;
+}
+
+.sticker-search input {
+  width: 100%;
+  height: 36px;
+  border: 1px solid #E5E7EB;
+  border-radius: 18px;
+  padding: 0 36px 0 12px;
+  font-size: 13px;
+  outline: none;
+  box-sizing: border-box;
+}
+
+.sticker-search svg {
+  position: absolute;
+  right: 12px;
+  top: 10px;
+}
+
+.sticker-grid {
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  gap: 8px;
+  margin-bottom: 12px;
+  height: 209px;
+  overflow-y: auto;
+  position: relative;
+}
+
+.sticker-item {
+  aspect-ratio: 1/1;
+  background-color: #F9FAFB;
+  border-radius: 8px;
+  overflow: hidden;
+  cursor: pointer;
+  width: 55px;
+  height: 55px;
+}
+
+.sticker-item img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+
+.sticker-more {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: #F9FAFB;
+  border-radius: 8px;
+  padding: 8px;
+  cursor: pointer;
+  color: #6B7280;
+  font-size: 13px;
+}
+
+.sticker-more svg {
+  margin-left: 8px;
+}
+</style>

+ 208 - 0
src/layouts/components/aiChat/Design/RightAsideBar.vue

@@ -0,0 +1,208 @@
+<template>
+    <aside id="aside">
+        <div class="aside-content">
+            <div class="model-section">
+                <div class="model-section-title">
+                    <svg width="25" height="22" viewBox="0 0 25 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+                        <g clip-path="url(#clip0_1116_3867)">
+                            <path
+                                d="M6.50039 22C6.06638 22 5.65015 21.8068 5.34325 21.463C5.03636 21.1192 4.86395 20.6529 4.86395 20.1667V17.1111H4.88032V12.0218C4.80722 12.0389 4.74285 12.0548 4.67522 12.0634L4.56939 12.0707C4.30211 12.0707 4.03482 11.9644 3.82318 11.7676L3.72281 11.6612L0.804488 8.1498C0.618224 7.93082 0.510127 7.64291 0.500676 7.34061C0.491226 7.03831 0.58108 6.74263 0.753213 6.50958L0.849218 6.39347L5.48362 0.360595C5.66107 0.155419 5.89924 0.0298254 6.15347 0.00737322L6.28547 3.9996e-05H9.11542C9.53872 3.9996e-05 9.9391 0.265262 10.1409 0.673483L10.2315 0.845816L10.3591 1.0487C10.7006 1.54982 11.3628 2.18904 12.5247 2.18904C13.8513 2.18904 14.5277 1.35304 14.8179 0.845816L14.9084 0.674706C15.0873 0.310484 15.4059 0.0611512 15.7877 0.00981792L15.9339 3.9996e-05H18.897C19.1601 -0.00239303 19.4145 0.106257 19.6094 0.304373L19.6988 0.409484L24.1554 6.44236C24.3533 6.65035 24.475 6.93352 24.4965 7.23658C24.5181 7.53964 24.4381 7.84084 24.2721 8.08136L24.1783 8.19747L21.1476 11.5891C20.924 11.8299 20.6131 11.9741 20.301 11.9741L20.145 11.9497V19.5763C20.1448 19.5968 20.143 19.6173 20.1396 19.6374L20.1374 20.1667C20.1374 20.6529 19.965 21.1192 19.6581 21.463C19.3512 21.8068 18.935 22 18.501 22H6.50039ZM17.2169 7.33336H15.4212C15.0219 7.33336 14.6826 7.75258 14.6826 8.22069V9.10069C14.6826 10.1371 15.4212 11 16.319 11C16.7772 11 17.2169 10.7776 17.5365 10.384C17.8158 10.0381 17.9555 9.57002 17.9555 9.10069V8.24514C17.9555 7.75258 17.6162 7.33336 17.2169 7.33336Z"
+                                fill="#4B5563" />
+                        </g>
+                        <defs>
+                            <clipPath id="clip0_1116_3867">
+                                <rect width="24" height="22" fill="white" transform="translate(0.5)" />
+                            </clipPath>
+                        </defs>
+                    </svg>
+                    <h3>我的模型</h3>
+                </div>
+
+                <div class="model-grid">
+                    <div class="model-item" v-for="(model, index) in models" :key="model.id" @click="tabModel(model)">
+                        <img :src="model.pic" :alt="model.name">
+                    </div>
+                </div>
+                <button class="more-models-btn">更多模型</button>
+            </div>
+
+            <div class="reference-section">
+                <div class="reference-item">
+                    <h4 class="title">参考资料</h4>
+                </div>
+                <div class="reference-item">
+                    <div class="reference-title">高级定制服务</div>
+                    <div class="reference-desc">优质面料,精致细节</div>
+                </div>
+                <div class="reference-item">
+                    <div class="reference-title">高级面料</div>
+                    <div class="reference-desc">真丝感动</div>
+                </div>
+            </div>
+            <hr style="border: 1px solid #E5E7EB; width: 90%; margin: 38.5px auto;">
+            <div class="history-section">
+                <h4 class="title">生成历史</h4>
+                <div class="history-item" v-for="(item, index) in historyItems" :key="index">
+                    <div class="history-title">{{ item.title }}</div>
+                    <div class="history-time">{{ item.time }}</div>
+                </div>
+            </div>
+        </div>
+    </aside>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue';
+import { fetchProductList } from "@/api/design.js";
+
+const models = ref([]);
+
+const historyItems = ref([
+    { title: '连衣裙设计 v1', time: '2024-01-20 14:30' },
+    { title: '连衣裙设计 v2', time: '2024-01-20 14:35' },
+]);
+
+const pageNo = ref(1)
+const pageSize = ref(6)
+const getProductList = async () => {
+    models.value = await fetchProductList({ pageNo: pageNo.value, pageSize: pageSize.value });
+}
+getProductList()
+
+// 切换模型
+const tabModel = async (modelItem) => {
+    console.log(modelItem);
+    window.location.href = '/create?productId=' + modelItem.id;
+}
+</script>
+
+<style scoped>
+#aside {
+    width: 100%;
+    height: 100%;
+    background-color: #EEEAEA;
+    padding: 16px;
+    overflow-y: auto;
+    overflow-x: hidden;
+    box-sizing: border-box;
+}
+
+.aside-content {
+    display: flex;
+    flex-direction: column;
+    gap: 24px;
+    max-width: 100%;
+}
+
+.model-section-title {
+    height: 22px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 10px;
+    margin: 39px 29px 12px 28px;
+
+    h3 {
+        margin: 0;
+
+        font-family: Inter;
+        font-weight: 600;
+        font-size: 18px;
+        letter-spacing: 0%;
+
+    }
+}
+
+h3,
+h4 {
+    margin: 0;
+    padding: 0;
+    font-weight: 500;
+    margin-bottom: 12px;
+}
+
+.model-grid {
+    display: grid;
+    grid-template-columns: repeat(2, 1fr);
+    gap: 8px;
+    margin-bottom: 12px;
+}
+
+.model-item {
+    border-radius: 8px;
+    overflow: hidden;
+    background-color: #fff;
+    aspect-ratio: 1;
+}
+
+.model-item img {
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+}
+
+.more-models-btn {
+    width: 100%;
+    padding: 10px;
+    background-color: #fff;
+    border: none;
+    border-radius: 8px;
+    cursor: pointer;
+    font-size: 14px;
+}
+
+.reference-section,
+.history-section {
+    display: flex;
+    flex-direction: column;
+    gap: 12px;
+}
+
+.reference-item,
+.history-item {
+    font-family: Inter;
+    font-weight: 200;
+    font-size: 14px;
+    line-height: 100%;
+    letter-spacing: 0%;
+    color: #000;
+    padding: 8px 0;
+    word-wrap: break-word;
+    overflow-wrap: break-word;
+}
+
+.reference-title {
+    font-weight: 500;
+    margin-bottom: 4px;
+}
+
+.reference-desc {
+    font-family: Inter;
+    font-weight: 400;
+    font-size: 13px;
+    line-height: 100%;
+    letter-spacing: 0%;
+
+    font-size: 12px;
+    color: #666;
+}
+
+.history-title {
+    font-weight: 500;
+    margin-bottom: 4px;
+}
+
+.history-time {
+    font-size: 12px;
+    color: #666;
+}
+
+.title {
+    font-family: Inter;
+    font-weight: 600;
+    font-size: 12px;
+    line-height: 100%;
+    letter-spacing: 0%;
+    color: #6B7280;
+}
+</style>

+ 213 - 0
src/layouts/components/aiChat/LeftAsideBar.vue

@@ -0,0 +1,213 @@
+<script setup lang="ts">
+
+import Other from '@/components/common/leftAside/Other.vue'
+import Conversation from '@/components/common/leftAside/Conversation.vue'
+import { deleteMessages, getConversationList } from '@/api/conversation'
+import { onMounted, ref, watch } from 'vue'
+import { useRoute } from 'vue-router'
+import { userStore } from '@/stores/user'
+import useChatConversationStore from '@/stores/chatConversation'
+import router from '@/router'
+import { ConversationActions } from '@/types/conversationActions'
+
+const user = userStore()
+const chatConversationStore = useChatConversationStore()
+const route = useRoute()
+
+
+
+/**
+ * 封装获取会话列表的方法
+ */
+const getConversations = async () => {
+    const res = await getConversationList()
+    chatConversationStore.saveConversationList(res)
+    if (route.query.conversationId === '-1' || route.query.conversationId === undefined) {
+        router.push({ name: 'home', query: { conversationId: res[0].conversationId } })
+    }
+}
+/**
+ * 如果用户首次登录成功,获取会话列表
+ */
+watch(() => user.checkUserLoggedIn, (value) => {
+    if (value) {
+        getConversations()
+    }
+}, { immediate: true })
+
+
+
+
+
+/**
+ * 封装新建对话的方法
+ */
+const newChat = () => {
+    //如果当前就是新会话,不做任何处理
+    if (route.query.conversationId === "-1") {
+        return;
+    }
+    console.log('新建对话')
+    chatConversationStore.newConversation()
+    chatConversationStore.conversationId = '-1'
+    router.push({ path: 'home', query: { conversationId: -1 } })
+}
+
+
+// 封装方法对象,符合 ConversationActions 接口
+const actions: ConversationActions = {
+    updateConversationTitle: async (messageId, title, isEdit) => {
+        await chatConversationStore.updateConversationMesg(messageId, title)
+        isEdit.value = false
+    },
+    deleteConversation: async (conversationId) => {
+        chatConversationStore.deleteConversation(conversationId)
+    },
+    onSelect: (conversationId) => {
+        chatConversationStore.conversationId = conversationId
+        setActiveIndex(conversationId) // 设置当前高亮的索引
+        router.push({ name: 'home', query: { conversationId } })
+    }
+}
+
+const activeIndex = ref('')
+const setActiveIndex = (index: string) => {
+    activeIndex.value = index // 设置当前高亮的索引
+}
+</script>
+<template>
+    <aside id="aside">
+        <button type="button" v-auth="() => newChat()" class="new-chat">新建对话</button>
+        <div class="category">
+            <!-- <div class="role">
+                <svg width="14" height="13" viewBox="0 0 14 13" fill="none" xmlns="http://www.w3.org/2000/svg"
+                    style="margin-right: 10px;">
+                    <path
+                        d="M2.1 1.05087C2.1 0.795873 2.1656 0.585875 2.29688 0.421875C2.42816 0.257875 2.59584 0.175873 2.8 0.175873H9.8H11.2C11.9875 0.193873 12.651 0.530881 13.1906 1.18788C13.7157 1.86288 13.9854 2.69187 14 3.67587C13.9854 4.66087 13.7157 5.48988 13.1906 6.16388C12.651 6.82088 11.9875 7.15787 11.2 7.17587H10.5C10.4854 7.92287 10.2813 8.54288 9.88752 9.03488C9.49376 9.52788 8.99792 9.78287 8.4 9.80087H4.2C3.60208 9.78287 3.10624 9.52788 2.71248 9.03488C2.31872 8.54288 2.11456 7.92287 2.1 7.17587V1.05087ZM10.5 5.42587H11.2C11.5938 5.40787 11.9219 5.23488 12.1844 4.90688C12.4469 4.57788 12.5854 4.16787 12.6 3.67587C12.5854 3.18387 12.4469 2.77388 12.1844 2.44588C11.9219 2.11688 11.5938 1.94387 11.2 1.92587H10.5V5.42587ZM0.7 10.6759H11.9C12.1042 10.6759 12.2718 10.7579 12.4031 10.9219C12.5344 11.0859 12.6 11.2959 12.6 11.5509C12.6 11.8059 12.5344 12.0159 12.4031 12.1799C12.2718 12.3439 12.1042 12.4259 11.9 12.4259H0.7C0.49584 12.4259 0.328161 12.3439 0.196881 12.1799C0.0656011 12.0159 0 11.8059 0 11.5509C0 11.2959 0.0656011 11.0859 0.196881 10.9219C0.328161 10.7579 0.49584 10.6759 0.7 10.6759Z"
+                        fill="#4B5563" />
+                </svg>
+                悠闲聊天
+                <svg style="margin-left:auto ;" width="9" height="12" viewBox="0 0 9 12" fill="none"
+                    xmlns="http://www.w3.org/2000/svg">
+                    <path
+                        d="M8.3751 5.38381C8.56253 5.56307 8.65625 5.76784 8.65625 6C8.65625 6.23216 8.56253 6.43785 8.3751 6.61613L2.3751 11.759C2.16596 11.9196 1.92711 12 1.65625 12C1.38539 12 1.14654 11.9196 0.937395 11.759C0.749967 11.5807 0.65625 11.375 0.65625 11.1429C0.65625 10.9107 0.749967 10.7059 0.937395 10.5267L6.25054 6L0.937395 1.47327C0.749967 1.29499 0.65625 1.08931 0.65625 0.857143C0.65625 0.62498 0.749967 0.420217 0.937395 0.240952C1.14654 0.0802988 1.38539 0 1.65625 0C1.92711 0 2.16596 0.0802988 2.3751 0.240952L8.3751 5.38381Z"
+                        fill="#4B5563" />
+                </svg>
+
+            </div> -->
+
+            <!-- <div class="role">
+                <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg"
+                    style="margin-right: 10px;">
+                    <path
+                        d="M7 1.614C5.3959 1.65 4.056 2.206 2.9805 3.282C1.905 4.357 1.349 5.69699 1.3125 7.30099V8.395C1.276 8.795 1.0573 9.014 0.6562 9.05099C0.2552 9.014 0.0365 8.795 0 8.395V7.30099C0.0182 5.988 0.337201 4.812 0.957001 3.774C1.5768 2.716 2.4154 1.878 3.4727 1.258C4.5117 0.637996 5.6875 0.318995 7 0.300995C8.3125 0.318995 9.4883 0.637996 10.5273 1.258C11.5846 1.878 12.4232 2.716 13.043 3.774C13.6628 4.812 13.9818 5.988 14 7.30099V11.239C13.9818 11.913 13.7448 12.478 13.2891 12.934C12.8334 13.389 12.2683 13.626 11.5938 13.645H8.5859C8.3307 14.064 7.9479 14.283 7.4375 14.301H6.5625C6.1979 14.283 5.888 14.155 5.6328 13.918C5.3958 13.662 5.2682 13.353 5.25 12.989C5.2682 12.624 5.3958 12.314 5.6328 12.059C5.888 11.821 6.1979 11.694 6.5625 11.676H7.4375C7.9479 11.694 8.3307 11.912 8.5859 12.332H11.5938C11.9037 12.332 12.1589 12.222 12.3594 12.004C12.5781 11.803 12.6875 11.548 12.6875 11.239V7.30099C12.651 5.69699 12.095 4.357 11.0195 3.282C9.944 2.206 8.6041 1.65 7 1.614ZM3.9375 5.989H4.375C4.6302 5.989 4.8398 6.071 5.0039 6.235C5.168 6.399 5.25 6.608 5.25 6.864V9.92599C5.25 10.181 5.168 10.391 5.0039 10.555C4.8398 10.719 4.6302 10.801 4.375 10.801H3.9375C3.4453 10.783 3.0351 10.61 2.707 10.282C2.3789 9.953 2.2057 9.54299 2.1875 9.05099V7.739C2.2057 7.246 2.3789 6.836 2.707 6.508C3.0351 6.18 3.4453 6.007 3.9375 5.989ZM10.0625 5.989C10.5547 6.007 10.9649 6.18 11.293 6.508C11.6211 6.836 11.7943 7.246 11.8125 7.739V9.05099C11.7943 9.54299 11.6211 9.953 11.293 10.282C10.9649 10.61 10.5547 10.783 10.0625 10.801H9.625C9.3698 10.801 9.1602 10.719 8.9961 10.555C8.832 10.391 8.75 10.181 8.75 9.92599V6.864C8.75 6.608 8.832 6.399 8.9961 6.235C9.1602 6.071 9.3698 5.989 9.625 5.989H10.0625Z"
+                        fill="#4B5563" />
+                </svg>
+                智能客服
+                <svg style="margin-left:auto ;" width="9" height="12" viewBox="0 0 9 12" fill="none"
+                    xmlns="http://www.w3.org/2000/svg">
+                    <path
+                        d="M8.3751 5.38381C8.56253 5.56307 8.65625 5.76784 8.65625 6C8.65625 6.23216 8.56253 6.43785 8.3751 6.61613L2.3751 11.759C2.16596 11.9196 1.92711 12 1.65625 12C1.38539 12 1.14654 11.9196 0.937395 11.759C0.749967 11.5807 0.65625 11.375 0.65625 11.1429C0.65625 10.9107 0.749967 10.7059 0.937395 10.5267L6.25054 6L0.937395 1.47327C0.749967 1.29499 0.65625 1.08931 0.65625 0.857143C0.65625 0.62498 0.749967 0.420217 0.937395 0.240952C1.14654 0.0802988 1.38539 0 1.65625 0C1.92711 0 2.16596 0.0802988 2.3751 0.240952L8.3751 5.38381Z"
+                        fill="#4B5563" />
+                </svg>
+
+            </div> -->
+
+        </div>
+        <el-divider />
+        <div class="history-conversation-title" style="align-self: flex-start;margin-left:16px ;">历史会话</div>
+        <el-scrollbar max-height="400px" style="width: 100%;max-height: 400px;">
+            <div class="history">
+                <el-menu>
+                    <el-menu-item v-for="conversation in chatConversationStore.conversationList"
+                        :key="conversation.conversationId">
+                        <Conversation :conversation :actions :activeIndex @setActiveIndex="setActiveIndex" />
+                    </el-menu-item>
+                </el-menu>
+            </div>
+        </el-scrollbar>
+        <!-- <Other :activeIndex @setActiveIndex="setActiveIndex" /> -->
+
+
+
+    </aside>
+</template>
+
+<style scoped>
+#aside {
+    width: 100%;
+    height: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    justify-items: center;
+    align-items: center;
+    background-color: #EEEAEA;
+
+    .new-chat {
+        width: 231px;
+        height: 36px;
+        margin-top: 13px;
+        border-radius: 15px;
+        padding-top: 9px;
+        padding-right: 77px;
+        padding-bottom: 9px;
+        padding-left: 77px;
+        background-color: #000000;
+        color: #FFFFFF;
+        font-size: 15px;
+    }
+
+    .category {
+        box-sizing: border-box;
+        box-sizing: border-box;
+        width: 231px;
+        margin: 0 10px;
+        margin-top: 26px;
+
+        padding-left: 0 20px;
+        padding-right: 15px;
+        padding-left: 0 20px;
+        padding-right: 15px;
+
+        .role {
+            width: 100%;
+            width: 100%;
+            display: flex;
+            font-size: 13px;
+            color: #4B5563;
+            font-weight: 500;
+            margin-bottom: 10px;
+            gap: 16px;
+            gap: 16px;
+        }
+    }
+
+
+}
+
+.history {
+    margin-left: 10px;
+
+    .el-menu-item {
+        background-color: #EEEAEA;
+
+        .dialog {
+            width: 100%;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            font-size: 13px;
+        }
+    }
+
+
+}
+
+.history-conversation-title {
+    font-family: Inter;
+    font-weight: 300;
+    font-size: 12px;
+
+}
+</style>

+ 105 - 0
src/layouts/components/aiChat/RightAsideBar.vue

@@ -0,0 +1,105 @@
+<script setup lang="ts">
+import { ref } from 'vue';
+const historyItems = ref([
+    { title: '连衣裙设计 v1', time: '2024-01-20 14:30' },
+    { title: '连衣裙设计 v2', time: '2024-01-20 14:35' },
+]);
+</script>
+
+<template>
+    <aside id="aside">
+
+        <!-- <div class="reference-section">
+            <div class="reference-item">
+                <h4 class="title">参考资料</h4>
+            </div>
+            <div class="reference-item">
+                <div class="reference-title">高级定制服务</div>
+                <div class="reference-desc">优质面料,精致细节</div>
+            </div>
+            <div class="reference-item">
+                <div class="reference-title">高级面料</div>
+                <div class="reference-desc">真丝感动</div>
+            </div>
+        </div> -->
+        <!-- <hr style="border: 1px solid #E5E7EB; width: 90%; margin: 38.5px auto;">
+        <div class="history-section">
+            <h4 class="title">生成历史</h4>
+            <div class="history-item" v-for="(item, index) in historyItems" :key="index">
+                <div class="history-title">{{ item.title }}</div>
+                <div class="history-time">{{ item.time }}</div>
+            </div>
+        </div> -->
+
+
+    </aside>
+</template>
+
+<style scoped>
+#aside {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    justify-items: center;
+    align-items: flex-start;
+    padding: 0 15.5px 0 17.5px;
+    background-color: #EEEAEA;
+    box-sizing: border-box;
+
+    .reference-section,
+    .history-section {
+        display: flex;
+        flex-direction: column;
+        gap: 12px;
+    }
+
+    .reference-item,
+    .history-item {
+        font-family: Inter;
+        font-weight: 200;
+        font-size: 14px;
+        line-height: 100%;
+        letter-spacing: 0%;
+        color: #000;
+        padding: 8px 0;
+        word-wrap: break-word;
+        overflow-wrap: break-word;
+    }
+
+    .reference-title {
+        font-weight: 500;
+        margin-bottom: 4px;
+    }
+
+    .reference-desc {
+        font-family: Inter;
+        font-weight: 400;
+        font-size: 13px;
+        line-height: 100%;
+        letter-spacing: 0%;
+
+        font-size: 12px;
+        color: #666;
+    }
+
+    .history-title {
+        font-weight: 500;
+        margin-bottom: 4px;
+    }
+
+    .history-time {
+        font-size: 12px;
+        color: #666;
+    }
+
+    .title {
+        font-family: Inter;
+        font-weight: 600;
+        font-size: 12px;
+        line-height: 100%;
+        letter-spacing: 0%;
+        color: #6B7280;
+    }
+}
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 68 - 0
src/layouts/components/aiChat/TabBar.vue


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 11 - 0
src/layouts/components/aiChat/ThemeSwitch.vue


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 107 - 0
src/layouts/components/imageGenerater/LeftAsideBar.vue


+ 105 - 0
src/layouts/components/imageGenerater/RightAsideBar.vue

@@ -0,0 +1,105 @@
+<script setup lang="ts">
+import { ref } from 'vue';
+const historyItems = ref([
+    { title: '连衣裙设计 v1', time: '2024-01-20 14:30' },
+    { title: '连衣裙设计 v2', time: '2024-01-20 14:35' },
+]);
+</script>
+
+<template>
+    <aside id="aside">
+
+        <div class="reference-section">
+            <div class="reference-item">
+                <h4 class="title">参考资料</h4>
+            </div>
+            <div class="reference-item">
+                <div class="reference-title">高级定制服务</div>
+                <div class="reference-desc">优质面料,精致细节</div>
+            </div>
+            <div class="reference-item">
+                <div class="reference-title">高级面料</div>
+                <div class="reference-desc">真丝感动</div>
+            </div>
+        </div>
+        <hr style="border: 1px solid #E5E7EB; width: 90%; margin: 38.5px auto;">
+        <div class="history-section">
+            <h4 class="title">生成历史</h4>
+            <div class="history-item" v-for="(item, index) in historyItems" :key="index">
+                <div class="history-title">{{ item.title }}</div>
+                <div class="history-time">{{ item.time }}</div>
+            </div>
+        </div>
+
+
+    </aside>
+</template>
+
+<style scoped>
+#aside {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    justify-items: center;
+    align-items: flex-start;
+    padding: 0 15.5px 0 17.5px;
+    background-color: #EEEAEA;
+    box-sizing: border-box;
+
+    .reference-section,
+    .history-section {
+        display: flex;
+        flex-direction: column;
+        gap: 12px;
+    }
+
+    .reference-item,
+    .history-item {
+        font-family: Inter;
+        font-weight: 200;
+        font-size: 14px;
+        line-height: 100%;
+        letter-spacing: 0%;
+        color: #000;
+        padding: 8px 0;
+        word-wrap: break-word;
+        overflow-wrap: break-word;
+    }
+
+    .reference-title {
+        font-weight: 500;
+        margin-bottom: 4px;
+    }
+
+    .reference-desc {
+        font-family: Inter;
+        font-weight: 400;
+        font-size: 13px;
+        line-height: 100%;
+        letter-spacing: 0%;
+
+        font-size: 12px;
+        color: #666;
+    }
+
+    .history-title {
+        font-weight: 500;
+        margin-bottom: 4px;
+    }
+
+    .history-time {
+        font-size: 12px;
+        color: #666;
+    }
+
+    .title {
+        font-family: Inter;
+        font-weight: 600;
+        font-size: 12px;
+        line-height: 100%;
+        letter-spacing: 0%;
+        color: #6B7280;
+    }
+}
+</style>

+ 42 - 0
src/layouts/index.vue

@@ -0,0 +1,42 @@
+<!-- 公共页面入口文件 -->
+<script setup lang="ts">
+import {userStore} from "@/stores/user.ts";
+
+const $user = userStore();
+
+</script>
+
+<template>
+  <div class="common-layout">
+    <el-container style="height:100vh">
+      <el-header>
+        <keep-alive>
+          <router-view name="tabBar"></router-view>
+        </keep-alive>
+      </el-header>
+      <el-container style="height:calc(100vh - 66px)">
+        <el-aside width="253px" style="margin-top: 10px;border-radius: 15px;">
+          <keep-alive>
+            <router-view name="leftAsideBar"></router-view>
+          </keep-alive>
+        </el-aside>
+        <el-main >
+          <keep-alive>
+            <router-view></router-view>
+          </keep-alive>
+        </el-main>
+        <el-aside width="253px" style="margin-top: 10px;border-radius: 15px;">
+          <keep-alive>
+            <router-view name="rightAsideBar"></router-view>
+          </keep-alive>
+        </el-aside>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<style scoped>
+.common-layout {
+ background: rgb(249, 250, 251); 
+}
+</style>

+ 24 - 0
src/main.ts

@@ -0,0 +1,24 @@
+import { createApp } from "vue";
+import App from "./App.vue";
+import router from "@/router";
+import pinia from "./stores";
+// 导入全局样式
+import "@/styles/style.css";
+import permission from "./directives/permission";
+import ElementPlus from "element-plus";
+import "element-plus/dist/index.css";
+import "element-plus/theme-chalk/dark/css-vars.css"; // 引入暗色主题样式
+import { useThemeStore } from "./stores/theme";
+import "./styles/theme.css";
+
+const app = createApp(App);
+app.use(router);
+app.use(pinia);
+app.use(permission);
+app.use(ElementPlus);
+
+// 初始化主题
+const themeStore = useThemeStore();
+themeStore.initTheme();
+
+app.mount("#app");

+ 71 - 0
src/router/childrens/mainChildren.ts

@@ -0,0 +1,71 @@
+import { RouteRecordRaw } from "vue-router";
+import ChatView from "@/views/main/ChatView.vue";
+import CreateView from "@/views/main/CreateView.vue";
+import ImageGenerateView from "@/views/main/ImageGenerateView.vue";
+import OtherView from "@/views/main/OtherView.vue";
+
+import TabBar from "@/layouts/components/aiChat/TabBar.vue";
+import LeftAsideBar from "@/layouts/components/aiChat/LeftAsideBar.vue";
+import RightAsideBar from "@/layouts/components/aiChat/RightAsideBar.vue";
+import DesignLeftAsideBar from "@/layouts/components/aiChat/Design/LeftAsideBar.vue";
+import DesignRightAsideBar from "@/layouts/components/aiChat/Design/RightAsideBar.vue";
+
+import ImageLeftAsideBar from "@/layouts/components/imageGenerater/LeftAsideBar.vue";
+
+
+const mainChild: RouteRecordRaw[] = [
+  {
+    path: "/",
+    name: "home",
+    components: {
+      default: ChatView,
+      tabBar: TabBar,
+      leftAsideBar: LeftAsideBar,
+      rightAsideBar: RightAsideBar,
+    },
+    meta: {
+      transition: "slide-left",
+    },
+  },
+  // {
+  //   path: "/image",
+  //   name: "AiImage",
+  //   components: {
+  //     default: ImageGenerateView,
+  //     tabBar: TabBar,
+  //     leftAsideBar: ImageLeftAsideBar,
+  //     rightAsideBar: RightAsideBar,
+  //   },
+  //   meta: {
+  //     transition: "slide-left",
+  //   },
+  // },
+  // {
+  //   path: "/create",
+  //   name: "AiCreate",
+  //   components: {
+  //     default: CreateView,
+  //     tabBar: TabBar,
+  //     leftAsideBar: DesignLeftAsideBar,
+  //     rightAsideBar: DesignRightAsideBar,
+  //   },
+  //   meta: {
+  //     transition: "slide-left",
+  //   },
+  // },
+  // {
+  //   path: "/other",
+  //   name: "Other",
+  //   components: {
+  //     default: OtherView,
+  //     tabBar: TabBar,
+  //     leftAsideBar: LeftAsideBar,
+  //     rightAsideBar: RightAsideBar,
+  //   },
+  //   meta: {
+  //     transition: "slide-left",
+  //   },
+  // },
+];
+
+export default mainChild;

+ 15 - 0
src/router/index.ts

@@ -0,0 +1,15 @@
+import { createRouter, createWebHistory } from "vue-router";
+import mainChildren from "@/router/childrens/mainChildren";
+const router = createRouter({
+  history: createWebHistory(),
+  routes: [
+    {
+      path: "/home",
+      component: () => import("@/layouts/index.vue"),
+      redirect: "/",
+      children: mainChildren,
+    },
+  ],
+});
+
+export default router;

+ 5 - 0
src/shims-vue.d.ts

@@ -0,0 +1,5 @@
+declare module "*.vue" {
+  import { DefineComponent } from "vue";
+  const component: DefineComponent<{}, {}, any>;
+  export default component;
+}

+ 88 - 0
src/stores/chatConversation.ts

@@ -0,0 +1,88 @@
+import { defineStore } from "pinia";
+import {
+  deleteMessages,
+  updateConversationTitle,
+  type Message,
+} from "@/api/conversation";
+import { userStore } from "./user";
+import { ChatConversationState } from "@/types/chatConversation";
+
+const useConversationStore = defineStore("conversation", {
+  state: (): ChatConversationState => {
+    return {
+      conversationId: "",
+      conversationList: [],
+      currentConversationMessages: [],
+      isReadyNewConversation: false,
+    };
+  },
+  actions: {
+    newConversation() {
+      const user = userStore();
+
+      //如果没有会话id,说明是新会话
+      if (this.conversationId === "") {
+        this.isReadyNewConversation = true;
+        this.conversationList.push({
+          conversationId: "-1",
+          userId: parseInt(user.token),
+          startedAt: new Date().toISOString(),
+          endedAt: "",
+          status: "ongoing",
+          messages: "",
+          messageList: [],
+        });
+      } else {
+        //从现有对话中新建对话前,清空当前对话消息
+        this.currentConversationMessages = [];
+        localStorage.removeItem("currentMessages");
+      }
+    },
+    saveConversationList(list) {
+      this.conversationList = list;
+      localStorage.setItem("CONVERSATIONLIST", JSON.stringify(list));
+    },
+    clearConversationList() {
+      this.conversationList = [];
+      localStorage.removeItem("CONVERSATIONLIST");
+    },
+    /**
+     *  * 更新会话标题
+     *  * 请求成功响应后,更新本地会话列表
+     * @param messageId 会话id
+     * @param message 待更新的会话标题
+     */
+    async updateConversationMesg(messageId: number, message: string) {
+      await updateConversationTitle(messageId, message);
+      this.conversationList.find((conversation) => {
+        if (conversation.messageId === messageId) {
+          conversation.messages = message;
+        }
+      });
+      localStorage.setItem(
+        "CONVERSATIONLIST",
+        JSON.stringify(this.conversationList)
+      );
+      console.log("update conversation message");
+    },
+    async deleteConversation(conversationId: string) {
+      await deleteMessages(conversationId);
+
+      this.conversationList = this.conversationList.filter(
+        (conversation) => conversation.conversationId !== conversationId
+      );
+      localStorage.setItem(
+        "CONVERSATIONLIST",
+        JSON.stringify(this.conversationList)
+      );
+      console.log("delete conversation");
+    },
+    clearConversationAll() {
+      this.conversationList = [];
+      this.currentConversationMessages = [];
+      localStorage.removeItem("CONVERSATIONLIST");
+    },
+  },
+});
+
+export default useConversationStore;

+ 92 - 0
src/stores/imageConversation.ts

@@ -0,0 +1,92 @@
+import { defineStore } from "pinia";
+import { deleteImageConversation, updateImageTitle } from "@/api/aiImage";
+import { ImageConversationState } from "@/types/imageConversation";
+const useImageConversationStore = defineStore("imageConversation", {
+  state: (): ImageConversationState => {
+    return {
+      conversationId: "",
+      conversationList: [],
+      currentConversationMessages: [],
+      isReadyNewConversation: false,
+    };
+  },
+  actions: {
+    newConversation() {
+      //如果没有会话id,说明是新会话
+      if (this.conversationId === "") {
+        this.isReadyNewConversation = true;
+      } else {
+        //从现有对话中新建对话前,清空当前对话消息
+        this.currentConversationMessages = [];
+        localStorage.removeItem("currentMessages");
+      }
+    },
+    saveConversationList(list) {
+      this.conversationList = list;
+      localStorage.setItem("IMAGECONVERSATIONLIST", JSON.stringify(list));
+      console.log("save imageConversation list");
+    },
+    clearConversationList() {
+      this.conversationList = [];
+      localStorage.removeItem("IMAGECONVERSATIONLIST");
+      console.log("clear imageConversation list");
+    },
+    /**
+     *  * 更新会话标题
+     *  * 请求成功响应后,更新本地会话列表
+     * @param messageId 会话id
+     * @param message 待更新的会话标题
+     */
+    async updateConversationMesg(messageId: number, message: string) {
+      const messageIdStr = messageId.toString();
+      await updateImageTitle({ messageId: messageIdStr, message });
+      this.conversationList.find((conversation) => {
+        if (conversation.messageId === messageId) {
+          console.log("replcae");
+          conversation.messages = message;
+        }
+      });
+      localStorage.setItem(
+        "CONVERSATIONLIST",
+        JSON.stringify(this.conversationList)
+      );
+      console.log("update conversation message");
+    },
+    async deleteConversation(conversationId: string) {
+      await deleteImageConversation(conversationId);
+
+      this.conversationList = this.conversationList.filter(
+        (conversation) => conversation.conversationId !== conversationId
+      );
+      localStorage.setItem(
+        "CONVERSATIONLIST",
+        JSON.stringify(this.conversationList)
+      );
+      console.log("delete conversation");
+    },
+    clearConversationAll() {
+      this.conversationList = [];
+      this.currentConversationMessages = [];
+      localStorage.removeItem("CONVERSATIONLIST");
+      console.log("clear conversation all");
+    },
+  },
+});
+
+export default useImageConversationStore;
+interface baseImageMessage {
+  sender: string;
+  sentAt: string;
+}
+
+interface ResAIImageMessage extends baseImageMessage {
+  id: number;
+  url: string;
+}
+
+interface ReqUserMessage extends baseImageMessage {
+  text: string;
+}
+
+// 合并这三个接口为一个 ImageMessage 类型
+export type ImageMessage = ResAIImageMessage | ReqUserMessage;

+ 6 - 0
src/stores/index.ts

@@ -0,0 +1,6 @@
+import { createPinia } from "pinia";
+//import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
+const pinia = createPinia();
+//pinia.use(piniaPluginPersistedstate);
+
+export default pinia;

+ 169 - 0
src/stores/product.ts

@@ -0,0 +1,169 @@
+import {defineStore} from 'pinia';
+import {deleteLibraryImageById, getProductDetail as apiProductDetail, ProductInfo} from '@/api/product.ts'
+import {SelectContent} from "@/views/public/onlineDesign/components/DesignMainLeft.vue"
+import {ToolbarType} from "@/enums/toolbarType.ts"
+import {bfSuccessMessage} from "@/utils/bfMessage.ts"
+
+
+/**
+ * @Description: 商品信息状态
+ * @author:汪明
+ * @date 2024/5/9 8:16
+ */
+export const useProduct = defineStore('productStore', {
+    state: () => ({
+        ProductInfo: new ProductInfo()
+    }),
+    getters: {},
+    actions: {
+        async getProductDetail(productId: string) {
+            this.ProductInfo = new ProductInfo(await apiProductDetail(productId))
+        }
+    }
+})
+
+
+
+/**
+ * @Description: 3d商品信息状态
+ * @author:汪明
+ * @date 2024/5/9 8:16
+ */
+
+interface ThreeProductStoreState {
+    themeList: ThemeItem[]
+    cateThemeList: ThemeItem[]
+    templateGroup:any
+    templateList: ThemeItem[]
+    backGroupIndex:number
+    groupsList: GroupsItem[],
+    layerList:any[],
+    fabricEditor:any,
+    objects:any,
+    activeObject:any,
+    textInfo:any,
+    libraryImages:string[],
+    searchValues:ThemeItem[]
+}
+
+export interface ThemeItem {
+    id: string;
+    name: string;
+    cover: string;
+    directorySceneId: number;
+    svg:string
+}
+export interface GroupsItem {
+    groupIndex:number,
+    groupId:string,
+    image:string,
+    url:string,
+    textureName:string,
+    isShow:number
+    name:string
+}
+;
+export const useThreeProduct = defineStore('threeProductStore', {
+    state: (): ThreeProductStoreState => ({
+        // 2d板片分组列表
+        groupsList: [],
+        // 模板组
+        templateGroup: [],
+        // 模板列表
+        templateList: [],
+        backGroupIndex:0,
+        // 主题图片列表
+        themeList: [],
+        // 主题分类
+        cateThemeList: [],
+        // 模版图层
+        layerList:[],
+        fabricEditor:{},
+        // 返回2d布片图层
+        objects: [],
+        // 当前激活项
+        activeObject:{
+            angle: 0
+        },
+        textInfo:{
+            text: null,
+            stroke: null,
+            strokeWidth: null,
+            canvasFill: '#000000',
+            textBackgroundColor: null,
+            canvasImage: '',
+            id: null,
+            opacity: null,
+            fill: null,
+            fontSize: 12,
+            lineHeight: null,
+            charSpacing: null,
+            fontWeight: null,
+            fontStyle: null,
+            textAlign: null,
+            fontFamily: null,
+            TextDecoration: '',
+            isEdit: false,
+        },
+        // 我的图库
+        libraryImages: [],
+        searchValues:[]
+    }),
+    getters: {
+        // 获取主题列表
+        getThemeList: (state: ThreeProductStoreState) => state.themeList,
+        // 获取主题分类
+        getCateThemeList: (state: ThreeProductStoreState) => state.cateThemeList,
+        // 切换主题分类
+        tabThemeCate: (state: ThreeProductStoreState) => {
+            return (dirId: number) => {
+                let themeList: ThemeItem[] = []
+                dirId && dirId === -1 ? themeList = state.themeList : themeList = state.themeList.filter((item => item.directorySceneId === dirId));
+                return themeList;
+            }
+        },
+        // 获取svg模板列表
+        getTemplateList: (state: ThreeProductStoreState) => state.templateGroup[state.backGroupIndex]?.templateList,
+        // 获取分组信息
+        getGroupsList: (state: ThreeProductStoreState) => state.groupsList,
+        // 获取模版图层
+        getLayerList: (state: ThreeProductStoreState) => state.fabricEditor.canvas.groupList,
+        // 获取我的图库列表
+        getLibraryImages: (state: ThreeProductStoreState) => state.libraryImages,
+    },
+    actions: {
+        // 切换类别
+        tabThemeCateAction (item:SelectContent)  {
+            switch (item.type) {
+                case ToolbarType.LAYER:
+                    console.log($fabricEditor)
+                    this.layerList = $fabricEditor.canvas.groupList
+                    console.log(this.layerList)
+                    break;
+            }
+        },
+        setLibraryImages (imageList:string[]) {
+            imageList.forEach((item:any) => {
+                item.cover = item.pic
+                delete item.pic
+            })
+            this.libraryImages = [...imageList, ...this.libraryImages]
+        },
+        // 删除图片
+        async deleteImage (id:string) {
+            await deleteLibraryImageById(id)
+            bfSuccessMessage('删除成功')
+            this.libraryImages = this.libraryImages.filter((item:any) => item.id !== id)
+        },
+        setText(textInfo: any) {
+            console.log('this.textInfo =', this.textInfo)
+            this.textInfo = JSON.parse(JSON.stringify(textInfo))
+        },
+        getSearchValue(value:string) {
+            console.log(value)
+            if(value === '') this.searchValues = this.themeList
+            console.log(this.themeList.filter(item => item.name.includes(value)));
+            this.searchValues = this.themeList.filter(item => item.name.includes(value))
+        }
+    }
+})

+ 90 - 0
src/stores/svgConversation.ts

@@ -0,0 +1,90 @@
+import { defineStore } from "pinia";
+import { deleteImageConversation, updateImageTitle } from "@/api/aiImage";
+import { SVGConversationState } from "@/types/svgConversation";
+//TODO 该文件的代码复制自imageConversation.ts,后续需要重构
+const useSVGConversationStore = defineStore("svgConversation", {
+  state: (): SVGConversationState => {
+    return {
+      conversationId: "",
+      conversationList: [],
+      currentConversationMessages: [],
+      isReadyNewConversation: false,
+    };
+  },
+  actions: {
+    newConversation() {
+      //如果没有会话id,说明是新会话
+      if (this.conversationId === "") {
+        this.isReadyNewConversation = true;
+      } else {
+        //从现有对话中新建对话前,清空当前对话消息
+        this.currentConversationMessages = [];
+        localStorage.removeItem("currentMessages");
+      }
+    },
+    saveConversationList(list) {
+      this.conversationList = list;
+      localStorage.setItem("CREATECONVERSATIONLIST", JSON.stringify(list));
+    },
+    clearConversationList() {
+      this.conversationList = [];
+      localStorage.removeItem("CREATECONVERSATIONLIST");
+    },
+    /**
+     *  * 更新会话标题
+     *  * 请求成功响应后,更新本地会话列表
+     * @param messageId 会话id
+     * @param message 待更新的会话标题
+     */
+    async updateConversationMesg(messageId: number, message: string) {
+      //   const messageIdStr = messageId.toString();
+      //   await updateImageTitle({ messageId: messageIdStr, message });
+      //   this.conversationList.find((conversation) => {
+      //     if (conversation.messageId === messageId) {
+      //       console.log("replcae");
+      //       conversation.messages = message;
+      //     }
+      //   });
+      //   localStorage.setItem(
+      //     "CONVERSATIONLIST",
+      //     JSON.stringify(this.conversationList)
+      //   );
+      //   console.log("update conversation message");
+    },
+    async deleteConversation(conversationId: string) {
+      //   await deleteImageConversation(conversationId);
+      //   this.conversationList = this.conversationList.filter(
+      //     (conversation) => conversation.conversationId !== conversationId
+      //   );
+      //   localStorage.setItem(
+      //     "CONVERSATIONLIST",
+      //     JSON.stringify(this.conversationList)
+      //   );
+      //   console.log("delete conversation");
+    },
+    clearConversationAll() {
+      this.conversationList = [];
+      this.currentConversationMessages = [];
+      localStorage.removeItem("CONVERSATIONLIST");
+      console.log("clear conversation all");
+    },
+  },
+});
+
+export default useSVGConversationStore;
+interface baseImageMessage {
+  sender: string;
+  sentAt: string;
+}
+
+interface ResAIImageMessage extends baseImageMessage {
+  id: number;
+  url: string;
+}
+
+interface ReqUserMessage extends baseImageMessage {
+  text: string;
+}
+
+// 合并这三个接口为一个 ImageMessage 类型
+export type ImageMessage = ResAIImageMessage | ReqUserMessage;

+ 113 - 0
src/stores/theme.ts

@@ -0,0 +1,113 @@
+import { defineStore } from 'pinia';
+import { useDark, useToggle } from '@vueuse/core';
+import { darkTheme, lightTheme } from 'element-plus';
+
+export type ThemeType = 'light' | 'dark' | 'system';
+
+interface ThemeState {
+    currentTheme: ThemeType;
+    themes: {
+        light: ThemeColors;
+        dark: ThemeColors;
+    };
+}
+
+interface ThemeColors {
+    primary: string;
+    secondary: string;
+    background: string;
+    text: string;
+    // Element Plus 变量
+    elBgColor: string;
+    elTextColor: string;
+    elBorderColor: string;
+}
+
+export const useThemeStore = defineStore('theme', {
+    state: (): ThemeState => ({
+        currentTheme: 'system',
+        themes: {
+            light: {
+                primary: '#000',
+                secondary: '#52c41a',
+                background: '#ffffff',
+                text: '#303133',
+                // Element Plus 亮色主题变量
+                elBgColor: '#ffffff',
+                elTextColor: '#303133',
+                elBorderColor: '#dcdfe6'
+            },
+            dark: {
+                primary: '#fff',
+                secondary: '#49aa19',
+                background: '#141414',
+                text: '#ffffff',
+                // Element Plus 暗色主题变量
+                elBgColor: '#141414',
+                elTextColor: '#ffffff',
+                elBorderColor: '#363637'
+            }
+        }
+    }),
+
+    getters: {
+        isDarkMode(): boolean {
+            if (this.currentTheme === 'system') {
+                return window.matchMedia('(prefers-color-scheme: dark)').matches;
+            }
+            return this.currentTheme === 'dark';
+        },
+        
+        currentThemeColors(): ThemeColors {
+            return this.isDarkMode ? this.themes.dark : this.themes.light;
+        }
+    },
+
+    actions: {
+        setTheme(theme: ThemeType) {
+            this.currentTheme = theme;
+            localStorage.setItem('theme', theme);
+            
+            // 更新 DOM
+            const isDark = this.isDarkMode;
+            document.documentElement.className = isDark ? 'dark' : '';
+            document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
+            
+            // 更新颜色变量
+            this.applyThemeColors();
+        },
+
+        initTheme() {
+            const savedTheme = localStorage.getItem('theme') as ThemeType;
+            if (savedTheme) {
+                this.currentTheme = savedTheme;
+            }
+            
+            // 初始应用主题
+            this.setTheme(this.currentTheme);
+            
+            // 监听系统主题变化
+            if (this.currentTheme === 'system') {
+                window.matchMedia('(prefers-color-scheme: dark)')
+                    .addEventListener('change', () => {
+                        this.applyThemeColors();
+                    });
+            }
+        },
+
+        // 重命名为 applyThemeColors 并移除循环调用
+        applyThemeColors() {
+            const colors = this.currentThemeColors;
+            const root = document.documentElement;
+            
+            Object.entries(colors).forEach(([key, value]) => {
+                root.style.setProperty(`--theme-${key}`, value);
+            });
+            
+            // 更新 Element Plus 主题状态
+            const isDark = this.isDarkMode;
+            document.documentElement.className = isDark ? 'dark' : '';
+            document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
+        }
+    }
+});

+ 128 - 0
src/stores/user.ts

@@ -0,0 +1,128 @@
+import { defineStore } from "pinia";
+import { getUserInfo, login, phoneLogin, UserInfo } from "@/api/user.ts";
+import { UserAuthInfo, PhoneAuthInfo } from "@/enums/verification.ts";
+import useConversationStore from "./chatConversation";
+interface UserState {
+  userInfo: UserInfo;
+  showLoginModel: boolean;
+  loginType: LoginType;
+  token: string | null;
+}
+
+// 登录类型的枚举
+export const enum LoginType {
+  ACCOUNT_LOGIN,
+  SMS_LOGIN,
+  REGISTER,
+  WECHAT_LOGIN,
+  RESET_PASSWORD,
+}
+
+export const userStore = defineStore("userStore", {
+  state: (): UserState => ({
+    token: localStorage.getItem("TOKEN") ?? "",
+    userInfo: new UserInfo(),
+    showLoginModel: false,
+    loginType: LoginType.ACCOUNT_LOGIN,
+  }),
+  getters: {
+    // 获取用户登陆状态
+    checkUserLoggedIn: (state: UserState) => !!state.token,
+    // 获取用户信息
+    getUserInfo: (state: UserState) => state.userInfo,
+  },
+  actions: {
+    // 优化登录模态框控制
+    setLoginModalVisibility(isVisible: boolean) {
+      this.showLoginModel = isVisible;
+    },
+
+    // 设置用户信息
+    SET_USER_INFO(userinfo: UserInfo) {
+      this.userInfo = userinfo;
+    },
+
+    // 设置用户令牌并保存到本地存储
+    async SET_USER_TOKEN(token: string) {
+      this.token = token;
+      localStorage.setItem("TOKEN", `${token}`);
+      this.showLogin();
+    },
+
+    // 切换登录模态框的显示状态
+    showLogin() {
+      this.showLoginModel = !this.showLoginModel;
+    },
+
+    // 统一的登录方法,使用类型守卫优化类型安全性
+    async login(data: UserAuthInfo | PhoneAuthInfo) {
+      try {
+        let token: string;
+        
+        switch (this.loginType) {
+          case LoginType.ACCOUNT_LOGIN:
+            if (!this.isUserAuthInfo(data)) {
+              throw new Error("无效的账号登录数据");
+            }
+            let response:any = await login(data);
+            console.log(response);
+            token = response.data.access_token;
+            break;
+
+          case LoginType.SMS_LOGIN:
+            if (!this.isPhoneAuthInfo(data)) {
+              throw new Error("无效的手机登录数据");
+            }
+            token = await phoneLogin(data);
+            break;
+
+          default:
+            throw new Error("不支持的登录类型");
+        }
+
+        await this.SET_USER_TOKEN(token);
+        // await this.fetchUserDetails();
+      } catch (error) {
+        // 统一错误处理
+        console.error("登录失败:", error);
+        throw error;
+      }
+    },
+
+    // 类型守卫
+    isUserAuthInfo(data: any): data is UserAuthInfo {
+      return "username" in data && "password" in data;
+    },
+
+    isPhoneAuthInfo(data: any): data is PhoneAuthInfo {
+      return "phone" in data && "code" in data;
+    },
+
+    // 优化用户详情获取
+    async fetchUserDetails() {
+      try {
+        const userInfo = await getUserInfo();
+        this.SET_USER_INFO(userInfo);
+      } catch (error) {
+        console.error("获取用户信息失败:", error);
+        throw error;
+      }
+    },
+
+    // 优化登出逻辑
+    async logout() {
+      try {
+        const conversationStore = useConversationStore();
+
+        this.userInfo = new UserInfo();
+        this.token = null;
+        conversationStore.clearConversationList();
+        localStorage.removeItem("TOKEN");
+        this.setLoginModalVisibility(false);
+      } catch (error) {
+        console.error("登出失败:", error);
+        throw error;
+      }
+    },
+  },
+});

+ 82 - 0
src/styles/components/common/login/GlobalLoginDialog.scss

@@ -0,0 +1,82 @@
+
+.bf-login-wrap {
+  width: 488px !important;
+  border-radius: 18px!important;
+  .bf-login-close{
+    position: absolute;
+    top: 20px;
+    right: 20px;
+    cursor: pointer;
+    font-size: 24px;
+    svg{
+      width: 24px;
+      height: 24px;
+    }
+  }
+  .el-dialog__header{
+    display: none;
+  }
+  .el-dialog__body{
+      padding: 52px 39px 39px ;
+  }
+  .bf-login-dialog-box {
+    .title {
+      text-align: center;
+      font-size: 32px;
+      font-weight: 500;
+      vertical-align: top;
+      line-height: 46.34px;
+    }
+    .bf-login-form{
+      $m-bottom-30: 30px;
+      $el-input-58: 58px;
+      margin-top: $m-bottom-30;
+      .el-form-item{
+        margin-bottom: $m-bottom-30;
+        margin-top: 0;
+      }
+      .el-input {
+        height: $el-input-58;
+        font-size: 14px;
+      }
+      .bf-login-submit-btn{
+        height: $el-input-58;
+        width: 100%;
+        font-size: 20px;
+        margin-bottom: $m-bottom-30;
+      }
+      .bf-login-footer-btn{
+        display: flex;
+        justify-content: space-between;
+        margin-bottom: $m-bottom-30;
+        >a{
+          cursor: pointer;
+        }
+      }
+      .bf-login-process{
+        display: flex;
+        justify-content: space-around;
+        >a{
+          display: flex;
+          align-items: center;
+          cursor: pointer;
+          >img{
+            margin-right: 10px;
+            vertical-align: middle;
+            height: 28px;
+            width: 28px;
+          }
+        }
+      }
+      .bf-login-form-code{
+        width: 230px;
+        margin-right: 20px;
+      }
+      .bf-login-form-code-btn{
+        //width: 160px;
+        flex: 1;
+        height: 100%;
+      }
+    }
+  }
+}

+ 47 - 0
src/styles/style.css

@@ -0,0 +1,47 @@
+/* 重置css样式 */
+@import 'normalize.css';
+
+h1 {
+    margin: 0;
+}
+
+ul {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+
+li {
+    display: block;
+}
+
+a {
+    text-decoration: none;
+    color: #595959;
+    transition: color .3s;
+}
+
+a:hover {
+    color: #409EFF;
+    cursor: pointer;
+}
+::-webkit-scrollbar {
+    width: 6px;
+}
+
+::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
+    background-color: #dddee0;
+    padding-top: 4px; /* 增加顶部内边距 */
+    padding-bottom: 4px; /* 增加底部内边距 */
+}
+
+::-webkit-scrollbar-track {
+    -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
+    background-color: transparent;
+}
+
+.router-link-active {
+    color: #409EFF;
+}

+ 180 - 0
src/styles/theme.css

@@ -0,0 +1,180 @@
+:root {
+    /* 基础主题变量 */
+    --theme-primary: #409eff;
+    --theme-secondary: #52c41a;
+    --theme-background: #ffffff;
+    --theme-text: #303133;
+    
+    /* Element Plus 基础变量 */
+    --el-color-primary: var(--theme-primary);
+    --el-bg-color: var(--theme-elBgColor);
+    --el-text-color-primary: var(--theme-elTextColor);
+    --el-border-color: var(--theme-elBorderColor);
+    
+    /* 文字颜色 */
+    --el-text-color-regular: #606266;
+    --el-text-color-secondary: #909399;
+    --el-text-color-placeholder: #a8abb2;
+    --el-text-color-disabled: #c0c4cc;
+    
+    /* 背景颜色 */
+    --el-bg-color-page: #f2f3f5;
+    --el-bg-color-overlay: #ffffff;
+    
+    /* 边框颜色 */
+    --el-border-color-light: #e4e7ed;
+    --el-border-color-lighter: #ebeef5;
+    --el-border-color-extra-light: #f2f6fc;
+    --el-border-color-dark: #d4d7de;
+    --el-border-color-darker: #cdd0d6;
+    
+    /* 填充颜色 */
+    --el-fill-color: #f0f2f5;
+    --el-fill-color-light: #f5f7fa;
+    --el-fill-color-lighter: #fafafa;
+    --el-fill-color-extra-light: #fafcff;
+    --el-fill-color-dark: #ebedf0;
+    --el-fill-color-darker: #e6e8eb;
+    --el-fill-color-blank: #ffffff;
+    
+    /* 组件变量 */
+    /* Menu 组件 */
+    --el-menu-active-color: var(--theme-primary);
+    --el-menu-text-color: var(--theme-text);
+    --el-menu-hover-text-color: var(--theme-primary);
+    --el-menu-bg-color: var(--theme-background);
+    --el-menu-hover-bg-color: var(--el-color-primary-light-9);
+    --el-menu-item-height: 56px;
+    
+    /* Table 组件 */
+    --el-table-header-bg-color: var(--el-fill-color-light);
+    --el-table-header-text-color: var(--el-text-color-regular);
+    --el-table-row-hover-bg-color: var(--el-fill-color-light);
+    
+    /* Card 组件 */
+    --el-card-bg-color: var(--el-bg-color-overlay);
+    
+    /* Dialog 组件 */
+    --el-dialog-bg-color: var(--el-bg-color-overlay);
+    --el-dialog-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.04), 0px 8px 20px rgba(0, 0, 0, 0.08);
+    
+    /* Popup 组件 */
+    --el-popup-modal-bg-color: var(--el-mask-color);
+    --el-popup-modal-opacity: 0.5;
+
+    /* Button 相关变量 */
+    --el-button-hover-bg-color: #79bbff;
+    --el-button-hover-text-color: var(--el-color-white);
+    --el-button-hover-border-color: #79bbff;
+    --el-button-active-bg-color: #337ecc;
+    --el-button-active-border-color: #337ecc;
+
+    /* 主要按钮 */
+    --el-button-primary-hover-bg-color: #66b1ff;
+    --el-button-primary-hover-border-color: #66b1ff;
+    --el-button-primary-active-bg-color: #3a8ee6;
+    --el-button-primary-active-border-color: #3a8ee6;
+}
+
+/* Element Plus 暗色主题覆盖 */
+html.dark {
+    /* 基础变量覆盖 */
+    --el-bg-color: var(--theme-elBgColor);
+    --el-text-color-primary: var(--theme-elTextColor);
+    --el-border-color: var(--theme-elBorderColor);
+    
+    /* 文字颜色 */
+    --el-text-color-regular: #cfd3dc;
+    --el-text-color-secondary: #a3a6ad;
+    --el-text-color-placeholder: #8d9095;
+    --el-text-color-disabled: #6c6e72;
+    
+    /* 背景颜色 */
+    --el-bg-color-page: #0a0a0a;
+    --el-bg-color-overlay: #1d1e1f;
+    
+    /* 边框颜色 */
+    --el-border-color-light: #363637;
+    --el-border-color-lighter: #2b2b2c;
+    --el-border-color-extra-light: #242424;
+    --el-border-color-dark: #414243;
+    --el-border-color-darker: #4c4d4f;
+    
+    /* 填充颜色 */
+    --el-fill-color: #303030;
+    --el-fill-color-light: #262727;
+    --el-fill-color-lighter: #1d1d1d;
+    --el-fill-color-extra-light: #191919;
+    --el-fill-color-dark: #39393a;
+    --el-fill-color-darker: #424243;
+    --el-fill-color-blank: transparent;
+    
+    /* 组件变量覆盖 */
+    /* Menu 组件 */
+    --el-menu-active-color: var(--theme-primary);
+    --el-menu-text-color: #bbb;
+    --el-menu-hover-text-color: #fff;
+    --el-menu-bg-color: var(--theme-background);
+    --el-menu-hover-bg-color: #1f1f1f;
+    
+    /* Table 组件 */
+    --el-table-header-bg-color: #262727;
+    --el-table-header-text-color: #a3a6ad;
+    --el-table-row-hover-bg-color: #262727;
+    
+    /* Card 组件 */
+    --el-card-bg-color: var(--el-bg-color-overlay);
+    
+    /* Dialog 组件 */
+    --el-dialog-bg-color: var(--el-bg-color-overlay);
+    --el-dialog-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72);
+    
+    /* Popup 组件 */
+    --el-popup-modal-bg-color: var(--el-mask-color);
+    --el-popup-modal-opacity: 0.7;
+    
+    /* 其他暗色主题变量 */
+    --el-mask-color: rgba(0, 0, 0, 0.8);
+    --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72);
+    --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72);
+    --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72);
+    --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px rgba(0, 0, 0, 0.72);
+
+    /* Button 暗色主题变量 */
+    --el-button-hover-bg-color: #4a4a4a;
+    --el-button-hover-text-color: var(--el-color-white);
+    --el-button-hover-border-color: #4a4a4a;
+    --el-button-active-bg-color: #3d3d3d;
+    --el-button-active-border-color: #3d3d3d;
+
+    /* 主要按钮 */
+    --el-button-primary-hover-bg-color: #4d97e3;
+    --el-button-primary-hover-border-color: #4d97e3;
+    --el-button-primary-active-bg-color: #2d7dd2;
+    --el-button-primary-active-border-color: #2d7dd2;
+}
+
+/* 全局样式 */
+body {
+    background-color: var(--theme-background);
+    color: var(--theme-text);
+}
+
+/* 过渡动画 */
+* {
+    transition: background-color 0.3s, border-color 0.3s, color 0.3s;
+}
+
+/* 使用主题变量的示例 */
+body {
+    background-color: var(--theme-background);
+    color: var(--theme-text);
+}
+
+.primary-button {
+    background-color: var(--theme-primary);
+}
+
+.secondary-button {
+    background-color: var(--theme-secondary);
+} 

+ 20 - 0
src/types/chatConversation.ts

@@ -0,0 +1,20 @@
+import { BaseConversationItem, ConversationState } from "./conversation";
+
+/**
+ * 聊天对话项(类型为1)
+ */
+export interface ChatConversationItem extends BaseConversationItem {
+  type: 1;
+}
+
+// 消息类型
+export interface Message {
+  text: string;
+  sender: "user" | "ai"; // 消息发送者
+  sentAt: string; // ISO 8601 格式的字符串表示日期和时间
+}
+
+export interface ChatConversationState extends ConversationState {
+  conversationList: ChatConversationItem[];
+  currentConversationMessages: Message[];
+}

+ 33 - 0
src/types/conversation.ts

@@ -0,0 +1,33 @@
+// src/types/conversation.ts
+
+import { ChatConversationItem } from "./chatConversation";
+import { ImageConversationItem } from "./imageConversation";
+import { SVGConversationItem } from "./svgConversation";
+
+/**
+ * 定义所有对话项的公共基础接口
+ */
+export interface BaseConversationItem {
+  conversationId: string;
+  userId: number;
+  startedAt: string; // ISO 时间格式字符串
+  endedAt: string | null; // 可能为 null
+  status: "ongoing" | "completed" | "closed"; // 你可以根据业务扩展更多状态
+  messages: string;
+  title:string;//会话标题
+  messageId: number;
+  type: number; // 用作判别字段
+}
+
+/**
+ * 联合类型,用于处理所有对话项
+ */
+export type ConversationItem =
+  | ChatConversationItem
+  | ImageConversationItem
+  | SVGConversationItem;
+
+export interface ConversationState {
+  conversationId: string;
+  isReadyNewConversation: boolean;
+}

+ 11 - 0
src/types/conversationActions.ts

@@ -0,0 +1,11 @@
+import { Ref } from "vue";
+
+export interface ConversationActions {
+  updateConversationTitle: (
+    messageId: number,
+    title: string,
+    isEdit: Ref<boolean>
+  ) => Promise<void>;
+  deleteConversation: (conversationId: string) => Promise<void>;
+  onSelect: (conversationId: string) => void;
+}

+ 35 - 0
src/types/imageConversation.ts

@@ -0,0 +1,35 @@
+import { BaseConversationItem, ConversationState } from "./conversation";
+
+/**
+ * 图片对话项(类型为2)
+ */
+export interface ImageConversationItem extends BaseConversationItem {
+  type: 2;
+}
+
+// 定义图片对话项的接口
+interface PictureDialogueItem {
+  id: number;
+  pictureDialogueId: number;
+  imagesId: number;
+  url: string;
+  taskId: number | null;
+}
+
+/**
+ * 单条会话的详细信息
+ */
+export interface ImageConversationMesg {
+  id: number;
+  conversationsId: string;
+  message: string;
+  sentAt: string;
+  number: number;
+  pictureDialogueItemList: PictureDialogueItem[];
+  taskId: number | null;
+}
+
+export interface ImageConversationState extends ConversationState {
+  conversationList: ImageConversationItem[];
+  currentConversationMessages: ImageConversationMesg[];
+}

+ 13 - 0
src/types/svgConversation.ts

@@ -0,0 +1,13 @@
+import { BaseConversationItem, ConversationState } from "./conversation";
+
+/**
+ * SVG对话项(类型为3)
+ */
+export interface SVGConversationItem extends BaseConversationItem {
+  type: 3;
+}
+
+export interface SVGConversationState extends ConversationState {
+  conversationList: SVGConversationItem[];
+  currentConversationMessages: any;
+}

+ 21 - 0
src/utils/QRcode.ts

@@ -0,0 +1,21 @@
+import QRCode from "qrcode";
+interface Options {
+    width:number,
+}
+/**
+ * @Description: 获取二维码地址
+ * @author:翁庚荣
+ * @date 2024/3/19 17:13
+ * @param text
+ * @param callBack
+ * @param options
+ */
+export const QRcode = (text:string, callBack: (url:string) => void,options:Options = { width:200} ) => {
+    if(!text){
+        throw 'text不能为空!'
+    }
+    QRCode.toDataURL(text, { width:options.width}, function (err, url) {
+        if (err) throw err
+        callBack(url)
+    })
+}

+ 4042 - 0
src/utils/area.ts

@@ -0,0 +1,4042 @@
+export default {
+        province_list: {
+                110000: '北京市',
+                120000: '天津市',
+                130000: '河北省',
+                140000: '山西省',
+                150000: '内蒙古自治区',
+                210000: '辽宁省',
+                220000: '吉林省',
+                230000: '黑龙江省',
+                310000: '上海市',
+                320000: '江苏省',
+                330000: '浙江省',
+                340000: '安徽省',
+                350000: '福建省',
+                360000: '江西省',
+                370000: '山东省',
+                410000: '河南省',
+                420000: '湖北省',
+                430000: '湖南省',
+                440000: '广东省',
+                450000: '广西壮族自治区',
+                460000: '海南省',
+                500000: '重庆市',
+                510000: '四川省',
+                520000: '贵州省',
+                530000: '云南省',
+                540000: '西藏自治区',
+                610000: '陕西省',
+                620000: '甘肃省',
+                630000: '青海省',
+                640000: '宁夏回族自治区',
+                650000: '新疆维吾尔自治区',
+                710000: '台湾省',
+                810000: '香港特别行政区',
+                820000: '澳门特别行政区',
+                900000: '海外'
+        },
+        city_list: {
+                110100: '北京市',
+                120100: '天津市',
+                130100: '石家庄市',
+                130200: '唐山市',
+                130300: '秦皇岛市',
+                130400: '邯郸市',
+                130500: '邢台市',
+                130600: '保定市',
+                130700: '张家口市',
+                130800: '承德市',
+                130900: '沧州市',
+                131000: '廊坊市',
+                131100: '衡水市',
+                140100: '太原市',
+                140200: '大同市',
+                140300: '阳泉市',
+                140400: '长治市',
+                140500: '晋城市',
+                140600: '朔州市',
+                140700: '晋中市',
+                140800: '运城市',
+                140900: '忻州市',
+                141000: '临汾市',
+                141100: '吕梁市',
+                150100: '呼和浩特市',
+                150200: '包头市',
+                150300: '乌海市',
+                150400: '赤峰市',
+                150500: '通辽市',
+                150600: '鄂尔多斯市',
+                150700: '呼伦贝尔市',
+                150800: '巴彦淖尔市',
+                150900: '乌兰察布市',
+                152200: '兴安盟',
+                152500: '锡林郭勒盟',
+                152900: '阿拉善盟',
+                210100: '沈阳市',
+                210200: '大连市',
+                210300: '鞍山市',
+                210400: '抚顺市',
+                210500: '本溪市',
+                210600: '丹东市',
+                210700: '锦州市',
+                210800: '营口市',
+                210900: '阜新市',
+                211000: '辽阳市',
+                211100: '盘锦市',
+                211200: '铁岭市',
+                211300: '朝阳市',
+                211400: '葫芦岛市',
+                220100: '长春市',
+                220200: '吉林市',
+                220300: '四平市',
+                220400: '辽源市',
+                220500: '通化市',
+                220600: '白山市',
+                220700: '松原市',
+                220800: '白城市',
+                222400: '延边朝鲜族自治州',
+                230100: '哈尔滨市',
+                230200: '齐齐哈尔市',
+                230300: '鸡西市',
+                230400: '鹤岗市',
+                230500: '双鸭山市',
+                230600: '大庆市',
+                230700: '伊春市',
+                230800: '佳木斯市',
+                230900: '七台河市',
+                231000: '牡丹江市',
+                231100: '黑河市',
+                231200: '绥化市',
+                232700: '大兴安岭地区',
+                310100: '上海市',
+                320100: '南京市',
+                320200: '无锡市',
+                320300: '徐州市',
+                320400: '常州市',
+                320500: '苏州市',
+                320600: '南通市',
+                320700: '连云港市',
+                320800: '淮安市',
+                320900: '盐城市',
+                321000: '扬州市',
+                321100: '镇江市',
+                321200: '泰州市',
+                321300: '宿迁市',
+                330100: '杭州市',
+                330200: '宁波市',
+                330300: '温州市',
+                330400: '嘉兴市',
+                330500: '湖州市',
+                330600: '绍兴市',
+                330700: '金华市',
+                330800: '衢州市',
+                330900: '舟山市',
+                331000: '台州市',
+                331100: '丽水市',
+                340100: '合肥市',
+                340200: '芜湖市',
+                340300: '蚌埠市',
+                340400: '淮南市',
+                340500: '马鞍山市',
+                340600: '淮北市',
+                340700: '铜陵市',
+                340800: '安庆市',
+                341000: '黄山市',
+                341100: '滁州市',
+                341200: '阜阳市',
+                341300: '宿州市',
+                341500: '六安市',
+                341600: '亳州市',
+                341700: '池州市',
+                341800: '宣城市',
+                350100: '福州市',
+                350200: '厦门市',
+                350300: '莆田市',
+                350400: '三明市',
+                350500: '泉州市',
+                350600: '漳州市',
+                350700: '南平市',
+                350800: '龙岩市',
+                350900: '宁德市',
+                360100: '南昌市',
+                360200: '景德镇市',
+                360300: '萍乡市',
+                360400: '九江市',
+                360500: '新余市',
+                360600: '鹰潭市',
+                360700: '赣州市',
+                360800: '吉安市',
+                360900: '宜春市',
+                361000: '抚州市',
+                361100: '上饶市',
+                370100: '济南市',
+                370200: '青岛市',
+                370300: '淄博市',
+                370400: '枣庄市',
+                370500: '东营市',
+                370600: '烟台市',
+                370700: '潍坊市',
+                370800: '济宁市',
+                370900: '泰安市',
+                371000: '威海市',
+                371100: '日照市',
+                371200: '莱芜市',
+                371300: '临沂市',
+                371400: '德州市',
+                371500: '聊城市',
+                371600: '滨州市',
+                371700: '菏泽市',
+                410100: '郑州市',
+                410200: '开封市',
+                410300: '洛阳市',
+                410400: '平顶山市',
+                410500: '安阳市',
+                410600: '鹤壁市',
+                410700: '新乡市',
+                410800: '焦作市',
+                410900: '濮阳市',
+                411000: '许昌市',
+                411100: '漯河市',
+                411200: '三门峡市',
+                411300: '南阳市',
+                411400: '商丘市',
+                411500: '信阳市',
+                411600: '周口市',
+                411700: '驻马店市',
+                419000: '省直辖县',
+                420100: '武汉市',
+                420200: '黄石市',
+                420300: '十堰市',
+                420500: '宜昌市',
+                420600: '襄阳市',
+                420700: '鄂州市',
+                420800: '荆门市',
+                420900: '孝感市',
+                421000: '荆州市',
+                421100: '黄冈市',
+                421200: '咸宁市',
+                421300: '随州市',
+                422800: '恩施土家族苗族自治州',
+                429000: '省直辖县',
+                430100: '长沙市',
+                430200: '株洲市',
+                430300: '湘潭市',
+                430400: '衡阳市',
+                430500: '邵阳市',
+                430600: '岳阳市',
+                430700: '常德市',
+                430800: '张家界市',
+                430900: '益阳市',
+                431000: '郴州市',
+                431100: '永州市',
+                431200: '怀化市',
+                431300: '娄底市',
+                433100: '湘西土家族苗族自治州',
+                440100: '广州市',
+                440200: '韶关市',
+                440300: '深圳市',
+                440400: '珠海市',
+                440500: '汕头市',
+                440600: '佛山市',
+                440700: '江门市',
+                440800: '湛江市',
+                440900: '茂名市',
+                441200: '肇庆市',
+                441300: '惠州市',
+                441400: '梅州市',
+                441500: '汕尾市',
+                441600: '河源市',
+                441700: '阳江市',
+                441800: '清远市',
+                441900: '东莞市',
+                442000: '中山市',
+                445100: '潮州市',
+                445200: '揭阳市',
+                445300: '云浮市',
+                450100: '南宁市',
+                450200: '柳州市',
+                450300: '桂林市',
+                450400: '梧州市',
+                450500: '北海市',
+                450600: '防城港市',
+                450700: '钦州市',
+                450800: '贵港市',
+                450900: '玉林市',
+                451000: '百色市',
+                451100: '贺州市',
+                451200: '河池市',
+                451300: '来宾市',
+                451400: '崇左市',
+                460100: '海口市',
+                460200: '三亚市',
+                460300: '三沙市',
+                460400: '儋州市',
+                469000: '省直辖县',
+                500100: '重庆市',
+                500200: '县',
+                510100: '成都市',
+                510300: '自贡市',
+                510400: '攀枝花市',
+                510500: '泸州市',
+                510600: '德阳市',
+                510700: '绵阳市',
+                510800: '广元市',
+                510900: '遂宁市',
+                511000: '内江市',
+                511100: '乐山市',
+                511300: '南充市',
+                511400: '眉山市',
+                511500: '宜宾市',
+                511600: '广安市',
+                511700: '达州市',
+                511800: '雅安市',
+                511900: '巴中市',
+                512000: '资阳市',
+                513200: '阿坝藏族羌族自治州',
+                513300: '甘孜藏族自治州',
+                513400: '凉山彝族自治州',
+                520100: '贵阳市',
+                520200: '六盘水市',
+                520300: '遵义市',
+                520400: '安顺市',
+                520500: '毕节市',
+                520600: '铜仁市',
+                522300: '黔西南布依族苗族自治州',
+                522600: '黔东南苗族侗族自治州',
+                522700: '黔南布依族苗族自治州',
+                530100: '昆明市',
+                530300: '曲靖市',
+                530400: '玉溪市',
+                530500: '保山市',
+                530600: '昭通市',
+                530700: '丽江市',
+                530800: '普洱市',
+                530900: '临沧市',
+                532300: '楚雄彝族自治州',
+                532500: '红河哈尼族彝族自治州',
+                532600: '文山壮族苗族自治州',
+                532800: '西双版纳傣族自治州',
+                532900: '大理白族自治州',
+                533100: '德宏傣族景颇族自治州',
+                533300: '怒江傈僳族自治州',
+                533400: '迪庆藏族自治州',
+                540100: '拉萨市',
+                540200: '日喀则市',
+                540300: '昌都市',
+                540400: '林芝市',
+                540500: '山南市',
+                540600: '那曲市',
+                542500: '阿里地区',
+                610100: '西安市',
+                610200: '铜川市',
+                610300: '宝鸡市',
+                610400: '咸阳市',
+                610500: '渭南市',
+                610600: '延安市',
+                610700: '汉中市',
+                610800: '榆林市',
+                610900: '安康市',
+                611000: '商洛市',
+                620100: '兰州市',
+                620200: '嘉峪关市',
+                620300: '金昌市',
+                620400: '白银市',
+                620500: '天水市',
+                620600: '武威市',
+                620700: '张掖市',
+                620800: '平凉市',
+                620900: '酒泉市',
+                621000: '庆阳市',
+                621100: '定西市',
+                621200: '陇南市',
+                622900: '临夏回族自治州',
+                623000: '甘南藏族自治州',
+                630100: '西宁市',
+                630200: '海东市',
+                632200: '海北藏族自治州',
+                632300: '黄南藏族自治州',
+                632500: '海南藏族自治州',
+                632600: '果洛藏族自治州',
+                632700: '玉树藏族自治州',
+                632800: '海西蒙古族藏族自治州',
+                640100: '银川市',
+                640200: '石嘴山市',
+                640300: '吴忠市',
+                640400: '固原市',
+                640500: '中卫市',
+                650100: '乌鲁木齐市',
+                650200: '克拉玛依市',
+                650400: '吐鲁番市',
+                650500: '哈密市',
+                652300: '昌吉回族自治州',
+                652700: '博尔塔拉蒙古自治州',
+                652800: '巴音郭楞蒙古自治州',
+                652900: '阿克苏地区',
+                653000: '克孜勒苏柯尔克孜自治州',
+                653100: '喀什地区',
+                653200: '和田地区',
+                654000: '伊犁哈萨克自治州',
+                654200: '塔城地区',
+                654300: '阿勒泰地区',
+                659000: '自治区直辖县级行政区划',
+                710100: '台北市',
+                710200: '高雄市',
+                710300: '台南市',
+                710400: '台中市',
+                710500: '金门县',
+                710600: '南投县',
+                710700: '基隆市',
+                710800: '新竹市',
+                710900: '嘉义市',
+                711100: '新北市',
+                711200: '宜兰县',
+                711300: '新竹县',
+                711400: '桃园县',
+                711500: '苗栗县',
+                711700: '彰化县',
+                711900: '嘉义县',
+                712100: '云林县',
+                712400: '屏东县',
+                712500: '台东县',
+                712600: '花莲县',
+                712700: '澎湖县',
+                712800: '连江县',
+                810100: '香港岛',
+                810200: '九龙',
+                810300: '新界',
+                820100: '澳门半岛',
+                820200: '离岛',
+                900400: '阿富汗',
+                900800: '阿尔巴尼亚',
+                901000: '南极洲',
+                901200: '阿尔及利亚',
+                901600: '美属萨摩亚',
+                902000: '安道尔',
+                902400: '安哥拉',
+                902800: '安提瓜和巴布达',
+                903100: '阿塞拜疆',
+                903200: '阿根廷',
+                903600: '澳大利亚',
+                904000: '奥地利',
+                904400: '巴哈马',
+                904800: '巴林',
+                905000: '孟加拉',
+                905100: '亚美尼亚',
+                905200: '巴巴多斯',
+                905600: '比利时',
+                906000: '百慕大',
+                906400: '不丹',
+                906800: '玻利维亚',
+                907000: '波黑',
+                907200: '博茨瓦纳',
+                907400: '布韦岛',
+                907600: '巴西',
+                908400: '伯利兹',
+                908600: '英属印度洋领地',
+                909000: '所罗门群岛',
+                909200: '英属维尔京群岛',
+                909600: '文莱',
+                910000: '保加利亚',
+                910400: '缅甸',
+                910800: '布隆迪',
+                911200: '白俄罗斯',
+                911600: '柬埔寨',
+                912000: '喀麦隆',
+                912400: '加拿大',
+                913200: '佛得角',
+                913600: '开曼群岛',
+                914000: '中非',
+                914400: '斯里兰卡',
+                914800: '乍得',
+                915200: '智利',
+                916200: '圣诞岛',
+                916600: '科科斯群岛',
+                917000: '哥伦比亚',
+                917400: '科摩罗',
+                917500: '马约特',
+                917800: '刚果(布)',
+                918000: '刚果(金)',
+                918400: '库克群岛',
+                918800: '哥斯达黎加',
+                919100: '克罗地亚',
+                919200: '古巴',
+                919600: '塞浦路斯',
+                920300: '捷克',
+                920400: '贝宁',
+                920800: '丹麦',
+                921200: '多米尼克',
+                921400: '多米尼加',
+                921800: '厄瓜多尔',
+                922200: '萨尔瓦多',
+                922600: '赤道几内亚',
+                923100: '埃塞俄比亚',
+                923200: '厄立特里亚',
+                923300: '爱沙尼亚',
+                923400: '法罗群岛',
+                923800: '马尔维纳斯群岛( 福克兰)',
+                923900: '南乔治亚岛和南桑威奇群岛',
+                924200: '斐济群岛',
+                924600: '芬兰',
+                924800: '奥兰群岛',
+                925000: '法国',
+                925400: '法属圭亚那',
+                925800: '法属波利尼西亚',
+                926000: '法属南部领地',
+                926200: '吉布提',
+                926600: '加蓬',
+                926800: '格鲁吉亚',
+                927000: '冈比亚',
+                927500: '巴勒斯坦',
+                927600: '德国',
+                928800: '加纳',
+                929200: '直布罗陀',
+                929600: '基里巴斯',
+                930000: '希腊',
+                930400: '格陵兰',
+                930800: '格林纳达',
+                931200: '瓜德罗普',
+                931600: '关岛',
+                932000: '危地马拉',
+                932400: '几内亚',
+                932800: '圭亚那',
+                933200: '海地',
+                933400: '赫德岛和麦克唐纳群岛',
+                933600: '梵蒂冈',
+                934000: '洪都拉斯',
+                934800: '匈牙利',
+                935200: '冰岛',
+                935600: '印度',
+                936000: '印尼',
+                936400: '伊朗',
+                936800: '伊拉克',
+                937200: '爱尔兰',
+                937600: '以色列',
+                938000: '意大利',
+                938400: '科特迪瓦',
+                938800: '牙买加',
+                939200: '日本',
+                939800: '哈萨克斯坦',
+                940000: '约旦',
+                940400: '肯尼亚',
+                940800: '朝鲜 北朝鲜',
+                941000: '韩国',
+                941400: '科威特',
+                941700: '吉尔吉斯斯坦',
+                941800: '老挝',
+                942200: '黎巴嫩',
+                942600: '莱索托',
+                942800: '拉脱维亚',
+                943000: '利比里亚',
+                943400: '利比亚',
+                943800: '列支敦士登',
+                944000: '立陶宛',
+                944200: '卢森堡',
+                945000: '马达加斯加',
+                945400: '马拉维',
+                945800: '马来西亚',
+                946200: '马尔代夫',
+                946600: '马里',
+                947000: '马耳他',
+                947400: '马提尼克',
+                947800: '毛里塔尼亚',
+                948000: '毛里求斯',
+                948400: '墨西哥',
+                949200: '摩纳哥',
+                949600: '蒙古国',
+                949800: '摩尔多瓦',
+                949900: '黑山',
+                950000: '蒙塞拉特岛',
+                950400: '摩洛哥',
+                950800: '莫桑比克',
+                951200: '阿曼',
+                951600: '纳米比亚',
+                952000: '瑙鲁',
+                952400: '尼泊尔',
+                952800: '荷兰',
+                953300: '阿鲁巴',
+                953500: '荷兰加勒比区',
+                954000: '新喀里多尼亚',
+                954800: '瓦努阿图',
+                955400: '新西兰',
+                955800: '尼加拉瓜',
+                956200: '尼日尔',
+                956600: '尼日利亚',
+                957000: '纽埃',
+                957400: '诺福克岛',
+                957800: '挪威',
+                958000: '北马里亚纳群岛',
+                958100: '美国本土外小岛屿',
+                958300: '密克罗尼西亚联邦',
+                958400: '马绍尔群岛',
+                958500: '帕劳',
+                958600: '巴基斯坦',
+                959100: '巴拿马',
+                959800: '巴布亚新几内亚',
+                960000: '巴拉圭',
+                960400: '秘鲁',
+                960800: '菲律宾',
+                961200: '皮特凯恩群岛',
+                961600: '波兰',
+                962000: '葡萄牙',
+                962400: '几内亚比绍',
+                962600: '东帝汶',
+                963000: '波多黎各',
+                963400: '卡塔尔',
+                963800: '留尼汪',
+                964200: '罗马尼亚',
+                964300: '俄罗斯',
+                964600: '卢旺达',
+                965200: '圣巴泰勒米岛',
+                965400: '圣赫勒拿',
+                965900: '圣基茨和尼维斯',
+                966000: '安圭拉',
+                966200: '圣卢西亚',
+                966300: '法属圣马丁',
+                966600: '圣皮埃尔和密克隆',
+                967000: '圣文森特和格林纳丁斯',
+                967400: '圣马力诺',
+                967800: '圣多美和普林西比',
+                968200: '沙特阿拉伯',
+                968600: '塞内加尔',
+                968800: '塞尔维亚',
+                969000: '塞舌尔',
+                969400: '塞拉利昂',
+                970200: '新加坡',
+                970300: '斯洛伐克',
+                970400: '越南',
+                970500: '斯洛文尼亚',
+                970600: '索马里',
+                971000: '南非',
+                971600: '津巴布韦',
+                972400: '西班牙',
+                972800: '南苏丹',
+                972900: '苏丹',
+                973200: '西撒哈拉',
+                974000: '苏里南',
+                974400: '斯瓦尔巴群岛和 扬马延岛',
+                974800: '斯威士兰',
+                975200: '瑞典',
+                975600: '瑞士',
+                976000: '叙利亚',
+                976200: '塔吉克斯坦',
+                976400: '泰国',
+                976800: '多哥',
+                977200: '托克劳',
+                977600: '汤加',
+                978000: '特立尼达和多巴哥',
+                978400: '阿联酋',
+                978800: '突尼斯',
+                979200: '土耳其',
+                979500: '土库曼斯坦',
+                979600: '特克斯和凯科斯群岛',
+                979800: '图瓦卢',
+                980000: '乌干达',
+                980400: '乌克兰',
+                980700: '马其顿',
+                981800: '埃及',
+                982600: '英国',
+                983100: '根西岛',
+                983200: '泽西岛',
+                983300: '马恩岛',
+                983400: '坦桑尼亚',
+                984000: '美国',
+                985000: '美属维尔京群岛',
+                985400: '布基纳法索',
+                985800: '乌拉圭',
+                986000: '乌兹别克斯坦',
+                986200: '委内瑞拉',
+                987600: '瓦利斯和富图纳',
+                988200: '萨摩亚',
+                988700: '也门',
+                989400: '赞比亚'
+        },
+        county_list: {
+                110101: '东城区',
+                110102: '西城区',
+                110105: '朝阳区',
+                110106: '丰台区',
+                110107: '石景山区',
+                110108: '海淀区',
+                110109: '门头沟区',
+                110111: '房山区',
+                110112: '通州区',
+                110113: '顺义区',
+                110114: '昌平区',
+                110115: '大兴区',
+                110116: '怀柔区',
+                110117: '平谷区',
+                110118: '密云区',
+                110119: '延庆区',
+                120101: '和平区',
+                120102: '河东区',
+                120103: '河西区',
+                120104: '南开区',
+                120105: '河北区',
+                120106: '红桥区',
+                120110: '东丽区',
+                120111: '西青区',
+                120112: '津南区',
+                120113: '北辰区',
+                120114: '武清区',
+                120115: '宝坻区',
+                120116: '滨海新区',
+                120117: '宁河区',
+                120118: '静海区',
+                120119: '蓟州区',
+                130102: '长安区',
+                130104: '桥西区',
+                130105: '新华区',
+                130107: '井陉矿区',
+                130108: '裕华区',
+                130109: '藁城区',
+                130110: '鹿泉区',
+                130111: '栾城区',
+                130121: '井陉县',
+                130123: '正定县',
+                130125: '行唐县',
+                130126: '灵寿县',
+                130127: '高邑县',
+                130128: '深泽县',
+                130129: '赞皇县',
+                130130: '无极县',
+                130131: '平山县',
+                130132: '元氏县',
+                130133: '赵县',
+                130181: '辛集市',
+                130183: '晋州市',
+                130184: '新乐市',
+                130202: '路南区',
+                130203: '路北区',
+                130204: '古冶区',
+                130205: '开平区',
+                130207: '丰南区',
+                130208: '丰润区',
+                130209: '曹妃甸区',
+                130224: '滦南县',
+                130225: '乐亭县',
+                130227: '迁西县',
+                130229: '玉田县',
+                130281: '遵化市',
+                130283: '迁安市',
+                130284: '滦州市',
+                130302: '海港区',
+                130303: '山海关区',
+                130304: '北戴河区',
+                130306: '抚宁区',
+                130321: '青龙满族自治县',
+                130322: '昌黎县',
+                130324: '卢龙县',
+                130390: '经济技术开发区',
+                130402: '邯山区',
+                130403: '丛台区',
+                130404: '复兴区',
+                130406: '峰峰矿区',
+                130407: '肥乡区',
+                130408: '永年区',
+                130423: '临漳县',
+                130424: '成安县',
+                130425: '大名县',
+                130426: '涉县',
+                130427: '磁县',
+                130430: '邱县',
+                130431: '鸡泽县',
+                130432: '广平县',
+                130433: '馆陶县',
+                130434: '魏县',
+                130435: '曲周县',
+                130481: '武安市',
+                130502: '桥东区',
+                130503: '桥西区',
+                130521: '邢台县',
+                130522: '临城县',
+                130523: '内丘县',
+                130524: '柏乡县',
+                130525: '隆尧县',
+                130526: '任县',
+                130527: '南和县',
+                130528: '宁晋县',
+                130529: '巨鹿县',
+                130530: '新河县',
+                130531: '广宗县',
+                130532: '平乡县',
+                130533: '威县',
+                130534: '清河县',
+                130535: '临西县',
+                130581: '南宫市',
+                130582: '沙河市',
+                130602: '竞秀区',
+                130606: '莲池区',
+                130607: '满城区',
+                130608: '清苑区',
+                130609: '徐水区',
+                130623: '涞水县',
+                130624: '阜平县',
+                130626: '定兴县',
+                130627: '唐县',
+                130628: '高阳县',
+                130629: '容城县',
+                130630: '涞源县',
+                130631: '望都县',
+                130632: '安新县',
+                130633: '易县',
+                130634: '曲阳县',
+                130635: '蠡县',
+                130636: '顺平县',
+                130637: '博野县',
+                130638: '雄县',
+                130681: '涿州市',
+                130682: '定州市',
+                130683: '安国市',
+                130684: '高碑店市',
+                130702: '桥东区',
+                130703: '桥西区',
+                130705: '宣化区',
+                130706: '下花园区',
+                130708: '万全区',
+                130709: '崇礼区',
+                130722: '张北县',
+                130723: '康保县',
+                130724: '沽源县',
+                130725: '尚义县',
+                130726: '蔚县',
+                130727: '阳原县',
+                130728: '怀安县',
+                130730: '怀来县',
+                130731: '涿鹿县',
+                130732: '赤城县',
+                130802: '双桥区',
+                130803: '双滦区',
+                130804: '鹰手营子矿区',
+                130821: '承德县',
+                130822: '兴隆县',
+                130824: '滦平县',
+                130825: '隆化县',
+                130826: '丰宁满族自治县',
+                130827: '宽城满族自治县',
+                130828: '围场满族蒙古族自治县',
+                130881: '平泉市',
+                130902: '新华区',
+                130903: '运河区',
+                130921: '沧县',
+                130922: '青县',
+                130923: '东光县',
+                130924: '海兴县',
+                130925: '盐山县',
+                130926: '肃宁县',
+                130927: '南皮县',
+                130928: '吴桥县',
+                130929: '献县',
+                130930: '孟村回族自治县',
+                130981: '泊头市',
+                130982: '任丘市',
+                130983: '黄骅市',
+                130984: '河间市',
+                131002: '安次区',
+                131003: '广阳区',
+                131022: '固安县',
+                131023: '永清县',
+                131024: '香河县',
+                131025: '大城县',
+                131026: '文安县',
+                131028: '大厂回族自治县',
+                131081: '霸州市',
+                131082: '三河市',
+                131090: '开发区',
+                131102: '桃城区',
+                131103: '冀州区',
+                131121: '枣强县',
+                131122: '武邑县',
+                131123: '武强县',
+                131124: '饶阳县',
+                131125: '安平县',
+                131126: '故城县',
+                131127: '景县',
+                131128: '阜城县',
+                131182: '深州市',
+                140105: '小店区',
+                140106: '迎泽区',
+                140107: '杏花岭区',
+                140108: '尖草坪区',
+                140109: '万柏林区',
+                140110: '晋源区',
+                140121: '清徐县',
+                140122: '阳曲县',
+                140123: '娄烦县',
+                140181: '古交市',
+                140212: '新荣区',
+                140213: '平城区',
+                140214: '云冈区',
+                140215: '云州区',
+                140221: '阳高县',
+                140222: '天镇县',
+                140223: '广灵县',
+                140224: '灵丘县',
+                140225: '浑源县',
+                140226: '左云县',
+                140302: '城区',
+                140303: '矿区',
+                140311: '郊区',
+                140321: '平定县',
+                140322: '盂县',
+                140403: '潞州区',
+                140404: '上党区',
+                140405: '屯留区',
+                140406: '潞城区',
+                140423: '襄垣县',
+                140425: '平顺县',
+                140426: '黎城县',
+                140427: '壶关县',
+                140428: '长子县',
+                140429: '武乡县',
+                140430: '沁县',
+                140431: '沁源县',
+                140502: '城区',
+                140521: '沁水县',
+                140522: '阳城县',
+                140524: '陵川县',
+                140525: '泽州县',
+                140581: '高平市',
+                140602: '朔城区',
+                140603: '平鲁区',
+                140621: '山阴县',
+                140622: '应县',
+                140623: '右玉县',
+                140681: '怀仁市',
+                140702: '榆次区',
+                140721: '榆社县',
+                140722: '左权县',
+                140723: '和顺县',
+                140724: '昔阳县',
+                140725: '寿阳县',
+                140726: '太谷县',
+                140727: '祁县',
+                140728: '平遥县',
+                140729: '灵石县',
+                140781: '介休市',
+                140802: '盐湖区',
+                140821: '临猗县',
+                140822: '万荣县',
+                140823: '闻喜县',
+                140824: '稷山县',
+                140825: '新绛县',
+                140826: '绛县',
+                140827: '垣曲县',
+                140828: '夏县',
+                140829: '平陆县',
+                140830: '芮城县',
+                140881: '永济市',
+                140882: '河津市',
+                140902: '忻府区',
+                140921: '定襄县',
+                140922: '五台县',
+                140923: '代县',
+                140924: '繁峙县',
+                140925: '宁武县',
+                140926: '静乐县',
+                140927: '神池县',
+                140928: '五寨县',
+                140929: '岢岚县',
+                140930: '河曲县',
+                140931: '保德县',
+                140932: '偏关县',
+                140981: '原平市',
+                141002: '尧都区',
+                141021: '曲沃县',
+                141022: '翼城县',
+                141023: '襄汾县',
+                141024: '洪洞县',
+                141025: '古县',
+                141026: '安泽县',
+                141027: '浮山县',
+                141028: '吉县',
+                141029: '乡宁县',
+                141030: '大宁县',
+                141031: '隰县',
+                141032: '永和县',
+                141033: '蒲县',
+                141034: '汾西县',
+                141081: '侯马市',
+                141082: '霍州市',
+                141102: '离石区',
+                141121: '文水县',
+                141122: '交城县',
+                141123: '兴县',
+                141124: '临县',
+                141125: '柳林县',
+                141126: '石楼县',
+                141127: '岚县',
+                141128: '方山县',
+                141129: '中阳县',
+                141130: '交口县',
+                141181: '孝义市',
+                141182: '汾阳市',
+                150102: '新城区',
+                150103: '回民区',
+                150104: '玉泉区',
+                150105: '赛罕区',
+                150121: '土默特左旗',
+                150122: '托克托县',
+                150123: '和林格尔县',
+                150124: '清水河县',
+                150125: '武川县',
+                150202: '东河区',
+                150203: '昆都仑区',
+                150204: '青山区',
+                150205: '石拐区',
+                150206: '白云鄂博矿区',
+                150207: '九原区',
+                150221: '土默特右旗',
+                150222: '固阳县',
+                150223: '达尔罕茂明安联合旗',
+                150302: '海勃湾区',
+                150303: '海南区',
+                150304: '乌达区',
+                150402: '红山区',
+                150403: '元宝山区',
+                150404: '松山区',
+                150421: '阿鲁科尔沁旗',
+                150422: '巴林左旗',
+                150423: '巴林右旗',
+                150424: '林西县',
+                150425: '克什克腾旗',
+                150426: '翁牛特旗',
+                150428: '喀喇沁旗',
+                150429: '宁城县',
+                150430: '敖汉旗',
+                150502: '科尔沁区',
+                150521: '科尔沁左翼中旗',
+                150522: '科尔沁左翼后旗',
+                150523: '开鲁县',
+                150524: '库伦旗',
+                150525: '奈曼旗',
+                150526: '扎鲁特旗',
+                150581: '霍林郭勒市',
+                150602: '东胜区',
+                150603: '康巴什区',
+                150621: '达拉特旗',
+                150622: '准格尔旗',
+                150623: '鄂托克前旗',
+                150624: '鄂托克旗',
+                150625: '杭锦旗',
+                150626: '乌审旗',
+                150627: '伊金霍洛旗',
+                150702: '海拉尔区',
+                150703: '扎赉诺尔区',
+                150721: '阿荣旗',
+                150722: '莫力达瓦达斡尔族自治旗',
+                150723: '鄂伦春自治旗',
+                150724: '鄂温克族自治旗',
+                150725: '陈巴尔虎旗',
+                150726: '新巴尔虎左旗',
+                150727: '新巴尔虎右旗',
+                150781: '满洲里市',
+                150782: '牙克石市',
+                150783: '扎兰屯市',
+                150784: '额尔古纳市',
+                150785: '根河市',
+                150802: '临河区',
+                150821: '五原县',
+                150822: '磴口县',
+                150823: '乌拉特前旗',
+                150824: '乌拉特中旗',
+                150825: '乌拉特后旗',
+                150826: '杭锦后旗',
+                150902: '集宁区',
+                150921: '卓资县',
+                150922: '化德县',
+                150923: '商都县',
+                150924: '兴和县',
+                150925: '凉城县',
+                150926: '察哈尔右翼前旗',
+                150927: '察哈尔右翼中旗',
+                150928: '察哈尔右翼后旗',
+                150929: '四子王旗',
+                150981: '丰镇市',
+                152201: '乌兰浩特市',
+                152202: '阿尔山市',
+                152221: '科尔沁右翼前旗',
+                152222: '科尔沁右翼中旗',
+                152223: '扎赉特旗',
+                152224: '突泉县',
+                152501: '二连浩特市',
+                152502: '锡林浩特市',
+                152522: '阿巴嘎旗',
+                152523: '苏尼特左旗',
+                152524: '苏尼特右旗',
+                152525: '东乌珠穆沁旗',
+                152526: '西乌珠穆沁旗',
+                152527: '太仆寺旗',
+                152528: '镶黄旗',
+                152529: '正镶白旗',
+                152530: '正蓝旗',
+                152531: '多伦县',
+                152921: '阿拉善左旗',
+                152922: '阿拉善右旗',
+                152923: '额济纳旗',
+                210102: '和平区',
+                210103: '沈河区',
+                210104: '大东区',
+                210105: '皇姑区',
+                210106: '铁西区',
+                210111: '苏家屯区',
+                210112: '浑南区',
+                210113: '沈北新区',
+                210114: '于洪区',
+                210115: '辽中区',
+                210123: '康平县',
+                210124: '法库县',
+                210181: '新民市',
+                210190: '经济技术开发区',
+                210202: '中山区',
+                210203: '西岗区',
+                210204: '沙河口区',
+                210211: '甘井子区',
+                210212: '旅顺口区',
+                210213: '金州区',
+                210214: '普兰店区',
+                210224: '长海县',
+                210281: '瓦房店市',
+                210283: '庄河市',
+                210302: '铁东区',
+                210303: '铁西区',
+                210304: '立山区',
+                210311: '千山区',
+                210321: '台安县',
+                210323: '岫岩满族自治县',
+                210381: '海城市',
+                210390: '高新区',
+                210402: '新抚区',
+                210403: '东洲区',
+                210404: '望花区',
+                210411: '顺城区',
+                210421: '抚顺县',
+                210422: '新宾满族自治县',
+                210423: '清原满族自治县',
+                210502: '平山区',
+                210503: '溪湖区',
+                210504: '明山区',
+                210505: '南芬区',
+                210521: '本溪满族自治县',
+                210522: '桓仁满族自治县',
+                210602: '元宝区',
+                210603: '振兴区',
+                210604: '振安区',
+                210624: '宽甸满族自治县',
+                210681: '东港市',
+                210682: '凤城市',
+                210702: '古塔区',
+                210703: '凌河区',
+                210711: '太和区',
+                210726: '黑山县',
+                210727: '义县',
+                210781: '凌海市',
+                210782: '北镇市',
+                210793: '经济技术开发区',
+                210802: '站前区',
+                210803: '西市区',
+                210804: '鲅鱼圈区',
+                210811: '老边区',
+                210881: '盖州市',
+                210882: '大石桥市',
+                210902: '海州区',
+                210903: '新邱区',
+                210904: '太平区',
+                210905: '清河门区',
+                210911: '细河区',
+                210921: '阜新蒙古族自治县',
+                210922: '彰武县',
+                211002: '白塔区',
+                211003: '文圣区',
+                211004: '宏伟区',
+                211005: '弓长岭区',
+                211011: '太子河区',
+                211021: '辽阳县',
+                211081: '灯塔市',
+                211102: '双台子区',
+                211103: '兴隆台区',
+                211104: '大洼区',
+                211122: '盘山县',
+                211202: '银州区',
+                211204: '清河区',
+                211221: '铁岭县',
+                211223: '西丰县',
+                211224: '昌图县',
+                211281: '调兵山市',
+                211282: '开原市',
+                211302: '双塔区',
+                211303: '龙城区',
+                211321: '朝阳县',
+                211322: '建平县',
+                211324: '喀喇沁左翼蒙古族自治县',
+                211381: '北票市',
+                211382: '凌源市',
+                211402: '连山区',
+                211403: '龙港区',
+                211404: '南票区',
+                211421: '绥中县',
+                211422: '建昌县',
+                211481: '兴城市',
+                220102: '南关区',
+                220103: '宽城区',
+                220104: '朝阳区',
+                220105: '二道区',
+                220106: '绿园区',
+                220112: '双阳区',
+                220113: '九台区',
+                220122: '农安县',
+                220182: '榆树市',
+                220183: '德惠市',
+                220192: '经济技术开发区',
+                220202: '昌邑区',
+                220203: '龙潭区',
+                220204: '船营区',
+                220211: '丰满区',
+                220221: '永吉县',
+                220281: '蛟河市',
+                220282: '桦甸市',
+                220283: '舒兰市',
+                220284: '磐石市',
+                220302: '铁西区',
+                220303: '铁东区',
+                220322: '梨树县',
+                220323: '伊通满族自治县',
+                220381: '公主岭市',
+                220382: '双辽市',
+                220402: '龙山区',
+                220403: '西安区',
+                220421: '东丰县',
+                220422: '东辽县',
+                220502: '东昌区',
+                220503: '二道江区',
+                220521: '通化县',
+                220523: '辉南县',
+                220524: '柳河县',
+                220581: '梅河口市',
+                220582: '集安市',
+                220602: '浑江区',
+                220605: '江源区',
+                220621: '抚松县',
+                220622: '靖宇县',
+                220623: '长白朝鲜族自治县',
+                220681: '临江市',
+                220702: '宁江区',
+                220721: '前郭尔罗斯蒙古族自治县',
+                220722: '长岭县',
+                220723: '乾安县',
+                220781: '扶余市',
+                220802: '洮北区',
+                220821: '镇赉县',
+                220822: '通榆县',
+                220881: '洮南市',
+                220882: '大安市',
+                222401: '延吉市',
+                222402: '图们市',
+                222403: '敦化市',
+                222404: '珲春市',
+                222405: '龙井市',
+                222406: '和龙市',
+                222424: '汪清县',
+                222426: '安图县',
+                230102: '道里区',
+                230103: '南岗区',
+                230104: '道外区',
+                230108: '平房区',
+                230109: '松北区',
+                230110: '香坊区',
+                230111: '呼兰区',
+                230112: '阿城区',
+                230113: '双城区',
+                230123: '依兰县',
+                230124: '方正县',
+                230125: '宾县',
+                230126: '巴彦县',
+                230127: '木兰县',
+                230128: '通河县',
+                230129: '延寿县',
+                230183: '尚志市',
+                230184: '五常市',
+                230202: '龙沙区',
+                230203: '建华区',
+                230204: '铁锋区',
+                230205: '昂昂溪区',
+                230206: '富拉尔基区',
+                230207: '碾子山区',
+                230208: '梅里斯达斡尔族区',
+                230221: '龙江县',
+                230223: '依安县',
+                230224: '泰来县',
+                230225: '甘南县',
+                230227: '富裕县',
+                230229: '克山县',
+                230230: '克东县',
+                230231: '拜泉县',
+                230281: '讷河市',
+                230302: '鸡冠区',
+                230303: '恒山区',
+                230304: '滴道区',
+                230305: '梨树区',
+                230306: '城子河区',
+                230307: '麻山区',
+                230321: '鸡东县',
+                230381: '虎林市',
+                230382: '密山市',
+                230402: '向阳区',
+                230403: '工农区',
+                230404: '南山区',
+                230405: '兴安区',
+                230406: '东山区',
+                230407: '兴山区',
+                230421: '萝北县',
+                230422: '绥滨县',
+                230502: '尖山区',
+                230503: '岭东区',
+                230505: '四方台区',
+                230506: '宝山区',
+                230521: '集贤县',
+                230522: '友谊县',
+                230523: '宝清县',
+                230524: '饶河县',
+                230602: '萨尔图区',
+                230603: '龙凤区',
+                230604: '让胡路区',
+                230605: '红岗区',
+                230606: '大同区',
+                230621: '肇州县',
+                230622: '肇源县',
+                230623: '林甸县',
+                230624: '杜尔伯特蒙古族自治县',
+                230702: '伊春区',
+                230703: '南岔区',
+                230704: '友好区',
+                230705: '西林区',
+                230706: '翠峦区',
+                230707: '新青区',
+                230708: '美溪区',
+                230709: '金山屯区',
+                230710: '五营区',
+                230711: '乌马河区',
+                230712: '汤旺河区',
+                230713: '带岭区',
+                230714: '乌伊岭区',
+                230715: '红星区',
+                230716: '上甘岭区',
+                230722: '嘉荫县',
+                230781: '铁力市',
+                230803: '向阳区',
+                230804: '前进区',
+                230805: '东风区',
+                230811: '郊区',
+                230822: '桦南县',
+                230826: '桦川县',
+                230828: '汤原县',
+                230881: '同江市',
+                230882: '富锦市',
+                230883: '抚远市',
+                230902: '新兴区',
+                230903: '桃山区',
+                230904: '茄子河区',
+                230921: '勃利县',
+                231002: '东安区',
+                231003: '阳明区',
+                231004: '爱民区',
+                231005: '西安区',
+                231025: '林口县',
+                231081: '绥芬河市',
+                231083: '海林市',
+                231084: '宁安市',
+                231085: '穆棱市',
+                231086: '东宁市',
+                231102: '爱辉区',
+                231121: '嫩江县',
+                231123: '逊克县',
+                231124: '孙吴县',
+                231181: '北安市',
+                231182: '五大连池市',
+                231202: '北林区',
+                231221: '望奎县',
+                231222: '兰西县',
+                231223: '青冈县',
+                231224: '庆安县',
+                231225: '明水县',
+                231226: '绥棱县',
+                231281: '安达市',
+                231282: '肇东市',
+                231283: '海伦市',
+                232701: '漠河市',
+                232721: '呼玛县',
+                232722: '塔河县',
+                232790: '松岭区',
+                232791: '呼中区',
+                232792: '加格达奇区',
+                232793: '新林区',
+                310101: '黄浦区',
+                310104: '徐汇区',
+                310105: '长宁区',
+                310106: '静安区',
+                310107: '普陀区',
+                310109: '虹口区',
+                310110: '杨浦区',
+                310112: '闵行区',
+                310113: '宝山区',
+                310114: '嘉定区',
+                310115: '浦东新区',
+                310116: '金山区',
+                310117: '松江区',
+                310118: '青浦区',
+                310120: '奉贤区',
+                310151: '崇明区',
+                320102: '玄武区',
+                320104: '秦淮区',
+                320105: '建邺区',
+                320106: '鼓楼区',
+                320111: '浦口区',
+                320113: '栖霞区',
+                320114: '雨花台区',
+                320115: '江宁区',
+                320116: '六合区',
+                320117: '溧水区',
+                320118: '高淳区',
+                320205: '锡山区',
+                320206: '惠山区',
+                320211: '滨湖区',
+                320213: '梁溪区',
+                320214: '新吴区',
+                320281: '江阴市',
+                320282: '宜兴市',
+                320302: '鼓楼区',
+                320303: '云龙区',
+                320305: '贾汪区',
+                320311: '泉山区',
+                320312: '铜山区',
+                320321: '丰县',
+                320322: '沛县',
+                320324: '睢宁县',
+                320381: '新沂市',
+                320382: '邳州市',
+                320391: '工业园区',
+                320402: '天宁区',
+                320404: '钟楼区',
+                320411: '新北区',
+                320412: '武进区',
+                320413: '金坛区',
+                320481: '溧阳市',
+                320505: '虎丘区',
+                320506: '吴中区',
+                320507: '相城区',
+                320508: '姑苏区',
+                320509: '吴江区',
+                320581: '常熟市',
+                320582: '张家港市',
+                320583: '昆山市',
+                320585: '太仓市',
+                320590: '工业园区',
+                320591: '高新区',
+                320602: '崇川区',
+                320611: '港闸区',
+                320612: '通州区',
+                320623: '如东县',
+                320681: '启东市',
+                320682: '如皋市',
+                320684: '海门市',
+                320685: '海安市',
+                320691: '高新区',
+                320703: '连云区',
+                320706: '海州区',
+                320707: '赣榆区',
+                320722: '东海县',
+                320723: '灌云县',
+                320724: '灌南县',
+                320803: '淮安区',
+                320804: '淮阴区',
+                320812: '清江浦区',
+                320813: '洪泽区',
+                320826: '涟水县',
+                320830: '盱眙县',
+                320831: '金湖县',
+                320890: '经济开发区',
+                320902: '亭湖区',
+                320903: '盐都区',
+                320904: '大丰区',
+                320921: '响水县',
+                320922: '滨海县',
+                320923: '阜宁县',
+                320924: '射阳县',
+                320925: '建湖县',
+                320981: '东台市',
+                321002: '广陵区',
+                321003: '邗江区',
+                321012: '江都区',
+                321023: '宝应县',
+                321081: '仪征市',
+                321084: '高邮市',
+                321090: '经济开发区',
+                321102: '京口区',
+                321111: '润州区',
+                321112: '丹徒区',
+                321181: '丹阳市',
+                321182: '扬中市',
+                321183: '句容市',
+                321202: '海陵区',
+                321203: '高港区',
+                321204: '姜堰区',
+                321281: '兴化市',
+                321282: '靖江市',
+                321283: '泰兴市',
+                321302: '宿城区',
+                321311: '宿豫区',
+                321322: '沭阳县',
+                321323: '泗阳县',
+                321324: '泗洪县',
+                330102: '上城区',
+                330103: '下城区',
+                330104: '江干区',
+                330105: '拱墅区',
+                330106: '西湖区',
+                330108: '滨江区',
+                330109: '萧山区',
+                330110: '余杭区',
+                330111: '富阳区',
+                330112: '临安区',
+                330122: '桐庐县',
+                330127: '淳安县',
+                330182: '建德市',
+                330203: '海曙区',
+                330205: '江北区',
+                330206: '北仑区',
+                330211: '镇海区',
+                330212: '鄞州区',
+                330213: '奉化区',
+                330225: '象山县',
+                330226: '宁海县',
+                330281: '余姚市',
+                330282: '慈溪市',
+                330302: '鹿城区',
+                330303: '龙湾区',
+                330304: '瓯海区',
+                330305: '洞头区',
+                330324: '永嘉县',
+                330326: '平阳县',
+                330327: '苍南县',
+                330328: '文成县',
+                330329: '泰顺县',
+                330381: '瑞安市',
+                330382: '乐清市',
+                330402: '南湖区',
+                330411: '秀洲区',
+                330421: '嘉善县',
+                330424: '海盐县',
+                330481: '海宁市',
+                330482: '平湖市',
+                330483: '桐乡市',
+                330502: '吴兴区',
+                330503: '南浔区',
+                330521: '德清县',
+                330522: '长兴县',
+                330523: '安吉县',
+                330602: '越城区',
+                330603: '柯桥区',
+                330604: '上虞区',
+                330624: '新昌县',
+                330681: '诸暨市',
+                330683: '嵊州市',
+                330702: '婺城区',
+                330703: '金东区',
+                330723: '武义县',
+                330726: '浦江县',
+                330727: '磐安县',
+                330781: '兰溪市',
+                330782: '义乌市',
+                330783: '东阳市',
+                330784: '永康市',
+                330802: '柯城区',
+                330803: '衢江区',
+                330822: '常山县',
+                330824: '开化县',
+                330825: '龙游县',
+                330881: '江山市',
+                330902: '定海区',
+                330903: '普陀区',
+                330921: '岱山县',
+                330922: '嵊泗县',
+                331002: '椒江区',
+                331003: '黄岩区',
+                331004: '路桥区',
+                331022: '三门县',
+                331023: '天台县',
+                331024: '仙居县',
+                331081: '温岭市',
+                331082: '临海市',
+                331083: '玉环市',
+                331102: '莲都区',
+                331121: '青田县',
+                331122: '缙云县',
+                331123: '遂昌县',
+                331124: '松阳县',
+                331125: '云和县',
+                331126: '庆元县',
+                331127: '景宁畲族自治县',
+                331181: '龙泉市',
+                340102: '瑶海区',
+                340103: '庐阳区',
+                340104: '蜀山区',
+                340111: '包河区',
+                340121: '长丰县',
+                340122: '肥东县',
+                340123: '肥西县',
+                340124: '庐江县',
+                340181: '巢湖市',
+                340190: '高新技术开发区',
+                340191: '经济技术开发区',
+                340202: '镜湖区',
+                340203: '弋江区',
+                340207: '鸠江区',
+                340208: '三山区',
+                340221: '芜湖县',
+                340222: '繁昌县',
+                340223: '南陵县',
+                340225: '无为县',
+                340302: '龙子湖区',
+                340303: '蚌山区',
+                340304: '禹会区',
+                340311: '淮上区',
+                340321: '怀远县',
+                340322: '五河县',
+                340323: '固镇县',
+                340402: '大通区',
+                340403: '田家庵区',
+                340404: '谢家集区',
+                340405: '八公山区',
+                340406: '潘集区',
+                340421: '凤台县',
+                340422: '寿县',
+                340503: '花山区',
+                340504: '雨山区',
+                340506: '博望区',
+                340521: '当涂县',
+                340522: '含山县',
+                340523: '和县',
+                340602: '杜集区',
+                340603: '相山区',
+                340604: '烈山区',
+                340621: '濉溪县',
+                340705: '铜官区',
+                340706: '义安区',
+                340711: '郊区',
+                340722: '枞阳县',
+                340802: '迎江区',
+                340803: '大观区',
+                340811: '宜秀区',
+                340822: '怀宁县',
+                340824: '潜山县',
+                340825: '太湖县',
+                340826: '宿松县',
+                340827: '望江县',
+                340828: '岳西县',
+                340881: '桐城市',
+                341002: '屯溪区',
+                341003: '黄山区',
+                341004: '徽州区',
+                341021: '歙县',
+                341022: '休宁县',
+                341023: '黟县',
+                341024: '祁门县',
+                341102: '琅琊区',
+                341103: '南谯区',
+                341122: '来安县',
+                341124: '全椒县',
+                341125: '定远县',
+                341126: '凤阳县',
+                341181: '天长市',
+                341182: '明光市',
+                341202: '颍州区',
+                341203: '颍东区',
+                341204: '颍泉区',
+                341221: '临泉县',
+                341222: '太和县',
+                341225: '阜南县',
+                341226: '颍上县',
+                341282: '界首市',
+                341302: '埇桥区',
+                341321: '砀山县',
+                341322: '萧县',
+                341323: '灵璧县',
+                341324: '泗县',
+                341390: '经济开发区',
+                341502: '金安区',
+                341503: '裕安区',
+                341504: '叶集区',
+                341522: '霍邱县',
+                341523: '舒城县',
+                341524: '金寨县',
+                341525: '霍山县',
+                341602: '谯城区',
+                341621: '涡阳县',
+                341622: '蒙城县',
+                341623: '利辛县',
+                341702: '贵池区',
+                341721: '东至县',
+                341722: '石台县',
+                341723: '青阳县',
+                341802: '宣州区',
+                341821: '郎溪县',
+                341822: '广德县',
+                341823: '泾县',
+                341824: '绩溪县',
+                341825: '旌德县',
+                341881: '宁国市',
+                350102: '鼓楼区',
+                350103: '台江区',
+                350104: '仓山区',
+                350105: '马尾区',
+                350111: '晋安区',
+                350112: '长乐区',
+                350121: '闽侯县',
+                350122: '连江县',
+                350123: '罗源县',
+                350124: '闽清县',
+                350125: '永泰县',
+                350128: '平潭县',
+                350181: '福清市',
+                350203: '思明区',
+                350205: '海沧区',
+                350206: '湖里区',
+                350211: '集美区',
+                350212: '同安区',
+                350213: '翔安区',
+                350302: '城厢区',
+                350303: '涵江区',
+                350304: '荔城区',
+                350305: '秀屿区',
+                350322: '仙游县',
+                350402: '梅列区',
+                350403: '三元区',
+                350421: '明溪县',
+                350423: '清流县',
+                350424: '宁化县',
+                350425: '大田县',
+                350426: '尤溪县',
+                350427: '沙县',
+                350428: '将乐县',
+                350429: '泰宁县',
+                350430: '建宁县',
+                350481: '永安市',
+                350502: '鲤城区',
+                350503: '丰泽区',
+                350504: '洛江区',
+                350505: '泉港区',
+                350521: '惠安县',
+                350524: '安溪县',
+                350525: '永春县',
+                350526: '德化县',
+                350527: '金门县',
+                350581: '石狮市',
+                350582: '晋江市',
+                350583: '南安市',
+                350602: '芗城区',
+                350603: '龙文区',
+                350622: '云霄县',
+                350623: '漳浦县',
+                350624: '诏安县',
+                350625: '长泰县',
+                350626: '东山县',
+                350627: '南靖县',
+                350628: '平和县',
+                350629: '华安县',
+                350681: '龙海市',
+                350702: '延平区',
+                350703: '建阳区',
+                350721: '顺昌县',
+                350722: '浦城县',
+                350723: '光泽县',
+                350724: '松溪县',
+                350725: '政和县',
+                350781: '邵武市',
+                350782: '武夷山市',
+                350783: '建瓯市',
+                350802: '新罗区',
+                350803: '永定区',
+                350821: '长汀县',
+                350823: '上杭县',
+                350824: '武平县',
+                350825: '连城县',
+                350881: '漳平市',
+                350902: '蕉城区',
+                350921: '霞浦县',
+                350922: '古田县',
+                350923: '屏南县',
+                350924: '寿宁县',
+                350925: '周宁县',
+                350926: '柘荣县',
+                350981: '福安市',
+                350982: '福鼎市',
+                360102: '东湖区',
+                360103: '西湖区',
+                360104: '青云谱区',
+                360105: '湾里区',
+                360111: '青山湖区',
+                360112: '新建区',
+                360121: '南昌县',
+                360123: '安义县',
+                360124: '进贤县',
+                360190: '经济技术开发区',
+                360192: '高新区',
+                360202: '昌江区',
+                360203: '珠山区',
+                360222: '浮梁县',
+                360281: '乐平市',
+                360302: '安源区',
+                360313: '湘东区',
+                360321: '莲花县',
+                360322: '上栗县',
+                360323: '芦溪县',
+                360402: '濂溪区',
+                360403: '浔阳区',
+                360404: '柴桑区',
+                360423: '武宁县',
+                360424: '修水县',
+                360425: '永修县',
+                360426: '德安县',
+                360428: '都昌县',
+                360429: '湖口县',
+                360430: '彭泽县',
+                360481: '瑞昌市',
+                360482: '共青城市',
+                360483: '庐山市',
+                360490: '经济技术开发区',
+                360502: '渝水区',
+                360521: '分宜县',
+                360602: '月湖区',
+                360603: '余江区',
+                360681: '贵溪市',
+                360702: '章贡区',
+                360703: '南康区',
+                360704: '赣县区',
+                360722: '信丰县',
+                360723: '大余县',
+                360724: '上犹县',
+                360725: '崇义县',
+                360726: '安远县',
+                360727: '龙南县',
+                360728: '定南县',
+                360729: '全南县',
+                360730: '宁都县',
+                360731: '于都县',
+                360732: '兴国县',
+                360733: '会昌县',
+                360734: '寻乌县',
+                360735: '石城县',
+                360781: '瑞金市',
+                360802: '吉州区',
+                360803: '青原区',
+                360821: '吉安县',
+                360822: '吉水县',
+                360823: '峡江县',
+                360824: '新干县',
+                360825: '永丰县',
+                360826: '泰和县',
+                360827: '遂川县',
+                360828: '万安县',
+                360829: '安福县',
+                360830: '永新县',
+                360881: '井冈山市',
+                360902: '袁州区',
+                360921: '奉新县',
+                360922: '万载县',
+                360923: '上高县',
+                360924: '宜丰县',
+                360925: '靖安县',
+                360926: '铜鼓县',
+                360981: '丰城市',
+                360982: '樟树市',
+                360983: '高安市',
+                361002: '临川区',
+                361003: '东乡区',
+                361021: '南城县',
+                361022: '黎川县',
+                361023: '南丰县',
+                361024: '崇仁县',
+                361025: '乐安县',
+                361026: '宜黄县',
+                361027: '金溪县',
+                361028: '资溪县',
+                361030: '广昌县',
+                361102: '信州区',
+                361103: '广丰区',
+                361121: '上饶县',
+                361123: '玉山县',
+                361124: '铅山县',
+                361125: '横峰县',
+                361126: '弋阳县',
+                361127: '余干县',
+                361128: '鄱阳县',
+                361129: '万年县',
+                361130: '婺源县',
+                361181: '德兴市',
+                370102: '历下区',
+                370103: '市中区',
+                370104: '槐荫区',
+                370105: '天桥区',
+                370112: '历城区',
+                370113: '长清区',
+                370114: '章丘区',
+                370115: '济阳区',
+                370124: '平阴县',
+                370126: '商河县',
+                370190: '高新区',
+                370202: '市南区',
+                370203: '市北区',
+                370211: '黄岛区',
+                370212: '崂山区',
+                370213: '李沧区',
+                370214: '城阳区',
+                370215: '即墨区',
+                370281: '胶州市',
+                370283: '平度市',
+                370285: '莱西市',
+                370290: '开发区',
+                370302: '淄川区',
+                370303: '张店区',
+                370304: '博山区',
+                370305: '临淄区',
+                370306: '周村区',
+                370321: '桓台县',
+                370322: '高青县',
+                370323: '沂源县',
+                370402: '市中区',
+                370403: '薛城区',
+                370404: '峄城区',
+                370405: '台儿庄区',
+                370406: '山亭区',
+                370481: '滕州市',
+                370502: '东营区',
+                370503: '河口区',
+                370505: '垦利区',
+                370522: '利津县',
+                370523: '广饶县',
+                370602: '芝罘区',
+                370611: '福山区',
+                370612: '牟平区',
+                370613: '莱山区',
+                370634: '长岛县',
+                370681: '龙口市',
+                370682: '莱阳市',
+                370683: '莱州市',
+                370684: '蓬莱市',
+                370685: '招远市',
+                370686: '栖霞市',
+                370687: '海阳市',
+                370690: '开发区',
+                370702: '潍城区',
+                370703: '寒亭区',
+                370704: '坊子区',
+                370705: '奎文区',
+                370724: '临朐县',
+                370725: '昌乐县',
+                370781: '青州市',
+                370782: '诸城市',
+                370783: '寿光市',
+                370784: '安丘市',
+                370785: '高密市',
+                370786: '昌邑市',
+                370790: '开发区',
+                370791: '高新区',
+                370811: '任城区',
+                370812: '兖州区',
+                370826: '微山县',
+                370827: '鱼台县',
+                370828: '金乡县',
+                370829: '嘉祥县',
+                370830: '汶上县',
+                370831: '泗水县',
+                370832: '梁山县',
+                370881: '曲阜市',
+                370883: '邹城市',
+                370890: '高新区',
+                370902: '泰山区',
+                370911: '岱岳区',
+                370921: '宁阳县',
+                370923: '东平县',
+                370982: '新泰市',
+                370983: '肥城市',
+                371002: '环翠区',
+                371003: '文登区',
+                371082: '荣成市',
+                371083: '乳山市',
+                371091: '经济技术开发区',
+                371102: '东港区',
+                371103: '岚山区',
+                371121: '五莲县',
+                371122: '莒县',
+                371202: '莱城区',
+                371203: '钢城区',
+                371302: '兰山区',
+                371311: '罗庄区',
+                371312: '河东区',
+                371321: '沂南县',
+                371322: '郯城县',
+                371323: '沂水县',
+                371324: '兰陵县',
+                371325: '费县',
+                371326: '平邑县',
+                371327: '莒南县',
+                371328: '蒙阴县',
+                371329: '临沭县',
+                371402: '德城区',
+                371403: '陵城区',
+                371422: '宁津县',
+                371423: '庆云县',
+                371424: '临邑县',
+                371425: '齐河县',
+                371426: '平原县',
+                371427: '夏津县',
+                371428: '武城县',
+                371481: '乐陵市',
+                371482: '禹城市',
+                371502: '东昌府区',
+                371521: '阳谷县',
+                371522: '莘县',
+                371523: '茌平县',
+                371524: '东阿县',
+                371525: '冠县',
+                371526: '高唐县',
+                371581: '临清市',
+                371602: '滨城区',
+                371603: '沾化区',
+                371621: '惠民县',
+                371622: '阳信县',
+                371623: '无棣县',
+                371625: '博兴县',
+                371681: '邹平市',
+                371702: '牡丹区',
+                371703: '定陶区',
+                371721: '曹县',
+                371722: '单县',
+                371723: '成武县',
+                371724: '巨野县',
+                371725: '郓城县',
+                371726: '鄄城县',
+                371728: '东明县',
+                410102: '中原区',
+                410103: '二七区',
+                410104: '管城回族区',
+                410105: '金水区',
+                410106: '上街区',
+                410108: '惠济区',
+                410122: '中牟县',
+                410181: '巩义市',
+                410182: '荥阳市',
+                410183: '新密市',
+                410184: '新郑市',
+                410185: '登封市',
+                410190: '高新技术开发区',
+                410191: '经济技术开发区',
+                410202: '龙亭区',
+                410203: '顺河回族区',
+                410204: '鼓楼区',
+                410205: '禹王台区',
+                410212: '祥符区',
+                410221: '杞县',
+                410222: '通许县',
+                410223: '尉氏县',
+                410225: '兰考县',
+                410302: '老城区',
+                410303: '西工区',
+                410304: '瀍河回族区',
+                410305: '涧西区',
+                410306: '吉利区',
+                410311: '洛龙区',
+                410322: '孟津县',
+                410323: '新安县',
+                410324: '栾川县',
+                410325: '嵩县',
+                410326: '汝阳县',
+                410327: '宜阳县',
+                410328: '洛宁县',
+                410329: '伊川县',
+                410381: '偃师市',
+                410402: '新华区',
+                410403: '卫东区',
+                410404: '石龙区',
+                410411: '湛河区',
+                410421: '宝丰县',
+                410422: '叶县',
+                410423: '鲁山县',
+                410425: '郏县',
+                410481: '舞钢市',
+                410482: '汝州市',
+                410502: '文峰区',
+                410503: '北关区',
+                410505: '殷都区',
+                410506: '龙安区',
+                410522: '安阳县',
+                410523: '汤阴县',
+                410526: '滑县',
+                410527: '内黄县',
+                410581: '林州市',
+                410590: '开发区',
+                410602: '鹤山区',
+                410603: '山城区',
+                410611: '淇滨区',
+                410621: '浚县',
+                410622: '淇县',
+                410702: '红旗区',
+                410703: '卫滨区',
+                410704: '凤泉区',
+                410711: '牧野区',
+                410721: '新乡县',
+                410724: '获嘉县',
+                410725: '原阳县',
+                410726: '延津县',
+                410727: '封丘县',
+                410728: '长垣县',
+                410781: '卫辉市',
+                410782: '辉县市',
+                410802: '解放区',
+                410803: '中站区',
+                410804: '马村区',
+                410811: '山阳区',
+                410821: '修武县',
+                410822: '博爱县',
+                410823: '武陟县',
+                410825: '温县',
+                410882: '沁阳市',
+                410883: '孟州市',
+                410902: '华龙区',
+                410922: '清丰县',
+                410923: '南乐县',
+                410926: '范县',
+                410927: '台前县',
+                410928: '濮阳县',
+                411002: '魏都区',
+                411003: '建安区',
+                411024: '鄢陵县',
+                411025: '襄城县',
+                411081: '禹州市',
+                411082: '长葛市',
+                411102: '源汇区',
+                411103: '郾城区',
+                411104: '召陵区',
+                411121: '舞阳县',
+                411122: '临颍县',
+                411202: '湖滨区',
+                411203: '陕州区',
+                411221: '渑池县',
+                411224: '卢氏县',
+                411281: '义马市',
+                411282: '灵宝市',
+                411302: '宛城区',
+                411303: '卧龙区',
+                411321: '南召县',
+                411322: '方城县',
+                411323: '西峡县',
+                411324: '镇平县',
+                411325: '内乡县',
+                411326: '淅川县',
+                411327: '社旗县',
+                411328: '唐河县',
+                411329: '新野县',
+                411330: '桐柏县',
+                411381: '邓州市',
+                411402: '梁园区',
+                411403: '睢阳区',
+                411421: '民权县',
+                411422: '睢县',
+                411423: '宁陵县',
+                411424: '柘城县',
+                411425: '虞城县',
+                411426: '夏邑县',
+                411481: '永城市',
+                411502: '浉河区',
+                411503: '平桥区',
+                411521: '罗山县',
+                411522: '光山县',
+                411523: '新县',
+                411524: '商城县',
+                411525: '固始县',
+                411526: '潢川县',
+                411527: '淮滨县',
+                411528: '息县',
+                411602: '川汇区',
+                411621: '扶沟县',
+                411622: '西华县',
+                411623: '商水县',
+                411624: '沈丘县',
+                411625: '郸城县',
+                411626: '淮阳县',
+                411627: '太康县',
+                411628: '鹿邑县',
+                411681: '项城市',
+                411690: '经济开发区',
+                411702: '驿城区',
+                411721: '西平县',
+                411722: '上蔡县',
+                411723: '平舆县',
+                411724: '正阳县',
+                411725: '确山县',
+                411726: '泌阳县',
+                411727: '汝南县',
+                411728: '遂平县',
+                411729: '新蔡县',
+                419001: '济源市',
+                420102: '江岸区',
+                420103: '江汉区',
+                420104: '硚口区',
+                420105: '汉阳区',
+                420106: '武昌区',
+                420107: '青山区',
+                420111: '洪山区',
+                420112: '东西湖区',
+                420113: '汉南区',
+                420114: '蔡甸区',
+                420115: '江夏区',
+                420116: '黄陂区',
+                420117: '新洲区',
+                420202: '黄石港区',
+                420203: '西塞山区',
+                420204: '下陆区',
+                420205: '铁山区',
+                420222: '阳新县',
+                420281: '大冶市',
+                420302: '茅箭区',
+                420303: '张湾区',
+                420304: '郧阳区',
+                420322: '郧西县',
+                420323: '竹山县',
+                420324: '竹溪县',
+                420325: '房县',
+                420381: '丹江口市',
+                420502: '西陵区',
+                420503: '伍家岗区',
+                420504: '点军区',
+                420505: '猇亭区',
+                420506: '夷陵区',
+                420525: '远安县',
+                420526: '兴山县',
+                420527: '秭归县',
+                420528: '长阳土家族自治县',
+                420529: '五峰土家族自治县',
+                420581: '宜都市',
+                420582: '当阳市',
+                420583: '枝江市',
+                420590: '经济开发区',
+                420602: '襄城区',
+                420606: '樊城区',
+                420607: '襄州区',
+                420624: '南漳县',
+                420625: '谷城县',
+                420626: '保康县',
+                420682: '老河口市',
+                420683: '枣阳市',
+                420684: '宜城市',
+                420702: '梁子湖区',
+                420703: '华容区',
+                420704: '鄂城区',
+                420802: '东宝区',
+                420804: '掇刀区',
+                420822: '沙洋县',
+                420881: '钟祥市',
+                420882: '京山市',
+                420902: '孝南区',
+                420921: '孝昌县',
+                420922: '大悟县',
+                420923: '云梦县',
+                420981: '应城市',
+                420982: '安陆市',
+                420984: '汉川市',
+                421002: '沙市区',
+                421003: '荆州区',
+                421022: '公安县',
+                421023: '监利县',
+                421024: '江陵县',
+                421081: '石首市',
+                421083: '洪湖市',
+                421087: '松滋市',
+                421102: '黄州区',
+                421121: '团风县',
+                421122: '红安县',
+                421123: '罗田县',
+                421124: '英山县',
+                421125: '浠水县',
+                421126: '蕲春县',
+                421127: '黄梅县',
+                421181: '麻城市',
+                421182: '武穴市',
+                421202: '咸安区',
+                421221: '嘉鱼县',
+                421222: '通城县',
+                421223: '崇阳县',
+                421224: '通山县',
+                421281: '赤壁市',
+                421303: '曾都区',
+                421321: '随县',
+                421381: '广水市',
+                422801: '恩施市',
+                422802: '利川市',
+                422822: '建始县',
+                422823: '巴东县',
+                422825: '宣恩县',
+                422826: '咸丰县',
+                422827: '来凤县',
+                422828: '鹤峰县',
+                429004: '仙桃市',
+                429005: '潜江市',
+                429006: '天门市',
+                429021: '神农架林区',
+                430102: '芙蓉区',
+                430103: '天心区',
+                430104: '岳麓区',
+                430105: '开福区',
+                430111: '雨花区',
+                430112: '望城区',
+                430121: '长沙县',
+                430181: '浏阳市',
+                430182: '宁乡市',
+                430202: '荷塘区',
+                430203: '芦淞区',
+                430204: '石峰区',
+                430211: '天元区',
+                430212: '渌口区',
+                430223: '攸县',
+                430224: '茶陵县',
+                430225: '炎陵县',
+                430281: '醴陵市',
+                430302: '雨湖区',
+                430304: '岳塘区',
+                430321: '湘潭县',
+                430381: '湘乡市',
+                430382: '韶山市',
+                430405: '珠晖区',
+                430406: '雁峰区',
+                430407: '石鼓区',
+                430408: '蒸湘区',
+                430412: '南岳区',
+                430421: '衡阳县',
+                430422: '衡南县',
+                430423: '衡山县',
+                430424: '衡东县',
+                430426: '祁东县',
+                430481: '耒阳市',
+                430482: '常宁市',
+                430502: '双清区',
+                430503: '大祥区',
+                430511: '北塔区',
+                430521: '邵东县',
+                430522: '新邵县',
+                430523: '邵阳县',
+                430524: '隆回县',
+                430525: '洞口县',
+                430527: '绥宁县',
+                430528: '新宁县',
+                430529: '城步苗族自治县',
+                430581: '武冈市',
+                430602: '岳阳楼区',
+                430603: '云溪区',
+                430611: '君山区',
+                430621: '岳阳县',
+                430623: '华容县',
+                430624: '湘阴县',
+                430626: '平江县',
+                430681: '汨罗市',
+                430682: '临湘市',
+                430702: '武陵区',
+                430703: '鼎城区',
+                430721: '安乡县',
+                430722: '汉寿县',
+                430723: '澧县',
+                430724: '临澧县',
+                430725: '桃源县',
+                430726: '石门县',
+                430781: '津市市',
+                430802: '永定区',
+                430811: '武陵源区',
+                430821: '慈利县',
+                430822: '桑植县',
+                430902: '资阳区',
+                430903: '赫山区',
+                430921: '南县',
+                430922: '桃江县',
+                430923: '安化县',
+                430981: '沅江市',
+                431002: '北湖区',
+                431003: '苏仙区',
+                431021: '桂阳县',
+                431022: '宜章县',
+                431023: '永兴县',
+                431024: '嘉禾县',
+                431025: '临武县',
+                431026: '汝城县',
+                431027: '桂东县',
+                431028: '安仁县',
+                431081: '资兴市',
+                431102: '零陵区',
+                431103: '冷水滩区',
+                431121: '祁阳县',
+                431122: '东安县',
+                431123: '双牌县',
+                431124: '道县',
+                431125: '江永县',
+                431126: '宁远县',
+                431127: '蓝山县',
+                431128: '新田县',
+                431129: '江华瑶族自治县',
+                431202: '鹤城区',
+                431221: '中方县',
+                431222: '沅陵县',
+                431223: '辰溪县',
+                431224: '溆浦县',
+                431225: '会同县',
+                431226: '麻阳苗族自治县',
+                431227: '新晃侗族自治县',
+                431228: '芷江侗族自治县',
+                431229: '靖州苗族侗族自治县',
+                431230: '通道侗族自治县',
+                431281: '洪江市',
+                431302: '娄星区',
+                431321: '双峰县',
+                431322: '新化县',
+                431381: '冷水江市',
+                431382: '涟源市',
+                433101: '吉首市',
+                433122: '泸溪县',
+                433123: '凤凰县',
+                433124: '花垣县',
+                433125: '保靖县',
+                433126: '古丈县',
+                433127: '永顺县',
+                433130: '龙山县',
+                440103: '荔湾区',
+                440104: '越秀区',
+                440105: '海珠区',
+                440106: '天河区',
+                440111: '白云区',
+                440112: '黄埔区',
+                440113: '番禺区',
+                440114: '花都区',
+                440115: '南沙区',
+                440117: '从化区',
+                440118: '增城区',
+                440203: '武江区',
+                440204: '浈江区',
+                440205: '曲江区',
+                440222: '始兴县',
+                440224: '仁化县',
+                440229: '翁源县',
+                440232: '乳源瑶族自治县',
+                440233: '新丰县',
+                440281: '乐昌市',
+                440282: '南雄市',
+                440303: '罗湖区',
+                440304: '福田区',
+                440305: '南山区',
+                440306: '宝安区',
+                440307: '龙岗区',
+                440308: '盐田区',
+                440309: '龙华区',
+                440310: '坪山区',
+                440311: '光明区',
+                440402: '香洲区',
+                440403: '斗门区',
+                440404: '金湾区',
+                440507: '龙湖区',
+                440511: '金平区',
+                440512: '濠江区',
+                440513: '潮阳区',
+                440514: '潮南区',
+                440515: '澄海区',
+                440523: '南澳县',
+                440604: '禅城区',
+                440605: '南海区',
+                440606: '顺德区',
+                440607: '三水区',
+                440608: '高明区',
+                440703: '蓬江区',
+                440704: '江海区',
+                440705: '新会区',
+                440781: '台山市',
+                440783: '开平市',
+                440784: '鹤山市',
+                440785: '恩平市',
+                440802: '赤坎区',
+                440803: '霞山区',
+                440804: '坡头区',
+                440811: '麻章区',
+                440823: '遂溪县',
+                440825: '徐闻县',
+                440881: '廉江市',
+                440882: '雷州市',
+                440883: '吴川市',
+                440890: '经济技术开发区',
+                440902: '茂南区',
+                440904: '电白区',
+                440981: '高州市',
+                440982: '化州市',
+                440983: '信宜市',
+                441202: '端州区',
+                441203: '鼎湖区',
+                441204: '高要区',
+                441223: '广宁县',
+                441224: '怀集县',
+                441225: '封开县',
+                441226: '德庆县',
+                441284: '四会市',
+                441302: '惠城区',
+                441303: '惠阳区',
+                441322: '博罗县',
+                441323: '惠东县',
+                441324: '龙门县',
+                441402: '梅江区',
+                441403: '梅县区',
+                441422: '大埔县',
+                441423: '丰顺县',
+                441424: '五华县',
+                441426: '平远县',
+                441427: '蕉岭县',
+                441481: '兴宁市',
+                441502: '城区',
+                441521: '海丰县',
+                441523: '陆河县',
+                441581: '陆丰市',
+                441602: '源城区',
+                441621: '紫金县',
+                441622: '龙川县',
+                441623: '连平县',
+                441624: '和平县',
+                441625: '东源县',
+                441702: '江城区',
+                441704: '阳东区',
+                441721: '阳西县',
+                441781: '阳春市',
+                441802: '清城区',
+                441803: '清新区',
+                441821: '佛冈县',
+                441823: '阳山县',
+                441825: '连山壮族瑶族自治县',
+                441826: '连南瑶族自治县',
+                441881: '英德市',
+                441882: '连州市',
+                441901: '中堂镇',
+                441903: '南城街道办事处',
+                441904: '长安镇',
+                441905: '东坑镇',
+                441906: '樟木头镇',
+                441907: '莞城街道办事处',
+                441908: '石龙镇',
+                441909: '桥头镇',
+                441910: '万江街道办事处',
+                441911: '麻涌镇',
+                441912: '虎门镇',
+                441913: '谢岗镇',
+                441914: '石碣镇',
+                441915: '茶山镇',
+                441916: '东城街道办事处',
+                441917: '洪梅镇',
+                441918: '道滘镇',
+                441919: '高埗镇',
+                441920: '企石镇',
+                441921: '凤岗镇',
+                441922: '大岭山镇',
+                441923: '松山湖管委会',
+                441924: '清溪镇',
+                441925: '望牛墩镇',
+                441926: '厚街镇',
+                441927: '常平镇',
+                441928: '寮步镇',
+                441929: '石排镇',
+                441930: '横沥镇',
+                441931: '塘厦镇',
+                441932: '黄江镇',
+                441933: '大朗镇',
+                441934: '东莞港',
+                441935: '东莞生态园',
+                441990: '沙田镇',
+                442001: '南头镇',
+                442002: '神湾镇',
+                442003: '东凤镇',
+                442004: '五桂山街道办事处',
+                442005: '黄圃镇',
+                442006: '小榄镇',
+                442007: '石岐区街道办事处',
+                442008: '横栏镇',
+                442009: '三角镇',
+                442010: '三乡镇',
+                442011: '港口镇',
+                442012: '沙溪镇',
+                442013: '板芙镇',
+                442015: '东升镇',
+                442016: '阜沙镇',
+                442017: '民众镇',
+                442018: '东区街道办事处',
+                442019: '火炬开发区街道办事处',
+                442020: '西区街道办事处',
+                442021: '南区街道办事处',
+                442022: '古镇镇',
+                442023: '坦洲镇',
+                442024: '大涌镇',
+                442025: '南朗镇',
+                445102: '湘桥区',
+                445103: '潮安区',
+                445122: '饶平县',
+                445202: '榕城区',
+                445203: '揭东区',
+                445222: '揭西县',
+                445224: '惠来县',
+                445281: '普宁市',
+                445302: '云城区',
+                445303: '云安区',
+                445321: '新兴县',
+                445322: '郁南县',
+                445381: '罗定市',
+                450102: '兴宁区',
+                450103: '青秀区',
+                450105: '江南区',
+                450107: '西乡塘区',
+                450108: '良庆区',
+                450109: '邕宁区',
+                450110: '武鸣区',
+                450123: '隆安县',
+                450124: '马山县',
+                450125: '上林县',
+                450126: '宾阳县',
+                450127: '横县',
+                450202: '城中区',
+                450203: '鱼峰区',
+                450204: '柳南区',
+                450205: '柳北区',
+                450206: '柳江区',
+                450222: '柳城县',
+                450223: '鹿寨县',
+                450224: '融安县',
+                450225: '融水苗族自治县',
+                450226: '三江侗族自治县',
+                450302: '秀峰区',
+                450303: '叠彩区',
+                450304: '象山区',
+                450305: '七星区',
+                450311: '雁山区',
+                450312: '临桂区',
+                450321: '阳朔县',
+                450323: '灵川县',
+                450324: '全州县',
+                450325: '兴安县',
+                450326: '永福县',
+                450327: '灌阳县',
+                450328: '龙胜各族自治县',
+                450329: '资源县',
+                450330: '平乐县',
+                450332: '恭城瑶族自治县',
+                450381: '荔浦市',
+                450403: '万秀区',
+                450405: '长洲区',
+                450406: '龙圩区',
+                450421: '苍梧县',
+                450422: '藤县',
+                450423: '蒙山县',
+                450481: '岑溪市',
+                450502: '海城区',
+                450503: '银海区',
+                450512: '铁山港区',
+                450521: '合浦县',
+                450602: '港口区',
+                450603: '防城区',
+                450621: '上思县',
+                450681: '东兴市',
+                450702: '钦南区',
+                450703: '钦北区',
+                450721: '灵山县',
+                450722: '浦北县',
+                450802: '港北区',
+                450803: '港南区',
+                450804: '覃塘区',
+                450821: '平南县',
+                450881: '桂平市',
+                450902: '玉州区',
+                450903: '福绵区',
+                450921: '容县',
+                450922: '陆川县',
+                450923: '博白县',
+                450924: '兴业县',
+                450981: '北流市',
+                451002: '右江区',
+                451021: '田阳县',
+                451022: '田东县',
+                451023: '平果县',
+                451024: '德保县',
+                451026: '那坡县',
+                451027: '凌云县',
+                451028: '乐业县',
+                451029: '田林县',
+                451030: '西林县',
+                451031: '隆林各族自治县',
+                451081: '靖西市',
+                451102: '八步区',
+                451103: '平桂区',
+                451121: '昭平县',
+                451122: '钟山县',
+                451123: '富川瑶族自治县',
+                451202: '金城江区',
+                451203: '宜州区',
+                451221: '南丹县',
+                451222: '天峨县',
+                451223: '凤山县',
+                451224: '东兰县',
+                451225: '罗城仫佬族自治县',
+                451226: '环江毛南族自治县',
+                451227: '巴马瑶族自治县',
+                451228: '都安瑶族自治县',
+                451229: '大化瑶族自治县',
+                451302: '兴宾区',
+                451321: '忻城县',
+                451322: '象州县',
+                451323: '武宣县',
+                451324: '金秀瑶族自治县',
+                451381: '合山市',
+                451402: '江州区',
+                451421: '扶绥县',
+                451422: '宁明县',
+                451423: '龙州县',
+                451424: '大新县',
+                451425: '天等县',
+                451481: '凭祥市',
+                460105: '秀英区',
+                460106: '龙华区',
+                460107: '琼山区',
+                460108: '美兰区',
+                460202: '海棠区',
+                460203: '吉阳区',
+                460204: '天涯区',
+                460205: '崖州区',
+                460321: '西沙群岛',
+                460322: '南沙群岛',
+                460323: '中沙群岛的岛礁及其海域',
+                460401: '那大镇',
+                460402: '和庆镇',
+                460403: '南丰镇',
+                460404: '大成镇',
+                460405: '雅星镇',
+                460406: '兰洋镇',
+                460407: '光村镇',
+                460408: '木棠镇',
+                460409: '海头镇',
+                460410: '峨蔓镇',
+                460411: '王五镇',
+                460412: '白马井镇',
+                460413: '中和镇',
+                460414: '排浦镇',
+                460415: '东成镇',
+                460416: '新州镇',
+                460417: '洋浦经济开发区',
+                460418: '华南热作学院',
+                469001: '五指山市',
+                469002: '琼海市',
+                469005: '文昌市',
+                469006: '万宁市',
+                469007: '东方市',
+                469021: '定安县',
+                469022: '屯昌县',
+                469023: '澄迈县',
+                469024: '临高县',
+                469025: '白沙黎族自治县',
+                469026: '昌江黎族自治县',
+                469027: '乐东黎族自治县',
+                469028: '陵水黎族自治县',
+                469029: '保亭黎族苗族自治县',
+                469030: '琼中黎族苗族自治县',
+                500101: '万州区',
+                500102: '涪陵区',
+                500103: '渝中区',
+                500104: '大渡口区',
+                500105: '江北区',
+                500106: '沙坪坝区',
+                500107: '九龙坡区',
+                500108: '南岸区',
+                500109: '北碚区',
+                500110: '綦江区',
+                500111: '大足区',
+                500112: '渝北区',
+                500113: '巴南区',
+                500114: '黔江区',
+                500115: '长寿区',
+                500116: '江津区',
+                500117: '合川区',
+                500118: '永川区',
+                500119: '南川区',
+                500120: '璧山区',
+                500151: '铜梁区',
+                500152: '潼南区',
+                500153: '荣昌区',
+                500154: '开州区',
+                500155: '梁平区',
+                500156: '武隆区',
+                500229: '城口县',
+                500230: '丰都县',
+                500231: '垫江县',
+                500233: '忠县',
+                500235: '云阳县',
+                500236: '奉节县',
+                500237: '巫山县',
+                500238: '巫溪县',
+                500240: '石柱土家族自治县',
+                500241: '秀山土家族苗族自治县',
+                500242: '酉阳土家族苗族自治县',
+                500243: '彭水苗族土家族自治县',
+                510104: '锦江区',
+                510105: '青羊区',
+                510106: '金牛区',
+                510107: '武侯区',
+                510108: '成华区',
+                510112: '龙泉驿区',
+                510113: '青白江区',
+                510114: '新都区',
+                510115: '温江区',
+                510116: '双流区',
+                510117: '郫都区',
+                510121: '金堂县',
+                510129: '大邑县',
+                510131: '蒲江县',
+                510132: '新津县',
+                510181: '都江堰市',
+                510182: '彭州市',
+                510183: '邛崃市',
+                510184: '崇州市',
+                510185: '简阳市',
+                510191: '高新区',
+                510302: '自流井区',
+                510303: '贡井区',
+                510304: '大安区',
+                510311: '沿滩区',
+                510321: '荣县',
+                510322: '富顺县',
+                510402: '东区',
+                510403: '西区',
+                510411: '仁和区',
+                510421: '米易县',
+                510422: '盐边县',
+                510502: '江阳区',
+                510503: '纳溪区',
+                510504: '龙马潭区',
+                510521: '泸县',
+                510522: '合江县',
+                510524: '叙永县',
+                510525: '古蔺县',
+                510603: '旌阳区',
+                510604: '罗江区',
+                510623: '中江县',
+                510681: '广汉市',
+                510682: '什邡市',
+                510683: '绵竹市',
+                510703: '涪城区',
+                510704: '游仙区',
+                510705: '安州区',
+                510722: '三台县',
+                510723: '盐亭县',
+                510725: '梓潼县',
+                510726: '北川羌族自治县',
+                510727: '平武县',
+                510781: '江油市',
+                510791: '高新区',
+                510802: '利州区',
+                510811: '昭化区',
+                510812: '朝天区',
+                510821: '旺苍县',
+                510822: '青川县',
+                510823: '剑阁县',
+                510824: '苍溪县',
+                510903: '船山区',
+                510904: '安居区',
+                510921: '蓬溪县',
+                510922: '射洪县',
+                510923: '大英县',
+                511002: '市中区',
+                511011: '东兴区',
+                511024: '威远县',
+                511025: '资中县',
+                511083: '隆昌市',
+                511102: '市中区',
+                511111: '沙湾区',
+                511112: '五通桥区',
+                511113: '金口河区',
+                511123: '犍为县',
+                511124: '井研县',
+                511126: '夹江县',
+                511129: '沐川县',
+                511132: '峨边彝族自治县',
+                511133: '马边彝族自治县',
+                511181: '峨眉山市',
+                511302: '顺庆区',
+                511303: '高坪区',
+                511304: '嘉陵区',
+                511321: '南部县',
+                511322: '营山县',
+                511323: '蓬安县',
+                511324: '仪陇县',
+                511325: '西充县',
+                511381: '阆中市',
+                511402: '东坡区',
+                511403: '彭山区',
+                511421: '仁寿县',
+                511423: '洪雅县',
+                511424: '丹棱县',
+                511425: '青神县',
+                511502: '翠屏区',
+                511503: '南溪区',
+                511504: '叙州区',
+                511523: '江安县',
+                511524: '长宁县',
+                511525: '高县',
+                511526: '珙县',
+                511527: '筠连县',
+                511528: '兴文县',
+                511529: '屏山县',
+                511602: '广安区',
+                511603: '前锋区',
+                511621: '岳池县',
+                511622: '武胜县',
+                511623: '邻水县',
+                511681: '华蓥市',
+                511702: '通川区',
+                511703: '达川区',
+                511722: '宣汉县',
+                511723: '开江县',
+                511724: '大竹县',
+                511725: '渠县',
+                511781: '万源市',
+                511802: '雨城区',
+                511803: '名山区',
+                511822: '荥经县',
+                511823: '汉源县',
+                511824: '石棉县',
+                511825: '天全县',
+                511826: '芦山县',
+                511827: '宝兴县',
+                511902: '巴州区',
+                511903: '恩阳区',
+                511921: '通江县',
+                511922: '南江县',
+                511923: '平昌县',
+                512002: '雁江区',
+                512021: '安岳县',
+                512022: '乐至县',
+                513201: '马尔康市',
+                513221: '汶川县',
+                513222: '理县',
+                513223: '茂县',
+                513224: '松潘县',
+                513225: '九寨沟县',
+                513226: '金川县',
+                513227: '小金县',
+                513228: '黑水县',
+                513230: '壤塘县',
+                513231: '阿坝县',
+                513232: '若尔盖县',
+                513233: '红原县',
+                513301: '康定市',
+                513322: '泸定县',
+                513323: '丹巴县',
+                513324: '九龙县',
+                513325: '雅江县',
+                513326: '道孚县',
+                513327: '炉霍县',
+                513328: '甘孜县',
+                513329: '新龙县',
+                513330: '德格县',
+                513331: '白玉县',
+                513332: '石渠县',
+                513333: '色达县',
+                513334: '理塘县',
+                513335: '巴塘县',
+                513336: '乡城县',
+                513337: '稻城县',
+                513338: '得荣县',
+                513401: '西昌市',
+                513422: '木里藏族自治县',
+                513423: '盐源县',
+                513424: '德昌县',
+                513425: '会理县',
+                513426: '会东县',
+                513427: '宁南县',
+                513428: '普格县',
+                513429: '布拖县',
+                513430: '金阳县',
+                513431: '昭觉县',
+                513432: '喜德县',
+                513433: '冕宁县',
+                513434: '越西县',
+                513435: '甘洛县',
+                513436: '美姑县',
+                513437: '雷波县',
+                520102: '南明区',
+                520103: '云岩区',
+                520111: '花溪区',
+                520112: '乌当区',
+                520113: '白云区',
+                520115: '观山湖区',
+                520121: '开阳县',
+                520122: '息烽县',
+                520123: '修文县',
+                520181: '清镇市',
+                520201: '钟山区',
+                520203: '六枝特区',
+                520221: '水城县',
+                520281: '盘州市',
+                520302: '红花岗区',
+                520303: '汇川区',
+                520304: '播州区',
+                520322: '桐梓县',
+                520323: '绥阳县',
+                520324: '正安县',
+                520325: '道真仡佬族苗族自治县',
+                520326: '务川仡佬族苗族自治县',
+                520327: '凤冈县',
+                520328: '湄潭县',
+                520329: '余庆县',
+                520330: '习水县',
+                520381: '赤水市',
+                520382: '仁怀市',
+                520402: '西秀区',
+                520403: '平坝区',
+                520422: '普定县',
+                520423: '镇宁布依族苗族自治县',
+                520424: '关岭布依族苗族自治县',
+                520425: '紫云苗族布依族自治县',
+                520502: '七星关区',
+                520521: '大方县',
+                520522: '黔西县',
+                520523: '金沙县',
+                520524: '织金县',
+                520525: '纳雍县',
+                520526: '威宁彝族回族苗族自治县',
+                520527: '赫章县',
+                520602: '碧江区',
+                520603: '万山区',
+                520621: '江口县',
+                520622: '玉屏侗族自治县',
+                520623: '石阡县',
+                520624: '思南县',
+                520625: '印江土家族苗族自治县',
+                520626: '德江县',
+                520627: '沿河土家族自治县',
+                520628: '松桃苗族自治县',
+                522301: '兴义市',
+                522302: '兴仁市',
+                522323: '普安县',
+                522324: '晴隆县',
+                522325: '贞丰县',
+                522326: '望谟县',
+                522327: '册亨县',
+                522328: '安龙县',
+                522601: '凯里市',
+                522622: '黄平县',
+                522623: '施秉县',
+                522624: '三穗县',
+                522625: '镇远县',
+                522626: '岑巩县',
+                522627: '天柱县',
+                522628: '锦屏县',
+                522629: '剑河县',
+                522630: '台江县',
+                522631: '黎平县',
+                522632: '榕江县',
+                522633: '从江县',
+                522634: '雷山县',
+                522635: '麻江县',
+                522636: '丹寨县',
+                522701: '都匀市',
+                522702: '福泉市',
+                522722: '荔波县',
+                522723: '贵定县',
+                522725: '瓮安县',
+                522726: '独山县',
+                522727: '平塘县',
+                522728: '罗甸县',
+                522729: '长顺县',
+                522730: '龙里县',
+                522731: '惠水县',
+                522732: '三都水族自治县',
+                530102: '五华区',
+                530103: '盘龙区',
+                530111: '官渡区',
+                530112: '西山区',
+                530113: '东川区',
+                530114: '呈贡区',
+                530115: '晋宁区',
+                530124: '富民县',
+                530125: '宜良县',
+                530126: '石林彝族自治县',
+                530127: '嵩明县',
+                530128: '禄劝彝族苗族自治县',
+                530129: '寻甸回族彝族自治县',
+                530181: '安宁市',
+                530302: '麒麟区',
+                530303: '沾益区',
+                530304: '马龙区',
+                530322: '陆良县',
+                530323: '师宗县',
+                530324: '罗平县',
+                530325: '富源县',
+                530326: '会泽县',
+                530381: '宣威市',
+                530402: '红塔区',
+                530403: '江川区',
+                530422: '澄江县',
+                530423: '通海县',
+                530424: '华宁县',
+                530425: '易门县',
+                530426: '峨山彝族自治县',
+                530427: '新平彝族傣族自治县',
+                530428: '元江哈尼族彝族傣族自治县',
+                530502: '隆阳区',
+                530521: '施甸县',
+                530523: '龙陵县',
+                530524: '昌宁县',
+                530581: '腾冲市',
+                530602: '昭阳区',
+                530621: '鲁甸县',
+                530622: '巧家县',
+                530623: '盐津县',
+                530624: '大关县',
+                530625: '永善县',
+                530626: '绥江县',
+                530627: '镇雄县',
+                530628: '彝良县',
+                530629: '威信县',
+                530681: '水富市',
+                530702: '古城区',
+                530721: '玉龙纳西族自治县',
+                530722: '永胜县',
+                530723: '华坪县',
+                530724: '宁蒗彝族自治县',
+                530802: '思茅区',
+                530821: '宁洱哈尼族彝族自治县',
+                530822: '墨江哈尼族自治县',
+                530823: '景东彝族自治县',
+                530824: '景谷傣族彝族自治县',
+                530825: '镇沅彝族哈尼族拉祜族自治县',
+                530826: '江城哈尼族彝族自治县',
+                530827: '孟连傣族拉祜族佤族自治县',
+                530828: '澜沧拉祜族自治县',
+                530829: '西盟佤族自治县',
+                530902: '临翔区',
+                530921: '凤庆县',
+                530922: '云县',
+                530923: '永德县',
+                530924: '镇康县',
+                530925: '双江拉祜族佤族布朗族傣族自治县',
+                530926: '耿马傣族佤族自治县',
+                530927: '沧源佤族自治县',
+                532301: '楚雄市',
+                532322: '双柏县',
+                532323: '牟定县',
+                532324: '南华县',
+                532325: '姚安县',
+                532326: '大姚县',
+                532327: '永仁县',
+                532328: '元谋县',
+                532329: '武定县',
+                532331: '禄丰县',
+                532501: '个旧市',
+                532502: '开远市',
+                532503: '蒙自市',
+                532504: '弥勒市',
+                532523: '屏边苗族自治县',
+                532524: '建水县',
+                532525: '石屏县',
+                532527: '泸西县',
+                532528: '元阳县',
+                532529: '红河县',
+                532530: '金平苗族瑶族傣族自治县',
+                532531: '绿春县',
+                532532: '河口瑶族自治县',
+                532601: '文山市',
+                532622: '砚山县',
+                532623: '西畴县',
+                532624: '麻栗坡县',
+                532625: '马关县',
+                532626: '丘北县',
+                532627: '广南县',
+                532628: '富宁县',
+                532801: '景洪市',
+                532822: '勐海县',
+                532823: '勐腊县',
+                532901: '大理市',
+                532922: '漾濞彝族自治县',
+                532923: '祥云县',
+                532924: '宾川县',
+                532925: '弥渡县',
+                532926: '南涧彝族自治县',
+                532927: '巍山彝族回族自治县',
+                532928: '永平县',
+                532929: '云龙县',
+                532930: '洱源县',
+                532931: '剑川县',
+                532932: '鹤庆县',
+                533102: '瑞丽市',
+                533103: '芒市',
+                533122: '梁河县',
+                533123: '盈江县',
+                533124: '陇川县',
+                533301: '泸水市',
+                533323: '福贡县',
+                533324: '贡山独龙族怒族自治县',
+                533325: '兰坪白族普米族自治县',
+                533401: '香格里拉市',
+                533422: '德钦县',
+                533423: '维西傈僳族自治县',
+                540102: '城关区',
+                540103: '堆龙德庆区',
+                540104: '达孜区',
+                540121: '林周县',
+                540122: '当雄县',
+                540123: '尼木县',
+                540124: '曲水县',
+                540127: '墨竹工卡县',
+                540202: '桑珠孜区',
+                540221: '南木林县',
+                540222: '江孜县',
+                540223: '定日县',
+                540224: '萨迦县',
+                540225: '拉孜县',
+                540226: '昂仁县',
+                540227: '谢通门县',
+                540228: '白朗县',
+                540229: '仁布县',
+                540230: '康马县',
+                540231: '定结县',
+                540232: '仲巴县',
+                540233: '亚东县',
+                540234: '吉隆县',
+                540235: '聂拉木县',
+                540236: '萨嘎县',
+                540237: '岗巴县',
+                540302: '卡若区',
+                540321: '江达县',
+                540322: '贡觉县',
+                540323: '类乌齐县',
+                540324: '丁青县',
+                540325: '察雅县',
+                540326: '八宿县',
+                540327: '左贡县',
+                540328: '芒康县',
+                540329: '洛隆县',
+                540330: '边坝县',
+                540402: '巴宜区',
+                540421: '工布江达县',
+                540422: '米林县',
+                540423: '墨脱县',
+                540424: '波密县',
+                540425: '察隅县',
+                540426: '朗县',
+                540502: '乃东区',
+                540521: '扎囊县',
+                540522: '贡嘎县',
+                540523: '桑日县',
+                540524: '琼结县',
+                540525: '曲松县',
+                540526: '措美县',
+                540527: '洛扎县',
+                540528: '加查县',
+                540529: '隆子县',
+                540530: '错那县',
+                540531: '浪卡子县',
+                540602: '色尼区',
+                540621: '嘉黎县',
+                540622: '比如县',
+                540623: '聂荣县',
+                540624: '安多县',
+                540625: '申扎县',
+                540626: '索县',
+                540627: '班戈县',
+                540628: '巴青县',
+                540629: '尼玛县',
+                540630: '双湖县',
+                542521: '普兰县',
+                542522: '札达县',
+                542523: '噶尔县',
+                542524: '日土县',
+                542525: '革吉县',
+                542526: '改则县',
+                542527: '措勤县',
+                610102: '新城区',
+                610103: '碑林区',
+                610104: '莲湖区',
+                610111: '灞桥区',
+                610112: '未央区',
+                610113: '雁塔区',
+                610114: '阎良区',
+                610115: '临潼区',
+                610116: '长安区',
+                610117: '高陵区',
+                610118: '鄠邑区',
+                610122: '蓝田县',
+                610124: '周至县',
+                610202: '王益区',
+                610203: '印台区',
+                610204: '耀州区',
+                610222: '宜君县',
+                610302: '渭滨区',
+                610303: '金台区',
+                610304: '陈仓区',
+                610322: '凤翔县',
+                610323: '岐山县',
+                610324: '扶风县',
+                610326: '眉县',
+                610327: '陇县',
+                610328: '千阳县',
+                610329: '麟游县',
+                610330: '凤县',
+                610331: '太白县',
+                610402: '秦都区',
+                610403: '杨陵区',
+                610404: '渭城区',
+                610422: '三原县',
+                610423: '泾阳县',
+                610424: '乾县',
+                610425: '礼泉县',
+                610426: '永寿县',
+                610428: '长武县',
+                610429: '旬邑县',
+                610430: '淳化县',
+                610431: '武功县',
+                610481: '兴平市',
+                610482: '彬州市',
+                610502: '临渭区',
+                610503: '华州区',
+                610522: '潼关县',
+                610523: '大荔县',
+                610524: '合阳县',
+                610525: '澄城县',
+                610526: '蒲城县',
+                610527: '白水县',
+                610528: '富平县',
+                610581: '韩城市',
+                610582: '华阴市',
+                610602: '宝塔区',
+                610603: '安塞区',
+                610621: '延长县',
+                610622: '延川县',
+                610623: '子长县',
+                610625: '志丹县',
+                610626: '吴起县',
+                610627: '甘泉县',
+                610628: '富县',
+                610629: '洛川县',
+                610630: '宜川县',
+                610631: '黄龙县',
+                610632: '黄陵县',
+                610702: '汉台区',
+                610703: '南郑区',
+                610722: '城固县',
+                610723: '洋县',
+                610724: '西乡县',
+                610725: '勉县',
+                610726: '宁强县',
+                610727: '略阳县',
+                610728: '镇巴县',
+                610729: '留坝县',
+                610730: '佛坪县',
+                610802: '榆阳区',
+                610803: '横山区',
+                610822: '府谷县',
+                610824: '靖边县',
+                610825: '定边县',
+                610826: '绥德县',
+                610827: '米脂县',
+                610828: '佳县',
+                610829: '吴堡县',
+                610830: '清涧县',
+                610831: '子洲县',
+                610881: '神木市',
+                610902: '汉滨区',
+                610921: '汉阴县',
+                610922: '石泉县',
+                610923: '宁陕县',
+                610924: '紫阳县',
+                610925: '岚皋县',
+                610926: '平利县',
+                610927: '镇坪县',
+                610928: '旬阳县',
+                610929: '白河县',
+                611002: '商州区',
+                611021: '洛南县',
+                611022: '丹凤县',
+                611023: '商南县',
+                611024: '山阳县',
+                611025: '镇安县',
+                611026: '柞水县',
+                620102: '城关区',
+                620103: '七里河区',
+                620104: '西固区',
+                620105: '安宁区',
+                620111: '红古区',
+                620121: '永登县',
+                620122: '皋兰县',
+                620123: '榆中县',
+                620201: '市辖区',
+                620290: '雄关区',
+                620291: '长城区',
+                620292: '镜铁区',
+                620293: '新城镇',
+                620294: '峪泉镇',
+                620295: '文殊镇',
+                620302: '金川区',
+                620321: '永昌县',
+                620402: '白银区',
+                620403: '平川区',
+                620421: '靖远县',
+                620422: '会宁县',
+                620423: '景泰县',
+                620502: '秦州区',
+                620503: '麦积区',
+                620521: '清水县',
+                620522: '秦安县',
+                620523: '甘谷县',
+                620524: '武山县',
+                620525: '张家川回族自治县',
+                620602: '凉州区',
+                620621: '民勤县',
+                620622: '古浪县',
+                620623: '天祝藏族自治县',
+                620702: '甘州区',
+                620721: '肃南裕固族自治县',
+                620722: '民乐县',
+                620723: '临泽县',
+                620724: '高台县',
+                620725: '山丹县',
+                620802: '崆峒区',
+                620821: '泾川县',
+                620822: '灵台县',
+                620823: '崇信县',
+                620825: '庄浪县',
+                620826: '静宁县',
+                620881: '华亭市',
+                620902: '肃州区',
+                620921: '金塔县',
+                620922: '瓜州县',
+                620923: '肃北蒙古族自治县',
+                620924: '阿克塞哈萨克族自治县',
+                620981: '玉门市',
+                620982: '敦煌市',
+                621002: '西峰区',
+                621021: '庆城县',
+                621022: '环县',
+                621023: '华池县',
+                621024: '合水县',
+                621025: '正宁县',
+                621026: '宁县',
+                621027: '镇原县',
+                621102: '安定区',
+                621121: '通渭县',
+                621122: '陇西县',
+                621123: '渭源县',
+                621124: '临洮县',
+                621125: '漳县',
+                621126: '岷县',
+                621202: '武都区',
+                621221: '成县',
+                621222: '文县',
+                621223: '宕昌县',
+                621224: '康县',
+                621225: '西和县',
+                621226: '礼县',
+                621227: '徽县',
+                621228: '两当县',
+                622901: '临夏市',
+                622921: '临夏县',
+                622922: '康乐县',
+                622923: '永靖县',
+                622924: '广河县',
+                622925: '和政县',
+                622926: '东乡族自治县',
+                622927: '积石山保安族东乡族撒拉族自治县',
+                623001: '合作市',
+                623021: '临潭县',
+                623022: '卓尼县',
+                623023: '舟曲县',
+                623024: '迭部县',
+                623025: '玛曲县',
+                623026: '碌曲县',
+                623027: '夏河县',
+                630102: '城东区',
+                630103: '城中区',
+                630104: '城西区',
+                630105: '城北区',
+                630121: '大通回族土族自治县',
+                630122: '湟中县',
+                630123: '湟源县',
+                630202: '乐都区',
+                630203: '平安区',
+                630222: '民和回族土族自治县',
+                630223: '互助土族自治县',
+                630224: '化隆回族自治县',
+                630225: '循化撒拉族自治县',
+                632221: '门源回族自治县',
+                632222: '祁连县',
+                632223: '海晏县',
+                632224: '刚察县',
+                632321: '同仁县',
+                632322: '尖扎县',
+                632323: '泽库县',
+                632324: '河南蒙古族自治县',
+                632521: '共和县',
+                632522: '同德县',
+                632523: '贵德县',
+                632524: '兴海县',
+                632525: '贵南县',
+                632621: '玛沁县',
+                632622: '班玛县',
+                632623: '甘德县',
+                632624: '达日县',
+                632625: '久治县',
+                632626: '玛多县',
+                632701: '玉树市',
+                632722: '杂多县',
+                632723: '称多县',
+                632724: '治多县',
+                632725: '囊谦县',
+                632726: '曲麻莱县',
+                632801: '格尔木市',
+                632802: '德令哈市',
+                632803: '茫崖市',
+                632821: '乌兰县',
+                632822: '都兰县',
+                632823: '天峻县',
+                640104: '兴庆区',
+                640105: '西夏区',
+                640106: '金凤区',
+                640121: '永宁县',
+                640122: '贺兰县',
+                640181: '灵武市',
+                640202: '大武口区',
+                640205: '惠农区',
+                640221: '平罗县',
+                640302: '利通区',
+                640303: '红寺堡区',
+                640323: '盐池县',
+                640324: '同心县',
+                640381: '青铜峡市',
+                640402: '原州区',
+                640422: '西吉县',
+                640423: '隆德县',
+                640424: '泾源县',
+                640425: '彭阳县',
+                640502: '沙坡头区',
+                640521: '中宁县',
+                640522: '海原县',
+                650102: '天山区',
+                650103: '沙依巴克区',
+                650104: '新市区',
+                650105: '水磨沟区',
+                650106: '头屯河区',
+                650107: '达坂城区',
+                650109: '米东区',
+                650121: '乌鲁木齐县',
+                650202: '独山子区',
+                650203: '克拉玛依区',
+                650204: '白碱滩区',
+                650205: '乌尔禾区',
+                650402: '高昌区',
+                650421: '鄯善县',
+                650422: '托克逊县',
+                650502: '伊州区',
+                650521: '巴里坤哈萨克自治县',
+                650522: '伊吾县',
+                652301: '昌吉市',
+                652302: '阜康市',
+                652323: '呼图壁县',
+                652324: '玛纳斯县',
+                652325: '奇台县',
+                652327: '吉木萨尔县',
+                652328: '木垒哈萨克自治县',
+                652701: '博乐市',
+                652702: '阿拉山口市',
+                652722: '精河县',
+                652723: '温泉县',
+                652801: '库尔勒市',
+                652822: '轮台县',
+                652823: '尉犁县',
+                652824: '若羌县',
+                652825: '且末县',
+                652826: '焉耆回族自治县',
+                652827: '和静县',
+                652828: '和硕县',
+                652829: '博湖县',
+                652901: '阿克苏市',
+                652922: '温宿县',
+                652923: '库车县',
+                652924: '沙雅县',
+                652925: '新和县',
+                652926: '拜城县',
+                652927: '乌什县',
+                652928: '阿瓦提县',
+                652929: '柯坪县',
+                653001: '阿图什市',
+                653022: '阿克陶县',
+                653023: '阿合奇县',
+                653024: '乌恰县',
+                653101: '喀什市',
+                653121: '疏附县',
+                653122: '疏勒县',
+                653123: '英吉沙县',
+                653124: '泽普县',
+                653125: '莎车县',
+                653126: '叶城县',
+                653127: '麦盖提县',
+                653128: '岳普湖县',
+                653129: '伽师县',
+                653130: '巴楚县',
+                653131: '塔什库尔干塔吉克自治县',
+                653201: '和田市',
+                653221: '和田县',
+                653222: '墨玉县',
+                653223: '皮山县',
+                653224: '洛浦县',
+                653225: '策勒县',
+                653226: '于田县',
+                653227: '民丰县',
+                654002: '伊宁市',
+                654003: '奎屯市',
+                654004: '霍尔果斯市',
+                654021: '伊宁县',
+                654022: '察布查尔锡伯自治县',
+                654023: '霍城县',
+                654024: '巩留县',
+                654025: '新源县',
+                654026: '昭苏县',
+                654027: '特克斯县',
+                654028: '尼勒克县',
+                654201: '塔城市',
+                654202: '乌苏市',
+                654221: '额敏县',
+                654223: '沙湾县',
+                654224: '托里县',
+                654225: '裕民县',
+                654226: '和布克赛尔蒙古自治县',
+                654301: '阿勒泰市',
+                654321: '布尔津县',
+                654322: '富蕴县',
+                654323: '福海县',
+                654324: '哈巴河县',
+                654325: '青河县',
+                654326: '吉木乃县',
+                659001: '石河子市',
+                659002: '阿拉尔市',
+                659003: '图木舒克市',
+                659004: '五家渠市',
+                659005: '北屯市',
+                659006: '铁门关市',
+                659007: '双河市',
+                659008: '可克达拉市',
+                659009: '昆玉市',
+                710101: '中正区',
+                710102: '大同区',
+                710103: '中山区',
+                710104: '松山区',
+                710105: '大安区',
+                710106: '万华区',
+                710107: '信义区',
+                710108: '士林区',
+                710109: '北投区',
+                710110: '内湖区',
+                710111: '南港区',
+                710112: '文山区',
+                710199: '其它区',
+                710201: '新兴区',
+                710202: '前金区',
+                710203: '芩雅区',
+                710204: '盐埕区',
+                710205: '鼓山区',
+                710206: '旗津区',
+                710207: '前镇区',
+                710208: '三民区',
+                710209: '左营区',
+                710210: '楠梓区',
+                710211: '小港区',
+                710241: '苓雅区',
+                710242: '仁武区',
+                710243: '大社区',
+                710244: '冈山区',
+                710245: '路竹区',
+                710246: '阿莲区',
+                710247: '田寮区',
+                710248: '燕巢区',
+                710249: '桥头区',
+                710250: '梓官区',
+                710251: '弥陀区',
+                710252: '永安区',
+                710253: '湖内区',
+                710254: '凤山区',
+                710255: '大寮区',
+                710256: '林园区',
+                710257: '鸟松区',
+                710258: '大树区',
+                710259: '旗山区',
+                710260: '美浓区',
+                710261: '六龟区',
+                710262: '内门区',
+                710263: '杉林区',
+                710264: '甲仙区',
+                710265: '桃源区',
+                710266: '那玛夏区',
+                710267: '茂林区',
+                710268: '茄萣区',
+                710299: '其它区',
+                710301: '中西区',
+                710302: '东区',
+                710303: '南区',
+                710304: '北区',
+                710305: '安平区',
+                710306: '安南区',
+                710339: '永康区',
+                710340: '归仁区',
+                710341: '新化区',
+                710342: '左镇区',
+                710343: '玉井区',
+                710344: '楠西区',
+                710345: '南化区',
+                710346: '仁德区',
+                710347: '关庙区',
+                710348: '龙崎区',
+                710349: '官田区',
+                710350: '麻豆区',
+                710351: '佳里区',
+                710352: '西港区',
+                710353: '七股区',
+                710354: '将军区',
+                710355: '学甲区',
+                710356: '北门区',
+                710357: '新营区',
+                710358: '后壁区',
+                710359: '白河区',
+                710360: '东山区',
+                710361: '六甲区',
+                710362: '下营区',
+                710363: '柳营区',
+                710364: '盐水区',
+                710365: '善化区',
+                710366: '大内区',
+                710367: '山上区',
+                710368: '新市区',
+                710369: '安定区',
+                710399: '其它区',
+                710401: '中区',
+                710402: '东区',
+                710403: '南区',
+                710404: '西区',
+                710405: '北区',
+                710406: '北屯区',
+                710407: '西屯区',
+                710408: '南屯区',
+                710431: '太平区',
+                710432: '大里区',
+                710433: '雾峰区',
+                710434: '乌日区',
+                710435: '丰原区',
+                710436: '后里区',
+                710437: '石冈区',
+                710438: '东势区',
+                710439: '和平区',
+                710440: '新社区',
+                710441: '潭子区',
+                710442: '大雅区',
+                710443: '神冈区',
+                710444: '大肚区',
+                710445: '沙鹿区',
+                710446: '龙井区',
+                710447: '梧栖区',
+                710448: '清水区',
+                710449: '大甲区',
+                710450: '外埔区',
+                710451: '大安区',
+                710499: '其它区',
+                710507: '金沙镇',
+                710508: '金湖镇',
+                710509: '金宁乡',
+                710510: '金城镇',
+                710511: '烈屿乡',
+                710512: '乌坵乡',
+                710614: '南投市',
+                710615: '中寮乡',
+                710616: '草屯镇',
+                710617: '国姓乡',
+                710618: '埔里镇',
+                710619: '仁爱乡',
+                710620: '名间乡',
+                710621: '集集镇',
+                710622: '水里乡',
+                710623: '鱼池乡',
+                710624: '信义乡',
+                710625: '竹山镇',
+                710626: '鹿谷乡',
+                710701: '仁爱区',
+                710702: '信义区',
+                710703: '中正区',
+                710704: '中山区',
+                710705: '安乐区',
+                710706: '暖暖区',
+                710707: '七堵区',
+                710799: '其它区',
+                710801: '东区',
+                710802: '北区',
+                710803: '香山区',
+                710899: '其它区',
+                710901: '东区',
+                710902: '西区',
+                710999: '其它区',
+                711130: '万里区',
+                711132: '板桥区',
+                711133: '汐止区',
+                711134: '深坑区',
+                711135: '石碇区',
+                711136: '瑞芳区',
+                711137: '平溪区',
+                711138: '双溪区',
+                711139: '贡寮区',
+                711140: '新店区',
+                711141: '坪林区',
+                711142: '乌来区',
+                711143: '永和区',
+                711144: '中和区',
+                711145: '土城区',
+                711146: '三峡区',
+                711147: '树林区',
+                711148: '莺歌区',
+                711149: '三重区',
+                711150: '新庄区',
+                711151: '泰山区',
+                711152: '林口区',
+                711153: '芦洲区',
+                711154: '五股区',
+                711155: '八里区',
+                711156: '淡水区',
+                711157: '三芝区',
+                711158: '石门区',
+                711287: '宜兰市',
+                711288: '头城镇',
+                711289: '礁溪乡',
+                711290: '壮围乡',
+                711291: '员山乡',
+                711292: '罗东镇',
+                711293: '三星乡',
+                711294: '大同乡',
+                711295: '五结乡',
+                711296: '冬山乡',
+                711297: '苏澳镇',
+                711298: '南澳乡',
+                711299: '钓鱼台',
+                711387: '竹北市',
+                711388: '湖口乡',
+                711389: '新丰乡',
+                711390: '新埔镇',
+                711391: '关西镇',
+                711392: '芎林乡',
+                711393: '宝山乡',
+                711394: '竹东镇',
+                711395: '五峰乡',
+                711396: '横山乡',
+                711397: '尖石乡',
+                711398: '北埔乡',
+                711399: '峨眉乡',
+                711414: '中坜区',
+                711415: '平镇区',
+                711417: '杨梅区',
+                711418: '新屋区',
+                711419: '观音区',
+                711420: '桃园区',
+                711421: '龟山区',
+                711422: '八德区',
+                711423: '大溪区',
+                711425: '大园区',
+                711426: '芦竹区',
+                711487: '中坜市',
+                711488: '平镇市',
+                711489: '龙潭乡',
+                711490: '杨梅市',
+                711491: '新屋乡',
+                711492: '观音乡',
+                711493: '桃园市',
+                711494: '龟山乡',
+                711495: '八德市',
+                711496: '大溪镇',
+                711497: '复兴乡',
+                711498: '大园乡',
+                711499: '芦竹乡',
+                711520: '头份市',
+                711582: '竹南镇',
+                711583: '头份镇',
+                711584: '三湾乡',
+                711585: '南庄乡',
+                711586: '狮潭乡',
+                711587: '后龙镇',
+                711588: '通霄镇',
+                711589: '苑里镇',
+                711590: '苗栗市',
+                711591: '造桥乡',
+                711592: '头屋乡',
+                711593: '公馆乡',
+                711594: '大湖乡',
+                711595: '泰安乡',
+                711596: '铜锣乡',
+                711597: '三义乡',
+                711598: '西湖乡',
+                711599: '卓兰镇',
+                711736: '员林市',
+                711774: '彰化市',
+                711775: '芬园乡',
+                711776: '花坛乡',
+                711777: '秀水乡',
+                711778: '鹿港镇',
+                711779: '福兴乡',
+                711780: '线西乡',
+                711781: '和美镇',
+                711782: '伸港乡',
+                711783: '员林镇',
+                711784: '社头乡',
+                711785: '永靖乡',
+                711786: '埔心乡',
+                711787: '溪湖镇',
+                711788: '大村乡',
+                711789: '埔盐乡',
+                711790: '田中镇',
+                711791: '北斗镇',
+                711792: '田尾乡',
+                711793: '埤头乡',
+                711794: '溪州乡',
+                711795: '竹塘乡',
+                711796: '二林镇',
+                711797: '大城乡',
+                711798: '芳苑乡',
+                711799: '二水乡',
+                711982: '番路乡',
+                711983: '梅山乡',
+                711984: '竹崎乡',
+                711985: '阿里山乡',
+                711986: '中埔乡',
+                711987: '大埔乡',
+                711988: '水上乡',
+                711989: '鹿草乡',
+                711990: '太保市',
+                711991: '朴子市',
+                711992: '东石乡',
+                711993: '六脚乡',
+                711994: '新港乡',
+                711995: '民雄乡',
+                711996: '大林镇',
+                711997: '溪口乡',
+                711998: '义竹乡',
+                711999: '布袋镇',
+                712180: '斗南镇',
+                712181: '大埤乡',
+                712182: '虎尾镇',
+                712183: '土库镇',
+                712184: '褒忠乡',
+                712185: '东势乡',
+                712186: '台西乡',
+                712187: '仑背乡',
+                712188: '麦寮乡',
+                712189: '斗六市',
+                712190: '林内乡',
+                712191: '古坑乡',
+                712192: '莿桐乡',
+                712193: '西螺镇',
+                712194: '二仑乡',
+                712195: '北港镇',
+                712196: '水林乡',
+                712197: '口湖乡',
+                712198: '四湖乡',
+                712199: '元长乡',
+                712451: '崁顶乡',
+                712467: '屏东市',
+                712468: '三地门乡',
+                712469: '雾台乡',
+                712470: '玛家乡',
+                712471: '九如乡',
+                712472: '里港乡',
+                712473: '高树乡',
+                712474: '盐埔乡',
+                712475: '长治乡',
+                712476: '麟洛乡',
+                712477: '竹田乡',
+                712478: '内埔乡',
+                712479: '万丹乡',
+                712480: '潮州镇',
+                712481: '泰武乡',
+                712482: '来义乡',
+                712483: '万峦乡',
+                712484: '莰顶乡',
+                712485: '新埤乡',
+                712486: '南州乡',
+                712487: '林边乡',
+                712488: '东港镇',
+                712489: '琉球乡',
+                712490: '佳冬乡',
+                712491: '新园乡',
+                712492: '枋寮乡',
+                712493: '枋山乡',
+                712494: '春日乡',
+                712495: '狮子乡',
+                712496: '车城乡',
+                712497: '牡丹乡',
+                712498: '恒春镇',
+                712499: '满州乡',
+                712584: '台东市',
+                712585: '绿岛乡',
+                712586: '兰屿乡',
+                712587: '延平乡',
+                712588: '卑南乡',
+                712589: '鹿野乡',
+                712590: '关山镇',
+                712591: '海端乡',
+                712592: '池上乡',
+                712593: '东河乡',
+                712594: '成功镇',
+                712595: '长滨乡',
+                712596: '金峰乡',
+                712597: '大武乡',
+                712598: '达仁乡',
+                712599: '太麻里乡',
+                712686: '花莲市',
+                712687: '新城乡',
+                712688: '太鲁阁',
+                712689: '秀林乡',
+                712690: '吉安乡',
+                712691: '寿丰乡',
+                712692: '凤林镇',
+                712693: '光复乡',
+                712694: '丰滨乡',
+                712695: '瑞穗乡',
+                712696: '万荣乡',
+                712697: '玉里镇',
+                712698: '卓溪乡',
+                712699: '富里乡',
+                712794: '马公市',
+                712795: '西屿乡',
+                712796: '望安乡',
+                712797: '七美乡',
+                712798: '白沙乡',
+                712799: '湖西乡',
+                712896: '南竿乡',
+                712897: '北竿乡',
+                712898: '东引乡',
+                712899: '莒光乡',
+                810101: '中西区',
+                810102: '湾仔区',
+                810103: '东区',
+                810104: '南区',
+                810201: '九龙城区',
+                810202: '油尖旺区',
+                810203: '深水埗区',
+                810204: '黄大仙区',
+                810205: '观塘区',
+                810301: '北区',
+                810302: '大埔区',
+                810303: '沙田区',
+                810304: '西贡区',
+                810305: '元朗区',
+                810306: '屯门区',
+                810307: '荃湾区',
+                810308: '葵青区',
+                810309: '离岛区',
+                820101: '澳门半岛',
+                820201: '离岛'
+        }
+}

+ 81 - 0
src/utils/bfMessage.ts

@@ -0,0 +1,81 @@
+import { ElMessage } from "element-plus";
+
+interface MessageOptions {
+  message: string;
+  type?: "success" | "error" | "warning" | "info";
+  duration?: number;
+  showClose?: boolean;
+}
+
+let isMessageShowing = false;
+/**
+ * @Description: 二次封装ElMessage组件
+ * @author:汪明
+ * @date 2024/3/15 15:55
+ * @param {MessageOptions} options
+ */
+function bfShowMessage(options: MessageOptions) {
+  if (isMessageShowing) {
+    return;
+  }
+
+  isMessageShowing = true;
+
+  const { message, type = "info", duration = 3000, showClose = true } = options;
+
+  ElMessage({
+    message: message,
+    type: type,
+    duration: duration,
+    showClose: showClose,
+    onClose: () => {
+      isMessageShowing = false;
+    },
+  });
+}
+
+/**
+ * @Description: 成功提示框
+ * @author:汪明
+ * @date 2024/3/15 15:55
+ * @param {string} message
+ * @param {number} duration 显示时间,单位为毫秒。 设为 0 则不会自动关闭 默认3000毫秒
+ */
+export function bfSuccessMessage(message: string, duration?: number) {
+  bfShowMessage({ message, type: "success", duration });
+}
+
+/**
+ * @Description: 错误提示框
+ * @author:汪明
+ * @date 2024/3/15 15:55
+ * @param {string} message
+ * @param {number} duration 显示时间,单位为毫秒。 设为 0 则不会自动关闭 默认3000毫秒
+ */
+export function bfErrorMessage(message: string, duration?: number) {
+  bfShowMessage({ message, type: "error", duration });
+}
+
+/**
+ * @Description: 警告提示框
+ * @author:汪明
+ * @date 2024/3/15 15:55
+ * @param {string} message
+ * @param {number} duration 显示时间,单位为毫秒。 设为 0 则不会自动关闭 默认3000毫秒
+ */
+export function bfWarningMessage(message: string, duration?: number) {
+  bfShowMessage({ message, type: "warning", duration });
+}
+
+/**
+ * @Description: 信息提示框
+ * @author:汪明
+ * @date 2024/3/15 15:55
+ * @param {string} message
+ * @param {number} duration 显示时间,单位为毫秒。 设为 0 则不会自动关闭 默认3000毫秒
+ */
+export function bfInfoMessage(message: string, duration?: number) {
+  bfShowMessage({ message, type: "info", duration });
+}
+
+export default bfShowMessage;

+ 91 - 0
src/utils/common.ts

@@ -0,0 +1,91 @@
+/**
+ * 防抖函数,确保在指定延迟内不会被频繁调用。
+ * @param func 要防抖的函数。
+ * @param delay 在函数允许再次调用之前的延迟时间(毫秒)。
+ * @returns 一个防抖后的函数。
+ */
+export const debounce = <T extends (...args: any[]) => void>(func: T, delay: number = 300) => {
+    let timeoutId: ReturnType<typeof setTimeout> | undefined;
+
+    return (...args: Parameters<T>) => {
+        // 如果已经存在计时器,清除它
+        if (timeoutId) {
+            clearTimeout(timeoutId);
+        }
+
+        // 设置一个新的计时器,在指定延迟后调用函数
+        timeoutId = setTimeout(() => {
+            func(...args);
+        }, delay);
+    };
+};
+
+/**
+ * 节流函数,确保被调用的频率不超过指定的延迟。
+ * @param func 要节流的函数。
+ * @param delay 在函数允许再次调用之前的延迟时间(毫秒)。
+ * @returns 一个节流后的函数。
+ */
+export const throttle = <T extends (...args: any[]) => void>(func: T, delay: number = 300) => {
+    let isThrottled = false;
+
+    return (...args: Parameters<T>) => {
+        // 如果未处于节流状态,调用函数并进入节流状态
+        if (!isThrottled) {
+            func(...args);
+
+            // 设置一个延迟后解除节流状态的定时器
+            isThrottled = true;
+            setTimeout(() => {
+                isThrottled = false;
+            }, delay);
+        }
+    };
+};
+
+/**
+ * 过滤手机号码,隐藏中间四位数字。
+ * @param {string} phoneNumber - 待过滤的手机号码。
+ * @returns {string} - 过滤后的手机号码,中间四位数字被替换为 '****'。
+ * 如果手机号码不符合规则,则返回手机号。
+ */
+export function filterPhoneNumber(phoneNumber: string | undefined): string {
+    if(!phoneNumber) return ''
+    let reg = /^1[3456789]{1}\d{9}$/	//必须是以1开头,第二位必须是3-9中的任意一个数,后面9位必须是数字
+    //校验手机号是否正确
+    if (reg.test(phoneNumber)) {
+        phoneNumber = phoneNumber.toString()	//先强制转换成字符串类型
+        return phoneNumber.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2')
+    } else {
+        return ''
+    }
+}
+
+
+export  function avatarURL(name: string | undefined) {
+    if (name && isHttp(name)) {
+        return isHttp(name);
+    }
+
+    return '';
+}
+
+
+function isHttp(url: string) {
+    if (url.substr(0, 7).toLowerCase() === 'http://' || url.substr(0, 8).toLowerCase() === 'https://'|| url.substr(0, 4).toLowerCase() === 'blob')
+     {
+        return url;
+    } else {
+        return `${import.meta.env.VITE_APP_BASE_CDN}/${url}`;
+    }
+}
+
+
+/**
+ * @Description: CDN地址
+ * @author:汪明
+ * @date 2024/5/10 8:31
+*/
+export const cdnUrl = (path: string) => {
+    return `${import.meta.env.VITE_APP_BASE_CDN}/${path}`;
+}

+ 12 - 0
src/utils/formatDate.ts

@@ -0,0 +1,12 @@
+// 格式化日期
+const formatDate = (date: Date) => {
+  return new Date(date).toLocaleString("zh-CN", {
+    year: "numeric",
+    month: "2-digit",
+    day: "2-digit",
+    hour: "2-digit",
+    minute: "2-digit",
+  });
+};
+
+export default formatDate;

+ 130 - 0
src/utils/http.ts

@@ -0,0 +1,130 @@
+import axios, { AxiosInstance, InternalAxiosRequestConfig } from "axios";
+import { userStore } from "@/stores/user";
+import BfApiMessage from "@/enums/bfApiMessage";
+import { getErrorMessage } from "@/utils/httpStatus";
+import { bfErrorMessage } from "@/utils/bfMessage";
+
+// 定义用户类型
+interface User {
+  token: string | null;
+}
+
+// 获取消息函数,用于根据消息码获取具体的消息文本
+const getBfMessage = (message: string) => {
+  return BfApiMessage[message] || message;
+};
+
+// 用户退出登录
+export const logoutUser = () => {
+  userStore().logout();
+};
+
+// 处理特定错误情况,例如用户会话过期
+const handleSpecialCases = (message: string) => {
+  if (message === BfApiMessage.USER_EXPIRED) {
+    logoutUser();
+  }
+};
+
+// 扩展 Axios 请求配置,添加自定义属性 requireToken
+interface CustomAxiosRequestConfig extends InternalAxiosRequestConfig {
+  requireToken?: boolean; // 请求头是否需要Token
+  Tenant?: string; // 店铺id
+}
+
+// 创建 Axios 实例
+const createInstance = (baseURL: string): AxiosInstance => {
+  // 创建 Axios 实例并设置基础 URL 和超时时间
+  const instance: AxiosInstance = axios.create({
+    baseURL,
+    timeout: 100000,
+  });
+
+  // 请求拦截器
+  instance.interceptors.request.use(
+    async (config: CustomAxiosRequestConfig) => {
+      const user: User = userStore();
+      // 如果用户有 token 并且 requireToken 不为 false,则添加 Authorization 头
+      if (user.token && config.requireToken !== false) {
+        config.headers.set("Authorization", `Bearer ${user.token}`);
+      }
+      if (config.Tenant) {
+        // TODO 添加店铺ID
+        config.headers.set("Tenant", config.Tenant);
+      }
+      return config;
+    },
+    (error) => {
+      // 处理请求错误
+      return Promise.reject(error);
+    }
+  );
+
+  // 响应拦截器
+  instance.interceptors.response.use(
+    async (response) => {
+      const { code, message } = response.data;
+      // 检查响应是否成功
+      if (code === 0) {
+        return response.data;
+      }
+      // 错误消息提示
+      bfErrorMessage(getBfMessage(message));
+      // 处理特定错误情况
+      handleSpecialCases(message);
+      return Promise.reject(response.data);
+    },
+    async (error) => {
+      // 处理 HTTP 错误
+      if (error && error.response) {
+        error.message = getErrorMessage(error.response.status);
+      } else {
+        error.message = "连接服务器失败!";
+      }
+      // 退出登录
+      logoutUser();
+      // 如果错误是由于超时导致的,可以进行重试
+      if (error.code === "ECONNABORTED" || error.response?.status === 504) {
+        return retryRequest(error.config, error.message);
+      }
+      bfErrorMessage(error.message);
+      return Promise.reject(error);
+    }
+  );
+
+  return instance;
+};
+
+// 实现重试逻辑,最多重试两次
+const retryRequest = async (config: any, errMessage: string) => {
+  const maxRetries = 2;
+  let retries = 0;
+  while (retries < maxRetries) {
+    try {
+      // 等待 1 秒后再重试
+      await new Promise((resolve) => setTimeout(resolve, 1000));
+      const response = await axios.request(config);
+      return response.data;
+    } catch (error) {
+      retries++;
+      if (retries >= maxRetries) {
+        bfErrorMessage(errMessage);
+        throw error;
+      }
+    }
+  }
+};
+
+// 导出封装的 Axios 实例
+export const instanceReal: AxiosInstance = createInstance(
+  import.meta.env.VITE_API_BASE_URL
+);
+// 导出封装的 Axios 实例
+export const instanceDiy: AxiosInstance = createInstance(
+    import.meta.env.VITE_API_DIY_BASE_URL
+);
+
+// 导出封装的 Axios 实例
+export const instanceThreeReal: AxiosInstance = createInstance(
+    import.meta.env.VITE_API_DIY_REAL_URL
+);

+ 32 - 0
src/utils/httpStatus.ts

@@ -0,0 +1,32 @@
+// httpStatus.ts
+
+
+/**
+ * @Description: 根据 HTTP 状态码返回对应的消息
+ * @author:汪明
+ * @date 2024/3/15 15:35
+ */
+const HttpStatusMessages: Record<number, string> = {
+    400: '请求错误(400)',
+    401: '未授权,请重新登录(401)',
+    403: '拒绝访问(403)',
+    404: '请求出错(404)',
+    408: '请求超时(408)',
+    500: '服务器错误(500)',
+    501: '服务未实现(501)',
+    502: '网络错误(502)',
+    503: '服务不可用(503)',
+    504: '网络超时(504)',
+    505: 'HTTP版本不受支持(505)'
+};
+
+/**
+ * @Description: 根据 HTTP 状态码返回对应的消息
+ * @author:汪明
+ * @date 2024/3/15 15:35
+ * @param {number} statusCode HTTP 状态码
+ * @returns {string} 对应的错误消息
+ */
+export function getErrorMessage(statusCode: number): string {
+    return HttpStatusMessages[statusCode] || `连接出错(${statusCode})!`;
+}

+ 67 - 0
src/utils/request.ts

@@ -0,0 +1,67 @@
+import {instanceDiy, instanceReal, instanceThreeReal} from "@/utils/http"; // 导入 Axios 实例
+import { AxiosRequestConfig, AxiosInstance } from "axios";
+
+// 定义 API 响应数据结构
+export interface ApiResponse<T> {
+  code: number; // 响应状态码
+  message: string; // 响应消息
+  data: T; // 响应数据
+}
+
+// 扩展 Axios 请求配置,添加自定义属性 requireToken
+export interface CustomRequestConfig extends AxiosRequestConfig {
+  requireToken?: boolean; // 是否需要 token
+  Tenant?: string; // 店铺id
+}
+interface RequestOptions<R> {
+  url: string;
+  params?: R;
+  config?: CustomRequestConfig;
+  data?: R;
+}
+// 创建请求方法
+const createRequestMethods = (http: AxiosInstance) => {
+  // 发起 GET 请求
+  const get = async <T, R = Record<string, any>>(
+    options: RequestOptions<R>,
+  ) => {
+    const { url, params, config } = options;
+    const response = await http.get<ApiResponse<T>>(url, { params, ...config });
+    return response.data as T; // 返回响应数据
+  };
+
+  // 发起 POST 请求
+  const post = async <T, R = Record<string, any>>(
+    options: RequestOptions<R>,
+  ) => {
+    const { url, data, config } = options;
+    const response = await http.post<ApiResponse<T>>(url, data, config);
+    return response.data as T; // 返回响应数据
+  };
+
+  // 发起 PUT 请求
+  const put = async <T, R = Record<string, any>>(
+    options: RequestOptions<R>,
+  ) => {
+    const { url, data, config } = options;
+    const response = await http.put<ApiResponse<T>>(url, data, config);
+    return response.data as T; // 返回响应数据
+  };
+
+  // 发起 DELETE 请求
+  const del = async <T, R>(options: RequestOptions<R>) => {
+    const { url, config } = options;
+    const response = await http.delete<ApiResponse<T>>(url, config);
+    return response.data as T; // 返回响应数据
+  };
+
+  // 返回封装的请求方法
+  return { get, post, put, del };
+};
+
+// 创建实例化后的请求方法对象,用于真实环境
+export const realApi = createRequestMethods(instanceReal);
+
+export const mallApi = createRequestMethods(instanceDiy);
+
+export const threeRealApi = createRequestMethods(instanceThreeReal);

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است