Bladeren bron

初始化项目

yuanmingze 5 maanden geleden
commit
4c8009689e
100 gewijzigde bestanden met toevoegingen van 29669 en 0 verwijderingen
  1. 13 0
      .editorconfig
  2. 40 0
      .eslintrc.js
  3. 22 0
      .gitignore
  4. 9 0
      .prettierrc.json
  5. 5 0
      README.md
  6. 12 0
      env/.env.development
  7. 6 0
      env/.env.production
  8. 20 0
      index.html
  9. 94 0
      package.json
  10. 10188 0
      pnpm-lock.yaml
  11. 8 0
      shims-uni.d.ts
  12. 24 0
      src/App.vue
  13. 89 0
      src/components/dateSelect/k-bottom-button/KBottomButton.vue
  14. 115 0
      src/components/dateSelect/k-bottom-popup/KBottomPopup.vue
  15. 728 0
      src/components/dateSelect/k-date-picker/KDatePicker.vue
  16. 444 0
      src/components/dateSelect/k-date-picker/day.js
  17. 23 0
      src/components/dateSelect/k-date-picker/utils.js
  18. 45 0
      src/components/noData/index.vue
  19. 147 0
      src/components/sharePopup/index.vue
  20. 89 0
      src/components/tabber/index.vue
  21. 150 0
      src/components/table/tableData.vue
  22. 123 0
      src/components/table/tableDetail.vue
  23. 203 0
      src/components/uploadImg/index.vue
  24. 0 0
      src/config/index.ts
  25. 37 0
      src/constants/provinces.ts
  26. 6 0
      src/constants/rolesType.ts
  27. 9 0
      src/custom.d.ts
  28. 8 0
      src/env.d.ts
  29. 6 0
      src/hooks/useGetLoginStatus.ts
  30. 17 0
      src/hooks/useLoginout.ts
  31. 6 0
      src/hooks/useUpdatedUserInfo.ts
  32. 26 0
      src/main.ts
  33. 91 0
      src/manifest.json
  34. 1 0
      src/mp_ecard_sdk/constants/log.js
  35. 1 0
      src/mp_ecard_sdk/globalConfig.js
  36. 0 0
      src/mp_ecard_sdk/index.css
  37. 1 0
      src/mp_ecard_sdk/index.js
  38. 1 0
      src/mp_ecard_sdk/index/index.js
  39. 44 0
      src/mp_ecard_sdk/index/index.vue
  40. 91 0
      src/mp_ecard_sdk/main.js
  41. 110 0
      src/mp_ecard_sdk/protocol/eid/eid.vue
  42. 195 0
      src/mp_ecard_sdk/protocol/privacy/privacy.vue
  43. 173 0
      src/mp_ecard_sdk/protocol/service/service.vue
  44. 47 0
      src/mp_ecard_sdk/protocol/userAccredit/userAccredit.vue
  45. 6 0
      src/mp_ecard_sdk/utils/getParameterByName.js
  46. 1 0
      src/mp_ecard_sdk/utils/http.js
  47. 1 0
      src/mp_ecard_sdk/utils/validate.js
  48. 68 0
      src/pages-sub-admin/managementByObjectives/index.vue
  49. 9 0
      src/pages-sub-admin/managementByObjectives/taskList.ts
  50. 813 0
      src/pages-sub-admin/objectivesAdd/index.vue
  51. 466 0
      src/pages-sub-admin/objectivesDetailList/index.vue
  52. 177 0
      src/pages-sub-admin/objectivesList/components/approvalFlowchart.vue
  53. 487 0
      src/pages-sub-admin/objectivesList/index.vue
  54. 84 0
      src/pages-sub-admin/serviceManagement/index.vue
  55. 34 0
      src/pages-sub-admin/serviceManagement/taskList.ts
  56. 47 0
      src/pages-sub-mine/agreement/index.vue
  57. 129 0
      src/pages-sub-mine/auth/constants/index.ts
  58. 289 0
      src/pages-sub-mine/auth/hook/useAutnFn.ts
  59. 50 0
      src/pages-sub-mine/auth/hook/useRadio.ts
  60. 390 0
      src/pages-sub-mine/auth/index.vue
  61. 97 0
      src/pages-sub-mine/bind-card/index.vue
  62. 92 0
      src/pages-sub-mine/changePassword/index.vue
  63. 101 0
      src/pages-sub-mine/feedback/index.vue
  64. 306 0
      src/pages-sub-mine/forgotPassword/index.vue
  65. 220 0
      src/pages-sub-mine/integral-rules/index.vue
  66. 84 0
      src/pages-sub-mine/quiz/index.vue
  67. 184 0
      src/pages-sub-mine/quizDetail/index.vue
  68. 285 0
      src/pages-sub-mine/task-completion-records/index.vue
  69. 168 0
      src/pages-sub-mine/user-info/index.vue
  70. 208 0
      src/pages-sub-packages/agreement/huiqiyun.vue
  71. 195 0
      src/pages-sub-packages/agreement/jinyuan.vue
  72. 184 0
      src/pages-sub-packages/agreement/olading.vue
  73. 70 0
      src/pages-sub-packages/agreement/personalInfoAuth.vue
  74. 4085 0
      src/pages-sub-packages/agreement/platformUsers.vue
  75. 385 0
      src/pages-sub-packages/agreement/privacyPolicy.vue
  76. 224 0
      src/pages-sub-packages/agreement/taxhelper.vue
  77. 187 0
      src/pages-sub-packages/agreement/xintaizi.vue
  78. 225 0
      src/pages-sub-packages/agreement/zhengqizhixing.vue
  79. 175 0
      src/pages-sub-packages/get-task/component/cardItem.vue
  80. 289 0
      src/pages-sub-packages/get-task/detail.vue
  81. 270 0
      src/pages-sub-packages/get-task/index.vue
  82. 568 0
      src/pages-sub-packages/task-history/index.vue
  83. 153 0
      src/pages-sub-packages/task-list/index.vue
  84. 416 0
      src/pages-sub-service-mangement/assignPoints/index.vue
  85. 88 0
      src/pages-sub-service-mangement/assignPointsAdd/components/TableData.vue
  86. 112 0
      src/pages-sub-service-mangement/assignPointsAdd/components/treeList.ts
  87. 209 0
      src/pages-sub-service-mangement/assignPointsAdd/detail.vue
  88. 581 0
      src/pages-sub-service-mangement/assignPointsAdd/index.vue
  89. 131 0
      src/pages-sub-service-mangement/generateReport/index.vue
  90. 404 0
      src/pages-sub-service-mangement/quickAudit/index.vue
  91. 155 0
      src/pages-sub-service-mangement/quickAuditCard/components/cardList.vue
  92. 146 0
      src/pages-sub-service-mangement/quickAuditCard/index.vue
  93. 381 0
      src/pages-sub-service-mangement/serviceDelivery/index.vue
  94. 125 0
      src/pages-sub-service-mangement/serviceDeliveryAdd/components/TableData.vue
  95. 134 0
      src/pages-sub-service-mangement/serviceDeliveryAdd/components/taskTree.vue
  96. 112 0
      src/pages-sub-service-mangement/serviceDeliveryAdd/components/treeList.ts
  97. 667 0
      src/pages-sub-service-mangement/serviceDeliveryAdd/index.vue
  98. 125 0
      src/pages-sub-service-mangement/stopServiceDelivery/index.vue
  99. 262 0
      src/pages-sub-service-mangement/taskAudit/index.vue
  100. 348 0
      src/pages-sub-service-mangement/taskAuditDetail/index.vue

+ 13 - 0
.editorconfig

@@ -0,0 +1,13 @@
+# editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false

+ 40 - 0
.eslintrc.js

@@ -0,0 +1,40 @@
+module.exports = {
+  env: {
+    browser: true,
+    es2021: true
+  },
+  extends: [
+    'plugin:vue/vue3-essential',
+    'eslint:recommended',
+    '@vue/eslint-config-typescript',
+    '@vue/eslint-config-prettier/skip-formatting',
+    'plugin:prettier/recommended'
+  ],
+  overrides: [
+    {
+      env: {
+        browser: true,
+        node: true,
+        es6: true
+      },
+      files: ['.eslintrc.{js,cjs}'],
+      parserOptions: {
+        sourceType: 'script'
+      }
+    }
+  ],
+  globals: {
+    wx: true
+  },
+  parserOptions: {
+    ecmaVersion: 'latest',
+    sourceType: 'module'
+  },
+  plugins: ['vue'],
+  rules: {
+    'vue/multi-word-component-names': 'off',
+    'element-plus/icons-vue/some-rule': 'off',
+    'prettier/prettier': ['error', { endOfLine: 'auto' }]
+  },
+  ignorePatterns: ['src/mp_ecard_sdk']
+}

+ 22 - 0
.gitignore

@@ -0,0 +1,22 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+*.local
+
+# Editor directories and files
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+*.code-workspace

+ 9 - 0
.prettierrc.json

@@ -0,0 +1,9 @@
+{
+  "$schema": "https://json.schemastore.org/prettierrc",
+  "semi": false,
+  "tabWidth": 2,
+  "singleQuote": true,
+  "printWidth": 100,
+  "trailingComma": "none",
+  "endOfLine": "auto"
+}

+ 5 - 0
README.md

@@ -0,0 +1,5 @@
+# JY_2_MP
+
+营销行为小助手小程序 unipp
+
+VITE + VUE3 + TS + Pinnia + uv-ui

+ 12 - 0
env/.env.development

@@ -0,0 +1,12 @@
+NODE_ENV=development
+
+# pre环境
+# VITE_APP_URL=https://mic.freerr.cn
+# 生产
+# VITE_APP_URL=https://cnbg.yaoyi.net
+# VITE_APP_URL=https://mic.cnbg.com.cn
+# 中生测试
+VITE_APP_URL=https://mic-t.cnbg.com.cn
+
+
+

+ 6 - 0
env/.env.production

@@ -0,0 +1,6 @@
+NODE_ENV=production
+VITE_APP_URL=https://cnbg.yaoyi.net
+# h5地址
+# VITE_APP_URL=https://mic.cnbg.com.cn
+# 测试环境
+# VITE_APP_URL=https://mic-t.cnbg.com.cn

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 94 - 0
package.json

@@ -0,0 +1,94 @@
+{
+  "name": "uni-preset-vue",
+  "version": "0.0.0",
+  "scripts": {
+    "dev:app": "uni -p app",
+    "dev:app-android": "uni -p app-android",
+    "dev:app-ios": "uni -p app-ios",
+    "dev:custom": "uni -p",
+    "dev:h5": "uni --mode development",
+    "dev:h5:ssr": "uni --ssr",
+    "dev:mp-alipay": "uni -p mp-alipay",
+    "dev:mp-baidu": "uni -p mp-baidu",
+    "dev:mp-jd": "uni -p mp-jd",
+    "dev:mp-kuaishou": "uni -p mp-kuaishou",
+    "dev:mp-lark": "uni -p mp-lark",
+    "dev:mp-qq": "uni -p mp-qq",
+    "dev:mp-toutiao": "uni -p mp-toutiao",
+    "dev:mp-weixin": "uni -p mp-weixin --mode development",
+    "dev:quickapp-webview": "uni -p quickapp-webview",
+    "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
+    "dev:quickapp-webview-union": "uni -p quickapp-webview-union",
+    "build:app": "uni build -p app",
+    "build:app-android": "uni build -p app-android",
+    "build:app-ios": "uni build -p app-ios",
+    "build:custom": "uni build -p",
+    "build:h5:pre": "uni build --mode development",
+    "build:h5": "uni build --mode production",
+    "build:h5:ssr": "uni build --ssr",
+    "build:mp-alipay": "uni build -p mp-alipay",
+    "build:mp-baidu": "uni build -p mp-baidu",
+    "build:mp-jd": "uni build -p mp-jd",
+    "build:mp-kuaishou": "uni build -p mp-kuaishou",
+    "build:mp-lark": "uni build -p mp-lark",
+    "build:mp-qq": "uni build -p mp-qq",
+    "build:mp-toutiao": "uni build -p mp-toutiao",
+    "build:mp-weixin": "uni build -p mp-weixin --mode production",
+    "build:quickapp-webview": "uni build -p quickapp-webview",
+    "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
+    "build:quickapp-webview-union": "uni build -p quickapp-webview-union",
+    "type-check": "vue-tsc --noEmit"
+  },
+  "dependencies": {
+    "@climblee/uv-ui": "^1.1.15",
+    "@dcloudio/uni-app": "3.0.0-3081220230817001",
+    "@dcloudio/uni-app-plus": "3.0.0-3081220230817001",
+    "@dcloudio/uni-components": "3.0.0-3081220230817001",
+    "@dcloudio/uni-h5": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-alipay": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-baidu": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-jd": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-kuaishou": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-lark": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-qq": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-toutiao": "3.0.0-3081220230817001",
+    "@dcloudio/uni-mp-weixin": "3.0.0-3081220230817001",
+    "@dcloudio/uni-quickapp-webview": "3.0.0-3081220230817001",
+    "@dcloudio/uni-ui": "^1.4.28",
+    "dayjs": "^1.11.10",
+    "eslint-config-prettier": "^9.0.0",
+    "eslint-plugin-prettier": "^5.0.1",
+    "pinia-plugin-persistedstate": "^3.2.0",
+    "prettier": "^3.0.3",
+    "qs": "^6.11.2",
+    "sass": "^1.69.3",
+    "sass-loader": "^13.3.2",
+    "vue": "^3.2.45",
+    "vue-i18n": "^9.1.9"
+  },
+  "devDependencies": {
+    "@dcloudio/types": "^3.4.1",
+    "@dcloudio/uni-automator": "3.0.0-3081220230817001",
+    "@dcloudio/uni-cli-shared": "3.0.0-3081220230817001",
+    "@dcloudio/uni-stacktracey": "3.0.0-3081220230817001",
+    "@dcloudio/vite-plugin-uni": "3.0.0-3081220230817001",
+    "@types/node": "^20.10.1",
+    "@types/qs": "^6.9.9",
+    "@typescript-eslint/eslint-plugin": "^6.8.0",
+    "@vitejs/plugin-vue-jsx": "^3.0.2",
+    "@vue/eslint-config-prettier": "^8.0.0",
+    "@vue/eslint-config-typescript": "^12.0.0",
+    "@vue/runtime-core": "^3.2.45",
+    "@vue/tsconfig": "^0.1.3",
+    "eslint": "^8.51.0",
+    "eslint-config-standard-with-typescript": "^39.1.1",
+    "eslint-plugin-import": "^2.28.1",
+    "eslint-plugin-n": "^16.2.0",
+    "eslint-plugin-promise": "^6.1.1",
+    "eslint-plugin-vue": "^9.17.0",
+    "pinia": "^2.0.36",
+    "typescript": "^5.2.2",
+    "vite": "4.1.5",
+    "vue-tsc": "^1.0.24"
+  }
+}

+ 10188 - 0
pnpm-lock.yaml

@@ -0,0 +1,10188 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      '@climblee/uv-ui':
+        specifier: ^1.1.15
+        version: 1.1.20
+      '@dcloudio/uni-app':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(@dcloudio/types@3.4.14)(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-app-plus':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-components':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-h5':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-alipay':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-baidu':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-jd':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-kuaishou':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-lark':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-qq':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-toutiao':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-weixin':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-quickapp-webview':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-ui':
+        specifier: ^1.4.28
+        version: 1.5.7
+      dayjs:
+        specifier: ^1.11.10
+        version: 1.11.13
+      eslint-config-prettier:
+        specifier: ^9.0.0
+        version: 9.1.0(eslint@8.57.1)
+      eslint-plugin-prettier:
+        specifier: ^5.0.1
+        version: 5.2.2(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2)
+      pinia-plugin-persistedstate:
+        specifier: ^3.2.0
+        version: 3.2.3(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))
+      prettier:
+        specifier: ^3.0.3
+        version: 3.4.2
+      qs:
+        specifier: ^6.11.2
+        version: 6.14.0
+      sass:
+        specifier: ^1.69.3
+        version: 1.83.4
+      sass-loader:
+        specifier: ^13.3.2
+        version: 13.3.3(sass@1.83.4)(webpack@5.97.1)
+      vue:
+        specifier: ^3.2.45
+        version: 3.5.13(typescript@5.7.3)
+      vue-i18n:
+        specifier: ^9.1.9
+        version: 9.14.2(vue@3.5.13(typescript@5.7.3))
+    devDependencies:
+      '@dcloudio/types':
+        specifier: ^3.4.1
+        version: 3.4.14
+      '@dcloudio/uni-automator':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(jest-environment-node@27.5.1)(jest@27.0.4)(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-cli-shared':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-stacktracey':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001
+      '@dcloudio/vite-plugin-uni':
+        specifier: 3.0.0-3081220230817001
+        version: 3.0.0-3081220230817001(postcss@8.5.1)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))
+      '@types/node':
+        specifier: ^20.10.1
+        version: 20.17.14
+      '@types/qs':
+        specifier: ^6.9.9
+        version: 6.9.18
+      '@typescript-eslint/eslint-plugin':
+        specifier: ^6.8.0
+        version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)
+      '@vitejs/plugin-vue-jsx':
+        specifier: ^3.0.2
+        version: 3.1.0(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))
+      '@vue/eslint-config-prettier':
+        specifier: ^8.0.0
+        version: 8.0.0(@types/eslint@9.6.1)(eslint@8.57.1)(prettier@3.4.2)
+      '@vue/eslint-config-typescript':
+        specifier: ^12.0.0
+        version: 12.0.0(eslint-plugin-vue@9.32.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.7.3)
+      '@vue/runtime-core':
+        specifier: ^3.2.45
+        version: 3.5.13
+      '@vue/tsconfig':
+        specifier: ^0.1.3
+        version: 0.1.3(@types/node@20.17.14)
+      eslint:
+        specifier: ^8.51.0
+        version: 8.57.1
+      eslint-config-standard-with-typescript:
+        specifier: ^39.1.1
+        version: 39.1.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.7.3)
+      eslint-plugin-import:
+        specifier: ^2.28.1
+        version: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)
+      eslint-plugin-n:
+        specifier: ^16.2.0
+        version: 16.6.2(eslint@8.57.1)
+      eslint-plugin-promise:
+        specifier: ^6.1.1
+        version: 6.6.0(eslint@8.57.1)
+      eslint-plugin-vue:
+        specifier: ^9.17.0
+        version: 9.32.0(eslint@8.57.1)
+      pinia:
+        specifier: ^2.0.36
+        version: 2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
+      typescript:
+        specifier: ^5.2.2
+        version: 5.7.3
+      vite:
+        specifier: 4.1.5
+        version: 4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0)
+      vue-tsc:
+        specifier: ^1.0.24
+        version: 1.8.27(typescript@5.7.3)
+
+packages:
+
+  '@ampproject/remapping@2.3.0':
+    resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+    engines: {node: '>=6.0.0'}
+
+  '@babel/code-frame@7.26.2':
+    resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/compat-data@7.26.5':
+    resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/core@7.26.0':
+    resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/generator@7.26.5':
+    resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
+    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.25.9':
+    resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-create-regexp-features-plugin@7.26.3':
+    resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-define-polyfill-provider@0.6.3':
+    resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.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-remap-async-to-generator@7.25.9':
+    resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.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/helper-wrap-function@7.25.9':
+    resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helpers@7.26.0':
+    resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/parser@7.26.5':
+    resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9':
+    resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9':
+    resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9':
+    resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9':
+    resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.13.0
+
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9':
+    resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
+    resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-async-generators@7.8.4':
+    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-bigint@7.8.3':
+    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-class-properties@7.12.13':
+    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-class-static-block@7.14.5':
+    resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-import-assertions@7.26.0':
+    resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==}
+    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-json-strings@7.8.3':
+    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+    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-logical-assignment-operators@7.10.4':
+    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
+    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-numeric-separator@7.10.4':
+    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-object-rest-spread@7.8.3':
+    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-optional-catch-binding@7.8.3':
+    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-optional-chaining@7.8.3':
+    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-private-property-in-object@7.14.5':
+    resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-top-level-await@7.14.5':
+    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+    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-syntax-unicode-sets-regex@7.18.6':
+    resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-arrow-functions@7.25.9':
+    resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-async-generator-functions@7.25.9':
+    resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-async-to-generator@7.25.9':
+    resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-block-scoped-functions@7.26.5':
+    resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-block-scoping@7.25.9':
+    resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-class-properties@7.25.9':
+    resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-class-static-block@7.26.0':
+    resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.12.0
+
+  '@babel/plugin-transform-classes@7.25.9':
+    resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-computed-properties@7.25.9':
+    resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-destructuring@7.25.9':
+    resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-dotall-regex@7.25.9':
+    resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-duplicate-keys@7.25.9':
+    resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9':
+    resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-dynamic-import@7.25.9':
+    resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-exponentiation-operator@7.26.3':
+    resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-export-namespace-from@7.25.9':
+    resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-for-of@7.25.9':
+    resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-function-name@7.25.9':
+    resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-json-strings@7.25.9':
+    resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-literals@7.25.9':
+    resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-logical-assignment-operators@7.25.9':
+    resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-member-expression-literals@7.25.9':
+    resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-amd@7.25.9':
+    resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-commonjs@7.26.3':
+    resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-systemjs@7.25.9':
+    resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-umd@7.25.9':
+    resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-named-capturing-groups-regex@7.25.9':
+    resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-new-target@7.25.9':
+    resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-nullish-coalescing-operator@7.26.6':
+    resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-numeric-separator@7.25.9':
+    resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-object-rest-spread@7.25.9':
+    resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-object-super@7.25.9':
+    resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-optional-catch-binding@7.25.9':
+    resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-optional-chaining@7.25.9':
+    resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-parameters@7.25.9':
+    resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-private-methods@7.25.9':
+    resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-private-property-in-object@7.25.9':
+    resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-property-literals@7.25.9':
+    resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-regenerator@7.25.9':
+    resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-regexp-modifiers@7.26.0':
+    resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-reserved-words@7.25.9':
+    resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-shorthand-properties@7.25.9':
+    resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-spread@7.25.9':
+    resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-sticky-regex@7.25.9':
+    resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-template-literals@7.25.9':
+    resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typeof-symbol@7.25.9':
+    resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typescript@7.26.5':
+    resolution: {integrity: sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-escapes@7.25.9':
+    resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-property-regex@7.25.9':
+    resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-regex@7.25.9':
+    resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-sets-regex@7.25.9':
+    resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/preset-env@7.26.0':
+    resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/preset-modules@0.1.6-no-external-plugins':
+    resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+
+  '@babel/runtime@7.26.0':
+    resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/template@7.25.9':
+    resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/traverse@7.26.5':
+    resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/types@7.26.5':
+    resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==}
+    engines: {node: '>=6.9.0'}
+
+  '@bcoe/v8-coverage@0.2.3':
+    resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+
+  '@climblee/uv-ui@1.1.20':
+    resolution: {integrity: sha512-jkyesHJsPJkF4Nap9ZmG1/ibKlxXA5M8+ntqKXwwloIsYSYL5SOKb0gyPj17aBOU1PkJpmeiZ8PwnTolhK2/HA==}
+
+  '@dcloudio/types@3.4.14':
+    resolution: {integrity: sha512-VolQeZfTh8pQFsr2IlfIVX93blfvGTuBoJuZUc7iWOqtHV8gDrq6fXLhzsVlgZyuhhRZLOxlo33rkEqnY+ucAw==}
+
+  '@dcloudio/uni-app-plus@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-GpQobx3WbcyOZ49f8JM+febzKvlthFBAxcs4xrbtNVzmkj0jLJoh9GoH37oa7m5DI1k4l5wUuwvg4/JxBbhOSA==}
+
+  '@dcloudio/uni-app-uts@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-snMFEpTw5T0TT5uFwp0piytLRB0FBRHDM5ML00E1nrzfts0XlaFKoB4UsvLySG5sE5+Xt8F5/uzKxid3mcgTLQ==}
+
+  '@dcloudio/uni-app-vite@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-iHmKh6hjPGh+FC6Fi4qqwT5N31QiWv9JymCLdbkOJRi71A3byDjxoH7ScSEEEg+A5AAPky6LHbmFmznPMeSwAg==}
+
+  '@dcloudio/uni-app-vue@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-08ZUIn2a+OZWjqvjTbLygWZOY9YXbf2J1ns2letBI9aoMZDx+Sgx2lUFWHDksmOhvApPLKrRjJM0Hmmxi2mjJw==}
+
+  '@dcloudio/uni-app@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-sf8PzXHSd/VFCn7X9+QbD4nrY21FnIwjrhyX2hFit7PZK9kpyQluqCmG7YuotuXJzsNML8c8u2O9q5FaeOyTHg==}
+    peerDependencies:
+      '@dcloudio/types': ^3.3.2
+
+  '@dcloudio/uni-automator@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-boaRlUAAXsEh4aN5PbtMVvzdmvXqoEWa8eQBD4oCH36lyGgK8q75vsjLRi4LBFFwNlCNMrYepTNbBCjP+Sgt0g==}
+    peerDependencies:
+      jest: 27.0.4
+      jest-environment-node: 27.5.1
+
+  '@dcloudio/uni-cli-shared@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-FOeydfIdKZg+MnQsHSFLXBzzmXtgCWnmEyjw3MHNN5mGwQB6+f7vK8sLw+yjizD/j71eMnh8XXCk+dV3nD/Vzg==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
+  '@dcloudio/uni-cloud@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-rrHN4PvvylrhmivAoSv4h8ZcQ3ZWHnMRXhQWPC9FBR1TInrrxrrAHuMqSZn6pTIXhCiRA3Kuy6aDNVCbt6VA+g==}
+
+  '@dcloudio/uni-components@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-FlIrTgR/9Yp8FWYfhXfLPd0jJtBwJwRBAWWmLNaufkTojm6X7rX8wQOd13n+7gJGKzfXcEV8npOYpVou4P46Pw==}
+
+  '@dcloudio/uni-h5-vite@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-x7F6mUTjHiOx7+lj5yIrzhD7gr0HTNJaku5gV3O8bFjxKLcIkFkAyliKPbqJ4QZCmCCmEfJpOGKrDhk35tlibg==}
+
+  '@dcloudio/uni-h5-vue@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-q1eFoXb5/4whNIJ1CumKmeypPjZofw8xDQRHZeGZ7NVRQ0/MYnEm6A0n/vkmEo1IgTZIY83m/jr6RNg7a9Ko/A==}
+
+  '@dcloudio/uni-h5@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-m2RCZpYxuAGnXlQKSQ8FGy4OlnUJJ8XMx2HNQWriDwtjDpAGDU8I2LZQZ7MHCNPIUd503y+mgU2NPlSQHnrlkQ==}
+
+  '@dcloudio/uni-i18n@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-ooAIoNCy+DPlMtA4k9eoaJJsYQtici85le+ietIIzLdJoa2YUnudYv9CvG9Mw/RsKQI+MLl96ADAPgUpGzounw==}
+
+  '@dcloudio/uni-mp-alipay@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-lZR2u8sxJ/ZaDqaxEmGzgWWKHcjnLGedDTrMh8kOEPLHO6THVNe5TP6XeiTcE0HKJfWEXv6X13erjn0FCstz3A==}
+
+  '@dcloudio/uni-mp-baidu@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-FYwK1AqSc+NvtvaCia/fOP57ELx5O5icHjuwPKMsJv5eGtqlwhXzyvSCoGEFyYQcsWP9ZqYSb3fTuxVlbiEYdA==}
+
+  '@dcloudio/uni-mp-compiler@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-KDfwEr9jFNSkNbYmdDc+zfGuZwXGkz3bW3c4cuV44IncTf/UW2m594Z2UzhJkx/p662aQ2W9M4BFZ0o5QSfQDw==}
+
+  '@dcloudio/uni-mp-jd@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-sKDppXhk7k8Euce9v7ItQ2cs3+XpQV/DX8FjXzfO9DfjQEKiR/Pyfis7e3ANQrF4V/W3uwK5wgN/PyI3/NRloQ==}
+
+  '@dcloudio/uni-mp-kuaishou@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-wYXwoxcdms8PviNsKg2Y9oqHawKqseoD97sYs94RLDVSnyO9c6NOoUMsYjXwIZXt05E56bJ9EbxDqYDwwJhEKw==}
+
+  '@dcloudio/uni-mp-lark@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-4aHwULp+Nx55BoJvj1jCXWnVJrzl0ACEbDlXVvxmNUI5tkqn2kYL4AZgrXP1vCx8MHKVPI4E34Z+lrBTfSfKMA==}
+
+  '@dcloudio/uni-mp-qq@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-StSsxCCKMdZCghUZ+wdX1otCmlYkIV+O2Z/AxMv772HfIKlpDp44PPaxlKBG4L6+X7h2JsCvyZW1iSznM5A3CQ==}
+
+  '@dcloudio/uni-mp-toutiao@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-ZMSNNjQpCV4z+76OA8rDKKhqr+vQmTvKNUOzKfND5KPYhgWbqviEBZ8ptiDT5gaWXMpkUHNfWz32hdi5CLbj5Q==}
+
+  '@dcloudio/uni-mp-vite@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-jmEbsVOJ1dlj46QiSFMB2C3zbgGivkGf1KXoPTAprv0WZrkmjF1uNLj0pHFOOUnnyHwHPViEApsMOPS4twIjIQ==}
+
+  '@dcloudio/uni-mp-vue@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-EfdTH6+qGXRh3402+psl8X4K34/gHfBPaMfxbwMsne1rGnB8ZVXiN73gVXKfCWeznvJqdWuTWmmjqaLoBhjOjA==}
+
+  '@dcloudio/uni-mp-weixin@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-vo2k8OaWFOvoXuRX83UCR0AOOKXXwjRDIOX0y/jUC9TX63Ne5OTdRKH9253D9109FrwtrtsUWqnpfn1ynKXl9g==}
+
+  '@dcloudio/uni-nvue-styler@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-EImnyrYHmAc7ibKfIMkBG1uMavS5sPdrtQj52m40o/QNU5kcsqUk2Od9c1ULkQloxhmK2E4FZvXo4cgszE/Txw==}
+
+  '@dcloudio/uni-push@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-1IyVJlBnZVVvY49SQKpZG5Oxak5Wl51NvYEozuYoeBaaTeZObm7B6eyd722sXi0Dd6N1sE3kIdm/XReprK53eg==}
+
+  '@dcloudio/uni-quickapp-webview@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-w6yitVyCKEFSO+UDsJPjc5RfAstIdOEbBHgim0gInTfOl90odmyUPKDxWhwQgS5vqezBXpCj0/6ywVMHvZu+7A==}
+
+  '@dcloudio/uni-shared@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-NI1pBO40VqvnWjwNXad3CqrUYvr4ffGjiDMgJGMP13rgOEAqamU7ozBimoASDVPKyyfSHTeuYuh0gtaaLu4CsQ==}
+
+  '@dcloudio/uni-stacktracey@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-DUTTN8JWXxjO3ryz7uhD3+vazHVMflln15+r0ycWBjXO0p0MepRY3gX5gKCyiq9D3NUIxazcFAUJ6agFVUbDog==}
+
+  '@dcloudio/uni-stat@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-xpbsor5WKU1eCbo0dmQ0hBUX6RrdG7DNDzCSD6oimndIXVGLkFhWrIC3brQ7S1G2GQvXdXnXJpUVskI3qNe/uw==}
+
+  '@dcloudio/uni-ui@1.5.7':
+    resolution: {integrity: sha512-DugxSIrQrze1FLdUOj9a+JEQ0bHGjnJTcGUK1mN/MivKg7nuKJBRWk5Ipa9sUdoBznX6ndz5h2e7Uao6x1CdCw==}
+
+  '@dcloudio/vite-plugin-uni@3.0.0-3081220230817001':
+    resolution: {integrity: sha512-dLeqqyrNNUBTZfI0ppPk4YoD+DBI0gJLeTjpN6bK5i3nFKkju9g2K6IWl62YMObjTiXwQF8qAEDb+fyWoe4Ksw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      vite: ^4.0.0
+
+  '@esbuild/android-arm64@0.16.17':
+    resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm64@0.17.19':
+    resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm@0.16.17':
+    resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-arm@0.17.19':
+    resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-x64@0.16.17':
+    resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/android-x64@0.17.19':
+    resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/darwin-arm64@0.16.17':
+    resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-arm64@0.17.19':
+    resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.16.17':
+    resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.17.19':
+    resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/freebsd-arm64@0.16.17':
+    resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-arm64@0.17.19':
+    resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.16.17':
+    resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.17.19':
+    resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/linux-arm64@0.16.17':
+    resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm64@0.17.19':
+    resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.16.17':
+    resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.17.19':
+    resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.16.17':
+    resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.17.19':
+    resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.16.17':
+    resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.17.19':
+    resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.16.17':
+    resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.17.19':
+    resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.16.17':
+    resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.17.19':
+    resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.16.17':
+    resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.17.19':
+    resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.16.17':
+    resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.17.19':
+    resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.16.17':
+    resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.17.19':
+    resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-x64@0.16.17':
+    resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.17.19':
+    resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-x64@0.16.17':
+    resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.17.19':
+    resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/sunos-x64@0.16.17':
+    resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/sunos-x64@0.17.19':
+    resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/win32-arm64@0.16.17':
+    resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-arm64@0.17.19':
+    resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.16.17':
+    resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.17.19':
+    resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.16.17':
+    resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.17.19':
+    resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+
+  '@eslint-community/eslint-utils@4.4.1':
+    resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+  '@eslint-community/regexpp@4.12.1':
+    resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  '@eslint/eslintrc@2.1.4':
+    resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  '@eslint/js@8.57.1':
+    resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  '@humanwhocodes/config-array@0.13.0':
+    resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
+    engines: {node: '>=10.10.0'}
+    deprecated: Use @eslint/config-array instead
+
+  '@humanwhocodes/module-importer@1.0.1':
+    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+    engines: {node: '>=12.22'}
+
+  '@humanwhocodes/object-schema@2.0.3':
+    resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+    deprecated: Use @eslint/object-schema instead
+
+  '@intlify/core-base@9.1.9':
+    resolution: {integrity: sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==}
+    engines: {node: '>= 10'}
+
+  '@intlify/core-base@9.14.2':
+    resolution: {integrity: sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==}
+    engines: {node: '>= 16'}
+
+  '@intlify/devtools-if@9.1.9':
+    resolution: {integrity: sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==}
+    engines: {node: '>= 10'}
+
+  '@intlify/message-compiler@9.1.9':
+    resolution: {integrity: sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==}
+    engines: {node: '>= 10'}
+
+  '@intlify/message-compiler@9.14.2':
+    resolution: {integrity: sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==}
+    engines: {node: '>= 16'}
+
+  '@intlify/message-resolver@9.1.9':
+    resolution: {integrity: sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==}
+    engines: {node: '>= 10'}
+
+  '@intlify/runtime@9.1.9':
+    resolution: {integrity: sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==}
+    engines: {node: '>= 10'}
+
+  '@intlify/shared@9.1.9':
+    resolution: {integrity: sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==}
+    engines: {node: '>= 10'}
+
+  '@intlify/shared@9.14.2':
+    resolution: {integrity: sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==}
+    engines: {node: '>= 16'}
+
+  '@intlify/vue-devtools@9.1.9':
+    resolution: {integrity: sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==}
+    engines: {node: '>= 10'}
+
+  '@istanbuljs/load-nyc-config@1.1.0':
+    resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+    engines: {node: '>=8'}
+
+  '@istanbuljs/schema@0.1.3':
+    resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+    engines: {node: '>=8'}
+
+  '@jest/console@27.5.1':
+    resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/core@27.5.1':
+    resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  '@jest/environment@27.5.1':
+    resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/fake-timers@27.5.1':
+    resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/globals@27.5.1':
+    resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/reporters@27.5.1':
+    resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  '@jest/source-map@27.5.1':
+    resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/test-result@27.5.1':
+    resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/test-sequencer@27.5.1':
+    resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/transform@27.5.1':
+    resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/types@27.5.1':
+    resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jimp/bmp@0.10.3':
+    resolution: {integrity: sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/core@0.10.3':
+    resolution: {integrity: sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==}
+
+  '@jimp/custom@0.10.3':
+    resolution: {integrity: sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==}
+
+  '@jimp/gif@0.10.3':
+    resolution: {integrity: sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/jpeg@0.10.3':
+    resolution: {integrity: sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-blit@0.10.3':
+    resolution: {integrity: sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-blur@0.10.3':
+    resolution: {integrity: sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-circle@0.10.3':
+    resolution: {integrity: sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-color@0.10.3':
+    resolution: {integrity: sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-contain@0.10.3':
+    resolution: {integrity: sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-blit': '>=0.3.5'
+      '@jimp/plugin-resize': '>=0.3.5'
+      '@jimp/plugin-scale': '>=0.3.5'
+
+  '@jimp/plugin-cover@0.10.3':
+    resolution: {integrity: sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-crop': '>=0.3.5'
+      '@jimp/plugin-resize': '>=0.3.5'
+      '@jimp/plugin-scale': '>=0.3.5'
+
+  '@jimp/plugin-crop@0.10.3':
+    resolution: {integrity: sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-displace@0.10.3':
+    resolution: {integrity: sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-dither@0.10.3':
+    resolution: {integrity: sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-fisheye@0.10.3':
+    resolution: {integrity: sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-flip@0.10.3':
+    resolution: {integrity: sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-rotate': '>=0.3.5'
+
+  '@jimp/plugin-gaussian@0.10.3':
+    resolution: {integrity: sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-invert@0.10.3':
+    resolution: {integrity: sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-mask@0.10.3':
+    resolution: {integrity: sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-normalize@0.10.3':
+    resolution: {integrity: sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-print@0.10.3':
+    resolution: {integrity: sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-blit': '>=0.3.5'
+
+  '@jimp/plugin-resize@0.10.3':
+    resolution: {integrity: sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/plugin-rotate@0.10.3':
+    resolution: {integrity: sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-blit': '>=0.3.5'
+      '@jimp/plugin-crop': '>=0.3.5'
+      '@jimp/plugin-resize': '>=0.3.5'
+
+  '@jimp/plugin-scale@0.10.3':
+    resolution: {integrity: sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-resize': '>=0.3.5'
+
+  '@jimp/plugin-shadow@0.10.3':
+    resolution: {integrity: sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-blur': '>=0.3.5'
+      '@jimp/plugin-resize': '>=0.3.5'
+
+  '@jimp/plugin-threshold@0.10.3':
+    resolution: {integrity: sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+      '@jimp/plugin-color': '>=0.8.0'
+      '@jimp/plugin-resize': '>=0.8.0'
+
+  '@jimp/plugins@0.10.3':
+    resolution: {integrity: sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/png@0.10.3':
+    resolution: {integrity: sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/tiff@0.10.3':
+    resolution: {integrity: sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/types@0.10.3':
+    resolution: {integrity: sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==}
+    peerDependencies:
+      '@jimp/custom': '>=0.3.5'
+
+  '@jimp/utils@0.10.3':
+    resolution: {integrity: sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==}
+
+  '@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/source-map@0.3.6':
+    resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+
+  '@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'}
+
+  '@parcel/watcher-android-arm64@2.5.0':
+    resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  '@parcel/watcher-darwin-arm64@2.5.0':
+    resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@parcel/watcher-darwin-x64@2.5.0':
+    resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@parcel/watcher-freebsd-x64@2.5.0':
+    resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@parcel/watcher-linux-arm-glibc@2.5.0':
+    resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-arm-musl@2.5.0':
+    resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.0':
+    resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-arm64-musl@2.5.0':
+    resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-linux-x64-glibc@2.5.0':
+    resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-x64-musl@2.5.0':
+    resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-win32-arm64@2.5.0':
+    resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@parcel/watcher-win32-ia32@2.5.0':
+    resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@parcel/watcher-win32-x64@2.5.0':
+    resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  '@parcel/watcher@2.5.0':
+    resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==}
+    engines: {node: '>= 10.0.0'}
+
+  '@pkgr/core@0.1.1':
+    resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
+    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+  '@rollup/pluginutils@4.2.1':
+    resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+    engines: {node: '>= 8.0.0'}
+
+  '@rtsao/scc@1.1.0':
+    resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+  '@sinonjs/commons@1.8.6':
+    resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==}
+
+  '@sinonjs/fake-timers@8.1.0':
+    resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==}
+
+  '@tootallnate/once@1.1.2':
+    resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
+    engines: {node: '>= 6'}
+
+  '@types/babel__core@7.20.5':
+    resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+  '@types/babel__generator@7.6.8':
+    resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+  '@types/babel__template@7.4.4':
+    resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+  '@types/babel__traverse@7.20.6':
+    resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
+  '@types/eslint-scope@3.7.7':
+    resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+  '@types/eslint@9.6.1':
+    resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+  '@types/estree@1.0.6':
+    resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+  '@types/graceful-fs@4.1.9':
+    resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
+  '@types/istanbul-lib-coverage@2.0.6':
+    resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+
+  '@types/istanbul-lib-report@3.0.3':
+    resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+
+  '@types/istanbul-reports@3.0.4':
+    resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+
+  '@types/json-schema@7.0.15':
+    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+  '@types/json5@0.0.29':
+    resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+  '@types/node@20.17.14':
+    resolution: {integrity: sha512-w6qdYetNL5KRBiSClK/KWai+2IMEJuAj+EujKCumalFOwXtvOXaEan9AuwcRID2IcOIAWSIfR495hBtgKlx2zg==}
+
+  '@types/prettier@2.7.3':
+    resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
+
+  '@types/qs@6.9.18':
+    resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==}
+
+  '@types/semver@7.5.8':
+    resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
+
+  '@types/stack-utils@2.0.3':
+    resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+
+  '@types/yargs-parser@21.0.3':
+    resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+  '@types/yargs@16.0.9':
+    resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==}
+
+  '@typescript-eslint/eslint-plugin@6.21.0':
+    resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
+      eslint: ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/parser@6.21.0':
+    resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/scope-manager@6.21.0':
+    resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+
+  '@typescript-eslint/type-utils@6.21.0':
+    resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/types@6.21.0':
+    resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+
+  '@typescript-eslint/typescript-estree@6.21.0':
+    resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/utils@6.21.0':
+    resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0
+
+  '@typescript-eslint/visitor-keys@6.21.0':
+    resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
+    engines: {node: ^16.0.0 || >=18.0.0}
+
+  '@ungap/structured-clone@1.2.1':
+    resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==}
+
+  '@vitejs/plugin-legacy@4.1.1':
+    resolution: {integrity: sha512-um3gbVouD2Q/g19C0qpDfHwveXDCAHzs8OC3e9g6aXpKoD1H14himgs7wkMnhAynBJy7QqUoZNAXDuqN8zLR2g==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      terser: ^5.4.0
+      vite: ^4.0.0
+
+  '@vitejs/plugin-vue-jsx@3.1.0':
+    resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      vite: ^4.0.0 || ^5.0.0
+      vue: ^3.0.0
+
+  '@vitejs/plugin-vue@4.6.2':
+    resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      vite: ^4.0.0 || ^5.0.0
+      vue: ^3.2.25
+
+  '@volar/language-core@1.11.1':
+    resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==}
+
+  '@volar/source-map@1.11.1':
+    resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==}
+
+  '@volar/typescript@1.11.1':
+    resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==}
+
+  '@vue/babel-helper-vue-transform-on@1.2.5':
+    resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==}
+
+  '@vue/babel-plugin-jsx@1.2.5':
+    resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+
+  '@vue/babel-plugin-resolve-type@1.2.5':
+    resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@vue/compiler-core@3.2.47':
+    resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==}
+
+  '@vue/compiler-core@3.5.13':
+    resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
+
+  '@vue/compiler-dom@3.2.47':
+    resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==}
+
+  '@vue/compiler-dom@3.5.13':
+    resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+
+  '@vue/compiler-sfc@3.2.47':
+    resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==}
+
+  '@vue/compiler-sfc@3.5.13':
+    resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
+
+  '@vue/compiler-ssr@3.2.47':
+    resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==}
+
+  '@vue/compiler-ssr@3.5.13':
+    resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
+
+  '@vue/devtools-api@6.6.4':
+    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+  '@vue/eslint-config-prettier@8.0.0':
+    resolution: {integrity: sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==}
+    peerDependencies:
+      eslint: '>= 8.0.0'
+      prettier: '>= 3.0.0'
+
+  '@vue/eslint-config-typescript@12.0.0':
+    resolution: {integrity: sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
+      eslint-plugin-vue: ^9.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@vue/language-core@1.8.27':
+    resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@vue/reactivity-transform@3.2.47':
+    resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==}
+
+  '@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.2.47':
+    resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==}
+    peerDependencies:
+      vue: 3.2.47
+
+  '@vue/server-renderer@3.5.13':
+    resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
+    peerDependencies:
+      vue: 3.5.13
+
+  '@vue/shared@3.2.47':
+    resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==}
+
+  '@vue/shared@3.5.13':
+    resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+  '@vue/tsconfig@0.1.3':
+    resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==}
+    peerDependencies:
+      '@types/node': '*'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@webassemblyjs/ast@1.14.1':
+    resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+  '@webassemblyjs/floating-point-hex-parser@1.13.2':
+    resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+  '@webassemblyjs/helper-api-error@1.13.2':
+    resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+  '@webassemblyjs/helper-buffer@1.14.1':
+    resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+  '@webassemblyjs/helper-numbers@1.13.2':
+    resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+  '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+    resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+  '@webassemblyjs/helper-wasm-section@1.14.1':
+    resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+  '@webassemblyjs/ieee754@1.13.2':
+    resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+  '@webassemblyjs/leb128@1.13.2':
+    resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+  '@webassemblyjs/utf8@1.13.2':
+    resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+  '@webassemblyjs/wasm-edit@1.14.1':
+    resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+  '@webassemblyjs/wasm-gen@1.14.1':
+    resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+  '@webassemblyjs/wasm-opt@1.14.1':
+    resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+  '@webassemblyjs/wasm-parser@1.14.1':
+    resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+  '@webassemblyjs/wast-printer@1.14.1':
+    resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+  '@xtuc/ieee754@1.2.0':
+    resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+  '@xtuc/long@4.2.2':
+    resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+  abab@2.0.6:
+    resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
+    deprecated: Use your platform's native atob() and btoa() methods instead
+
+  accepts@1.3.8:
+    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+    engines: {node: '>= 0.6'}
+
+  acorn-globals@6.0.0:
+    resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==}
+
+  acorn-jsx@5.3.2:
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  acorn-walk@7.2.0:
+    resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
+    engines: {node: '>=0.4.0'}
+
+  acorn@7.4.1:
+    resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  acorn@8.14.0:
+    resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  address@1.2.2:
+    resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
+    engines: {node: '>= 10.0.0'}
+
+  agent-base@6.0.2:
+    resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+    engines: {node: '>= 6.0.0'}
+
+  ajv-formats@2.1.1:
+    resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+    peerDependencies:
+      ajv: ^8.0.0
+    peerDependenciesMeta:
+      ajv:
+        optional: true
+
+  ajv-keywords@3.5.2:
+    resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+    peerDependencies:
+      ajv: ^6.9.1
+
+  ajv-keywords@5.1.0:
+    resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+    peerDependencies:
+      ajv: ^8.8.2
+
+  ajv@6.12.6:
+    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+  ajv@8.17.1:
+    resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+  ansi-escapes@4.3.2:
+    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  ansi-styles@5.2.0:
+    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+    engines: {node: '>=10'}
+
+  any-base@1.1.0:
+    resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==}
+
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  argparse@1.0.10:
+    resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+  argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  array-buffer-byte-length@1.0.2:
+    resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+    engines: {node: '>= 0.4'}
+
+  array-flatten@1.1.1:
+    resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+  array-includes@3.1.8:
+    resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+    engines: {node: '>= 0.4'}
+
+  array-union@2.1.0:
+    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+    engines: {node: '>=8'}
+
+  array.prototype.findlastindex@1.2.5:
+    resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+    engines: {node: '>= 0.4'}
+
+  array.prototype.flat@1.3.3:
+    resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+    engines: {node: '>= 0.4'}
+
+  array.prototype.flatmap@1.3.3:
+    resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+    engines: {node: '>= 0.4'}
+
+  arraybuffer.prototype.slice@1.0.4:
+    resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+    engines: {node: '>= 0.4'}
+
+  asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  autoprefixer@10.4.20:
+    resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+    engines: {node: ^10 || ^12 || >=14}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.1.0
+
+  available-typed-arrays@1.0.7:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
+
+  babel-jest@27.5.1:
+    resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      '@babel/core': ^7.8.0
+
+  babel-plugin-istanbul@6.1.1:
+    resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+    engines: {node: '>=8'}
+
+  babel-plugin-jest-hoist@27.5.1:
+    resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  babel-plugin-polyfill-corejs2@0.4.12:
+    resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-plugin-polyfill-corejs3@0.10.6:
+    resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-plugin-polyfill-regenerator@0.6.3:
+    resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-preset-current-node-syntax@1.1.0:
+    resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  babel-preset-jest@27.5.1:
+    resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  base64-js@1.5.1:
+    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+  base64url@3.0.1:
+    resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==}
+    engines: {node: '>=6.0.0'}
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  bmp-js@0.1.0:
+    resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==}
+
+  body-parser@1.20.3:
+    resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  brace-expansion@1.1.11:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+  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'}
+
+  browser-process-hrtime@1.0.0:
+    resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==}
+
+  browserslist@4.24.4:
+    resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  bser@2.1.1:
+    resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
+  buffer-equal@0.0.1:
+    resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==}
+    engines: {node: '>=0.4.0'}
+
+  buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+  buffer@5.7.1:
+    resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+  builtin-modules@3.3.0:
+    resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+    engines: {node: '>=6'}
+
+  builtins@5.1.0:
+    resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==}
+
+  bytes@3.1.2:
+    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+    engines: {node: '>= 0.8'}
+
+  cac@6.7.9:
+    resolution: {integrity: sha512-XN5qEpfNQCJ8jRaZgitSkkukjMRCGio+X3Ks5KUbGGlPbV+pSem1l9VuzooCBXOiMFshUZgyYqg6rgN8rjkb/w==}
+    engines: {node: '>=8'}
+
+  call-bind-apply-helpers@1.0.1:
+    resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
+    engines: {node: '>= 0.4'}
+
+  call-bind@1.0.8:
+    resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+    engines: {node: '>= 0.4'}
+
+  call-bound@1.0.3:
+    resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
+    engines: {node: '>= 0.4'}
+
+  callsites@3.1.0:
+    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+    engines: {node: '>=6'}
+
+  camelcase@5.3.1:
+    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+    engines: {node: '>=6'}
+
+  camelcase@6.3.0:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+
+  caniuse-lite@1.0.30001692:
+    resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==}
+
+  centra@2.7.0:
+    resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==}
+
+  chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  char-regex@1.0.2:
+    resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+    engines: {node: '>=10'}
+
+  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'}
+
+  chrome-trace-event@1.0.4:
+    resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+    engines: {node: '>=6.0'}
+
+  ci-info@3.9.0:
+    resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+    engines: {node: '>=8'}
+
+  cjs-module-lexer@1.4.1:
+    resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==}
+
+  cliui@7.0.4:
+    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
+  co@4.6.0:
+    resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+
+  collect-v8-coverage@1.0.2:
+    resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+
+  commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+  compare-versions@3.6.0:
+    resolution: {integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==}
+
+  computeds@0.0.1:
+    resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
+
+  concat-map@0.0.1:
+    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+  content-disposition@0.5.4:
+    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+    engines: {node: '>= 0.6'}
+
+  content-type@1.0.5:
+    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+    engines: {node: '>= 0.6'}
+
+  convert-source-map@1.9.0:
+    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+  convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+  cookie-signature@1.0.6:
+    resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+  cookie@0.7.1:
+    resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+    engines: {node: '>= 0.6'}
+
+  core-js-compat@3.40.0:
+    resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==}
+
+  core-js@3.40.0:
+    resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==}
+
+  cross-env@7.0.3:
+    resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
+    engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+    hasBin: true
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  css-font-size-keywords@1.0.0:
+    resolution: {integrity: sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==}
+
+  css-font-stretch-keywords@1.0.1:
+    resolution: {integrity: sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==}
+
+  css-font-style-keywords@1.0.1:
+    resolution: {integrity: sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==}
+
+  css-font-weight-keywords@1.0.0:
+    resolution: {integrity: sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==}
+
+  css-list-helpers@2.0.0:
+    resolution: {integrity: sha512-9Bj8tZ0jWbAM3u/U6m/boAzAwLPwtjzFvwivr2piSvyVa3K3rChJzQy4RIHkNkKiZCHrEMWDJWtTR8UyVhdDnQ==}
+
+  css-system-font-keywords@1.0.0:
+    resolution: {integrity: sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==}
+
+  cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  cssom@0.3.8:
+    resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
+
+  cssom@0.4.4:
+    resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==}
+
+  cssstyle@2.3.0:
+    resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
+    engines: {node: '>=8'}
+
+  csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  data-urls@2.0.0:
+    resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==}
+    engines: {node: '>=10'}
+
+  data-view-buffer@1.0.2:
+    resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-length@1.0.2:
+    resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-offset@1.0.1:
+    resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+    engines: {node: '>= 0.4'}
+
+  dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+  de-indent@1.0.2:
+    resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
+  debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  debug@3.2.7:
+    resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  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
+
+  decimal.js@10.4.3:
+    resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+
+  dedent@0.7.0:
+    resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+
+  deep-is@0.1.4:
+    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+  deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+
+  default-gateway@6.0.3:
+    resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==}
+    engines: {node: '>= 10'}
+
+  define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+
+  define-properties@1.2.1:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
+
+  delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+
+  destroy@1.2.0:
+    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+  detect-libc@1.0.3:
+    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+
+  detect-newline@3.1.0:
+    resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+    engines: {node: '>=8'}
+
+  diff-sequences@27.5.1:
+    resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  dir-glob@3.0.1:
+    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+    engines: {node: '>=8'}
+
+  doctrine@2.1.0:
+    resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+    engines: {node: '>=0.10.0'}
+
+  doctrine@3.0.0:
+    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+    engines: {node: '>=6.0.0'}
+
+  dom-walk@0.1.2:
+    resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
+
+  domexception@2.0.1:
+    resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==}
+    engines: {node: '>=8'}
+    deprecated: Use your platform's native DOMException instead
+
+  dunder-proto@1.0.1:
+    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+    engines: {node: '>= 0.4'}
+
+  ee-first@1.1.1:
+    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+  electron-to-chromium@1.5.83:
+    resolution: {integrity: sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==}
+
+  emittery@0.8.1:
+    resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==}
+    engines: {node: '>=10'}
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  encodeurl@1.0.2:
+    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+    engines: {node: '>= 0.8'}
+
+  encodeurl@2.0.0:
+    resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+    engines: {node: '>= 0.8'}
+
+  enhanced-resolve@5.18.0:
+    resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
+    engines: {node: '>=10.13.0'}
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  error-ex@1.3.2:
+    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+  es-abstract@1.23.9:
+    resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
+    engines: {node: '>= 0.4'}
+
+  es-define-property@1.0.1:
+    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+    engines: {node: '>= 0.4'}
+
+  es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  es-module-lexer@1.6.0:
+    resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
+
+  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'}
+
+  es-shim-unscopables@1.0.2:
+    resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+
+  es-to-primitive@1.3.0:
+    resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+    engines: {node: '>= 0.4'}
+
+  esbuild@0.16.17:
+    resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
+    engines: {node: '>=12'}
+    hasBin: true
+
+  esbuild@0.17.19:
+    resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
+    engines: {node: '>=12'}
+    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@2.0.0:
+    resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+    engines: {node: '>=8'}
+
+  escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
+  escodegen@2.1.0:
+    resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+    engines: {node: '>=6.0'}
+    hasBin: true
+
+  eslint-compat-utils@0.5.1:
+    resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-config-prettier@8.10.0:
+    resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+    hasBin: true
+    peerDependencies:
+      eslint: '>=7.0.0'
+
+  eslint-config-prettier@9.1.0:
+    resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
+    hasBin: true
+    peerDependencies:
+      eslint: '>=7.0.0'
+
+  eslint-config-standard-with-typescript@39.1.1:
+    resolution: {integrity: sha512-t6B5Ep8E4I18uuoYeYxINyqcXb2UbC0SOOTxRtBSt2JUs+EzeXbfe2oaiPs71AIdnoWhXDO2fYOHz8df3kV84A==}
+    deprecated: Please use eslint-config-love, instead.
+    peerDependencies:
+      '@typescript-eslint/eslint-plugin': ^6.4.0
+      eslint: ^8.0.1
+      eslint-plugin-import: ^2.25.2
+      eslint-plugin-n: '^15.0.0 || ^16.0.0 '
+      eslint-plugin-promise: ^6.0.0
+      typescript: '*'
+
+  eslint-config-standard@17.1.0:
+    resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      eslint: ^8.0.1
+      eslint-plugin-import: ^2.25.2
+      eslint-plugin-n: '^15.0.0 || ^16.0.0 '
+      eslint-plugin-promise: ^6.0.0
+
+  eslint-import-resolver-node@0.3.9:
+    resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+  eslint-module-utils@2.12.0:
+    resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: '*'
+      eslint-import-resolver-node: '*'
+      eslint-import-resolver-typescript: '*'
+      eslint-import-resolver-webpack: '*'
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+      eslint:
+        optional: true
+      eslint-import-resolver-node:
+        optional: true
+      eslint-import-resolver-typescript:
+        optional: true
+      eslint-import-resolver-webpack:
+        optional: true
+
+  eslint-plugin-es-x@7.8.0:
+    resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=8'
+
+  eslint-plugin-import@2.31.0:
+    resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+
+  eslint-plugin-n@16.6.2:
+    resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==}
+    engines: {node: '>=16.0.0'}
+    peerDependencies:
+      eslint: '>=7.0.0'
+
+  eslint-plugin-prettier@5.2.2:
+    resolution: {integrity: sha512-1yI3/hf35wmlq66C8yOyrujQnel+v5l1Vop5Cl2I6ylyNTT1JbuUUnV3/41PzwTzcyDp/oF0jWE3HXvcH5AQOQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      '@types/eslint': '>=8.0.0'
+      eslint: '>=8.0.0'
+      eslint-config-prettier: '*'
+      prettier: '>=3.0.0'
+    peerDependenciesMeta:
+      '@types/eslint':
+        optional: true
+      eslint-config-prettier:
+        optional: true
+
+  eslint-plugin-promise@6.6.0:
+    resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  eslint-plugin-vue@9.32.0:
+    resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  eslint-scope@5.1.1:
+    resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+    engines: {node: '>=8.0.0'}
+
+  eslint-scope@7.2.2:
+    resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  eslint-visitor-keys@3.4.3:
+    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  eslint@8.57.1:
+    resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+    hasBin: true
+
+  espree@9.6.1:
+    resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  esprima@4.0.1:
+    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  esquery@1.6.0:
+    resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+    engines: {node: '>=0.10'}
+
+  esrecurse@4.3.0:
+    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+    engines: {node: '>=4.0'}
+
+  estraverse@4.3.0:
+    resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+    engines: {node: '>=4.0'}
+
+  estraverse@5.3.0:
+    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+    engines: {node: '>=4.0'}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  esutils@2.0.3:
+    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+    engines: {node: '>=0.10.0'}
+
+  etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+
+  events@3.3.0:
+    resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+    engines: {node: '>=0.8.x'}
+
+  execa@5.1.1:
+    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+    engines: {node: '>=10'}
+
+  exif-parser@0.1.12:
+    resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==}
+
+  exit@0.1.2:
+    resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+    engines: {node: '>= 0.8.0'}
+
+  expect@27.5.1:
+    resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  express@4.21.2:
+    resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+    engines: {node: '>= 0.10.0'}
+
+  fast-deep-equal@3.1.3:
+    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+  fast-diff@1.3.0:
+    resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fast-json-stable-stringify@2.1.0:
+    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+  fast-levenshtein@2.0.6:
+    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+  fast-uri@3.0.5:
+    resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==}
+
+  fastq@1.18.0:
+    resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
+
+  fb-watchman@2.0.2:
+    resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
+  file-entry-cache@6.0.1:
+    resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+
+  file-type@9.0.0:
+    resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==}
+    engines: {node: '>=6'}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  finalhandler@1.3.1:
+    resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+    engines: {node: '>= 0.8'}
+
+  find-up@4.1.0:
+    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+    engines: {node: '>=8'}
+
+  find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+
+  flat-cache@3.2.0:
+    resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+
+  flatted@3.3.2:
+    resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
+
+  follow-redirects@1.15.9:
+    resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
+  for-each@0.3.3:
+    resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+  form-data@3.0.2:
+    resolution: {integrity: sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==}
+    engines: {node: '>= 6'}
+
+  forwarded@0.2.0:
+    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+    engines: {node: '>= 0.6'}
+
+  fraction.js@4.3.7:
+    resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+  fresh@0.5.2:
+    resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+    engines: {node: '>= 0.6'}
+
+  fs-extra@10.1.0:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
+
+  fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  function.prototype.name@1.1.8:
+    resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+    engines: {node: '>= 0.4'}
+
+  functions-have-names@1.2.3:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+  generic-names@4.0.0:
+    resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==}
+
+  gensync@1.0.0-beta.2:
+    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+    engines: {node: '>=6.9.0'}
+
+  get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
+  get-intrinsic@1.2.7:
+    resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
+    engines: {node: '>= 0.4'}
+
+  get-package-type@0.1.0:
+    resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+    engines: {node: '>=8.0.0'}
+
+  get-proto@1.0.1:
+    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+    engines: {node: '>= 0.4'}
+
+  get-stream@6.0.1:
+    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+    engines: {node: '>=10'}
+
+  get-symbol-description@1.1.0:
+    resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+    engines: {node: '>= 0.4'}
+
+  get-tsconfig@4.8.1:
+    resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob-parent@6.0.2:
+    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+    engines: {node: '>=10.13.0'}
+
+  glob-to-regexp@0.4.1:
+    resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+  glob@7.2.3:
+    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    deprecated: Glob versions prior to v9 are no longer supported
+
+  global@4.4.0:
+    resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
+
+  globals@11.12.0:
+    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+    engines: {node: '>=4'}
+
+  globals@13.24.0:
+    resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+    engines: {node: '>=8'}
+
+  globalthis@1.0.4:
+    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+    engines: {node: '>= 0.4'}
+
+  globby@11.1.0:
+    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+    engines: {node: '>=10'}
+
+  gopd@1.2.0:
+    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+    engines: {node: '>= 0.4'}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  graphemer@1.4.0:
+    resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+  has-bigints@1.1.0:
+    resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+    engines: {node: '>= 0.4'}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+  has-proto@1.2.0:
+    resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+    engines: {node: '>= 0.4'}
+
+  has-symbols@1.1.0:
+    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+    engines: {node: '>= 0.4'}
+
+  has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  hash-sum@2.0.0:
+    resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==}
+
+  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
+
+  html-encoding-sniffer@2.0.1:
+    resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==}
+    engines: {node: '>=10'}
+
+  html-escaper@2.0.2:
+    resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+  html-tags@3.3.1:
+    resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+    engines: {node: '>=8'}
+
+  http-errors@2.0.0:
+    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+    engines: {node: '>= 0.8'}
+
+  http-proxy-agent@4.0.1:
+    resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
+    engines: {node: '>= 6'}
+
+  https-proxy-agent@5.0.1:
+    resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+    engines: {node: '>= 6'}
+
+  human-signals@2.1.0:
+    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+    engines: {node: '>=10.17.0'}
+
+  iconv-lite@0.4.24:
+    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+    engines: {node: '>=0.10.0'}
+
+  icss-replace-symbols@1.1.0:
+    resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==}
+
+  icss-utils@5.1.0:
+    resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  ieee754@1.2.1:
+    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+  ignore@5.3.2:
+    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+    engines: {node: '>= 4'}
+
+  immutable@5.0.3:
+    resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==}
+
+  import-fresh@3.3.0:
+    resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+    engines: {node: '>=6'}
+
+  import-local@3.2.0:
+    resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  imurmurhash@0.1.4:
+    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+    engines: {node: '>=0.8.19'}
+
+  inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  internal-slot@1.1.0:
+    resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+    engines: {node: '>= 0.4'}
+
+  invert-kv@3.0.1:
+    resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==}
+    engines: {node: '>=8'}
+
+  ipaddr.js@1.9.1:
+    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+    engines: {node: '>= 0.10'}
+
+  is-array-buffer@3.0.5:
+    resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+    engines: {node: '>= 0.4'}
+
+  is-arrayish@0.2.1:
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+  is-async-function@2.1.0:
+    resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==}
+    engines: {node: '>= 0.4'}
+
+  is-bigint@1.1.0:
+    resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+    engines: {node: '>= 0.4'}
+
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  is-boolean-object@1.2.1:
+    resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==}
+    engines: {node: '>= 0.4'}
+
+  is-builtin-module@3.2.1:
+    resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
+    engines: {node: '>=6'}
+
+  is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+
+  is-core-module@2.16.1:
+    resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+    engines: {node: '>= 0.4'}
+
+  is-data-view@1.0.2:
+    resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+    engines: {node: '>= 0.4'}
+
+  is-date-object@1.1.0:
+    resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+    engines: {node: '>= 0.4'}
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-finalizationregistry@1.1.1:
+    resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+    engines: {node: '>= 0.4'}
+
+  is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  is-function@1.0.2:
+    resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
+
+  is-generator-fn@2.1.0:
+    resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+    engines: {node: '>=6'}
+
+  is-generator-function@1.1.0:
+    resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+    engines: {node: '>= 0.4'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-map@2.0.3:
+    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+
+  is-number-object@1.1.1:
+    resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+    engines: {node: '>= 0.4'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-path-inside@3.0.3:
+    resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+    engines: {node: '>=8'}
+
+  is-potential-custom-element-name@1.0.1:
+    resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+  is-regex@1.2.1:
+    resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+    engines: {node: '>= 0.4'}
+
+  is-set@2.0.3:
+    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+
+  is-shared-array-buffer@1.0.4:
+    resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+    engines: {node: '>= 0.4'}
+
+  is-stream@2.0.1:
+    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+    engines: {node: '>=8'}
+
+  is-string@1.1.1:
+    resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+    engines: {node: '>= 0.4'}
+
+  is-symbol@1.1.1:
+    resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+    engines: {node: '>= 0.4'}
+
+  is-typed-array@1.1.15:
+    resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+    engines: {node: '>= 0.4'}
+
+  is-typedarray@1.0.0:
+    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+
+  is-weakmap@2.0.2:
+    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+
+  is-weakref@1.1.0:
+    resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==}
+    engines: {node: '>= 0.4'}
+
+  is-weakset@2.0.4:
+    resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+    engines: {node: '>= 0.4'}
+
+  isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  istanbul-lib-coverage@3.2.2:
+    resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+    engines: {node: '>=8'}
+
+  istanbul-lib-instrument@5.2.1:
+    resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+    engines: {node: '>=8'}
+
+  istanbul-lib-report@3.0.1:
+    resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+    engines: {node: '>=10'}
+
+  istanbul-lib-source-maps@4.0.1:
+    resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+    engines: {node: '>=10'}
+
+  istanbul-reports@3.1.7:
+    resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+    engines: {node: '>=8'}
+
+  jest-changed-files@27.5.1:
+    resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-circus@27.5.1:
+    resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-cli@27.5.1:
+    resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  jest-config@27.5.1:
+    resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      ts-node:
+        optional: true
+
+  jest-diff@27.5.1:
+    resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-docblock@27.5.1:
+    resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-each@27.5.1:
+    resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-environment-jsdom@27.5.1:
+    resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-environment-node@27.5.1:
+    resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-get-type@27.5.1:
+    resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-haste-map@27.5.1:
+    resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-jasmine2@27.5.1:
+    resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-leak-detector@27.5.1:
+    resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-matcher-utils@27.5.1:
+    resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-message-util@27.5.1:
+    resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-mock@27.5.1:
+    resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-pnp-resolver@1.2.3:
+    resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+    engines: {node: '>=6'}
+    peerDependencies:
+      jest-resolve: '*'
+    peerDependenciesMeta:
+      jest-resolve:
+        optional: true
+
+  jest-regex-util@27.5.1:
+    resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-resolve-dependencies@27.5.1:
+    resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-resolve@27.5.1:
+    resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-runner@27.5.1:
+    resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-runtime@27.5.1:
+    resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-serializer@27.5.1:
+    resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-snapshot@27.5.1:
+    resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-util@27.5.1:
+    resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-validate@27.5.1:
+    resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-watcher@27.5.1:
+    resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-worker@27.5.1:
+    resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+    engines: {node: '>= 10.13.0'}
+
+  jest@27.0.4:
+    resolution: {integrity: sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  jimp@0.10.3:
+    resolution: {integrity: sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==}
+
+  jpeg-js@0.3.7:
+    resolution: {integrity: sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==}
+
+  js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  js-yaml@3.14.1:
+    resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+    hasBin: true
+
+  js-yaml@4.1.0:
+    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+    hasBin: true
+
+  jsdom@16.7.0:
+    resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      canvas: ^2.5.0
+    peerDependenciesMeta:
+      canvas:
+        optional: true
+
+  jsesc@3.0.2:
+    resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  jsesc@3.1.0:
+    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  json-buffer@3.0.1:
+    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+  json-parse-even-better-errors@2.3.1:
+    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+  json-schema-traverse@0.4.1:
+    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+  json-schema-traverse@1.0.0:
+    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+  json-stable-stringify-without-jsonify@1.0.1:
+    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+  json5@1.0.2:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
+
+  json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  jsonc-parser@3.3.1:
+    resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
+  jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+  keyv@4.5.4:
+    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+  kleur@3.0.3:
+    resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+    engines: {node: '>=6'}
+
+  lcid@3.1.1:
+    resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==}
+    engines: {node: '>=8'}
+
+  leven@3.1.0:
+    resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+    engines: {node: '>=6'}
+
+  levn@0.4.1:
+    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+    engines: {node: '>= 0.8.0'}
+
+  licia@1.46.0:
+    resolution: {integrity: sha512-Zms2AjJB+KdqUKFF87J5J/w9DwXnGN/lKlbjpRgvaPf0BIQ0mOZ/2lX4E79zwNafHGMUq5RtN54FN6Af5G92cA==}
+
+  lilconfig@2.1.0:
+    resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+    engines: {node: '>=10'}
+
+  lines-and-columns@1.2.4:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+  load-bmfont@1.4.2:
+    resolution: {integrity: sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==}
+
+  loader-runner@4.3.0:
+    resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
+    engines: {node: '>=6.11.5'}
+
+  loader-utils@3.3.1:
+    resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
+    engines: {node: '>= 12.13.0'}
+
+  localstorage-polyfill@1.0.1:
+    resolution: {integrity: sha512-m4iHVZxFH5734oQcPKU08025gIz2+4bjWR9lulP8ZYxEJR0BpA0w32oJmkzh8y3UI9ci7xCBehQDc3oA1X+VHw==}
+    engines: {node: '>=6'}
+
+  locate-path@5.0.0:
+    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+    engines: {node: '>=8'}
+
+  locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+
+  lodash.camelcase@4.3.0:
+    resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+  lodash.debounce@4.0.8:
+    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+  lodash.merge@4.6.2:
+    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+  magic-string@0.25.9:
+    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+
+  magic-string@0.30.17:
+    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+  make-dir@4.0.0:
+    resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+    engines: {node: '>=10'}
+
+  makeerror@1.0.12:
+    resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
+  math-intrinsics@1.1.0:
+    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+    engines: {node: '>= 0.4'}
+
+  media-typer@0.3.0:
+    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+    engines: {node: '>= 0.6'}
+
+  merge-descriptors@1.0.3:
+    resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+  merge-stream@2.0.0:
+    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  merge@2.1.1:
+    resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==}
+
+  methods@1.1.2:
+    resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+    engines: {node: '>= 0.6'}
+
+  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'}
+
+  mime@1.6.0:
+    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  mime@3.0.0:
+    resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
+    engines: {node: '>=10.0.0'}
+    hasBin: true
+
+  mimic-fn@2.1.0:
+    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+    engines: {node: '>=6'}
+
+  min-document@2.19.0:
+    resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
+
+  minimatch@3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+  minimatch@9.0.3:
+    resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimatch@9.0.5:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  mkdirp@0.5.6:
+    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+    hasBin: true
+
+  module-alias@2.2.3:
+    resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==}
+
+  ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  muggle-string@0.3.1:
+    resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==}
+
+  nanoid@3.3.8:
+    resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  natural-compare@1.4.0:
+    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+  negotiator@0.6.3:
+    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+    engines: {node: '>= 0.6'}
+
+  neo-async@2.6.2:
+    resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+  node-addon-api@7.1.1:
+    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+  node-int64@0.4.0:
+    resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+  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-range@0.1.2:
+    resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+    engines: {node: '>=0.10.0'}
+
+  npm-run-path@4.0.1:
+    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+    engines: {node: '>=8'}
+
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  nwsapi@2.2.16:
+    resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==}
+
+  object-inspect@1.13.3:
+    resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
+    engines: {node: '>= 0.4'}
+
+  object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+
+  object.assign@4.1.7:
+    resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+    engines: {node: '>= 0.4'}
+
+  object.fromentries@2.0.8:
+    resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+    engines: {node: '>= 0.4'}
+
+  object.groupby@1.0.3:
+    resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+    engines: {node: '>= 0.4'}
+
+  object.values@1.2.1:
+    resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+    engines: {node: '>= 0.4'}
+
+  omggif@1.0.10:
+    resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==}
+
+  on-finished@2.4.1:
+    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+    engines: {node: '>= 0.8'}
+
+  once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+  onetime@5.1.2:
+    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+    engines: {node: '>=6'}
+
+  optionator@0.9.4:
+    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+    engines: {node: '>= 0.8.0'}
+
+  os-locale-s-fix@1.0.8-fix-1:
+    resolution: {integrity: sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==}
+    engines: {node: '>=10', yarn: ^1.22.4}
+
+  own-keys@1.0.1:
+    resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+    engines: {node: '>= 0.4'}
+
+  p-limit@2.3.0:
+    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+    engines: {node: '>=6'}
+
+  p-limit@3.1.0:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+
+  p-locate@4.1.0:
+    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+    engines: {node: '>=8'}
+
+  p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+
+  p-try@2.2.0:
+    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+    engines: {node: '>=6'}
+
+  pako@1.0.11:
+    resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+
+  parent-module@1.0.1:
+    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+    engines: {node: '>=6'}
+
+  parse-bmfont-ascii@1.0.6:
+    resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==}
+
+  parse-bmfont-binary@1.0.6:
+    resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==}
+
+  parse-bmfont-xml@1.1.6:
+    resolution: {integrity: sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==}
+
+  parse-css-font@4.0.0:
+    resolution: {integrity: sha512-lnY7dTUfjRXsSo5G5C639L8RaBBaVSgL+5hacIFKsNHzeCJQ5SFSZv1DZmc7+wZv/22PFGOq2YbaEHLdaCS/mQ==}
+
+  parse-headers@2.0.5:
+    resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==}
+
+  parse-json@5.2.0:
+    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+    engines: {node: '>=8'}
+
+  parse5@6.0.1:
+    resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+
+  parseurl@1.3.3:
+    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+    engines: {node: '>= 0.8'}
+
+  path-browserify@1.0.1:
+    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+  path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  path-is-absolute@1.0.1:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-parse@1.0.7:
+    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+  path-to-regexp@0.1.12:
+    resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
+  path-type@4.0.0:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
+
+  phin@2.9.3:
+    resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==}
+    deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+
+  phin@3.7.1:
+    resolution: {integrity: sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==}
+    engines: {node: '>= 8'}
+
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  pify@2.3.0:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+
+  pinia-plugin-persistedstate@3.2.3:
+    resolution: {integrity: sha512-Cm819WBj/s5K5DGw55EwbXDtx+EZzM0YR5AZbq9XE3u0xvXwvX2JnWoFpWIcdzISBHqy9H1UiSIUmXyXqWsQRQ==}
+    peerDependencies:
+      pinia: ^2.0.0
+
+  pinia@2.3.0:
+    resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==}
+    peerDependencies:
+      typescript: '>=4.4.4'
+      vue: ^2.7.0 || ^3.5.11
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  pirates@4.0.6:
+    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+    engines: {node: '>= 6'}
+
+  pixelmatch@4.0.2:
+    resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==}
+    hasBin: true
+
+  pkg-dir@4.2.0:
+    resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+    engines: {node: '>=8'}
+
+  pngjs@3.4.0:
+    resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==}
+    engines: {node: '>=4.0.0'}
+
+  possible-typed-array-names@1.0.0:
+    resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+    engines: {node: '>= 0.4'}
+
+  postcss-import@14.1.0:
+    resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      postcss: ^8.0.0
+
+  postcss-load-config@3.1.4:
+    resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
+    engines: {node: '>= 10'}
+    peerDependencies:
+      postcss: '>=8.0.9'
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+      ts-node:
+        optional: true
+
+  postcss-modules-extract-imports@3.1.0:
+    resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-modules-local-by-default@4.2.0:
+    resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-modules-scope@3.2.1:
+    resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-modules-values@4.0.0:
+    resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-modules@4.3.1:
+    resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==}
+    peerDependencies:
+      postcss: ^8.0.0
+
+  postcss-selector-parser@6.1.2:
+    resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+    engines: {node: '>=4'}
+
+  postcss-selector-parser@7.0.0:
+    resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==}
+    engines: {node: '>=4'}
+
+  postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+  postcss@8.5.1:
+    resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  prelude-ls@1.2.1:
+    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+    engines: {node: '>= 0.8.0'}
+
+  prettier-linter-helpers@1.0.0:
+    resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+    engines: {node: '>=6.0.0'}
+
+  prettier@3.4.2:
+    resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  pretty-format@27.5.1:
+    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+
+  prompts@2.4.2:
+    resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+    engines: {node: '>= 6'}
+
+  proxy-addr@2.0.7:
+    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+    engines: {node: '>= 0.10'}
+
+  psl@1.15.0:
+    resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
+
+  punycode@2.3.1:
+    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+    engines: {node: '>=6'}
+
+  qrcode-reader@1.0.4:
+    resolution: {integrity: sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==}
+
+  qrcode-terminal@0.12.0:
+    resolution: {integrity: sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==}
+    hasBin: true
+
+  qs@6.13.0:
+    resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+    engines: {node: '>=0.6'}
+
+  qs@6.14.0:
+    resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+    engines: {node: '>=0.6'}
+
+  querystringify@2.2.0:
+    resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+  range-parser@1.2.1:
+    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+    engines: {node: '>= 0.6'}
+
+  raw-body@2.5.2:
+    resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+    engines: {node: '>= 0.8'}
+
+  react-is@17.0.2:
+    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+  read-cache@1.0.0:
+    resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  readdirp@4.1.1:
+    resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==}
+    engines: {node: '>= 14.18.0'}
+
+  reflect.getprototypeof@1.0.10:
+    resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+    engines: {node: '>= 0.4'}
+
+  regenerate-unicode-properties@10.2.0:
+    resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
+    engines: {node: '>=4'}
+
+  regenerate@1.4.2:
+    resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+  regenerator-runtime@0.13.11:
+    resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+
+  regenerator-runtime@0.14.1:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+  regenerator-transform@0.15.2:
+    resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+
+  regexp.prototype.flags@1.5.4:
+    resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+    engines: {node: '>= 0.4'}
+
+  regexpu-core@6.2.0:
+    resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==}
+    engines: {node: '>=4'}
+
+  regjsgen@0.8.0:
+    resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+  regjsparser@0.12.0:
+    resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==}
+    hasBin: true
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  require-from-string@2.0.2:
+    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+    engines: {node: '>=0.10.0'}
+
+  requires-port@1.0.0:
+    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
+  resolve-cwd@3.0.0:
+    resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+    engines: {node: '>=8'}
+
+  resolve-from@4.0.0:
+    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+    engines: {node: '>=4'}
+
+  resolve-from@5.0.0:
+    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+    engines: {node: '>=8'}
+
+  resolve-pkg-maps@1.0.0:
+    resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+  resolve.exports@1.1.1:
+    resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==}
+    engines: {node: '>=10'}
+
+  resolve@1.22.10:
+    resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+    engines: {node: '>= 0.4'}
+    hasBin: true
+
+  reusify@1.0.4:
+    resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  rimraf@3.0.2:
+    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
+    hasBin: true
+
+  rollup@3.29.5:
+    resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==}
+    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  safe-area-insets@1.4.1:
+    resolution: {integrity: sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ==}
+
+  safe-array-concat@1.1.3:
+    resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+    engines: {node: '>=0.4'}
+
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  safe-push-apply@1.0.0:
+    resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+    engines: {node: '>= 0.4'}
+
+  safe-regex-test@1.1.0:
+    resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+    engines: {node: '>= 0.4'}
+
+  safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  sass-loader@13.3.3:
+    resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==}
+    engines: {node: '>= 14.15.0'}
+    peerDependencies:
+      fibers: '>= 3.1.0'
+      node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+      sass: ^1.3.0
+      sass-embedded: '*'
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      fibers:
+        optional: true
+      node-sass:
+        optional: true
+      sass:
+        optional: true
+      sass-embedded:
+        optional: true
+
+  sass@1.83.4:
+    resolution: {integrity: sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  sax@1.4.1:
+    resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+
+  saxes@5.0.1:
+    resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
+    engines: {node: '>=10'}
+
+  schema-utils@3.3.0:
+    resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
+    engines: {node: '>= 10.13.0'}
+
+  schema-utils@4.3.0:
+    resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==}
+    engines: {node: '>= 10.13.0'}
+
+  semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
+  semver@7.6.3:
+    resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  send@0.19.0:
+    resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+    engines: {node: '>= 0.8.0'}
+
+  serialize-javascript@6.0.2:
+    resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+  serve-static@1.16.2:
+    resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+    engines: {node: '>= 0.8.0'}
+
+  set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
+
+  set-function-name@2.0.2:
+    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+    engines: {node: '>= 0.4'}
+
+  set-proto@1.0.0:
+    resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+    engines: {node: '>= 0.4'}
+
+  setprototypeof@1.2.0:
+    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+  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'}
+
+  side-channel-list@1.0.0:
+    resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-map@1.0.1:
+    resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-weakmap@1.0.2:
+    resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+    engines: {node: '>= 0.4'}
+
+  side-channel@1.1.0:
+    resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+    engines: {node: '>= 0.4'}
+
+  signal-exit@3.0.7:
+    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+  sisteransi@1.0.5:
+    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+  slash@3.0.0:
+    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+    engines: {node: '>=8'}
+
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+  source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.7.4:
+    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+    engines: {node: '>= 8'}
+
+  sourcemap-codec@1.4.8:
+    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
+
+  sprintf-js@1.0.3:
+    resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+  stack-utils@2.0.6:
+    resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+    engines: {node: '>=10'}
+
+  statuses@2.0.1:
+    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+    engines: {node: '>= 0.8'}
+
+  string-hash@1.1.3:
+    resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
+
+  string-length@4.0.2:
+    resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+    engines: {node: '>=10'}
+
+  string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  string.prototype.trim@1.2.10:
+    resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimend@1.0.9:
+    resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimstart@1.0.8:
+    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+    engines: {node: '>= 0.4'}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-bom@3.0.0:
+    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+    engines: {node: '>=4'}
+
+  strip-bom@4.0.0:
+    resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+    engines: {node: '>=8'}
+
+  strip-final-newline@2.0.0:
+    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+    engines: {node: '>=6'}
+
+  strip-json-comments@3.1.1:
+    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+    engines: {node: '>=8'}
+
+  supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
+  supports-hyperlinks@2.3.0:
+    resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+    engines: {node: '>=8'}
+
+  supports-preserve-symlinks-flag@1.0.0:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+
+  svg-tags@1.0.0:
+    resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+
+  symbol-tree@3.2.4:
+    resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
+  synckit@0.9.2:
+    resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
+  systemjs@6.15.1:
+    resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==}
+
+  tapable@2.2.1:
+    resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+    engines: {node: '>=6'}
+
+  terminal-link@2.1.1:
+    resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
+    engines: {node: '>=8'}
+
+  terser-webpack-plugin@5.3.11:
+    resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==}
+    engines: {node: '>= 10.13.0'}
+    peerDependencies:
+      '@swc/core': '*'
+      esbuild: '*'
+      uglify-js: '*'
+      webpack: ^5.1.0
+    peerDependenciesMeta:
+      '@swc/core':
+        optional: true
+      esbuild:
+        optional: true
+      uglify-js:
+        optional: true
+
+  terser@5.37.0:
+    resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  test-exclude@6.0.0:
+    resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+    engines: {node: '>=8'}
+
+  text-table@0.2.0:
+    resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+  throat@6.0.2:
+    resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==}
+
+  timm@1.7.1:
+    resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==}
+
+  tinycolor2@1.6.0:
+    resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
+
+  tmpl@1.0.5:
+    resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  toidentifier@1.0.1:
+    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+    engines: {node: '>=0.6'}
+
+  tough-cookie@4.1.4:
+    resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
+    engines: {node: '>=6'}
+
+  tr46@2.1.0:
+    resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==}
+    engines: {node: '>=8'}
+
+  ts-api-utils@1.4.3:
+    resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      typescript: '>=4.2.0'
+
+  tsconfig-paths@3.15.0:
+    resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+  type-check@0.4.0:
+    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+    engines: {node: '>= 0.8.0'}
+
+  type-detect@4.0.8:
+    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+    engines: {node: '>=4'}
+
+  type-fest@0.20.2:
+    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+    engines: {node: '>=10'}
+
+  type-fest@0.21.3:
+    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+    engines: {node: '>=10'}
+
+  type-is@1.6.18:
+    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+    engines: {node: '>= 0.6'}
+
+  typed-array-buffer@1.0.3:
+    resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-length@1.0.3:
+    resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-offset@1.0.4:
+    resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-length@1.0.7:
+    resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+    engines: {node: '>= 0.4'}
+
+  typedarray-to-buffer@3.1.5:
+    resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+
+  typescript@5.7.3:
+    resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  unbox-primitive@1.1.0:
+    resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+    engines: {node: '>= 0.4'}
+
+  undici-types@6.19.8:
+    resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+  unicode-canonical-property-names-ecmascript@2.0.1:
+    resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+    engines: {node: '>=4'}
+
+  unicode-match-property-ecmascript@2.0.0:
+    resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+    engines: {node: '>=4'}
+
+  unicode-match-property-value-ecmascript@2.2.0:
+    resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==}
+    engines: {node: '>=4'}
+
+  unicode-property-aliases-ecmascript@2.1.0:
+    resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+    engines: {node: '>=4'}
+
+  universalify@0.2.0:
+    resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+    engines: {node: '>= 4.0.0'}
+
+  universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  unpipe@1.0.0:
+    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+    engines: {node: '>= 0.8'}
+
+  unquote@1.1.1:
+    resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==}
+
+  update-browserslist-db@1.1.2:
+    resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+
+  uri-js@4.4.1:
+    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+  url-parse@1.5.10:
+    resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+
+  utif@2.0.1:
+    resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==}
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  utils-merge@1.0.1:
+    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+    engines: {node: '>= 0.4.0'}
+
+  v8-to-istanbul@8.1.1:
+    resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==}
+    engines: {node: '>=10.12.0'}
+
+  vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+
+  vite@4.1.5:
+    resolution: {integrity: sha512-zJ0RiVkf61kpd7O+VtU6r766xgnTaIknP/lR6sJTZq3HtVJ3HGnTo5DaJhTUtYoTyS/CQwZ6yEVdc/lrmQT7dQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': '>= 14'
+      less: '*'
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+
+  vue-demi@0.14.10:
+    resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+
+  vue-eslint-parser@9.4.3:
+    resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  vue-i18n@9.14.2:
+    resolution: {integrity: sha512-JK9Pm80OqssGJU2Y6F7DcM8RFHqVG4WkuCqOZTVsXkEzZME7ABejAUqUdA931zEBedc4thBgSUWxeQh4uocJAQ==}
+    engines: {node: '>= 16'}
+    peerDependencies:
+      vue: ^3.0.0
+
+  vue-router@4.5.0:
+    resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  vue-template-compiler@2.7.16:
+    resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==}
+
+  vue-tsc@1.8.27:
+    resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==}
+    hasBin: true
+    peerDependencies:
+      typescript: '*'
+
+  vue@3.5.13:
+    resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  w3c-hr-time@1.0.2:
+    resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
+    deprecated: Use your platform's native performance.now() and performance.timeOrigin.
+
+  w3c-xmlserializer@2.0.0:
+    resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==}
+    engines: {node: '>=10'}
+
+  walker@1.0.8:
+    resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
+  watchpack@2.4.2:
+    resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
+    engines: {node: '>=10.13.0'}
+
+  webidl-conversions@5.0.0:
+    resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==}
+    engines: {node: '>=8'}
+
+  webidl-conversions@6.1.0:
+    resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==}
+    engines: {node: '>=10.4'}
+
+  webpack-sources@3.2.3:
+    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+    engines: {node: '>=10.13.0'}
+
+  webpack@5.97.1:
+    resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    peerDependencies:
+      webpack-cli: '*'
+    peerDependenciesMeta:
+      webpack-cli:
+        optional: true
+
+  whatwg-encoding@1.0.5:
+    resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==}
+
+  whatwg-mimetype@2.3.0:
+    resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==}
+
+  whatwg-url@8.7.0:
+    resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==}
+    engines: {node: '>=10'}
+
+  which-boxed-primitive@1.1.1:
+    resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+    engines: {node: '>= 0.4'}
+
+  which-builtin-type@1.2.1:
+    resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+    engines: {node: '>= 0.4'}
+
+  which-collection@1.0.2:
+    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
+
+  which-typed-array@1.1.18:
+    resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==}
+    engines: {node: '>= 0.4'}
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  word-wrap@1.2.5:
+    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+    engines: {node: '>=0.10.0'}
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+  write-file-atomic@3.0.3:
+    resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+
+  ws@7.5.10:
+    resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+    engines: {node: '>=8.3.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: ^5.0.2
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+
+  ws@8.18.0:
+    resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: '>=5.0.2'
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+
+  xhr@2.6.0:
+    resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==}
+
+  xml-name-validator@3.0.0:
+    resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
+
+  xml-name-validator@4.0.0:
+    resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+    engines: {node: '>=12'}
+
+  xml-parse-from-string@1.0.1:
+    resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==}
+
+  xml2js@0.5.0:
+    resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==}
+    engines: {node: '>=4.0.0'}
+
+  xmlbuilder@11.0.1:
+    resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
+    engines: {node: '>=4.0'}
+
+  xmlchars@2.2.0:
+    resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
+  xmlhttprequest@1.8.0:
+    resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==}
+    engines: {node: '>=0.4.0'}
+
+  xregexp@3.1.0:
+    resolution: {integrity: sha512-4Y1x6DyB8xRoxosooa6PlGWqmmSKatbzhrftZ7Purmm4B8R4qIEJG1A2hZsdz5DhmIqS0msC0I7KEq93GphEVg==}
+
+  xtend@4.0.2:
+    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+    engines: {node: '>=0.4'}
+
+  y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+
+  yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+  yaml@1.10.2:
+    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+    engines: {node: '>= 6'}
+
+  yargs-parser@20.2.9:
+    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+    engines: {node: '>=10'}
+
+  yargs@16.2.0:
+    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+    engines: {node: '>=10'}
+
+  yocto-queue@0.1.0:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
+
+snapshots:
+
+  '@ampproject/remapping@2.3.0':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@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.5': {}
+
+  '@babel/core@7.26.0':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.5
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+      '@babel/helpers': 7.26.0
+      '@babel/parser': 7.26.5
+      '@babel/template': 7.25.9
+      '@babel/traverse': 7.26.5
+      '@babel/types': 7.26.5
+      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.5':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@babel/types': 7.26.5
+      '@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.5
+
+  '@babel/helper-compilation-targets@7.26.5':
+    dependencies:
+      '@babel/compat-data': 7.26.5
+      '@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.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@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.0)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/traverse': 7.26.5
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-annotate-as-pure': 7.25.9
+      regexpu-core: 6.2.0
+      semver: 6.3.1
+
+  '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-plugin-utils': 7.26.5
+      debug: 4.4.0
+      lodash.debounce: 4.0.8
+      resolve: 1.22.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-member-expression-to-functions@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.26.5
+      '@babel/types': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-imports@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.26.5
+      '@babel/types': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-optimise-call-expression@7.25.9':
+    dependencies:
+      '@babel/types': 7.26.5
+
+  '@babel/helper-plugin-utils@7.26.5': {}
+
+  '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-wrap-function': 7.25.9
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-member-expression-to-functions': 7.25.9
+      '@babel/helper-optimise-call-expression': 7.25.9
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.26.5
+      '@babel/types': 7.26.5
+    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/helper-wrap-function@7.25.9':
+    dependencies:
+      '@babel/template': 7.25.9
+      '@babel/traverse': 7.26.5
+      '@babel/types': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helpers@7.26.0':
+    dependencies:
+      '@babel/template': 7.25.9
+      '@babel/types': 7.26.5
+
+  '@babel/parser@7.26.5':
+    dependencies:
+      '@babel/types': 7.26.5
+
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+
+  '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0)
+      '@babel/traverse': 7.26.5
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/template': 7.25.9
+
+  '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/traverse': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+
+  '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      regenerator-transform: 0.15.2
+
+  '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-typescript@7.26.5(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+      '@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.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/preset-env@7.26.0(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/compat-data': 7.26.5
+      '@babel/core': 7.26.0
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-validator-option': 7.25.9
+      '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)
+      '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0)
+      '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+      '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0)
+      '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.0)
+      '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0)
+      '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0)
+      '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0)
+      '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.0)
+      '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0)
+      '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0)
+      '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0)
+      '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0)
+      babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0)
+      babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0)
+      babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0)
+      core-js-compat: 3.40.0
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/types': 7.26.5
+      esutils: 2.0.3
+
+  '@babel/runtime@7.26.0':
+    dependencies:
+      regenerator-runtime: 0.14.1
+
+  '@babel/template@7.25.9':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/parser': 7.26.5
+      '@babel/types': 7.26.5
+
+  '@babel/traverse@7.26.5':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.5
+      '@babel/parser': 7.26.5
+      '@babel/template': 7.25.9
+      '@babel/types': 7.26.5
+      debug: 4.4.0
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/types@7.26.5':
+    dependencies:
+      '@babel/helper-string-parser': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+
+  '@bcoe/v8-coverage@0.2.3': {}
+
+  '@climblee/uv-ui@1.1.20': {}
+
+  '@dcloudio/types@3.4.14': {}
+
+  '@dcloudio/uni-app-plus@3.0.0-3081220230817001(postcss@8.5.1)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-app-uts': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-app-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-app-vue': 3.0.0-3081220230817001
+      debug: 4.4.0
+      fs-extra: 10.1.0
+      licia: 1.46.0
+      postcss-selector-parser: 6.1.2
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vite
+      - vue
+
+  '@dcloudio/uni-app-uts@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@babel/types': 7.26.5
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+      '@dcloudio/uni-nvue-styler': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@rollup/pluginutils': 4.2.1
+      '@vue/compiler-core': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/shared': 3.2.47
+      debug: 4.4.0
+      es-module-lexer: 1.6.0
+      fs-extra: 10.1.0
+      picocolors: 1.1.1
+      source-map: 0.6.1
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-app-vite@3.0.0-3081220230817001(postcss@8.5.1)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+      '@dcloudio/uni-nvue-styler': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@rollup/pluginutils': 4.2.1
+      '@vitejs/plugin-vue': 4.6.2(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      debug: 4.4.0
+      fs-extra: 10.1.0
+      picocolors: 1.1.1
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vite
+      - vue
+
+  '@dcloudio/uni-app-vue@3.0.0-3081220230817001': {}
+
+  '@dcloudio/uni-app@3.0.0-3081220230817001(@dcloudio/types@3.4.14)(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/types': 3.4.14
+      '@dcloudio/uni-cloud': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-components': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+      '@dcloudio/uni-push': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@dcloudio/uni-stat': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@vue/shared': 3.2.47
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-automator@3.0.0-3081220230817001(jest-environment-node@27.5.1)(jest@27.0.4)(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      address: 1.2.2
+      cross-env: 7.0.3
+      debug: 4.4.0
+      default-gateway: 6.0.3
+      fs-extra: 10.1.0
+      jest: 27.0.4
+      jest-environment-node: 27.5.1
+      jsonc-parser: 3.3.1
+      licia: 1.46.0
+      qrcode-reader: 1.0.4
+      qrcode-terminal: 0.12.0
+      ws: 8.18.0
+    transitivePeerDependencies:
+      - bufferutil
+      - postcss
+      - supports-color
+      - ts-node
+      - utf-8-validate
+      - vue
+
+  '@dcloudio/uni-cli-shared@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@babel/core': 7.26.0
+      '@babel/parser': 7.26.5
+      '@babel/types': 7.26.5
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@intlify/core-base': 9.1.9
+      '@intlify/shared': 9.1.9
+      '@intlify/vue-devtools': 9.1.9
+      '@rollup/pluginutils': 4.2.1
+      '@vue/compiler-core': 3.2.47
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/server-renderer': 3.2.47(vue@3.5.13(typescript@5.7.3))
+      '@vue/shared': 3.2.47
+      autoprefixer: 10.4.20(postcss@8.5.1)
+      base64url: 3.0.1
+      chokidar: 3.6.0
+      compare-versions: 3.6.0
+      debug: 4.4.0
+      es-module-lexer: 1.6.0
+      esbuild: 0.17.19
+      estree-walker: 2.0.2
+      fast-glob: 3.3.3
+      fs-extra: 10.1.0
+      hash-sum: 2.0.0
+      jsonc-parser: 3.3.1
+      magic-string: 0.30.17
+      merge: 2.1.1
+      mime: 3.0.0
+      module-alias: 2.2.3
+      os-locale-s-fix: 1.0.8-fix-1
+      picocolors: 1.1.1
+      postcss-import: 14.1.0(postcss@8.5.1)
+      postcss-load-config: 3.1.4(postcss@8.5.1)
+      postcss-modules: 4.3.1(postcss@8.5.1)
+      postcss-selector-parser: 6.1.2
+      resolve: 1.22.10
+      tapable: 2.2.1
+      xregexp: 3.1.0
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-cloud@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/shared': 3.2.47
+      fast-glob: 3.3.3
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-components@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cloud': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-h5': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-h5-vite@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@rollup/pluginutils': 4.2.1
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/server-renderer': 3.2.47(vue@3.5.13(typescript@5.7.3))
+      '@vue/shared': 3.2.47
+      debug: 4.4.0
+      fs-extra: 10.1.0
+      mime: 3.0.0
+      module-alias: 2.2.3
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-h5-vue@3.0.0-3081220230817001(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/server-renderer': 3.2.47(vue@3.5.13(typescript@5.7.3))
+    transitivePeerDependencies:
+      - vue
+
+  '@dcloudio/uni-h5@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-h5-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-h5-vue': 3.0.0-3081220230817001(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/server-renderer': 3.2.47(vue@3.5.13(typescript@5.7.3))
+      '@vue/shared': 3.2.47
+      debug: 4.4.0
+      localstorage-polyfill: 1.0.1
+      postcss-selector-parser: 6.1.2
+      safe-area-insets: 1.4.1
+      vue-router: 4.5.0(vue@3.5.13(typescript@5.7.3))
+      xmlhttprequest: 1.8.0
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-i18n@3.0.0-3081220230817001': {}
+
+  '@dcloudio/uni-mp-alipay@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-mp-baidu@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-compiler': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-mp-weixin': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+      jimp: 0.10.3
+      licia: 1.46.0
+      qrcode-reader: 1.0.4
+      qrcode-terminal: 0.12.0
+      ws: 8.18.0
+    transitivePeerDependencies:
+      - bufferutil
+      - debug
+      - postcss
+      - supports-color
+      - ts-node
+      - utf-8-validate
+      - vue
+
+  '@dcloudio/uni-mp-compiler@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@babel/generator': 7.26.5
+      '@babel/parser': 7.26.5
+      '@babel/types': 7.26.5
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/compiler-core': 3.2.47
+      '@vue/compiler-dom': 3.2.47
+      '@vue/shared': 3.2.47
+      estree-walker: 2.0.2
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-mp-jd@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-compiler': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/shared': 3.2.47
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-mp-kuaishou@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-compiler': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-mp-weixin': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+    transitivePeerDependencies:
+      - bufferutil
+      - debug
+      - postcss
+      - supports-color
+      - ts-node
+      - utf-8-validate
+      - vue
+
+  '@dcloudio/uni-mp-lark@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-compiler': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-toutiao': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-mp-qq@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/shared': 3.2.47
+      fs-extra: 10.1.0
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-mp-toutiao@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-compiler': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-mp-vite@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-i18n': 3.0.0-3081220230817001
+      '@dcloudio/uni-mp-compiler': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/shared': 3.2.47
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-mp-vue@3.0.0-3081220230817001':
+    dependencies:
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/shared': 3.2.47
+
+  '@dcloudio/uni-mp-weixin@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/shared': 3.2.47
+      jimp: 0.10.3
+      licia: 1.46.0
+      qrcode-reader: 1.0.4
+      qrcode-terminal: 0.12.0
+      ws: 8.18.0
+    transitivePeerDependencies:
+      - bufferutil
+      - debug
+      - postcss
+      - supports-color
+      - ts-node
+      - utf-8-validate
+      - vue
+
+  '@dcloudio/uni-nvue-styler@3.0.0-3081220230817001':
+    dependencies:
+      '@vue/shared': 3.2.47
+      parse-css-font: 4.0.0
+      postcss: 8.5.1
+
+  '@dcloudio/uni-push@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-quickapp-webview@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vite': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-mp-vue': 3.0.0-3081220230817001
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@vue/shared': 3.2.47
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-shared@3.0.0-3081220230817001':
+    dependencies:
+      '@vue/shared': 3.2.47
+
+  '@dcloudio/uni-stacktracey@3.0.0-3081220230817001': {}
+
+  '@dcloudio/uni-stat@3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@dcloudio/uni-ui@1.5.7': {}
+
+  '@dcloudio/vite-plugin-uni@3.0.0-3081220230817001(postcss@8.5.1)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0)
+      '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.26.0)
+      '@dcloudio/uni-cli-shared': 3.0.0-3081220230817001(postcss@8.5.1)(vue@3.5.13(typescript@5.7.3))
+      '@dcloudio/uni-shared': 3.0.0-3081220230817001
+      '@rollup/pluginutils': 4.2.1
+      '@vitejs/plugin-legacy': 4.1.1(terser@5.37.0)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))
+      '@vitejs/plugin-vue': 4.6.2(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))
+      '@vitejs/plugin-vue-jsx': 3.1.0(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))
+      '@vue/compiler-core': 3.2.47
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/shared': 3.2.47
+      cac: 6.7.9
+      debug: 4.4.0
+      estree-walker: 2.0.2
+      express: 4.21.2
+      fast-glob: 3.3.3
+      fs-extra: 10.1.0
+      hash-sum: 2.0.0
+      jsonc-parser: 3.3.1
+      magic-string: 0.30.17
+      picocolors: 1.1.1
+      terser: 5.37.0
+      vite: 4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0)
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - ts-node
+      - vue
+
+  '@esbuild/android-arm64@0.16.17':
+    optional: true
+
+  '@esbuild/android-arm64@0.17.19':
+    optional: true
+
+  '@esbuild/android-arm@0.16.17':
+    optional: true
+
+  '@esbuild/android-arm@0.17.19':
+    optional: true
+
+  '@esbuild/android-x64@0.16.17':
+    optional: true
+
+  '@esbuild/android-x64@0.17.19':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.16.17':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.17.19':
+    optional: true
+
+  '@esbuild/darwin-x64@0.16.17':
+    optional: true
+
+  '@esbuild/darwin-x64@0.17.19':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.16.17':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.17.19':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.16.17':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.17.19':
+    optional: true
+
+  '@esbuild/linux-arm64@0.16.17':
+    optional: true
+
+  '@esbuild/linux-arm64@0.17.19':
+    optional: true
+
+  '@esbuild/linux-arm@0.16.17':
+    optional: true
+
+  '@esbuild/linux-arm@0.17.19':
+    optional: true
+
+  '@esbuild/linux-ia32@0.16.17':
+    optional: true
+
+  '@esbuild/linux-ia32@0.17.19':
+    optional: true
+
+  '@esbuild/linux-loong64@0.16.17':
+    optional: true
+
+  '@esbuild/linux-loong64@0.17.19':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.16.17':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.17.19':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.16.17':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.17.19':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.16.17':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.17.19':
+    optional: true
+
+  '@esbuild/linux-s390x@0.16.17':
+    optional: true
+
+  '@esbuild/linux-s390x@0.17.19':
+    optional: true
+
+  '@esbuild/linux-x64@0.16.17':
+    optional: true
+
+  '@esbuild/linux-x64@0.17.19':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.16.17':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.17.19':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.16.17':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.17.19':
+    optional: true
+
+  '@esbuild/sunos-x64@0.16.17':
+    optional: true
+
+  '@esbuild/sunos-x64@0.17.19':
+    optional: true
+
+  '@esbuild/win32-arm64@0.16.17':
+    optional: true
+
+  '@esbuild/win32-arm64@0.17.19':
+    optional: true
+
+  '@esbuild/win32-ia32@0.16.17':
+    optional: true
+
+  '@esbuild/win32-ia32@0.17.19':
+    optional: true
+
+  '@esbuild/win32-x64@0.16.17':
+    optional: true
+
+  '@esbuild/win32-x64@0.17.19':
+    optional: true
+
+  '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)':
+    dependencies:
+      eslint: 8.57.1
+      eslint-visitor-keys: 3.4.3
+
+  '@eslint-community/regexpp@4.12.1': {}
+
+  '@eslint/eslintrc@2.1.4':
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.4.0
+      espree: 9.6.1
+      globals: 13.24.0
+      ignore: 5.3.2
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/js@8.57.1': {}
+
+  '@humanwhocodes/config-array@0.13.0':
+    dependencies:
+      '@humanwhocodes/object-schema': 2.0.3
+      debug: 4.4.0
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@humanwhocodes/module-importer@1.0.1': {}
+
+  '@humanwhocodes/object-schema@2.0.3': {}
+
+  '@intlify/core-base@9.1.9':
+    dependencies:
+      '@intlify/devtools-if': 9.1.9
+      '@intlify/message-compiler': 9.1.9
+      '@intlify/message-resolver': 9.1.9
+      '@intlify/runtime': 9.1.9
+      '@intlify/shared': 9.1.9
+      '@intlify/vue-devtools': 9.1.9
+
+  '@intlify/core-base@9.14.2':
+    dependencies:
+      '@intlify/message-compiler': 9.14.2
+      '@intlify/shared': 9.14.2
+
+  '@intlify/devtools-if@9.1.9':
+    dependencies:
+      '@intlify/shared': 9.1.9
+
+  '@intlify/message-compiler@9.1.9':
+    dependencies:
+      '@intlify/message-resolver': 9.1.9
+      '@intlify/shared': 9.1.9
+      source-map: 0.6.1
+
+  '@intlify/message-compiler@9.14.2':
+    dependencies:
+      '@intlify/shared': 9.14.2
+      source-map-js: 1.2.1
+
+  '@intlify/message-resolver@9.1.9': {}
+
+  '@intlify/runtime@9.1.9':
+    dependencies:
+      '@intlify/message-compiler': 9.1.9
+      '@intlify/message-resolver': 9.1.9
+      '@intlify/shared': 9.1.9
+
+  '@intlify/shared@9.1.9': {}
+
+  '@intlify/shared@9.14.2': {}
+
+  '@intlify/vue-devtools@9.1.9':
+    dependencies:
+      '@intlify/message-resolver': 9.1.9
+      '@intlify/runtime': 9.1.9
+      '@intlify/shared': 9.1.9
+
+  '@istanbuljs/load-nyc-config@1.1.0':
+    dependencies:
+      camelcase: 5.3.1
+      find-up: 4.1.0
+      get-package-type: 0.1.0
+      js-yaml: 3.14.1
+      resolve-from: 5.0.0
+
+  '@istanbuljs/schema@0.1.3': {}
+
+  '@jest/console@27.5.1':
+    dependencies:
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      chalk: 4.1.2
+      jest-message-util: 27.5.1
+      jest-util: 27.5.1
+      slash: 3.0.0
+
+  '@jest/core@27.5.1':
+    dependencies:
+      '@jest/console': 27.5.1
+      '@jest/reporters': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      emittery: 0.8.1
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      jest-changed-files: 27.5.1
+      jest-config: 27.5.1
+      jest-haste-map: 27.5.1
+      jest-message-util: 27.5.1
+      jest-regex-util: 27.5.1
+      jest-resolve: 27.5.1
+      jest-resolve-dependencies: 27.5.1
+      jest-runner: 27.5.1
+      jest-runtime: 27.5.1
+      jest-snapshot: 27.5.1
+      jest-util: 27.5.1
+      jest-validate: 27.5.1
+      jest-watcher: 27.5.1
+      micromatch: 4.0.8
+      rimraf: 3.0.2
+      slash: 3.0.0
+      strip-ansi: 6.0.1
+    transitivePeerDependencies:
+      - bufferutil
+      - canvas
+      - supports-color
+      - ts-node
+      - utf-8-validate
+
+  '@jest/environment@27.5.1':
+    dependencies:
+      '@jest/fake-timers': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      jest-mock: 27.5.1
+
+  '@jest/fake-timers@27.5.1':
+    dependencies:
+      '@jest/types': 27.5.1
+      '@sinonjs/fake-timers': 8.1.0
+      '@types/node': 20.17.14
+      jest-message-util: 27.5.1
+      jest-mock: 27.5.1
+      jest-util: 27.5.1
+
+  '@jest/globals@27.5.1':
+    dependencies:
+      '@jest/environment': 27.5.1
+      '@jest/types': 27.5.1
+      expect: 27.5.1
+
+  '@jest/reporters@27.5.1':
+    dependencies:
+      '@bcoe/v8-coverage': 0.2.3
+      '@jest/console': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      chalk: 4.1.2
+      collect-v8-coverage: 1.0.2
+      exit: 0.1.2
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      istanbul-lib-coverage: 3.2.2
+      istanbul-lib-instrument: 5.2.1
+      istanbul-lib-report: 3.0.1
+      istanbul-lib-source-maps: 4.0.1
+      istanbul-reports: 3.1.7
+      jest-haste-map: 27.5.1
+      jest-resolve: 27.5.1
+      jest-util: 27.5.1
+      jest-worker: 27.5.1
+      slash: 3.0.0
+      source-map: 0.6.1
+      string-length: 4.0.2
+      terminal-link: 2.1.1
+      v8-to-istanbul: 8.1.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jest/source-map@27.5.1':
+    dependencies:
+      callsites: 3.1.0
+      graceful-fs: 4.2.11
+      source-map: 0.6.1
+
+  '@jest/test-result@27.5.1':
+    dependencies:
+      '@jest/console': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/istanbul-lib-coverage': 2.0.6
+      collect-v8-coverage: 1.0.2
+
+  '@jest/test-sequencer@27.5.1':
+    dependencies:
+      '@jest/test-result': 27.5.1
+      graceful-fs: 4.2.11
+      jest-haste-map: 27.5.1
+      jest-runtime: 27.5.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jest/transform@27.5.1':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@jest/types': 27.5.1
+      babel-plugin-istanbul: 6.1.1
+      chalk: 4.1.2
+      convert-source-map: 1.9.0
+      fast-json-stable-stringify: 2.1.0
+      graceful-fs: 4.2.11
+      jest-haste-map: 27.5.1
+      jest-regex-util: 27.5.1
+      jest-util: 27.5.1
+      micromatch: 4.0.8
+      pirates: 4.0.6
+      slash: 3.0.0
+      source-map: 0.6.1
+      write-file-atomic: 3.0.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jest/types@27.5.1':
+    dependencies:
+      '@types/istanbul-lib-coverage': 2.0.6
+      '@types/istanbul-reports': 3.0.4
+      '@types/node': 20.17.14
+      '@types/yargs': 16.0.9
+      chalk: 4.1.2
+
+  '@jimp/bmp@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      bmp-js: 0.1.0
+      core-js: 3.40.0
+
+  '@jimp/core@0.10.3':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/utils': 0.10.3
+      any-base: 1.1.0
+      buffer: 5.7.1
+      core-js: 3.40.0
+      exif-parser: 0.1.12
+      file-type: 9.0.0
+      load-bmfont: 1.4.2
+      mkdirp: 0.5.6
+      phin: 2.9.3
+      pixelmatch: 4.0.2
+      tinycolor2: 1.6.0
+    transitivePeerDependencies:
+      - debug
+
+  '@jimp/custom@0.10.3':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/core': 0.10.3
+      core-js: 3.40.0
+    transitivePeerDependencies:
+      - debug
+
+  '@jimp/gif@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+      omggif: 1.0.10
+
+  '@jimp/jpeg@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+      jpeg-js: 0.3.7
+
+  '@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-circle@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+      tinycolor2: 1.6.0
+
+  '@jimp/plugin-contain@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-cover@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-displace@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-dither@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-fisheye@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-flip@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-gaussian@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-invert@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-mask@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-normalize@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-print@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+      load-bmfont: 1.4.2
+    transitivePeerDependencies:
+      - debug
+
+  '@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-shadow@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-blur': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugin-threshold@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-color': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+
+  '@jimp/plugins@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-blur': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-circle': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-color': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-contain': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))
+      '@jimp/plugin-cover': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))
+      '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-displace': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-dither': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-fisheye': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-flip': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))
+      '@jimp/plugin-gaussian': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-invert': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-mask': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-normalize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-print': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))
+      '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))
+      '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))
+      '@jimp/plugin-shadow': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))
+      '@jimp/plugin-threshold': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))
+      core-js: 3.40.0
+      timm: 1.7.1
+    transitivePeerDependencies:
+      - debug
+
+  '@jimp/png@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/utils': 0.10.3
+      core-js: 3.40.0
+      pngjs: 3.4.0
+
+  '@jimp/tiff@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      core-js: 3.40.0
+      utif: 2.0.1
+
+  '@jimp/types@0.10.3(@jimp/custom@0.10.3)':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/bmp': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/custom': 0.10.3
+      '@jimp/gif': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/jpeg': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/png': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/tiff': 0.10.3(@jimp/custom@0.10.3)
+      core-js: 3.40.0
+      timm: 1.7.1
+
+  '@jimp/utils@0.10.3':
+    dependencies:
+      '@babel/runtime': 7.26.0
+      core-js: 3.40.0
+      regenerator-runtime: 0.13.11
+
+  '@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/source-map@0.3.6':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@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.18.0
+
+  '@parcel/watcher-android-arm64@2.5.0':
+    optional: true
+
+  '@parcel/watcher-darwin-arm64@2.5.0':
+    optional: true
+
+  '@parcel/watcher-darwin-x64@2.5.0':
+    optional: true
+
+  '@parcel/watcher-freebsd-x64@2.5.0':
+    optional: true
+
+  '@parcel/watcher-linux-arm-glibc@2.5.0':
+    optional: true
+
+  '@parcel/watcher-linux-arm-musl@2.5.0':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.0':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-musl@2.5.0':
+    optional: true
+
+  '@parcel/watcher-linux-x64-glibc@2.5.0':
+    optional: true
+
+  '@parcel/watcher-linux-x64-musl@2.5.0':
+    optional: true
+
+  '@parcel/watcher-win32-arm64@2.5.0':
+    optional: true
+
+  '@parcel/watcher-win32-ia32@2.5.0':
+    optional: true
+
+  '@parcel/watcher-win32-x64@2.5.0':
+    optional: true
+
+  '@parcel/watcher@2.5.0':
+    dependencies:
+      detect-libc: 1.0.3
+      is-glob: 4.0.3
+      micromatch: 4.0.8
+      node-addon-api: 7.1.1
+    optionalDependencies:
+      '@parcel/watcher-android-arm64': 2.5.0
+      '@parcel/watcher-darwin-arm64': 2.5.0
+      '@parcel/watcher-darwin-x64': 2.5.0
+      '@parcel/watcher-freebsd-x64': 2.5.0
+      '@parcel/watcher-linux-arm-glibc': 2.5.0
+      '@parcel/watcher-linux-arm-musl': 2.5.0
+      '@parcel/watcher-linux-arm64-glibc': 2.5.0
+      '@parcel/watcher-linux-arm64-musl': 2.5.0
+      '@parcel/watcher-linux-x64-glibc': 2.5.0
+      '@parcel/watcher-linux-x64-musl': 2.5.0
+      '@parcel/watcher-win32-arm64': 2.5.0
+      '@parcel/watcher-win32-ia32': 2.5.0
+      '@parcel/watcher-win32-x64': 2.5.0
+    optional: true
+
+  '@pkgr/core@0.1.1': {}
+
+  '@rollup/pluginutils@4.2.1':
+    dependencies:
+      estree-walker: 2.0.2
+      picomatch: 2.3.1
+
+  '@rtsao/scc@1.1.0': {}
+
+  '@sinonjs/commons@1.8.6':
+    dependencies:
+      type-detect: 4.0.8
+
+  '@sinonjs/fake-timers@8.1.0':
+    dependencies:
+      '@sinonjs/commons': 1.8.6
+
+  '@tootallnate/once@1.1.2': {}
+
+  '@types/babel__core@7.20.5':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@babel/types': 7.26.5
+      '@types/babel__generator': 7.6.8
+      '@types/babel__template': 7.4.4
+      '@types/babel__traverse': 7.20.6
+
+  '@types/babel__generator@7.6.8':
+    dependencies:
+      '@babel/types': 7.26.5
+
+  '@types/babel__template@7.4.4':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@babel/types': 7.26.5
+
+  '@types/babel__traverse@7.20.6':
+    dependencies:
+      '@babel/types': 7.26.5
+
+  '@types/eslint-scope@3.7.7':
+    dependencies:
+      '@types/eslint': 9.6.1
+      '@types/estree': 1.0.6
+
+  '@types/eslint@9.6.1':
+    dependencies:
+      '@types/estree': 1.0.6
+      '@types/json-schema': 7.0.15
+
+  '@types/estree@1.0.6': {}
+
+  '@types/graceful-fs@4.1.9':
+    dependencies:
+      '@types/node': 20.17.14
+
+  '@types/istanbul-lib-coverage@2.0.6': {}
+
+  '@types/istanbul-lib-report@3.0.3':
+    dependencies:
+      '@types/istanbul-lib-coverage': 2.0.6
+
+  '@types/istanbul-reports@3.0.4':
+    dependencies:
+      '@types/istanbul-lib-report': 3.0.3
+
+  '@types/json-schema@7.0.15': {}
+
+  '@types/json5@0.0.29': {}
+
+  '@types/node@20.17.14':
+    dependencies:
+      undici-types: 6.19.8
+
+  '@types/prettier@2.7.3': {}
+
+  '@types/qs@6.9.18': {}
+
+  '@types/semver@7.5.8': {}
+
+  '@types/stack-utils@2.0.3': {}
+
+  '@types/yargs-parser@21.0.3': {}
+
+  '@types/yargs@16.0.9':
+    dependencies:
+      '@types/yargs-parser': 21.0.3
+
+  '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)':
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+      '@typescript-eslint/scope-manager': 6.21.0
+      '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+      '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+      '@typescript-eslint/visitor-keys': 6.21.0
+      debug: 4.4.0
+      eslint: 8.57.1
+      graphemer: 1.4.0
+      ignore: 5.3.2
+      natural-compare: 1.4.0
+      semver: 7.6.3
+      ts-api-utils: 1.4.3(typescript@5.7.3)
+    optionalDependencies:
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3)':
+    dependencies:
+      '@typescript-eslint/scope-manager': 6.21.0
+      '@typescript-eslint/types': 6.21.0
+      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3)
+      '@typescript-eslint/visitor-keys': 6.21.0
+      debug: 4.4.0
+      eslint: 8.57.1
+    optionalDependencies:
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/scope-manager@6.21.0':
+    dependencies:
+      '@typescript-eslint/types': 6.21.0
+      '@typescript-eslint/visitor-keys': 6.21.0
+
+  '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.7.3)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3)
+      '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+      debug: 4.4.0
+      eslint: 8.57.1
+      ts-api-utils: 1.4.3(typescript@5.7.3)
+    optionalDependencies:
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/types@6.21.0': {}
+
+  '@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.3)':
+    dependencies:
+      '@typescript-eslint/types': 6.21.0
+      '@typescript-eslint/visitor-keys': 6.21.0
+      debug: 4.4.0
+      globby: 11.1.0
+      is-glob: 4.0.3
+      minimatch: 9.0.3
+      semver: 7.6.3
+      ts-api-utils: 1.4.3(typescript@5.7.3)
+    optionalDependencies:
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.7.3)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+      '@types/json-schema': 7.0.15
+      '@types/semver': 7.5.8
+      '@typescript-eslint/scope-manager': 6.21.0
+      '@typescript-eslint/types': 6.21.0
+      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3)
+      eslint: 8.57.1
+      semver: 7.6.3
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  '@typescript-eslint/visitor-keys@6.21.0':
+    dependencies:
+      '@typescript-eslint/types': 6.21.0
+      eslint-visitor-keys: 3.4.3
+
+  '@ungap/structured-clone@1.2.1': {}
+
+  '@vitejs/plugin-legacy@4.1.1(terser@5.37.0)(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
+      browserslist: 4.24.4
+      core-js: 3.40.0
+      magic-string: 0.30.17
+      regenerator-runtime: 0.13.11
+      systemjs: 6.15.1
+      terser: 5.37.0
+      vite: 4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vitejs/plugin-vue-jsx@3.1.0(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.26.0)
+      '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0)
+      vite: 4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0)
+      vue: 3.5.13(typescript@5.7.3)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vitejs/plugin-vue@4.6.2(vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      vite: 4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0)
+      vue: 3.5.13(typescript@5.7.3)
+
+  '@volar/language-core@1.11.1':
+    dependencies:
+      '@volar/source-map': 1.11.1
+
+  '@volar/source-map@1.11.1':
+    dependencies:
+      muggle-string: 0.3.1
+
+  '@volar/typescript@1.11.1':
+    dependencies:
+      '@volar/language-core': 1.11.1
+      path-browserify: 1.0.1
+
+  '@vue/babel-helper-vue-transform-on@1.2.5': {}
+
+  '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)':
+    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.0)
+      '@babel/template': 7.25.9
+      '@babel/traverse': 7.26.5
+      '@babel/types': 7.26.5
+      '@vue/babel-helper-vue-transform-on': 1.2.5
+      '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0)
+      html-tags: 3.3.1
+      svg-tags: 1.0.0
+    optionalDependencies:
+      '@babel/core': 7.26.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0)':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/core': 7.26.0
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/parser': 7.26.5
+      '@vue/compiler-sfc': 3.5.13
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/compiler-core@3.2.47':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@vue/shared': 3.2.47
+      estree-walker: 2.0.2
+      source-map: 0.6.1
+
+  '@vue/compiler-core@3.5.13':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@vue/shared': 3.5.13
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-dom@3.2.47':
+    dependencies:
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+
+  '@vue/compiler-dom@3.5.13':
+    dependencies:
+      '@vue/compiler-core': 3.5.13
+      '@vue/shared': 3.5.13
+
+  '@vue/compiler-sfc@3.2.47':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@vue/compiler-core': 3.2.47
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-ssr': 3.2.47
+      '@vue/reactivity-transform': 3.2.47
+      '@vue/shared': 3.2.47
+      estree-walker: 2.0.2
+      magic-string: 0.25.9
+      postcss: 8.5.1
+      source-map: 0.6.1
+
+  '@vue/compiler-sfc@3.5.13':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@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.1
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.2.47':
+    dependencies:
+      '@vue/compiler-dom': 3.2.47
+      '@vue/shared': 3.2.47
+
+  '@vue/compiler-ssr@3.5.13':
+    dependencies:
+      '@vue/compiler-dom': 3.5.13
+      '@vue/shared': 3.5.13
+
+  '@vue/devtools-api@6.6.4': {}
+
+  '@vue/eslint-config-prettier@8.0.0(@types/eslint@9.6.1)(eslint@8.57.1)(prettier@3.4.2)':
+    dependencies:
+      eslint: 8.57.1
+      eslint-config-prettier: 8.10.0(eslint@8.57.1)
+      eslint-plugin-prettier: 5.2.2(@types/eslint@9.6.1)(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2)
+      prettier: 3.4.2
+    transitivePeerDependencies:
+      - '@types/eslint'
+
+  '@vue/eslint-config-typescript@12.0.0(eslint-plugin-vue@9.32.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.7.3)':
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)
+      '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+      eslint: 8.57.1
+      eslint-plugin-vue: 9.32.0(eslint@8.57.1)
+      vue-eslint-parser: 9.4.3(eslint@8.57.1)
+    optionalDependencies:
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/language-core@1.8.27(typescript@5.7.3)':
+    dependencies:
+      '@volar/language-core': 1.11.1
+      '@volar/source-map': 1.11.1
+      '@vue/compiler-dom': 3.5.13
+      '@vue/shared': 3.5.13
+      computeds: 0.0.1
+      minimatch: 9.0.5
+      muggle-string: 0.3.1
+      path-browserify: 1.0.1
+      vue-template-compiler: 2.7.16
+    optionalDependencies:
+      typescript: 5.7.3
+
+  '@vue/reactivity-transform@3.2.47':
+    dependencies:
+      '@babel/parser': 7.26.5
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+      estree-walker: 2.0.2
+      magic-string: 0.25.9
+
+  '@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.2.47(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@vue/compiler-ssr': 3.2.47
+      '@vue/shared': 3.2.47
+      vue: 3.5.13(typescript@5.7.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.2.47': {}
+
+  '@vue/shared@3.5.13': {}
+
+  '@vue/tsconfig@0.1.3(@types/node@20.17.14)':
+    optionalDependencies:
+      '@types/node': 20.17.14
+
+  '@webassemblyjs/ast@1.14.1':
+    dependencies:
+      '@webassemblyjs/helper-numbers': 1.13.2
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+  '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+  '@webassemblyjs/helper-api-error@1.13.2': {}
+
+  '@webassemblyjs/helper-buffer@1.14.1': {}
+
+  '@webassemblyjs/helper-numbers@1.13.2':
+    dependencies:
+      '@webassemblyjs/floating-point-hex-parser': 1.13.2
+      '@webassemblyjs/helper-api-error': 1.13.2
+      '@xtuc/long': 4.2.2
+
+  '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+  '@webassemblyjs/helper-wasm-section@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-buffer': 1.14.1
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/wasm-gen': 1.14.1
+
+  '@webassemblyjs/ieee754@1.13.2':
+    dependencies:
+      '@xtuc/ieee754': 1.2.0
+
+  '@webassemblyjs/leb128@1.13.2':
+    dependencies:
+      '@xtuc/long': 4.2.2
+
+  '@webassemblyjs/utf8@1.13.2': {}
+
+  '@webassemblyjs/wasm-edit@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-buffer': 1.14.1
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/helper-wasm-section': 1.14.1
+      '@webassemblyjs/wasm-gen': 1.14.1
+      '@webassemblyjs/wasm-opt': 1.14.1
+      '@webassemblyjs/wasm-parser': 1.14.1
+      '@webassemblyjs/wast-printer': 1.14.1
+
+  '@webassemblyjs/wasm-gen@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/ieee754': 1.13.2
+      '@webassemblyjs/leb128': 1.13.2
+      '@webassemblyjs/utf8': 1.13.2
+
+  '@webassemblyjs/wasm-opt@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-buffer': 1.14.1
+      '@webassemblyjs/wasm-gen': 1.14.1
+      '@webassemblyjs/wasm-parser': 1.14.1
+
+  '@webassemblyjs/wasm-parser@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-api-error': 1.13.2
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/ieee754': 1.13.2
+      '@webassemblyjs/leb128': 1.13.2
+      '@webassemblyjs/utf8': 1.13.2
+
+  '@webassemblyjs/wast-printer@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@xtuc/long': 4.2.2
+
+  '@xtuc/ieee754@1.2.0': {}
+
+  '@xtuc/long@4.2.2': {}
+
+  abab@2.0.6: {}
+
+  accepts@1.3.8:
+    dependencies:
+      mime-types: 2.1.35
+      negotiator: 0.6.3
+
+  acorn-globals@6.0.0:
+    dependencies:
+      acorn: 7.4.1
+      acorn-walk: 7.2.0
+
+  acorn-jsx@5.3.2(acorn@8.14.0):
+    dependencies:
+      acorn: 8.14.0
+
+  acorn-walk@7.2.0: {}
+
+  acorn@7.4.1: {}
+
+  acorn@8.14.0: {}
+
+  address@1.2.2: {}
+
+  agent-base@6.0.2:
+    dependencies:
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - supports-color
+
+  ajv-formats@2.1.1(ajv@8.17.1):
+    optionalDependencies:
+      ajv: 8.17.1
+
+  ajv-keywords@3.5.2(ajv@6.12.6):
+    dependencies:
+      ajv: 6.12.6
+
+  ajv-keywords@5.1.0(ajv@8.17.1):
+    dependencies:
+      ajv: 8.17.1
+      fast-deep-equal: 3.1.3
+
+  ajv@6.12.6:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-json-stable-stringify: 2.1.0
+      json-schema-traverse: 0.4.1
+      uri-js: 4.4.1
+
+  ajv@8.17.1:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-uri: 3.0.5
+      json-schema-traverse: 1.0.0
+      require-from-string: 2.0.2
+
+  ansi-escapes@4.3.2:
+    dependencies:
+      type-fest: 0.21.3
+
+  ansi-regex@5.0.1: {}
+
+  ansi-styles@4.3.0:
+    dependencies:
+      color-convert: 2.0.1
+
+  ansi-styles@5.2.0: {}
+
+  any-base@1.1.0: {}
+
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  argparse@1.0.10:
+    dependencies:
+      sprintf-js: 1.0.3
+
+  argparse@2.0.1: {}
+
+  array-buffer-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.3
+      is-array-buffer: 3.0.5
+
+  array-flatten@1.1.1: {}
+
+  array-includes@3.1.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.2.7
+      is-string: 1.1.1
+
+  array-union@2.1.0: {}
+
+  array.prototype.findlastindex@1.2.5:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      es-shim-unscopables: 1.0.2
+
+  array.prototype.flat@1.3.3:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-shim-unscopables: 1.0.2
+
+  array.prototype.flatmap@1.3.3:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-shim-unscopables: 1.0.2
+
+  arraybuffer.prototype.slice@1.0.4:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      get-intrinsic: 1.2.7
+      is-array-buffer: 3.0.5
+
+  asynckit@0.4.0: {}
+
+  autoprefixer@10.4.20(postcss@8.5.1):
+    dependencies:
+      browserslist: 4.24.4
+      caniuse-lite: 1.0.30001692
+      fraction.js: 4.3.7
+      normalize-range: 0.1.2
+      picocolors: 1.1.1
+      postcss: 8.5.1
+      postcss-value-parser: 4.2.0
+
+  available-typed-arrays@1.0.7:
+    dependencies:
+      possible-typed-array-names: 1.0.0
+
+  babel-jest@27.5.1(@babel/core@7.26.0):
+    dependencies:
+      '@babel/core': 7.26.0
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/babel__core': 7.20.5
+      babel-plugin-istanbul: 6.1.1
+      babel-preset-jest: 27.5.1(@babel/core@7.26.0)
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      slash: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-plugin-istanbul@6.1.1:
+    dependencies:
+      '@babel/helper-plugin-utils': 7.26.5
+      '@istanbuljs/load-nyc-config': 1.1.0
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-instrument: 5.2.1
+      test-exclude: 6.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-plugin-jest-hoist@27.5.1:
+    dependencies:
+      '@babel/template': 7.25.9
+      '@babel/types': 7.26.5
+      '@types/babel__core': 7.20.5
+      '@types/babel__traverse': 7.20.6
+
+  babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0):
+    dependencies:
+      '@babel/compat-data': 7.26.5
+      '@babel/core': 7.26.0
+      '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0):
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+      core-js-compat: 3.40.0
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0):
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0):
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0)
+      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0)
+      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0)
+      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0)
+      '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0)
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0)
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0)
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0)
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0)
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0)
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0)
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0)
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0)
+      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0)
+
+  babel-preset-jest@27.5.1(@babel/core@7.26.0):
+    dependencies:
+      '@babel/core': 7.26.0
+      babel-plugin-jest-hoist: 27.5.1
+      babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
+
+  balanced-match@1.0.2: {}
+
+  base64-js@1.5.1: {}
+
+  base64url@3.0.1: {}
+
+  binary-extensions@2.3.0: {}
+
+  bmp-js@0.1.0: {}
+
+  body-parser@1.20.3:
+    dependencies:
+      bytes: 3.1.2
+      content-type: 1.0.5
+      debug: 2.6.9
+      depd: 2.0.0
+      destroy: 1.2.0
+      http-errors: 2.0.0
+      iconv-lite: 0.4.24
+      on-finished: 2.4.1
+      qs: 6.13.0
+      raw-body: 2.5.2
+      type-is: 1.6.18
+      unpipe: 1.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  boolbase@1.0.0: {}
+
+  brace-expansion@1.1.11:
+    dependencies:
+      balanced-match: 1.0.2
+      concat-map: 0.0.1
+
+  brace-expansion@2.0.1:
+    dependencies:
+      balanced-match: 1.0.2
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  browser-process-hrtime@1.0.0: {}
+
+  browserslist@4.24.4:
+    dependencies:
+      caniuse-lite: 1.0.30001692
+      electron-to-chromium: 1.5.83
+      node-releases: 2.0.19
+      update-browserslist-db: 1.1.2(browserslist@4.24.4)
+
+  bser@2.1.1:
+    dependencies:
+      node-int64: 0.4.0
+
+  buffer-equal@0.0.1: {}
+
+  buffer-from@1.1.2: {}
+
+  buffer@5.7.1:
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+
+  builtin-modules@3.3.0: {}
+
+  builtins@5.1.0:
+    dependencies:
+      semver: 7.6.3
+
+  bytes@3.1.2: {}
+
+  cac@6.7.9: {}
+
+  call-bind-apply-helpers@1.0.1:
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+
+  call-bind@1.0.8:
+    dependencies:
+      call-bind-apply-helpers: 1.0.1
+      es-define-property: 1.0.1
+      get-intrinsic: 1.2.7
+      set-function-length: 1.2.2
+
+  call-bound@1.0.3:
+    dependencies:
+      call-bind-apply-helpers: 1.0.1
+      get-intrinsic: 1.2.7
+
+  callsites@3.1.0: {}
+
+  camelcase@5.3.1: {}
+
+  camelcase@6.3.0: {}
+
+  caniuse-lite@1.0.30001692: {}
+
+  centra@2.7.0:
+    dependencies:
+      follow-redirects: 1.15.9
+    transitivePeerDependencies:
+      - debug
+
+  chalk@4.1.2:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  char-regex@1.0.2: {}
+
+  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.1
+
+  chrome-trace-event@1.0.4: {}
+
+  ci-info@3.9.0: {}
+
+  cjs-module-lexer@1.4.1: {}
+
+  cliui@7.0.4:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+
+  co@4.6.0: {}
+
+  collect-v8-coverage@1.0.2: {}
+
+  color-convert@2.0.1:
+    dependencies:
+      color-name: 1.1.4
+
+  color-name@1.1.4: {}
+
+  combined-stream@1.0.8:
+    dependencies:
+      delayed-stream: 1.0.0
+
+  commander@2.20.3: {}
+
+  compare-versions@3.6.0: {}
+
+  computeds@0.0.1: {}
+
+  concat-map@0.0.1: {}
+
+  content-disposition@0.5.4:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  content-type@1.0.5: {}
+
+  convert-source-map@1.9.0: {}
+
+  convert-source-map@2.0.0: {}
+
+  cookie-signature@1.0.6: {}
+
+  cookie@0.7.1: {}
+
+  core-js-compat@3.40.0:
+    dependencies:
+      browserslist: 4.24.4
+
+  core-js@3.40.0: {}
+
+  cross-env@7.0.3:
+    dependencies:
+      cross-spawn: 7.0.6
+
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  css-font-size-keywords@1.0.0: {}
+
+  css-font-stretch-keywords@1.0.1: {}
+
+  css-font-style-keywords@1.0.1: {}
+
+  css-font-weight-keywords@1.0.0: {}
+
+  css-list-helpers@2.0.0: {}
+
+  css-system-font-keywords@1.0.0: {}
+
+  cssesc@3.0.0: {}
+
+  cssom@0.3.8: {}
+
+  cssom@0.4.4: {}
+
+  cssstyle@2.3.0:
+    dependencies:
+      cssom: 0.3.8
+
+  csstype@3.1.3: {}
+
+  data-urls@2.0.0:
+    dependencies:
+      abab: 2.0.6
+      whatwg-mimetype: 2.3.0
+      whatwg-url: 8.7.0
+
+  data-view-buffer@1.0.2:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-offset@1.0.1:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  dayjs@1.11.13: {}
+
+  de-indent@1.0.2: {}
+
+  debug@2.6.9:
+    dependencies:
+      ms: 2.0.0
+
+  debug@3.2.7:
+    dependencies:
+      ms: 2.1.3
+
+  debug@4.4.0:
+    dependencies:
+      ms: 2.1.3
+
+  decimal.js@10.4.3: {}
+
+  dedent@0.7.0: {}
+
+  deep-is@0.1.4: {}
+
+  deepmerge@4.3.1: {}
+
+  default-gateway@6.0.3:
+    dependencies:
+      execa: 5.1.1
+
+  define-data-property@1.1.4:
+    dependencies:
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  define-properties@1.2.1:
+    dependencies:
+      define-data-property: 1.1.4
+      has-property-descriptors: 1.0.2
+      object-keys: 1.1.1
+
+  delayed-stream@1.0.0: {}
+
+  depd@2.0.0: {}
+
+  destroy@1.2.0: {}
+
+  detect-libc@1.0.3:
+    optional: true
+
+  detect-newline@3.1.0: {}
+
+  diff-sequences@27.5.1: {}
+
+  dir-glob@3.0.1:
+    dependencies:
+      path-type: 4.0.0
+
+  doctrine@2.1.0:
+    dependencies:
+      esutils: 2.0.3
+
+  doctrine@3.0.0:
+    dependencies:
+      esutils: 2.0.3
+
+  dom-walk@0.1.2: {}
+
+  domexception@2.0.1:
+    dependencies:
+      webidl-conversions: 5.0.0
+
+  dunder-proto@1.0.1:
+    dependencies:
+      call-bind-apply-helpers: 1.0.1
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  ee-first@1.1.1: {}
+
+  electron-to-chromium@1.5.83: {}
+
+  emittery@0.8.1: {}
+
+  emoji-regex@8.0.0: {}
+
+  encodeurl@1.0.2: {}
+
+  encodeurl@2.0.0: {}
+
+  enhanced-resolve@5.18.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.2.1
+
+  entities@4.5.0: {}
+
+  error-ex@1.3.2:
+    dependencies:
+      is-arrayish: 0.2.1
+
+  es-abstract@1.23.9:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      arraybuffer.prototype.slice: 1.0.4
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      data-view-buffer: 1.0.2
+      data-view-byte-length: 1.0.2
+      data-view-byte-offset: 1.0.1
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      es-set-tostringtag: 2.1.0
+      es-to-primitive: 1.3.0
+      function.prototype.name: 1.1.8
+      get-intrinsic: 1.2.7
+      get-proto: 1.0.1
+      get-symbol-description: 1.1.0
+      globalthis: 1.0.4
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+      has-proto: 1.2.0
+      has-symbols: 1.1.0
+      hasown: 2.0.2
+      internal-slot: 1.1.0
+      is-array-buffer: 3.0.5
+      is-callable: 1.2.7
+      is-data-view: 1.0.2
+      is-regex: 1.2.1
+      is-shared-array-buffer: 1.0.4
+      is-string: 1.1.1
+      is-typed-array: 1.1.15
+      is-weakref: 1.1.0
+      math-intrinsics: 1.1.0
+      object-inspect: 1.13.3
+      object-keys: 1.1.1
+      object.assign: 4.1.7
+      own-keys: 1.0.1
+      regexp.prototype.flags: 1.5.4
+      safe-array-concat: 1.1.3
+      safe-push-apply: 1.0.0
+      safe-regex-test: 1.1.0
+      set-proto: 1.0.0
+      string.prototype.trim: 1.2.10
+      string.prototype.trimend: 1.0.9
+      string.prototype.trimstart: 1.0.8
+      typed-array-buffer: 1.0.3
+      typed-array-byte-length: 1.0.3
+      typed-array-byte-offset: 1.0.4
+      typed-array-length: 1.0.7
+      unbox-primitive: 1.1.0
+      which-typed-array: 1.1.18
+
+  es-define-property@1.0.1: {}
+
+  es-errors@1.3.0: {}
+
+  es-module-lexer@1.6.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.2.7
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  es-shim-unscopables@1.0.2:
+    dependencies:
+      hasown: 2.0.2
+
+  es-to-primitive@1.3.0:
+    dependencies:
+      is-callable: 1.2.7
+      is-date-object: 1.1.0
+      is-symbol: 1.1.1
+
+  esbuild@0.16.17:
+    optionalDependencies:
+      '@esbuild/android-arm': 0.16.17
+      '@esbuild/android-arm64': 0.16.17
+      '@esbuild/android-x64': 0.16.17
+      '@esbuild/darwin-arm64': 0.16.17
+      '@esbuild/darwin-x64': 0.16.17
+      '@esbuild/freebsd-arm64': 0.16.17
+      '@esbuild/freebsd-x64': 0.16.17
+      '@esbuild/linux-arm': 0.16.17
+      '@esbuild/linux-arm64': 0.16.17
+      '@esbuild/linux-ia32': 0.16.17
+      '@esbuild/linux-loong64': 0.16.17
+      '@esbuild/linux-mips64el': 0.16.17
+      '@esbuild/linux-ppc64': 0.16.17
+      '@esbuild/linux-riscv64': 0.16.17
+      '@esbuild/linux-s390x': 0.16.17
+      '@esbuild/linux-x64': 0.16.17
+      '@esbuild/netbsd-x64': 0.16.17
+      '@esbuild/openbsd-x64': 0.16.17
+      '@esbuild/sunos-x64': 0.16.17
+      '@esbuild/win32-arm64': 0.16.17
+      '@esbuild/win32-ia32': 0.16.17
+      '@esbuild/win32-x64': 0.16.17
+
+  esbuild@0.17.19:
+    optionalDependencies:
+      '@esbuild/android-arm': 0.17.19
+      '@esbuild/android-arm64': 0.17.19
+      '@esbuild/android-x64': 0.17.19
+      '@esbuild/darwin-arm64': 0.17.19
+      '@esbuild/darwin-x64': 0.17.19
+      '@esbuild/freebsd-arm64': 0.17.19
+      '@esbuild/freebsd-x64': 0.17.19
+      '@esbuild/linux-arm': 0.17.19
+      '@esbuild/linux-arm64': 0.17.19
+      '@esbuild/linux-ia32': 0.17.19
+      '@esbuild/linux-loong64': 0.17.19
+      '@esbuild/linux-mips64el': 0.17.19
+      '@esbuild/linux-ppc64': 0.17.19
+      '@esbuild/linux-riscv64': 0.17.19
+      '@esbuild/linux-s390x': 0.17.19
+      '@esbuild/linux-x64': 0.17.19
+      '@esbuild/netbsd-x64': 0.17.19
+      '@esbuild/openbsd-x64': 0.17.19
+      '@esbuild/sunos-x64': 0.17.19
+      '@esbuild/win32-arm64': 0.17.19
+      '@esbuild/win32-ia32': 0.17.19
+      '@esbuild/win32-x64': 0.17.19
+
+  escalade@3.2.0: {}
+
+  escape-html@1.0.3: {}
+
+  escape-string-regexp@2.0.0: {}
+
+  escape-string-regexp@4.0.0: {}
+
+  escodegen@2.1.0:
+    dependencies:
+      esprima: 4.0.1
+      estraverse: 5.3.0
+      esutils: 2.0.3
+    optionalDependencies:
+      source-map: 0.6.1
+
+  eslint-compat-utils@0.5.1(eslint@8.57.1):
+    dependencies:
+      eslint: 8.57.1
+      semver: 7.6.3
+
+  eslint-config-prettier@8.10.0(eslint@8.57.1):
+    dependencies:
+      eslint: 8.57.1
+
+  eslint-config-prettier@9.1.0(eslint@8.57.1):
+    dependencies:
+      eslint: 8.57.1
+
+  eslint-config-standard-with-typescript@39.1.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.7.3):
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)
+      '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+      eslint: 8.57.1
+      eslint-config-standard: 17.1.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)
+      eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)
+      eslint-plugin-n: 16.6.2(eslint@8.57.1)
+      eslint-plugin-promise: 6.6.0(eslint@8.57.1)
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-config-standard@17.1.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1):
+    dependencies:
+      eslint: 8.57.1
+      eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)
+      eslint-plugin-n: 16.6.2(eslint@8.57.1)
+      eslint-plugin-promise: 6.6.0(eslint@8.57.1)
+
+  eslint-import-resolver-node@0.3.9:
+    dependencies:
+      debug: 3.2.7
+      is-core-module: 2.16.1
+      resolve: 1.22.10
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1):
+    dependencies:
+      debug: 3.2.7
+    optionalDependencies:
+      '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+      eslint: 8.57.1
+      eslint-import-resolver-node: 0.3.9
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-es-x@7.8.0(eslint@8.57.1):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+      '@eslint-community/regexpp': 4.12.1
+      eslint: 8.57.1
+      eslint-compat-utils: 0.5.1(eslint@8.57.1)
+
+  eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1):
+    dependencies:
+      '@rtsao/scc': 1.1.0
+      array-includes: 3.1.8
+      array.prototype.findlastindex: 1.2.5
+      array.prototype.flat: 1.3.3
+      array.prototype.flatmap: 1.3.3
+      debug: 3.2.7
+      doctrine: 2.1.0
+      eslint: 8.57.1
+      eslint-import-resolver-node: 0.3.9
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)
+      hasown: 2.0.2
+      is-core-module: 2.16.1
+      is-glob: 4.0.3
+      minimatch: 3.1.2
+      object.fromentries: 2.0.8
+      object.groupby: 1.0.3
+      object.values: 1.2.1
+      semver: 6.3.1
+      string.prototype.trimend: 1.0.9
+      tsconfig-paths: 3.15.0
+    optionalDependencies:
+      '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.3)
+    transitivePeerDependencies:
+      - eslint-import-resolver-typescript
+      - eslint-import-resolver-webpack
+      - supports-color
+
+  eslint-plugin-n@16.6.2(eslint@8.57.1):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+      builtins: 5.1.0
+      eslint: 8.57.1
+      eslint-plugin-es-x: 7.8.0(eslint@8.57.1)
+      get-tsconfig: 4.8.1
+      globals: 13.24.0
+      ignore: 5.3.2
+      is-builtin-module: 3.2.1
+      is-core-module: 2.16.1
+      minimatch: 3.1.2
+      resolve: 1.22.10
+      semver: 7.6.3
+
+  eslint-plugin-prettier@5.2.2(@types/eslint@9.6.1)(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2):
+    dependencies:
+      eslint: 8.57.1
+      prettier: 3.4.2
+      prettier-linter-helpers: 1.0.0
+      synckit: 0.9.2
+    optionalDependencies:
+      '@types/eslint': 9.6.1
+      eslint-config-prettier: 8.10.0(eslint@8.57.1)
+
+  eslint-plugin-prettier@5.2.2(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2):
+    dependencies:
+      eslint: 8.57.1
+      prettier: 3.4.2
+      prettier-linter-helpers: 1.0.0
+      synckit: 0.9.2
+    optionalDependencies:
+      '@types/eslint': 9.6.1
+      eslint-config-prettier: 9.1.0(eslint@8.57.1)
+
+  eslint-plugin-promise@6.6.0(eslint@8.57.1):
+    dependencies:
+      eslint: 8.57.1
+
+  eslint-plugin-vue@9.32.0(eslint@8.57.1):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+      eslint: 8.57.1
+      globals: 13.24.0
+      natural-compare: 1.4.0
+      nth-check: 2.1.1
+      postcss-selector-parser: 6.1.2
+      semver: 7.6.3
+      vue-eslint-parser: 9.4.3(eslint@8.57.1)
+      xml-name-validator: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-scope@5.1.1:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 4.3.0
+
+  eslint-scope@7.2.2:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+
+  eslint-visitor-keys@3.4.3: {}
+
+  eslint@8.57.1:
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+      '@eslint-community/regexpp': 4.12.1
+      '@eslint/eslintrc': 2.1.4
+      '@eslint/js': 8.57.1
+      '@humanwhocodes/config-array': 0.13.0
+      '@humanwhocodes/module-importer': 1.0.1
+      '@nodelib/fs.walk': 1.2.8
+      '@ungap/structured-clone': 1.2.1
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.6
+      debug: 4.4.0
+      doctrine: 3.0.0
+      escape-string-regexp: 4.0.0
+      eslint-scope: 7.2.2
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      esquery: 1.6.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 6.0.1
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      globals: 13.24.0
+      graphemer: 1.4.0
+      ignore: 5.3.2
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      is-path-inside: 3.0.3
+      js-yaml: 4.1.0
+      json-stable-stringify-without-jsonify: 1.0.1
+      levn: 0.4.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.4
+      strip-ansi: 6.0.1
+      text-table: 0.2.0
+    transitivePeerDependencies:
+      - supports-color
+
+  espree@9.6.1:
+    dependencies:
+      acorn: 8.14.0
+      acorn-jsx: 5.3.2(acorn@8.14.0)
+      eslint-visitor-keys: 3.4.3
+
+  esprima@4.0.1: {}
+
+  esquery@1.6.0:
+    dependencies:
+      estraverse: 5.3.0
+
+  esrecurse@4.3.0:
+    dependencies:
+      estraverse: 5.3.0
+
+  estraverse@4.3.0: {}
+
+  estraverse@5.3.0: {}
+
+  estree-walker@2.0.2: {}
+
+  esutils@2.0.3: {}
+
+  etag@1.8.1: {}
+
+  events@3.3.0: {}
+
+  execa@5.1.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      get-stream: 6.0.1
+      human-signals: 2.1.0
+      is-stream: 2.0.1
+      merge-stream: 2.0.0
+      npm-run-path: 4.0.1
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+      strip-final-newline: 2.0.0
+
+  exif-parser@0.1.12: {}
+
+  exit@0.1.2: {}
+
+  expect@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      jest-get-type: 27.5.1
+      jest-matcher-utils: 27.5.1
+      jest-message-util: 27.5.1
+
+  express@4.21.2:
+    dependencies:
+      accepts: 1.3.8
+      array-flatten: 1.1.1
+      body-parser: 1.20.3
+      content-disposition: 0.5.4
+      content-type: 1.0.5
+      cookie: 0.7.1
+      cookie-signature: 1.0.6
+      debug: 2.6.9
+      depd: 2.0.0
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      etag: 1.8.1
+      finalhandler: 1.3.1
+      fresh: 0.5.2
+      http-errors: 2.0.0
+      merge-descriptors: 1.0.3
+      methods: 1.1.2
+      on-finished: 2.4.1
+      parseurl: 1.3.3
+      path-to-regexp: 0.1.12
+      proxy-addr: 2.0.7
+      qs: 6.13.0
+      range-parser: 1.2.1
+      safe-buffer: 5.2.1
+      send: 0.19.0
+      serve-static: 1.16.2
+      setprototypeof: 1.2.0
+      statuses: 2.0.1
+      type-is: 1.6.18
+      utils-merge: 1.0.1
+      vary: 1.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  fast-deep-equal@3.1.3: {}
+
+  fast-diff@1.3.0: {}
+
+  fast-glob@3.3.3:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fast-json-stable-stringify@2.1.0: {}
+
+  fast-levenshtein@2.0.6: {}
+
+  fast-uri@3.0.5: {}
+
+  fastq@1.18.0:
+    dependencies:
+      reusify: 1.0.4
+
+  fb-watchman@2.0.2:
+    dependencies:
+      bser: 2.1.1
+
+  file-entry-cache@6.0.1:
+    dependencies:
+      flat-cache: 3.2.0
+
+  file-type@9.0.0: {}
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  finalhandler@1.3.1:
+    dependencies:
+      debug: 2.6.9
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      on-finished: 2.4.1
+      parseurl: 1.3.3
+      statuses: 2.0.1
+      unpipe: 1.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  find-up@4.1.0:
+    dependencies:
+      locate-path: 5.0.0
+      path-exists: 4.0.0
+
+  find-up@5.0.0:
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+
+  flat-cache@3.2.0:
+    dependencies:
+      flatted: 3.3.2
+      keyv: 4.5.4
+      rimraf: 3.0.2
+
+  flatted@3.3.2: {}
+
+  follow-redirects@1.15.9: {}
+
+  for-each@0.3.3:
+    dependencies:
+      is-callable: 1.2.7
+
+  form-data@3.0.2:
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      mime-types: 2.1.35
+
+  forwarded@0.2.0: {}
+
+  fraction.js@4.3.7: {}
+
+  fresh@0.5.2: {}
+
+  fs-extra@10.1.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.1
+
+  fs.realpath@1.0.0: {}
+
+  fsevents@2.3.3:
+    optional: true
+
+  function-bind@1.1.2: {}
+
+  function.prototype.name@1.1.8:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      define-properties: 1.2.1
+      functions-have-names: 1.2.3
+      hasown: 2.0.2
+      is-callable: 1.2.7
+
+  functions-have-names@1.2.3: {}
+
+  generic-names@4.0.0:
+    dependencies:
+      loader-utils: 3.3.1
+
+  gensync@1.0.0-beta.2: {}
+
+  get-caller-file@2.0.5: {}
+
+  get-intrinsic@1.2.7:
+    dependencies:
+      call-bind-apply-helpers: 1.0.1
+      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-package-type@0.1.0: {}
+
+  get-proto@1.0.1:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-object-atoms: 1.1.1
+
+  get-stream@6.0.1: {}
+
+  get-symbol-description@1.1.0:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      get-intrinsic: 1.2.7
+
+  get-tsconfig@4.8.1:
+    dependencies:
+      resolve-pkg-maps: 1.0.0
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob-parent@6.0.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob-to-regexp@0.4.1: {}
+
+  glob@7.2.3:
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 3.1.2
+      once: 1.4.0
+      path-is-absolute: 1.0.1
+
+  global@4.4.0:
+    dependencies:
+      min-document: 2.19.0
+      process: 0.11.10
+
+  globals@11.12.0: {}
+
+  globals@13.24.0:
+    dependencies:
+      type-fest: 0.20.2
+
+  globalthis@1.0.4:
+    dependencies:
+      define-properties: 1.2.1
+      gopd: 1.2.0
+
+  globby@11.1.0:
+    dependencies:
+      array-union: 2.1.0
+      dir-glob: 3.0.1
+      fast-glob: 3.3.3
+      ignore: 5.3.2
+      merge2: 1.4.1
+      slash: 3.0.0
+
+  gopd@1.2.0: {}
+
+  graceful-fs@4.2.11: {}
+
+  graphemer@1.4.0: {}
+
+  has-bigints@1.1.0: {}
+
+  has-flag@4.0.0: {}
+
+  has-property-descriptors@1.0.2:
+    dependencies:
+      es-define-property: 1.0.1
+
+  has-proto@1.2.0:
+    dependencies:
+      dunder-proto: 1.0.1
+
+  has-symbols@1.1.0: {}
+
+  has-tostringtag@1.0.2:
+    dependencies:
+      has-symbols: 1.1.0
+
+  hash-sum@2.0.0: {}
+
+  hasown@2.0.2:
+    dependencies:
+      function-bind: 1.1.2
+
+  he@1.2.0: {}
+
+  html-encoding-sniffer@2.0.1:
+    dependencies:
+      whatwg-encoding: 1.0.5
+
+  html-escaper@2.0.2: {}
+
+  html-tags@3.3.1: {}
+
+  http-errors@2.0.0:
+    dependencies:
+      depd: 2.0.0
+      inherits: 2.0.4
+      setprototypeof: 1.2.0
+      statuses: 2.0.1
+      toidentifier: 1.0.1
+
+  http-proxy-agent@4.0.1:
+    dependencies:
+      '@tootallnate/once': 1.1.2
+      agent-base: 6.0.2
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - supports-color
+
+  https-proxy-agent@5.0.1:
+    dependencies:
+      agent-base: 6.0.2
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - supports-color
+
+  human-signals@2.1.0: {}
+
+  iconv-lite@0.4.24:
+    dependencies:
+      safer-buffer: 2.1.2
+
+  icss-replace-symbols@1.1.0: {}
+
+  icss-utils@5.1.0(postcss@8.5.1):
+    dependencies:
+      postcss: 8.5.1
+
+  ieee754@1.2.1: {}
+
+  ignore@5.3.2: {}
+
+  immutable@5.0.3: {}
+
+  import-fresh@3.3.0:
+    dependencies:
+      parent-module: 1.0.1
+      resolve-from: 4.0.0
+
+  import-local@3.2.0:
+    dependencies:
+      pkg-dir: 4.2.0
+      resolve-cwd: 3.0.0
+
+  imurmurhash@0.1.4: {}
+
+  inflight@1.0.6:
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+
+  inherits@2.0.4: {}
+
+  internal-slot@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      hasown: 2.0.2
+      side-channel: 1.1.0
+
+  invert-kv@3.0.1: {}
+
+  ipaddr.js@1.9.1: {}
+
+  is-array-buffer@3.0.5:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      get-intrinsic: 1.2.7
+
+  is-arrayish@0.2.1: {}
+
+  is-async-function@2.1.0:
+    dependencies:
+      call-bound: 1.0.3
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-bigint@1.1.0:
+    dependencies:
+      has-bigints: 1.1.0
+
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
+  is-boolean-object@1.2.1:
+    dependencies:
+      call-bound: 1.0.3
+      has-tostringtag: 1.0.2
+
+  is-builtin-module@3.2.1:
+    dependencies:
+      builtin-modules: 3.3.0
+
+  is-callable@1.2.7: {}
+
+  is-core-module@2.16.1:
+    dependencies:
+      hasown: 2.0.2
+
+  is-data-view@1.0.2:
+    dependencies:
+      call-bound: 1.0.3
+      get-intrinsic: 1.2.7
+      is-typed-array: 1.1.15
+
+  is-date-object@1.1.0:
+    dependencies:
+      call-bound: 1.0.3
+      has-tostringtag: 1.0.2
+
+  is-extglob@2.1.1: {}
+
+  is-finalizationregistry@1.1.1:
+    dependencies:
+      call-bound: 1.0.3
+
+  is-fullwidth-code-point@3.0.0: {}
+
+  is-function@1.0.2: {}
+
+  is-generator-fn@2.1.0: {}
+
+  is-generator-function@1.1.0:
+    dependencies:
+      call-bound: 1.0.3
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-map@2.0.3: {}
+
+  is-number-object@1.1.1:
+    dependencies:
+      call-bound: 1.0.3
+      has-tostringtag: 1.0.2
+
+  is-number@7.0.0: {}
+
+  is-path-inside@3.0.3: {}
+
+  is-potential-custom-element-name@1.0.1: {}
+
+  is-regex@1.2.1:
+    dependencies:
+      call-bound: 1.0.3
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  is-set@2.0.3: {}
+
+  is-shared-array-buffer@1.0.4:
+    dependencies:
+      call-bound: 1.0.3
+
+  is-stream@2.0.1: {}
+
+  is-string@1.1.1:
+    dependencies:
+      call-bound: 1.0.3
+      has-tostringtag: 1.0.2
+
+  is-symbol@1.1.1:
+    dependencies:
+      call-bound: 1.0.3
+      has-symbols: 1.1.0
+      safe-regex-test: 1.1.0
+
+  is-typed-array@1.1.15:
+    dependencies:
+      which-typed-array: 1.1.18
+
+  is-typedarray@1.0.0: {}
+
+  is-weakmap@2.0.2: {}
+
+  is-weakref@1.1.0:
+    dependencies:
+      call-bound: 1.0.3
+
+  is-weakset@2.0.4:
+    dependencies:
+      call-bound: 1.0.3
+      get-intrinsic: 1.2.7
+
+  isarray@2.0.5: {}
+
+  isexe@2.0.0: {}
+
+  istanbul-lib-coverage@3.2.2: {}
+
+  istanbul-lib-instrument@5.2.1:
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/parser': 7.26.5
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-coverage: 3.2.2
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  istanbul-lib-report@3.0.1:
+    dependencies:
+      istanbul-lib-coverage: 3.2.2
+      make-dir: 4.0.0
+      supports-color: 7.2.0
+
+  istanbul-lib-source-maps@4.0.1:
+    dependencies:
+      debug: 4.4.0
+      istanbul-lib-coverage: 3.2.2
+      source-map: 0.6.1
+    transitivePeerDependencies:
+      - supports-color
+
+  istanbul-reports@3.1.7:
+    dependencies:
+      html-escaper: 2.0.2
+      istanbul-lib-report: 3.0.1
+
+  jest-changed-files@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      execa: 5.1.1
+      throat: 6.0.2
+
+  jest-circus@27.5.1:
+    dependencies:
+      '@jest/environment': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      chalk: 4.1.2
+      co: 4.6.0
+      dedent: 0.7.0
+      expect: 27.5.1
+      is-generator-fn: 2.1.0
+      jest-each: 27.5.1
+      jest-matcher-utils: 27.5.1
+      jest-message-util: 27.5.1
+      jest-runtime: 27.5.1
+      jest-snapshot: 27.5.1
+      jest-util: 27.5.1
+      pretty-format: 27.5.1
+      slash: 3.0.0
+      stack-utils: 2.0.6
+      throat: 6.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-cli@27.5.1:
+    dependencies:
+      '@jest/core': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/types': 27.5.1
+      chalk: 4.1.2
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      import-local: 3.2.0
+      jest-config: 27.5.1
+      jest-util: 27.5.1
+      jest-validate: 27.5.1
+      prompts: 2.4.2
+      yargs: 16.2.0
+    transitivePeerDependencies:
+      - bufferutil
+      - canvas
+      - supports-color
+      - ts-node
+      - utf-8-validate
+
+  jest-config@27.5.1:
+    dependencies:
+      '@babel/core': 7.26.0
+      '@jest/test-sequencer': 27.5.1
+      '@jest/types': 27.5.1
+      babel-jest: 27.5.1(@babel/core@7.26.0)
+      chalk: 4.1.2
+      ci-info: 3.9.0
+      deepmerge: 4.3.1
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      jest-circus: 27.5.1
+      jest-environment-jsdom: 27.5.1
+      jest-environment-node: 27.5.1
+      jest-get-type: 27.5.1
+      jest-jasmine2: 27.5.1
+      jest-regex-util: 27.5.1
+      jest-resolve: 27.5.1
+      jest-runner: 27.5.1
+      jest-util: 27.5.1
+      jest-validate: 27.5.1
+      micromatch: 4.0.8
+      parse-json: 5.2.0
+      pretty-format: 27.5.1
+      slash: 3.0.0
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - bufferutil
+      - canvas
+      - supports-color
+      - utf-8-validate
+
+  jest-diff@27.5.1:
+    dependencies:
+      chalk: 4.1.2
+      diff-sequences: 27.5.1
+      jest-get-type: 27.5.1
+      pretty-format: 27.5.1
+
+  jest-docblock@27.5.1:
+    dependencies:
+      detect-newline: 3.1.0
+
+  jest-each@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      chalk: 4.1.2
+      jest-get-type: 27.5.1
+      jest-util: 27.5.1
+      pretty-format: 27.5.1
+
+  jest-environment-jsdom@27.5.1:
+    dependencies:
+      '@jest/environment': 27.5.1
+      '@jest/fake-timers': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      jest-mock: 27.5.1
+      jest-util: 27.5.1
+      jsdom: 16.7.0
+    transitivePeerDependencies:
+      - bufferutil
+      - canvas
+      - supports-color
+      - utf-8-validate
+
+  jest-environment-node@27.5.1:
+    dependencies:
+      '@jest/environment': 27.5.1
+      '@jest/fake-timers': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      jest-mock: 27.5.1
+      jest-util: 27.5.1
+
+  jest-get-type@27.5.1: {}
+
+  jest-haste-map@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      '@types/graceful-fs': 4.1.9
+      '@types/node': 20.17.14
+      anymatch: 3.1.3
+      fb-watchman: 2.0.2
+      graceful-fs: 4.2.11
+      jest-regex-util: 27.5.1
+      jest-serializer: 27.5.1
+      jest-util: 27.5.1
+      jest-worker: 27.5.1
+      micromatch: 4.0.8
+      walker: 1.0.8
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  jest-jasmine2@27.5.1:
+    dependencies:
+      '@jest/environment': 27.5.1
+      '@jest/source-map': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      chalk: 4.1.2
+      co: 4.6.0
+      expect: 27.5.1
+      is-generator-fn: 2.1.0
+      jest-each: 27.5.1
+      jest-matcher-utils: 27.5.1
+      jest-message-util: 27.5.1
+      jest-runtime: 27.5.1
+      jest-snapshot: 27.5.1
+      jest-util: 27.5.1
+      pretty-format: 27.5.1
+      throat: 6.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-leak-detector@27.5.1:
+    dependencies:
+      jest-get-type: 27.5.1
+      pretty-format: 27.5.1
+
+  jest-matcher-utils@27.5.1:
+    dependencies:
+      chalk: 4.1.2
+      jest-diff: 27.5.1
+      jest-get-type: 27.5.1
+      pretty-format: 27.5.1
+
+  jest-message-util@27.5.1:
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@jest/types': 27.5.1
+      '@types/stack-utils': 2.0.3
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      micromatch: 4.0.8
+      pretty-format: 27.5.1
+      slash: 3.0.0
+      stack-utils: 2.0.6
+
+  jest-mock@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+
+  jest-pnp-resolver@1.2.3(jest-resolve@27.5.1):
+    optionalDependencies:
+      jest-resolve: 27.5.1
+
+  jest-regex-util@27.5.1: {}
+
+  jest-resolve-dependencies@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      jest-regex-util: 27.5.1
+      jest-snapshot: 27.5.1
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-resolve@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      jest-haste-map: 27.5.1
+      jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1)
+      jest-util: 27.5.1
+      jest-validate: 27.5.1
+      resolve: 1.22.10
+      resolve.exports: 1.1.1
+      slash: 3.0.0
+
+  jest-runner@27.5.1:
+    dependencies:
+      '@jest/console': 27.5.1
+      '@jest/environment': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      chalk: 4.1.2
+      emittery: 0.8.1
+      graceful-fs: 4.2.11
+      jest-docblock: 27.5.1
+      jest-environment-jsdom: 27.5.1
+      jest-environment-node: 27.5.1
+      jest-haste-map: 27.5.1
+      jest-leak-detector: 27.5.1
+      jest-message-util: 27.5.1
+      jest-resolve: 27.5.1
+      jest-runtime: 27.5.1
+      jest-util: 27.5.1
+      jest-worker: 27.5.1
+      source-map-support: 0.5.21
+      throat: 6.0.2
+    transitivePeerDependencies:
+      - bufferutil
+      - canvas
+      - supports-color
+      - utf-8-validate
+
+  jest-runtime@27.5.1:
+    dependencies:
+      '@jest/environment': 27.5.1
+      '@jest/fake-timers': 27.5.1
+      '@jest/globals': 27.5.1
+      '@jest/source-map': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      chalk: 4.1.2
+      cjs-module-lexer: 1.4.1
+      collect-v8-coverage: 1.0.2
+      execa: 5.1.1
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      jest-haste-map: 27.5.1
+      jest-message-util: 27.5.1
+      jest-mock: 27.5.1
+      jest-regex-util: 27.5.1
+      jest-resolve: 27.5.1
+      jest-snapshot: 27.5.1
+      jest-util: 27.5.1
+      slash: 3.0.0
+      strip-bom: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-serializer@27.5.1:
+    dependencies:
+      '@types/node': 20.17.14
+      graceful-fs: 4.2.11
+
+  jest-snapshot@27.5.1:
+    dependencies:
+      '@babel/core': 7.26.0
+      '@babel/generator': 7.26.5
+      '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+      '@babel/traverse': 7.26.5
+      '@babel/types': 7.26.5
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/babel__traverse': 7.20.6
+      '@types/prettier': 2.7.3
+      babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
+      chalk: 4.1.2
+      expect: 27.5.1
+      graceful-fs: 4.2.11
+      jest-diff: 27.5.1
+      jest-get-type: 27.5.1
+      jest-haste-map: 27.5.1
+      jest-matcher-utils: 27.5.1
+      jest-message-util: 27.5.1
+      jest-util: 27.5.1
+      natural-compare: 1.4.0
+      pretty-format: 27.5.1
+      semver: 7.6.3
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-util@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      chalk: 4.1.2
+      ci-info: 3.9.0
+      graceful-fs: 4.2.11
+      picomatch: 2.3.1
+
+  jest-validate@27.5.1:
+    dependencies:
+      '@jest/types': 27.5.1
+      camelcase: 6.3.0
+      chalk: 4.1.2
+      jest-get-type: 27.5.1
+      leven: 3.1.0
+      pretty-format: 27.5.1
+
+  jest-watcher@27.5.1:
+    dependencies:
+      '@jest/test-result': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.17.14
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      jest-util: 27.5.1
+      string-length: 4.0.2
+
+  jest-worker@27.5.1:
+    dependencies:
+      '@types/node': 20.17.14
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+
+  jest@27.0.4:
+    dependencies:
+      '@jest/core': 27.5.1
+      import-local: 3.2.0
+      jest-cli: 27.5.1
+    transitivePeerDependencies:
+      - bufferutil
+      - canvas
+      - supports-color
+      - ts-node
+      - utf-8-validate
+
+  jimp@0.10.3:
+    dependencies:
+      '@babel/runtime': 7.26.0
+      '@jimp/custom': 0.10.3
+      '@jimp/plugins': 0.10.3(@jimp/custom@0.10.3)
+      '@jimp/types': 0.10.3(@jimp/custom@0.10.3)
+      core-js: 3.40.0
+      regenerator-runtime: 0.13.11
+    transitivePeerDependencies:
+      - debug
+
+  jpeg-js@0.3.7: {}
+
+  js-tokens@4.0.0: {}
+
+  js-yaml@3.14.1:
+    dependencies:
+      argparse: 1.0.10
+      esprima: 4.0.1
+
+  js-yaml@4.1.0:
+    dependencies:
+      argparse: 2.0.1
+
+  jsdom@16.7.0:
+    dependencies:
+      abab: 2.0.6
+      acorn: 8.14.0
+      acorn-globals: 6.0.0
+      cssom: 0.4.4
+      cssstyle: 2.3.0
+      data-urls: 2.0.0
+      decimal.js: 10.4.3
+      domexception: 2.0.1
+      escodegen: 2.1.0
+      form-data: 3.0.2
+      html-encoding-sniffer: 2.0.1
+      http-proxy-agent: 4.0.1
+      https-proxy-agent: 5.0.1
+      is-potential-custom-element-name: 1.0.1
+      nwsapi: 2.2.16
+      parse5: 6.0.1
+      saxes: 5.0.1
+      symbol-tree: 3.2.4
+      tough-cookie: 4.1.4
+      w3c-hr-time: 1.0.2
+      w3c-xmlserializer: 2.0.0
+      webidl-conversions: 6.1.0
+      whatwg-encoding: 1.0.5
+      whatwg-mimetype: 2.3.0
+      whatwg-url: 8.7.0
+      ws: 7.5.10
+      xml-name-validator: 3.0.0
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  jsesc@3.0.2: {}
+
+  jsesc@3.1.0: {}
+
+  json-buffer@3.0.1: {}
+
+  json-parse-even-better-errors@2.3.1: {}
+
+  json-schema-traverse@0.4.1: {}
+
+  json-schema-traverse@1.0.0: {}
+
+  json-stable-stringify-without-jsonify@1.0.1: {}
+
+  json5@1.0.2:
+    dependencies:
+      minimist: 1.2.8
+
+  json5@2.2.3: {}
+
+  jsonc-parser@3.3.1: {}
+
+  jsonfile@6.1.0:
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  keyv@4.5.4:
+    dependencies:
+      json-buffer: 3.0.1
+
+  kleur@3.0.3: {}
+
+  lcid@3.1.1:
+    dependencies:
+      invert-kv: 3.0.1
+
+  leven@3.1.0: {}
+
+  levn@0.4.1:
+    dependencies:
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+
+  licia@1.46.0: {}
+
+  lilconfig@2.1.0: {}
+
+  lines-and-columns@1.2.4: {}
+
+  load-bmfont@1.4.2:
+    dependencies:
+      buffer-equal: 0.0.1
+      mime: 1.6.0
+      parse-bmfont-ascii: 1.0.6
+      parse-bmfont-binary: 1.0.6
+      parse-bmfont-xml: 1.1.6
+      phin: 3.7.1
+      xhr: 2.6.0
+      xtend: 4.0.2
+    transitivePeerDependencies:
+      - debug
+
+  loader-runner@4.3.0: {}
+
+  loader-utils@3.3.1: {}
+
+  localstorage-polyfill@1.0.1: {}
+
+  locate-path@5.0.0:
+    dependencies:
+      p-locate: 4.1.0
+
+  locate-path@6.0.0:
+    dependencies:
+      p-locate: 5.0.0
+
+  lodash.camelcase@4.3.0: {}
+
+  lodash.debounce@4.0.8: {}
+
+  lodash.merge@4.6.2: {}
+
+  lodash@4.17.21: {}
+
+  lru-cache@5.1.1:
+    dependencies:
+      yallist: 3.1.1
+
+  magic-string@0.25.9:
+    dependencies:
+      sourcemap-codec: 1.4.8
+
+  magic-string@0.30.17:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  make-dir@4.0.0:
+    dependencies:
+      semver: 7.6.3
+
+  makeerror@1.0.12:
+    dependencies:
+      tmpl: 1.0.5
+
+  math-intrinsics@1.1.0: {}
+
+  media-typer@0.3.0: {}
+
+  merge-descriptors@1.0.3: {}
+
+  merge-stream@2.0.0: {}
+
+  merge2@1.4.1: {}
+
+  merge@2.1.1: {}
+
+  methods@1.1.2: {}
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  mime-db@1.52.0: {}
+
+  mime-types@2.1.35:
+    dependencies:
+      mime-db: 1.52.0
+
+  mime@1.6.0: {}
+
+  mime@3.0.0: {}
+
+  mimic-fn@2.1.0: {}
+
+  min-document@2.19.0:
+    dependencies:
+      dom-walk: 0.1.2
+
+  minimatch@3.1.2:
+    dependencies:
+      brace-expansion: 1.1.11
+
+  minimatch@9.0.3:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  minimatch@9.0.5:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  minimist@1.2.8: {}
+
+  mkdirp@0.5.6:
+    dependencies:
+      minimist: 1.2.8
+
+  module-alias@2.2.3: {}
+
+  ms@2.0.0: {}
+
+  ms@2.1.3: {}
+
+  muggle-string@0.3.1: {}
+
+  nanoid@3.3.8: {}
+
+  natural-compare@1.4.0: {}
+
+  negotiator@0.6.3: {}
+
+  neo-async@2.6.2: {}
+
+  node-addon-api@7.1.1:
+    optional: true
+
+  node-int64@0.4.0: {}
+
+  node-releases@2.0.19: {}
+
+  normalize-path@3.0.0: {}
+
+  normalize-range@0.1.2: {}
+
+  npm-run-path@4.0.1:
+    dependencies:
+      path-key: 3.1.1
+
+  nth-check@2.1.1:
+    dependencies:
+      boolbase: 1.0.0
+
+  nwsapi@2.2.16: {}
+
+  object-inspect@1.13.3: {}
+
+  object-keys@1.1.1: {}
+
+  object.assign@4.1.7:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+      has-symbols: 1.1.0
+      object-keys: 1.1.1
+
+  object.fromentries@2.0.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+
+  object.groupby@1.0.3:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+
+  object.values@1.2.1:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  omggif@1.0.10: {}
+
+  on-finished@2.4.1:
+    dependencies:
+      ee-first: 1.1.1
+
+  once@1.4.0:
+    dependencies:
+      wrappy: 1.0.2
+
+  onetime@5.1.2:
+    dependencies:
+      mimic-fn: 2.1.0
+
+  optionator@0.9.4:
+    dependencies:
+      deep-is: 0.1.4
+      fast-levenshtein: 2.0.6
+      levn: 0.4.1
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+      word-wrap: 1.2.5
+
+  os-locale-s-fix@1.0.8-fix-1:
+    dependencies:
+      lcid: 3.1.1
+
+  own-keys@1.0.1:
+    dependencies:
+      get-intrinsic: 1.2.7
+      object-keys: 1.1.1
+      safe-push-apply: 1.0.0
+
+  p-limit@2.3.0:
+    dependencies:
+      p-try: 2.2.0
+
+  p-limit@3.1.0:
+    dependencies:
+      yocto-queue: 0.1.0
+
+  p-locate@4.1.0:
+    dependencies:
+      p-limit: 2.3.0
+
+  p-locate@5.0.0:
+    dependencies:
+      p-limit: 3.1.0
+
+  p-try@2.2.0: {}
+
+  pako@1.0.11: {}
+
+  parent-module@1.0.1:
+    dependencies:
+      callsites: 3.1.0
+
+  parse-bmfont-ascii@1.0.6: {}
+
+  parse-bmfont-binary@1.0.6: {}
+
+  parse-bmfont-xml@1.1.6:
+    dependencies:
+      xml-parse-from-string: 1.0.1
+      xml2js: 0.5.0
+
+  parse-css-font@4.0.0:
+    dependencies:
+      css-font-size-keywords: 1.0.0
+      css-font-stretch-keywords: 1.0.1
+      css-font-style-keywords: 1.0.1
+      css-font-weight-keywords: 1.0.0
+      css-list-helpers: 2.0.0
+      css-system-font-keywords: 1.0.0
+      unquote: 1.1.1
+
+  parse-headers@2.0.5: {}
+
+  parse-json@5.2.0:
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      error-ex: 1.3.2
+      json-parse-even-better-errors: 2.3.1
+      lines-and-columns: 1.2.4
+
+  parse5@6.0.1: {}
+
+  parseurl@1.3.3: {}
+
+  path-browserify@1.0.1: {}
+
+  path-exists@4.0.0: {}
+
+  path-is-absolute@1.0.1: {}
+
+  path-key@3.1.1: {}
+
+  path-parse@1.0.7: {}
+
+  path-to-regexp@0.1.12: {}
+
+  path-type@4.0.0: {}
+
+  phin@2.9.3: {}
+
+  phin@3.7.1:
+    dependencies:
+      centra: 2.7.0
+    transitivePeerDependencies:
+      - debug
+
+  picocolors@1.1.1: {}
+
+  picomatch@2.3.1: {}
+
+  pify@2.3.0: {}
+
+  pinia-plugin-persistedstate@3.2.3(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))):
+    dependencies:
+      pinia: 2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
+
+  pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@vue/devtools-api': 6.6.4
+      vue: 3.5.13(typescript@5.7.3)
+      vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3))
+    optionalDependencies:
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+
+  pirates@4.0.6: {}
+
+  pixelmatch@4.0.2:
+    dependencies:
+      pngjs: 3.4.0
+
+  pkg-dir@4.2.0:
+    dependencies:
+      find-up: 4.1.0
+
+  pngjs@3.4.0: {}
+
+  possible-typed-array-names@1.0.0: {}
+
+  postcss-import@14.1.0(postcss@8.5.1):
+    dependencies:
+      postcss: 8.5.1
+      postcss-value-parser: 4.2.0
+      read-cache: 1.0.0
+      resolve: 1.22.10
+
+  postcss-load-config@3.1.4(postcss@8.5.1):
+    dependencies:
+      lilconfig: 2.1.0
+      yaml: 1.10.2
+    optionalDependencies:
+      postcss: 8.5.1
+
+  postcss-modules-extract-imports@3.1.0(postcss@8.5.1):
+    dependencies:
+      postcss: 8.5.1
+
+  postcss-modules-local-by-default@4.2.0(postcss@8.5.1):
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.5.1)
+      postcss: 8.5.1
+      postcss-selector-parser: 7.0.0
+      postcss-value-parser: 4.2.0
+
+  postcss-modules-scope@3.2.1(postcss@8.5.1):
+    dependencies:
+      postcss: 8.5.1
+      postcss-selector-parser: 7.0.0
+
+  postcss-modules-values@4.0.0(postcss@8.5.1):
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.5.1)
+      postcss: 8.5.1
+
+  postcss-modules@4.3.1(postcss@8.5.1):
+    dependencies:
+      generic-names: 4.0.0
+      icss-replace-symbols: 1.1.0
+      lodash.camelcase: 4.3.0
+      postcss: 8.5.1
+      postcss-modules-extract-imports: 3.1.0(postcss@8.5.1)
+      postcss-modules-local-by-default: 4.2.0(postcss@8.5.1)
+      postcss-modules-scope: 3.2.1(postcss@8.5.1)
+      postcss-modules-values: 4.0.0(postcss@8.5.1)
+      string-hash: 1.1.3
+
+  postcss-selector-parser@6.1.2:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-selector-parser@7.0.0:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-value-parser@4.2.0: {}
+
+  postcss@8.5.1:
+    dependencies:
+      nanoid: 3.3.8
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  prelude-ls@1.2.1: {}
+
+  prettier-linter-helpers@1.0.0:
+    dependencies:
+      fast-diff: 1.3.0
+
+  prettier@3.4.2: {}
+
+  pretty-format@27.5.1:
+    dependencies:
+      ansi-regex: 5.0.1
+      ansi-styles: 5.2.0
+      react-is: 17.0.2
+
+  process@0.11.10: {}
+
+  prompts@2.4.2:
+    dependencies:
+      kleur: 3.0.3
+      sisteransi: 1.0.5
+
+  proxy-addr@2.0.7:
+    dependencies:
+      forwarded: 0.2.0
+      ipaddr.js: 1.9.1
+
+  psl@1.15.0:
+    dependencies:
+      punycode: 2.3.1
+
+  punycode@2.3.1: {}
+
+  qrcode-reader@1.0.4: {}
+
+  qrcode-terminal@0.12.0: {}
+
+  qs@6.13.0:
+    dependencies:
+      side-channel: 1.1.0
+
+  qs@6.14.0:
+    dependencies:
+      side-channel: 1.1.0
+
+  querystringify@2.2.0: {}
+
+  queue-microtask@1.2.3: {}
+
+  randombytes@2.1.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  range-parser@1.2.1: {}
+
+  raw-body@2.5.2:
+    dependencies:
+      bytes: 3.1.2
+      http-errors: 2.0.0
+      iconv-lite: 0.4.24
+      unpipe: 1.0.0
+
+  react-is@17.0.2: {}
+
+  read-cache@1.0.0:
+    dependencies:
+      pify: 2.3.0
+
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
+  readdirp@4.1.1: {}
+
+  reflect.getprototypeof@1.0.10:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.2.7
+      get-proto: 1.0.1
+      which-builtin-type: 1.2.1
+
+  regenerate-unicode-properties@10.2.0:
+    dependencies:
+      regenerate: 1.4.2
+
+  regenerate@1.4.2: {}
+
+  regenerator-runtime@0.13.11: {}
+
+  regenerator-runtime@0.14.1: {}
+
+  regenerator-transform@0.15.2:
+    dependencies:
+      '@babel/runtime': 7.26.0
+
+  regexp.prototype.flags@1.5.4:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-errors: 1.3.0
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      set-function-name: 2.0.2
+
+  regexpu-core@6.2.0:
+    dependencies:
+      regenerate: 1.4.2
+      regenerate-unicode-properties: 10.2.0
+      regjsgen: 0.8.0
+      regjsparser: 0.12.0
+      unicode-match-property-ecmascript: 2.0.0
+      unicode-match-property-value-ecmascript: 2.2.0
+
+  regjsgen@0.8.0: {}
+
+  regjsparser@0.12.0:
+    dependencies:
+      jsesc: 3.0.2
+
+  require-directory@2.1.1: {}
+
+  require-from-string@2.0.2: {}
+
+  requires-port@1.0.0: {}
+
+  resolve-cwd@3.0.0:
+    dependencies:
+      resolve-from: 5.0.0
+
+  resolve-from@4.0.0: {}
+
+  resolve-from@5.0.0: {}
+
+  resolve-pkg-maps@1.0.0: {}
+
+  resolve.exports@1.1.1: {}
+
+  resolve@1.22.10:
+    dependencies:
+      is-core-module: 2.16.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
+  reusify@1.0.4: {}
+
+  rimraf@3.0.2:
+    dependencies:
+      glob: 7.2.3
+
+  rollup@3.29.5:
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  safe-area-insets@1.4.1: {}
+
+  safe-array-concat@1.1.3:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      get-intrinsic: 1.2.7
+      has-symbols: 1.1.0
+      isarray: 2.0.5
+
+  safe-buffer@5.2.1: {}
+
+  safe-push-apply@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      isarray: 2.0.5
+
+  safe-regex-test@1.1.0:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      is-regex: 1.2.1
+
+  safer-buffer@2.1.2: {}
+
+  sass-loader@13.3.3(sass@1.83.4)(webpack@5.97.1):
+    dependencies:
+      neo-async: 2.6.2
+      webpack: 5.97.1
+    optionalDependencies:
+      sass: 1.83.4
+
+  sass@1.83.4:
+    dependencies:
+      chokidar: 4.0.3
+      immutable: 5.0.3
+      source-map-js: 1.2.1
+    optionalDependencies:
+      '@parcel/watcher': 2.5.0
+
+  sax@1.4.1: {}
+
+  saxes@5.0.1:
+    dependencies:
+      xmlchars: 2.2.0
+
+  schema-utils@3.3.0:
+    dependencies:
+      '@types/json-schema': 7.0.15
+      ajv: 6.12.6
+      ajv-keywords: 3.5.2(ajv@6.12.6)
+
+  schema-utils@4.3.0:
+    dependencies:
+      '@types/json-schema': 7.0.15
+      ajv: 8.17.1
+      ajv-formats: 2.1.1(ajv@8.17.1)
+      ajv-keywords: 5.1.0(ajv@8.17.1)
+
+  semver@6.3.1: {}
+
+  semver@7.6.3: {}
+
+  send@0.19.0:
+    dependencies:
+      debug: 2.6.9
+      depd: 2.0.0
+      destroy: 1.2.0
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      etag: 1.8.1
+      fresh: 0.5.2
+      http-errors: 2.0.0
+      mime: 1.6.0
+      ms: 2.1.3
+      on-finished: 2.4.1
+      range-parser: 1.2.1
+      statuses: 2.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  serialize-javascript@6.0.2:
+    dependencies:
+      randombytes: 2.1.0
+
+  serve-static@1.16.2:
+    dependencies:
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      parseurl: 1.3.3
+      send: 0.19.0
+    transitivePeerDependencies:
+      - supports-color
+
+  set-function-length@1.2.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.2.7
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+
+  set-function-name@2.0.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      functions-have-names: 1.2.3
+      has-property-descriptors: 1.0.2
+
+  set-proto@1.0.0:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+
+  setprototypeof@1.2.0: {}
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
+  side-channel-list@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.3
+
+  side-channel-map@1.0.1:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      get-intrinsic: 1.2.7
+      object-inspect: 1.13.3
+
+  side-channel-weakmap@1.0.2:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      get-intrinsic: 1.2.7
+      object-inspect: 1.13.3
+      side-channel-map: 1.0.1
+
+  side-channel@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.3
+      side-channel-list: 1.0.0
+      side-channel-map: 1.0.1
+      side-channel-weakmap: 1.0.2
+
+  signal-exit@3.0.7: {}
+
+  sisteransi@1.0.5: {}
+
+  slash@3.0.0: {}
+
+  source-map-js@1.2.1: {}
+
+  source-map-support@0.5.21:
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+
+  source-map@0.6.1: {}
+
+  source-map@0.7.4: {}
+
+  sourcemap-codec@1.4.8: {}
+
+  sprintf-js@1.0.3: {}
+
+  stack-utils@2.0.6:
+    dependencies:
+      escape-string-regexp: 2.0.0
+
+  statuses@2.0.1: {}
+
+  string-hash@1.1.3: {}
+
+  string-length@4.0.2:
+    dependencies:
+      char-regex: 1.0.2
+      strip-ansi: 6.0.1
+
+  string-width@4.2.3:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  string.prototype.trim@1.2.10:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      define-data-property: 1.1.4
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+      has-property-descriptors: 1.0.2
+
+  string.prototype.trimend@1.0.9:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  string.prototype.trimstart@1.0.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-bom@3.0.0: {}
+
+  strip-bom@4.0.0: {}
+
+  strip-final-newline@2.0.0: {}
+
+  strip-json-comments@3.1.1: {}
+
+  supports-color@7.2.0:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-color@8.1.1:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-hyperlinks@2.3.0:
+    dependencies:
+      has-flag: 4.0.0
+      supports-color: 7.2.0
+
+  supports-preserve-symlinks-flag@1.0.0: {}
+
+  svg-tags@1.0.0: {}
+
+  symbol-tree@3.2.4: {}
+
+  synckit@0.9.2:
+    dependencies:
+      '@pkgr/core': 0.1.1
+      tslib: 2.8.1
+
+  systemjs@6.15.1: {}
+
+  tapable@2.2.1: {}
+
+  terminal-link@2.1.1:
+    dependencies:
+      ansi-escapes: 4.3.2
+      supports-hyperlinks: 2.3.0
+
+  terser-webpack-plugin@5.3.11(webpack@5.97.1):
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.25
+      jest-worker: 27.5.1
+      schema-utils: 4.3.0
+      serialize-javascript: 6.0.2
+      terser: 5.37.0
+      webpack: 5.97.1
+
+  terser@5.37.0:
+    dependencies:
+      '@jridgewell/source-map': 0.3.6
+      acorn: 8.14.0
+      commander: 2.20.3
+      source-map-support: 0.5.21
+
+  test-exclude@6.0.0:
+    dependencies:
+      '@istanbuljs/schema': 0.1.3
+      glob: 7.2.3
+      minimatch: 3.1.2
+
+  text-table@0.2.0: {}
+
+  throat@6.0.2: {}
+
+  timm@1.7.1: {}
+
+  tinycolor2@1.6.0: {}
+
+  tmpl@1.0.5: {}
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  toidentifier@1.0.1: {}
+
+  tough-cookie@4.1.4:
+    dependencies:
+      psl: 1.15.0
+      punycode: 2.3.1
+      universalify: 0.2.0
+      url-parse: 1.5.10
+
+  tr46@2.1.0:
+    dependencies:
+      punycode: 2.3.1
+
+  ts-api-utils@1.4.3(typescript@5.7.3):
+    dependencies:
+      typescript: 5.7.3
+
+  tsconfig-paths@3.15.0:
+    dependencies:
+      '@types/json5': 0.0.29
+      json5: 1.0.2
+      minimist: 1.2.8
+      strip-bom: 3.0.0
+
+  tslib@2.8.1: {}
+
+  type-check@0.4.0:
+    dependencies:
+      prelude-ls: 1.2.1
+
+  type-detect@4.0.8: {}
+
+  type-fest@0.20.2: {}
+
+  type-fest@0.21.3: {}
+
+  type-is@1.6.18:
+    dependencies:
+      media-typer: 0.3.0
+      mime-types: 2.1.35
+
+  typed-array-buffer@1.0.3:
+    dependencies:
+      call-bound: 1.0.3
+      es-errors: 1.3.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-length@1.0.3:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.3
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-offset@1.0.4:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      for-each: 0.3.3
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+      reflect.getprototypeof: 1.0.10
+
+  typed-array-length@1.0.7:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.3
+      gopd: 1.2.0
+      is-typed-array: 1.1.15
+      possible-typed-array-names: 1.0.0
+      reflect.getprototypeof: 1.0.10
+
+  typedarray-to-buffer@3.1.5:
+    dependencies:
+      is-typedarray: 1.0.0
+
+  typescript@5.7.3: {}
+
+  unbox-primitive@1.1.0:
+    dependencies:
+      call-bound: 1.0.3
+      has-bigints: 1.1.0
+      has-symbols: 1.1.0
+      which-boxed-primitive: 1.1.1
+
+  undici-types@6.19.8: {}
+
+  unicode-canonical-property-names-ecmascript@2.0.1: {}
+
+  unicode-match-property-ecmascript@2.0.0:
+    dependencies:
+      unicode-canonical-property-names-ecmascript: 2.0.1
+      unicode-property-aliases-ecmascript: 2.1.0
+
+  unicode-match-property-value-ecmascript@2.2.0: {}
+
+  unicode-property-aliases-ecmascript@2.1.0: {}
+
+  universalify@0.2.0: {}
+
+  universalify@2.0.1: {}
+
+  unpipe@1.0.0: {}
+
+  unquote@1.1.1: {}
+
+  update-browserslist-db@1.1.2(browserslist@4.24.4):
+    dependencies:
+      browserslist: 4.24.4
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
+  uri-js@4.4.1:
+    dependencies:
+      punycode: 2.3.1
+
+  url-parse@1.5.10:
+    dependencies:
+      querystringify: 2.2.0
+      requires-port: 1.0.0
+
+  utif@2.0.1:
+    dependencies:
+      pako: 1.0.11
+
+  util-deprecate@1.0.2: {}
+
+  utils-merge@1.0.1: {}
+
+  v8-to-istanbul@8.1.1:
+    dependencies:
+      '@types/istanbul-lib-coverage': 2.0.6
+      convert-source-map: 1.9.0
+      source-map: 0.7.4
+
+  vary@1.1.2: {}
+
+  vite@4.1.5(@types/node@20.17.14)(sass@1.83.4)(terser@5.37.0):
+    dependencies:
+      esbuild: 0.16.17
+      postcss: 8.5.1
+      resolve: 1.22.10
+      rollup: 3.29.5
+    optionalDependencies:
+      '@types/node': 20.17.14
+      fsevents: 2.3.3
+      sass: 1.83.4
+      terser: 5.37.0
+
+  vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      vue: 3.5.13(typescript@5.7.3)
+
+  vue-eslint-parser@9.4.3(eslint@8.57.1):
+    dependencies:
+      debug: 4.4.0
+      eslint: 8.57.1
+      eslint-scope: 7.2.2
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      esquery: 1.6.0
+      lodash: 4.17.21
+      semver: 7.6.3
+    transitivePeerDependencies:
+      - supports-color
+
+  vue-i18n@9.14.2(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@intlify/core-base': 9.14.2
+      '@intlify/shared': 9.14.2
+      '@vue/devtools-api': 6.6.4
+      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-template-compiler@2.7.16:
+    dependencies:
+      de-indent: 1.0.2
+      he: 1.2.0
+
+  vue-tsc@1.8.27(typescript@5.7.3):
+    dependencies:
+      '@volar/typescript': 1.11.1
+      '@vue/language-core': 1.8.27(typescript@5.7.3)
+      semver: 7.6.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
+
+  w3c-hr-time@1.0.2:
+    dependencies:
+      browser-process-hrtime: 1.0.0
+
+  w3c-xmlserializer@2.0.0:
+    dependencies:
+      xml-name-validator: 3.0.0
+
+  walker@1.0.8:
+    dependencies:
+      makeerror: 1.0.12
+
+  watchpack@2.4.2:
+    dependencies:
+      glob-to-regexp: 0.4.1
+      graceful-fs: 4.2.11
+
+  webidl-conversions@5.0.0: {}
+
+  webidl-conversions@6.1.0: {}
+
+  webpack-sources@3.2.3: {}
+
+  webpack@5.97.1:
+    dependencies:
+      '@types/eslint-scope': 3.7.7
+      '@types/estree': 1.0.6
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/wasm-edit': 1.14.1
+      '@webassemblyjs/wasm-parser': 1.14.1
+      acorn: 8.14.0
+      browserslist: 4.24.4
+      chrome-trace-event: 1.0.4
+      enhanced-resolve: 5.18.0
+      es-module-lexer: 1.6.0
+      eslint-scope: 5.1.1
+      events: 3.3.0
+      glob-to-regexp: 0.4.1
+      graceful-fs: 4.2.11
+      json-parse-even-better-errors: 2.3.1
+      loader-runner: 4.3.0
+      mime-types: 2.1.35
+      neo-async: 2.6.2
+      schema-utils: 3.3.0
+      tapable: 2.2.1
+      terser-webpack-plugin: 5.3.11(webpack@5.97.1)
+      watchpack: 2.4.2
+      webpack-sources: 3.2.3
+    transitivePeerDependencies:
+      - '@swc/core'
+      - esbuild
+      - uglify-js
+
+  whatwg-encoding@1.0.5:
+    dependencies:
+      iconv-lite: 0.4.24
+
+  whatwg-mimetype@2.3.0: {}
+
+  whatwg-url@8.7.0:
+    dependencies:
+      lodash: 4.17.21
+      tr46: 2.1.0
+      webidl-conversions: 6.1.0
+
+  which-boxed-primitive@1.1.1:
+    dependencies:
+      is-bigint: 1.1.0
+      is-boolean-object: 1.2.1
+      is-number-object: 1.1.1
+      is-string: 1.1.1
+      is-symbol: 1.1.1
+
+  which-builtin-type@1.2.1:
+    dependencies:
+      call-bound: 1.0.3
+      function.prototype.name: 1.1.8
+      has-tostringtag: 1.0.2
+      is-async-function: 2.1.0
+      is-date-object: 1.1.0
+      is-finalizationregistry: 1.1.1
+      is-generator-function: 1.1.0
+      is-regex: 1.2.1
+      is-weakref: 1.1.0
+      isarray: 2.0.5
+      which-boxed-primitive: 1.1.1
+      which-collection: 1.0.2
+      which-typed-array: 1.1.18
+
+  which-collection@1.0.2:
+    dependencies:
+      is-map: 2.0.3
+      is-set: 2.0.3
+      is-weakmap: 2.0.2
+      is-weakset: 2.0.4
+
+  which-typed-array@1.1.18:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.3
+      for-each: 0.3.3
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  word-wrap@1.2.5: {}
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  wrappy@1.0.2: {}
+
+  write-file-atomic@3.0.3:
+    dependencies:
+      imurmurhash: 0.1.4
+      is-typedarray: 1.0.0
+      signal-exit: 3.0.7
+      typedarray-to-buffer: 3.1.5
+
+  ws@7.5.10: {}
+
+  ws@8.18.0: {}
+
+  xhr@2.6.0:
+    dependencies:
+      global: 4.4.0
+      is-function: 1.0.2
+      parse-headers: 2.0.5
+      xtend: 4.0.2
+
+  xml-name-validator@3.0.0: {}
+
+  xml-name-validator@4.0.0: {}
+
+  xml-parse-from-string@1.0.1: {}
+
+  xml2js@0.5.0:
+    dependencies:
+      sax: 1.4.1
+      xmlbuilder: 11.0.1
+
+  xmlbuilder@11.0.1: {}
+
+  xmlchars@2.2.0: {}
+
+  xmlhttprequest@1.8.0: {}
+
+  xregexp@3.1.0: {}
+
+  xtend@4.0.2: {}
+
+  y18n@5.0.8: {}
+
+  yallist@3.1.1: {}
+
+  yaml@1.10.2: {}
+
+  yargs-parser@20.2.9: {}
+
+  yargs@16.2.0:
+    dependencies:
+      cliui: 7.0.4
+      escalade: 3.2.0
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 20.2.9
+
+  yocto-queue@0.1.0: {}

+ 8 - 0
shims-uni.d.ts

@@ -0,0 +1,8 @@
+/// <reference types='@dcloudio/types' />
+import 'vue'
+
+declare module '@vue/runtime-core' {
+  type Hooks = App.AppInstance & Page.PageInstance
+
+  interface ComponentCustomOptions extends Hooks {}
+}

+ 24 - 0
src/App.vue

@@ -0,0 +1,24 @@
+<script setup lang="ts">
+import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
+// @ts-ignore
+import { initEid } from './mp_ecard_sdk/main'
+onLaunch(() => {
+  initEid()
+})
+onShow(() => {})
+onHide(() => {})
+</script>
+<style lang="scss">
+/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
+@import './static/style/common.scss';
+/* #ifdef H5 */
+uni-page-head {
+  display: none;
+}
+
+.uni-app--showleftwindow + .uni-tabbar-bottom {
+  display: none;
+}
+
+/* #endif */
+</style>

+ 89 - 0
src/components/dateSelect/k-bottom-button/KBottomButton.vue

@@ -0,0 +1,89 @@
+<template>
+  <view
+    class="k-button-group"
+    :style="{
+      paddingBottom: safeArea && `${bottomSafeArea || 10}px`,
+      boxShadow: boxShadow ? '0 2px 12px 0 rgba(0, 0, 0, 0.1)' : ''
+    }"
+  >
+    <button
+      v-for="(button, index) in list"
+      class="k-button"
+      :style="{
+        color: button.color,
+        backgroundColor: button.background,
+        border: `2rpx solid ${button.borderColor || 'transparent'}`
+      }"
+      @click="onClick(index)"
+      :key="index"
+    >
+      {{ button.label }}
+    </button>
+  </view>
+</template>
+
+<script>
+export default {
+  options: {
+    virtualHost: true
+  },
+  props: {
+    safeArea: {
+      type: Boolean,
+      default: true
+    },
+    boxShadow: {
+      type: Boolean,
+      default: true
+    },
+    options: {
+      type: [Array, Object],
+      default: () => []
+    },
+    label: {
+      type: String,
+      default: ''
+    }
+  },
+  computed: {
+    list() {
+      if (JSON.stringify(this.options) !== '{}' && this.options.length > 0) {
+        return Array.isArray(this.options) ? this.options : [this.options]
+      } else {
+        return [
+          {
+            label: this.label,
+            color: 'white',
+            background: '#005CEEFF'
+          }
+        ]
+      }
+    }
+  },
+  data() {
+    return {
+      bottomSafeArea: uni.getSystemInfoSync().safeAreaInsets.bottom
+    }
+  },
+  methods: {
+    onClick(index) {
+      this.$emit('onClick', index)
+    }
+  }
+}
+</script>
+<style lang="scss">
+.k-button-group {
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: row;
+  background-color: white;
+  width: 100%;
+  padding: 20rpx 30rpx;
+  column-gap: 24rpx;
+  .k-button {
+    width: 100%;
+    font-size: 32rpx;
+  }
+}
+</style>

+ 115 - 0
src/components/dateSelect/k-bottom-popup/KBottomPopup.vue

@@ -0,0 +1,115 @@
+<script>
+export default {
+  name: 'KBottomPopup',
+  options: {
+    virtualHost: true
+  },
+  // #ifndef VUE3
+  model: {
+    prop: 'value',
+    event: 'input'
+  },
+  // #endif
+  props: {
+    // #ifndef VUE3
+    value: {
+      type: Boolean,
+      default: false
+    },
+    // #endif
+    // #ifdef VUE3
+    modelValue: {
+      type: Boolean,
+      default: false
+    }
+    // #endif
+  },
+  data() {
+    return {
+      stopPropagation: false
+    }
+  },
+  computed: {
+    show() {
+      // #ifdef VUE3
+      return this.modelValue
+      // #endif
+      // #ifndef VUE3
+      return this.value
+      // #endif
+    }
+  },
+  methods: {
+    maskClick() {
+      if (this.stopPropagation) {
+        this.stopPropagation = false
+        return
+      }
+      // #ifndef VUE3
+      this.$emit('input', false)
+      // #endif
+      // #ifdef VUE3
+      this.$emit('update:modelValue', false)
+      // #endif
+    },
+    /** 阻止事件冒泡 */
+    onTouchStart(e) {
+      this.stopPropagation = true
+    }
+  },
+  mounted() {}
+}
+</script>
+
+<template>
+  <view
+    :style="[
+      {
+        opacity: show ? 1 : 0,
+        zIndex: show ? 10086 : -10086
+      }
+    ]"
+    class="k-bottom-popup"
+    @click="maskClick"
+  >
+    <view
+      :class="{
+        fade: !show,
+        'fade-out': show
+      }"
+      class="tran-content"
+      @touchstart="onTouchStart"
+    >
+      <slot></slot>
+    </view>
+  </view>
+</template>
+
+<style lang="scss">
+.k-bottom-popup {
+  position: fixed;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background-color: rgba(0, 0, 0, 0.4);
+  z-index: -10086;
+  opacity: 0;
+  transition: opacity 0.3s ease-in-out;
+  .fade {
+    transform: translateY(100%);
+  }
+  .fade-out {
+    transform: translateY(0);
+  }
+  .tran-content {
+    position: absolute;
+    right: 0;
+    left: 0;
+    bottom: 0;
+    transition: transform 0.3s ease-in-out;
+  }
+}
+</style>

+ 728 - 0
src/components/dateSelect/k-date-picker/KDatePicker.vue

@@ -0,0 +1,728 @@
+<!-- eslint-disable vue/return-in-computed-property -->
+<script>
+import dayjs from './day'
+import { monthsChinese, weeksChinese, closable, left, left_double } from './utils'
+import KButton from '../k-bottom-button/KBottomButton.vue'
+import KBottomPopup from '../k-bottom-popup/KBottomPopup.vue'
+export default {
+  components: { KBottomPopup, KButton },
+  options: {
+    virtualHost: true
+  },
+  // #ifndef VUE3
+  model: {
+    prop: 'value',
+    event: 'input'
+  },
+  // #endif
+  props: {
+    // #ifndef VUE3
+    value: {
+      type: Boolean,
+      default: false
+    },
+    // #endif
+    confirmText: {
+      type: String,
+      default: '确定'
+    },
+    title: {
+      type: String,
+      default: '请选择'
+    },
+    // #ifdef VUE3
+    modelValue: {
+      type: Boolean,
+      default: false
+    },
+    // #endif
+    defaultValue: {
+      type: [String, Number, Array]
+    },
+    type: {
+      type: String, //"day" | "month" | "year"
+      default: 'day'
+    },
+    safeArea: {
+      type: Boolean,
+      default: true
+    },
+    /** 限制开始时间 **/
+    limitStartDate: {
+      type: [String, Number]
+    },
+    /** 限制结束时间 **/
+    limitEndDate: {
+      type: [String, Number]
+    },
+    /** 格式化数据 **/
+    formatter: {
+      type: String
+    },
+    /** 是否为范围选择器 **/
+    isRange: {
+      type: Boolean,
+      default: () => false
+    },
+    /** 是否为多选 **/
+    multiple: {
+      type: Boolean,
+      default: () => false
+    }
+  },
+  computed: {
+    briefDate() {
+      if (this.type === 'day') {
+        return this.currentDay.format('YYYY年MM月')
+      }
+      if (this.type === 'month') {
+        return this.currentDay.format('YYYY年')
+      }
+      if (this.type === 'year') {
+        return `${this.startYear.format('YYYY')} - ${this.startYear.add(9, 'year').format('YYYY')}`
+      }
+    },
+    selectedDate() {
+      const formatMap = {
+        day: 'YYYY-MM-DD',
+        month: 'YYYY-MM',
+        year: 'YYYY年'
+      }
+      const format = formatMap[this.type]
+      if (this.isRange) {
+        return `${this.rangeStart ? this.rangeStart.format(format) : '-'} 至 ${this.rangeEnd ? this.rangeEnd.format(format) : '-'}`
+      } else {
+        if (this.checked.length > 0) {
+          return this.checked.map((item) => item.format(format)).join('、')
+        } else {
+          return '-'
+        }
+      }
+    },
+    backText() {
+      if (this.type === 'day') {
+        return this.currentDay.format('M')
+      }
+      return ''
+    },
+    blocks() {
+      const dates =
+        this.type === 'day' ? this.days : this.type === 'month' ? this.months : this.years
+      const result = []
+      const chineseMap = {
+        day: (date) => {
+          return date.format('D')
+        },
+        month: (date) => {
+          return monthsChinese[date.month()]
+        },
+        year: (date) => {
+          return date.format('YYYY年')
+        }
+      }
+      for (const date of dates) {
+        if (!date) {
+          result.push(date)
+        } else {
+          const obj = {
+            date,
+            chinese: chineseMap[this.type](date),
+            isLimit:
+              (this.limitStartDate && date.isBefore(dayjs(this.limitStartDate))) ||
+              (this.limitEndDate && date.isAfter(dayjs(this.limitEndDate))),
+            isCurrent: date.startOf(this.type).isSame(this.sameDay.startOf(this.type)),
+            isSelect: this.checked.findIndex((item) => item.valueOf() === date.valueOf()) !== -1,
+            isStart:
+              this.rangeStart && date.startOf(this.type).isSame(this.rangeStart.startOf(this.type)),
+            isEnd:
+              this.rangeEnd && date.startOf(this.type).isSame(this.rangeEnd.startOf(this.type)),
+            isInRange:
+              this.rangeStart &&
+              this.rangeEnd &&
+              date.startOf(this.type).isAfter(this.rangeStart.startOf(this.type)) &&
+              date.startOf(this.type).isBefore(this.rangeEnd.startOf(this.type))
+          }
+          // 若果既是范围起点又是范围终点,那么设置为选中
+          if (this.isRange) {
+            obj.isSelect = obj.isStart && obj.isEnd
+          }
+          result.push(obj)
+        }
+      }
+      return result
+    },
+    days() {
+      const result = []
+      let start = this.currentDay.startOf('month')
+      const end = this.currentDay.endOf('month')
+      //计算当前月的第一天是星期几,然后在result头部补上空字符串
+      const firstDayWeek = start.day()
+      for (let i = 0; i < firstDayWeek; i++) {
+        result.push('')
+      }
+      while (start.isBefore(end)) {
+        result.push(start)
+        start = start.add(1, 'day')
+      }
+      return result
+    },
+    months() {
+      const result = []
+      for (let i = 0; i < 12; i++) {
+        const date = this.currentDay.startOf('year').add(i, 'month')
+        result.push(date)
+      }
+      return result
+    },
+    startYear() {
+      return this.currentDay.subtract(this.currentDay.year() % 10, 'year')
+    },
+    years() {
+      // 根据currentDay生成10个年份,如果是当前年则加上is-current
+      const result = []
+      // 从startYear开始生成一个10年的数组
+      for (let i = 0; i < 10; i++) {
+        const date = this.startYear.add(i, 'year')
+        result.push(date)
+      }
+      return result
+    }
+  },
+  data() {
+    return {
+      sameDay: dayjs(), // 当日
+      rangeStart: null, // 范围选择器开始日期
+      rangeEnd: null, // 范围选择器结束日期
+      checked: [], // 选中的日期
+      currentDay: dayjs(), // 当前选择器显示的日期
+      weeksChinese,
+      left,
+      closable,
+      left_double,
+      show: false
+    }
+  },
+  methods: {
+    onClick() {
+      if (this.isRange) {
+        const _rangeStart = this.rangeStart
+          ? this.formatter
+            ? this.rangeStart.format(this.formatter)
+            : this.rangeStart.valueOf()
+          : null
+        const _rangeEnd = this.rangeEnd
+          ? this.formatter
+            ? this.rangeEnd.format(this.formatter)
+            : this.rangeEnd.valueOf()
+          : null
+        this.$emit('change', [_rangeStart, _rangeEnd])
+      } else {
+        const _checked =
+          this.selectedDate !== '-'
+            ? this.multiple
+              ? this.checked.map((item) =>
+                  this.formatter ? item.format(this.formatter) : item.valueOf()
+                )
+              : this.formatter
+                ? this.checked[0].format(this.formatter)
+                : this.checked[0].valueOf()
+            : null
+        this.$emit('change', _checked)
+      }
+    },
+    handleClickItem(block) {
+      /**当day为空字符串或者在限制开始时间之前,限制开始时间之后 不允许点击 **/
+      if (
+        block === '' ||
+        (this.limitEndDate && block.date.isAfter(dayjs(this.limitEndDate))) ||
+        (this.limitStartDate && block.date.isBefore(dayjs(this.limitStartDate)))
+      )
+        return
+      if (this.isRange) {
+        //如果有结束日期和开始日期,并且点击的不是开始日期和结束日期,则将其设置为开始日期并清除结束日期
+        if (this.rangeStart && this.rangeEnd && !block.isStart && !block.isEnd) {
+          this.rangeStart = block.date
+          this.rangeEnd = null
+          return
+        }
+        // 如果点击的是选择的日期,那么就清除这些选项
+        if (block.isSelect) {
+          this.rangeStart = null
+          this.rangeEnd = null
+          return
+        }
+
+        // 如果重复点击开始日期或者结束日期则取消选择
+        if (block.isStart) {
+          // 如果没有结束日期 那么将结束日期设置为开始日期
+          if (!this.rangeEnd) {
+            this.rangeEnd = block.date
+            return
+          }
+          this.rangeStart = null
+          return
+        }
+        if (block.isEnd) {
+          this.rangeEnd = null
+          return
+        }
+        const setStartAndEndDay = (start) => {
+          if (block.date.isBefore(start)) {
+            this.rangeEnd = start
+            this.rangeStart = block.date
+          } else {
+            this.rangeEnd = block.date
+          }
+        }
+        if (this.rangeStart) {
+          setStartAndEndDay(this.rangeStart)
+        } else {
+          // 如果有结束日期,需要判断是否在结束日期之前
+          if (this.rangeEnd) {
+            setStartAndEndDay(this.rangeEnd)
+          } else {
+            this.rangeStart = block.date
+          }
+        }
+      } else {
+        // 如果重复点击则取消选择
+        if (block.isSelect) {
+          this.checked = this.checked.filter((item) => item.valueOf() !== block.date.valueOf())
+          return
+        }
+        this.multiple ? this.checked.push(block.date) : (this.checked = [block.date])
+      }
+    },
+    toggle(type, direction) {
+      if (this.type === 'day') {
+        this.currentDay = this.currentDay.add(
+          direction === 'left' ? -1 : 1,
+          type === 'single' ? 'month' : 'year'
+        )
+      }
+      if (this.type === 'month') {
+        this.currentDay = this.currentDay.add(direction === 'left' ? -1 : 1, 'year')
+      }
+      if (this.type === 'year') {
+        this.currentDay = this.currentDay.add(direction === 'left' ? -10 : 10, 'year')
+      }
+    },
+    close() {
+      // #ifndef VUE3
+      this.$emit('input', false)
+      // #endif
+      // #ifdef VUE3
+      this.$emit('update:modelValue', false)
+      // #endif
+    },
+    init() {
+      // 检查类型是否为 day | month | year
+      if (!['day', 'month', 'year'].includes(this.type)) {
+        console.error('类型必须为 day | month | year')
+        return
+      }
+      // 检查 isRange和 multiple 是否同时为 true
+      if (this.isRange && this.multiple) {
+        console.error('目前暂不支持时间段的多选')
+        return
+      }
+
+      // 清空原数据
+      this.checked = []
+      this.rangeStart = null
+      this.rangeEnd = null
+      // 初始化数据
+      if (!this.defaultValue) return
+      if (this.isRange) {
+        if (!Array.isArray(this.defaultValue) || this.defaultValue.length !== 2) {
+          console.error('区间选择器的默认值必须为长度为2的数组')
+          return
+        }
+        this.currentDay = dayjs(this.defaultValue[0])
+        this.rangeStart = dayjs(this.defaultValue[0])
+        this.rangeEnd = dayjs(this.defaultValue[1])
+      } else {
+        if (this.multiple && Array.isArray(this.defaultValue)) {
+          this.checked = this.defaultValue.map((item) => dayjs(item))
+        } else {
+          this.checked = [dayjs(this.defaultValue)]
+        }
+        this.currentDay = this.checked[0] ? dayjs(this.checked[0]) : dayjs()
+      }
+    }
+  },
+  mounted() {
+    this.init()
+  },
+  watch: {
+    // #ifdef VUE3
+    modelValue: {
+      handler(value) {
+        this.show = !!value
+      }
+    },
+    // #endif
+    // #ifndef VUE3
+    value: {
+      handler(value) {
+        this.show = !!value
+      }
+    },
+    // #endif
+    show: {
+      handler(value) {
+        // #ifdef VUE3
+        this.$emit('update:modelValue', value)
+        // #endif
+        // #ifndef VUE3
+        this.$emit('input', value)
+        // #endif
+      }
+    },
+    type: {
+      handler() {
+        this.init()
+      }
+    },
+    defaultValue: {
+      handler() {
+        this.init()
+      },
+      deep: true
+    }
+  }
+}
+</script>
+
+<template>
+  <KBottomPopup v-model="show">
+    <view class="k-date-picker">
+      <view class="inner-top">
+        <view>
+          <slot name="left">
+            <text>{{ title }}</text>
+          </slot>
+        </view>
+        <view @click="close">
+          <slot name="right">
+            <image :src="closable" class="image-closable"></image>
+          </slot>
+        </view>
+      </view>
+      <view class="inner-body">
+        <view class="inner-body__arrow">
+          <image
+            v-if="type === 'day'"
+            class="image-arrow"
+            :src="left_double"
+            @click="toggle('double', 'left')"
+          />
+          <image class="image-arrow" :src="left" @click="toggle('single', 'left')" />
+          <view class="brief">{{ briefDate }}</view>
+          <image class="image-arrow right-arrow" :src="left" @click="toggle('single', 'right')" />
+          <image
+            v-if="type === 'day'"
+            class="image-arrow right-arrow"
+            :src="left_double"
+            @click="toggle('double', 'right')"
+          />
+        </view>
+        <view class="inner-body__calendar">
+          <view
+            class="inner-body__calendar_week"
+            :style="{ columnGap: isRange ? '0' : '12rpx' }"
+            v-if="type === 'day'"
+          >
+            <view
+              class="inner-body__calendar_week--item"
+              v-for="(item, index) in weeksChinese"
+              :key="index"
+              >{{ item }}</view
+            >
+          </view>
+          <view
+            class="inner-body__calendar_block"
+            :class="{
+              'is-day': type === 'day',
+              'is-month': type === 'month',
+              'is-year': type === 'year'
+            }"
+            :data-text="backText"
+            :style="{ columnGap: isRange ? '0' : '12rpx' }"
+          >
+            <view
+              class="inner-body__calendar_block--item"
+              :class="{
+                'is-current': block.isCurrent,
+                'is-start': block.isStart,
+                'is-end': block.isEnd,
+                'is-in-range': block.isInRange,
+                'is-selected': block.isSelect,
+                'is-limit': block.isLimit
+              }"
+              v-for="(block, index) in blocks"
+              :key="index"
+              @click="handleClickItem(block)"
+            >
+              {{ block.chinese || '' }}
+            </view>
+          </view>
+        </view>
+        <!--        多选由于需要显示的数据可能会较多,这里不再就多选的数据进行展示-->
+        <view class="selected-wrap" v-if="!multiple">
+          <view class="selected-date">
+            {{ selectedDate }}
+          </view>
+        </view>
+      </view>
+    </view>
+    <KButton
+      :label="confirmText"
+      :box-shadow="false"
+      :safe-area="safeArea"
+      @onClick="onClick"
+    ></KButton>
+  </KBottomPopup>
+</template>
+
+<style lang="scss">
+.k-date-picker {
+  /** 控制提示文字的位置 **/
+  --bottom-offset: 10%;
+  /** 控制提示文字的大小 **/
+  --bottom-font-size: 18rpx;
+  /** 选中时字体的颜色**/
+  --seletct--text-color: white;
+  /** 选中时背景颜色 **/
+  --seletct--background-color: #005ceeff;
+  /** 处于区间的字体颜色 **/
+  --in-range--text-color: #005ceeff;
+  /** 处于区间的背景颜色 **/
+  --in-range--background-color: #f2f6fc;
+  /** 限制的字体颜色 **/
+  --limit--text-color: #a8abb2;
+  /** 限制的背景颜色 **/
+  --limit--background-color: #f5f7fa;
+  /** current的背景颜色 **/
+  --current--background-color: #e4edfe;
+  /** current的字体颜色 **/
+  --current--text-color: #7994b2;
+
+  box-sizing: border-box;
+  width: 100%;
+  padding: 30rpx 30rpx 20rpx;
+  background-color: white;
+  border-radius: 10px 10px 0 0;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  .is-current {
+    border-radius: 8rpx;
+    background-color: var(--current--background-color);
+    position: relative;
+    --color: var(--current--text-color);
+    &:after {
+      color: var(--color);
+      position: absolute;
+      left: 50%;
+      bottom: var(--bottom-offset);
+      transform: translate(-50%);
+      font-size: var(--bottom-font-size);
+      line-height: var(--bottom-font-size);
+      /* #ifdef APP-PLUS */
+      font-weight: 500;
+      /* #endif */
+    }
+  }
+  .is-day {
+    grid-template-columns: repeat(7, minmax(0, 1fr));
+    .is-current:after {
+      content: '本日';
+    }
+  }
+  .is-month {
+    grid-template-columns: repeat(4, minmax(0, 1fr));
+    margin-top: 24rpx;
+    .is-current:after {
+      content: '';
+    }
+  }
+  .is-year {
+    grid-template-columns: repeat(4, minmax(0, 1fr));
+    margin-top: 24rpx;
+    .is-current:after {
+      content: '本年';
+    }
+  }
+  .inner-top {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+    padding-bottom: 30rpx;
+  }
+  .inner-body {
+    &__arrow {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      justify-content: center;
+    }
+    &__calendar {
+      &_week {
+        display: grid;
+        grid-template-columns: repeat(7, minmax(0, 1fr));
+        &--item {
+          /* #ifdef MP-WEIXIN */
+          font-weight: bolder;
+          /* #endif */
+          /* #ifdef APP-PLUS */
+          font-weight: 500;
+          /* #endif */
+          color: #303133;
+          font-size: 30rpx;
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          height: 88rpx;
+        }
+      }
+
+      &_block {
+        &:after {
+          display: block;
+          content: attr(data-text);
+          color: #eef2f8ff;
+          font-size: 280rpx;
+          position: absolute;
+          left: 50%;
+          top: 50%;
+          transform: translate(-50%, -50%);
+          z-index: 1;
+        }
+        position: relative;
+        display: grid;
+        row-gap: 20rpx;
+        &--item {
+          z-index: 2;
+          font-size: 30rpx;
+          color: #7994b2;
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          aspect-ratio: 1;
+        }
+      }
+    }
+  }
+  .is-limit {
+    color: var(--limit--text-color) !important;
+    background-color: var(--limit--background-color);
+  }
+  .is-in-range {
+    --color: var(--in-range--text-color) !important;
+    background-color: var(--in-range--background-color) !important;
+    border-radius: 0 !important;
+    color: var(--in-range--text-color) !important;
+  }
+  .is-selected {
+    &:after {
+      content: '' !important;
+      color: var(--seletct--text-color) !important;
+      position: absolute;
+      left: 50%;
+      bottom: var(--bottom-offset);
+      transform: translate(-50%);
+      font-size: var(--bottom-font-size);
+      line-height: var(--bottom-font-size);
+      /* #ifdef APP-PLUS */
+      font-weight: 500;
+      /* #endif */
+    }
+    position: relative;
+    background-color: var(--seletct--background-color) !important;
+    color: var(--seletct--text-color) !important;
+    border-radius: 8rpx !important;
+  }
+  .is-start {
+    &:after {
+      content: '';
+      color: var(--seletct--text-color) !important;
+      position: absolute;
+      left: 50%;
+      bottom: var(--bottom-offset);
+      transform: translate(-50%);
+      font-size: var(--bottom-font-size);
+      line-height: var(--bottom-font-size);
+      /* #ifdef APP-PLUS */
+      font-weight: 500;
+      /* #endif */
+    }
+    position: relative;
+    background-color: var(--seletct--background-color) !important;
+    color: var(--seletct--text-color) !important;
+    border-radius: 8rpx 0 0 8rpx;
+  }
+  .is-end {
+    &:after {
+      content: '';
+      color: var(--seletct--text-color) !important;
+      position: absolute;
+      left: 50%;
+      bottom: var(--bottom-offset);
+      transform: translate(-50%);
+      font-size: var(--bottom-font-size);
+      line-height: var(--bottom-font-size);
+      /* #ifdef APP-PLUS */
+      font-weight: 500;
+      /* #endif */
+    }
+    position: relative;
+    background-color: var(--seletct--background-color) !important;
+    color: var(--seletct--text-color) !important;
+    border-radius: 0 8rpx 8rpx 0;
+  }
+  .image-closable {
+    width: 36rpx;
+    height: 36rpx;
+  }
+  .image-arrow {
+    width: 36rpx;
+    height: 36rpx;
+  }
+  .right-arrow {
+    transform: rotate(180deg);
+  }
+  .brief {
+    margin: 0 30rpx;
+    color: #000000d9;
+    font-size: 30rpx;
+    /* #ifdef MP-WEIXIN */
+    font-weight: bolder;
+    /* #endif */
+    /* #ifdef APP-PLUS */
+    font-weight: 500;
+    /* #endif */
+  }
+  .selected-date {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: center;
+    padding: 10rpx 0;
+    color: #94a0b4ff;
+    font-size: 30rpx;
+    margin-top: 20rpx;
+    width: 600rpx;
+  }
+  .selected-wrap {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+  }
+}
+</style>

+ 444 - 0
src/components/dateSelect/k-date-picker/day.js

@@ -0,0 +1,444 @@
+export default (function () {
+  'use strict'
+  var t = 1e3,
+    e = 6e4,
+    n = 36e5,
+    r = 'millisecond',
+    i = 'second',
+    s = 'minute',
+    u = 'hour',
+    a = 'day',
+    o = 'week',
+    c = 'month',
+    f = 'quarter',
+    h = 'year',
+    d = 'date',
+    l = 'Invalid Date',
+    $ =
+      /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,
+    y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,
+    M = {
+      name: 'en',
+      weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+      months:
+        'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+          '_'
+        ),
+      ordinal: function (t) {
+        var e = ['th', 'st', 'nd', 'rd'],
+          n = t % 100
+        return '[' + t + (e[(n - 20) % 10] || e[n] || e[0]) + ']'
+      }
+    },
+    m = function (t, e, n) {
+      var r = String(t)
+      return !r || r.length >= e ? t : '' + Array(e + 1 - r.length).join(n) + t
+    },
+    v = {
+      s: m,
+      z: function (t) {
+        var e = -t.utcOffset(),
+          n = Math.abs(e),
+          r = Math.floor(n / 60),
+          i = n % 60
+        return (e <= 0 ? '+' : '-') + m(r, 2, '0') + ':' + m(i, 2, '0')
+      },
+      m: function t(e, n) {
+        if (e.date() < n.date()) return -t(n, e)
+        var r = 12 * (n.year() - e.year()) + (n.month() - e.month()),
+          i = e.clone().add(r, c),
+          s = n - i < 0,
+          u = e.clone().add(r + (s ? -1 : 1), c)
+        return +(-(r + (n - i) / (s ? i - u : u - i)) || 0)
+      },
+      a: function (t) {
+        return t < 0 ? Math.ceil(t) || 0 : Math.floor(t)
+      },
+      p: function (t) {
+        return (
+          { M: c, y: h, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: f }[t] ||
+          String(t || '')
+            .toLowerCase()
+            .replace(/s$/, '')
+        )
+      },
+      u: function (t) {
+        return void 0 === t
+      }
+    },
+    g = 'en',
+    D = {}
+  D[g] = M
+  var p = '$isDayjsObject',
+    S = function (t) {
+      return t instanceof _ || !(!t || !t[p])
+    },
+    w = function t(e, n, r) {
+      var i
+      if (!e) return g
+      if ('string' == typeof e) {
+        var s = e.toLowerCase()
+        D[s] && (i = s), n && ((D[s] = n), (i = s))
+        var u = e.split('-')
+        if (!i && u.length > 1) return t(u[0])
+      } else {
+        var a = e.name
+        ;(D[a] = e), (i = a)
+      }
+      return !r && i && (g = i), i || (!r && g)
+    },
+    O = function (t, e) {
+      if (S(t)) return t.clone()
+      var n = 'object' == typeof e ? e : {}
+      return (n.date = t), (n.args = arguments), new _(n)
+    },
+    b = v
+  ;(b.l = w),
+    (b.i = S),
+    (b.w = function (t, e) {
+      return O(t, { locale: e.$L, utc: e.$u, x: e.$x, $offset: e.$offset })
+    })
+  var _ = (function () {
+      function M(t) {
+        ;(this.$L = w(t.locale, null, !0)),
+          this.parse(t),
+          (this.$x = this.$x || t.x || {}),
+          (this[p] = !0)
+      }
+      var m = M.prototype
+      return (
+        (m.parse = function (t) {
+          ;(this.$d = (function (t) {
+            var e = t.date,
+              n = t.utc
+            if (null === e) return new Date(NaN)
+            if (b.u(e)) return new Date()
+            if (e instanceof Date) return new Date(e)
+            if ('string' == typeof e && !/Z$/i.test(e)) {
+              var r = e.match($)
+              if (r) {
+                var i = r[2] - 1 || 0,
+                  s = (r[7] || '0').substring(0, 3)
+                return n
+                  ? new Date(Date.UTC(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s))
+                  : new Date(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s)
+              }
+            }
+            return new Date(e)
+          })(t)),
+            this.init()
+        }),
+        (m.init = function () {
+          var t = this.$d
+          ;(this.$y = t.getFullYear()),
+            (this.$M = t.getMonth()),
+            (this.$D = t.getDate()),
+            (this.$W = t.getDay()),
+            (this.$H = t.getHours()),
+            (this.$m = t.getMinutes()),
+            (this.$s = t.getSeconds()),
+            (this.$ms = t.getMilliseconds())
+        }),
+        (m.$utils = function () {
+          return b
+        }),
+        (m.isValid = function () {
+          return !(this.$d.toString() === l)
+        }),
+        (m.isSame = function (t, e) {
+          var n = O(t)
+          return this.startOf(e) <= n && n <= this.endOf(e)
+        }),
+        (m.isAfter = function (t, e) {
+          return O(t) < this.startOf(e)
+        }),
+        (m.isBefore = function (t, e) {
+          return this.endOf(e) < O(t)
+        }),
+        (m.$g = function (t, e, n) {
+          return b.u(t) ? this[e] : this.set(n, t)
+        }),
+        (m.unix = function () {
+          return Math.floor(this.valueOf() / 1e3)
+        }),
+        (m.valueOf = function () {
+          return this.$d.getTime()
+        }),
+        (m.startOf = function (t, e) {
+          var n = this,
+            r = !!b.u(e) || e,
+            f = b.p(t),
+            l = function (t, e) {
+              var i = b.w(n.$u ? Date.UTC(n.$y, e, t) : new Date(n.$y, e, t), n)
+              return r ? i : i.endOf(a)
+            },
+            $ = function (t, e) {
+              return b.w(
+                n.toDate()[t].apply(n.toDate('s'), (r ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e)),
+                n
+              )
+            },
+            y = this.$W,
+            M = this.$M,
+            m = this.$D,
+            v = 'set' + (this.$u ? 'UTC' : '')
+          switch (f) {
+            case h:
+              return r ? l(1, 0) : l(31, 11)
+            case c:
+              return r ? l(1, M) : l(0, M + 1)
+            case o:
+              var g = this.$locale().weekStart || 0,
+                D = (y < g ? y + 7 : y) - g
+              return l(r ? m - D : m + (6 - D), M)
+            case a:
+            case d:
+              return $(v + 'Hours', 0)
+            case u:
+              return $(v + 'Minutes', 1)
+            case s:
+              return $(v + 'Seconds', 2)
+            case i:
+              return $(v + 'Milliseconds', 3)
+            default:
+              return this.clone()
+          }
+        }),
+        (m.endOf = function (t) {
+          return this.startOf(t, !1)
+        }),
+        (m.$set = function (t, e) {
+          var n,
+            o = b.p(t),
+            f = 'set' + (this.$u ? 'UTC' : ''),
+            l = ((n = {}),
+            (n[a] = f + 'Date'),
+            (n[d] = f + 'Date'),
+            (n[c] = f + 'Month'),
+            (n[h] = f + 'FullYear'),
+            (n[u] = f + 'Hours'),
+            (n[s] = f + 'Minutes'),
+            (n[i] = f + 'Seconds'),
+            (n[r] = f + 'Milliseconds'),
+            n)[o],
+            $ = o === a ? this.$D + (e - this.$W) : e
+          if (o === c || o === h) {
+            var y = this.clone().set(d, 1)
+            y.$d[l]($), y.init(), (this.$d = y.set(d, Math.min(this.$D, y.daysInMonth())).$d)
+          } else l && this.$d[l]($)
+          return this.init(), this
+        }),
+        (m.set = function (t, e) {
+          return this.clone().$set(t, e)
+        }),
+        (m.get = function (t) {
+          return this[b.p(t)]()
+        }),
+        (m.add = function (r, f) {
+          var d,
+            l = this
+          r = Number(r)
+          var $ = b.p(f),
+            y = function (t) {
+              var e = O(l)
+              return b.w(e.date(e.date() + Math.round(t * r)), l)
+            }
+          if ($ === c) return this.set(c, this.$M + r)
+          if ($ === h) return this.set(h, this.$y + r)
+          if ($ === a) return y(1)
+          if ($ === o) return y(7)
+          var M = ((d = {}), (d[s] = e), (d[u] = n), (d[i] = t), d)[$] || 1,
+            m = this.$d.getTime() + r * M
+          return b.w(m, this)
+        }),
+        (m.subtract = function (t, e) {
+          return this.add(-1 * t, e)
+        }),
+        (m.format = function (t) {
+          var e = this,
+            n = this.$locale()
+          if (!this.isValid()) return n.invalidDate || l
+          var r = t || 'YYYY-MM-DDTHH:mm:ssZ',
+            i = b.z(this),
+            s = this.$H,
+            u = this.$m,
+            a = this.$M,
+            o = n.weekdays,
+            c = n.months,
+            f = n.meridiem,
+            h = function (t, n, i, s) {
+              return (t && (t[n] || t(e, r))) || i[n].slice(0, s)
+            },
+            d = function (t) {
+              return b.s(s % 12 || 12, t, '0')
+            },
+            $ =
+              f ||
+              function (t, e, n) {
+                var r = t < 12 ? 'AM' : 'PM'
+                return n ? r.toLowerCase() : r
+              }
+          return r.replace(y, function (t, r) {
+            return (
+              r ||
+              (function (t) {
+                switch (t) {
+                  case 'YY':
+                    return String(e.$y).slice(-2)
+                  case 'YYYY':
+                    return b.s(e.$y, 4, '0')
+                  case 'M':
+                    return a + 1
+                  case 'MM':
+                    return b.s(a + 1, 2, '0')
+                  case 'MMM':
+                    return h(n.monthsShort, a, c, 3)
+                  case 'MMMM':
+                    return h(c, a)
+                  case 'D':
+                    return e.$D
+                  case 'DD':
+                    return b.s(e.$D, 2, '0')
+                  case 'd':
+                    return String(e.$W)
+                  case 'dd':
+                    return h(n.weekdaysMin, e.$W, o, 2)
+                  case 'ddd':
+                    return h(n.weekdaysShort, e.$W, o, 3)
+                  case 'dddd':
+                    return o[e.$W]
+                  case 'H':
+                    return String(s)
+                  case 'HH':
+                    return b.s(s, 2, '0')
+                  case 'h':
+                    return d(1)
+                  case 'hh':
+                    return d(2)
+                  case 'a':
+                    return $(s, u, !0)
+                  case 'A':
+                    return $(s, u, !1)
+                  case 'm':
+                    return String(u)
+                  case 'mm':
+                    return b.s(u, 2, '0')
+                  case 's':
+                    return String(e.$s)
+                  case 'ss':
+                    return b.s(e.$s, 2, '0')
+                  case 'SSS':
+                    return b.s(e.$ms, 3, '0')
+                  case 'Z':
+                    return i
+                }
+                return null
+              })(t) ||
+              i.replace(':', '')
+            )
+          })
+        }),
+        (m.utcOffset = function () {
+          return 15 * -Math.round(this.$d.getTimezoneOffset() / 15)
+        }),
+        (m.diff = function (r, d, l) {
+          var $,
+            y = this,
+            M = b.p(d),
+            m = O(r),
+            v = (m.utcOffset() - this.utcOffset()) * e,
+            g = this - m,
+            D = function () {
+              return b.m(y, m)
+            }
+          switch (M) {
+            case h:
+              $ = D() / 12
+              break
+            case c:
+              $ = D()
+              break
+            case f:
+              $ = D() / 3
+              break
+            case o:
+              $ = (g - v) / 6048e5
+              break
+            case a:
+              $ = (g - v) / 864e5
+              break
+            case u:
+              $ = g / n
+              break
+            case s:
+              $ = g / e
+              break
+            case i:
+              $ = g / t
+              break
+            default:
+              $ = g
+          }
+          return l ? $ : b.a($)
+        }),
+        (m.daysInMonth = function () {
+          return this.endOf(c).$D
+        }),
+        (m.$locale = function () {
+          return D[this.$L]
+        }),
+        (m.locale = function (t, e) {
+          if (!t) return this.$L
+          var n = this.clone(),
+            r = w(t, e, !0)
+          return r && (n.$L = r), n
+        }),
+        (m.clone = function () {
+          return b.w(this.$d, this)
+        }),
+        (m.toDate = function () {
+          return new Date(this.valueOf())
+        }),
+        (m.toJSON = function () {
+          return this.isValid() ? this.toISOString() : null
+        }),
+        (m.toISOString = function () {
+          return this.$d.toISOString()
+        }),
+        (m.toString = function () {
+          return this.$d.toUTCString()
+        }),
+        M
+      )
+    })(),
+    k = _.prototype
+  return (
+    (O.prototype = k),
+    [
+      ['$ms', r],
+      ['$s', i],
+      ['$m', s],
+      ['$H', u],
+      ['$W', a],
+      ['$M', c],
+      ['$y', h],
+      ['$D', d]
+    ].forEach(function (t) {
+      k[t[1]] = function (e) {
+        return this.$g(e, t[0], t[1])
+      }
+    }),
+    (O.extend = function (t, e) {
+      return t.$i || (t(e, _, O), (t.$i = !0)), O
+    }),
+    (O.locale = w),
+    (O.isDayjs = S),
+    (O.unix = function (t) {
+      return O(1e3 * t)
+    }),
+    (O.en = D[g]),
+    (O.Ls = D),
+    (O.p = {}),
+    O
+  )
+})()

+ 23 - 0
src/components/dateSelect/k-date-picker/utils.js

@@ -0,0 +1,23 @@
+const weeksChinese = ['日', '一', '二', '三', '四', '五', '六']
+const monthsChinese = [
+  '一月',
+  '二月',
+  '三月',
+  '四月',
+  '五月',
+  '六月',
+  '七月',
+  '八月',
+  '九月',
+  '十月',
+  '十一月',
+  '十二月'
+]
+const left =
+  'data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaWNvbiIgd2lkdGg9IjU0IiBoZWlnaHQ9IjU0IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiMyYzJjMmMiIGQ9Ik0zODQgNTEybDE5MiAxOTIgMjkuODY3LTI5Ljg2N0w0NDMuNzMzIDUxMmwxNjIuMTM0LTE2Mi4xMzNMNTc2IDMyMCAzODQgNTEyeiIvPjwvc3ZnPg=='
+const left_double =
+  'data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaWNvbiIgd2lkdGg9IjU0IiBoZWlnaHQ9IjU0IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiMyYzJjMmMiIGQ9Ik01NTAuNCA0OTQuOTMzbDE5MiAxOTIgMjkuODY3LTI5Ljg2Ni0xNjIuMTM0LTE2Mi4xMzRMNzcyLjI2NyAzMzIuOCA3NDIuNCAzMDIuOTMzbC0xOTIgMTkyem0tMjU2IDBsMTkyIDE5MiAyOS44NjctMjkuODY2LTE2Mi4xMzQtMTYyLjEzNEw1MTYuMjY3IDMzMi44IDQ4Ni40IDMwMi45MzNsLTE5MiAxOTJ6Ii8+PC9zdmc+'
+const closable =
+  'data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaWNvbiIgd2lkdGg9IjU0IiBoZWlnaHQ9IjU0IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiMyYzJjMmMiIGQ9Ik00ODEuODM1IDUxMkwxNTUuNTg0IDE4NS43NWEyMS4zMzMgMjEuMzMzIDAgMCAxIDMwLjE2NS0zMC4xNjZMNTEyIDQ4MS44MzRsMzI2LjI1LTMyNi4yNWEyMS4zMzMgMjEuMzMzIDAgMCAxIDMwLjE2NiAzMC4xNjVMNTQyLjE2NiA1MTJsMzI2LjI1IDMyNi4yNWEyMS4zMzMgMjEuMzMzIDAgMCAxLTMwLjE2NSAzMC4xNjZMNTEyIDU0Mi4xNjZsLTMyNi4yNSAzMjYuMjVhMjEuMzMzIDIxLjMzMyAwIDEgMS0zMC4xNjYtMzAuMTY1TDQ4MS44MzQgNTEyeiIvPjwvc3ZnPg=='
+
+export { weeksChinese, monthsChinese, left, left_double, closable }

+ 45 - 0
src/components/noData/index.vue

@@ -0,0 +1,45 @@
+<!--
+ * @Description: 无数据
+ * @Author: hanyu
+ * @Date: 2020-07-21 10:14:59
+ * @LastEditTime: 2022/12/01
+ * @LastEditors: Please set LastEditors
+-->
+<template>
+  <view class="">
+    <view class="no-data">
+      <image src="@/static/images/common/no-data.png" />
+      <text class="txt">{{ desc }}</text>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+const props = withDefaults(
+  defineProps<{
+    desc?: string
+  }>(),
+  {
+    desc: '暂无数据'
+  }
+)
+</script>
+<style lang="scss" scoped>
+.no-data {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding-top: 300rpx;
+  flex-direction: column;
+
+  .txt {
+    margin-top: 28rpx;
+    font-size: 28rpx;
+    color: #898989;
+  }
+  image {
+    width: 300rpx;
+    height: 260rpx;
+  }
+}
+</style>

+ 147 - 0
src/components/sharePopup/index.vue

@@ -0,0 +1,147 @@
+<template>
+  <uv-popup ref="shrePopupRef" mode="bottom" round="15" @change="popupChange">
+    <view class="share-popup">
+      <view class="btns">
+        <button class="btn" plain="true" @click="close">取消</button>
+        <button
+          :disabled="disabled"
+          class="btn confirm"
+          plain="true"
+          :data-title="shareTitle"
+          :data-id="sharePopupId"
+          :data-packageId="packageId"
+          :data-remark="remark || ''"
+          open-type="share"
+        >
+          确定
+        </button>
+      </view>
+      <view class="tips"> 注意:不能针对非医疗专业人员转发处方药相关宣传信息。 </view>
+      <view class="remark">
+        <view class="title">备注</view>
+        <uv-input v-model="remark" />
+      </view>
+      <view class="picker">
+        <view class="title">选择执行包</view>
+        <picker-view @change="pickerChange" @pickstart="pickStart" @pickend="pickEnd">
+          <picker-view-column class="picker-view-column">
+            <view class="picker-item" v-for="item in packageList" :key="item.packageList">{{
+              item.label
+            }}</view>
+          </picker-view-column>
+        </picker-view>
+      </view>
+    </view>
+  </uv-popup>
+</template>
+
+<script setup lang="ts">
+import { getPackageListByTaskTypeApi } from '@/service/modules/getTask'
+import { ref, watch } from 'vue'
+import { defineEmits } from 'vue'
+
+const emit = defineEmits(['initInfo'])
+
+const props = defineProps({
+  sharePopupType: String,
+  sharePopupId: String,
+  shareTitle: String
+})
+
+watch(
+  () => props.sharePopupId,
+  () => {
+    shrePopupRef.value.open()
+    getPackageListByTaskType()
+  }
+)
+
+const remark = ref()
+const disabled = ref(false)
+
+const shrePopupRef = ref()
+
+const packageId = ref('')
+const packageList = ref()
+const getPackageListByTaskType = async () => {
+  if (props.sharePopupType) {
+    const res = await getPackageListByTaskTypeApi(props.sharePopupType)
+    packageList.value = res.data
+    if (res.data.length) {
+      packageId.value = res.data[0].value
+    }
+  }
+}
+
+const pickerChange = (e: any) => {
+  const val = e.detail.value[0]
+  packageId.value = packageList.value[val].value
+}
+
+const pickStart = () => {
+  disabled.value = true
+}
+const pickEnd = () => {
+  disabled.value = false
+}
+
+const close = () => {
+  shrePopupRef.value.close()
+}
+
+const popupChange = (e: any) => {
+  if (!e.show) {
+    emit('initInfo')
+  }
+}
+defineExpose({
+  close
+})
+</script>
+
+<style lang="scss" scoped>
+.share-popup {
+  height: 65vh;
+  padding: 30rpx;
+  .btns {
+    height: 80rpx;
+    padding: 0 20rpx;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .btn {
+      margin: 0;
+      height: 80rpx;
+      font-size: 30rpx;
+      border: none;
+    }
+    .confirm {
+      color: #6eb657;
+    }
+  }
+  .tips {
+    margin-top: 30rpx;
+    color: #f91f1f;
+    font-size: 24rpx;
+    line-height: 30rpx;
+  }
+  .remark {
+    margin-top: 30rpx;
+    .title {
+      margin-bottom: 20rpx;
+    }
+  }
+  .picker {
+    margin-top: 30rpx;
+    .picker-view-column {
+      margin-top: 30rpx;
+      height: 25vh;
+      .picker-item {
+        text-align: center;
+        line-height: 68rpx;
+      }
+    }
+  }
+}
+</style>

+ 89 - 0
src/components/tabber/index.vue

@@ -0,0 +1,89 @@
+<template>
+  <uv-tabbar :value="current" @change="change" activeColor="#6eb657">
+    <uv-tabbar-item v-for="item in currList" :text="item.text" :key="item.text" :name="item.name">
+      <template v-slot:active-icon>
+        <image class="icon" :src="item.selectedIconPath"></image>
+      </template>
+      <template v-slot:inactive-icon>
+        <image class="icon" :src="item.iconPath"></image>
+      </template>
+    </uv-tabbar-item>
+  </uv-tabbar>
+</template>
+
+<script setup lang="ts">
+import { onShow } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+import { useTabbar } from '@/store/tabbar'
+const tabbar = useTabbar()
+const listA = [
+  {
+    text: '工作台',
+    name: 'work',
+    path: '/pages/index/index',
+    iconPath: '/static/images/common/tabbar/work.png',
+    selectedIconPath: '/static/images/common/tabbar/workAct.png'
+  },
+  {
+    text: '资讯',
+    name: 'news',
+    path: '/pages/news/index',
+    iconPath: '/static/images/common/tabbar/news.png',
+    selectedIconPath: '/static/images/common/tabbar/newsAct.png'
+  },
+  {
+    text: '我的',
+    name: 'mine',
+    path: '/pages/mine/index',
+    iconPath: '/static/images/common/tabbar/mine.png',
+    selectedIconPath: '/static/images/common/tabbar/mineAct.png'
+  }
+]
+const listB = [
+  {
+    text: '工作台',
+    name: 'work',
+    path: '/pages/index/index',
+    iconPath: '/static/images/common/tabbar/work.png',
+    selectedIconPath: '/static/images/common/tabbar/workAct.png'
+  },
+  {
+    text: '我的',
+    name: 'mine',
+    path: '/pages/mine/index',
+    iconPath: '/static/images/common/tabbar/mine.png',
+    selectedIconPath: '/static/images/common/tabbar/mineAct.png'
+  }
+]
+
+const currList = ref(listA)
+
+const current = ref()
+onShow(() => {
+  if (tabbar.roleType === 0) {
+    currList.value = listA
+  } else {
+    currList.value = listB
+  }
+  current.value = tabbar.currentTabbar
+})
+
+const change = (name: string) => {
+  if (name === current.value) return
+  const curr = currList.value.find((item) => item.name === name)
+  tabbar.setCurrentTabbar(name)
+  if (curr) {
+    const path = curr.path
+    uni.switchTab({
+      url: path
+    })
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.icon {
+  width: 36rpx;
+  height: 36rpx;
+}
+</style>

+ 150 - 0
src/components/table/tableData.vue

@@ -0,0 +1,150 @@
+<template>
+  <view class="table">
+    <uni-table border stripe emptyText="暂无更多数据">
+      <!-- 表头行 -->
+      <uni-tr>
+        <uni-th align="center" width="50">序号</uni-th>
+        <uni-th align="center">上级服务类型</uni-th>
+        <uni-th align="center" width="50">占比(%)</uni-th>
+        <uni-th align="center">任务类型</uni-th>
+        <uni-th align="center" width="50">积分值</uni-th>
+        <uni-th align="center" width="50">任务个数</uni-th>
+        <uni-th align="center" width="80">任务积分值</uni-th>
+      </uni-tr>
+      <!-- 表格数据行 -->
+      <uni-tr v-for="(item, index) in tableData" :key="item?.taskTypeId" index>
+        <uni-td>{{ index + 1 }}</uni-td>
+        <uni-td>{{ showInfo(item, index) }}</uni-td>
+        <uni-td>
+          <text
+            :class="{
+              error: item.score != 0 && (item.percentage < 25 || item.percentage > 50)
+            }"
+            >{{ showPercentage(item, index) }}</text
+          >
+        </uni-td>
+        <uni-td>{{ item.taskTypeName }}</uni-td>
+        <uni-td>{{ item.score }}</uni-td>
+        <uni-td>
+          <input type="number" @blur="(e) => change(e, index, item)" v-model="item.qty" />
+        </uni-td>
+        <uni-td>{{ item.subtotal }}</uni-td>
+      </uni-tr>
+      <!-- 结尾 -->
+      <uni-tr>
+        <uni-td>总计</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>{{ totalQty }}</uni-td>
+        <uni-td>{{ totalsubtotal }}</uni-td>
+      </uni-tr>
+    </uni-table>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { getWmtasktypePageApi } from '@/service/modules/objectivesList'
+import { onMounted, ref } from 'vue'
+
+const porops = defineProps({
+  planScore: Number
+})
+
+const tableData = ref<any[]>([])
+
+const getList = async () => {
+  const obj = {
+    current: 1,
+    size: 100,
+    status: '3'
+  }
+  const res = await getWmtasktypePageApi(obj)
+  tableData.value = res?.data?.records.map((item: any) => {
+    if (item.delFlag == 0) {
+      const obj = {
+        qty: 0,
+        subtotal: 0,
+        editable: false,
+        baseId: item.baseId,
+        percentage: 0,
+        taskTypeName: item.taskTypeName,
+        score: item.score,
+        taskTypeId: item.id
+      }
+      return obj
+    }
+  })
+}
+
+const showInfo = (item: any, index: number) => {
+  if (index === 0) {
+    return item.baseId
+  }
+  if (tableData.value[index - 1].baseId === item.baseId) {
+    return ''
+  } else {
+    return item.baseId
+  }
+}
+const showPercentage = (item: any, index: number) => {
+  if (index === 0) {
+    return item.percentage
+  }
+  if (tableData.value[index - 1].baseId === item.baseId) {
+    return ''
+  } else {
+    return item.percentage
+  }
+}
+
+onMounted(() => {
+  getList()
+})
+
+const totalQty = ref(0)
+const totalsubtotal = ref(0)
+
+const calculatePercentage = (part, total) => {
+  if (total === 0) return 0 // 避免除以0错误
+  return Number(((part / total) * 100).toFixed(2))
+}
+
+const change = (detail: any, index: number, row: any) => {
+  tableData.value[index].subtotal = tableData.value[index].qty * tableData.value[index].score
+  totalQty.value = tableData.value.reduce((sum, row) => Number(sum) + Number(row.qty), 0)
+  totalsubtotal.value = tableData.value.reduce((sum, row) => Number(sum) + Number(row.subtotal), 0)
+
+  const allSubtotal = tableData.value.reduce((accumulator, currentValue) => {
+    if (currentValue.baseId === row.baseId) {
+      return accumulator + currentValue.subtotal
+    }
+    return accumulator
+  }, 0)
+
+  const percentage = calculatePercentage(allSubtotal, porops.planScore)
+  tableData.value.forEach((item) => {
+    if (item.baseId === row.baseId) {
+      item.percentage = percentage
+    }
+  })
+}
+
+const getData = () => {
+  return tableData.value
+}
+defineExpose({ getData })
+</script>
+
+<style lang="scss" scoped>
+.table {
+  width: 700rpx;
+  min-height: 300rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+}
+.error {
+  color: #f78989;
+}
+</style>

+ 123 - 0
src/components/table/tableDetail.vue

@@ -0,0 +1,123 @@
+<template>
+  <view class="table">
+    <uni-table border stripe emptyText="暂无更多数据">
+      <!-- 表头行 -->
+      <uni-tr>
+        <uni-th align="center" width="50">序号</uni-th>
+        <uni-th align="center">上级服务类型</uni-th>
+        <uni-th align="center" width="50">占比(%)</uni-th>
+        <uni-th align="center">任务类型</uni-th>
+        <uni-th align="center" width="50">积分值</uni-th>
+        <uni-th align="center" width="50">任务个数</uni-th>
+        <uni-th align="center" width="80">任务积分值</uni-th>
+      </uni-tr>
+      <!-- 表格数据行 -->
+      <uni-tr v-for="(item, index) in tableData" :key="item?.taskTypeId" index>
+        <uni-td>{{ index + 1 }}</uni-td>
+        <uni-td>{{ showInfo(item, index) }}</uni-td>
+        <uni-td>
+          <text
+            :class="{
+              error: item.score != 0 && (item.percentage < 25 || item.percentage > 50)
+            }"
+            >{{ showPercentage(item, index) }}</text
+          >
+        </uni-td>
+        <uni-td>{{ item.taskTypeName }}</uni-td>
+        <uni-td>{{ item.score }}</uni-td>
+        <uni-td>
+          <input type="number" @blur="(e) => change(e, index, item)" v-model="item.qty" />
+        </uni-td>
+        <uni-td>{{ item.subtotal }}</uni-td>
+      </uni-tr>
+      <!-- 结尾 -->
+      <uni-tr>
+        <uni-td>总计</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>{{ totalQty }}</uni-td>
+        <uni-td>{{ totalsubtotal }}</uni-td>
+      </uni-tr>
+    </uni-table>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { getPlanDetailsApi } from '@/service/modules/objectivesList'
+import { ref } from 'vue'
+
+const porops = defineProps({
+  planScore: Number
+})
+
+const tableData = ref<any[]>([])
+const totalQty = ref(0)
+const totalsubtotal = ref(0)
+const getDetail = async (id: string) => {
+  const res = await getPlanDetailsApi(id)
+  tableData.value = res.data.items
+  totalQty.value = res.data.qty
+  totalsubtotal.value = res.data.total
+
+  let arr = tableData.value.map((item) => item.baseId)
+  arr = [...new Set(arr)]
+  for (let currBaseId of arr) {
+    const allSubtotal = tableData.value.reduce((accumulator, currentValue) => {
+      if (currentValue.baseId === currBaseId) {
+        return accumulator + currentValue.subtotal
+      }
+      return accumulator
+    }, 0)
+    const percentage = calculatePercentage(allSubtotal, porops.planScore)
+    tableData.value.forEach((item) => {
+      if (item.baseId === currBaseId) {
+        item.percentage = percentage
+      }
+    })
+  }
+
+  return res
+}
+
+const calculatePercentage = (part, total) => {
+  if (total === 0) return 0 // 避免除以0错误
+  return Number(((part / total) * 100).toFixed(2))
+}
+
+const showInfo = (item: any, index: number) => {
+  if (index === 0) {
+    return item.baseId
+  }
+  if (tableData.value[index - 1].baseId === item.baseId) {
+    return ''
+  } else {
+    return item.baseId
+  }
+}
+const showPercentage = (item: any, index: number) => {
+  if (index === 0) {
+    return item.percentage
+  }
+  if (tableData.value[index - 1].baseId === item.baseId) {
+    return ''
+  } else {
+    return item.percentage
+  }
+}
+
+defineExpose({ getDetail })
+</script>
+
+<style lang="scss" scoped>
+.table {
+  width: 700rpx;
+  min-height: 300rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+}
+.error {
+  color: #f78989;
+}
+</style>

+ 203 - 0
src/components/uploadImg/index.vue

@@ -0,0 +1,203 @@
+<template>
+  <view class="upload" @click="beforeUploadImg">
+    <view class="icon-add"></view>
+    <view class="icon-add rotate"></view>
+    <canvas
+      :style="{
+        width: `${thumbWidth}px`,
+        height: `${thumbHeight}px`,
+        position: 'fixed',
+        left: '10000rpx'
+      }"
+      canvas-id="myCanvas"
+    ></canvas>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { uploadFile } from '@/utils/upload'
+import { onMounted, defineEmits, ref, getCurrentInstance } from 'vue'
+import { getWxLocationApi } from '@/wxUtils/index'
+import { qqmapsdk } from '@/wxUtils/QQMapWX'
+
+const emit = defineEmits(['uploadImgInfo'])
+
+const { ctx: _this } = getCurrentInstance() as any
+
+const porops = defineProps({
+  count: Number
+})
+
+interface imgType {
+  path: string
+  url: string
+}
+
+const sourceType = ref<string[]>([])
+
+const beforeUploadImg = () => {
+  uni.showActionSheet({
+    itemList: ['相机', '从相册选择'],
+    success: function (res) {
+      if (res.tapIndex === 0) {
+        sourceType.value = ['camera']
+      } else {
+        sourceType.value = ['album']
+      }
+      uploadImg()
+    },
+    fail: function (res) {}
+  })
+}
+
+onMounted(() => {
+  getLocation()
+})
+
+const address = ref()
+const getLocation = async () => {
+  try {
+    const res: any = await getWxLocationApi()
+    qqmapsdk.reverseGeocoder({
+      location: {
+        latitude: res?.latitude,
+        longitude: res?.longitude
+      },
+      success: function (res: any) {
+        const result = res.result
+        address.value = result.address
+      }
+    })
+  } catch (e) {
+    uni.showToast({
+      title: '获取定位失败',
+      icon: 'none'
+    })
+    console.log(e)
+  }
+}
+
+const uploadImg = async () => {
+  uni.chooseImage({
+    count: porops?.count || 9,
+    sizeType: ['original', 'compressed'],
+    sourceType: sourceType.value,
+    async success(res: any) {
+      let tempFiles = res.tempFiles
+      // 当前相片来源为拍照
+      if (sourceType.value[0] === 'camera') {
+        const path = await addWatermark(tempFiles[0].path)
+        if (path) {
+          res.tempFiles[0].path = path
+          tempFiles[0].path = path
+        }
+      }
+      // 保存上传成功的数据
+      const imageValue: imgType[] = []
+      // 使用map而不是forEach,因为map会返回一个Promise数组
+      const uploadPromises = tempFiles.map(async (item: any) => {
+        let res: any = await uploadFile(item.path)
+        if (res?.code === 0) {
+          // 当前为拍照
+          if (sourceType.value[0] === 'camera') {
+            if (res?.data?.url) {
+              res.data.url = res.data.url + ';1'
+            }
+          } else if (sourceType.value[0] === 'album') {
+            res.data.url = res.data.url + ';2'
+          }
+          imageValue.push({
+            path: res?.data?.url,
+            url: import.meta.env.VITE_APP_URL + res?.data?.url
+          })
+        }
+      })
+      // 使用Promise.all等待所有的uploadFile函数执行完毕
+      await Promise.all(uploadPromises)
+      // 所有uploadFile上传完成后执行emit
+      emit('uploadImgInfo', imageValue)
+    }
+  })
+}
+
+const thumbWidth = ref()
+const thumbHeight = ref()
+const addWatermark = (fileUrl: string) => {
+  const dpr = wx.getSystemInfoSync().pixelRatio
+  return new Promise((resolve) => {
+    uni.getImageInfo({
+      src: fileUrl, // 替换为你的图片路径
+      success: async (res) => {
+        thumbWidth.value = res.width
+        thumbHeight.value = res.height
+        // #ifdef MP-WEIXIN
+        let text = address.value
+        let textArr = []
+        let oneRowTextNum = Math.floor(thumbWidth.value / 31) // 一行可以显示的文字数, 除以的31稍微比文字30大, 防止内容溢出
+        if (text?.length <= oneRowTextNum) {
+          textArr.push(text)
+        } else {
+          const totalRowNum = Math.ceil(text.length / oneRowTextNum) // 文字要显示的总行数
+          for (let i = 0; i < totalRowNum; i++) {
+            textArr.push(text.substr(i * oneRowTextNum, oneRowTextNum))
+          }
+        }
+        const time =
+          new Date().toJSON().substring(0, 10) + ' ' + new Date().toTimeString().substring(0, 8)
+        const ctx = uni.createCanvasContext('myCanvas', _this)
+        ctx.drawImage(fileUrl, 0, 0, thumbWidth.value, thumbHeight.value) //先画出图片
+        ctx.setFontSize(30) //注意:设置文字大小必须放在填充文字之前,否则不生效
+        ctx.setFillStyle('white')
+        for (let i = 0; i < textArr.length; i++) {
+          ctx.fillText(textArr[i], 10, 72 + i * 40)
+        }
+        ctx.setFontSize(26)
+        ctx.fillText(time, 10, 35)
+        ctx.draw(false, () => {
+          setTimeout(() => {
+            //绘画完成回调
+            //生成图片
+            uni.canvasToTempFilePath(
+              {
+                fileType: 'jpg',
+                canvasId: 'myCanvas',
+                success: async (res: any) => {
+                  resolve(res.tempFilePath)
+                },
+                fail(err: any) {
+                  console.log(err)
+                }
+              },
+              _this
+            )
+          }, 600)
+        })
+        // #endif
+      }
+    })
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.upload {
+  width: 200rpx;
+  height: 200rpx;
+  border: 2rpx solid #eee;
+  border-radius: 3px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  .icon-add {
+    width: 100rpx;
+    height: 10rpx;
+    background-color: #f1f1f1;
+    border-radius: 4rpx;
+  }
+  .rotate {
+    position: absolute;
+    transform: rotate(90deg);
+  }
+}
+</style>

+ 0 - 0
src/config/index.ts


+ 37 - 0
src/constants/provinces.ts

@@ -0,0 +1,37 @@
+export const provinces = [
+  { label: '全国', value: '1' },
+  { label: '北京市', value: '11' },
+  { label: '天津市', value: '12' },
+  { label: '河北省', value: '13' },
+  { label: '山西省', value: '14' },
+  { label: '内蒙古自治区', value: '15' },
+  { label: '辽宁省', value: '21' },
+  { label: '吉林省', value: '22' },
+  { label: '黑龙江省', value: '23' },
+  { label: '上海市', value: '31' },
+  { label: '江苏省', value: '32' },
+  { label: '浙江省', value: '33' },
+  { label: '安徽省', value: '34' },
+  { label: '福建省', value: '35' },
+  { label: '江西省', value: '36' },
+  { label: '山东省', value: '37' },
+  { label: '河南省', value: '41' },
+  { label: '湖北省', value: '42' },
+  { label: '湖南省', value: '43' },
+  { label: '广东省', value: '44' },
+  { label: '广西壮族自治区', value: '45' },
+  { label: '海南省', value: '46' },
+  { label: '重庆市', value: '50' },
+  { label: '四川省', value: '51' },
+  { label: '贵州省', value: '52' },
+  { label: '云南省', value: '53' },
+  { label: '西藏自治区', value: '54' },
+  { label: '陕西省', value: '61' },
+  { label: '甘肃省', value: '62' },
+  { label: '青海省', value: '63' },
+  { label: '宁夏回族自治区', value: '64' },
+  { label: '新疆维吾尔自治区', value: '65' },
+  { label: '台湾', value: '66' },
+  { label: '香港', value: '67' },
+  { label: '澳门', value: '68' }
+]

+ 6 - 0
src/constants/rolesType.ts

@@ -0,0 +1,6 @@
+export enum RoleEnum {
+  '全职学术推广员' = 5,
+  '兼职学术推广员' = 6,
+  '兼职CRC' = 10,
+  'HCP' = 13
+}

+ 9 - 0
src/custom.d.ts

@@ -0,0 +1,9 @@
+declare module '@climblee/uv-ui'
+
+declare module './mp_ecard_sdk/main.js'
+
+declare interface Uni {
+  $uv: any
+}
+
+declare const wx: any

+ 8 - 0
src/env.d.ts

@@ -0,0 +1,8 @@
+/// <reference types="vite/client" />
+
+declare module '*.vue' {
+  import { DefineComponent } from 'vue'
+  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
+  const component: DefineComponent<{}, {}, any>
+  export default component
+}

+ 6 - 0
src/hooks/useGetLoginStatus.ts

@@ -0,0 +1,6 @@
+import { useLoginStore } from '@/store/login'
+
+export default function useGetLoginStatus() {
+  const loginStore = useLoginStore()
+  return loginStore.isLogin
+}

+ 17 - 0
src/hooks/useLoginout.ts

@@ -0,0 +1,17 @@
+import { useLoginStore } from '@/store/login'
+import { useTabbar } from '@/store/tabbar'
+
+export default async function useLogiutFn() {
+  const loginStore = useLoginStore()
+  const tabbarStore = useTabbar()
+  if (loginStore.accessToken) {
+    await loginStore.logoutFn()
+  }
+  loginStore.$reset()
+  tabbarStore.$reset()
+  setTimeout(() => {
+    uni.reLaunch({
+      url: '/pages/login/index'
+    })
+  }, 500)
+}

+ 6 - 0
src/hooks/useUpdatedUserInfo.ts

@@ -0,0 +1,6 @@
+import { useLoginStore } from '@/store/login'
+
+export default function useUpdateUserInfo() {
+  const loginStore = useLoginStore()
+  if (loginStore.isLogin) loginStore.getUserInfoByCode()
+}

+ 26 - 0
src/main.ts

@@ -0,0 +1,26 @@
+import { createSSRApp } from 'vue'
+import * as Pinia from 'pinia'
+import uvUI from '@climblee/uv-ui'
+import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
+import tabbar from './components/tabber/index.vue'
+import { Request } from '@/service/request'
+import App from './App.vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  app.config.globalProperties.uni = uni
+
+  const store = Pinia.createPinia()
+
+  app.component('Tabbar', tabbar)
+  store.use(piniaPluginPersistedstate)
+
+  app.use(store)
+  app.use(uvUI)
+
+  Request()
+
+  return {
+    app,
+    Pinia
+  }
+}

+ 91 - 0
src/manifest.json

@@ -0,0 +1,91 @@
+{
+  "name": "",
+  "appid": "",
+  "description": "",
+  "versionName": "1.0.0",
+  "versionCode": "100",
+  "transformPx": false,
+  /* 5+App特有相关 */
+  "app-plus": {
+    "usingComponents": true,
+    "nvueStyleCompiler": "uni-app",
+    "compilerVersion": 3,
+    "splashscreen": {
+      "alwaysShowBeforeRender": true,
+      "waiting": true,
+      "autoclose": true,
+      "delay": 0
+    },
+    /* 模块配置 */
+    "modules": {},
+    /* 应用发布信息 */
+    "distribute": {
+      /* android打包配置 */
+      "android": {
+        "permissions": [
+          "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+          "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+          "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+          "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+          "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+          "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+          "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+          "<uses-feature android:name=\"android.hardware.camera\"/>",
+          "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+        ]
+      },
+      /* ios打包配置 */
+      "ios": {},
+      /* SDK配置 */
+      "sdkConfigs": {}
+    }
+  },
+  /* 快应用特有相关 */
+  "quickapp": {},
+  /* 小程序特有相关 */
+  "mp-weixin": {
+    "appid": "wx1c531f81360684cd",
+    "setting": {
+      "urlCheck": false
+    },
+    "usingComponents": true,
+    "permission": {
+      "scope.userLocation": {
+        "desc": "你的位置信息将用于小程序位置接口的效果展示"
+      },
+      "scope.userFuzzyLocation": {
+        "desc": "你的位置信息将用于小程序位置接口的效果展示"
+      }
+    },
+    "requiredPrivateInfos": [
+      "getLocation",
+      "onLocationChange",
+      "startLocationUpdateBackground",
+      "chooseAddress"
+    ]
+  },
+  "h5": {
+    "router": {
+      "base": "./"
+    }
+  },
+  "mp-alipay": {
+    "usingComponents": true
+  },
+  "mp-baidu": {
+    "usingComponents": true
+  },
+  "mp-toutiao": {
+    "usingComponents": true
+  },
+  "uniStatistics": {
+    "enable": false
+  },
+  "vueVersion": "3"
+}

+ 1 - 0
src/mp_ecard_sdk/constants/log.js

@@ -0,0 +1 @@
+const Log={SourceType:"mp_sdk_uni",version:"1.0.0",initSdk:"INIT_SDK",getConfig:"GET_CONFIG",getConfigRetry:"GET_CONFIG_BY_RETRY",webViewResult:"WEBVIEW_RESULT",webViewError:"WEBVIEW_ERROR",navigateToEid:"NAVIGATE_TO_EID",navigateBackFromEid:"NAVIGATE_BACK_FROM_EID",navigateBackFromEidFail:"NAVIGATE_BACK_FROM_EID_FAIL",startEid:"START_EID",startEidFail:"START_EID_FAIL",eidVerifyDone:"EID_VERIFY_DONE",requestFail:"REQUEST_FAIL",requestCatch:"REQUEST_CATCH"};export default Log;

+ 1 - 0
src/mp_ecard_sdk/globalConfig.js

@@ -0,0 +1 @@
+export default { normalPath: '' }

File diff suppressed because it is too large
+ 0 - 0
src/mp_ecard_sdk/index.css


+ 1 - 0
src/mp_ecard_sdk/index.js

@@ -0,0 +1 @@
+export const a = 'dasd'

+ 1 - 0
src/mp_ecard_sdk/index/index.js

@@ -0,0 +1 @@
+import getParameterByName from"../utils/getParameterByName";import Log from"../constants/log.js";import{$http}from"../utils/http";export default{data:()=>({token:"",appName:"test",isAgree:!1,redirectUri:"",isNavigating:!1,showWebView:!0}),onLoad(e){const{token:t}=e;this.token=t,this.redirectUri=`${uni.eidBaseUrl}/api/v1/Redirect?token=${t}`,this.getConfig(t)},methods:{changeAgree(e){const t=!this.isAgree;this.isAgree=t},getConfig(e){const t=this;$http({url:`/api/v1/GetConfig?token=${e}`,token:e,method:"GET",reTry:{tryCount:3}},o=>{if(0!==o.ErrorCode)uni.reportLogToEid({token:e,event:Log.getConfigFail,errCode:"",errMsg:o.ErrorMsg}),uni.showModal({title:"提示",content:"网络失败,请点击重新尝试",showCancel:!1,success(){uni.navigateBack()}});else{if(uni.reportLogToEid({token:e,event:Log.getConfig,errCode:o.ErrorCode,errMsg:o.ErrorMsg}),o.Data)return void(t.appName=o.Data.AppName);const i=o.ErrorMsg;uni.showModal({title:"提示",content:i,showCancel:!1,success(){uni.navigateBack()}})}})},handleWebViewLoad(e){const t=getParameterByName("success",e.detail.src);"true"===t&&(this.showWebView=!1),uni.reportLogToEid({token:this.token,event:Log.webViewResult,errMsg:`success参数为${t}`})},handleWebViewError(e){this.showWebView=!1,uni.reportLogToEid({token:this.token,event:Log.webViewError,errMsg:e.detail.src})},navigateToEid(){const e=this.token;this.isNavigating=!0;const t=this;uni.navigateToMiniProgram({appId:"wx0e2cb0b052a91c92",path:"pages/huiyan/index",envVersion:uni.eidEnvVersion,extraData:{useHuiyan:!0,huiyanToken:e},success(){uni.eidTokenToCallback=e},complete(o){t.isNavigating=!1,uni.reportLogToEid({token:e,event:Log.navigateToEid,errMsg:o.errMsg})}})}}};

+ 44 - 0
src/mp_ecard_sdk/index/index.vue

@@ -0,0 +1,44 @@
+<template>
+	<view v-if="showWebView">
+		<web-view :src="redirectUri" @load="handleWebViewLoad" @error="handleWebViewError"></web-view>
+	</view>
+
+	<view class="auth" v-else>
+		<view class="auth-logo">
+			<image src="https://faceid-ecard-1254418846.cos.ap-chengdu.myqcloud.com/eidLogo.png" />
+		</view>
+		<view class="title">
+			您正在授权
+			<view class="merchant-name">{{' '+ appName}}</view>
+		</view>
+		<view class="sub-title">通过腾讯云E证通核验并获取您的身份信息</view>
+		<view class="agreement">
+			<checkbox-group @change="changeAgree">
+				<checkbox :value="agreement" :checked="isAgree" />
+			</checkbox-group>
+			<view>
+				<view>
+					<view @click="changeAgree" style="display:inline">已阅读并同意</view>
+					<navigator url="/mp_ecard_sdk/protocol/service/service">《腾讯云E证通服务使用协议》</navigator>和
+				</view>
+				<view>
+					<navigator url="/mp_ecard_sdk/protocol/eid/eid">《eID数字身份小程序服务协议》</navigator>
+				</view>
+			</view>
+		</view>
+		<view class="button-area">
+			<button @click='navigateToEid' :disabled="!isAgree || isNavigating">
+				确认授权
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+import index from "./index";
+export default index;
+</script>
+
+<style>
+@import url('../index.css');
+</style>

+ 91 - 0
src/mp_ecard_sdk/main.js

@@ -0,0 +1,91 @@
+/* eslint-disable no-undef */
+import validate from './utils/validate'
+import Log from './constants/log'
+import globalConfig from './globalConfig'
+function initEid(
+  e = 'https://eid.faceid.qq.com',
+  o = 'release',
+  n = 'https://eid-enhance.faceid.qq.com'
+) {
+  ;(uni.eidBaseUrl = e),
+    (uni.eidEnvVersion = o),
+    (uni.eidBackUpUrl = n),
+    uni.onAppShow((e) => {
+      const { scene: o } = e
+      if (1038 !== o) return
+      const { referrerInfo: n } = e,
+        { appId: i, extraData: t } = n
+      if ('wx0e2cb0b052a91c92' !== i || !t) return
+      const { verifyDone: r, token: a } = t
+      r && uni.handleEidVerifyDone
+        ? uni.eidTokenToCallback &&
+          uni.eidTokenToCallback === a &&
+          ((uni.eidTokenToCallback = ''),
+          uni.reportLogToEid({
+            token: a,
+            event: Log.navigateBackFromEid,
+            errMsg: `从EID核身完成返回,token:${a},verifyDone:${r}`
+          }),
+          uni.handleEidVerifyDone(t))
+        : uni.reportLogToEid({
+            token: a,
+            event: Log.navigateBackFromEidFail,
+            errMsg: `核验未完成或者没有处理核验完成的函数,token:${a},verifyDone:${r}`
+          })
+    })
+  const i = uni.getSystemInfoSync(),
+    { version: t } = i
+  uni.reportLogToEid = function (e) {
+    const { token: o = '', event: n = '', errCode: i = '', errMsg: r = '', data: a = {} } = e,
+      s = new Date(),
+      d = {
+        Token: o,
+        SourceType: Log.SourceType,
+        SourceVersion: Log.version,
+        EnvVersion: t,
+        Timestamp: s.getTime(),
+        Event: n,
+        ErrorCode: 'number' == typeof i ? i.toString() : i,
+        ErrorMsg: r,
+        Data: JSON.stringify(a)
+      }
+    console.log('开始上报日志:', d),
+      uni.request({
+        url: `${uni.eidBaseUrl}/api/common/ReportEvent`,
+        method: 'POST',
+        data: d,
+        success(e) {
+          console.log('上报日志完成:', 'payload:', d, 'res:', e)
+        }
+      })
+  }
+}
+function startEid(e) {
+  const { data: o, verifyDoneCallback: n } = e
+  if (!o || !n)
+    return (
+      uni.reportLogToEid({ token: i, event: Log.startEidFail, errMsg: '传入的参数有误' }),
+      void uni.showModal({ title: '提示', content: '传入的参数有误', showCancel: !1 })
+    )
+  const { token: i } = o
+  if (!validate.isValidateToken(i))
+    return (
+      uni.reportLogToEid({
+        token: i,
+        event: Log.startEidFail,
+        errMsg: `传入的token有误,token:${i}`
+      }),
+      void uni.showModal({ title: '提示', content: '传入的token有误', showCancel: !1 })
+    )
+  ;(uni.handleEidVerifyDone = (e) => {
+    const { token: o } = e
+    uni.navigateBack({
+      success() {
+        uni.reportLogToEid({ token: o, event: Log.EidVerifyDone, errMsg: `验证完成,token:${o}` }),
+          n({ token: o, verifyDone: !0 })
+      }
+    })
+  }),
+    uni.navigateTo({ url: `${globalConfig.normalPath}/mp_ecard_sdk/index/index?token=${i}` })
+}
+export { initEid, startEid }

+ 110 - 0
src/mp_ecard_sdk/protocol/eid/eid.vue

@@ -0,0 +1,110 @@
+<template>
+  <view class="protocol">
+    <view class="main">
+      <view class="h1">
+        <text>eID数字身份小程序服务协议</text>
+      </view>
+      <view>
+        <view style="display: inline" class="strong"> eID </view>
+        数字身份小程序是公安部第三研究所提供的为用户签发的采用国产密码算法生成的中国公民数字身份标记,并就用户身份信息和人脸信息通过腾讯的人脸识别验证身份信息功能向权威机构核验与权威数据的相符性。
+      </view>
+      <view>
+        我们特别提示您,
+        <view style="display: inline" class="strong">
+          您在页面点击“已阅读并同意《eID数字身份申请协议》”的行为视为您已经充分阅读并理解、同意本协议的内容并作出相关授权。
+        </view>
+      </view>
+
+      <view class="strong">一、eID数字身份说明</view>
+      <view>
+        eID数字身份是以公民身份号码为根,由公安部第三研究所(以下称“三所”)承建的“公安部公民网络身份识别系统”采用国产密码算法为中国公民生成的数字身份标记。eID数字身份具有以下特点:
+      </view>
+      <view> 1.1 eID数字身份以公民身份号码为根生成; </view>
+      <view> 1.2 eID数字身份采用国产密码算法产生,从eID数字身份无法逆推出公民身份号码原文; </view>
+      <view>
+        1.3
+        eID服务体系对于同一用户,在不同的互联网应用中产生的eID数字身份并不相同,即碎片化处理,防止被大数据技术追踪;
+      </view>
+      <view>
+        1.4
+        eID数字身份由“公安部公民网络身份识别系统”统一管理,碎片化处理后的eID数字身份可以有条件进行同一化处理。
+      </view>
+
+      <view class="strong">二、eID数字身份的签发</view>
+      <view>
+        2.1
+        三所通过eID数字身份小程序在向您签发eID数字身份之前,三所需要对您提供的姓名、身份号码、人脸信息通过腾讯提供的人脸识别验证身份功能与权威机构中的信息进行相符性比对,以确认您提供信息的真实性。
+      </view>
+      <view>
+        2.2
+        在通过相符性比对后,三所为您签发eID数字身份。您的eID数字身份与您申请时提供的身份信息及人脸信息唯一关联。
+      </view>
+
+      <view class="strong">三、eID数字身份小程序的使用</view>
+      <view>
+        在接入了腾讯云E证通的应用场景中,向您提供服务的应用会请您使用腾讯云E证通证明您的身份,腾讯云E证通会跳转到eID数字身份小程序,小程序会拉起腾讯的人脸识别验证功能,提取您的现场人脸视频并通过向权威机构的相应数据进行相符性比对,并将比对结果反馈给eID数字身份小程序。比对通过后,小程序会签发您的eID数字身份,并通过腾讯云E证通转发给向您提供服务的应用,由其决定是否继续向您提供服务。
+      </view>
+
+      <view class="strong">四、个人信息收集、使用、处理</view>
+      <view>
+        4.1 为了使用eID数字身份小程序,
+        <view style="display: inline" class="strong">
+          您授权并同意三所收集、使用您的姓名、身份号码信息、人脸视频,并通过腾讯人脸识别验证身份功能与权威机构的相应数据进行相符性比对,比对通过之后,由三所为您签发eID数字身份并存储您的姓名、身份证号码、人脸照片信息。
+        </view>
+      </view>
+      <view>
+        4.2
+        您授权并同意三所基于您的姓名、身份号码生成您的eID数字身份,并将您的eID数字身份向为您提供服务的应用方提供以完成实名登记、实名认证要求。
+      </view>
+      <view>
+        4.3
+        在您通过eID数字身份向为您提供服务的应用证明您的身份时,您授权并同意三所将相符性比对结果转发给向您提供服务的应用方,由其判断是否通过您的实名实人认证。
+      </view>
+      <view>
+        4.4
+        某些应用方基于国家监管要求或法律要求,在向您提供服务时需要采集并保存您的姓名、身份号码、人脸图像身份信息证明您的身份,在得到您的同意后,三所会将您的身份信息向这些应用方提供。
+      </view>
+      <view>
+        4.5
+        三所在后台存储收集到的个人信息,包括您的姓名、身份号码、人脸图像,对这些信息采取包括但不限于加密处理的技术安全措施进行妥善保管。三所未经您的授权或许可不会向第三方提供您的个人信息。
+      </view>
+      <view>
+        4.6
+        如您希望访问、撤回授权、修改、删除您的个人信息,因eID数字身份小程序未单独为用户提供服务,您可以通过“关于腾讯云E证通-意见反馈”联系我们,并提供必要的身份证明。
+      </view>
+
+      <view class="strong">五、提示</view>
+      <view class="strong">
+        5.1 请您提供真实、准确的姓名、身份号码,否则,无法为您生成eID数字身份;
+      </view>
+      <view class="strong">
+        5.2
+        请您提供本人的姓名、身份号码、人脸图像,并申请本人的eID数字身份。冒用他人身份者将承担身份冒用带来的一切后果与责任。
+      </view>
+      <view> 5.3 冒用他人身份给第三方或三所造成的任何损失,应当依法进行赔偿。 </view>
+
+      <view class="strong">六、免责</view>
+      <view class="strong">
+        您理解并同意,三所仅通过腾讯提供的人脸识别验证身份功能对用户提供的身份信息是否与权威机构的相应数据相符而提供技术服务以及签发eID数字身份,三所不承诺权威机构所提供的相符性验证结果的准确性,对可能导致的不利后果三所不承担责任。
+      </view>
+
+      <view class="strong">七、其它</view>
+      <view class="strong">
+        若您与三所发生任何纠纷或争议,您同意将纠纷或争议提交本协议签订地(即中国上海市徐汇区)有管辖权的人民法院管辖。本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律。
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {}
+  },
+  methods: {}
+}
+</script>
+
+<style>
+@import url('../../index.css');
+</style>

+ 195 - 0
src/mp_ecard_sdk/protocol/privacy/privacy.vue

@@ -0,0 +1,195 @@
+<template>
+	<view class="protocol">
+		<view class="main">
+			<view class="h1">
+				<text>腾讯隐私政策</text>
+			</view>
+			<text>引言</text>
+			<view>
+				腾讯视用户信息安全与隐私保护为自己的“生命线”。我们秉承“一切以用户价值为依归”的理念,致力于提升信息处理透明度,增强您对信息管理的便捷性,保障您的信息及通信安全。
+			</view>
+			<view>腾讯严格遵守法律法规,遵循以下隐私保护原则,为您提供更加安全、可靠的服务:</view>
+			<view>1、安全可靠:我们竭尽全力通过合理有效的信息安全技术及管理流程,防止您的信息泄露、损毁、丢失。</view>
+			<view>2、自主选择:我们为您提供便利的信息管理选项,以便您做出合适的选择,管理您的个人信息。</view>
+			<view>3、保护通信秘密:我们严格遵照法律法规,保护您的通信秘密,为您提供安全的通信服务。</view>
+			<view>4、合理必要:为了向您和其他用户提供更好的服务,我们仅收集必要的信息。</view>
+			<view>5、清晰透明:我们努力使用简明易懂的表述,向您介绍隐私政策,以便您清晰地了解我们的信息处理方式。</view>
+			<view>6、将隐私保护融入产品设计:我们在产品或服务开发的各个环节,综合法律、产品、设计等多方因素,融入隐私保护的理念。</view>
+			<view>本《隐私政策》主要向您说明:</view>
+			<view>我们收集哪些信息;</view>
+			<view>我们收集信息的用途;</view>
+			<view>您所享有的权利。</view>
+			<view>希望您仔细阅读《隐私政策》(以下简称“本政策”),详细了解我们对信息的收集、使用方式,以便您更好地了解我们的服务并作出适当的选择。</view>
+			<view>若您使用腾讯服务,即表示您认同我们在本政策中所述内容。除另有约定外,本政策所用术语与《腾讯服务协议》中的术语具有相同的涵义。</view>
+			<view>如您有问题,请联系我们。</view>
+			<view class="strong">一、我们收集的信息</view>
+			<view>我们根据合法、正当、必要的原则,仅收集实现产品功能所必要的信息。</view>
+			<view>1.1 您在使用我们服务时主动提供的信息</view>
+			<view>1.1.1 您在注册帐户时填写的信息。</view>
+			<view>例如,您在注册QQ、微信帐户时所填写的昵称、手机号码。</view>
+			<view>1.1.2 您在使用服务时上传的信息。</view>
+			<view>例如,您在使用QQ、微信时,上传的头像、分享的照片。</view>
+			<view>1.1.3 您通过我们的客服或参加我们举办的活动时所提交的信息。</view>
+			<view>例如,您参与我们线上活动时填写的调查问卷中可能包含您的姓名、电话、家庭地址等信息。</view>
+			<view>
+				我们的部分服务可能需要您提供特定的个人敏感信息来实现特定功能。若您选择不提供该类信息,则可能无法正常使用服务中的特定功能,但不影响您使用服务中的其他功能。若您主动提供您的个人敏感信息,即表示您同意我们按本政策所述目的和方式来处理您的个人敏感信息。
+			</view>
+			<view>1.2我们在您使用服务时获取的信息</view>
+			<view>1.2.1 日志信息。当您使用我们的服务时,我们可能会自动收集相关信息并存储为服务日志信息。</view>
+			<view>(1) 设备信息。例如,设备型号、操作系统版本、唯一设备标识符、电池、信号强度等信息。</view>
+			<view>(2) 软件信息。例如,软件的版本号、浏览器类型。为确保操作环境的安全或提供服务所需,我们会收集有关您使用的移动应用和其他软件的信息。</view>
+			<view>(3) IP地址。</view>
+			<view>(4) 服务日志信息。例如,您在使用我们服务时搜索、查看的信息、服务故障信息、引荐网址等信息。</view>
+			<view>(5) 通讯日志信息。例如,您在使用我们服务时曾经通讯的账户、通讯时间和时长。</view>
+			<view>1.2.2 位置信息。当您使用与位置有关的服务时,我们可能会记录您设备所在的位置信息,以便为您提供相关服务。</view>
+			<view>(1) 在您使用服务时,我们可能会通过IP地址、GPS、WiFi或基站等途径获取您的地理位置信息;</view>
+			<view>
+				(2) 您或其他用户在使用服务时提供的信息中可能包含您所在地理位置信息,例如您提供的帐号信息中可能包含的您所在地区信息,您或其他人共享的照片包含的地理标记信息;
+			</view>
+			<view>
+				1.2.3
+				其他相关信息。为了帮助您更好地使用我们的产品或服务,我们会收集相关信息。例如,我们收集的好友列表、群列表信息、声纹特征值信息。为确保您使用我们服务时能与您认识的人进行联系,如您选择开启导入通讯录功能,我们可能对您联系人的姓名和电话号码进行加密,并仅收集加密后的信息。
+			</view>
+			<view>1.3 其他用户分享的信息中含有您的信息</view>
+			<view>例如,其他用户发布的照片或分享的视频中可能包含您的信息。</view>
+			<view>1.4 从第三方合作伙伴获取的信息</view>
+			<view>
+				我们可能会获得您在使用第三方合作伙伴服务时所产生或分享的信息。例如,您使用微信或QQ帐户登录第三方合作伙伴服务时,我们会获得您登录第三方合作伙伴服务的名称、登录时间,方便您进行授权管理。请您仔细阅读第三方合作伙伴服务的用户协议或隐私政策。
+			</view>
+			<view class="strong">二、我们如何使用收集的信息</view>
+			<view>我们严格遵守法律法规的规定及与用户的约定,将收集的信息用于以下用途。若我们超出以下用途使用您的信息,我们将再次向您进行说明,并征得您的同意。</view>
+			<view>2.1 向您提供服务。</view>
+			<view>2.2 满足您的个性化需求。例如,语言设定、位置设定、个性化的帮助服务。</view>
+			<view>2.3 产品开发和服务优化。例如,当我们的系统发生故障时,我们会记录和分析系统故障时产生的信息,优化我们的服务。</view>
+			<view>
+				2.4 安全保障。例如,我们会将您的信息用于身份验证、安全防范、反诈骗监测、存档备份、客户的安全服务等用途。例如,您下载或安装的安全软件会对恶意程序或病毒进行检测,或为您识别诈骗信息。
+			</view>
+			<view>2.5 向您推荐您可能感兴趣的广告、资讯等。</view>
+			<view>2.6 评估、改善我们的广告投放和其他促销及推广活动的效果。</view>
+			<view>2.7 管理软件。例如,进行软件认证、软件升级等。</view>
+			<view>2.8 邀请您参与有关我们服务的调查。</view>
+			<view>
+				为了让您有更好的体验、改善我们的服务或经您同意的其他用途,在符合相关法律法规的前提下,我们可能将通过某些服务所收集的信息用于我们的其他服务。例如,将您在使用我们某项服务时的信息,用于另一项服务中向您展示个性化的内容或广告、用于用户研究分析与统计等服务。
+			</view>
+			<view>
+				为了确保服务的安全,帮助我们更好地了解我们应用程序的运行情况,我们可能记录相关信息,例如,您使用应用程序的频率、故障信息、总体使用情况、性能数据以及应用程序的来源。我们不会将我们存储在分析软件中的信息与您在应用程序中提供的个人身份信息相结合。
+			</view>
+			<view class="strong">三、我们如何使用Cookie及相关技术</view>
+			<view>
+				我们或我们的第三方合作伙伴,可能通过放置安全的Cookie及相关技术收集您的信息,目的是为您提供更个性化的用户体验和服务。我们会严格要求第三方合作伙伴遵守本政策的相关规定。
+			</view>
+			<view>
+				您也可以通过浏览器设置管理Cookie。但请注意,如果停用Cookie,您可能无法享受最佳的服务体验,某些服务也可能无法正常使用。若您希望了解更多Cookie的安全性等信息,可参见《Cookie政策说明》。
+			</view>
+			<view class="strong">四、您分享的信息</view>
+			<view>
+				您可以通过我们的服务与您的好友、家人及其他用户分享您的相关信息。例如,您在微信朋友圈中公开分享的文字和照片。请注意,这其中可能包含您的个人身份信息、个人财产信息等敏感信息。请您谨慎考虑披露您的相关个人敏感信息。
+			</view>
+			<view>
+				您可通过我们服务中的隐私设置来控制您分享信息的范围,也可通过服务中的设置或我们提供的指引删除您公开分享的信息。但请您注意,这些信息仍可能由其他用户或不受我们控制的非关联第三方独立地保存。
+			</view>
+			<view class="strong">五、您如何管理自己的信息</view>
+			<view>
+				5.1
+				您可以在使用我们服务的过程中,访问、修改和删除您提供的注册信息和其他个人信息,也可按照通知指引与我们联系。您访问、修改和删除个人信息的范围和方式将取决于您使用的具体服务。例如,若您在使用地理位置相关服务时,希望停止分享您的地理位置信息,您可通过手机定位关闭功能、软硬件服务商及通讯服务提供商的关闭方式停止分享,建议您仔细阅读相关指引。
+			</view>
+			<view>
+				5.2
+				我们将按照本政策所述,仅为实现我们产品或服务的功能,收集、使用您的信息。如您发现我们违反法律、行政法规的规定或者双方的约定收集、使用您的个人信息,您可以要求我们删除。如您发现我们收集、存储的您的个人信息有错误的,您也可以要求我们更正。请通过本政策列明的联系方式与我们联系。
+			</view>
+			<view>5.3 在您访问、修改和删除相关信息时,我们可能会要求您进行身份验证,以保障帐号的安全。</view>
+			<view>5.4 请您理解,由于技术所限、法律或监管要求,我们可能无法满足您的所有要求,我们会在合理的期限内答复您的请求。</view>
+			<view class="strong">六、我们分享的信息</view>
+			<view>我们遵照法律法规的规定,对信息的分享进行严格的限制,例如:</view>
+			<view>6.1 经您事先同意,我们可能与第三方分享您的个人信息;</view>
+			<view>
+				6.2
+				仅为实现外部处理的目的,我们可能会与第三方合作伙伴(第三方服务供应商、承包商、代理、广告合作伙伴、应用开发者等,例如,代表我们发出电子邮件或推送通知的通讯服务提供商、为我们提供位置服务的地图服务供应商)(他们可能并非位于您所在的法域)分享您的个人信息,让他们按照我们的说明、隐私政策以及其他相关的保密和安全措施来为我们处理上述信息,并用于以下用途:
+			</view>
+			<view>6.2.1 向您提供我们的服务;</view>
+			<view>6.2.2 实现“我们如何使用收集的信息”部分所述目的;</view>
+			<view>6.2.3 履行我们在《腾讯服务协议》或本政策中的义务和行使我们的权利;</view>
+			<view>6.2.4 理解、维护和改善我们的服务。</view>
+			<view>如我们与上述第三方分享您的信息,我们将会采用加密、匿名化处理等手段保障您的信息安全。</view>
+			<view>
+				6.3
+				随着我们业务的持续发展,当发生合并、收购、资产转让等交易导致向第三方分享您的个人信息时,我们将通过推送通知、公告等形式告知您相关情形,按照法律法规及不低于本政策所要求的标准继续保护或要求新的管理者继续保护您的个人信息。
+			</view>
+			<view>
+				6.4
+				我们会将所收集到的信息用于大数据分析。例如,我们将收集到的信息用于分析形成不包含任何个人信息的城市热力图或行业洞察报告。我们可能对外公开并与我们的合作伙伴分享经统计加工后不含身份识别内容的信息,用于了解用户如何使用我们服务或让公众了解我们服务的总体使用趋势。
+			</view>
+			<view>6.4 我们可能基于以下目的披露您的个人信息:</view>
+			<view>6.5.1 遵守适用的法律法规等有关规定;</view>
+			<view>6.5.2 遵守法院判决、裁定或其他法律程序的规定;</view>
+			<view>6.5.3 遵守相关政府机关或其他法定授权组织的要求;</view>
+			<view>6.5.4 我们有理由确信需要遵守法律法规等有关规定;</view>
+			<view>6.5.5 为执行相关服务协议或本政策、维护社会公共利益,为保护我们的客户、我们或我们的关联公司、其他用户或雇员的人身财产安全或其他合法权益合理且必要的用途。</view>
+			<view class="strong">七、我们可能向您发送的信息</view>
+			<view>7.1 信息推送</view>
+			<view>您在使用我们的服务时,我们可能向您发送电子邮件、短信、资讯或推送通知。您可以按照我们的相关提示,在设备上选择取消订阅。</view>
+			<view>7.2 与服务有关的公告</view>
+			<view>我们可能在必要时(例如,因系统维护而暂停某一项服务时)向您发出与服务有关的公告。您可能无法取消这些与服务有关、性质不属于广告的公告。</view>
+			<view class="strong">八、存储信息的地点和期限</view>
+			<view>8.1 存储信息的地点</view>
+			<view>我们遵守法律法规的规定,将境内收集的用户个人信息存储于境内。</view>
+			<view>8.2 存储信息的期限</view>
+			<view>一般而言,我们仅为实现目的所必需的最短时间保留您的个人信息。但在下列情况下,我们有可能因需符合法律要求,更改个人信息的存储时间:</view>
+			<view>8.2.1 为遵守适用的法律法规等有关规定;</view>
+			<view>8.2.2 为遵守法院判决、裁定或其他法律程序的规定;</view>
+			<view>8.2.3 为遵守相关政府机关或法定授权组织的要求;</view>
+			<view>8.2.4 我们有理由确信需要遵守法律法规等有关规定;</view>
+			<view>8.2.5 为执行相关服务协议或本政策、维护社会公共利益,为保护我们的客户、我们或我们的关联公司、其他用户或雇员的人身财产安全或其他合法权益所合理必需的用途。</view>
+			<view>当我们的产品或服务发生停止运营的情形时,我们将采取例如,推送通知、公告等形式通知您,并在合理的期限内删除或匿名化处理您的个人信息。</view>
+			<view class="strong">九、信息安全</view>
+			<view>我们为您的信息提供相应的安全保障,以防止信息的丢失、不当使用、未经授权访问或披露。</view>
+			<view>9.1 我们严格遵守法律法规保护用户的通信秘密。</view>
+			<view>9.2 我们将在合理的安全水平内使用各种安全保护措施以保障信息的安全。例如,我们使用加密技术(例如,TLS、SSL)、匿名化处理等手段来保护您的个人信息。</view>
+			<view>9.3 我们建立专门的管理制度、流程和组织确保信息安全。例如,我们严格限制访问信息的人员范围,要求他们遵守保密义务,并进行审查。</view>
+			<view>9.4 若发生个人信息泄露等安全事件,我们会启动应急预案,阻止安全事件扩大,并以推送通知、公告等形式告知您。</view>
+			<view class="strong">十、广告</view>
+			<view>我们可能使用您的相关信息,在相关网站、应用及其他渠道向您提供与您更加相关的广告。您可以在关于广告页面中了解更多。</view>
+			<view class="strong">十一、未成年人保护</view>
+			<view>
+				我们非常重视对未成年人个人信息的保护。根据相关法律法规的规定,若您是18周岁以下的未成年人,在使用腾讯的服务前,应事先取得您的家长或法定监护人的同意。若您是未成年人的监护人,当您对您所监护的未成年人的个人信息有相关疑问时,请通过第十三部分中的联系方式与我们联系。
+			</view>
+			<view class="strong">十二、适用范围</view>
+			<view>
+				我们的所有服务均适用本政策。但某些服务有其特定的隐私指引/声明,该特定隐私指引/声明更具体地说明我们在该服务中如何处理您的信息。如本政策与特定服务的隐私指引/声明有不一致之处,请以该特定隐私指引/声明为准。
+			</view>
+			<view>请您注意,本政策不适用由其他公司或个人提供的服务。例如,您通过使用微信帐号登录其他公司或个人提供的服务。</view>
+			<view>您使用该等第三方服务须受其隐私政策(而非本政策)约束,您需要仔细阅读其政策内容。</view>
+			<view class="strong">十三、联系我们</view>
+			<view>
+				如您对本政策或其他相关事宜有疑问,请通过 https://kf.qq.com/
+				与我们联系。您也可根据我们提供的指引,填写相关资料,将您的问题发送至Dataprivacy@tencent.com或寄到如下地址:
+			</view>
+			<view>地址:中国广东省深圳市南山区科技园科技中一路腾讯大厦 法务部 数据及隐私保护中心(收)</view>
+			<view>邮编:518057</view>
+			<view>我们将尽快审核所涉问题,并在验证您的用户身份后的三十天内予以回复。</view>
+			<view class="strong">十四、变更</view>
+			<view>
+				我们可能适时修订本政策内容。如该等变更会导致您在本政策项下权利的实质减损,我们将在变更生效前,通过在页面显著位置提示、向您发送电子邮件等方式通知您。在该种情况下,若您继续使用我们的服务,即表示同意受经修订的政策约束。
+			</view>
+			<view class="strong">更新日期: 2018年6月13日</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+@import url('../../index.css');
+</style>

+ 173 - 0
src/mp_ecard_sdk/protocol/service/service.vue

@@ -0,0 +1,173 @@
+<template>
+	<view class="protocol">
+		<view class="main">
+			<view class="h1">
+				<text>腾讯E证通服务协议</text>
+			</view>
+			<view>
+				欢迎您使用腾讯云E证通服务!
+			</view>
+			<view>
+				为使用腾讯E证通服务,您应当阅读并遵守《腾讯E证通服务协议》(以下简称“本协议”)。本协议由您与深圳市腾讯计算机系统有限公司(以下简称“腾讯”或“我们”)签订,对您注册、使用腾讯E证通服务(以下亦可简称“本服务”)过程中的各方权利义务等具体内容进行约定
+			</view>
+			<view class="strong underline">
+				我们在此特别提醒您认真阅读、充分理解本协议各条款,特别是您同意及授权的条款、争议解决和法律适用等条款。为提醒您注意,我们已对这些条款予以加粗以特别提醒您加以注意,请您仔细阅读并自主决定接受或不接受。您使用腾讯E证通服务的行为(包括在我们合作的第三方产品及业务中使用腾讯E证通服务)即视为您已阅读、知悉、理解和完全同意本协议的约定。
+			</view>
+			<view class="strong underline">
+				我们特别提示您,您在前述页面点击“已阅读并同意《腾讯E证通服务协议》”以及点击按钮“申请并同意授权”的行为视为您已经充分阅读并理解、同意本协议的内容并作出相关授权。
+			</view>
+			<view>
+				如果您是未成年人,请在法定监护人的陪同下阅读本协议及上述其他协议,并特别注意涉及未成年人使用本服务的相关条款。
+			</view>
+			<view>
+				如果您在阅读本协议过程中有任何问题,请您联系我们,我们将对相关内容进行解释和说明,以使您能够充分理解并自主判断和决定是否接受本协议内容。
+			</view>
+			<view class="strong">一、服务内容</view>
+			<view>
+				腾讯E证通服务是深圳市腾讯计算机系统有限公司(以下简称“我们”或“腾讯”)通过与公安部第三研究所(以下简称“三所”)及其eID网络身份服务机构(以下简称“eID服务机构”)基于eID数字身份技术的合作、向您提供的eID数字身份服务
+				<view style="display:inline" class="strong">
+					,具体服务流程为:
+				</view>
+			</view>
+			<view class="strong">
+				您通过向您提供服务的应用输入姓名和身份号码并拉起腾讯E证通小程序,在您点击同意本协议和《eID数字身份小程序服务协议》后,您将在eID数字身份小程序内通过腾讯提供的人脸识别完成身份验证,您的身份信息与权威机构的相应数据进行相符性比对后,三所会签发您的eID数字身份,您的eID数字身份与您申请时提供的身份信息及人脸信息唯一关联。eID数字身份信息由本服务返回给为您提供服务的应用。
+			</view>
+			<view class="strong">二、双方权利义务</view>
+			<view>
+				2.1腾讯有权根据您的申请情况,决定是否为您提供腾讯E证通服务。
+			</view>
+			<view>
+				2.2腾讯有权在腾讯以及腾讯合作方的具体产品业务中推广、应用腾讯E证通服务。
+			</view>
+			<view class="strong">
+				2.3您保证您所提供的个人信息的真实性、合法性、完整性、准确性和有效性。否则,您可能无法使用腾讯E证通服务,或您所使用的腾讯E证通服务范围可能会受到限制。
+			</view>
+			<view>
+				2.4您应以您本人的真实身份信息使用腾讯E证通服务,您保证由您本人注册、开通腾讯E证通服务,您保证由您本人进行操作,并不向其他任何人披露、泄露或借出前述信息和设备,亦不使用其他任何人的该等信息和设备。
+				<view style="display:inline" class="strong">
+					您应妥善保管您的手机设备、账号、密码以及动态验证码等资料,并对该账号项下所从事的行为承担相应的法律责任。
+				</view>
+			</view>
+			<view class="strong">
+				2.5您应当对您的账户、终端设备以及您的联系方式进行有效管理,对通过该账户及终端设备所从事的行为承担相应法律责任,并对您的联系方式(例如,手机号码)接收或确认信息所产生的法律后果承担法律责任。您在此知悉,对于第三方无论以何种形式使用您的信息,包括但不限于冒用、借用,您将对由此产生的法律后果依法承担相应法律责任。
+			</view>
+			<view class="strong">
+				2.6使用腾讯E证通服务过程中,如果您的个人信息有更新,您应及时进行更新。否则,因此产生的法律责任由您承担。
+			</view>
+			<view class="strong">
+				2.7如果您的账户、终端设备因信息泄露、遗失或被非授权使用所致的损失由您自行承担。
+			</view>
+			<view class="strong">
+				2.8您不得利用本服务实施任何违反国家法律、法规、规章及规范性文件的行为,不得侵犯其他任何第三人的合法权益,尤其不得利用本服务实施欺诈等违法行为。如您存在不遵守本协议或腾讯相关业务规定、恶意操作或利用腾讯E证通服务从事违反国家法律法规活动或损害其他第三方合法权益的,腾讯有权单方终止对您提供腾讯E证通服务,并要求您赔偿腾讯因此造成的损失。
+			</view>
+			<view class="strong">
+				2.9您所申请的eID数字身份仅供您个人使用,您不得将您的eID数字身份提供给他方使用,您应对您的eID数字身份所从事的行为承担法律责任。
+			</view>
+			<view>
+				2.10为了向您提供更优的服务,腾讯有权对腾讯E证通服务系统进行升级、改造。
+			</view>
+			<view>
+				2.11如果您需要注销腾讯E证通服务,您可以在腾讯E证通小程序中的
+				<view style="display:inline" class="strong">
+					“关于腾讯E证通-意见反馈”
+				</view>
+				中提交申请。您注销腾讯E证通服务后,如果您需要使用腾讯E证通服务,您需要重新注册。
+			</view>
+			<view class="strong">
+				2.12您在使用本服务过程中,如果还涉及到使用其他服务的,您应当同时遵守其他服务的规定或规则。比如您在使用eID数字身份小程序时,您应遵守三所的相关服务规则。
+			</view>
+			<view class="strong">
+				2.13如果您与为您提供服务的应用方之间因具体交易以及腾讯E证通的适用等事宜发生的争议或纠纷,由您与您应用方进行协商处理,我们不介入您与应用方的具体交易合作,我们不对前述事项承担法律责任。但我们在此承诺,为了保护您的合法权益,我们将向您提供必要协助。
+			</view>
+
+			<view class="strong">三、用户个人信息保护</view>
+			<view class="strong">
+				3.1
+				为了向您提供腾讯E证通服务,您授权并同意,我们从为您提供服务的应用获取您输入的姓名和身份号码信息,结合在三所运营的eID数字身份小程序内通过我们提供的人脸识别服务,采集您的人脸视频,并将您的姓名、身份号码、人脸图像与权威机构的相应数据进行相符性比对,以便通过身份核验。同时,我们会从eID数字身份小程序获取您的数字身份信息,并将您的人脸图片、比对结果和eID数字身份信息返回给您的应用方,由其判断是否通过您的实名实人认证。如果您不同意的,请您不要继续使用本服务。
+			</view>
+			<view class="strong">
+				3.2
+				基于国家监管要求或法律要求,应用方在向您提供服务时需要采集并保存您的姓名、身份号码、人脸图像(简称“身份信息”)证明您的身份,您授权并同意,因为您的应用方可能无法及时从本服务拉取您的身份信息,我们会将您的人脸图片和比对结果暂时存储三天以便您的应用方拉取您的身份信息。三天内如果您的应用方拉取了,我们会立即删除;三天后如果您的应用方未拉取,我们也会删除您的相应数据。我们承诺仅在该处理目的内暂时存储您的数据,未经您的授权或许可,我们不会向第三方提供您的个人信息。
+			</view>
+			<view>
+				3.3保护用户个人信息是腾讯的一项基本原则,腾讯将根据本协议以及
+				<navigator style="display:inline" class="protocol_sprotocol" url="/mp_ecard_sdk/protocol/privacy/privacy">
+					《隐私政策》
+				</navigator>
+				(http://www.qq.com/privacy.htm)等内容,采取合理的措施依法保护用户的个人信息。除法律法规规定的情形外,未经用户授权同意腾讯不会向第三方公开、透露用户个人信息。腾讯对相关信息采用专业加密存储与传输方式,保障用户个人信息的安全。
+			</view>
+			<view>
+				3.4 腾讯将运用各种安全技术和程序建立完善的管理制度来保护您的个人信息,以免遭受未经授权的访问、使用或披露。
+			</view>
+			<view>
+				3.5如您希望访问、撤回授权、修改、删除您的个人信息,您可以通过“关于腾讯E证通-意见反馈”联系我们,并提供必要的身份证明。
+			</view>
+			<view class="strong">
+				3.6请您提供真实、准确的、且是您本人的姓名、身份号码、人脸图像,并申请本人的eID数字身份,否则,我们可能无法为您提供本服务。冒用他人身份者将承担身份冒用带来的一切后果与责任,包括但不限于因冒用他人身份给第三方或我们造成的任何损失,您应当依法进行赔偿。
+			</view>
+			<view class="strong">四、不可抗力及免责声明</view>
+			<view class="strong">
+				4.1您理解并同意,在使用本服务的过程中,可能会遇到不可抗力等风险因素,使本服务发生中断。不可抗力是指不能预见、不能克服并不能避免且对一方或双方造成重大影响的客观事件,包括自然灾害如洪水、地震、瘟疫流行和风暴等以及社会事件如战争、动乱、政府行为以及政策法律等规定变化等。出现上述情况时,我们将努力在第一时间与相关单位配合,尽量降低各方损失。
+			</view>
+			<view class="strong">
+				4.2在法律允许的范围内,腾讯对以下情形导致的本服务中断或受阻不承担责任:
+			</view>
+			<view class="strong">
+				4.2.1受到计算机病毒、木马或其他恶意程序、黑客攻击的破坏;
+			</view>
+			<view class="strong">
+				4.2.2网络故障、网络异常;
+			</view>
+			<view class="strong">
+				4.2.3用户操作不当;
+			</view>
+			<view class="strong">
+				4.2.4用户通过非经我们授权的方式使用本服务;
+			</view>
+			<view class="strong">
+				4.2.5其他腾讯无法控制或合理预见的情形。
+			</view>
+			<view class="strong">
+				4.3
+				您理解并同意,我们将秉承尽责、严谨的态度为您提供本服务,同时您也已清楚知晓受制于技术、权威核验渠道等诸多因素,我们无法向您做出人脸识别核验结果绝对准确无误的承诺。您同意非腾讯原因或因不可抗力、约定的免责情形导致人脸识别核验结果错误的,腾讯不承担赔偿责任。
+			</view>
+			<view class="strong">
+				4.4 您知悉并同意,腾讯E证通小程序与eID数字身份小程序是互为独立的小程序,分别由腾讯和三所独立运营,对于三所为您签发的eID数字身份,腾讯不做相应的承诺和担保。
+			</view>
+			<view class="strong">五、其他</view>
+			<view class="strong underline">
+				5.1 本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律(不包括冲突法规则)。
+			</view>
+			<view class="strong underline">
+				5.2 若您和腾讯之间发生任何纠纷或争议,首先应友好协商解决;若协商不成的,您和腾讯同意将纠纷或争议提交本协议签订地有管辖权的人民法院,通过诉讼加以解决。
+			</view>
+			<view class="strong underline">
+				5.3本协议签订地为中华人民共和国广东省深圳市南山区。
+			</view>
+			<view class="strong underline">
+				5.4本协议所有条款的标题仅为阅读方便,本身并无实际涵义,不能作为本协议涵义解释的依据。
+			</view>
+			<view class="strong underline">
+				5.5本协议条款无论因何种原因部分无效或不可执行,其余条款仍有效,对双方具有约束力。(正文完)
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+@import url('../../index.css');
+</style>

+ 47 - 0
src/mp_ecard_sdk/protocol/userAccredit/userAccredit.vue

@@ -0,0 +1,47 @@
+<template>
+	<view class="protocol">
+		<view class="main">
+			<view class="h1">
+				<text>用户授权协议</text>
+			</view>
+			<view>
+				《用户授权协议》(以下简称“本协议”)由您与深圳市腾讯计算机系统有限公司(以下简称“腾讯”或“我们”)签订,为了充分保护您的合法权益,我们在此与您就您注册、使用腾讯云E证通服务(以下亦可简称“本服务”)过程中有关采集、使用等处理您个人信息授权的相关事项进行约定。本协议作为《腾讯云E证通服务协议》(以下简称“主协议”)不可分割的有效组成部分,与主协议具有同等法律效力。
+			</view>
+			<view class="strong underline">
+				我们特别提示您,您在前述页面点击“已阅读并同意《用户授权协议》”以及点击按钮“申请并同意授权”的行为视为您已经充分阅读并理解、同意本协议的内容并作出相关授权。
+			</view>
+			<view class="strong underline">
+				一、为了在您注册、使用腾讯云E证通服务时识别您的身份,您同意并授权腾讯可以获取您绑定的微信手机号,同时,您同意并授权腾讯可通过其合作的依法运营数据库的主体比对您的手机号码,您同意并授权腾讯可以采集、存储并处理您的姓名、公民身份证号码、人脸照片、手机号码等可以识别您身份的个人信息(具体以在页面上填写、提供的为准)。
+			</view>
+			<view>
+				二、为了能够获得腾讯云E证通编码,您同意并授权腾讯可以将您的个人信息传输至eID服务机构并由eID服务机构将提供给三所承建的“公安部公民网络身份识别系统”;您同意并授权三所使用eID数字身份技术为您在腾讯云E证通服务中生成保护个人身份信息的eID数字身份提供给eID服务机构并由eID服务机构提供给腾讯;您同意并授权腾讯可依法采集、存储并处理您的eID数字身份并生成腾讯云E证通编码。
+			</view>
+			<view>
+				三、在您注册完成腾讯云E证通服务后,您可采用多种方式使用腾讯云E证通服务,包括但不限于您个人管理、使用您的腾讯云E证通服务编码,以及您在此授权腾讯可在其运营的其他产品和业务中使用您的腾讯云E证通编码,以及您在此授权腾讯亦可向腾讯合作方提供您的腾讯云E证通编码,以方便您使用相应产品或业务,节约流程及时间。
+			</view>
+			<view class="strong">四、我们在此特别说明,腾讯合作方或腾讯运营其他产品和业务的团队所获得的腾讯云E证通编码不可识别您的个人信息。</view>
+			<view class="strong">
+				五、我们在此特别提示您,如果您在使用合作方或腾讯其他产品或业务时,除了授权腾讯向前述主体提供您的腾讯云E证通编码之外,还需要前述主体向腾讯云E证通服务运营团队采集或委托腾讯云E证通服务运营团队处理您的个人信息,须另行获得您相应授权。
+			</view>
+			<view>六、我们收集您的个人信息仅在您注册、使用腾讯云E证通服务范围内使用,未经您的同意,我们不会用于其他用途。</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+@import url('../../index.css');
+</style>

+ 6 - 0
src/mp_ecard_sdk/utils/getParameterByName.js

@@ -0,0 +1,6 @@
+const getParameterByName = function (e, t) {
+  e = e.replace(/[\[\]]/g, '\\$&')
+  const a = new RegExp(`[?&]${e}(=([^&#]*)|&|#|$)`).exec(t)
+  return a ? (a[2] ? decodeURIComponent(a[2].replace(/\+/g, ' ')) : '') : null
+}
+export default getParameterByName

+ 1 - 0
src/mp_ecard_sdk/utils/http.js

@@ -0,0 +1 @@
+import Log from"../constants/log.js";let request=function(r,e){let{token:t="",url:o,method:a="POST",data:s,reTry:d,header:u={"Content-Type":"application/json"}}=r;try{uni.request({url:uni.eidBaseUrl+o,method:a,data:s,header:u,success(r){console.log("request success:",r),200===r.statusCode&&r.data?0==r.data.ErrorCode||0==r.data.code?e({ErrorCode:0,ErrorMsg:r.data.ErrorMsg,Data:r.data.Data||r.data.data,reTry:d}):e({ErrorCode:r.data.ErrorCode,ErrorMsg:r.data.ErrorMsg,Data:r.data.Data||r.data.data}):e({ErrorCode:-101,ErrorMsg:"请求错误,请稍后重试"})},fail(a){console.log("request error:",a),d&&d.tryCount&&d.tryCount>0?(d.tryCount--,uni.eidBaseUrl=uni.eidBackUpUrl,setTimeout(()=>{request(r,e)},d.retryDelay||0)):e({ErrorCode:-107,ErrorMsg:"request请求异常,请稍后重试"}),uni.reportLogToEid({token:t,event:Log.requestFail,errCode:"-1",errMsg:"requestFail 调用失败",data:{url:`${uni.eidBaseUrl}`+o,err:a}})}})}catch(r){console.log("request error:",r),e({ErrorCode:-109,ErrorMsg:"request方法异常,请稍后重试"}),uni.reportLogToEid({token:t,event:Log.requestCatch,errCode:"-1",errMsg:"requestFail 调用失败",data:{url:`${uni.eidBaseUrl}`+o,err:r}})}};export const $http=request;

+ 1 - 0
src/mp_ecard_sdk/utils/validate.js

@@ -0,0 +1 @@
+function isValidateToken(e){return/^[a-zA-Z0-9-]{36}$/.test(e)}export default{isValidateToken:isValidateToken};

+ 68 - 0
src/pages-sub-admin/managementByObjectives/index.vue

@@ -0,0 +1,68 @@
+<template>
+  <view class="market-box">
+    <view v-for="item in taskList" :key="item.id">
+      <view
+        class="market-list"
+        :style="{ background: item.backgroundColor }"
+        @click="navigateToDetail"
+      >
+        <image :src="item.img" alt="" />
+        <view class="info" :style="{ color: item.color }">
+          <view class="title">{{ item.title }}</view>
+        </view>
+        <view class="btn">
+          <uv-icon name="arrow-right" :color="item.color" size="16" />
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import taskList from './taskList'
+
+const navigateToDetail = () => {
+  uni.navigateTo({
+    url: `/pages-sub-admin/objectivesList/index`
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.market-box {
+  padding: 30rpx;
+  .market-list {
+    height: 180rpx;
+    border-radius: 16rpx;
+    padding: 10rpx 24rpx;
+    display: flex;
+    align-items: center;
+    margin-bottom: 24rpx;
+    image {
+      width: 160rpx;
+      height: 160rpx;
+    }
+    .info {
+      margin-left: 24rpx;
+      .title {
+        font-size: 36rpx;
+        font-weight: 600;
+        margin-bottom: 10rpx;
+      }
+      .desc {
+        font-size: 22rpx;
+      }
+    }
+    .btn {
+      margin-left: auto;
+      width: 56rpx;
+      height: 56rpx;
+      border-radius: 50%;
+      background: rgba($color: #fff, $alpha: 0.3);
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+}
+</style>

+ 9 - 0
src/pages-sub-admin/managementByObjectives/taskList.ts

@@ -0,0 +1,9 @@
+export default [
+  {
+    title: '服务目标下发',
+    id: 1,
+    color: '#30546E',
+    backgroundColor: 'linear-gradient(270.93deg, #D6EDFD 0.8%, #F1F9FF 100%);',
+    img: 'https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/hyjb.png'
+  }
+]

+ 813 - 0
src/pages-sub-admin/objectivesAdd/index.vue

@@ -0,0 +1,813 @@
+<template>
+  <view class="objectives-add">
+    <view class="message">
+      <uv-text
+        type="error"
+        text="本系统中的年度服务目标、【年度服务预算】、年度服务计划等,无论是否经由一方或双方同意或者确认,均不构成双方之间的协议;服务量、服务费用价格与金额等应以另行签署的合同为准。"
+      ></uv-text>
+    </view>
+
+    <view class="form">
+      <uv-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="80">
+        <uv-form-item
+          label="目标产品"
+          prop="skuIdLable"
+          borderBottom
+          @click="showSelect('skuId')"
+          :customStyle="customStyle"
+          required
+        >
+          <uv-input v-model="form.skuIdLable" border="none" placeholder="请选择" readonly />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+
+        <uv-form-item label="生产企业" prop="ent_name" borderBottom :customStyle="customStyle">
+          <uv-input v-model="form.ent_name" border="none" readonly />
+        </uv-form-item>
+
+        <uv-form-item
+          label="目标总值"
+          prop="planScore"
+          borderBottom
+          :customStyle="customStyle"
+          required
+        >
+          <uv-input v-model="form.planScore" :readonly="formDisabled" type="number" border="none" />
+        </uv-form-item>
+
+        <uv-form-item
+          label="承接对象"
+          prop="consigneeIdLable"
+          borderBottom
+          @click="showSelect('consigneeId')"
+          :customStyle="customStyle"
+          required
+        >
+          <uv-input v-model="form.consigneeIdLable" border="none" placeholder="请选择" readonly />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+
+        <uv-form-item
+          label="目标类型"
+          prop="planTypeLable"
+          borderBottom
+          @click="showSelect('planType')"
+          :customStyle="customStyle"
+          required
+        >
+          <uv-input v-model="form.planTypeLable" border="none" placeholder="请选择" readonly />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item
+          label="目标周期"
+          prop="monthrange"
+          borderBottom
+          @click="showSelect('monthrange')"
+          :customStyle="customStyle"
+          required
+        >
+          <uv-input
+            prefixIcon="calendar"
+            prefixIconStyle="font-size: 22px;color: #909399"
+            v-model="form.monthrange"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item
+          label="目标名称"
+          prop="planName"
+          borderBottom
+          :customStyle="customStyle"
+          required
+        >
+          <uv-input
+            v-model="form.planName"
+            :readonly="formDisabled"
+            placeholder="请输入"
+            border="none"
+          />
+        </uv-form-item>
+      </uv-form>
+      <view class="avail-score" v-if="type === '3'">
+        剩余积分值:{{ detailInfo?.availScore }}
+      </view>
+    </view>
+
+    <view class="table" v-if="['5', '6', '7'].includes(type)">
+      <tableData v-if="type === '5'" ref="tableRef" :planScore="Number(form.planScore)" />
+      <tableDetail
+        v-if="['6', '7'].includes(type)"
+        :planScore="Number(form.planScore)"
+        ref="tableDetailRef"
+      />
+    </view>
+    <!-- 新增 -->
+    <!-- 1 新增 3 -->
+
+    <template v-if="['1', '3', '5'].includes(type)">
+      <view class="btn botton-content" :class="['1', '3'].includes(type) ? 'b-fixed' : ''">
+        <view class="cancel" @click="cancelFn">取消</view>
+        <view class="confirm" @click="confirmFn">确定</view>
+      </view>
+    </template>
+
+    <template v-if="['2', '4', '7'].includes(type)">
+      <view class="botton-content" :class="['2', '4'].includes(type) ? 'b-fixed' : ''">
+        <view class="review-form">
+          <uv-form
+            labelPosition="left"
+            :model="reviewForm"
+            :rules="reviewFormRules"
+            ref="reviewFormRef"
+            labelWidth="80"
+          >
+            <uv-form-item label="审核说明" prop="msg" borderBottom>
+              <uv-textarea
+                v-model="reviewForm.msg"
+                placeholder="请输入审核说明"
+                height="48"
+              ></uv-textarea>
+            </uv-form-item>
+          </uv-form>
+        </view>
+        <view class="btn">
+          <view class="cancel" @click="reviewFn(false)">拒绝</view>
+          <view class="confirm" @click="reviewFn(true)">通过</view>
+        </view>
+      </view>
+    </template>
+
+    <!-- 选择目标产品 -->
+    <uv-picker ref="skuIdPicker" :columns="drugList" keyName="drug_name" @confirm="skuIdConfirm" />
+    <!-- 选择承接对象 -->
+    <uv-picker
+      ref="consigneeIdPicker"
+      :columns="csoList"
+      keyName="name"
+      @confirm="consigneeIdConfirm"
+    />
+    <!-- 选择目标类型 -->
+    <uv-picker
+      ref="planTypePicker"
+      :columns="[planTypeList]"
+      keyName="label"
+      @confirm="planTypeConfirm"
+    />
+
+    <!-- 选择年份 -->
+    <uv-datetime-picker ref="yearPicker" mode="year" @confirm="yearConfirm"></uv-datetime-picker>
+    <!-- 选择季度 -->
+    <uv-picker ref="seasonPicker" :columns="seasonList" keyName="label" @confirm="seasonConfirm" />
+
+    <!-- 月份范围 -->
+    <KDatePicker
+      v-model="show"
+      :limitStartDate="limitStartDate"
+      :limitEndDate="limitEndDate"
+      type="month"
+      is-range
+      @change="getDate"
+      formatter="YYYY-MM-DD"
+    />
+  </view>
+</template>
+
+<script setup lang="ts">
+import {
+  getListDrugApi,
+  getListDescendant,
+  createListApi,
+  planCheckApi,
+  getPlanInfoApi,
+  planDetailCreateApi,
+  checkPlanDetailsApi,
+  updatePlanApi
+} from '@/service/modules/objectivesList'
+import { onLoad } from '@dcloudio/uni-app'
+import { reactive, ref } from 'vue'
+import KDatePicker from '@/components/dateSelect/k-date-picker/KDatePicker.vue'
+
+import tableData from '@/components/table/tableData.vue'
+import tableDetail from '@/components/table/tableDetail.vue'
+import dayjs from 'dayjs'
+
+const drugList = ref<any[]>([])
+const csoList = ref<any[]>([])
+const getDict = () => {
+  getListDrugApi().then((res: any) => (drugList.value = [res.data]))
+  getListDescendant().then((res: any) => (csoList.value = [res.data]))
+}
+
+const type = ref('')
+const planId = ref('')
+const formDisabled = ref(false)
+const distributeDisbled = ref(false)
+const btnType = ref('')
+
+onLoad(async (info: any) => {
+  type.value = info?.type
+  planId.value = info?.planId
+  btnType.value = info?.btnType
+
+  await getDict()
+
+  // 审核
+  if (info?.type === '2') {
+    formDisabled.value = true
+    uni.setNavigationBarTitle({
+      title: '审核'
+    })
+    planInfo()
+  }
+  if (info?.type === '3') {
+    distributeDisbled.value = true
+    uni.setNavigationBarTitle({
+      title: '分发-新增'
+    })
+    planInfo()
+  }
+  if (info?.type === '4') {
+    formDisabled.value = true
+    uni.setNavigationBarTitle({
+      title: '分发-审核'
+    })
+    planInfo()
+  }
+  if (info?.type === '5') {
+    formDisabled.value = true
+    uni.setNavigationBarTitle({
+      title: '拆解'
+    })
+    planInfo()
+  }
+  if (info?.type === '6') {
+    formDisabled.value = true
+    uni.setNavigationBarTitle({
+      title: '数据统计'
+    })
+    planInfo()
+  }
+  if (info?.type === '7') {
+    formDisabled.value = true
+    uni.setNavigationBarTitle({
+      title: '拆解审核'
+    })
+    planInfo()
+  }
+  if (info?.btnType === '1') {
+    uni.setNavigationBarTitle({
+      title: '编辑'
+    })
+    planInfo()
+  }
+})
+
+const detailInfo = ref()
+const limitStartDate = ref()
+const limitEndDate = ref()
+const tableDetailRef = ref()
+const detailsState = ref()
+
+const planInfo = async () => {
+  const res = await getPlanInfoApi(planId.value)
+  detailInfo.value = res.data
+  if (btnType?.value === '1') {
+    return setInfo()
+  }
+  const typeList = ['2', '4', '5', '6', '7']
+  if (typeList.includes(type.value)) {
+    setFormCommonFields(res.data)
+    form.value.planName = res.data.planName
+    form.value.consigneeIdLable = res.data.consigneeInfo.consigneeName
+    form.value.planScore = res.data.planScore + ''
+  } else if (type.value === '3') {
+    setFormCommonFields(res.data)
+    form.value.skuId = res.data.skuId
+    form.value.planIssue = res.data.planIssue
+    form.value.planExpiry = res.data.planExpiry
+  }
+  if (['6', '7'].includes(type.value)) {
+    setTimeout(async () => {
+      const resDetail = await tableDetailRef.value.getDetail(res.data?.planDetails?.detailsId)
+      detailsState.value = resDetail.data.detailsState
+    }, 500)
+  }
+}
+
+const setInfo = () => {
+  const data = detailInfo.value
+  if (type.value === '3') {
+    if (data.planState === 'INIT') {
+      detailInfo.value.availScore = data?.parentPlanAvailScore + data.availScore
+    } else {
+      detailInfo.value.availScore = data?.parentPlanAvailScore
+    }
+  }
+  setFormCommonFields(data)
+  form.value.planName = data.planName
+  form.value.parentId = data.parentId
+  form.value.locFlag = data.locFlag
+  form.value.consigneeId = data.consigneeId
+  form.value.consigneeIdLable = data.consigneeInfo.consigneeName
+  if (data.planType === 'ANN') {
+    const arr = data.planIssue.split('-')
+    form.value.monthrange = arr[0]
+  } else {
+    form.value.monthrange = convertToQuarterStart(data.planIssue)
+  }
+  form.value.planIssue = data.skuInfo.planIssue
+  form.value.planExpiry = data.skuInfo.planExpiry
+  form.value.planScore = data.planScore + ''
+
+  formRef.value.validateField('planScore')
+}
+
+const setFormCommonFields = (data: any) => {
+  form.value.planType = data.planType
+  const curr = planTypeList.find((item) => item.value === data.planType)
+  if (curr) form.value.planTypeLable = curr.label
+  form.value.skuIdLable = data.skuInfo.skuName
+  form.value.ent_name = data.skuInfo.manufacturer
+  form.value.monthrange = data.planIssue + '至' + data.planExpiry
+  form.value.planType = data.planType
+}
+
+function convertToQuarterStart(dateString: string) {
+  const date = new Date(dateString)
+  const year = date.getFullYear()
+  const month = date.getMonth() // 0 为 1 月,11 为 12 月
+  let quarterStartMonth
+  if (month >= 0 && month <= 2) {
+    quarterStartMonth = '第一' // Q1: 1月
+  } else if (month >= 3 && month <= 5) {
+    quarterStartMonth = '第二' // Q2: 4月
+  } else if (month >= 6 && month <= 8) {
+    quarterStartMonth = '第三' // Q3: 7月
+  } else {
+    quarterStartMonth = '第四' // Q4: 10月
+  }
+  return `${year}年${quarterStartMonth}季度`
+}
+
+const customStyle = {
+  height: '80rpx'
+}
+
+const formRef = ref()
+const form = ref({
+  planType: '',
+  planTypeLable: '',
+  parentId: 0,
+  locFlag: 'UN_LOCK',
+  skuId: '',
+  skuIdLable: '',
+  planName: '',
+  consigneeId: '',
+  consigneeIdLable: '',
+  ent_name: '',
+  monthrange: '',
+  planIssue: '',
+  planExpiry: '',
+  planScore: ''
+})
+
+const rules = reactive({
+  skuIdLable: {
+    type: 'string',
+    required: true,
+    message: '请选择目标产品',
+    trigger: ['blur', 'change']
+  },
+  planName: {
+    type: 'string',
+    required: true,
+    message: '请输入目标名称',
+    trigger: ['blur', 'change']
+  },
+  consigneeIdLable: {
+    type: 'string',
+    required: true,
+    message: '请选择承接对象',
+    trigger: ['blur', 'change']
+  },
+  planTypeLable: {
+    type: 'string',
+    required: true,
+    message: '请选择目标周期',
+    trigger: ['blur', 'change']
+  },
+  monthrange: {
+    type: 'string',
+    required: true,
+    message: '请选择目标周期',
+    trigger: ['blur', 'change']
+  },
+  planScore: {
+    type: 'string',
+    required: true,
+    message: '请输入目标总值',
+    trigger: ['blur', 'change']
+  }
+})
+
+const skuIdPicker = ref()
+const consigneeIdPicker = ref()
+const planTypePicker = ref()
+const planTypeList = [
+  {
+    label: '年度计划',
+    value: 'ANN'
+  },
+  {
+    label: '季度计划',
+    value: 'QRT'
+  }
+]
+
+const show = ref(false)
+const yearPicker = ref()
+const seasonPicker = ref()
+const seasonList = ref()
+
+const showSelect = (detailType: string) => {
+  if (formDisabled.value) return
+  if (detailType === 'skuId') {
+    if (type.value === '3') return
+    skuIdPicker.value.open()
+  } else if (detailType === 'consigneeId') {
+    consigneeIdPicker.value.open()
+  } else if (detailType === 'planType') {
+    if (type.value === '3') return
+    planTypePicker.value.open()
+  } else if (detailType === 'monthrange') {
+    if (type.value === '3') return
+    if (!form.value.planTypeLable) return
+    if (form.value.planType === 'ANN') {
+      yearPicker.value.open()
+    } else if (form.value.planType === 'QRT') {
+      let arr = []
+      let years = new Date().getFullYear()
+      for (let i = years - 10; i <= years + 20; i++) {
+        arr.push(i)
+      }
+      const seasonArr = ['一季度', '二季度', '三季度', '四季度']
+      seasonList.value = [arr, seasonArr]
+      seasonPicker.value.open()
+    }
+  }
+}
+
+const skuIdConfirm = (e: any) => {
+  const value = e.value[0]
+  form.value.skuId = value.drug_id
+  form.value.skuIdLable = value.drug_name
+  form.value.ent_name = value.ent_name
+  formRef.value.validateField('skuIdLable')
+  planNameChange()
+}
+const consigneeIdConfirm = (e: any) => {
+  const value = e.value[0]
+  form.value.consigneeId = value.deptId
+  form.value.consigneeIdLable = value.name
+  formRef.value.validateField('consigneeIdLable')
+
+  if (type.value === '3') {
+    const name = detailInfo.value.planName + '-' + value.name
+    form.value.planName = name
+  } else {
+    planNameChange()
+  }
+}
+
+const planTypeConfirm = (e: any) => {
+  if (form.value?.planType === e.value[0]) return
+  const value = e.value[0]
+  form.value.planType = value.value
+  form.value.planTypeLable = value.label
+  formRef.value.validateField('planTypeLable')
+  // 清空目标周期
+  form.value.planIssue = ''
+  form.value.planExpiry = ''
+  form.value.monthrange = ''
+}
+
+const getDate = (e: string[]) => {
+  form.value.monthrange = e[0] + ' 至 ' + e[1]
+  form.value.planIssue = e[0]
+  form.value.planExpiry = e[1]
+  formRef.value.validateField('monthrange')
+  show.value = false
+}
+
+const yearConfirm = (e: any) => {
+  const year = dayjs(e.value).format('YYYY')
+  form.value.monthrange = year
+  form.value.planIssue = year + '-01-01'
+  form.value.planExpiry = year + '-12-31'
+  formRef.value.validateField('monthrange')
+  planNameChange()
+}
+
+const seasonConfirm = (e: any) => {
+  console.log('e', e)
+
+  const seasonIndex = e.indexs[1]
+  const value = e.value
+  form.value.monthrange = value[0] + '年第' + value[1]
+  let startMonth, endMonth, endDay, text
+  switch (seasonIndex) {
+    case 1: // Q1
+      startMonth = 1
+      endMonth = 3
+      endDay = 31
+      text = '第一'
+      break
+    case 2: // Q2
+      startMonth = 4
+      endMonth = 6
+      endDay = 30
+      text = '第二'
+      break
+    case 3: // Q3
+      startMonth = 7
+      endMonth = 9
+      endDay = 30
+      text = '第三'
+      break
+    case 4: // Q4
+      startMonth = 10
+      endMonth = 12
+      endDay = 31
+      text = '第四'
+      break
+    default:
+      throw new Error('Invalid quarter code')
+  }
+  const startDate = `${value[0]}-${String(startMonth).padStart(2, '0')}-01`
+  const endDate = `${value[0]}-${String(endMonth).padStart(2, '0')}-${endDay}`
+  form.value.planIssue = startDate
+  form.value.planExpiry = endDate
+  formRef.value.validateField('monthrange')
+  planNameChange()
+}
+
+const planNameChange = () => {
+  if (
+    form.value.skuIdLable &&
+    form.value.consigneeIdLable &&
+    form.value.planTypeLable &&
+    form.value.monthrange
+  ) {
+    let name = ''
+    if (form.value.planType === 'ANN') {
+      name = `${form.value.monthrange}年度-全年-${form.value.consigneeIdLable}-${form.value.skuIdLable}`
+    } else {
+      const arr = form.value.monthrange.split('年')
+      name = `${arr[0]}年度-${arr[1]}-${form.value.consigneeIdLable}-${form.value.skuIdLable}`
+    }
+
+    form.value.planName = name
+  }
+}
+
+const cancelFn = () => {
+  uni.navigateBack()
+}
+
+const confirmFn = () => {
+  if (type.value === '5') {
+    dismantleSubmit()
+    return
+  }
+  formRef.value
+    .validate()
+    .then(async () => {
+      let res
+      if (type.value === '3') {
+        form.value.parentId = detailInfo.value.planId
+        if (form.value.planScore > detailInfo.value?.availScore) {
+          return uni.showToast({
+            title: '当前分发目标总值不能超过剩余积分值!',
+            icon: 'none'
+          })
+        }
+      }
+      // 编辑 走编辑操作
+      if (btnType.value === '1') {
+        return submitEdit()
+      }
+      res = await createListApi(form.value)
+      if (res.data) {
+        uni.showToast({
+          title: '添加成功',
+          icon: 'none'
+        })
+        setTimeout(() => {
+          uni.navigateBack()
+        }, 1000)
+      }
+    })
+    .catch((err: any) => {
+      console.log('err', err)
+    })
+}
+
+const submitEdit = async () => {
+  const obj = Object.assign(form.value, {
+    planId: detailInfo.value.planId
+  })
+  const res = await updatePlanApi(obj)
+  if (res.data) {
+    uni.showToast({
+      title: '更新成功',
+      icon: 'none'
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+  }
+}
+
+// 审核相关
+const reviewFormRef = ref()
+const reviewForm = reactive({
+  msg: ''
+})
+const reviewFormRules = reactive({
+  msg: {
+    type: 'string',
+    required: false,
+    message: '请输入审核说明',
+    trigger: ['blur', 'change']
+  }
+})
+const reviewFn = (flag: boolean) => {
+  reviewFormRules.msg.required = !flag
+  reviewFormRef.value
+    .validate()
+    .then(async () => {
+      if (type.value === '7') {
+        dismantleReviewSubmt(flag)
+        return
+      }
+      const obj = {
+        msg: reviewForm.msg,
+        planId: detailInfo.value.planId,
+        result: flag
+      }
+
+      const res = await planCheckApi(obj)
+      if (res.data) {
+        uni.showToast({
+          title: '审核完成',
+          icon: 'none'
+        })
+        setTimeout(() => {
+          uni.navigateBack()
+        }, 1000)
+      }
+    })
+    .catch((err: any) => {
+      console.log('err', err)
+    })
+}
+// 拆解
+const tableRef = ref()
+const dismantleSubmit = async () => {
+  const data = tableRef.value.getData()
+  const allQty = data.reduce((prev: any, curr: any) => Number(prev) + Number(curr.qty), 0)
+  const allTotal = data.reduce((prev: any, curr: any) => prev + Number(curr.subtotal), 0)
+  if (allTotal != form.value.planScore) {
+    return uni.showToast({
+      title: '拆解总任务分值需等于目标总值',
+      icon: 'none'
+    })
+  }
+  const obj = {
+    planId: detailInfo.value.planId,
+    qty: allQty,
+    total: allTotal,
+    items: data
+  }
+  const res = await planDetailCreateApi(obj)
+  if (res.data) {
+    uni.showToast({
+      title: '拆解完成',
+      icon: 'none'
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+  }
+}
+// 拆解审核
+const dismantleReviewSubmt = async (flag: boolean) => {
+  const obj = {
+    detailsId: detailInfo.value.planDetails.detailsId,
+    result: flag,
+    msg: reviewForm.msg,
+    currentState: detailsState.value
+  }
+  const res = await checkPlanDetailsApi(obj)
+  if (res.data) {
+    uni.showToast({
+      title: '审核完成',
+      icon: 'none'
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.objectives-add {
+  background: #f2f2f2;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding: 24rpx;
+
+  .message {
+    background: #fff;
+    padding: 30rpx;
+    border-radius: 12rpx;
+    width: 100%;
+    box-sizing: border-box;
+  }
+  .form {
+    background: #fff;
+    padding: 30rpx;
+    border-radius: 12rpx;
+
+    .avail-score {
+      margin-top: 34rpx;
+      font-size: 30rpx;
+      font-weight: 400;
+      color: #000;
+    }
+  }
+  .table {
+    margin-top: 20rpx;
+  }
+}
+
+.botton-content {
+  /* position: fixed;
+  bottom: 40rpx; */
+  margin-top: 20rpx;
+  padding: 30rpx 46rpx 54rpx;
+  box-sizing: border-box;
+  background-color: #fff;
+  width: 700rpx;
+  min-height: 160rpx;
+  border-radius: 12rpx;
+}
+.btn {
+  display: flex;
+  justify-content: space-between;
+
+  view {
+    font-weight: 400;
+    box-sizing: border-box;
+    font-size: 32rpx;
+    line-height: 45rpx;
+    border-radius: 8rpx;
+    height: 72rpx;
+    width: 290rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .cancel {
+    border: 2rpx solid #c7c7c7;
+    color: #111;
+  }
+  .confirm {
+    background-color: #6eb657;
+    color: #ffffff;
+  }
+}
+:deep(.uv-form-item__body__left) {
+  padding-left: 18rpx;
+}
+.review-form {
+  margin-bottom: 54rpx;
+}
+
+.b-fixed {
+  position: fixed;
+  bottom: 40rpx;
+}
+</style>

+ 466 - 0
src/pages-sub-admin/objectivesDetailList/index.vue

@@ -0,0 +1,466 @@
+<template>
+  <view class="objectives-list">
+    <view class="search">
+      <view class="top-search">
+        <view class="search-input">
+          <uv-input
+            v-model="searchParams.planName"
+            :customStyle="customStyle"
+            clearable
+            shape="circle"
+            placeholder="请输入"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #6eb657"
+          ></uv-input>
+        </view>
+        <view class="search-button" @click="searchFn">搜索</view>
+        <uv-icon name="plus-circle" color="#6eb657" size="24" />
+      </view>
+      <view class="search-content">
+        <view
+          class="search-list"
+          @click="searchClick('consigneeId')"
+          :class="searchParams.consigneeId ? 'active' : ''"
+        >
+          <text>承接对象</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.consigneeId ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+        <view
+          class="search-list"
+          @click="searchClick('period')"
+          :class="searchParams.period.length ? 'active' : ''"
+        >
+          <text>创建日期</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.period.length ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+      </view>
+    </view>
+
+    <view class="list" v-if="hasInfo">
+      <view class="item" v-for="item in listArr" :key="item.id">
+        <view class="header">
+          <view class="title">{{ item.planName }}</view>
+          <view class="status">
+            <text class="circle"></text>
+            <text>{{ getStatusName(item.planState) }}</text>
+          </view>
+        </view>
+        <view class="content">
+          <view class="txt">承接对象:{{ item.consigneeInfo.consigneeName }}</view>
+          <view class="txt">目标周期:{{ item.planIssue + ' 至 ' + item.planExpiry }}</view>
+          <view class="txt">创建日期:{{ item.createTime }}</view>
+          <view class="progress">
+            <uv-line-progress
+              class="pro-two"
+              round
+              :showText="false"
+              :percentage="item.percentage"
+              activeColor="#95dc7e"
+              inactiveColor="#f8f8f0"
+            ></uv-line-progress>
+            <text>{{ item.percentage }}%</text>
+          </view>
+          <view class="txt">{{ item.execScoreValue }}/{{ item.planScore }}</view>
+          <view class="btns">
+            <!-- 区域管理员 -->
+            <template v-if="isYQGLY">
+              <!-- 分发 -->
+              <template v-if="item.parentId != '0' && item.planState === 'INIT'">
+                <view class="btn" @click="toDetail(4, item)">
+                  <image src="@/static/images/icon/review-img2.png" class="image" />
+                  <text>分发审核</text>
+                </view>
+              </template>
+            </template>
+            <!-- 区域管理员 | 一级cso -->
+            <template v-if="isDLSGLY">
+              <!-- 拆解审核 -->
+              <template v-if="item.planDetails && !item.planDetails.cktMsg1">
+                <view class="btn" @click="toDetail(7, item)">
+                  <image src="@/static/images/icon/review-img.png" class="image" />
+                  <text>拆解审核</text>
+                </view>
+              </template>
+            </template>
+            <!-- 商务组-->
+            <template v-if="isSWZ">
+              <!-- 拆解审核 -->
+              <template
+                v-if="item.planDetails && item.planDetails.cktMsg1 && !item.planDetails.cktMsg2"
+              >
+                <view class="btn" @click="toDetail(7, item)">
+                  <image src="@/static/images/icon/review-img.png" class="image" />
+                  <text>拆解审核</text>
+                </view>
+              </template>
+            </template>
+            <!-- 事业部-->
+            <template v-if="isSYB">
+              <!-- 拆解审核 -->
+              <template
+                v-if="
+                  item.planDetails &&
+                  item.planDetails.cktMsg1 &&
+                  item.planDetails.cktMsg2 &&
+                  !item.planDetails.cktMsg3
+                "
+              >
+                <view class="btn" @click="toDetail(7, item)">
+                  <image src="@/static/images/icon/review-img.png" class="image" />
+                  <text>拆解审核</text>
+                </view>
+              </template>
+            </template>
+            <!-- 数据统计 -->
+            <template v-if="item.planDetails">
+              <view class="btn" @click.stop.prevent.self="toDetail(6, item)">
+                <image src="@/static/images/icon/dismantle-img2.png" class="image" />
+                <text>数据统计</text>
+              </view>
+            </template>
+
+            <!-- 编辑按钮 -->
+            <template v-if="isDLSGLY && item.parentId != '0'">
+              <view class="btn" @click.stop.prevent.self="toEdit(item)">
+                <text :class="{ disabled: editDisabled(item) }">编辑</text>
+              </view>
+            </template>
+          </view>
+        </view>
+      </view>
+    </view>
+    <noData v-else />
+    <!-- 选择承接对象 -->
+    <uv-picker
+      ref="pickerRef"
+      :columns="csoList"
+      keyName="gsmc"
+      @confirm="pickerConfim"
+    ></uv-picker>
+    <!-- 月份范围 -->
+    <KDatePicker v-model="show" type="month" is-range @change="getDate" formatter="YYYY-MM-DD" />
+  </view>
+</template>
+
+<script setup lang="ts">
+import noData from '@/components/noData/index.vue'
+import { ref } from 'vue'
+import { onShow, onReachBottom, onLoad } from '@dcloudio/uni-app'
+import { getPlanChildrenApi, getListCsoApi } from '@/service/modules/objectivesList'
+import { getDictByNameApi } from '@/service/modules/getDict'
+import KDatePicker from '@/components/dateSelect/k-date-picker/KDatePicker.vue'
+import { useLoginStore } from '@/store/login'
+
+const loginStore = useLoginStore()
+let userInfo: any = loginStore.currentUserInfo
+const roles: number[] = userInfo.roles
+
+const customStyle = {
+  backgroundColor: '#f6f6f6'
+}
+
+const searchInfoDetail = ref()
+
+onLoad((e: any) => {
+  const searchInfo = JSON.parse(e?.searchInfo)
+  searchInfo.planId = e?.id
+  searchInfoDetail.value = searchInfo
+})
+
+class Params {
+  consigneeId = ''
+  period = [] as string[]
+  planName = ''
+  total = -1
+  current = 1
+  size = 10
+}
+
+const searchParams = ref(new Params())
+
+const hasInfo = ref(true)
+const listArr = ref<any[]>([])
+
+const getList = async (searchInfo: any) => {
+  uni.showLoading()
+  const res = await getPlanChildrenApi(searchInfo)
+  if (res.code === 0 && res.data) {
+    res.data?.forEach((item: any) => {
+      if (typeof item.execScoreValue === 'number' && typeof item.planScore === 'number') {
+        let value: any = (item.execScoreValue / item.planScore).toFixed(2)
+        item.percentage = value * 100
+      }
+    })
+    listArr.value = res.data
+  }
+  hasInfo.value = !!listArr.value.length
+  uni.hideLoading()
+}
+
+onReachBottom(() => {
+  if (listArr.value.length === searchParams.value.total) return
+  searchParams.value.current++
+  // getList()
+})
+const csoList = ref<any[]>([])
+const implPlanStateList = ref<any[]>([])
+const getDict = async () => {
+  getDictByNameApi('impl_plan_state').then((res: any) => (implPlanStateList.value = res.data))
+  getListCsoApi().then((res: any) => (csoList.value = [res.data]))
+}
+const getCsoName = (consigneeId: number) => {
+  const curr = csoList.value[0]?.find((item: any) => item.deptId === consigneeId)
+  return curr?.gsmc
+}
+const getStatusName = (planState: string) => {
+  const curr = implPlanStateList.value?.find((item: any) => item.value === planState)
+  return curr?.label
+}
+
+// 营销中心
+const isYXZX = ref(false)
+// 药企管理员
+const isYQGLY = ref(false)
+// 区域管理员
+const isDLSGLY = ref(false)
+// 商务组
+const isSWZ = ref(false)
+// 事业部分管领导
+const isSYB = ref(false)
+
+onShow(() => {
+  // 营销中心
+  if (roles.includes(38)) {
+    isYXZX.value = true
+  }
+  // 药企管理员
+  if (roles.includes(3)) {
+    isYQGLY.value = true
+  }
+  // 区域管理员
+  if (roles.includes(4)) {
+    isDLSGLY.value = true
+  }
+  // 商务组
+  if (roles.includes(40)) {
+    isSWZ.value = true
+  }
+  // 事业部
+  if (roles.includes(41)) {
+    isSYB.value = true
+  }
+  listArr.value = []
+  getDict()
+  searchParams.value.current = 1
+  getList(searchInfoDetail.value)
+})
+
+const searchFn = () => {
+  listArr.value = []
+  searchParams.value.current = 1
+  // getList()
+}
+
+const pickerRef = ref()
+const show = ref(false)
+
+const searchClick = (type: string) => {
+  if (type === 'consigneeId') {
+    pickerRef.value.open()
+  } else {
+    show.value = true
+  }
+}
+
+const pickerConfim = (e: any) => {
+  searchParams.value.consigneeId = e.value[0].deptId
+  searchFn()
+}
+
+const getDate = (e: any[]) => {
+  if (!e[1]) return
+  searchParams.value.period = e
+  show.value = false
+  searchFn()
+}
+
+const toDetail = (type: number, row?: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-admin/objectivesAdd/index?&type=${type}&planId=${row.planId}`
+  })
+}
+
+const editDisabled = (item: any) => {
+  // 下发的一级包状态
+  if (item.parentId == 0) {
+    if (item.planType === 'ANN') {
+      let flag = item.planState === 'INIT' || item.planState === 'REJECTED'
+      return !flag
+    } else if (item.planType === 'QRT') {
+      let flag = item.children && item.children.length > 0
+      return flag
+    }
+  } else {
+    let flag = item.planState === 'INIT' || item.planState === 'REJECTED'
+    return !flag
+  }
+}
+// 编辑
+const toEdit = (item: any) => {
+  const flag = editDisabled(item)
+  if (flag) return
+
+  const type = item.parentId == 0 ? 1 : 3
+  uni.navigateTo({
+    url: `/pages-sub-admin/objectivesAdd/index?&type=${type}&btnType=1&planId=${item?.planId}`
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.objectives-list {
+  padding: 24rpx 0;
+  .search {
+    position: fixed;
+    width: 750rpx;
+    padding: 0 30rpx;
+    top: 0;
+    height: 150rpx;
+    background-color: #fff;
+    z-index: 99;
+    .top-search {
+      display: flex;
+      align-items: center;
+
+      .search-input {
+        width: 540rpx;
+        height: 70rpx;
+      }
+      .search-button {
+        color: #6eb657;
+        font-size: 30rpx;
+        margin: 0 10px;
+        font-weight: 400;
+      }
+    }
+    .search-content {
+      margin-top: 24rpx;
+      padding-bottom: 10rpx;
+      display: flex;
+      .search-list {
+        display: flex;
+        align-content: center;
+        margin-right: 64rpx;
+        height: 40rpx;
+        text {
+          font-weight: 500;
+          line-height: 40rpx;
+          font-size: 28rpx;
+          color: #111111;
+          margin-right: 8rpx;
+        }
+      }
+      .active text {
+        color: #6eb657;
+      }
+    }
+  }
+
+  .list {
+    margin-top: 150rpx;
+    padding: 0 30rpx;
+    .item {
+      margin-bottom: 20rpx;
+      width: 100%;
+      border-radius: 16rpx;
+      box-shadow: 0px 2rpx 8rpx 0px rgba(0, 0, 0, 0.2);
+      .header {
+        background-color: #f8f8f0;
+        padding: 26rpx 20rpx;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        border-top-left-radius: 16rpx;
+        border-top-right-radius: 16rpx;
+        .title {
+          font-size: 32rpx;
+          line-height: 45rpx;
+          width: 70%;
+          font-weight: 500;
+          color: #333;
+          word-wrap: break-word;
+        }
+        .status {
+          .circle {
+            display: block;
+            border-radius: 50%;
+            background-color: #72b25b;
+            margin-right: 10rpx;
+            width: 15rpx;
+            height: 15rpx;
+          }
+          display: flex;
+          align-items: center;
+          color: #72b25b;
+        }
+      }
+      .content {
+        padding: 20rpx;
+        .txt {
+          font-weight: 400;
+          color: #999;
+          font-size: 22rpx;
+          line-height: 30rpx;
+          margin-bottom: 16rpx;
+        }
+        .progress {
+          display: flex;
+          align-items: center;
+          margin-bottom: 8rpx;
+          .pro-two {
+            width: 80%;
+          }
+          text {
+            margin-left: 10px;
+            color: #010101;
+            font-size: 26rpx;
+            line-height: 36rpx;
+          }
+        }
+        .btns {
+          margin-top: 30rpx;
+          display: flex;
+
+          .btn {
+            display: flex;
+            align-items: center;
+            height: 34rpx;
+
+            .image {
+              width: 28rpx;
+              height: 28rpx;
+              margin-right: 12rpx;
+            }
+            text {
+              color: #6eb657;
+              font-size: 24rpx;
+              line-height: 34rpx;
+            }
+            .disabled {
+              color: #999;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 177 - 0
src/pages-sub-admin/objectivesList/components/approvalFlowchart.vue

@@ -0,0 +1,177 @@
+<template>
+  <uv-popup ref="popup" mode="bottom" @change="popupChange" v-if="showComponents">
+    <view class="step-content">
+      <uv-steps :current="info.active" dot direction="column" v-if="info.type === 0">
+        <uv-steps-item title="创建完成" active-color="#95dc7e" :customStyle="customStyle">
+          <template v-slot:title>
+            <text class="content-item">创建完成</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item v-if="showStep2">
+          <template v-slot:title>
+            <text class="content-item">{{ info.title1 }}</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">待区域管理员分发</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item title="审核通过待下发">
+          <template v-slot:title>
+            <text class="content-item">审核通过待下发</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">审核通过已下发</text>
+          </template>
+        </uv-steps-item>
+      </uv-steps>
+      <uv-steps
+        :current="info.active"
+        dot
+        direction="column"
+        active-color="#95dc7e"
+        inactive-color="#999"
+        v-if="info.type === 1"
+      >
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">创建完成</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">{{ info.title2 }}</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">{{ info.title3 }}</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">待区域管理员拆解审核</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">待商务管理员拆解审核</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">待事业部分管领导拆解审核</text>
+          </template>
+        </uv-steps-item>
+        <uv-steps-item>
+          <template v-slot:title>
+            <text class="content-item">拆解完成</text>
+          </template>
+        </uv-steps-item>
+      </uv-steps>
+    </view>
+  </uv-popup>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+
+const showComponents = ref(false)
+
+const customStyle = {
+  height: '120rpx'
+}
+
+const popup = ref()
+
+const showStep2 = ref(true)
+
+const info = reactive({
+  title1: '待营销中心分管领导审批',
+  title2: '待运营管理员分发审核',
+  title3: '待服务商管理员拆解',
+  active: 1,
+  type: 0
+})
+
+const show = (item: any) => {
+  showComponents.value = true
+  info.type = item.parentId === 0 ? 0 : 1
+  info.title1 = '待营销中心分管领导审批'
+  info.title2 = '待运营管理员分发审核'
+  info.title3 = '待服务员管理员拆解'
+  info.active = 1
+
+  if (item.parentId == 0) {
+    showStep2.value = item.planType === 'QRT' ? false : true
+
+    if (item.planState === 'PASSED') {
+      if (!item.children) {
+        info.active = 2
+      } else {
+        info.active = item.execScoreValue > 0 ? 5 : 3
+      }
+    } else if (item.planState === 'REJECTED') {
+      info.title1 = '营销中心分管领导拒绝'
+    }
+  } else {
+    if (item.planState === 'PASSED') {
+      if (!item.planDetails) {
+        info.active = 2
+      } else {
+        switch (item.planDetails.detailsState) {
+          case 'INIT':
+            info.active = 3
+            break
+          case 'CKT1':
+            info.active = 4
+            break
+          case 'CKT2':
+            info.active = 5
+            break
+          case 'PASSED':
+            info.active = 7
+            break
+          case 'REJECTED':
+            info.active = 2
+            info.title3 = '拆解审核失败,待服务员管理员重新拆解'
+            break
+          default:
+            break
+        }
+      }
+    } else if (item.planState === 'REJECTED') {
+      info.title2 = '运营管理员分发审核拒绝'
+    }
+  }
+
+  setTimeout(() => {
+    popup.value.open()
+  }, 250)
+}
+
+const popupChange = (flag: any) => {
+  if (!flag.show) {
+    showStep2.value = true
+    showComponents.value = false
+  }
+}
+
+defineExpose({ show })
+</script>
+
+<style lang="scss" scoped>
+.step-content {
+  height: 80vh;
+  padding: 30rpx;
+}
+.content-item {
+  height: 120rpx;
+}
+:deep(.uv-steps-item__line) {
+  height: 120rpx !important;
+}
+</style>

+ 487 - 0
src/pages-sub-admin/objectivesList/index.vue

@@ -0,0 +1,487 @@
+<template>
+  <view class="objectives-list">
+    <view class="search">
+      <view class="top-search">
+        <view class="search-input">
+          <uv-input
+            v-model="searchParams.planName"
+            :customStyle="customStyle"
+            clearable
+            shape="circle"
+            placeholder="请输入"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #6eb657"
+          ></uv-input>
+        </view>
+        <view class="search-button" @click="searchFn">搜索</view>
+        <uv-icon name="plus-circle" v-if="addFlag" color="#6eb657" size="24" @click="toDetail(1)" />
+      </view>
+      <view class="search-content">
+        <view
+          class="search-list"
+          @click="searchClick('consigneeId')"
+          :class="searchParams.consigneeId ? 'active' : ''"
+        >
+          <text>承接对象</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.consigneeId ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+        <view
+          class="search-list"
+          @click="searchClick('period')"
+          :class="searchParams.period.length ? 'active' : ''"
+        >
+          <text>目标周期</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.period.length ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+      </view>
+    </view>
+
+    <view class="list" v-if="hasInfo">
+      <view
+        class="item"
+        v-for="item in listArr"
+        :key="item.id"
+        @click.stop.prevent.self="detailClick(item.id)"
+      >
+        <view class="header">
+          <view class="title">{{ item.planName }}</view>
+          <view class="status">
+            <text class="circle"></text>
+            <text>{{ getStatusName(item.planState) }}</text>
+          </view>
+        </view>
+        <view class="content">
+          <view class="txt">承接对象:{{ item.consigneeInfo.consigneeName }}</view>
+          <view class="txt">目标周期:{{ item.planIssue + ' 至 ' + item.planExpiry }}</view>
+          <view class="txt">创建日期:{{ item.createTime }}</view>
+          <view class="progress">
+            <uv-line-progress
+              class="pro-two"
+              round
+              :showText="false"
+              :percentage="item.percentage"
+              activeColor="#95dc7e"
+              inactiveColor="#f8f8f0"
+            ></uv-line-progress>
+            <text>{{ item.percentage }}%</text>
+          </view>
+          <view class="txt">{{ item.execScoreValue }}/{{ item.planScore }}</view>
+          <view class="btns">
+            <view class="btn" @click.stop.prevent.self="approvalFlowchartFn(item)">
+              <text>审核节点</text>
+            </view>
+            <!-- 区域管理员 -->
+            <template v-if="isDLSGLY">
+              <!-- 分发 -->
+              <template v-if="item.parentId == '0' && item.availScore > 0">
+                <view class="btn" @click.stop.prevent.self="toDetail(3, item)">
+                  <image src="@/static/images/icon/distribute-img.png" class="image" />
+                  <text>分发</text>
+                </view>
+              </template>
+            </template>
+            <!-- 营销中心 -->
+            <template v-if="isYXZX">
+              <!-- 审核 -->
+              <template v-if="item.planState === 'INIT' && item.parentId == 0">
+                <view class="btn" @click.stop.prevent.self="toDetail(2, item)">
+                  <image src="@/static/images/icon/review-img.png" class="image" />
+                  <text>审核</text>
+                </view>
+              </template>
+            </template>
+            <!-- 二级cso -->
+            <template v-if="isROLE_SERVICE">
+              <!-- 拆解 -->
+              <template v-if="!item.planDetails || item.planDetails.detailsState === 'REJECTED'">
+                <view class="btn" @click.stop.prevent.self="toDetail(5, item)">
+                  <image src="@/static/images/icon/dismantle-img2.png" class="image" />
+                  <text>拆解</text>
+                </view>
+              </template>
+            </template>
+            <!-- 数据统计 -->
+            <template v-if="item.planDetails">
+              <view class="btn" @click.stop.prevent.self="toDetail(6, item)">
+                <image src="@/static/images/icon/dismantle-img2.png" class="image" />
+                <text>数据统计</text>
+              </view>
+            </template>
+            <!-- 编辑按钮 -->
+            <template v-if="isYQGLY && item.parentId == '0'">
+              <view class="btn" @click.stop.prevent.self="toEdit(item)">
+                <text :class="{ disabled: editDisabled(item) }">编辑</text>
+              </view>
+            </template>
+          </view>
+        </view>
+      </view>
+    </view>
+    <noData v-else />
+    <!-- 选择承接对象 -->
+    <uv-picker
+      @cancel="pickerCancel"
+      :cancelText="searchParams.consigneeId ? '清空' : '取消'"
+      ref="pickerRef"
+      :columns="csoList"
+      keyName="gsmc"
+      @confirm="pickerConfim"
+    ></uv-picker>
+    <!-- 月份范围 -->
+    <KDatePicker
+      v-model="show"
+      type="month"
+      is-range
+      :confirmText="searchParams.period.length ? '清除' : '确定'"
+      @change="getDate"
+      formatter="YYYY-MM-DD"
+    />
+    <approvalFlowchart ref="approvalFlowchartRef" />
+  </view>
+</template>
+
+<script setup lang="ts">
+import noData from '@/components/noData/index.vue'
+import { ref } from 'vue'
+import { onShow, onReachBottom } from '@dcloudio/uni-app'
+import { getListApi, getListDescendant } from '@/service/modules/objectivesList'
+import { getDictByNameApi } from '@/service/modules/getDict'
+import KDatePicker from '@/components/dateSelect/k-date-picker/KDatePicker.vue'
+import { useLoginStore } from '@/store/login'
+import approvalFlowchart from './components/approvalFlowchart.vue'
+
+const loginStore = useLoginStore()
+let userInfo: any = loginStore.currentUserInfo
+const roles: number[] = userInfo.roles
+
+const customStyle = {
+  backgroundColor: '#f6f6f6'
+}
+
+class Params {
+  consigneeId = ''
+  period = [] as string[]
+  planName = ''
+  total = -1
+  current = 1
+  size = 10
+}
+
+const searchParams = ref(new Params())
+
+const hasInfo = ref(true)
+const listArr = ref<any[]>([])
+const getList = async () => {
+  uni.showLoading()
+  const res = await getListApi(searchParams.value)
+  if (res.code === 0) {
+    searchParams.value.total = res.data.total
+    res.data.records.forEach((item: any) => {
+      if (typeof item.execScoreValue === 'number' && typeof item.planScore === 'number') {
+        let value: any = (item.execScoreValue / item.planScore).toFixed(2)
+        item.percentage = value * 100
+      }
+    })
+    listArr.value = listArr.value.concat(res.data.records)
+    searchParams.value.total = res.data.total
+    hasInfo.value = !!listArr.value.length
+  } else {
+    hasInfo.value = false
+  }
+  uni.hideLoading()
+}
+const pickerCancel = () => {
+  if (searchParams.value.consigneeId) {
+    searchParams.value.consigneeId = ''
+    searchFn()
+  }
+}
+
+onReachBottom(() => {
+  if (listArr.value.length === searchParams.value.total) return
+  searchParams.value.current++
+  getList()
+})
+const csoList = ref<any[]>([])
+const implPlanStateList = ref<any[]>([])
+const getDict = async () => {
+  getDictByNameApi('impl_plan_state').then((res: any) => (implPlanStateList.value = res.data))
+  getListDescendant().then((res: any) => (csoList.value = [res.data]))
+}
+
+const getStatusName = (planState: string) => {
+  const curr = implPlanStateList.value?.find((item: any) => item.value === planState)
+  return curr?.label
+}
+
+const detailClick = (id: number) => {
+  if (isROLE_SERVICE.value) return
+  const searchInfo = JSON.stringify(searchParams.value)
+  uni.navigateTo({
+    url: `/pages-sub-admin/objectivesDetailList/index?&searchInfo=${searchInfo}&id=${id}`
+  })
+}
+
+// 营销中心
+const isYXZX = ref(false)
+// 药企管理员
+const isYQGLY = ref(false)
+// 区域管理员
+const isDLSGLY = ref(false)
+
+// 二级cso
+const isROLE_SERVICE = ref(false)
+
+// 判断是否有新增按钮
+
+const addFlag = ref(false)
+
+onShow(() => {
+  // 营销中心
+  if (roles.includes(38)) {
+    isYXZX.value = true
+  }
+  // 药企管理员
+  if (roles.includes(3)) {
+    isYQGLY.value = true
+    addFlag.value = true
+  }
+  // 区域管理员
+  if (roles.includes(4)) {
+    isDLSGLY.value = true
+  }
+  if (roles.includes(37)) {
+    isROLE_SERVICE.value = true
+  }
+  listArr.value = []
+  getDict()
+  searchParams.value.current = 1
+  getList()
+})
+
+const searchFn = () => {
+  listArr.value = []
+  searchParams.value.current = 1
+  getList()
+}
+
+const pickerRef = ref()
+const show = ref(false)
+
+const searchClick = (type: string) => {
+  if (type === 'consigneeId') {
+    pickerRef.value.open()
+  } else {
+    show.value = true
+  }
+}
+
+const pickerConfim = (e: any) => {
+  searchParams.value.consigneeId = e.value[0].deptId
+  searchFn()
+}
+
+const getDate = (e: any[]) => {
+  if (searchParams.value.period.length) {
+    searchParams.value.period = []
+  } else {
+    searchParams.value.period = e
+  }
+  show.value = false
+  searchFn()
+}
+
+const approvalFlowchartRef = ref()
+const approvalFlowchartFn = (item: any) => {
+  approvalFlowchartRef.value.show(item)
+}
+
+// type 1: 新增 2:审核 3: 分发 4:分发审核 5:拆解 6:数据统计 7:拆解审核
+const toDetail = (type: number, row?: any) => {
+  if (type === 1) {
+    uni.navigateTo({
+      url: `/pages-sub-admin/objectivesAdd/index?&type=${type}`
+    })
+  } else {
+    uni.navigateTo({
+      url: `/pages-sub-admin/objectivesAdd/index?&type=${type}&planId=${row?.planId}`
+    })
+  }
+}
+
+const editDisabled = (item: any) => {
+  // 下发的一级包状态
+  if (item.parentId == 0) {
+    if (item.planType === 'ANN') {
+      let flag = item.planState === 'INIT' || item.planState === 'REJECTED'
+      return !flag
+    } else if (item.planType === 'QRT') {
+      let flag = item.children && item.children.length > 0
+      return flag
+    }
+  } else {
+    let flag = item.planState === 'INIT' || item.planState === 'REJECTED'
+    return !flag
+  }
+}
+
+// 编辑
+const toEdit = (item: any) => {
+  const flag = editDisabled(item)
+  if (flag) return
+
+  const type = item.parentId == 0 ? 1 : 3
+  uni.navigateTo({
+    url: `/pages-sub-admin/objectivesAdd/index?&type=${type}&btnType=1&planId=${item?.planId}`
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.objectives-list {
+  padding: 24rpx 0;
+  .search {
+    position: fixed;
+    width: 750rpx;
+    padding: 0 30rpx;
+    top: 0;
+    height: 150rpx;
+    background-color: #fff;
+    z-index: 99;
+    .top-search {
+      display: flex;
+      align-items: center;
+
+      .search-input {
+        width: 540rpx;
+        height: 70rpx;
+      }
+      .search-button {
+        color: #6eb657;
+        font-size: 30rpx;
+        margin: 0 10px;
+        font-weight: 400;
+      }
+    }
+    .search-content {
+      margin-top: 24rpx;
+      padding-bottom: 10rpx;
+      display: flex;
+      .search-list {
+        display: flex;
+        align-content: center;
+        margin-right: 64rpx;
+        height: 40rpx;
+        text {
+          font-weight: 500;
+          line-height: 40rpx;
+          font-size: 28rpx;
+          color: #111111;
+          margin-right: 8rpx;
+        }
+      }
+      .active text {
+        color: #6eb657;
+      }
+    }
+  }
+
+  .list {
+    margin-top: 150rpx;
+    padding: 0 30rpx;
+    .item {
+      margin-bottom: 20rpx;
+      width: 100%;
+      border-radius: 16rpx;
+      box-shadow: 0px 2rpx 8rpx 0px rgba(0, 0, 0, 0.2);
+      .header {
+        background-color: #f8f8f0;
+        padding: 26rpx 20rpx;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        border-top-left-radius: 16rpx;
+        border-top-right-radius: 16rpx;
+        .title {
+          font-size: 32rpx;
+          line-height: 45rpx;
+          width: 70%;
+          font-weight: 500;
+          color: #333;
+          word-wrap: break-word;
+        }
+        .status {
+          .circle {
+            display: block;
+            border-radius: 50%;
+            background-color: #72b25b;
+            margin-right: 10rpx;
+            width: 15rpx;
+            height: 15rpx;
+          }
+          display: flex;
+          align-items: center;
+          color: #72b25b;
+        }
+      }
+      .content {
+        padding: 20rpx;
+        .txt {
+          font-weight: 400;
+          color: #999;
+          font-size: 22rpx;
+          line-height: 30rpx;
+          margin-bottom: 16rpx;
+        }
+        .progress {
+          display: flex;
+          align-items: center;
+          margin-bottom: 8rpx;
+          .pro-two {
+            width: 80%;
+          }
+          text {
+            margin-left: 10px;
+            color: #010101;
+            font-size: 26rpx;
+            line-height: 36rpx;
+          }
+        }
+        .btns {
+          margin-top: 30rpx;
+          display: flex;
+
+          .btn {
+            display: flex;
+            align-items: center;
+            height: 34rpx;
+            margin-right: 10rpx;
+
+            .image {
+              width: 28rpx;
+              height: 28rpx;
+              margin-right: 12rpx;
+            }
+            text {
+              color: #6eb657;
+              font-size: 24rpx;
+              line-height: 34rpx;
+            }
+            .disabled {
+              color: #999;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 84 - 0
src/pages-sub-admin/serviceManagement/index.vue

@@ -0,0 +1,84 @@
+<template>
+  <view class="market-box">
+    <template v-for="(item, index) in taskList" :key="item.url">
+      <view v-show="getShow(index)">
+        <view
+          class="market-list"
+          :style="{ background: item.backgroundColor }"
+          @click="navigateToDetail(item.url)"
+        >
+          <image :src="item.img" alt="" />
+          <view class="info" :style="{ color: item.color }">
+            <view class="title">{{ item.title }}</view>
+          </view>
+          <view class="btn">
+            <uv-icon name="arrow-right" :color="item.color" size="16" />
+          </view>
+        </view>
+      </view>
+    </template>
+  </view>
+</template>
+
+<script setup lang="ts">
+import taskList from './taskList'
+import { useLoginStore } from '@/store/login'
+const loginStore = useLoginStore()
+let userInfo: any = loginStore.currentUserInfo
+const currentRoles: number[] = userInfo.roles
+
+const navigateToDetail = (url: string) => {
+  uni.navigateTo({
+    url: url
+  })
+}
+
+const getShow = (index: number) => {
+  if (index === 0) {
+    return !currentRoles.includes(37)
+  }
+  if (index === 1) {
+    return currentRoles.includes(37)
+  }
+  return true
+}
+</script>
+
+<style lang="scss" scoped>
+.market-box {
+  padding: 30rpx;
+  .market-list {
+    height: 180rpx;
+    border-radius: 16rpx;
+    padding: 10rpx 24rpx;
+    display: flex;
+    align-items: center;
+    margin-bottom: 24rpx;
+    image {
+      width: 160rpx;
+      height: 160rpx;
+    }
+    .info {
+      margin-left: 24rpx;
+      .title {
+        font-size: 36rpx;
+        font-weight: 600;
+        margin-bottom: 10rpx;
+      }
+      .desc {
+        font-size: 22rpx;
+      }
+    }
+    .btn {
+      margin-left: auto;
+      width: 56rpx;
+      height: 56rpx;
+      border-radius: 50%;
+      background: rgba($color: #fff, $alpha: 0.3);
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+}
+</style>

+ 34 - 0
src/pages-sub-admin/serviceManagement/taskList.ts

@@ -0,0 +1,34 @@
+export default [
+  {
+    title: '服务下发',
+    color: '#30546E',
+    role: [4],
+    url: '/pages-sub-service-mangement/serviceDelivery/index',
+    backgroundColor: 'linear-gradient(270.93deg, #D6EDFD 0.8%, #F1F9FF 100%);',
+    img: 'https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/zxdc.png'
+  },
+  {
+    title: '服务下发-自营',
+    color: '#427C89',
+    role: [37],
+    url: '/pages-sub-service-mangement/assignPoints/index',
+    backgroundColor: 'linear-gradient(94.41deg, #F0FCFF -14.28%, #DBF3F8 77.47%);',
+    img: 'https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/yddc.png'
+  },
+  {
+    title: '服务承接',
+    color: '#685B32',
+    role: [37],
+    url: '/pages-sub-service-mangement/taskManagement/index',
+    backgroundColor: 'linear-gradient(273.25deg, #FFF5D1 9.9%, #FFFAE6 99.41%);',
+    img: 'https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/jpdc.png'
+  },
+  {
+    title: '服务审核',
+    color: '#8E3F3B',
+    role: [4],
+    url: '/pages-sub-service-mangement/taskReportapproval/index',
+    backgroundColor: 'linear-gradient(94.41deg, #FFFCFC -14.28%, #F4E1E0 77.47%);',
+    img: 'https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/kcdc.png'
+  }
+]

+ 47 - 0
src/pages-sub-mine/agreement/index.vue

@@ -0,0 +1,47 @@
+<template>
+  <view class="agreement">
+    <view
+      class="agreement-item"
+      v-for="item in agreementList"
+      :key="item.path"
+      @click="navigatorClick(item)"
+      >{{ item.name }}</view
+    >
+  </view>
+</template>
+
+<script setup lang="ts">
+const agreementList = [
+  {
+    name: '《营销行为小助手平台用户协议》',
+    path: '/pages-sub-packages/agreement/platformUsers'
+  },
+  {
+    name: '《隐私权政策》',
+    path: '/pages-sub-packages/agreement/privacyPolicy'
+  },
+  {
+    name: '《个人信息使用授权书》',
+    path: '/pages-sub-packages/agreement/personalInfoAuth'
+  }
+]
+const navigatorClick = (item: any) => {
+  if (!item.path) return
+  uni.navigateTo({
+    url: item.path
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.agreement {
+  padding: 30rpx;
+  .agreement-item {
+    height: 100rpx;
+    line-height: 100rpx;
+    font-size: 32rpx;
+    color: #333333;
+    border-bottom: 1px solid #d9d9d9;
+  }
+}
+</style>

+ 129 - 0
src/pages-sub-mine/auth/constants/index.ts

@@ -0,0 +1,129 @@
+interface authType {
+  [key: string]: string | undefined
+}
+
+export const subjectLocationName: authType = {
+  REN_LI_JIA: '人力家',
+  LUO_SHU_YUN: '税邦云', // 永州罗数云, 暂时定为税邦云
+  // 钉灵工通道
+  FEI_YI: '钉灵工-海南飞亿',
+  JIN_YUAN: '金园数科',
+  XIN_TAI_ZI: '钉灵工-河南薪泰梓',
+  ZHENG_QI_ZHI_XING: '安之慧',
+  HUI_QI_YUN: '汇企云',
+  OTHER: '其他'
+}
+
+interface statusType {
+  [key: string]: string[]
+}
+
+export const statusListMap: statusType = {
+  REN_LI_JIA: ['CER_STATUS_2', 'CER_STATUS_4'],
+  LUO_SHU_YUN: ['UN_CERT', 'ADD_MEMBER'],
+  YEE: ['UN_SIGNED', 'TERMINATED'], //
+  FEI_YI: ['UN_SIGNED', 'SIGNED', 'SIGNING', 'UN_CERT'],
+  JIN_YUAN: ['UN_SIGNED', 'SIGNED', 'SIGNING', 'UN_CERT'],
+  XIN_TAI_ZI: ['UN_SIGNED', 'SIGNED', 'SIGNING', 'UN_CERT'],
+  ZHENG_QI_ZHI_XING: ['UN_SIGN', 'SIGN'],
+  HUI_QI_YUN: ['UN_SIGN', 'SIGN']
+}
+
+export const peddingListMap: statusType = {
+  REN_LI_JIA: ['CER_STATUS_1', 'CER_STATUS_3'], // 1, 3
+  LUO_SHU_YUN: ['CHECKED_UNBIND', 'CHECKING_UNBIND', 'UNCHECKED_BIND', 'CHECKING_BIND', 'CERT'], // (12, 14跳转绑卡页面, 可点) (16已绑卡, 跳转人脸采集页面, 采集完毕提交, 可点) (13, 15显示状态, 不能点)
+  YEE: ['SIGNED'], // 1 不可点
+  FEI_YI: ['CERT'], // 1, 3 不可点
+  JIN_YUAN: ['CERT'],
+  XIN_TAI_ZI: ['CERT'],
+  ZHENG_QI_ZHI_XING: ['CERT'], // 安之慧
+  HUI_QI_YUN: ['CERT']
+}
+
+interface anyType {
+  [key: string]: any
+}
+export const notCertMap: anyType = {
+  REN_LI_JIA: ['CER_STATUS_2', 'CER_STATUS_4'],
+  LUO_SHU_YUN: ['UN_CERT'],
+  YEE: ['UN_SIGNED', 'TERMINATED'], //
+  FEI_YI: ['UN_SIGNED'],
+  JIN_YUAN: ['UN_SIGNED'],
+  XIN_TAI_ZI: ['UN_SIGNED'],
+  ZHENG_QI_ZHI_XING: ['UN_SIGN'],
+  HUI_QI_YUN: ['UN_SIGN']
+}
+
+export const subjectLocationStatusName: anyType = {
+  REN_LI_JIA: {
+    CER_STATUS_1: '认证成功',
+    CER_STATUS_2: '认证失败',
+    CER_STATUS_3: '认证中',
+    CER_STATUS_4: '未认证'
+  },
+  LUO_SHU_YUN: {
+    UN_CERT: '未认证',
+    ADD_MEMBER: '已增员',
+    CHECKED_UNBIND: '已认证,未绑卡',
+    CHECKING_BIND: '认证中已绑卡',
+    CHECKING_UNBIND: '认证中未绑卡',
+    CERT: '认证成功',
+    UNCHECKED_BIND: '未认证已绑卡'
+  },
+  YEE: {
+    UN_SIGNED: '未签约',
+    SIGNED: '已签约',
+    TERMINATED: '已解约'
+  },
+  JIN_YUAN: {
+    UN_SIGNED: '未签约',
+    CERT: '认证成功',
+    SIGNED: '已签约',
+    SIGNING: '签约中',
+    UN_CERT: '未认证'
+  },
+  XIN_TAI_ZI: {
+    UN_SIGNED: '未签约',
+    CERT: '认证成功',
+    SIGNED: '已签约',
+    SIGNING: '签约中',
+    UN_CERT: '未认证'
+  },
+  ZHENG_QI_ZHI_XING: {
+    UN_SIGN: '未签约',
+    CERT: '认证成功',
+    SIGN: '已签约'
+  },
+  HUI_QI_YUN: {
+    UN_SIGN: '未签约',
+    CERT: '认证成功',
+    SIGN: '已签约'
+  }
+}
+
+export const signAgreementMap: anyType = {
+  LUO_SHU_YUN: {
+    name: '共享经济个体合作协议',
+    path: '/pages-sub-packages/agreement/taxhelper'
+  },
+  FEI_YI: {
+    name: '共享经济综合服务协议',
+    path: '/pages-sub-packages/agreement/olading'
+  },
+  JIN_YUAN: {
+    name: '共享经济综合服务协议',
+    path: '/pages-sub-packages/agreement/jinyuan'
+  },
+  XIN_TAI_ZI: {
+    name: '共享经济综合服务协议',
+    path: '/pages-sub-packages/agreement/xintaizi'
+  },
+  ZHENG_QI_ZHI_XING: {
+    name: '灵活用工服务合作协议',
+    path: '/pages-sub-packages/agreement/zhengqizhixing'
+  },
+  HUI_QI_YUN: {
+    name: '灵活用工服务合作协议',
+    path: '/pages-sub-packages/agreement/huiqiyun'
+  }
+}

+ 289 - 0
src/pages-sub-mine/auth/hook/useAutnFn.ts

@@ -0,0 +1,289 @@
+// 认证所需函数
+
+import { ref } from 'vue'
+import { isValidPhoneNumber, isValidChineseIDNumber, isValidBankCard } from '@/utils/index'
+import { useLoginStore } from '@/store/login'
+
+// @ts-ignore
+import { startEid } from '../../../mp_ecard_sdk/main.js'
+
+import {
+  saveBaseInfoApi,
+  signCertApi,
+  signAgreementApi,
+  getETokenApi,
+  getETokenResultApi,
+  batchCertApi,
+  saveBankInfoApi
+} from '@/service/modules/auth'
+
+export default function useAuthFn(userInfo: any, radioValue: any, certList: any) {
+  const loginStore = useLoginStore()
+  // 校验信息
+  const checkInfo = () => {
+    if (!userInfo.realname) {
+      uni.showToast({
+        title: '请输入姓名',
+        icon: 'none'
+      })
+      return
+    }
+    if (!userInfo.idCardNumber) {
+      uni.showToast({
+        title: '请输入身份证号',
+        icon: 'none'
+      })
+      return
+    }
+    if (!isValidChineseIDNumber(userInfo.idCardNumber)) {
+      uni.showToast({
+        title: '请输入正确的身份证号',
+        icon: 'none'
+      })
+      return
+    }
+    if (!isValidBankCard(userInfo.bankCardNumber)) {
+      uni.showToast({
+        title: '请检查银行卡号',
+        icon: 'none'
+      })
+      return
+    }
+    if (!isValidPhoneNumber(userInfo.bankPhone)) {
+      uni.showToast({
+        title: '请检查银行绑定手机号',
+        icon: 'none'
+      })
+      return
+    }
+    if (!radioValue.value) {
+      uni.showToast({
+        title: '请选择认证渠道',
+        icon: 'none'
+      })
+      return
+    }
+    return true
+  }
+  // 保存信息
+  const saveBaseInfo = async () => {
+    const data = {
+      userId: loginStore.currentUserInfo.userId,
+      realname: userInfo.realname,
+      idCardNumber: userInfo.idCardNumber,
+      bankCardNumber: userInfo.bankCardNumber,
+      bankPhone: userInfo.bankPhone,
+      subjectLocation: radioValue.value
+    }
+    uni.showLoading({
+      title: '保存信息中',
+      mask: true
+    })
+    const res = await saveBaseInfoApi(data)
+    if (res.code === 0) {
+      loginStore.getUserInfoByCode()
+    }
+    uni.hideLoading()
+  }
+  // 签约/增员
+  const signCertFn = async () => {
+    uni.showLoading({
+      title: '信息校验中',
+      icon: 'loading',
+      mask: true
+    })
+    const data = {
+      userId: loginStore.currentUserInfo.userId,
+      subjectLocation: radioValue.value
+    }
+    const res = await signCertApi(data)
+    uni.hideLoading()
+    if (res.code === 0) {
+      // 如果返回状态为SIGNING 重新发起认证
+      if (res.data?.certStatus === 'SIGNING') {
+        signCertFn()
+      } else {
+        // 签署协议弹窗
+        signAgreementFn()
+      }
+    } else {
+      // 签约/增员失败 展示原因
+      setTimeout(() => {
+        uni.showToast({
+          title: res.msg || '失败,请重试',
+          icon: 'none'
+        })
+      }, 0)
+    }
+  }
+
+  const agereementModal = ref()
+  const agreemetChecked = ref(false)
+  // 签署协议弹窗
+  const signAgreementFn = () => {
+    if (certList.value) {
+      const curr = certList.value.find((item: any) => item.subjectLocation === radioValue.value)
+      // 存在agreementUrl直接去认证
+      if (curr?.agreementUrl) {
+        getETokenAndToVerify()
+        return
+      }
+      agereementModal.value.open()
+    }
+  }
+  const agreementUrl = ref('')
+  // 签署协议
+  const signAgreeSuccess = async () => {
+    uni.showLoading({
+      title: '提交信息中',
+      mask: true
+    })
+    const data = {
+      userId: loginStore.currentUserInfo.userId,
+      agreementUrl: agreementUrl.value,
+      subjectLocation: radioValue.value
+    }
+    const res = await signAgreementApi(data)
+    if (res.code === 0) {
+      // 签署成功
+      // 去走E证通
+      getETokenAndToVerify()
+    } else {
+      uni.showToast({
+        title: res.msg || '签署失败',
+        icon: 'none',
+        duration: 1500
+      })
+      uni.navigateBack()
+    }
+    uni.hideLoading()
+  }
+  // 跳转e证通认证
+  const getETokenAndToVerify = async () => {
+    // 判断是否已经认证过
+    if (loginStore.currentUserInfo.existEidResult) {
+      authCertFn()
+      return
+    }
+    const data = {
+      realName: userInfo.realname,
+      idCard: userInfo.idCardNumber
+    }
+
+    const res = await getETokenApi(data)
+    if (res.code === 0) {
+      const etoken = res.data
+      const param = {
+        data: {
+          token: etoken
+        },
+        verifyDoneCallback(res: any) {
+          console.log('收到核身完成的res', res)
+        }
+      }
+      etoken && startEid(param)
+    } else {
+      uni.showToast({
+        title: '状态获取失败,请重试',
+        icon: 'none'
+      })
+    }
+  }
+
+  // e证通返回
+  const authBackHandler = async (options: any) => {
+    if (options?.path !== 'mp_ecard_sdk/index/index') return
+    const { referrerInfo, scene } = options
+    if (scene === 1038 && referrerInfo?.appId === 'wx0e2cb0b052a91c92') {
+      const { extraData } = referrerInfo
+      if (!extraData) {
+        return uni.showToast({
+          title: '核身失败,请重试',
+          icon: 'none',
+          duration: 3000
+        })
+      }
+      const { token, verifyDone } = extraData
+      if (verifyDone) {
+        uni.showLoading({
+          title: '核身结果获取中',
+          mask: true
+        })
+        const res = await getETokenResultApi(token)
+        uni.hideLoading()
+        if (res.code === 0) {
+          // 核身成功
+          if (res.data.compareCode === 0) {
+            uni.showToast({
+              title: '核身成功',
+              icon: 'none'
+            })
+            // 认证
+            authCertFn()
+          } else {
+            uni.showToast({
+              title: '核身失败',
+              icon: 'none'
+            })
+          }
+        } else {
+          // 查询结果失败
+          uni.showToast({
+            title: res.msg || '未查询到结果',
+            icon: 'none'
+          })
+        }
+      }
+    }
+    console.log('options', options)
+  }
+
+  // 认证
+  const authCertFn = async () => {
+    const data = {
+      userId: loginStore.currentUserInfo.userId,
+      subjectLocation: radioValue.value,
+      token: loginStore.currentUserInfo.certToken
+    }
+    const res = await batchCertApi(data)
+    if (res.code === 0) {
+      saveBankInfo()
+    } else {
+      uni.showToast({
+        title: res.msg || '提交失败,请重试',
+        icon: 'none',
+        duration: 3000
+      })
+    }
+    loginStore.getUserInfoByCode()
+  }
+
+  // 绑定银行卡
+  const saveBankInfo = async () => {
+    const data = {
+      userId: loginStore.currentUserInfo.userId,
+      bankPhone: loginStore.currentUserInfo.bankPhone,
+      bankCardNumber: loginStore.currentUserInfo.bankCardNumber
+    }
+    const res = await saveBankInfoApi(data)
+    if (res.code === 0) {
+      uni.showToast({
+        title: '成功',
+        icon: 'none',
+        duration: 3000
+      })
+    }
+  }
+  return {
+    checkInfo,
+    saveBaseInfo,
+    signCertFn,
+    signAgreementFn,
+    authCertFn,
+    signAgreeSuccess,
+    authBackHandler,
+    agereementModal,
+    agreemetChecked,
+    agreementUrl
+  }
+}

+ 50 - 0
src/pages-sub-mine/auth/hook/useRadio.ts

@@ -0,0 +1,50 @@
+import { statusListMap, peddingListMap, subjectLocationStatusName } from '../constants/index'
+
+export default function useRadio(certList: any) {
+  const getRadio = (subjectLocationItem: string): boolean => {
+    // OTHER 直接返回
+    if (subjectLocationItem === 'OTHER') return false
+    const current = certList.value.find((item: any) => item.subjectLocation === subjectLocationItem)
+    if (!current) return true
+    const certStatus = current.certStatus
+    const callbackStatus = current.callbackStatus
+    // 渠道认证进行中, 不允许操作
+    if (callbackStatus === 'IN_PROGRESS') return false
+    // 显示checkbox的情况
+    const currentList = statusListMap[subjectLocationItem]
+    return currentList.includes(certStatus)
+  }
+
+  const IS_IN_PROGRESS = (subjectLocationItem: string): boolean => {
+    const current = certList.value.find((item: any) => item.subjectLocation === subjectLocationItem)
+    if (!current) return false
+    const callbackStatus = current.callbackStatus
+    // 渠道认证进行中, 不允许操作
+    return callbackStatus === 'IN_PROGRESS'
+  }
+
+  const getStatusText = (subjectLocationItem: string): boolean => {
+    const current = certList.value.find((item: any) => item.subjectLocation === subjectLocationItem)
+    if (!current) return false
+    const certStatus = current.certStatus
+    const callbackStatus = current.callbackStatus
+    // 渠道认证进行中, 不允许操作
+    if (callbackStatus === 'IN_PROGRESS') return false
+    const currentList = peddingListMap[subjectLocationItem]
+    return currentList.includes(certStatus)
+  }
+
+  const getStatusName = (subjectLocationItem: string): string => {
+    const current = certList.value.find((item: any) => item.subjectLocation === subjectLocationItem)
+    if (!current) return ''
+    const certStatus = current.certStatus
+    const currMap = subjectLocationStatusName[subjectLocationItem]
+    return currMap[certStatus]
+  }
+  return {
+    getRadio,
+    IS_IN_PROGRESS,
+    getStatusText,
+    getStatusName
+  }
+}

+ 390 - 0
src/pages-sub-mine/auth/index.vue

@@ -0,0 +1,390 @@
+<template>
+  <view class="auth">
+    <view class="card user-info">
+      <view class="title">个人信息</view>
+      <view class="info-list">
+        <view class="info-item">
+          <view>姓名</view>
+          <uv-input
+            :readonly="getDisabled"
+            border="none"
+            inputAlign="right"
+            v-model="userInfo.realname"
+            placeholder="请输入姓名"
+          />
+        </view>
+        <view class="info-item">
+          <view>手机号</view>
+          <uv-input
+            readonly
+            type="number"
+            border="none"
+            maxlength="11"
+            inputAlign="right"
+            v-model="userInfo.phone"
+            placeholder="请输入手机号"
+          />
+        </view>
+        <view class="info-item">
+          <view><span class="required">*</span>身份证号</view>
+          <uv-input
+            :readonly="getDisabled"
+            type="idcard"
+            border="none"
+            inputAlign="right"
+            v-model="userInfo.idCardNumber"
+            placeholder="请输入身份证号"
+          />
+        </view>
+        <view class="info-item">
+          <view><span class="required">*</span>银行卡号</view>
+          <uv-input
+            :readonly="getDisabled"
+            type="number"
+            border="none"
+            inputAlign="right"
+            v-model="userInfo.bankCardNumber"
+            placeholder="请输入银行卡号"
+          >
+            <template v-slot:suffix>
+              <uv-button
+                type="default"
+                :custom-style="customStyle"
+                plain
+                size="mini"
+                @click="bindCardFn"
+                >绑定银行卡</uv-button
+              ></template
+            >
+          </uv-input>
+        </view>
+        <view class="info-item last-item">
+          <view><span class="required">*</span>银行预留手机号</view>
+          <uv-input
+            type="number"
+            border="none"
+            inputAlign="right"
+            v-model="userInfo.bankPhone"
+            placeholder="请输入银行预留手机号"
+          />
+        </view>
+      </view>
+    </view>
+    <view class="card auth-box">
+      <view class="header">
+        <view class="title">认证渠道</view>
+        <view class="btn">
+          <uv-button type="default" :custom-style="customStyle" plain size="mini"
+            >协议补签</uv-button
+          >
+        </view>
+      </view>
+      <view class="cert-list">
+        <radio-group @change="radioChange">
+          <view
+            class="list"
+            v-for="item in loginStore.currentUserInfo.subjectLocationList"
+            :key="item"
+          >
+            <label>{{ item && subjectLocationName[item] }}</label>
+            <template v-if="getRadio(item)"> <radio :value="item" color="#6eb657" /></template>
+            <template v-if="IS_IN_PROGRESS(item)">
+              <view>已核身</view>
+            </template>
+            <template v-if="getStatusText(item)">
+              <view>{{ getStatusName(item) }}</view>
+            </template>
+          </view>
+        </radio-group>
+      </view>
+      <!-- 提交按钮 -->
+      <view v-if="showSubmitBtn" class="submit">
+        <button class="btn" @click="submitBtn">提 交</button>
+      </view>
+    </view>
+
+    <!-- 协议展示弹窗 -->
+    <uv-modal ref="agereementModal" title="业务合作协议" showCancelButton>
+      <view class="agereement-content">
+        <view class="agreement-policy">
+          为开通共享经济业务,请阅读、勾选签署以下平台业务合作协议。点击勾选协议,即表示您已阅读并同意接受该协议内容。若不同意,请勿勾选。
+        </view>
+
+        <view class="checkbox-bar">
+          <checkbox-group @change="agreemetChecked = !agreemetChecked">
+            <checkbox :checked="agreemetChecked" style="transform: scale(0.6)" color="#6eb657" />
+          </checkbox-group>
+          <view class="read-content"
+            >已阅读并同意<text class="primarily-text" @click="agreementFn"
+              >《 {{ signAgreementMap[radioValue] && signAgreementMap[radioValue].name }}》</text
+            ></view
+          >
+        </view>
+      </view>
+      <template v-slot:confirmButton>
+        <view class="agereement-btns">
+          <button class="agereement-btn cancel" @click="agereementCancel">取消</button>
+          <button class="agereement-btn confirm" @click="agereementConfirm">确定</button>
+        </view>
+      </template>
+    </uv-modal>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onShow, onLoad, onUnload } from '@dcloudio/uni-app'
+import { ref, reactive, computed } from 'vue'
+import { useLoginStore } from '@/store/login'
+import { useAuth } from '@/store/auth'
+import { subjectLocationName, signAgreementMap, notCertMap } from './constants/index'
+
+import useRadio from './hook/useRadio'
+import useAuthFn from './hook/useAutnFn'
+
+onLoad(() => {
+  uni.onAppShow(authBackHandler)
+})
+onUnload(() => {
+  uni.offAppShow(authBackHandler)
+})
+
+// pinia数据
+const loginStore = useLoginStore()
+const authStore = useAuth()
+
+const currentUserInfo = ref()
+// 提交信息的用户表单
+const userInfo = reactive({
+  realname: loginStore.currentUserInfo?.realname,
+  phone: loginStore.currentUserInfo?.phone,
+  idCardNumber: loginStore.currentUserInfo?.idCardNumber,
+  bankCardNumber: loginStore.currentUserInfo?.bankCardNumber,
+  bankPhone: loginStore.currentUserInfo?.bankPhone
+})
+
+onShow(async () => {
+  await loginStore.getUserInfoByCode()
+  currentUserInfo.value = loginStore.currentUserInfo
+  userInfo.bankCardNumber = loginStore.currentUserInfo?.bankCardNumber
+  userInfo.bankPhone = loginStore.currentUserInfo?.bankPhone
+
+  // agreementUrl有值 是从签名页面返回
+  if (authStore.agreementUrl) {
+    agreementUrl.value = authStore.agreementUrl
+    // 协议签署成功
+    signAgreeSuccess()
+    // 清空签署的协议
+    authStore.setAgreementUrl('')
+  }
+})
+
+// 当前用户的certList数据
+const certList = computed(() => loginStore.currentUserInfo.certList)
+
+// 获取单选框状态
+const { getRadio, IS_IN_PROGRESS, getStatusText, getStatusName } = useRadio(certList)
+const getDisabled = computed(() => {
+  if (!certList?.value?.length) return false
+  let flag = certList.value.every((item: any) => {
+    let currMap = notCertMap[item.subjectLocation]
+    return currMap.includes(item.certStatus)
+  })
+  return !flag
+})
+
+// 是否展示提交按钮
+const showSubmitBtn = computed(() => {
+  const subjectLocationList = loginStore.currentUserInfo.subjectLocationList
+  // 显示radio的情况  存在radio, 即可提交
+  const isRadio = subjectLocationList?.map((item: string) => getRadio(item))
+  return isRadio
+})
+
+const customStyle = {
+  border: '2rpx solid #000',
+  height: '50rpx',
+  background: '#f8f8f8',
+  borderRadius: '10rpx'
+}
+
+// 选中的认证渠道
+const radioValue = ref()
+const radioChange = (e: any) => {
+  radioValue.value = e.detail.value
+}
+// 去绑卡
+const bindCardFn = () => {
+  uni.navigateTo({
+    url: '/pages-sub-mine/bind-card/index'
+  })
+}
+
+// 认证函数
+const {
+  checkInfo,
+  saveBaseInfo,
+  authCertFn,
+  signCertFn,
+  authBackHandler,
+  signAgreeSuccess,
+  agereementModal,
+  agreemetChecked,
+  agreementUrl
+} = useAuthFn(userInfo, radioValue, certList)
+
+const submitBtn = async () => {
+  // 校验信息
+  if (!checkInfo()) return
+  // 保存基本信息
+  await saveBaseInfo()
+  // 发起签约 人力家不需要签约
+  if (radioValue.value === 'REN_LI_JIA') {
+    authCertFn()
+  } else {
+    // 增员
+    signCertFn()
+  }
+}
+
+const agreementFn = () => {
+  uni.navigateTo({
+    url: signAgreementMap[radioValue.value].path
+  })
+}
+
+// 协议确定
+const agereementConfirm = () => {
+  if (!agreemetChecked.value) {
+    return uni.showToast({
+      title: '请先勾选相关协议',
+      icon: 'none'
+    })
+  }
+  uni.navigateTo({
+    url: `/pages-sub-task/signature/index`
+  })
+  agereementCancel()
+}
+
+// 协议弹窗关闭
+const agereementCancel = () => {
+  agereementModal.value.close()
+  agreemetChecked.value = false
+}
+</script>
+
+<style lang="scss" scoped>
+.auth {
+  height: 100vh;
+  background: #f4f4f4;
+  .card {
+    background: #ffffff;
+    padding: 20rpx 30rpx;
+  }
+  .user-info {
+    .title {
+      font-size: 30rpx;
+      font-weight: bolder;
+      color: #000;
+    }
+    .info-list {
+      margin-top: 20rpx;
+      .info-item {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20rpx 0;
+        border-bottom: 1rpx solid #d8d8d8;
+        font-size: 28rpx;
+        line-height: 34rpx;
+        .required {
+          color: red;
+        }
+      }
+      .last-item {
+        border-bottom: none;
+      }
+    }
+  }
+  .auth-box {
+    margin-top: 30rpx;
+    min-height: 350rpx;
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 10rpx 0;
+      line-height: 90rpx;
+      .title {
+        color: #000;
+        font-size: 30rpx;
+        font-weight: bolder;
+      }
+    }
+    .cert-list {
+      margin-top: 20rpx;
+      .list {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        border-bottom: 2rpx solid #ccc;
+        height: 80rpx;
+        line-height: 80rpx;
+      }
+    }
+  }
+  .submit {
+    background: #ffffff;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    z-index: 10000;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 120rpx;
+
+    .btn {
+      background-color: #6eb657;
+      width: 690rpx;
+      color: #fff;
+    }
+  }
+}
+.agereement-content {
+  .agreement-policy {
+    font-size: 30rpx;
+    line-height: 46rpx;
+  }
+  .checkbox-bar {
+    margin-top: 20rpx;
+    display: flex;
+    align-items: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    line-height: 40rpx;
+    .read-content {
+      .primarily-text {
+        color: #6eb657;
+      }
+    }
+  }
+}
+.agereement-btns {
+  display: flex;
+  justify-content: space-between;
+
+  .agereement-btn {
+    border: none;
+    background: none;
+    font-size: 32rpx;
+  }
+  .cancel {
+    color: #666;
+  }
+  .confirm {
+    color: #6eb657;
+  }
+}
+</style>

+ 97 - 0
src/pages-sub-mine/bind-card/index.vue

@@ -0,0 +1,97 @@
+<template>
+  <view class="bind-card">
+    <uv-form labelPosition="left" :model="cardInfo" ref="form">
+      <uv-form-item
+        label="手机号"
+        prop="userInfo.name"
+        borderBottom
+        labelWidth="90"
+        :customStyle="customStyle"
+      >
+        <uv-input
+          maxlength="11"
+          type="number"
+          v-model="cardInfo.bankPhone"
+          border="none"
+          clearable
+        />
+      </uv-form-item>
+      <uv-form-item
+        label="银行卡号"
+        prop="userInfo.name"
+        borderBottom
+        labelWidth="90"
+        :customStyle="customStyle"
+      >
+        <uv-input type="number" v-model="cardInfo.bankCardNumber" border="none" clearable />
+      </uv-form-item>
+    </uv-form>
+    <view class="tips">提示:需绑定本人Ⅰ类银行账户的借记卡,否则无法发放佣金。</view>
+    <button class="btn" @click="submitFn">确定</button>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { useLoginStore } from '@/store/login'
+import { reactive } from 'vue'
+import { isValidPhoneNumber, isValidBankCard } from '@/utils'
+import { saveBankInfoApi } from '@/service/modules/auth'
+
+const loginStore = useLoginStore()
+
+const customStyle = {
+  height: '120rpx'
+}
+
+const cardInfo = reactive({
+  bankPhone: loginStore.currentUserInfo.bankPhone,
+  bankCardNumber: loginStore.currentUserInfo.bankCardNumber
+})
+
+const submitFn = async () => {
+  if (!isValidPhoneNumber(cardInfo.bankPhone)) {
+    return uni.showToast({
+      icon: 'none',
+      title: '请检查手机号'
+    })
+  }
+  if (!isValidBankCard(cardInfo.bankCardNumber)) {
+    return uni.showToast({
+      icon: 'none',
+      title: '请检查银行卡号'
+    })
+  }
+  const data = {
+    userId: loginStore.currentUserInfo.userId,
+    bankPhone: cardInfo.bankPhone,
+    bankCardNumber: cardInfo.bankCardNumber
+  }
+  const res = await saveBankInfoApi(data)
+  if (res.code === 0) {
+    uni.showToast({
+      icon: 'none',
+      title: '保存成功'
+    })
+  }
+  await loginStore.getUserInfoByCode()
+  uni.navigateBack()
+}
+</script>
+
+<style lang="scss" scoped>
+.bind-card {
+  padding: 30rpx;
+  .tips {
+    margin-top: 40rpx;
+    color: #888;
+    font-size: 24rpx;
+    text-align: center;
+  }
+  .btn {
+    margin-top: 150rpx;
+    background-color: #6eb657;
+    border-radius: 50rpx;
+    color: #fff;
+  }
+}
+</style>

+ 92 - 0
src/pages-sub-mine/changePassword/index.vue

@@ -0,0 +1,92 @@
+<template>
+  <view class="form">
+    <uv-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="120">
+      <uv-form-item label="新密码" prop="p1" borderBottom>
+        <uv-input v-model="form.p1" type="password" border="none" clearable />
+      </uv-form-item>
+      <uv-form-item label="确认密码" prop="p2" borderBottom>
+        <uv-input v-model="form.p2" type="password" clearable border="none" />
+      </uv-form-item>
+      <uv-form-item>
+        <view>密码由8~16位含有大小写字母、数字、!#$%^&*@符号且不能有三位连续的数字组成</view>
+      </uv-form-item>
+      <uv-button
+        text="提交"
+        color="#6eb657"
+        customStyle="margin-top: 10px"
+        @click="submit"
+      ></uv-button>
+    </uv-form>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { renewPwdApi } from '@/service/modules/mine'
+import { reactive, ref } from 'vue'
+
+import useLogiutFn from '@/hooks/useLoginout'
+
+const form = reactive({
+  p1: '',
+  p2: '',
+  code: '123456'
+})
+let validatePassword = (rule: any, value: any, callback: any) => {
+  var regA = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!#$%^&*@])[\da-zA-Z!#$%^&*@]{8,16}$/ //密码必须是8位以上、必须含有字母、数字、特殊符号
+  var regB = /(123|234|345|456|567|678|789|012)/ //不能有3个连续数字
+  if (!value) {
+    callback(new Error('密码不能为空'))
+  }
+  if (!regA.test(value)) {
+    callback(new Error('密码必须是8~16位、必须含有大小写字母、数字、特殊符号'))
+  } else if (regB.test(value)) {
+    callback(new Error('不能有3个连续数字'))
+  } else {
+    callback()
+  }
+}
+var validateCheckPass = (rule: any, value: any, callback: any) => {
+  if (value !== form.p1) {
+    callback(new Error('两次输入密码不一致'))
+  } else {
+    callback()
+  }
+}
+const rules = reactive({
+  p1: {
+    type: 'string',
+    required: true,
+    trigger: ['blur'],
+    validator: validatePassword
+  },
+  p2: {
+    type: 'string',
+    required: true,
+    validator: validateCheckPass,
+    trigger: ['blur']
+  }
+})
+
+const formRef = ref()
+
+const submit = () => {
+  formRef.value.validate().then(async () => {
+    const res = await renewPwdApi(form)
+    if (res.code === 0) {
+      uni.showToast({
+        icon: 'none',
+        title: '修改成功,请重新登录'
+      })
+      setTimeout(async () => {
+        useLogiutFn()
+      }, 1000)
+    }
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.form {
+  padding: 30rpx;
+}
+</style>

+ 101 - 0
src/pages-sub-mine/feedback/index.vue

@@ -0,0 +1,101 @@
+<template>
+  <view class="feedback">
+    <view class="feedback-box">
+      <view class="title"> 意见反馈: </view>
+      <textarea
+        @input="onInput"
+        v-model="params.ygContent"
+        class="textarea"
+        :maxlength="500"
+        placeholder-style="color:#C8C8C8"
+        placeholder="您的建议是我们最大的动力"
+      />
+      <view class="count">{{ sumCount }}/500</view>
+    </view>
+    <view class="submit">
+      <view class="s-btn" @click="onSubmit">提 交</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive } from 'vue'
+import { useLoginStore } from '@/store/login'
+import { feedbackApi } from '@/service/modules/mine'
+
+const loginStore = useLoginStore()
+
+const params = reactive({
+  ygContent: '',
+  yjUserid: loginStore.currentUserInfo.userId
+})
+
+const sumCount = ref(0)
+function onInput(e: any) {
+  sumCount.value = e.detail.cursor
+}
+
+const onSubmit = async () => {
+  if (!params.ygContent) {
+    return uni.showToast({
+      title: '请输入意见反馈内容',
+      icon: 'none',
+      duration: 800
+    })
+  }
+  uni.showLoading()
+  const res = await feedbackApi(params)
+  uni.hideLoading()
+  if (res.data) {
+    uni.showToast({
+      title: '提交成功',
+      icon: 'none'
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.feedback {
+  background: #f4f4f4;
+  min-height: 100vh;
+  .feedback-box {
+    padding: 44rpx 54rpx;
+    background: #ffffff;
+    .title {
+      font-size: 30rpx;
+    }
+    .textarea {
+      margin-top: 20rpx;
+      height: 600rpx;
+      width: calc(100%);
+    }
+    .count {
+      width: 100%;
+      text-align: right;
+      color: #dddddd;
+    }
+  }
+  .submit {
+    padding: 16rpx 26rpx;
+    background: #ffffff;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    .s-btn {
+      width: 100%;
+      height: 88rpx;
+      text-align: center;
+      line-height: 88rpx;
+      background: #6eb657;
+      border-radius: 10rpx;
+      color: #ffffff;
+      font-size: 30rpx;
+    }
+  }
+}
+</style>

+ 306 - 0
src/pages-sub-mine/forgotPassword/index.vue

@@ -0,0 +1,306 @@
+<template>
+  <view class="login">
+    <view class="login-form">
+      <uv-form
+        labelPosition="top"
+        labelWidth="80"
+        :labelStyle="labelStyle"
+        :model="formData"
+        ref="formRef"
+        :rules="rules"
+      >
+        <uv-form-item label="手机号" prop="userName" borderBottom>
+          <view class="pbone-input">
+            <input
+              class="login-input"
+              clearable
+              maxlength="11"
+              v-model="formData.userName"
+              border="none"
+              type="number"
+              placeholder="请输入手机号"
+            />
+          </view>
+        </uv-form-item>
+        <uv-form-item label="验证码" prop="code" borderBottom>
+          <view class="pbone-input">
+            <input
+              class="login-input"
+              clearable
+              v-model="formData.code"
+              border="none"
+              type="number"
+              placeholder="请输入验证码"
+            />
+            <view class="code">
+              <uv-code
+                ref="codeRef"
+                @change="codeChange"
+                @start="codeDisabledChange(true)"
+                @end="codeDisabledChange(false)"
+                changeText="Xs"
+              ></uv-code>
+              <uv-button
+                @click="getCode"
+                :disabled="codeDisabled || !codeDisabledType"
+                :text="code"
+                :custom-style="customStyle"
+              />
+            </view>
+          </view>
+        </uv-form-item>
+        <uv-form-item label="密码" prop="p1" borderBottom>
+          <view class="pbone-input">
+            <input
+              class="login-input"
+              clearable
+              v-model="formData.p1"
+              border="none"
+              type="password"
+              placeholder="请输入密码"
+            />
+          </view>
+        </uv-form-item>
+        <uv-form-item label="确认密码" prop="p2" borderBottom>
+          <view class="pbone-input">
+            <input
+              class="login-input"
+              clearable
+              v-model="formData.p2"
+              border="none"
+              type="password"
+              placeholder="请输入密码"
+            />
+          </view>
+        </uv-form-item>
+      </uv-form>
+      <view class="tips">
+        <text
+          >密码由8~16位含有大小写字母、数字、!#$%^&*@符号且不能有三位连续的数字组成(如123)</text
+        >
+      </view>
+
+      <view class="login-btn">
+        <button class="btn" @click="submit">提交</button>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref, computed } from 'vue'
+import { getMobileUpdApi, postUserUpdApi } from '@/service/modules/login'
+import { isValidPhoneNumber } from '@/utils'
+
+const labelStyle = {
+  fontSize: '32rpx',
+  fontWeight: 600,
+  color: '#333'
+}
+let validatePassword = (rule: any, value: any, callback: any) => {
+  var regA = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!#$%^&*@])[\da-zA-Z!#$%^&*@]{8,16}$/ //密码必须是8位以上、必须含有字母、数字、特殊符号
+  var regB = /(123|234|345|456|567|678|789|012)/ //不能有3个连续数字
+  if (!value) {
+    callback(new Error('密码不能为空'))
+  }
+  if (!regA.test(value)) {
+    callback(new Error('密码必须是8~16位、必须含有大小写字母、数字、特殊符号'))
+  } else if (regB.test(value)) {
+    callback(new Error('不能有3个连续数字'))
+  } else {
+    callback()
+  }
+}
+var validateCheckPass = (rule: any, value: any, callback: any) => {
+  if (value !== formData.p1) {
+    callback(new Error('两次输入密码不一致'))
+  } else {
+    callback()
+  }
+}
+
+const rules = reactive({
+  userName: {
+    type: 'string',
+    required: true,
+    trigger: ['blur']
+  },
+  code: {
+    type: 'string',
+    required: true,
+    trigger: ['blur']
+  },
+
+  p1: {
+    type: 'string',
+    required: true,
+    trigger: ['blur'],
+    validator: validatePassword
+  },
+  p2: {
+    type: 'string',
+    required: true,
+    validator: validateCheckPass,
+    trigger: ['blur']
+  }
+})
+
+const formRef = ref()
+const formData = reactive({
+  userName: '',
+  p1: '',
+  p2: '',
+  code: ''
+})
+
+// 验证码
+const code = ref('获取验证码')
+const codeRef = ref()
+const codeDisabled = ref(false)
+function codeChange(text: string) {
+  code.value = text
+}
+const codeDisabledChange = (flag: boolean) => {
+  codeDisabled.value = flag
+}
+
+let codeDisabledType = computed(() => {
+  return formData.userName && !codeDisabled.value
+})
+// 获取验证码按钮样式
+const customStyle = {
+  height: '64rpx',
+  width: '200rpx',
+  background: 'rgba(110,182,87, .1)',
+  borderRadius: '16rpx',
+  color: '#6eb657',
+  fontWeight: 500,
+  lineHeight: '64rpx',
+  fontSize: '28rpx'
+}
+async function getCode() {
+  if (!isValidPhoneNumber(formData.userName)) {
+    return uni.showToast({
+      title: '请检查手机号码格式',
+      icon: 'none'
+    })
+  }
+
+  // 获取验证码
+  uni.showLoading({
+    title: '正在获取验证码'
+  })
+  const res = await getMobileUpdApi(formData.userName)
+  uni.hideLoading()
+  if (!res.data) {
+    uni.showToast({
+      title: res.msg,
+      icon: 'none'
+    })
+  } else {
+    uni.showToast({
+      title: res.msg,
+      icon: 'none'
+    })
+  }
+  codeRef.value.start()
+}
+
+const submit = () => {
+  if (!isValidPhoneNumber(formData.userName)) {
+    return uni.showToast({
+      title: '请检查手机号码格式',
+      icon: 'none'
+    })
+  }
+
+  formRef.value.validate().then(async () => {
+    const res = await postUserUpdApi(formData)
+
+    if (res.code === 0) {
+      uni.showToast({
+        icon: 'none',
+        title: '修改成功'
+      })
+      setTimeout(() => {
+        uni.reLaunch({
+          url: '/pages/login/index'
+        })
+      }, 1000)
+    }
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.login {
+  padding: 0 50rpx;
+}
+.login-bg {
+  position: absolute;
+  z-index: -333;
+  top: 0;
+  left: 0;
+  right: 0;
+  height: 800rpx;
+  background: linear-gradient(#f8f8f0 0%, rgba(255, 255, 255, 0) 100%);
+}
+.login-title {
+  margin-top: 300rpx;
+  color: #333;
+  font-size: 56rpx;
+  font-weight: 500;
+}
+.login-form {
+  margin-top: 80rpx;
+  .pbone-input {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+  .forgot-password {
+    color: #999;
+  }
+  .login-input {
+    margin: 20rpx 0 0 10rpx;
+  }
+  :deep(.uv-form-item) {
+    margin-bottom: 40rpx;
+  }
+  .agreement {
+    display: flex;
+    font-size: 26rpx;
+    font-weight: 400;
+    line-height: 40rpx;
+    .read-content {
+      .primarily-text {
+        color: #6eb657;
+      }
+    }
+  }
+  .login-btn {
+    margin-top: 70rpx;
+    .btn {
+      width: 640rpx;
+      height: 96rpx;
+      border-radius: 200rpx;
+      background-color: #6eb657;
+      text-align: center;
+      color: #fff;
+      font-size: 40rpx;
+      font-weight: 600;
+    }
+  }
+  .login-password {
+    margin-top: 50rpx;
+    color: #999;
+    font-size: 32rpx;
+    text-align: center;
+    font-weight: 400;
+    line-height: 60rpx;
+  }
+}
+.tips {
+  color: #666;
+}
+</style>

+ 220 - 0
src/pages-sub-mine/integral-rules/index.vue

@@ -0,0 +1,220 @@
+<template>
+  <view class="integral-rules">
+    <image class="rules-top-img" :src="imgBg" />
+    <view class="table-box">
+      <view class="table-header">
+        <view class="table-tab" style="border-right: 1rpx solid #ffffff">获取途径</view>
+        <view class="table-tab">获得积分</view>
+      </view>
+      <image
+        class="change-btn"
+        src="../../static/images/common/change-btn.png"
+        @click="changeBtn"
+      />
+      <view class="table-con">
+        <view class="table-bg">
+          <view v-for="item in tableData" :key="item.id" class="table-item">
+            <view class="item-left">
+              <text>{{ item.taskTypeName }} </text>
+              <image
+                src="https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/tips.png"
+                alt=""
+                class="tips"
+                @click="descClick(item.taskTypeName)"
+              />
+            </view>
+            <text>+{{ item.score }}积分</text>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <uv-popup ref="popup" mode="bottom" round="10">
+      <view class="info">
+        <view class="title">
+          <text>{{ select?.value }}</text>
+          <u-icon name="close" color="#000" size="28" @click="popupClose"></u-icon>
+        </view>
+        <view class="cont">
+          {{ select?.description }}
+        </view>
+        <view class="btn" @click="popupClose"> 知道了 </view>
+      </view>
+    </uv-popup>
+
+    <uv-picker
+      ref="picker"
+      :columns="[drugentList]"
+      keyName="label"
+      :defaultIndex="defaultIndex"
+      @confirm="confirm"
+    />
+  </view>
+</template>
+
+<script setup lang="ts">
+import { integralRulesApi, getTaskTypeDeptList } from '@/service/modules/integralRules'
+import { onShareAppMessage } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+
+const imgBg = 'https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/jy/integralRules.png'
+onShareAppMessage(() => {
+  var pages = getCurrentPages()
+  var prevPage = pages[pages.length - 1]
+  return {
+    title: '积分规则',
+    path: prevPage.route
+  }
+})
+
+// 获取任务规则描述
+const descriptionMap = ref<any[]>([])
+async function getMap() {
+  let res = await integralRulesApi.getDict()
+  descriptionMap.value = res.data
+}
+getMap()
+const drugentList = ref<any[]>([])
+// 获取药企列表
+async function getDrugentList() {
+  let res = await getTaskTypeDeptList()
+  drugentList.value = res.data
+
+  if (drugentList.value.length) {
+    getTaskTypeScoreList(drugentList.value[0].value)
+  }
+}
+getDrugentList()
+
+const tableData = ref<any[]>([])
+async function getTaskTypeScoreList(ruleId: string | number) {
+  let res = await integralRulesApi.getTaskTypeListByRuleId(ruleId)
+  tableData.value = res.data
+}
+
+const select = ref()
+const popup = ref()
+const descClick = (name: any) => {
+  let item = descriptionMap.value.find((item) => item.value === name)
+  select.value = item
+  popup.value.open()
+}
+const popupClose = () => popup.value.close()
+
+const defaultIndex = ref()
+const picker = ref()
+const changeBtn = () => {
+  picker.value.open()
+}
+const confirm = (e: any) => {
+  defaultIndex.value = e.indexs
+  getTaskTypeScoreList(e.value[0].value)
+}
+</script>
+
+<style lang="scss" scoped>
+.integral-rules {
+  position: relative;
+  left: 0;
+  right: 0;
+  top: 0;
+  .change-btn {
+    position: fixed;
+    top: 156rpx;
+    right: -16rpx;
+    width: 212rpx;
+    height: 96rpx;
+  }
+  .rules-top-img {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    width: 750rpx;
+    height: 526rpx;
+  }
+  .table-box {
+    position: absolute;
+    top: 526rpx;
+    right: 0;
+    left: 0;
+    min-height: 100vh;
+    background: #019cd0;
+    .table-header {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      height: 120rpx;
+      .table-tab {
+        width: 50%;
+        text-align: center;
+        color: #ffffff;
+        font-size: 36rpx;
+      }
+    }
+    .table-con {
+      padding: 0 26rpx;
+      padding-bottom: 50rpx;
+      .table-bg {
+        background: #ffffff;
+        padding: 46rpx;
+        box-shadow: inset 0px 8rpx 54rpx 0px #6edbff;
+        .table-item {
+          color: #733d7f;
+          font-size: 32rpx;
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          margin-top: 42rpx;
+          .item-left {
+            display: flex;
+            align-items: center;
+            .tips {
+              width: 30rpx;
+              height: 30rpx;
+              margin-left: 10rpx;
+            }
+          }
+          &:first-child {
+            margin-top: 0;
+          }
+        }
+      }
+    }
+  }
+}
+
+.info {
+  padding: 30rpx;
+  position: relative;
+  .title {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 60rpx;
+    text {
+      color: #000;
+      font-weight: 600;
+      font-size: 36rpx;
+    }
+  }
+  .cont {
+    min-height: 20vh;
+    color: #666666;
+    font-size: 30rpx;
+    line-height: 42rpx;
+    margin-bottom: 60rpx;
+  }
+  .btn {
+    background-color: #f1f1f1;
+    height: 80rpx;
+    text-align: center;
+    line-height: 80rpx;
+    color: #333333;
+    font-size: 30rpx;
+    position: absolute;
+    width: 700rpx;
+    left: 25rpx;
+    bottom: 50rpx;
+  }
+}
+</style>

+ 84 - 0
src/pages-sub-mine/quiz/index.vue

@@ -0,0 +1,84 @@
+<!--
+ * @desc 我的-合规测评
+ * @author linyuanjie
+ * @date 2023/10/19
+-->
+
+<template>
+  <view class="quiz-page">
+    <view
+      v-for="(quizItem, index) in testResults"
+      :key="index"
+      class="quiz-item"
+      @click="detailFn(quizItem)"
+    >
+      <view class="quiz-list">
+        <view class="title">
+          <text>{{ quizItem.quiz.title }}</text>
+          <text v-if="quizItem.valid" class="success">(已通过)</text>
+          <text v-else class="danger">(未通过)</text>
+        </view>
+        <view class="content">
+          总分:<text class="mr40">{{ quizItem?.quiz?.expand?.totalMark }}</text
+          >测试分数:<text>{{ quizItem.finalMark || '无' }}</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+<script setup lang="ts">
+import { getQuizPltTextResultApi } from '@/service/modules/quiz'
+import { onLoad } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+
+const detailFn = (row: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-mine/quizDetail/index?id=${row.quiz.quizId}`
+  })
+}
+onLoad(() => {
+  getPltQuizResultFn()
+})
+
+const testResults = ref<any[]>([])
+const getPltQuizResultFn = async () => {
+  const res = await getQuizPltTextResultApi()
+  if (res.code === 0) {
+    testResults.value = res.data.testResults || []
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.quiz-page {
+  padding: 24rpx;
+  min-height: 100vh;
+  background-color: #f6f6f6;
+  .quiz-item {
+    padding: 30rpx;
+    background-color: #fff;
+    margin-bottom: 30rpx;
+    border-radius: 12rpx;
+    box-shadow: 0px 4rpx 4rpx 0px rgba(0, 0, 0, 0.05);
+
+    .quiz-list {
+      .title {
+        font-size: 36rpx;
+        color: #333;
+        .success {
+          font-size: 32rpx;
+          color: #6eb657;
+        }
+        .danger {
+          font-size: 32rpx;
+          color: #edb252;
+        }
+      }
+      .content {
+        margin-top: 20rpx;
+        font-size: 32rpx;
+      }
+    }
+  }
+}
+</style>

+ 184 - 0
src/pages-sub-mine/quizDetail/index.vue

@@ -0,0 +1,184 @@
+<template>
+  <view class="quiz-detail">
+    <view class="quiz-title">
+      {{ quiz?.title }}
+    </view>
+    <view class="quiz-list">
+      <view class="question-item" v-for="(item, index) in quizItems" :key="item.itemId">
+        <view class="question-title">{{ index + 1 }}.{{ item.label }}</view>
+        <uv-radio-group v-model="item.answered" placement="column" :disabled="submitted">
+          <uv-radio
+            class="question-radio"
+            :customStyle="{ margin: '8px' }"
+            v-for="(iten, indey) in item.options"
+            :key="indey"
+            :label="iten.text"
+            :name="iten.no"
+          >
+            <template v-if="iten?.type === 'text'">
+              {{ iten.text }}
+            </template>
+            <template v-if="iten?.type === 'img'">
+              <uv-image
+                :src="getImgUrl(iten?.text)"
+                width="210rpx"
+                height="180rpx"
+                @click.stop.self="preImg(iten?.text)"
+              />
+            </template>
+          </uv-radio>
+        </uv-radio-group>
+      </view>
+    </view>
+    <view class="sign-up-btn">
+      <template v-if="!submitted">
+        <button class="btn" @click="submitFn">提 交</button>
+      </template>
+      <template v-else>
+        <div class="result">
+          {{ quiz?.expand?.finalMark >= quiz?.expand?.passingMark ? '考试通过' : '考试不通过' }}
+          <text>考试成绩: {{ quiz?.expand?.finalMark }}</text>
+        </div>
+      </template>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad } from '@dcloudio/uni-app'
+import { quizDetailApi, quizResultCreateApi } from '@/service/modules/quiz'
+import { ref } from 'vue'
+
+const id = ref('')
+onLoad((e: any) => {
+  if (e?.id) {
+    id.value = e.id
+    getDetail()
+  }
+})
+
+const quizItems = ref<any[]>([])
+const quiz = ref()
+const submitted = ref(false)
+
+const getDetail = async () => {
+  const res = await quizDetailApi({ quizId: id.value })
+  if (res.code === 0) {
+    if (!res.data.submitted) {
+      res.data.items.forEach((item: any) => (item.answered = ''))
+    }
+    // 是否已经提交
+    submitted.value = res.data.submitted
+    quizItems.value = res.data.items
+    quiz.value = res.data.quiz
+  }
+}
+
+const getImgUrl = (path: string) => import.meta.env.VITE_APP_URL + path
+
+const preImg = (path: string) => {
+  const url = getImgUrl(path)
+  const arr = [url]
+  uni.previewImage({
+    urls: arr
+  })
+}
+
+const submitFn = async () => {
+  const flag = quizItems.value?.every((item: any) => item.answered)
+  if (!flag) {
+    return uni.showToast({
+      title: '请检查是否遗漏',
+      icon: 'none',
+      duration: 800
+    })
+  }
+
+  let finalMark = quizItems.value.reduce((accumulator, item) => {
+    if (item.answer === item.answered) {
+      return accumulator + item.mark
+    }
+    return accumulator + 0
+  }, 0)
+
+  const obj = {
+    quizId: quiz.value.quizId,
+    title: quiz.value.title,
+    itemQty: quiz.value.expand.itemQty,
+    totalMark: quiz.value.expand.totalMark,
+    passingMark: quiz.value.expand.passingMark,
+    finalMark: finalMark,
+    items: quizItems.value
+  }
+  const res = await quizResultCreateApi({ quizResults: [obj] })
+  if (res.code === 0) {
+    uni.showToast({
+      title: '提交成功',
+      icon: 'none',
+      duration: 800
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+    // getDetail()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.quiz-detail {
+  .quiz-title {
+    text-align: center;
+    margin: 20rpx auto;
+    font-weight: 600;
+    font-size: 36rpx;
+  }
+  .quiz-list {
+    margin-top: 30rpx;
+    padding-bottom: 120rpx;
+
+    .question-item {
+      .question-title {
+        font-weight: 36rpx;
+        margin-bottom: 20rpx;
+      }
+      padding: 40rpx 24rpx;
+      background-color: #fff;
+      border-bottom: 1px solid #f6f6f6;
+    }
+  }
+  .sign-up-btn {
+    position: fixed;
+    background-color: #fff;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 120rpx;
+    .btn {
+      width: 690rpx;
+      margin: 20rpx 30rpx;
+      height: 70rpx;
+      text-align: center;
+      line-height: 70rpx;
+      font-size: 30rpx;
+      color: #fff;
+      background-color: #6eb657;
+      border-radius: 20rpx;
+    }
+    .result {
+      width: 690rpx;
+      margin: 20rpx 30rpx;
+      height: 70rpx;
+      text-align: center;
+      line-height: 70rpx;
+      font-size: 30rpx;
+      color: #fff;
+      background-color: #ccc;
+      border-radius: 20rpx;
+    }
+    .disabled {
+      background-color: #ccc;
+    }
+  }
+}
+</style>

+ 285 - 0
src/pages-sub-mine/task-completion-records/index.vue

@@ -0,0 +1,285 @@
+<template>
+  <view class="task-completion-records">
+    <view class="header">
+      <view @click="showDatePicker">
+        <text>{{ dateStr.year }} 年 </text>
+        <text>{{ dateStr.month }} 月 </text>
+      </view>
+      <uv-icon v-if="dateStr.year" name="close-circle" color="#333" @click="clearDate" />
+    </view>
+    <view v-if="dataList.length" class="list-box">
+      <view class="list-item" v-for="item in dataList" :key="item.id" @click="onDetail(item.id)">
+        <view
+          class="list-top"
+          :class="item.realFlag == '1' || item.taskStatus == '4' ? 'disables' : ''"
+        >
+          <view class="time">
+            <image
+              v-if="item.realFlag == '1' || item.taskStatus == '4'"
+              class="clock-icon"
+              src="../../static/images/common/clock2.png"
+            />
+            <image v-else class="clock-icon" src="../../static/images/common/clock.png" />
+            <text>{{ formatTime(item.createTime) }}</text>
+          </view>
+          <view
+            class="reason"
+            v-if="item.realFlag == '1' || item.taskStatus == '4'"
+            @click.stop="showReason(item)"
+          >
+            <text>审核不通过</text>
+            <image src="https://yy-cloud-oss.oss-cn-beijing.aliyuncs.com/img/wenhaoxiao1.png" />
+          </view>
+          <uv-icon
+            name="arrow-right"
+            :color="item.realFlag == '1' || item.taskStatus == '4' ? '#999999' : '#fff'"
+            size="16"
+          />
+        </view>
+        <view class="info">
+          <view class="info-name">
+            {{ item.taskTypeId }}
+          </view>
+          <view class="num"> +{{ item.score }}积分 </view>
+        </view>
+      </view>
+    </view>
+    <noData v-else />
+
+    <uv-datetime-picker
+      ref="datetimePicker"
+      v-model="dateValue"
+      mode="year-month"
+      @confirm="dateConfirm"
+    />
+
+    <uv-popup ref="popup" mode="bottom" round="10">
+      <view class="info">
+        <view class="title">
+          <text>拒绝原因</text>
+          <u-icon name="close" color="#000" size="28" @click="popupClose"></u-icon>
+        </view>
+        <view class="cont">
+          {{ reason }}
+        </view>
+        <view class="btn" @click="popupClose"> 关 闭 </view>
+      </view>
+    </uv-popup>
+  </view>
+</template>
+
+<script setup lang="ts">
+import dayjs from 'dayjs'
+import formatTime from '@/utils/formatTime'
+import { reactive, ref } from 'vue'
+import { getTaskCompletionList } from '@/service/modules/getTask'
+import { onReachBottom } from '@dcloudio/uni-app'
+import noData from '@/components/noData/index.vue'
+
+class Params {
+  taskRuleId = ''
+  total = -1
+  current = 1
+  size = 20
+}
+const params = ref(new Params())
+
+const dataList = ref<any[]>([])
+async function getList() {
+  uni.showLoading({
+    title: '加载中...'
+  })
+  let res = await getTaskCompletionList(params.value)
+  if (res.data) {
+    uni.hideLoading()
+    params.value.total = res.data.total
+    dataList.value = dataList.value.concat(res.data.records)
+  }
+}
+getList()
+
+// 底部
+onReachBottom(() => {
+  if (dataList.value.length === params.value.total) return
+  params.value.current++
+  getList()
+})
+
+const onDetail = (id: string) => {
+  uni.navigateTo({
+    url: `/pages/task/task-detail/index?id=${id}`
+  })
+}
+
+const popup = ref()
+const reason = ref('')
+const showReason = (item: any) => {
+  reason.value =
+    item.approval_info ||
+    item.report_one_approval_info ||
+    item.report_drug_approval_info ||
+    item.taskStatusInfo ||
+    '暂无原因'
+
+  popup.value.open()
+}
+const popupClose = () => popup.value.close()
+
+// 日期选择
+const datetimePicker = ref()
+const dateValue = ref(Number(new Date()))
+const showDatePicker = () => datetimePicker.value.open()
+
+const dateStr = reactive({
+  year: '',
+  month: ''
+})
+
+const dateConfirm = (e: any) => {
+  const date = dayjs(e.value).format('YYYY-MM')
+  let arr = date.split('-')
+  params.value = new Params()
+  params.value.taskRuleId = date
+  dateStr.year = arr[0]
+  dateStr.month = arr[1]
+  dataList.value = []
+  getList()
+}
+const clearDate = () => {
+  dateStr.year = ''
+  dateStr.month = ''
+  params.value = new Params()
+  dataList.value = []
+  getList()
+}
+</script>
+
+<style lang="scss" scoped>
+.task-completion-records {
+  .header {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    z-index: 10;
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+    height: 80rpx;
+    background: #ffffff;
+    border-bottom: 1rpx solid #f2f2f2;
+    font-size: 30rpx;
+    padding-right: 35rpx;
+    text {
+      margin-right: 20rpx;
+    }
+  }
+  .list-box {
+    margin-top: 80rpx;
+    padding: 30rpx;
+    background: #fafafa;
+    .list-item {
+      border-radius: 16rpx;
+      margin-bottom: 24rpx;
+      height: 200rpx;
+      background-color: #ffffff;
+
+      .list-top {
+        height: 80rpx;
+        background-color: #6eb657;
+        border-top-left-radius: 16rpx;
+        border-top-right-radius: 16rpx;
+        display: flex;
+        padding: 0 30rpx;
+        justify-content: space-between;
+        align-items: center;
+        .time {
+          display: flex;
+          align-items: center;
+          image {
+            width: 40rpx;
+            height: 40rpx;
+          }
+          text {
+            margin-left: 16rpx;
+            color: #fff;
+            font-size: 26rpx;
+            font-weight: 500;
+            line-height: 40rpx;
+          }
+        }
+        .reason {
+          color: #999999;
+          font-size: 26rpx;
+          display: flex;
+          align-items: center;
+          image {
+            width: 24rpx;
+            margin-left: 12rpx;
+            height: 24rpx;
+          }
+        }
+      }
+      .disables {
+        background-color: #f5f5f5;
+        .time {
+          text {
+            color: #999;
+          }
+        }
+      }
+      .info {
+        height: 120rpx;
+        padding: 0 30rpx;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .info-name {
+          color: #333;
+          font-weight: 400;
+          font-size: 32rpx;
+        }
+        .num {
+          color: #6eb657;
+          font-weight: 500;
+          size: 30rpx;
+        }
+      }
+    }
+  }
+}
+
+.info {
+  padding: 30rpx;
+  position: relative;
+  .title {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 60rpx;
+    text {
+      color: #000;
+      font-weight: 600;
+      font-size: 36rpx;
+    }
+  }
+  .cont {
+    min-height: 20vh;
+    color: #666666;
+    font-size: 30rpx;
+    line-height: 42rpx;
+    margin-bottom: 60rpx;
+  }
+  .btn {
+    background-color: #f1f1f1;
+    height: 80rpx;
+    text-align: center;
+    line-height: 80rpx;
+    color: #333333;
+    font-size: 30rpx;
+    position: absolute;
+    width: 700rpx;
+    left: 25rpx;
+    bottom: 50rpx;
+  }
+}
+</style>

+ 168 - 0
src/pages-sub-mine/user-info/index.vue

@@ -0,0 +1,168 @@
+<template>
+  <view class="user-info">
+    <view class="card">
+      <view class="info-item" @click="avatarUpload">
+        <view>头像</view>
+        <view class="avatar">
+          <uv-image :src="userInfo?.avatar" shape="circle" width="90rpx" height="90rpx" />
+          <uv-icon name="arrow-right" size="18" color="#bbb" />
+        </view>
+      </view>
+      <view class="info-item">
+        <view>姓名</view>
+        <view>{{ userInfo?.realname }}</view>
+      </view>
+      <view class="info-item">
+        <view>身份证号</view>
+        <view>{{ userInfo?.idCardNumber }}</view>
+      </view>
+      <view class="info-item">
+        <view>手机号</view>
+        <view>{{ userInfo?.phone }}</view>
+      </view>
+    </view>
+    <view class="card">
+      <view class="info-item">
+        <view>角色</view>
+        <view>{{ getRolesName(userInfo?.roles) }}</view>
+      </view>
+      <view class="info-item">
+        <view>公司名称</view>
+        <view>{{ userInfo?.drugEntName }}</view>
+      </view>
+    </view>
+    <view class="card signature-box">
+      <view>个性签名</view>
+      <textarea
+        class="textarea"
+        v-model="params.userSign"
+        placeholder="请输入个性签名..."
+        auto-height
+      />
+    </view>
+    <view class="submit">
+      <view class="btn" @click="submitClick">保 存</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { useLoginStore } from '@/store/login'
+import { reactive, computed } from 'vue'
+import { RoleEnum } from '@/constants/rolesType'
+import { fileUpload } from '@/service/modules/uploadFile'
+import { updateUserInfo } from '@/service/modules/userInfo'
+
+const loginStore = useLoginStore()
+const userInfo: any = computed(() => loginStore.currentUserInfo)
+
+const params = reactive({
+  userId: userInfo.value.userId,
+  userSign: userInfo.value.userSign || '',
+  avatar: userInfo.value.userSign || ''
+})
+
+const getRolesName = (roles: number[] | null) => {
+  if (!roles?.length) return
+  return RoleEnum[roles[0]]
+}
+
+// 头像上传
+function avatarUpload() {
+  uni.chooseImage({
+    count: 1,
+    sizeType: ['original', 'compressed'],
+    sourceType: ['album'],
+    success(res: any) {
+      uni.uploadFile({
+        url: fileUpload(),
+        filePath: res.tempFilePaths[0],
+        name: 'file',
+        header: {
+          Authorization: `Bearer ${loginStore.accessToken}`
+        },
+        success: (uploadFileRes: any) => {
+          let { data } = JSON.parse(uploadFileRes.data)
+          const url = import.meta.env.VITE_APP_URL + data.url
+          params.avatar = url
+          submitClick()
+        },
+        fail(e) {
+          console.log(e)
+        }
+      })
+    }
+  })
+}
+async function submitClick() {
+  const res = await updateUserInfo(params)
+  if (res.code === 0) {
+    loginStore.getUserInfoByCode()
+    uni.showToast({
+      title: '更新成功',
+      icon: 'success'
+    })
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.user-info {
+  background-color: #f4f4f4;
+  .card {
+    padding: 0 30rpx;
+    background-color: #fff;
+    margin-bottom: 20rpx;
+    :last-child {
+      border-bottom: none;
+    }
+  }
+
+  .info-item {
+    padding: 20rpx 0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    border-bottom: 2rpx solid #d8d8d8;
+    line-height: 40rpx;
+    .avatar {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      width: 130rpx;
+    }
+    .input-box {
+      text-align: right;
+    }
+  }
+  .signature-box {
+    padding: 22rpx 40rpx;
+    background: #ffffff;
+    .textarea {
+      width: 660rpx;
+      padding-top: 30rpx;
+      min-height: 400rpx;
+    }
+  }
+  .submit {
+    padding: 16rpx 26rpx;
+    background: #ffffff;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    z-index: 10000;
+    .btn {
+      width: 100%;
+      height: 88rpx;
+      text-align: center;
+      line-height: 88rpx;
+      background: #6eb657;
+      border-radius: 10rpx;
+      color: #ffffff;
+      font-size: 30rpx;
+    }
+  }
+}
+</style>
+rpx

+ 208 - 0
src/pages-sub-packages/agreement/huiqiyun.vue

@@ -0,0 +1,208 @@
+<template>
+  <view class="pl20 pr20 pb20">
+    <p class="title mt20 mb20 bold-text tc">共享平台注册经营者注册协议书</p>
+    <p class="bold-text">甲方: 河南临登网络科技有限公司</p>
+    <p class="bold-text">乙 方:</p>
+    <p class="bold-text">身份证号:</p>
+    <p class="bold-text">电话:</p>
+    <p>
+      继续注册成为平台注册经营者前,请先阅读本协议提示条款:
+      欢迎您与我司【河南临登网络科技有限公司】共同签署本《注册协议书》(下称“本协议”)成为本平台的注册经营者,以本平台为业务匹配渠道,个人从事生产经营活动,并取得相应的收益。
+      【审慎阅读】为维护您的自身权益,在您点击同意本协议之前,请认真阅读本协议,务必审慎阅读、充分理解各条款内容。<span
+        class="bold-text"
+        >【签约】当您按照提示填写您的信息且完成全部申请后,即表示您已充分阅读、理解并接受本协议的全部内容,并与我司达成一致意见,成为我司的合作人员,此后您不得以未阅读/不理解本协议内容或类似言辞做任何形式的抗辩。阅读本协议的过程中,如果您不理解相关内容应及时联系我公司,如您不同意本协议或其中任何条款约定,请您立即停止任何的申请/注册程序。【合作关系】</span
+      >
+      您与我司通过本协议建立平等的业务承揽合作关系,适用《合同法》、《民法总则》和其他民事法律,不适用《劳动法》、《劳动合同法》。
+    </p>
+    <p>协议条款:</p>
+    <p>
+      根据国家法律、法规和有关规定,双方按照平等自愿、诚实信用的原则,就您通过我司运营平台承揽发包商提供的业务,从事生产经营活动等事宜订立本服务合作协议。
+    </p>
+    <p>第一条服务内容</p>
+    <p>
+      1.1
+      因我司所运营平台上的发包商(即在我司所运营的平台上注册的单位客户,后文简称为“发包商”)有寻求个人经营者承担一定工作任务的需求,您自愿以平台为业务渠道从事生产经营活动,为更好地规范和履行各方的权利、义务,我司特此与您签订本协议,以供双方严格遵守。为保证您与发包商的权利义务,我司特此向您宣贯平台上的业务规则。关于各发包商对注册经营者的要求,包括应履行的活动条件、活动内容、活动注意事项等均在各发包商的任务发布页面有所体现,您应当予以遵守。
+    </p>
+    <p>
+      1.2
+      您应按照我司及各发包商要求的标准接收任务,履行生产经营活动过程中的相关义务并享有相关权利,并严格遵循各发包商制定的任务政策或规则。如您违反前述规定,一经核实本公司将有权随时终止本合同,冻结并扣除您尚未结算的税后经营收入作为赔偿。
+    </p>
+    <p>第二条协议效力</p>
+    <p>2.1 本协议自您完成申请、注册并最终点击签约后立即生效。</p>
+    <p>
+      2.2 本协议有效期限为自生效之日起至 年 月
+      日止(不低于一年)。期限届满,双方可另行签署新的协议;若双方未签署新的协议,而以实际行动继续合作的,视为双方同意协议期限顺延直至按照本协议约定终止或解除时为止。
+    </p>
+    <p>第三条我司的权利和义务</p>
+    <p>
+      3.1
+      我司接受发包商的委托,就其所需发包的任务寻求、匹配注册经营者(即您)为其完成相应任务,并按您的工作成果向您结算承揽任务经营所得(以下称“经营所得”)。
+    </p>
+    <p>
+      3.2
+      我司将按发包商制定的注册经营者经营所得计费标准和支付方式,根据发包商确认的数额向您结算经营所得,并承诺按时支付(按月结算)。如您在工作成果、标准和费用数额上存在异议的,可以向发包商提出,我司将根据发包商的最终意见结算和支付费用。
+    </p>
+    <p>此处您应明确:您的经营所得由我司按月结算并完成支付,您不应向发包商主张任何费用。</p>
+    <p>
+      3.3
+      在向您支付经营所得前,我司将根据税务机关的授权代征您在前述生产经营过程中产生的个人所得税等各项税款及行政收费(如适用),在收到发包商的付款指令并缴纳所有税费后,我司将<span
+        class="bold-text"
+        >保证您的税后经营所得款项及时到帐;发包商未支付费用的,我司无需向您支付。</span
+      >
+    </p>
+    <p>
+      3.4
+      您根据本协议为平台上的发包商完成任务的,系前述任务的实际承揽人,该任务并不导致您与发包商或与我司之间构成任何劳动、劳务或雇佣关系,您应对您的承揽行为负责
+    </p>
+    <p>
+      3.5
+      在您完成任务的过程中,应当自行保障人身和财产安全,并注意防范侵害第三人的人身、财产或造成其他损失,如出现问题由您自行承担责任。若因您在完成任务过程中给发包商或其他第三方造成损失,使我司或发包商承担责任的,我司或发包商有权向您追偿,并从您应得的税后经营所得中扣除。
+    </p>
+    <p>
+      3.6
+      我司承诺对您所披露的个人隐私信息【身份证号码】进行保密,但出于履行本协议的需求或有关部门要求而披露的除外。
+    </p>
+    <p>
+      3.7
+      我司发现您违反本协议第四条第4.6款之规定的,我司有权中止本协议,并将您的违法行为自发现之时24小时之内向我司主管税务机关报告。您应自行承担由此产生的税务相关的处罚责任,包括但不限于根据税务机关的要求补缴相应的税款、滞纳金等。
+    </p>
+    <p>第四条您的权利和义务</p>
+    <p>4.1 如发包商要求您完成违反法律法规的任务的,您有权且应当拒绝。</p>
+    <p>
+      4.2
+      您注册和签约时需提供必要的签约信息【包括您的姓名(或名称)、身份证号(或登记注册号)、手机号、账号等信息)】,如各单位需要其他具体信息的,请您按照发包商的要求进行提供。您承诺并保证您所提供的信息真实、准确,如我司或发包商发现您伪造或提供虚假信息的,一经核实,我司有权单方面立即解除本协议,冻结或扣除您尚未结算的税后经营所得作为赔偿。如您的信息变更(例如,不再符合注册经营者身份要求时等)应当在3日内书通知我司,否则与此有关的全部法律责任由您负责。
+    </p>
+    <p>
+      4.3
+      您同意我司及其发包商收集您的个人信息,包括但不限于您的姓名(或名称)、身份证号(或登记注册号)、收款账户信息、联系电话、接单数量及费用等。
+    </p>
+    <p>
+      4.4
+      因您是平台上任务的实际承揽人,应当独立承担相应的责任,我司没有为您方购买任何保险的法律义务,您自行购买商业保险的,其投保、出险及理赔事宜均与我司无关。
+    </p>
+    <p>4.5 您应自备提供完成任务所需要的设备设施,自行承担必要费用和成本。</p>
+    <p>4.6 您承诺与合作单位不具有下列关系:</p>
+    <p>(1)与发包商具有劳动、劳务或雇佣关系,或其他类似的劳动人事法律关系;</p>
+    <p>(2)与发包商的关联企业具有劳动、劳务或雇佣关系,或其他类似的劳动人事法律关系;</p>
+    <p>
+      (3)为发包商及其关联企业的法定代表人、董事、监事、股东。前述发包商的关联企业指,该企业与发包商相互间直接或间接持有其中一方的股权总和达到25%或以上的;或者与发包商直接或间接同为第三者所拥有或控制股权达到25%或以上的;或者对发包商生产经营、交易具有实际控制的与其他利益相关联的关系(包括但不限于婚姻、近亲属关系)。
+    </p>
+    <p>4.7 您应保证完成我司以及发包商所安排工作任务,并与我司保持必要的沟通联络。</p>
+    <p>
+      4.8
+      您应按时尽责地完成符合我司以及发包商要求的任务,在此过程中不得有侵犯人身权、肖像权、隐私权、名誉权、财产权、知识产权、商业秘密或其他合法权益以及其他违反国家法律法规、国家政策或有悖于公序良俗的行为。
+    </p>
+    <p>
+      4.9
+      协议期内,您应在我司以及发包商许可范围内使用发包商的商业信息;协议期内以及协议终止后,您均有义务对双方合作的有关协议及合作过程中知悉的我司、发包商及他人的相关信息(包括但不限于您与我司签订的本协议,及服务过程中了解到的发包商产品信息、相关服务政策、价格标准、销售数量、技术秘密及其他情况)予以保密,未经书面许可,您不得以任何方式向其它方泄漏、给予或转让前述保密信息。否则,您需负责赔偿因此导致我司及发包商的全部损失。
+    </p>
+    <p>
+      4.10 除本协议事项外,您不能以我司或发包商的名义开展任何与完成约定的任务内容无关的业务或活动。
+    </p>
+    <p>
+      4.11
+      您为发包商完成约定的任务时,发包商可能将要求您签署、点击电子协议《发包商与注册经营者的协议》,您应同意点击签署。您已经明确知悉,点击确认后该《发包商与注册经营者的协议》将对您产生法律效力。
+    </p>
+    <p>
+      4.12
+      我司及本平台默认,您于同期间内,只在本平台注册为注册经营者并接受相应的经营所得收入支付和个人所得税等各项税款及行政收费的代缴服务,若您在一个税务年度内的累计经营收入超过相应的个人所得税税率档位,请您自行在第二年到税务部门汇算清缴,并按规定补缴税款。
+    </p>
+    <p>第五条税后经营所得收入的支付</p>
+    <p>
+      5.1
+      我司将根据发包商的运营要求,按月向您支付税后经营所得收入,具体由我司根据您在发包商的实际服务情况、用户评价以及发包商的结算规则确定。由于您所完成任务的质量、发包商运营情况等的不同,该收入金额可能会呈现浮动,您清楚并了解该等浮动为正常情况。我司将以人民币形式向您支付税后经营所得收入,您应缴纳的个人所得税及其他税费由我司负责代征代办。
+    </p>
+    <p>
+      5.2 您应向我司提供您实名登记的银行账户或支付宝账户,具体账户信息以您在发包商提供的信息为准。
+    </p>
+    <p>
+      5.3
+      税后经营所得收入发放以您提供的收款帐户为准,因您提供的收款帐户不实造成的一切损失由您自行承担。如您帐号变更或发生不可用等情况时,应及时通过发包商进行变更操作,否则,由此造成的一切损失由您自行负责。
+    </p>
+    <p>第六条违约责任</p>
+    <p>
+      6.1
+      双方应按本协议约定履行,如有违反,守约方有权要求违约方及时改正;造成守约方损失的,守约方有权要求违约方赔偿。如您因违约行为给我司或发包商造成损失的,我司或发包商有权直接从您的应得税后经营所得收入中扣除相应的款项作为赔偿;该费用不足以赔偿的,可向您再行主张。
+    </p>
+    <p>
+      6.2
+      在合同因违约而终止情况下,守约方可以要求违约方承担违约责任并赔偿损失,赔偿损失的范围应包括守约方因违约方违约所受到的全部经济损失(包括直接损失、间接损失以及因此赔偿所引发的一切合理费用的支出),守约方还可保留进一步追究的权利。
+    </p>
+    <p>
+      6.3
+      因不可抗力造成损失的,彼此不负赔偿责任,但发生不可抗力一方应在2日内将有关情况通知另一方,在该不可抗力事件发生后十五日内向另一方提供关于此种不可抗力事件及其持续时间的适当证据及协议不能履行或者需要延期履行的书面资料并尽最大努力进行补救。本协议所称不可抗力是指不能预见、不能克服并不能避免且对一方当事人造成重大影响的客观事件,包括但不限于自然灾害如洪水、地震、火灾、风暴、疫情等,社会事件如战争、动乱、政府行为、黑客事件、大范围电信事故等,以及政府行为、政策法律改变等。
+    </p>
+    <p>第七条协议的终止</p>
+    <p>7.1 发生以下情形时,本协议终止:</p>
+    <p>a.本协议到期,双方未决定继续合作的;</p>
+    <p>b.您主动提出终止任务,且已经发包商同意的;</p>
+    <p>c.发包商终止或变更业务模式而不需要您继续履行本协议的;</p>
+    <p>d.发包商认为您不适合继续承揽任务的;</p>
+    <p>e.法律法规或政策变更,不再允许双方继续以此模式合作的。</p>
+    <p>7.2 除以上情形外,发生以下情形时之一的,我司可以终止本协议:</p>
+    <p>
+      7.2.1一方违反协议约定,且违约方在守约方书面通知后15日内仍未予改正的,守约方可以单方终止协议。
+    </p>
+    <p>7.3本协议的终止不影响已经产生的权利义务关系,也不解除各方的保密义务。</p>
+    <p>第八条涉税事务委托授权</p>
+    <p>8.1 涉税事务授权委托</p>
+    <p>
+      (1)合作期限内,您授权委托我司代理本协议交易项下的涉税事务,包括代开增值税普通发票和代缴个税及其他税费。
+    </p>
+    <p>
+      (2)您确认我司根据本协议授权,提交的相关申报资料和信息是真实、完整、准确和符合有关法律法规的。
+    </p>
+    <p>8.2 信息查询授权委托</p>
+    <p>
+      (1)合作期限内,您授权我司向中国人民银行、依法设立的数据服务机构、信息查询及信息验证服务机构、政府部门及其他依法设立存续的第三方机构等无次数限制地收集、查询、验证,同意递交本人相关信息(包括但不限于银行实名信息、通信实名信息、位置信息、资信状况、各类交易记录,公共费用缴纳、违法违规信息、财产状况、行踪轨迹及网络行为信息),进行验证并获得验证结果,用于以下用途:
+    </p>
+    <p>(a);(b);</p>
+    <p>(c);(d)</p>
+    <p>(注:请填写合法业务用途或应用场景)。</p>
+    <p>
+      (2)您同意为避免重复授权之不便,本授权表明该等合法存续的第三方机构在使用或向有关机构提供本人信息时,可以依据本授权径行使用或向源数据机构提供本人相关信息,而无需再逐一向本人另行获取授权。
+    </p>
+    <p>
+      8.3 特别提示:<span class="bold-text"
+        >为了维护您的合法权益,请您在充分理解本授权书的全部内容后签署本授权书。本公司将依法对信息进行保密,履行信息安全保障义务。若您不接受本授权书任何条款,请您立即停止授权。</span
+      >
+    </p>
+    <p>
+      8.4授权人声明:本授权书经接受后立即生效,且效力具有独立性,不因相关业务合同或条款无效或被撤销而无效或失效,本授权一经做出,便不可撤销。以上授权内容,本人已经充分理解并同意,一经本人点击确认或勾选时即视为签署。本人自愿做出以上授权,并愿意承担由此所产生的一切法律后果。
+    </p>
+    <p>第九条其他</p>
+    <p>
+      9.1
+      因履行本协议发生的纠纷,双方应友好协商解决,协商不成的,提请北京仲裁委员会仲裁,仲裁裁决为一裁终局,对双方具有约束力
+    </p>
+    <p>9.2 我司有权根据业务变化情况修改本协议条款。</p>
+    <p>9.3 本协议自您申请注册成功并点击签约之后生效</p>
+    <p>甲方(盖章):</p>
+    <p>日期:</p>
+    <p>乙方(盖章):</p>
+    <p>日期:</p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'huiqiyun'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+.yellow-bgc {
+  background-color: yellow;
+}
+</style>

+ 195 - 0
src/pages-sub-packages/agreement/jinyuan.vue

@@ -0,0 +1,195 @@
+<!--
+ * @desc 金源
+ * @author linyuanjie
+ * @date 2022/4/20
+-->
+
+<template>
+  <view class="pl20 pr20 pb20">
+    <p class="title mt20 mb20 bold-text tc">金园数字科技(涟源)有限公司</p>
+    <p class="title mt20 mb20 bold-text tc">与</p>
+    <p class="title mt20 mb20 bold-text tc">自由职业者</p>
+    <p class="title mt20 mb20 bold-text tc">共享经济综合服务协议</p>
+    <p>甲 方:金园数字科技(涟源)有限公司(以下简称“甲方”)</p>
+    <p>乙 方: (以下简称“乙方”)</p>
+    <p>证件号码:</p>
+    <p>联系电话:</p>
+    <p>联系邮箱:</p>
+    <p>(在本协议下,甲方和乙方统称为“双方”,或各自被称为“各方”或“一方”。)</p>
+    <p><text class="underline-bold">特别提示:</text></p>
+    <p class="underline-bold">
+      针对获得生产经营所得的自由职业者在使用本协议项下甲方(还包括甲方指定的合作方、关联方及其他分支机构,下同)提供的共享经济综合服务时,甲方承诺依法纳税、确保自然纳税人取得税后的合法收入。
+    </p>
+    <p class="underline-bold">
+      军人、公职人员等国家法律法规和纪律规定禁止从事兼职或经商的人员,严禁使用本协议项下甲方提供的共享经济综合服务。
+    </p>
+    <p class="underline-bold">
+      公司雇员等其他与公司具有劳动/劳务合同关系、或其他类似的劳动人事法律关系并从与其有前述关系的公司取得工资薪金所得的人员,严禁使用本协议项下甲方提供的共享经济综合服务;该类人员因从事生产经营而从非与其有前述关系的企、事业单位所取得的生产经营所得,甲方可为其提供本协议项下的共享经济综合服务。
+    </p>
+    <p class="underline-bold">
+      公司法定代表人、股东、董事、监事等从公司取得收入的高管人员,一律严禁使用本协议项下甲方提供的共享经济综合服务;该类人员因从事生产经营而从非与其有前述关系的企、事业单位所取得的生产经营所得,甲方同样不可为其提供本协议项下的共享经济综合服务。
+    </p>
+    <p class="underline-bold">一经发现有上述任一行为的,乙方应自行承担相关法律责任。</p>
+    <p class="underline-bold">
+      上述“公司”特指与乙方建立业务关系并提供相应生产经营活动的公司,乙方与其他公司之间的法律关系不受上述条款约束(公司法定代表人、股东、董事、监事等从公司取得收入的高管人员除外)。
+    </p>
+    <p>
+      依据《中华人民共和国税收征收管理法》及其细则、《中华人民共和国民法典》、《中华人民共和国发票管理办法》、《委托代征管理办法》等相关法律法规的规定,甲乙双方经协商一致,达成协议如下:
+    </p>
+    <p class="bold-text">1、定义</p>
+    <p>
+      1.1.
+      甲方系国内注册成立的科技公司,通过阿拉钉系统平台为自由职业者提供账户搭建与管理、交易管理及撮合、交易合同签订与存证、订单管理与查询、信息咨询及管理等其他现代服务,基于该等经济管理服务及经济业务往来,接受乙方委托,为乙方提供共享经济综合服务。
+    </p>
+    <p>
+      1.2.
+      乙方系具有完全的民事行为能力且具备相应专业技能及许可(如有)的自由职业者,接受甲方(包括甲方指定的合作方、关联方及其他分支机构,下同)提供的共享经济综合服务,与甲方或甲方企业客户之间建立业务关系并提供相应的生产经营活动。乙方承诺作为服务提供者,应遵守国家相关法律法规及行业规范,按照甲方与企业客户的业务具体要求完成服务内容,履行生产经营活动过程中的相关义务并享有相关权利。
+    </p>
+    <p>
+      1.3.阿拉钉系统平台:是由甲方合作方研发及运营维护的一套综合云服务平台,具备电子协议签署、电子数据存证、账户管理、交易管理、订单管理与查询等各项技术服务能力。
+    </p>
+    <p class="bold-text">2、合作内容</p>
+    <p>
+      2.1.乙方应自行负担就其生产经营所得需缴纳的各项税款及行政收费(如有),甲方及甲方指定的合作方、关联方及其他分支机构按照有关税收政策规定及相关主管税务机关的要求,接受乙方委托协助其向主管税务机关缴纳或代征前述税费。
+    </p>
+    <p>
+      2.2.甲方及甲方指定的合作方、关联方及其他分支机构接受乙方委托,通过本协议项下的服务将乙方生产经营所得完税后的金额发放至乙方,并接受乙方委托由甲方或主管税务机关代开增值税普通发票。
+    </p>
+    <p class="bold-text">3、甲方权利义务</p>
+    <p>3.1.甲方有权就乙方提供的生产经营活动制定相应规则及标准,乙方应当遵守。</p>
+    <p>
+      3.2.甲方协助乙方获取生产经营所得时,应当按照有关税收政策规定及主管税务机关授予的代征权限向乙方代征个人所得税等各项税款及行政收费(如有),或协助乙方按照有关税收政策规定及主管税务机关的要求缴纳个人所得税等各项税款及行政收费(如有)。
+    </p>
+    <p>
+      3.3.甲方有权对乙方提供的信息进行验证,但该等验证行为并不意味着甲方对乙方信息的真实性、有效性、合法性、完整性负责,也并不因此减轻或免除乙方的任何义务或责任。
+    </p>
+    <p>
+      3.4.甲方发现乙方违反相关法律法规或本协议规定的,甲方有权中止本协议。乙方应自行承担由此产生的税务相关的处罚责任,包括但不限于根据税务机关的要求补缴相应的税款、滞纳金等。
+    </p>
+    <p>3.5.甲方承诺对乙方所披露的个人隐私信息进行保密。</p>
+    <p>
+      3.6.甲方可以留存为实现本次合作内容从乙方处获取的乙方个人信息。但是,未经乙方授权,甲方不得将乙方个人信息披露给任何第三方。
+    </p>
+    <p>
+      3.7.甲方承诺将按照相关法律法规的要求,对从乙方处获得的乙方个人信息履行安全保护义务,保障网络免受干扰、破坏或未经授权的访问,防止网络数据泄露或被窃取、篡改。
+    </p>
+    <p>3.8.如乙方与其客户之间如有非因本协议产生的争议或纠纷的,与甲方无关,甲方不承担任何责任。</p>
+    <p>
+      3.9.甲方向乙方提供本协议项下服务在任何情况下均不得被理解为与乙方之间建立或存在劳动/劳务合同关系、或其他类似的劳动人事法律关系。
+    </p>
+    <p class="bold-text">4、乙方权利义务</p>
+    <p>
+      4.1.乙方保证提供的个人信息等均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。同时,乙方知悉并确认,当且仅当其通过了甲方系统或甲方合作的第三方系统的实名认证后,方能享有本协议项下的服务。
+    </p>
+    <p>
+      4.2.乙方保证提供各项业务往来信息,包括但不限于业务合作协议、相关补充协议及业务结算单等,均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。
+    </p>
+    <p>
+      4.3.乙方有义务向甲方提供与生产经营所得相对应的收入凭据,并保证其均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。
+    </p>
+    <p>
+      4.4.乙方有义务自行保护账户信息的安全,任何通过乙方账户进行的操作均将被视为乙方的真实意思表示,相应责任均由乙方自行承担。
+    </p>
+    <p>4.5.乙方承诺与其客户之间不具有下列关系:</p>
+    <p>1)与客户具有劳动/劳务合同关系、或其他类似的劳动人事法律关系;</p>
+    <p>2)与客户的关联企业具有劳动/劳务合同关系、或其他类似的劳动人事法律关系;</p>
+    <p>3)为客户及其关联企业或其他企业的法定代表人、董事、监事、股东等高管人员;</p>
+    <p>4)其他不适用于本协议适用范围之规定的人员关系。</p>
+    <p>
+      4.6.乙方发现甲方违反法律、行政法规的规定或者双方的约定收集、使用其个人信息的,有权要求其删除其个人信息;发现甲方收集、存储的其个人信息有错误的,有权要求其予以更正。甲方应当采取措施予以删除或者更正。
+    </p>
+    <p>
+      4.7.乙方保证活动过程中遵守国家法律法规,因乙方个人原因造成其个人或任何第三方损害的责任,由乙方承担全部法律责任。
+    </p>
+    <p>4.8.乙方不得申请代开以下发票:</p>
+    <p>1)凡带有抵扣功能的普通发票;</p>
+    <p>2)非税务部门管理的经营收入。</p>
+    <p>
+      4.9.乙方承诺应当基于真实业务交易向甲方申请代开或委托甲方由税务机关代开相应发票并提供真实、准确、完整的开票信息,否则若乙方违反该承诺造成的相关法律责任及损失由乙方自行承担,若由此造成甲方损失或被相关行政机关处罚的,乙方应当承担赔偿责任。
+    </p>
+    <p>
+      4.10.乙方不得从事违反法律及行政法规等行为,如洗钱、偷税漏税及其他甲方认为不得使用甲方服务的行为等。
+    </p>
+    <p>
+      4.11.乙方确认,其具有完全民事权利能力及完全民事行为能力,所有业务合作均为其真实意愿,且遵守国家法律法规及行业监管要求并满足所有履行本协议所需的法定条件或约定条件。
+    </p>
+    <p>4.12.乙方确认,已知晓其生产经营所得的计算方式及结算周期。</p>
+    <p>
+      4.13.乙方可自行在企业客户处查询生产经营所得的计算方式、结算周期、支付途径等信息,如有异议,可直接与企业客户沟通,甲方可在必要时提供相关协助。
+    </p>
+    <p>
+      4.14.
+      乙方委托授权甲方,根据乙方的委托及主管税务机关规定的或授予的委托代征范围、期限,及税种、税率等,依法代理乙方缴纳相关税费或代征乙方相关税费的事宜,各地主管税务机关的具体规定可能不一致。同时,如遇国家或地方政府及主管税务机关政策变更的,甲方有权根据变更后的政策规定自动调整本协议项下的权利义务乃至终止本协议。
+    </p>
+    <p>
+      4.15.为便利业务的开展,根据实际业务情况,甲方可能会安排一家或多家合作方、关联方及/或分支机构作为实际业务提供方,为乙方提供本协议项下约定的服务,乙方对此知情并完全同意。同时,乙方同意授权并委托甲方为其申请数字证书,并签署所需的相关协议,但该协议应以不加重乙方的合同义务为限。
+    </p>
+    <p>
+      4.16.乙方知悉并同意,经数字证书签署后的电子合同,与乙方以纸质形式进行的签章具有同等法律效力,对乙方具有不可撤销的法律约束力。乙方不得以未签署纸质合同为由、或未实际操作数字证书等理由,否认该等电子合同的法律效力。
+    </p>
+    <p class="bold-text">5、保密条款</p>
+    <p>
+      5.1.本协议任何一方应对本协议所涉及的所有内容以及协议各方在执行本协议过程中相关的一切法律、商业、合作业务的所有资讯进行保密。未经对方允许,均不得向对方以外的任意第三方披露。
+    </p>
+    <p>5.2.保密期应为:协议的有效期内及协议终止之后的十年。</p>
+    <p class="bold-text">6、违约责任</p>
+    <p>
+      任何一方违反本协议约定,即构成该方的违约;除本协议另有规定外,违约方应向守约方承担违约责任,补偿守约方承受或遭致的所有损失、责任、赔偿金或费用(包括但不限于合理的律师费、诉讼费、公证费等)。
+    </p>
+    <p class="bold-text">7、其他</p>
+    <p>
+      7.1.在本协议的任意一方或双方未能及时行使本协议项下的权利不应被视为放弃该权利,也不影响该方在将来行使该权利。
+    </p>
+    <p>
+      7.2.本协议的订立、执行和解释及争议的解决均应适用中国法律。凡因本协议引起的或与本协议有关的任何争议,协议各方应友好协商解决。如不能协商解决,双方一致同意提交至北京仲裁委员会仲裁。
+    </p>
+    <p>
+      7.3.双方同意,在本协议签订后,如另有补充协议,该等补充协议及附件构成本协议不可分割的组成部分,具有同等法律效。
+    </p>
+    <p>
+      7.4.本协议项下各方声明、承诺和保证:本协议任何一方已披露签署和履行本协议所应当向另一方披露的全部信息,且披露内容真实、准确、无遗漏。协议各方同时声明和承诺:本协议的签署和履行不与本协议任何一方已经签署的协议或需承担的任何义务相冲突,且也不会对本协议任何一方以外的第三方形成任何法律和商业上的冲突。
+    </p>
+    <p>
+      7.5.除本协议另有约定外,在履行本协议过程中的一切通知,甲方将通过在阿拉钉系统平台向乙方发送平台消息的方式送达乙方,甲方将通知消息发出之时即视为甲方完成通知义务。
+    </p>
+    <p>
+      7.6.本协议经甲方盖章、乙方签字之日起生效,本协议有效期为壹年。协议到期后如双方均未以书面方式提出异议,则本协议有效期自动顺延壹年。本协议壹式贰份,甲乙双方各执壹份,每份具有同等法律效力。
+    </p>
+    <p>
+      7.7
+      您/本人委托甲方代理本合同交易项下的涉税事务,包括代理报税、代开发票和代开个人完税证明。您/本人确认甲方根据本合同授权提交的相关申报资料和信息是真实、完整、准确,和符合有关法律法规的。您/本人确认与甲方的合作公司不存在法律上和事实上的人事劳动关系,不属于合作公司人事管理权限范围内的个人,也并非其股东。
+    </p>
+    <p>
+      7.8因履行本协议发生的纠纷,双方应友好协商解决,协商不成的,提请我司所在地人民法院诉讼解决。
+    </p>
+    <p>7.9我司有权根据业务需要修改本协议条款。</p>
+    <p>(以下无正文,仅为签署页)</p>
+    <p>甲方(盖章):</p>
+    <p>日期:</p>
+    <p>乙方(签字):</p>
+    <p>日期:</p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'jinyuan'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+.yellow-bgc {
+  background-color: yellow;
+}
+</style>

+ 184 - 0
src/pages-sub-packages/agreement/olading.vue

@@ -0,0 +1,184 @@
+<!--
+ * @desc 钉灵工-海南飞亿协议模板(共享经济综合服务协议)
+ * @author linyuanjie
+ * @date 2022/4/20
+-->
+
+<template>
+  <view class="pl20 pr20 pb20">
+    <p class="title mt20 mb20 bold-text tc">海南省飞亿信息科技有限公司</p>
+    <p class="title mt20 mb20 bold-text tc">与</p>
+    <p class="title mt20 mb20 bold-text tc">自由职业者</p>
+    <p class="title mt20 mb20 bold-text tc">共享经济综合服务协议</p>
+    <p>甲 方:海南省飞亿信息科技有限公司(以下简称“甲方”)</p>
+    <p>乙 方: (以下简称“乙方”)</p>
+    <p>证件号码:</p>
+    <p>联系电话:</p>
+    <p>联系邮箱:</p>
+    <p>(在本协议下,甲方和乙方统称为“双方”,或各自被称为“各方”或“一方”。)</p>
+    <p><text class="underline-bold">特别提示:</text></p>
+    <p class="underline-bold">
+      针对获得生产经营所得的自由职业者在使用本协议项下甲方(还包括甲方指定的合作方、关联方及其他分支机构,下同)提供的共享经济综合服务时,甲方承诺依法纳税、确保自然纳税人取得税后的合法收入。
+    </p>
+    <p class="underline-bold">
+      军人、公职人员等国家法律法规和纪律规定禁止从事兼职或经商的人员,严禁使用本协议项下甲方提供的共享经济综合服务。
+    </p>
+    <p class="underline-bold">
+      公司雇员等其他与公司具有劳动/劳务合同关系、或其他类似的劳动人事法律关系并从与其有前述关系的公司取得工资薪金所得的人员,严禁使用本协议项下甲方提供的共享经济综合服务;该类人员因从事生产经营而从非与其有前述关系的企、事业单位所取得的生产经营所得,甲方可为其提供本协议项下的共享经济综合服务。
+    </p>
+    <p class="underline-bold">
+      公司法定代表人、股东、董事、监事等从公司取得收入的高管人员,一律严禁使用本协议项下甲方提供的共享经济综合服务;该类人员因从事生产经营而从非与其有前述关系的企、事业单位所取得的生产经营所得,甲方同样不可为其提供本协议项下的共享经济综合服务。
+    </p>
+    <p class="underline-bold">一经发现有上述任一行为的,乙方应自行承担相关法律责任。</p>
+    <p class="underline-bold">
+      上述“公司”特指与乙方建立业务关系并提供相应生产经营活动的公司,乙方与其他公司之间的法律关系不受上述条款约束(公司法定代表人、股东、董事、监事等从公司取得收入的高管人员除外)。
+    </p>
+    <p>
+      依据《中华人民共和国税收征收管理法》及其细则、《中华人民共和国民法典》、《中华人民共和国发票管理办法》、《委托代征管理办法》等相关法律法规的规定,甲乙双方经协商一致,达成协议如下:
+    </p>
+    <p class="bold-text">1、定义</p>
+    <p>
+      1.1.甲方系国内注册成立的科技公司,通过阿拉钉系统平台为自由职业者提供账户搭建与管理、交易管理及撮合、交易合同签订与存证、订单管理与查询、信息咨询及管理等其他现代服务,基于该等经济管理服务及经济业务往来,接受乙方委托,为乙方提供共享经济综合服务。
+    </p>
+    <p>
+      1.2.乙方系具有完全的民事行为能力且具备相应专业技能及许可(如有)的自由职业者,接受甲方(包括甲方指定的合作方、关联方及其他分支机构,下同)提供的共享经济综合服务,与甲方或甲方企业客户之间建立业务关系并提供相应的生产经营活动。乙方承诺作为服务提供者,应遵守国家相关法律法规及行业规范,按照甲方与企业客户的业务具体要求完成服务内容,履行生产经营活动过程中的相关义务并享有相关权利。
+    </p>
+    <p>
+      1.3.阿拉钉系统平台:是由甲方合作方研发及运营维护的一套综合云服务平台,具备电子协议签署、电子数据存证、账户管理、交易管理、订单管理与查询等各项技术服务能力。
+    </p>
+    <p class="bold-text">2、合作内容</p>
+    <p>
+      2.1.乙方应自行负担就其生产经营所得需缴纳的各项税款及行政收费(如有),甲方及甲方指定的合作方、关联方及其他分支机构按照有关税收政策规定及相关主管税务机关的要求,接受乙方委托协助其向主管税务机关缴纳或代征前述税费。
+    </p>
+    <p>
+      2.2.甲方及甲方指定的合作方、关联方及其他分支机构接受乙方委托,通过本协议项下的服务将乙方生产经营所得完税后的金额发放至乙方,并接受乙方委托由甲方或主管税务机关代开增值税普通发票。
+    </p>
+    <p class="bold-text">3、甲方权利义务</p>
+    <p>3.1.甲方有权就乙方提供的生产经营活动制定相应规则及标准,乙方应当遵守。</p>
+    <p>
+      3.2.甲方协助乙方获取生产经营所得时,应当按照有关税收政策规定及主管税务机关授予的代征权限向乙方代征个人所得税等各项税款及行政收费(如有),或协助乙方按照有关税收政策规定及主管税务机关的要求缴纳个人所得税等各项税款及行政收费(如有)。
+    </p>
+    <p>
+      3.3.甲方有权对乙方提供的信息进行验证,但该等验证行为并不意味着甲方对乙方信息的真实性、有效性、合法性、完整性负责,也并不因此减轻或免除乙方的任何义务或责任。
+    </p>
+    <p>
+      3.4.甲方发现乙方违反相关法律法规或本协议规定的,甲方有权中止本协议。乙方应自行承担由此产生的税务相关的处罚责任,包括但不限于根据税务机关的要求补缴相应的税款、滞纳金等。
+    </p>
+    <p>3.5.甲方承诺对乙方所披露的个人隐私信息进行保密。</p>
+    <p>
+      3.6.甲方可以留存为实现本次合作内容从乙方处获取的乙方个人信息。但是,未经乙方授权,甲方不得将乙方个人信息披露给任何第三方。
+    </p>
+    <p>
+      3.7.甲方承诺将按照相关法律法规的要求,对从乙方处获得的乙方个人信息履行安全保护义务,保障网络免受干扰、破坏或未经授权的访问,防止网络数据泄露或被窃取、篡改。
+    </p>
+    <p>3.8.如乙方与其客户之间如有非因本协议产生的争议或纠纷的,与甲方无关,甲方不承担任何责任。</p>
+    <p>
+      3.9.甲方向乙方提供本协议项下服务在任何情况下均不得被理解为与乙方之间建立或存在劳动/劳务合同关系、或其他类似的劳动人事法律关系。
+    </p>
+    <p class="bold-text">4、乙方权利义务</p>
+    <p>
+      4.1.乙方保证提供的个人信息等均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。同时,乙方知悉并确认,当且仅当其通过了甲方系统或甲方合作的第三方系统的实名认证后,方能享有本协议项下的服务。
+    </p>
+    <p>
+      4.2.乙方保证提供各项业务往来信息,包括但不限于业务合作协议、相关补充协议及业务结算单等,均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。
+    </p>
+    <p>
+      4.3.乙方有义务向甲方提供与生产经营所得相对应的收入凭据,并保证其均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。
+    </p>
+    <p>
+      4.4.乙方有义务自行保护账户信息的安全,任何通过乙方账户进行的操作均将被视为乙方的真实意思表示,相应责任均由乙方自行承担。
+    </p>
+    <p>4.5.乙方承诺与其客户之间不具有下列关系:</p>
+    <p>1)与客户具有劳动/劳务合同关系、或其他类似的劳动人事法律关系;</p>
+    <p>2)与客户的关联企业具有劳动/劳务合同关系、或其他类似的劳动人事法律关系;</p>
+    <p>3)为客户及其关联企业或其他企业的法定代表人、董事、监事、股东等高管人员;</p>
+    <p>4)其他不适用于本协议适用范围之规定的人员关系。</p>
+    <p>
+      4.6.乙方发现甲方违反法律、行政法规的规定或者双方的约定收集、使用其个人信息的,有权要求其删除其个人信息;发现甲方收集、存储的其个人信息有错误的,有权要求其予以更正。甲方应当采取措施予以删除或者更正。
+    </p>
+    <p>
+      4.7.乙方保证活动过程中遵守国家法律法规,因乙方个人原因造成其个人或任何第三方损害的责任,由乙方承担全部法律责任。
+    </p>
+    <p>4.8.乙方不得申请代开以下发票:</p>
+    <p>1)凡带有抵扣功能的普通发票;</p>
+    <p>2)非税务部门管理的经营收入。</p>
+    <p>
+      4.9.乙方承诺应当基于真实业务交易向甲方申请代开或委托甲方由税务机关代开相应发票并提供真实、准确、完整的开票信息,否则若乙方违反该承诺造成的相关法律责任及损失由乙方自行承担,若由此造成甲方损失或被相关行政机关处罚的,乙方应当承担赔偿责任。
+    </p>
+    <p>
+      4.10.乙方不得从事违反法律及行政法规等行为,如洗钱、偷税漏税及其他甲方认为不得使用甲方服务的行为等。
+    </p>
+    <p>
+      4.11.乙方确认,其具有完全民事权利能力及完全民事行为能力,所有业务合作均为其真实意愿,且遵守国家法律法规及行业监管要求并满足所有履行本协议所需的法定条件或约定条件。
+    </p>
+    <p>4.12.乙方确认,已知晓其生产经营所得的计算方式及结算周期。</p>
+    <p>
+      4.13.乙方可自行在企业客户处查询生产经营所得的计算方式、结算周期、支付途径等信息,如有异议,可直接与企业客户沟通,甲方可在必要时提供相关协助。
+    </p>
+    <p>
+      4.14.乙方理解并同意,甲方仅能根据乙方的委托及主管税务机关规定的或授予的委托代征范围、期限,及税种、税率等,协助乙方缴纳相关税费或依法代征相关税费,各地主管税务机关的具体规定可能不一致。同时,如遇国家或地方政府及主管税务机关政策变更的,甲方有权根据变更后的政策规定自动调整本协议项下的权利义务乃至终止本协议。
+    </p>
+    <p>
+      4.15.为便利业务的开展,根据实际业务情况,甲方可能会安排一家或多家合作方、关联方及/或分支机构作为实际业务提供方,为乙方提供本协议项下约定的服务,乙方对此知情并完全同意。同时,乙方同意授权并委托甲方为其申请数字证书,并签署所需的相关协议,但该协议应以不加重乙方的合同义务为限。
+    </p>
+    <p>
+      4.16.乙方知悉并同意,经数字证书签署后的电子合同,与乙方以纸质形式进行的签章具有同等法律效力,对乙方具有不可撤销的法律约束力。乙方不得以未签署纸质合同为由、或未实际操作数字证书等理由,否认该等电子合同的法律效力。
+    </p>
+    <p class="bold-text">5、保密条款</p>
+    <p>
+      5.1.本协议任何一方应对本协议所涉及的所有内容以及协议各方在执行本协议过程中相关的一切法律、商业、合作业务的所有资讯进行保密。未经对方允许,均不得向对方以外的任意第三方披露。
+    </p>
+    <p>5.2.保密期应为:协议的有效期内及协议终止之后的十年。</p>
+    <p class="bold-text">6、违约责任</p>
+    <p>
+      任何一方违反本协议约定,即构成该方的违约;除本协议另有规定外,违约方应向守约方承担违约责任,补偿守约方承受或遭致的所有损失、责任、赔偿金或费用(包括但不限于合理的律师费、诉讼费、公证费等)。
+    </p>
+    <p class="bold-text">7、其他</p>
+    <p>
+      7.1.在本协议的任意一方或双方未能及时行使本协议项下的权利不应被视为放弃该权利,也不影响该方在将来行使该权利。
+    </p>
+    <p>
+      7.2.本协议的订立、执行和解释及争议的解决均应适用中国法律。凡因本协议引起的或与本协议有关的任何争议,协议各方应友好协商解决。如不能协商解决,双方一致同意提交至北京仲裁委员会仲裁。
+    </p>
+    <p>
+      7.3.双方同意,在本协议签订后,如另有补充协议,该等补充协议及附件构成本协议不可分割的组成部分,具有同等法律效。
+    </p>
+    <p>
+      7.4.本协议项下各方声明、承诺和保证:本协议任何一方已披露签署和履行本协议所应当向另一方披露的全部信息,且披露内容真实、准确、无遗漏。协议各方同时声明和承诺:本协议的签署和履行不与本协议任何一方已经签署的协议或需承担的任何义务相冲突,且也不会对本协议任何一方以外的第三方形成任何法律和商业上的冲突。
+    </p>
+    <p>
+      7.5.除本协议另有约定外,在履行本协议过程中的一切通知,甲方将通过在阿拉钉系统平台向乙方发送平台消息的方式送达乙方,甲方将通知消息发出之时即视为甲方完成通知义务。
+    </p>
+    <p>
+      7.6.本协议经甲方盖章、乙方签字之日起生效,本协议有效期为壹年。协议到期后如双方均未以书面方式提出异议,则本协议有效期自动顺延壹年。本协议壹式贰份,甲乙双方各执壹份,每份具有同等法律效力。
+    </p>
+    <p>(以下无正文,仅为签署页)</p>
+    <p>甲方(盖章):</p>
+    <p>日期:</p>
+    <p>乙方(签字):</p>
+    <p>日期:</p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'olading'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+.yellow-bgc {
+  background-color: yellow;
+}
+</style>

+ 70 - 0
src/pages-sub-packages/agreement/personalInfoAuth.vue

@@ -0,0 +1,70 @@
+<!--
+ * @desc 个人信息使用授权书
+-->
+
+<template>
+  <view class="pl20 pr20">
+    <p class="title mt20 bold-text tc">个人信息使用授权书</p>
+    <p class="title mt20 mb20 bold-text">重要提示:</p>
+    <p class="bold-text">
+      为了保障您的合法权益,您应当阅读并遵守本授权书,请您务必审慎阅读、充分理解授权书条款内容,特别是免除或者减轻中国生物技术股份有限公司(以下统称“被授权人"或“中国生物”)责任,或限制您权利的条款,其中免除或者减轻责任条款可能以加粗形式提示您注意。
+    </p>
+    <p class="bold-text">
+      除非您已阅读并接受本授权书所有条款,否则您无权使用“营销行为小助手”服务。您的使用、登录等行为即视为您已阅读并同意本授权书条款的约束。
+    </p>
+    <p class="mt20">中国生物技术股份有限公司:</p>
+    <p>
+      本人充分理解并同意,“营销行为小助手”服务是中国生物技术股份有限公司(以下简称“中国生物”)与实体企业等相关合作方进行合作,开展业务证据链采集系统服务。通过信息技术手段,对营销行为进行全面、高效的管控,以实现强化企业管理、提升营销效率、降低运营成本等目标。
+    </p>
+    <p>
+      本人在使用“营销行为小助手”服务时,承诺遵守《平台用户协议》《隐私政策》等协议。同时,为便于中国生物提供优质、便捷的服务,就使用本人的相关必要信息,本人同意并授权如下:
+    </p>
+    <p class="bold-text">
+      一、本人同意并授权,中国生物可使用和分析本人在“营销行为小助手”中所有填写登记或提供身份证明等资料中载明的姓名、、身份证号、联系电话、联系地址等个人信息及身份证明等相关材料,本人领取任务、实施任务等在“营销行为小助手”中的所有操作记录以及在实施任务时获取地理位置,访问手机相机、手机图片等数据信息(以下称“授权使用信息”);
+    </p>
+    <p class="bold-text">
+      二、本人同意并授权,中国生物可以保存、整理、加工授权使用信息,将授权使用信息及中国生物使用该信息分析结果传输共享给本人通过本“营销行为小助手”领取、实施任务的项目发布人、发起人,以便中国生物开展证据链服务。
+    </p>
+    <p class="bold-text">
+      三、本人同意并授权,中国生物可以将本人授权使用信息共享给“营销行为小助手”中为本人领取任务、实施任务提供第三方服务的企业使用。
+    </p>
+    <p class="bold-text">
+      四、除上述授权中国生物共享主体外,本人授权中国生物可将本人提交的或中国生物自行收集的本人授权使用信息与“营销行为小助手”项下相关合作方,即本人在“营销行为小助手”领取任务、实施任务所必要的其他合作方进行数据共享。若因本人授权中国生物共享信息主体不当使用本人个人信息或资料等可能造成损失,本人要求该主体承担赔偿责任,中国生物无须承担任何法律责任。
+    </p>
+    <p>同时,本人声明如下:</p>
+    <p class="bold-text">
+      一、本授权书是本人向中国生物做出的单方承诺,效力具有独立性,不因相关交易合同的任何条款无效而失效。
+    </p>
+    <p class="bold-text">
+      二、本人承诺本人在“营销行为小助手”所填写的信息或向“营销行为小助手”所提交的证明材料均真实有效、全面完整,不存在虚假陈述、伪造或篡改信息的情形,如有违反,本人承担全部法律责任。
+    </p>
+    <p>以上授权期限为本人作出本授权承诺之日起至本人在“营销行为小助手”上用户账号注销之日止</p>
+    <p class="underline-bold">
+      若本人与以上被授权人发生任何纠纷或争议,首先应友好协商解决;协商不成的,本人同意将纠纷或争议提交被授权人所在地有管辖权的人民法院管辖。本授权书的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律(不包括冲突法)。
+    </p>
+    <p class="bold-text">
+      本人已知悉本授权书所有内容(特别是加粗字体内容)的意义以及由此产生的法律效力,自愿作出上述授权,本授权书是本人真实的意思表示,本人同意承担由此带来的一切法律后果。
+    </p>
+    <p>特此授权!</p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'personalInfo'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+</style>

+ 4085 - 0
src/pages-sub-packages/agreement/platformUsers.vue

@@ -0,0 +1,4085 @@
+<template>
+  <view class="pl20 pr20">
+    <div>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-align: center;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">营销行为平台用户协议</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-align: right;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 7.5pt;
+        "
+      >
+        <span style="">第2.0版</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >《营销行为平台用户协议》系由您(或称“用户”)与中国生物技术股份有限公司(或称“中国生物”)之间就“营销行为平台”(以下或简称“本平台”)服务而签订。本平台依据《营销行为平台用户协议》的规定提供服务,该协议一旦生效对用户及中国生物均产生法律效力。您在用户注册时,请认真阅读本协议,审阅并选择同意或不同意本协议。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >在使用本平台服务之前,请您务必审慎阅读、充分理解本协议各项条款,特别是限制或免除责任条款、隐私保护政策、账号规则、法律适用和争议解决条款(包括管辖条款),</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >以及其它以加粗加黑和/或加下划线等显示形式提示您注意的重要条款,请务必重点查阅。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >中国生物与您将通过数据电文形式订立本协议,若您不同意本协议,则您有充分且完全</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >的权利立即停止注册程序(但这并不妨碍您浏览本平台中的信息)。您通过网络页面点击“同意”的按钮,且该注册和/或实际使用平台服务的行为即视为您已阅读、充分理解并同意接受</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本协议的全部条款含义即相应的法律后果,不可撤销地同意与中国生物以数据电文形式订立本协议并接受本协议及其之后修订版本的全部约束,本协议成立生效并产生法律效力。如果您对本协议有任何的疑问、投诉、意见和建议,欢迎您通过本协议所附联系方式与中国生物沟通反馈。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第1条 基础约定事项</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >1.1
+          协议范围:考虑到互联网服务以及商品频繁迭代更新等行业特点,为了更全面的界定您与本平台之间的权利义务,</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本协议包括中国生物根据法律法规规定以及本协议制定的其他政策、规则、公告声明等(除非特有所指,合称为“本协议”)</span
+        ><span style="">,您也应当加以遵守。</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >1.2
+          服务范围:中国生物可能通过不断丰富的功能界面向您提供本协议项下的平台服务,包括但不限于系统软件、移动应用程序(“APP”)、PC端网站、小程序以及其他形式。具体以中国生物实时发布的服务功能界面范围为准。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >1.3 主体地位:请您在接受本协议或者以其他中国生物允许的方式实际使用本服务之前,</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >请确保您是适格的合同主体,并在清楚理解本协议内容及其法律后果后自行决定是否同意签署,而且就您所知,不存在任何可能使得本协议无效或者本协议项下义务的履行产生重大不利影响之情形。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第2条 用户资格</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >2.1
+          只有符合下列条件之一的自然人或机构才能申请成为本平台用户,可以使用本平台的服务:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">2.1.1 </span
+        ><span style="font-weight: bold; text-decoration: underline">自然人用户:</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >年满十八周岁且未满六十周岁,具有完全民事行为能力;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">2.1.2 </span
+        ><span style="font-weight: bold; text-decoration: underline">非自然人用户:</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)根据中国法律、法规、行政规章合法设立并有效存续的机关、企事业单位、社团组织和其他组织;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)未被国家企业信用信息公示系统(www.gsxt.gov.cn)列入严重违法失信企业名录;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)未被责令停业或处于破产状态的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)财产及其股权未被重组、接管、查封、扣押或冻结;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)近三年内不涉及重大诉讼、仲裁,不属于失信被执行人的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)不存在违反法律法规规定的其他情形。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">2.2 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >不符合以上条件的自然人、法人或其他组织,将不被允许注册及认证成为本平台用户,且不得使用本平台相关服务,本平台一经发现,有权立即终止对该用户的服务,并追究其使用本平台服务的一切法律责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">2.3 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >非自然人用户需通过授权自然人为管理员后进行操作及管理。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">2.4 用户需要提供真实有效的联系电话,并提供真实信息。</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >2.5
+          本平台用户须承诺遵守法律法规、社会主义制度、国家利益、公民合法权益、公共秩序、社会道德风尚和信息真实性。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第3条</span><span style=""> </span
+        ><span style="font-weight: bold">用户账号规则</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.1 用户账号</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >3.1.1
+          您通过平台或上级企业管理员获得中国生物配置的用户账号,自首次使用该账号登陆并使用平台服务之日起即成为平台用户(以下称“注册”),您在使用本平台服务时可能需要提供一些必要的信息,具体验证方式(包括但不限于您需要提供验证的身份要素)以本网站相关页面提示为准。您须保证所填写及所提供的资料真实、准确、完整,否则可能无法使用本平台服务,或在使用过程中受到限制,甚至影响您是否能够使用本平台特定功能。</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >对于因您提供的信息不真实、不准确或不完整导致的责任和损失由您自行承担。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >3.1.2
+          本平台有权根据您所提供资料的真实性、准确性、完整性以及是否符合本平台服务规定的其他条件,决定是否为您提供服务。您在使用本平台服务过程中,所提供的信息发生变动,应及时进行变更。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.1.3 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您在平台注册的用户账号仅限您本人使用,账号信息和权限不得以转让、赠与、借用、售卖、授权或租用等方式许可给第三方使用或和第三方共同控制、使用。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.1.4 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您在用户账号中的设置必须遵守法律法规、公序良俗、社会公德,且不会侵害其他第三方的合法权益,否则中国生物可能会停止您使用平台账号的权利,但中国生物不对此负有实质审查义务,相关法律后果将由您自行承担。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.1.5 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您有责任自行负责保管账号的用户名和登陆密码等信息,否则因该等事项引发的法律责任由用户自行承担(例如盗用、转让等)。凡使用本平台服务登录账号和登录凭证的行为,本平台服务视为您本人的操作,操作所产生的电子信息记录均为本平台服务用户行为的有效凭据。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.4 账号使用</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >3.4.1
+          您在使用本平台服务账号登录时,除遵守本协议约定外,还应遵守平台项下发生服务行为时相应的服务协议约定,对可能出现的纠纷在法律规定和协议约定的范围内各自承担责任。</span
+        ><span style="">&nbsp;</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >3.4.2
+          为客户体验及功能服务考虑,您在使用不同服务时被要求填写的信息内容可能不完全一致,因此,在使用本平台更高级别服务时,为了给您提供更好的服务及为了您的登录账号安全,可能需要您补充完整信息后方可使用。</span
+        ><span style="">&nbsp;</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.5 账号休眠</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.5.1 用户申请休眠情形</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >账号休眠指,在本平台执行某账户进行休眠后,该用户将不能登陆该账户、进而不能使用平台项下全部功能。如果您需要休眠您的账号,您可以通过联系平台客服进行申请,经本平台审核同意后方可解除与本平台的协议关系并休眠您账号。当您的账户休眠后,您的个人信息和您在使用本平台期间提供或产生的信息我们将按照《中国生物隐私权政策》第三条第二款约定的存储期限进行保存。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.5.2 强制休眠情形</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >中国生物有权在您的账号符合如下情况时,休眠您的账号并停止服务:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline">(1)未通过实名认证;</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)连续180日未曾登陆、使用本平台服务;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)在用户违反本协议及相关规则规定时,本平台有权终止向该用户提供服务。但该</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户在被本平台终止提供服务后,再一次直接或间接或以他人名义注册为本平台用户的,本平台有权再次单方面终止为该用户提供服务;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)本平台发现用户注册资料中主要内容是虚假的,本平台有权随时终止为该用户提供服务;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)本协议终止或更新时,用户未确认新的协议的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)其它本平台认为需终止服务的情况。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >本平台可自行全权决定,在发出通知或不发出通知的情况下,随时停止或终止提供全部或部分服务。服务终止后,本平台没有义务为用户保留原账户中或与之相关的任何信息,或转发任何未曾阅读或发送的信息给用户或第三方。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">3.5.3 不论用户账户通过何种方式休眠,本平台仍保留下列权利:</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >(1)本平台有权在法律、法规、行政规章规定的时间内保留该用户的资料,包括但不限于以前的用户资料、任务对接记录等;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >(2)若终止服务之前,该用户在本平台交易平台上存在违法行为或违反本协议的行为,本平台仍可行使本协议所规定的权利。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第4条</span><span style=""> </span
+        ><span style="font-weight: bold">平台交易规则</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >您应承诺与本平台其他用户进行交易的过程中,均应良好的遵守如下基本交易规则:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">4.1 了解服务信息</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">您在</span><span style="">使用</span
+        ><span style="">本平台前,应详细了解并完全接受本平台服务内容及交易规则</span
+        ><span style="">。</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">4.2 交易协议的提交及确认</span
+        ><span style="width: 7.58pt; text-indent: 0pt; display: inline-block">&nbsp;</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >在您提交本平台任务接收单或其他文件(以下称“任务文件”)</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >前,请您务必仔细确认服务时间、内容、限制性要求等重要事项,并核实您的联系地址、电话、个人信息。您根据平台指引</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >点击提交“【同意】”按钮行为,意味着您认可文件中包含的所有信息都是正确和完整</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >的,且视为您同意并认可任务文件所载明内容,待点击确认后,该任务文件即成立并生效,对您发生法律效力。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">4.3 信息发布及虚假交易</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >若根据平台规则,您有权在平台系统中发布信息的,应根据本平台指引操作并应遵守本平台信息发布规则。您应确保在平台系统发布信息及交易的准确性、真实性、完整性,禁止提供虚假信息,一旦被中国生物发现,中国生物将有权单方面取消您用户资格并限制您在【
+          壹 】年内不得注册成为用户。且由此给平台或其他用户造成的损失也均由您自行承担。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">4.4 其他规则说明</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >4.4.1
+          为交易达成以及提升用户体验等目的,本平台可能会为您提供更为友好完善的规则服务,并优化和引入第三方服务。由此发生的法律关系是由您和该等第三方服务商之间形成,和本平台无关。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >4.4.2
+          您同意并知悉,本平台中的具体内容、功能和形式由平台根据实际情况按“现状”实时提供,中国生物有权自行确定本平台服务的具体内容、功能和形式,有权自行决定增加、变更、中断和停止本平台具体的内容、功能和形式。具体以本平台实时呈现的服务内容、功能和形式为准。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">4.4.3 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >由于众所周知的互联网技术因素等客观原因存在,本平台显示的信息可能会有一定的滞后性或差错,对此情形您知悉并理解,如因系统故障或平台重大误解导致显示信息明</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >显不合理的,请勿进行下一步操作,</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >如您明知显示信息明显不合理仍然提交任务文件的,将可能被视为恶意行为,本平台将有权</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >冻结和/或取消本次交易;如果您在不知情的情况下进行了下一步操作,请第一时间联系本平台客服。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">4.4.4 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您同意在使用本平台服务的过程中遵守诚实信用原则,您</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >不得实施恶意行为扰乱本平台正常交易秩序。如本平台根据您的登录账号下的记录及其他相关信息,发现您有(或可能有)恶意行为的,则本平台有权单方拒绝您的需求,或单方取消您的交易且不予退还保证金(如有),且无须由此向您承担法律责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第5条 用户的权利和义务</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >5.1
+          用户有权根据本协议及本平台发布的相关规则,登录并利用本平台查询公开的用户信息、发布或承接服务、统计汇总信息、</span
+        ><span style="">使用手机客户端填写真实业务信息、</span
+        ><span style="">参加本平台的有关活动,并有权享受本平台提供的其他有关资讯及信息服务。</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.2 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户有权对部分自身账号相关信息进行查询、更新、删除。用户有权对自身账号对应的用户信息、任务信息、汇总信息等相关信息进行查询,用户可以按其权限进行任务处理,例如管理员权限可以对任务进行审核验收、个人用户可以承接、实施任务。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.3 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户须自行负责自己的用户账号和密码,且须对在用户账号密码下发生的所有活动(包括但不限于发布服务信息、网上点击同意各类协议、规则、参与承接服务等)承担责任。用户有权根据需要更改登录密码。因用户的过错导致的任何损失由用户自行承担,该过错包括但不限于:不按照提示操作、不按照平台流程操作、未及时进行操作、遗忘或泄漏密码、密码被他人破解及用户使用的计算机被他人侵入等情形。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >5.4
+          用户应当向本平台提供真实准确的注册信息,包括但不限于真实姓名、身份证号、手机号码(</span
+        ><span style="">手机号码即为用户在本平台的账户</span
+        ><span style="">)、电子邮箱等。保证本平台可以通过上述联系方式与用户进行联系。同时,</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户也应当在相关资料实际变更时及时更新有关注册资料</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >,因未及时更新注册资料导致的任何损失由用户自行承担。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.5 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户在本平台注册的账号名称及发布的内容,不得有下列情形:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)违反中国宪法或法律法规规定的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)损害国家荣誉和利益的,损害公共利益的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)煽动民族仇恨、民族歧视,破坏民族团结的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)破坏国家宗教政策,宣扬邪教和封建迷信的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)散布谣言,扰乱社会秩序,破坏社会稳定的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(7)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(8)侮辱或者诽谤他人,侵害他人合法权益的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(9)含有法律、行政法规禁止的其他内容的。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.6 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户不得以虚假信息骗取账号名称注册,或其账号头像、简介等注册信息存在违法和不良信息。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.7 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户不得冒用关联机构或社会名人注册账号名称。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.8 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户不得以任何形式擅自转让或授权他人使用自己在本平台的实名注册账号。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.9 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >非自然人用户认证通过后,认证信息不可随意进行变更;如需变更,须重新提交平台管理员审核。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.10 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户有义务确保在本平台上发布的需求信息真实、准确,无误导性。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.11 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户在本平台上所实施行为,不得违反国家法律、法规、行政规章的规定,不得侵犯他人知识产权或其他合法权益的信息,不得违背社会公共利益或公共道德,不得违反本平台的相关规定。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.12 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户在本平台交易中应当遵守诚实信用原则,不得以干预或操纵发布服务等不正当竞争方式扰乱网上交易秩序,不得从事与网上交易无关的不当行为。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.13 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户不应采取违法或不正当手段(包括但不限于提供虚假证明材料等方式)在平台获利。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.14 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户承诺自己在使用本平台实施的所有行为遵守法律、法规、行政规章和本平台的相关规定以及各种社会公共利益或公共道德。如有违反导致任何法律后果的发生,用户将以自己的名义独立承担相应的法律责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.15 用户如发现其他用户有违法或违反本协议的行为,可以向本平台举报。</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.16 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >未经本平台书面允许,用户不得将本平台的任何资料以及在平台上所展示的任何信息作商业性利用(包括但不限于以复制、修改、翻译等形式制作衍生作品、分发或公开展示)。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.18 </span
+        ><span style="font-weight: bold"
+          >用户不得使用以下方式登录平台或破坏本平台所提供的服务:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)以任何机器人软件、蜘蛛软件、爬虫软件、刷屏软件或其它自动方式访问或登录本平台;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)通过任何方式对本平台内部结构造成或可能造成不合理或不合比例的重大负荷的行为;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)通过任何方式干扰或试图干扰本平台的正常工作或本平台上进行的任何活动。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.19 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户同意接收来自本平台的信息,包括但不限于活动信息、完成信息等。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">5.20 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户如为非自然人用户的,其在本平台实名认证的管理人员的所有操作视为用户行为,用户须对其管理人员的行为承担一切责任。用户应要求其管理的人员遵守本协议及</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本平台相关规则等要求,如用户实名认证的管理人员违反本协议及/或本平台规则等</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >要求的,视为用户违反上述要求,用户应按照本协议要求承担相应责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第6条 本平台的权利和义务</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">6.1 本平台仅为用户提供一个信息交流、</span
+        ><span style="">服务接洽及证据链采集的第三方平台</span><span style="">,</span
+        ><span style="">是为实施服务提供解决方案的信息服务平台</span><span style="">。</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >6.2
+          本平台有义务在现有技术水平的基础上努力确保整个网上交流平台的正常运行,尽力避免因平台原因导致服务中断或将中断时间限制在最短时间内,保证用户网上交流活动的顺利进行。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >6.3
+          本平台有义务对用户在注册使用本平台信息中所遇到的与注册或任务对接有关的问题及反映的情况及时作出回复。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >6.4
+          本平台有权对用户的注册资料进行审查,对存在任何问题或怀疑的注册资料,本平台有权发出通知询问用户并要求用户做出解释、改正。</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户拒不解释、改正的,本平台有权拒绝用户使用本平台。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">6.5</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >因网上信息平台的特殊性,本平台不承担对所有用户的任务发布、对接行为以及与任务对接有关的其他事项进行事先审查的义务,但如发生以下情形,本平台有权无需征得用户的同意限制用户的活动、向用户核实有关资料、发出警告通知、暂时中止、无限期中止及拒绝向该用户提供服务:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)用户以非自然人名义进行认证之后认证主体自行休眠或者经有权机关吊销或撤销的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)用户违反本协议或因被提及而纳入本协议的相关规则;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)存在用户或其他第三方通知本平台,认为某个用户或具体交易事项存在违法或不当行为,并提供相关证据,而本平台无法联系到该用户核证或验证该用户向本平台提供的任何资料;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)存在用户或其他第三方通知本平台,认为某个用户或具体事项存在违法或不当行</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >为,并提供相关证据。本平台以普通非专业人员的知识水平标准对相关内容进行判别,可以明显认为这些内容或行为可能对他方或本平台造成财务损失或承担法律责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">6.6 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >根据国家法律、法规、行政规章规定、本协议的内容和本平台所掌握的事实依据,可以认定该用户存在违法或违反本协议行为以及在本平台交易平台上的其他不当行为,本平台有权无需征得用户的同意在本平台上以网络发布形式公布该用户的违法行为,并有权随时作出删除相关信息、终止服务提供等处理。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">6.7 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本平台有权在不通知用户的前提下,删除或采取其他限制性措施处理下列信息:包括但不限于以规避费用为目的;以炒作信用为目的;存在欺诈等恶意或虚假内容;与本平台服务无关或不是以服务任务对接为目的;存在恶意竞价或其他试图扰乱正常秩序因素;违反法律法规、公共利益或可能严重损害本平台和其他用户合法利益。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第7条 免责声明</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">当用户接受该协议时,用户应当明确了解并同意:</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.1 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您在本平台发表的言论和信息如有涉及侵权、违法的情况,该等言论和信息仅代表您个人行为和个人观点。权利人或受害人有权向本平台举报该等情况,本平台在收到并查实后将配合尽快删除,但并不因此代表本平台将承担权利人或受害人因侵权、违法等行为造成的法律责任。同时,若您该侵权、违法行为给本平台造成财产、名誉等损失的,本平台有权要求您承担全部赔偿责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.2 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本平台是在现有技术基础上提供的服务,本平台不能随时预见到任何技术上的问题或其他困难。该等困难可能会导致数据损失或其他服务中断。本平台不保证以下事项:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)本平台将符合所有用户的要求;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)本平台不受干扰、能够及时提供、安全可靠或免于出错;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)本服务使用权的取得结果是正确或可靠的。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.3 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >中国生物对本平台涉及的境内外基础运营商的通信网络的故障、技术缺陷、覆盖范围限制、不可抗力、计算机病毒、黑客攻击、客户所在位置、客户关机或其他非中国生物技术能力范围内的事因等造成的服务中断、用户数据d丢失、出现乱码、错误接收、无法接收、迟延接收不承担责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.4 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >是否经由本平台下载或取得任何资料,由用户自行考虑、衡量并且自负风险,因下载任何资料而导致用户电脑系统的任何损坏或资料流失,用户应负完全责任。希望用户在使用本平台时,小心谨慎并运用常识。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.5 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户经由本平台取得的建议和资讯,无论其形式或表现,绝不构成中国生物对用户通过本平台进行事宜所作出的任何明示或暗示的保证或担保。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.6</span><span style="font-weight: bold"> </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >基于以下原因而造成的利润、商誉、使用、资料损失或其它无形损失,本平台不承担任何直接、间接、附带、特别、衍生性或惩罚性赔偿(即使本平台已被告知该赔偿的可能性):</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)本平台的使用或无法使用;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)用户的传输或资料遭到未获授权的存取或变更;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)本平台中任何第三方之声明或行为;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)本平台在任务服务对接中为用户提供成交机会,推荐对接方;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline">(5)本平台其它相关事宜。</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.7 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本平台提供与其它互联网上的平台或资源的链接,用户可能会因此链接至其它运营商经营的平台,但不表示本平台与这些运营商有任何关系。其它运营商经营的平台均由各经营者自行负责,不属于本平台控制及负责范围之内。对于存在或来源于此类平台或资源的任何内容、广告、物品或其它资料,本平台亦不予保证或负责。因使用或依赖任何此类平台或资源发布的或经由此类平台或资源获得的任何内容、物品或服务所产生的任何损害或损失,本平台不负任何直接或间接的责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.9 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >就下列情形的发生,本平台不承担任何法律责任:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)由于您将账号、密码告知他人或与他人共享注册账户,由此导致的任何个人信息的泄漏,或其他非因本平台原因导致的个人信息的泄漏;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)您在申请使用平台服务时因个人资料有任何变动,但未能及时更新,由此导致个人信息不真实而引起的问题及后果;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)本平台根据法律规定、政策要求或行政/司法机关的要求对外提供您的个人信息或交易记录;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)因不可抗力导致的任何后果。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">7.10 </span><span style="font-weight: bold">中国生物</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >保留判定您的行为是否符合本服务协议要求的权利,如果您违背了本服务协议的规定,</span
+        ><span style="font-weight: bold">中国生物</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >有权中止或终止本平台服务。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第8条 知识产权</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">8.1 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本平台及本平台所使用的任何相关软件、程序、内容,包括但不限于作品、图片、档案、资料、平台构架、平台版面的安排、网页设计、经由本平台向用户呈现的资讯,均由本平台或法定权利人依法享有相应的知识产权,包括但不限于著作权、商标权、专利权或其它专属权利等,受到相关法律的保护。未经本平台或权利人明示授权,用户不得擅自复制、传播、展示、镜像、上传、下载、使用、修改、出租、出借、出售、散布本平台及本平台所使用的上述任何资料和资源,或根据上述资料和资源制作成任何种类产品,或者从事任何其他侵犯知识产权的行为,否则,平台有权追求侵权人的相关法律责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">8.2 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本平台授予用户不可转移及非专属的使用权,使用户可以通过单独计算机使用本平</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >台的目标代码(以下简称“软件”),但用户不得且不得允许任何第三方复制、修改、创作</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >衍生作品、进行还原工程、反向组译,或以其它方式破译或试图破译源代码,或出售、转</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >让“软件”或对“软件”进行再授权,或以其它方式移转“软件”之任何权利。用户同意不以任何方式修改“软件”,或使用修改后的“软件”。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >8.3
+          您在使用中国生物服务时利用本平台及服务所发表上传的文字、图片、视频等原创信息的知识产权归您所有。</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您在此明确授权:您上传到本平台服务器上的任何内容,您皆授予本平台在世界范围内基于商业或非商业目的,永久的、免费的以复制、翻译、发行、重新编排、节选等方式使用,或采用任何形式再传播或创作改变或衍生作品的权利。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">8.4 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >基于对数据的合法加工而获得的具有竞争性的数据权益,除法律法规另有规定外,中国生物享有独立的使用权益而无须获得您的同意。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">8.5 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >在未得到著作权人的授权时,您不得将他人的作品全部或部分复制发表到本平台系统。如您上传的内容侵犯了第三方的著作权或其他权利,本平台将不承担任何法律责任,所有后果由您自行承担。如果第三方提出关于著作权的异议,本平台有权根据实际情况删除相关的内容,并有权追究您的法律责任。因您的侵权行为给本平台或任何第三方造成损失的,您应负责全部赔偿责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >8.6
+          关于信息内容的投诉或举报。若您在使用平台过程中,不慎受到合法权益的侵犯,您有权通知中国生物采取必要措施进行处置。若您在使用平台过程中,发现存在违法违规或违反本服务相关规则的情况,您也有权向中国生物发起举报,中国生物亦会及时采取必要措施(删除、屏蔽、断开链接或限制使用功能等)进行处置。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">8.7 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >内容维权授权。在法律法规允许的范围内,您同意并授权中国生物就侵犯您合法权益的行为(包括但不限于私自复制、使用、编辑、抄袭等行为)采取任何形式的法律行动,包括但不限于投诉、诉讼等必要的维权措施。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">8.8 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户不得经由非本平台所提供的界面使用本平台。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第9条 用户行为规范</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">9.1 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您保证合理地使用本平台服务,并接受本协议和中国生物适时制定并发布的其他政策、规则、公告声明。</span
+        ><span style="font-weight: bold; text-decoration: underline"> </span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">9.2 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >行为禁止:您可在本协议约定的范围内使用本平台及服务,您不得利用本平台从事以下行为:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)超出授权或恶意使用平台服务;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)利用本平台发表、传送、传播、储存危害国家安全、国家统一、社会稳定的内容,或侮辱诽谤、色情、暴力、引起他人不安及任何违反国家法律法规政策的内容,或者设置含有上述内容的网名、角色名,发布、传送、传播违法广告信息、营销信息及垃圾信息等;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)利用本平台侵害他人知识产权、肖像权、隐私权、名誉权、个人信息等合法权利或权益;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)恶意虚构或协助虚构事实、评价等信息或数据;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)进行任何危害计算机网络安全的行为,包括但不限于:使用未经许可的数据或进入未经许可的服务器/账户;未经允许进入公众计算机网络或者他人计算机系统并删除、修改、增加存储信息;未经许可,企图探查、扫描、测试本“软件”系统或网络的弱点或其它实施破坏网络安全的行为;企图干涉、破坏本“软件”系统或网站的正常运行,故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为;伪造TCP/IP数据包名称或部分名称;利用本平台及服务上传任何病毒、木马,或者蠕虫等危害网络健康的内容;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)对本平台进行反向工程、反向编译或反向汇编或以其它方式企图发现平台的源代码和算法,未经许可修改、禁用软件的任何功能或创建基于软件的衍生作品。去除本平台或文档上的任何所有权声明或标签,或将其他软件与本平台合并;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(7)进行任何破坏中国生物提供服务公平性或者其他影响应用正常秩序的行为,如主动或被动刷分、合伙作弊、使用外挂或者其他的作弊软件、利用BUG(又叫“漏洞”或者“缺陷”)来获得不正当的非法利益,或者利用互联网或其他方式将外挂、作弊软件、BUG公之于众;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(8)从事其他法律法规、政策及公序良俗、社会公德禁止的行为以及侵犯其他个人、公司、社会团体、组织的合法权益的行为。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">9.3 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >信息内容规范:为了营造良好网络生态,保障公民、法人和其他组织的合法权益,维护国家安全和公共利益,中国生物将根据法律、行政法规,营造清朗的网络空间,并开展弘扬正能量、处置违法和不良信息等相关活动。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">9.3.1 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >您不得制作、复制、发布含有下列内容的违法信息:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)反对中国宪法所确定的基本原则的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)损害国家荣誉和利益的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)歪曲、丑化、亵渎、否定英雄烈士事迹和精神,以侮辱、诽谤或者其他方式侵害英雄烈士的姓名、肖像、名誉、荣誉的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)宣扬恐怖主义、极端主义或者煽动实施恐怖活动、极端主义活动的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)煽动民族仇恨、民族歧视,破坏民族团结的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(7)破坏国家宗教政策,宣扬邪教和封建迷信的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(8)散布谣言,扰乱经济秩序和社会秩序的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(9)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(10)侮辱或者诽谤他人,侵害他人名誉、隐私和其他合法权益的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(11)法律、行政法规禁止的其他内容。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">9.3.2 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >中国生物也将依法采取措施,防范和抵制制作、复制、发布含有下列内容的不良信息:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)使用夸张标题,内容与标题严重不符的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)炒作绯闻、丑闻、劣迹等的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)不当评述自然灾害、重大事故等灾难的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)带有性暗示、性挑逗等易使人产生性联想的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)展现血腥、惊悚、残忍等致人身心不适的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)煽动人群歧视、地域歧视等的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(7)宣扬低俗、庸俗、媚俗内容的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(8)可能引发未成年人模仿不安全行为和违反社会公德行为、诱导未成年人不良嗜好等的;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(9)其他对网络生态造成不良影响的内容。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">9.4 </span
+        ><span style="font-weight: bold; text-decoration: underline">信息内容的使用规范</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >未经中国生物书面许可,您不得自行或授权、允许、协助任何第三人对本平台中信息内容进行如下行为:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)复制、读取、采用本平台的信息内容,用于任何形式的商业用途;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)擅自编辑、整理、编排平台及相关服务的信息内容后在平台及相关服务的源页面</span
+        ><span style="font-weight: bold; text-decoration: underline">以外的渠道进行展示;</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)采用不正当方式,自行或协助第三人对本平台及相关服务的信息内容产生流量、</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >阅读量或交易引导、转移、劫持等不利影响。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第10条 个人信息保护与隐私政策</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >10.1
+          尊重用户隐私并保护您的个人信息安全是中国生物的一贯态度,平台将会采取合理的措施保护您的个人信息与隐私。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">10.2 信息使用</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)中国生物有权在遵守法律法规的前提下,以明示的方式获取、使用、储存和分享您</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >的个人信息。中国生物不会在未经您授权时,公开、编辑或透露您的个人信息及您保存在中国生物的非公开内容。您同意并保证:本平台有权依法收集使用您的相关信息。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">(2)本平台不会向任何人出售或出借用户的个人或法人信息,</span
+        ><span style=""
+          >(因业务需要,自然人用户需要通过本平台合作指定的第三方企业进行代缴税款的除外),</span
+        ><span style="">除非事先得到用户得许可;</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)本平台亦不允许任何第三方以任何手段收集、编辑、出售或者无偿传播用户的个</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >人或法人信息。任何用户如从事上述活动,一经发现,本平台有权立即终止与该用户的服务协议,查封其账号。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)您同意,中国生物有权通过cookie等技术收集您的使用、行为信息,并在经过数据脱敏使之不再指向、关联到您个人的身份信息时,自由使用脱敏后的纯商业数据。当然,您也可根据自己的偏好删除Cookie,但如果您这么做,则需要在每一次访问中国生物的网站时亲自更改用户设置。目前删除Cookie的一般路径是浏览器:“设置-清除数据”,或者将手机系统还原/清除。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">10.3 信息披露</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >用户的信息将在下述情况下部分或全部被披露:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(1)经用户同意,向第三方披露;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(2)根据法律的有关规定,或者行政、司法机关的要求,向第三方或者行政、司法机关披露;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)若用户出现违反中国有关法律或者平台规定的情况,需要向第三方披露;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)为提供您所要求的产品和服务,而必须和第三方分享用户的个人或法人信息(</span
+        ><span style="font-weight: bold; text-decoration: underline">例</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >如自然人用户需要通过本平台合作指定的第三方企业进行代缴税款的</span
+        ><span style="font-weight: bold; text-decoration: underline">);</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)为保护您、本平台的其他用户或本平台的关联方的合法权益,本平台可能将您的</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >个人信息用于预防、发现、调查以下事项:欺诈、危害安全、违法或违反与本平台或关联方协议、政策或规则的行为;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)在遵循隐私权保护以及其他相应的保密安全措施的前提下,允许本平台将您的个</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >人信息提供给相关合作方,让其根据本平台指令处理相关信息;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(7)其它本平台根据法律或者平台规定认为合适的披露。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >若您不同意以上内容,请立即停止使用中国生物平台服务。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >用户或者第三方申请本平台披露其他用户信息的,本平台有权视实际情况要求申请人出具申请书,申请书内容应包含申请披露的信息范围、用途及使用承诺等内容。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">10.4 信息安全</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >(1)中国生物将运用各种安全技术和程序建立完善的管理制度来保护您的个人信息及隐私安全,以免遭受未经授权的访问、使用或披露。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline">(2)</span
+        ><span style=""
+          >如果用户发现自己的个人或法人信息泄密,尤其是用户账户或密码发生泄露,请用户立即联络本平台客服,以便中国生物采取相应措施。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">10.5 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >在遵守本协议项下特别约定的个人信息保护与隐私政策外,中国生物希望您认真并完整阅读中国生物特别针对平台而制定并适时发布的《隐私权政策》,这将更有助于保障您的个人信息。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第11条 信息推送</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >您同意在接受中国生物提供服务的同时,允许中国生物在遵守法律法规的前提下自行或由第三方向您发送、展示提示信息(包括商业与非商业信息)。如您对发送、推荐的信息不感兴趣,您可以基于中国生物提供的相关技术选项,控制系统向您展示或不展示/减少展示相关类型的信息。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第12条 不可抗力</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">12.1</span><span style="font-weight: bold"> </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >鉴于互联网服务的特殊性,您理解并同意中国生物在因不可抗力或者其他意外事件导致平台及服务障碍不能正常运作、服务中断或延迟等情形下,对您在本平台所遭受的损失(包括但不限于财产、收益、数据资料等方面的损失或其它无形损失)无需承担责任。同时,因不可抗力使得本协议的履行不可能、不必要或者无意义的,任何一方均可单方解除本协议且无需承担违约责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >本协议所称之不可抗力意指不能预见、不能避免并不能克服的客观情况,包括但不限于战争、台风、水灾、火灾、雷击或地震、罢工、暴动、法定疾病、停电、计算机病毒、木马、其他恶意程序、黑客攻击、网络病毒、电信部门技术管制、网络运营公司技术调整或故障、系统维护、政府行为或任何其它自然或人为造成的灾难等客观情况。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">12.2 </span
+        ><span style=""
+          >若任何一方由于不可抗力无法履行协议,该方须及时通知另一方以便减轻另一方可能遭受的损失,并应在合理的时间内提供不可抗力的证明。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第13条 保密</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >用户保证在使用本平台过程中所获悉的属于本平台、本平台其他用户及其他第三方的无法自公开渠道获得的文件及资料(包括但不限于商业秘密、公司计划、运营活动、财务信息、技术信息、经营信息及其他商业秘密)予以保密</span
+        ><span style="">,保密期限为【</span><span style="font-family: Calibri">3</span
+        ><span style="">】年</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >。未经该资料和文件的原提供方同意,用户不得向第三方泄露该商业秘密的全部或者部分内容。但法律、法规、行政规章另有规定或者双方另有约定的除外。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第14条 违约责任</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">14.1 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >如果您在使用本平台服务的过程中违反本协议约定、本平台其他规则、协议,或其他可适用的法律法规、国家政策、合同约定、平台规则或公告的,本平台有权要求您改正或直接采取一切必须要的措施以减轻或消除您的不当行为,并可根据违规情形严重情况要求您承担违约责任,具体措施包括但不限于:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline">(1)警告;</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline">(2)违规情形的公示;</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(3)修改或屏蔽违规内容,包括但不限于将违规信息移除;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(4)限制信息发布,限制平台其他功能的使用;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(5)部分或全部扣除相关费用;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(6)部分或全部扣除保证金(如有);</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(7)冻结用户账号,中断向您提供本平台服务;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(8)休眠您的账号,终止向您提供服务,和/或拒绝或限制您再行注册或使用本平台服务;</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >(9)要求您承担损害赔偿责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">14.2 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >若您的行为给我们造成损失的(包括但不限于直接损失、名誉损失、第三方的罚款、索赔等),我们有权全额向您追偿,如您在本平台中有保证金等财产权益的,我们有权冻结。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">14.3 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本协议终止后,除法律有明确规定外,本平台无义务向您或您指定的第三方披露您账户中的任何信息。本协议终止后,本平台仍享有下列权利:根据法律规定,继续保存您留存于本平台的的各类信息;对于您过往的违约行为,本平台仍可依据本协议向您追究违约责任。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">14.4 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >本协议及本平台其他规则、协议项下所述“损失”或“赔偿责任”,均包括但不限于自身损失、向第三方支付的违约金、赔偿金及因实现权利而产生的律师费、取证费、诉讼/仲裁费、</span
+        ><span style="font-weight: bold; text-decoration: underline">财产保全费。</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第15条 交易纠纷解决方式</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >15.1
+          本协议及其规则的有效性、履行和与本协议及其规则效力有关的所有事宜,将受中华人民共和国法律管辖,任何争议仅适用中华人民共和国法律。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >15.2
+          本平台有权受理并调处用户之间因承接服务产生的纠纷。因本平台非司法机关,您完全理解并承认,本平台对证据的鉴别能力及对纠纷的处理能力有限,调节纠纷完全是基于用户委托,不保证处理结果符合用户的期望,本平台有权决定是否参与争议的调处。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >15.3
+          凡因履行本协议及其规则发生的纠纷以及在本平台上接洽服务产生的所有纠纷,各方可协商解决,若协商不成的,</span
+        ><span style=""
+          >双方就本协议所发生的及/或与本协议相关的争议,均提交本平台所在地仲裁委员会调解中心按照其调解规则进行调解。不愿调解或者调解不成时,均提交深圳仲裁委员会依据其现行有效的仲裁规则进行仲裁。【个人信息使用授权书约定的争议解决方式为法院诉,建议两份材料保持一致】</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >15.4
+          用户已知悉并确认:对于因用户使用本平台争议引起的纠纷,仲裁机构可以通过手机短信或电子邮件等现代通讯方式送达法律文书;指定接收法律文书的手机号码或电子邮箱为用户注册时输入的手机号码或电子邮箱;仲裁机构可采取一种或多种送达方式送达法律文书,送达时间以上述送达方式中最先送达的为准;上述送达方式适用于各个仲裁阶段;用户保证送达地址准确、有效,如果提供的地址不确切,或者不及时告知变更后的地址,使法律文书无法送达或未及时送达,自行承担由此可能产生的法律后果。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第16条 完整协议</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >16.1
+          本协议由本协议条款与本平台公示的各项规则组成,相关名词可互相引用参照,如有不同理解,以本协议条款为准。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >16.2
+          用户一旦确认对本协议理解和认同,即对本协议所有组成部分的内容理解并认同,一旦用户使用本平台提供的服务,即受本协议所有组成部分的约束。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第17条 协议修改及解释</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >17.1
+          本协议内容包括本协议条款及平台不时发布或组织订立的各类协议、平台规则和公告。所有签署内容均为本协议不可分割的组成部分,与本协议正文具有同等法律效力。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">17.2 修改与更新:</span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >中国生物有权根据法律法规变化、维护平台交易秩序、保护用户合法权益的需要,在必要时修改本协议(包括适时制定并发布其他政策、规则、公告声明),当您登陆本平台时会自动弹出变更后的协议,若您同意变更后的内容,请点击“同意”按钮并继续登陆本平台使用平台服务,若您不同意变更后的内容,您将无法使用本平台服务,同时应及时与平台客服取得联系,本平台将根据情况审核确认给予您一定的时限完成您账户下尚未完结的事项,在已有业务全部完结且在本平台项下财务结清后休眠您的账户,但此期间您将无法继续开展新的业务。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第18条 通知与送达</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">18.1 </span><span style="font-weight: bold">有效联系方式</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >您在注册成为本平台用户并接受本平台服务时,您应该向本平台提供真实有效的联系方式(包括您的电子邮件地址、联系电话、联系地址等),对于联系方式发生变更的,您有义务及时更新有关信息,并保持可被联系的状态。您在注册本平台用户时生成的用于登陆本平台接收站内信、系统消息的用户账号,也作为您的有效联系方式。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >本平台将向您的上述联系方式的其中之一或其中若干向您送达各类通知,而此类通知的内容可能对您的权利义务产生重大的有利或不利影响,请您务必及时关注。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >您有权通过您注册时填写的手机号码或者电子邮箱获取您感兴趣的商品广告信息、促销优惠等商业性信息;您如果不愿意接收此类信息,您有权通过本平台提供的相应的退订功能进行退订。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">18.2 </span><span style="font-weight: bold">通知与送达</span>
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >本平台通过上述联系方式向您发出通知,其中以电子的方式发出的书面通知,包括但不限于在本平台公告,向您提供的联系电话发送手机短信,向您提供的电子邮件地址发送电子邮件,向您的账号发送系统消息以及站内信息,在发送成功后即视为送达;以纸质载体发出的书面通知,按照提供联系地址交邮后的第五个自然日即视为送达。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >对于在本平台上因交易活动引起的任何纠纷,您同意司法机关(包括但不限于人民法院)可以通过手机短信、电子邮件等现代通讯方式或邮寄方式向您送达法律文书(包括但不限于诉讼文书)。您指定接收法律文书的手机号码、电子邮箱等联系方式为您在平台注册、更新时提供的手机号码、电子邮箱联系方式以及在注册用户时生成的用户账号,司法机关向上述联系方式发出法律文书即视为送达。您指定的邮寄地址为您的法定联系地址或您提供的有效联系地址。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >您同意司法机关可采取以上一种或多种送达方式向您达法律文书,司法机关采取多种方式向您送达法律文书,送达时间以上述送达方式中最先送达的为准。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >您同意上述送达方式适用于各个司法程序阶段。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 0pt;
+          margin-bottom: 0pt;
+          text-indent: 21.2pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold; text-decoration: underline"
+          >你应当保证所提供的联系方式是准确、有效的,并进行实时更新。如果因提供的联系方式不确切,或不及时告知变更后的联系方式,使法律文书无法送达或未及时送达,由您自行承担由此可能产生的法律后果。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第19条 附则</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">19.1 </span
+        ><span style="font-weight: bold; text-decoration: underline"
+          >用户在注册或使用前应认真阅读本协议的全部内容,如对协议有任何疑问,可向中国生物咨询。本协议对注册成功之后的用户产生法律约束力,届时用户不得以未阅读本协议内容或未获得本平台对问题的解答等为由,主张本协议无效或要求撤销本协议。</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">19.2 本协议服务期限自本协议生效之日起至用户账户休眠之日止。</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">19.3 本协议的最终解释权归中国生物所有。</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          line-height: 150%;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="font-weight: bold">第20条 联系中国生物</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style=""
+          >如果您有任何的疑问、投诉、意见和建议,欢迎您与中国生物沟通反馈。中国生物的联系方式见下:</span
+        >
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">客服邮箱:yxhg2024@sinopharm.com</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 21pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">联系地址:北京市朝阳区双桥路乙2号院2号楼</span>
+      </p>
+      <p
+        style="
+          margin-top: 7.8pt;
+          margin-bottom: 7.8pt;
+          text-indent: 15.75pt;
+          text-align: justify;
+          widows: 0;
+          orphans: 0;
+          font-size: 10.5pt;
+        "
+      >
+        <span style="">(正文完)</span>
+      </p>
+      <div style="-aw-headerfooter-type: footer-primary">
+        <p style="margin-top: 0pt; margin-bottom: 0pt; widows: 0; orphans: 0; font-size: 9pt">
+          <span style="height: 0pt; display: block; position: absolute; z-index: -65536"></span
+          ><span style="font-family: Calibri">&nbsp;</span>
+        </p>
+      </div>
+    </div>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'platformUsers'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+</style>

+ 385 - 0
src/pages-sub-packages/agreement/privacyPolicy.vue

@@ -0,0 +1,385 @@
+<!--
+ * @desc 隐私权政策
+-->
+
+<template>
+  <view class="pl20 pr20">
+    <p class="title mt20 bold-text tc">中国生物隐私权政策</p>
+    <p class="bold-text">本版生效日期:【2024】年【10】月【14】日</p>
+    <p class="bold-text">概述</p>
+    <p class="bold-text">
+      中国生物技术股份有限公司及其附属、关联公司(以下称“中国生物”或“我们”)非常注重保护用户(“您”)的个人信息及隐私,我们深知个人信息对您的重要性,并将按照法律法规要求和业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。我们将通过本政策向您说明中国生物会如何收集、存储、保护、使用及对外提供您的信息,并说明您享有的权利。其中要点如下:
+    </p>
+    <p class="bold-text">
+      1.为了便于您了解您在使用我们的服务时,我们需要收集的信息类型与用途,我们将结合具体服务向您逐一说明。
+    </p>
+    <p class="bold-text">2.为了向您提供服务所需,我们会按照合法、正当、必要的原则收集您的信息。</p>
+    <p class="bold-text">
+      3.如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意或确认第三方已经征得您的同意。
+    </p>
+    <p class="bold-text">
+      4.如果为了向您提供服务而需要从第三方获取您的信息,我们将要求第三方说明信息来源,并要求第三方保障其提供信息的合法性;如果我们开展业务需进行的个人信息处理活动超出您原本向第三方提供个人信息时的授权范围,我们将征得您的明确同意。
+    </p>
+    <p class="bold-text">
+      5.您可以通过本政策介绍的方式访问和管理您的信息、设置隐私功能、注销中国生物账户或进行投诉举报。
+    </p>
+    <p class="bold-text">您可以根据以下索引阅读相应章节,进一步了解本政策的具体约定:</p>
+    <p class="bold-text">一、我们如何收集和使用您的个人信息</p>
+    <p class="bold-text">二、我们如何使用Cookie、Beacon、Proxy等技术</p>
+    <p class="bold-text">三、我们如何存储和保护信息</p>
+    <p class="bold-text">四、我们如何共享、转让、公开披露您的信息</p>
+    <p class="bold-text">五、您如何管理您的信息</p>
+    <p class="bold-text">六、对第三方责任的声明</p>
+    <p class="bold-text">七、我们如何保护未成年人的信息</p>
+    <p class="bold-text">八、本政策的适用及更新</p>
+    <p class="bold-text">九、本政策中关键词说明</p>
+    <p>
+      <span class="bold-text">中国生物技术股份有限公司</span>
+      (注册地址:北京市朝阳区双桥路乙2号院2号楼;客服邮箱:yxhg2024@sinopharm.com)尊重并保护您的隐私。您使用我们的服务时,我们将按照中国生物隐私权政策(以下简称“本政策”)收集、存储、使用及对外提供您的信息。同时,我们会通过本政策向您说明,我们如何为您提供访问、更新、管理和保护您的信息的服务。
+      <text class="bold-text"
+        >本政策与您使用我们的服务关系紧密,我们建议您仔细阅读并理解本政策全部内容,做出您认为适当的选择。我们努力用通俗易懂、简明扼要的文字表达,并对本政策中与您的权益存在重大关系的条款和个人信息,采用粗体字进行标注以提示您注意。</text
+      >
+    </p>
+    <p>
+      为了遵守国家法律法规及监管规定(例如:进行实名制管理、履行反洗钱职责、安全管理),也为了向您提供服务及提升服务质量,我们需要收集、存储、使用及对外提供您的信息。您同意我们按照本政策约定处理您的信息,以便您享受优质、便捷、个性化的服务,同时更好地保护您的账户安全。
+    </p>
+    <p class="bold-text">一、我们如何收集和使用您的个人信息</p>
+    <p>在您使用我们的产品/服务时,您需要/可以选择授权我们收集和使用个人信息的场景包括:</p>
+    <p>
+      1.为了向您提供我们产品/服务的基本功能,您需要授权我们收集、使用必要信息的情形,如您拒绝提供前述必要信息,您将无法正常使用我们的产品/服务;
+    </p>
+    <p>
+      2.为了向您提供我们产品/服务的拓展功能,您可以选择授权我们收集、使用信息的情形,如您拒绝提供前述信息,您将无法正常使用相关附加功能或无法实现我们拟达到的功能效果,但并不会影响您正常使用我们产品/服务的基本功能。
+    </p>
+    <p>3.以下需要/选择授权场景内容如果有变动,我们将按实际情况进行调整。</p>
+    <p class="bold-text">(一)您需要授权我们收集和使用个人信息的场景</p>
+    <p class="bold-text">
+      我们会遵循正当、合法、必要的原则,出于本政策所述的下列目的收集和使用您的个人信息。
+    </p>
+    <p class="bold-text">1.帮助您成为我们的用户</p>
+    <p>
+      为遵守法律法规的要求,以及向您提供更个性化、更便捷的服务,在您注册成为中国生物用户时,您需要<text
+        class="bold-text"
+        >至少提供手机号码以创建中国生物账号;</text
+      >如果您仅需使用浏览、搜索等功能,您无需注册成为我们的用户以及提供上述信息。在提供账号信息的过程中,如果您愿意额外补充如下个人信息,将有助于我们向您提供更为个性化的服务:包括您的姓名、身份证号、头像、个性签名等。如果您不提供该等信息,不会影响您享受中国生物产品/服务的基本功能。
+    </p>
+    <p class="bold-text">2. 门诊数据收集</p>
+    <p>
+      当您在中国生物小程序(即营销行为管理小助手)上进行门诊数据收集证据链上传时,您需要
+      <text class="bold-text"
+        >提供关联执行包信息、标题、调研类型、调查时间、所属地区、位置打卡、数据情况上传、调研总结等。</text
+      >
+    </p>
+    <p class="bold-text">3.市场信息收集</p>
+    <p>
+      当您在中国生物小程序(即营销行为管理小助手)上进行市场信息收集证据链上传时,您需要
+      <text class="bold-text"
+        >提供关联执行包信息、调研主题、调研对象、信息类型、调研时间、所属地区、调研文件上传、调研总结等。</text
+      >
+    </p>
+    <p class="bold-text">4. 库存数据收集</p>
+    <p>
+      当您在中国生物小程序(即营销行为管理小助手)上进行库存数据收集证据链上传时,您需要
+      <text class="bold-text"
+        >提供关联执行包信息、调查类别、标题、调查对象、库存数量、调研时间、所属地区、位置打卡、库存情况上传、调研总结等。</text
+      >
+    </p>
+    <p class="bold-text">5. 医学警戒信息收集</p>
+    <p>
+      当您在中国生物小程序(即营销行为管理小助手)上进行医学警戒信息收集证据链上传时,您需要
+      <text class="bold-text"
+        >提供关联执行包信息、标题、调查类型、调查时间、所属地区、调查情况上传、调查总结等。</text
+      >
+    </p>
+    <p class="bold-text">6. 问卷信息收集</p>
+    <p>
+      当您在中国生物小程序(即营销行为管理小助手)上进行问卷信息收集证据链上传时,您需要
+      <text class="bold-text"
+        >提供关联执行包信息、问卷标题、调研对象、调查时间、所属地区、位置打卡、调查问卷上传、调查总结等。</text
+      >
+    </p>
+
+    <p class="bold-text">7. 产品相册分享</p>
+    <p>
+      当您在中国生物小程序(即营销行为管理小助手)上进行产品相册分享时,您需要
+      <text class="bold-text">提供关联执行包信息、分享文章的标题、转发时间等。</text
+      >其中,转发分享过程中,中国生物小程序(即营销行为管理小助手)会自动唤起并跳转微信转发界面。中国生物不会获取此界面的微信好友或者微信群信息,也不会获取您转发分享该文章的对象信息。
+    </p>
+
+    <p class="bold-text">8. 学术信息交流</p>
+    <p>
+      当您在中国生物小程序(即营销行为管理小助手)上进行学术文章分享时,您需要
+      <text class="bold-text">提供关联执行包信息、分享文章的标题、转发时间等。</text
+      >其中,转发分享过程中,中国生物小程序(即营销行为管理小助手)会自动唤起并跳转微信转发界面。中国生物不会获取此界面的微信好友或者微信群信息,也不会获取您转发分享该文章的对象信息。
+    </p>
+
+    <p class="bold-text">9. 众包广场</p>
+    <p>
+      您可以通过众包广场查看领取进度,包括审核通过、审核未通过、已终止,全部收回、已终止,剩余收回等。同时,当您领取的某个执行包任务全部完成、上级机构审核通过后,您可以通过“工作台-众包广场-已领取-该执行包-执行包详情-导出报告”导出该执行包对应的报告。
+    </p>
+
+    <p class="bold-text">10. 意见反馈</p>
+    <p>
+      我们<span class="bold-text"
+        >会收集您通过“我的-意见反馈”提交的意见反馈、您与客服团队联系时提供的信息及您参与问卷调查时向我们发送的信息。</span
+      >
+    </p>
+    <p class="bold-text">11. 执行包自动提交审核</p>
+    <span class="bold-text"
+      >当您使用中国生物小程序进行学术拜访服务、门诊数据收集、市场信息收集、库存数据收集、医学警戒信息管理、问卷信息收集、学术会议服务、线上学术会议、健康教育课堂、产品相册分享、学术信息交流等任务时,我们会收集您提交的任务信息,自动汇总到关联执行包,并传给您绑定的上级机构进行审核。</span
+    >同时,执行包任务审核详情在上级机构管理员审核时实时回传给您,您通过按执行包途径,即“接包记录-该执行包-任务列表”,看到各项任务审核情况,或者通过按单个任务“我的-任务完成记录”看到该任务审核情况。
+
+    <p class="bold-text">(二)您可以选择授权我们收集和使用个人信息的场景</p>
+
+    <p>
+      为向您提供个性化的服务,您可以选择使用我们提供的拓展功能,我们会在符合法律规定并根据您具体授权的情况下收集并使用如下信息。这类信息将在您选择的具体功能和业务场景中进行收集,如果您不提供这些信息,不会影响您使用中国生物的基本功能。
+    </p>
+
+    <p class="bold-text">12. 学术会议服务</p>
+    <p>
+      当您在中国生物小程序上进行学术会议服务证据链上传时,
+      <text class="bold-text"
+        >您需要提供关联执行包信息、会议主题、会议时间、会议时长、区县专家人数、会议报告、会议议程、会议签到表、现场照片、会议邀请函、企业批复证明、会议总结。其中,针对会议报告、会议议程、会议签到表、现场照片、会议邀请函、企业批复证明,需要您授权使用拍照功能或者从手机相册选择照片。</text
+      >
+      如果您愿意,可以额外补充如下信息:会议人次、位置打卡(需要您授权在使用小程序期间获取位置信息)、外采费用。
+    </p>
+    <p class="bold-text">13. 线上学术会议</p>
+    <p>
+      当您在中国生物小程序上进行线上学术会议服务证据链上传时,
+      <text class="bold-text"
+        >您需要提供关联执行包信息、会议主题、预约会议编号、会议时间、会议时长、会议人次、会议议程、会议内容、线上会议截图、参会人列表截图、企业批复证明、会议总结。其中,针对会议议程、会议内容、线上会议截图、参会人列表截图、企业批复证明,需要您授权使用拍照功能或者从手机相册选择照片。</text
+      >
+    </p>
+    <p class="bold-text">14. 健康教育课堂</p>
+    <p>
+      当您在中国生物小程序上进行健康教育课堂证据链上传时,
+      <text class="bold-text"
+        >您需要提供关联执行包信息、培训主题、培训时间、主讲人、会议人次、位置打卡、培训总结、培训议程、现场照片、培训内容、培训总结。其中,针对培训总结、培训议程、现场照片、培训内容,需要您授权使用拍照功能或者从手机相册选择照片。</text
+      >
+    </p>
+    <p class="bold-text">15. 学术拜访服务</p>
+    <p>
+      当您在中国生物小程序上进行学术拜访服务证据链上传时,
+      <text class="bold-text">您需要授权在使用小程序期间获取位置信息。</text>
+      进行专业拜访和专项拜访证据链上传时,
+      <text class="bold-text"
+        >您需要提供关联执行包信息、拜访类型、拜访对象、拜访主题、提纲/报告、现场照片、拜访总结。其中,针对提纲/报告、现场照片,需要您授权使用拍照功能或者从手机相册选择照片。</text
+      >
+    </p>
+
+    <p class="bold-text">(三)征得同意的例外</p>
+    <p class="bold-text">请您知悉,以下情形中,我们收集、使用个人信息无需征得您的授权同意:</p>
+    <p>(1)与国家安全、国防安全直接相关的;</p>
+    <p>(2)与公共安全、公共卫生、重大公共利益直接相关的;</p>
+    <p>(3)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
+    <p>(4)出于维护您或他人的生命、财产等重大合法权益目的但又很难得到您本人同意的;</p>
+    <p>(5)所收集的个人信息是您自行向社会公众公开的;</p>
+    <p>(6)从合法公开披露的信息中收集个人信息,例如:合法的新闻报道、政府信息公开等渠道;</p>
+    <p>(7)根据您的要求签订和履行合同所必需的;</p>
+    <p>(8)用于维护所提供的服务的安全稳定运行所必需的,例如:发现、处置商品或服务的故障;</p>
+    <p>(9)法律法规规定的其他情形。</p>
+    <p class="bold-text">
+      请注意,单独或与其他信息相结合无法识别您的身份或者与您直接建立联系的信息,不属于个人信息。如果我们将单独无法与任何特定个人建立联系的信息与其他信息结合用于识别自然人个人身份,或者将其与个人信息结合使用,则在结合使用期间,此类信息将被视为个人信息。
+    </p>
+    <p class="bold-text">(四)个人信息的使用规则</p>
+    <p>
+      为满足您的个性化需求,维护、改进我们的产品或服务质量,我们会在符合法律规定并根据您具体授权的情况下使用如下信息:
+    </p>
+    <p class="bold-text">
+      1.
+      我们可能会收集您的任务信息、浏览及转发信息,以及将您在中国生物上使用某项服务中提供的信息与来自其他服务中的信息结合起来,进行综合统计、分析,用来在日常维护过程中对您使用的疑问提出建议方案。包括通过电话进行回访、向您提供信息咨询等服务或邀请您参与服务、产品或功能有关的客户调研。
+    </p>
+    <p>
+      2.
+      我们可能会收集您在参与产品/服务调查时主动向我们提供的信息,以及您与我们的关联方、合作伙伴之间互动时提供的相关信息,以便于您追踪订单情况、发起用户投诉以及我们优化客户服务的质量与流程。
+    </p>
+    <p>
+      3.
+      我们可能将业务中收集的个人信息用于统计分析和改进运营,将已经去标识化无法识别您身份且不能复原的信息用于建立数据库并进行商业化利用。例如为改进我们系统而进行的技术改造、网络维护、故障排除、内部政策与流程制定、生成内部报告等。
+    </p>
+    <p>
+      4.
+      【当我们展示您的个人信息时,我们会采用包括内容替换、匿名处理方式对您的信息进行脱敏展示,以保护您的信息安全。】
+    </p>
+    <p class="bold-text">二、我们如何使用Cookie、Beacon、Proxy等技术</p>
+    <p>
+      为使您获得更轻松的访问体验,您使用中国生物提供的服务时,我们可能会通过小型数据文件识别您的身份,这么做可帮您省去重复输入注册信息的步骤,或者帮助判断您的账户安全状态。这些数据文件可能是Cookie,FlashCookie,您的应用程序提供的其他本地存储(以下简称“Cookie”)。
+      <text class="bold-text">请您理解,我们的某些服务只能通过使用Cookie才可得到实现。</text>
+    </p>
+    <p class="bold-text">
+      我们中国生物系统上还可能包含一些电子图像(以下简称“网络Beacon”),使用网络Beacon可以帮助网站计算浏览网页的用户或访问某些Cookie,我们会通过网络Beacon收集您浏览网页活动的信息(您访问的页面地址、您先前访问的援引页面的位置、您的浏览环境以及显示设定)。
+    </p>
+    <p class="bold-text">
+      如您通过我们的微信小程序,使用了由第三方而非中国生物提供的服务时,为尽力确保您的账号安全,使您获得更安全的访问体验,我们可能会使用专用的网络协议及代理技术(以下简称“Proxy技术”)。使用Proxy技术,可以帮助您识别到我们已知的高风险站点,减少由此引起的钓鱼、账号泄露等风险,同时更有利于保障您和第三方的共同权益,阻止不法分子篡改您和您希望访问的第三方之间正常服务内容,包括:不安全路由器、非法基站等引起的广告注入、非法内容篡改。在此过程中,我们也可能会获得和保存您设备的IP地址、硬件ID以及您访问的页面位置。
+    </p>
+    <p class="bold-text">三、我们如何存储和保护信息</p>
+    <p class="bold-text">(一)存储地点</p>
+    <p>
+      我们在<text class="bold-text">中华人民共和国境内</text
+      >运营中收集和产生的个人信息,将存储在中国境内。<text class="bold-text"
+        >目前我们不存在向境外传输境内收集的相关个人信息的场景。如果将来涉及向境外传输境内收集的相关个人信息,我们将明确向您告知个人信息出境的目的、接收方、安全保障措施等情况,并另行征得您的同意。</text
+      >
+    </p>
+    <p class="bold-text">(二)存储期限</p>
+    <p>
+      我们<text class="bold-text">仅在本政策所述目的所必需期间和法律法规及监管规定的时限内保存</text
+      >您的个人信息。我们判断个人信息的存储期限主要参考以下标准并以其中较长者为准:
+    </p>
+    <p>1. 完成与您相关的交易目的、维护相应交易及业务记录,以应对您可能的查询或投诉;</p>
+    <p>2. 保证我们为您提供服务的安全和质量;</p>
+    <p>3. 您是否同意更长的留存期间;</p>
+    <p>4. 是否存在关于保留期限的其他特别约定或法律法规规定。</p>
+    <p>
+      当前我们存储期限为【5】年,如果相关法律法规长于该存储期限,以相关法律法规规定的期限保存为准。在超出保留期间后,我们会根据适用法律的要求删除您的个人信息,或使其匿名化处理。
+    </p>
+    <p>
+      在您终止使用中国生物服务后,我们会停止对您的信息的收集和使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。
+    </p>
+    <p class="bold-text">(三)个人信息的保护措施</p>
+    <p>1. 数据安全措施</p>
+    <p>
+      为保障您的信息安全,我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息。中国生物通过信息接触者保密协议、监控机制来对数据进行全面安全控制。防止您的个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。
+    </p>
+    <p>2. 安全事件</p>
+    <p>
+      在不幸发生个人信息安全事件后,我们会立即成立专项应急小组,启动应急预案,防止安全事件扩大,并按照法律法规的要求及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
+    </p>
+    <p class="bold-text">
+      请您知悉并理解,互联网并非绝对安全的环境,您务必妥善保管好您的中国生物登录账号及登录时系统向您发送的验证码。如您发现自己的个人信息泄密,尤其是您的账户或密码发生泄露,请您立即根据本隐私政策中提供的联系方式联络我们,以便我们采取相应措施。
+    </p>
+    <p class="bold-text">四、我们如何共享、转让、公开披露您的信息</p>
+    <p class="bold-text">(一)共享</p>
+    <p>
+      我们承诺对您的信息进行严格保密。除法律法规及监管部门另有规定外,我们仅在以下情形中与第三方共享您的信息,第三方包括合作金融机构、其他合作伙伴。如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施,并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意,或确认第三方已经征得您的同意。
+    </p>
+    <p>
+      1.
+      为了让您完成交易、实现交易目的,我们需要向您的交易相关方提供相关业务证据链信息,同时您的交易相关方可在证据链审核、付款过程中或付款成功后查看您的全部证据链信息以及部分个人信息;
+    </p>
+    <p>
+      2. 某些产品或服务可能由第三方提供或由我们与第三方共同提供,因此,<text class="bold-text"
+        >只有共享您的信息,才能提供您需要的产品或服务;</text
+      >
+    </p>
+    <p class="bold-text">(二)转让</p>
+    <p>我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
+    <p>1. 在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息;</p>
+    <p>2. 根据法律法规或强制性的行政或司法要求;</p>
+    <p>
+      3.
+      在平台发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息接收主体变更,我们会要求新的持有您个人信息的公司、组织继续受本政策的约束,且不变更本政策项下约定的处理目的和处理方式,否则我们将要求该公司、组织重新向您征求授权同意。
+    </p>
+    <p class="bold-text">(三)公开披露</p>
+    <p>
+      我们仅会在以下情况下,且采取符合业界标准的安全防护措施的前提下,才可能公开披露您的个人信息:
+    </p>
+    <p>1. 根据您的需求,在您明确同意的披露方式下披露您所指定的个人信息;</p>
+    <p>
+      2.
+      根据法律、法规的要求、强制性的行政执法或司法要求所必须提供您个人信息的情况下,我们可能会依据所要求的个人信息类型和披露方式公开披露您的个人信息。在符合法律法规的前提下,当我们收到上述披露信息的请求时,我们会要求必须出具与之相应的法律文件,如传票或调查函。
+    </p>
+    <p class="bold-text">(四)共享、转让、公开披露个人信息时事先征得授权同意的例外</p>
+    <p>
+      根据相关法律法规规定,以下情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:
+    </p>
+    <p>1. 与我们履行法律法规规定的义务相关的;</p>
+    <p>2. 与国家安全、国防安全直接相关的;</p>
+    <p>3. 与公共安全、公共卫生、重大公共利益直接相关的;</p>
+    <p>4. 与犯罪侦查、起诉、审判和判决执行等司法或行政执法直接相关的;</p>
+    <p>5. 出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</p>
+    <p>6. 您自行向社会公众公开的个人信息;</p>
+    <p>
+      7. 从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。
+      根据法律规定,共享、转让、公开披露经去标识化处理的个人信息,且确保数据接收方无法复原并重新识别个人信息主体的,我们对此类数据的处理将无需另行向您通知并征得您的同意。
+    </p>
+    <p class="bold-text">五、您如何管理您的信息</p>
+    <p>您对您的个人信息享有以下权利:</p>
+    <p class="bold-text">(一)您有权访问、更正、删除您的个人信息,法律法规规定的例外情况除外。</p>
+    <p>您可以通过以下方式管理您的信息:</p>
+    <p>
+      账户信息——您可以通过“我的-个人名片”访问个人资料及账号信息。若您已经通过身份认证,您的身份认证信息将无法进行更改,如姓名、身份证号。您的手机号作为您的登录账号,无法进行更改。角色和绑定上级机构(即公司名称)是我们后台按照您或者相关方提供的信息进行后台配置,如若您发现有错误信息,可通过本隐私政策联系方式与我们进行联系,进行纠正处理。
+    </p>
+    <p class="bold-text">(二)改变您授权同意的范围或撤回授权</p>
+    <p>
+      您可以在中国生物小程序通过“右上角胶囊按钮-左边三个点-设置”中开通、关闭位置信息和相册(包含拍照)功能权限。其中,当您不允许我们获取您位置信息后,您将无法使用中国生物小程序中涉及需要使用到定位信息的功能,如无法通过客户拜访进行打卡、无法在进行会议举办任务时位置打卡等。如果您关闭相册功能权限,您将无法使用中国生物小程序中涉及使用相册或拍照的部分功能,如上传会议方案、会议签到表、现场照片等。您如果拒绝前述的授权提供,仅影响部分相关功能,但不影响您正常使用中国生物小程序其他功能。
+    </p>
+    <p class="bold-text">(三)注销账户</p>
+    <p>
+      您有权注销您的中国生物账户,您可以通过“我的-意见反馈”、我们的客服或者根据本隐私政策中提供的联系方式联络我们,帮助您办理注销账户。当您符合账户注销条件并注销中国生物账户后,我们将根据法律法规的要求尽快删除您的个人信息或作匿名化处理,我们将不会再收集、使用或对外提供与该账户相关的个人信息,但您在使用中国生物服务期间提供或产生的信息我们仍需按照前述第三条第二款“存储期限”进行保存,且在该存储期限内依法配合有权机关的查询。
+    </p>
+    <p class="bold-text">(四)响应您的上述请求</p>
+    <p class="bold-text">
+      为保障您的账户安全,您向我们提出上述请求时,我们可能会先要求您验证您的身份(如要求您提供书面请求或其他方式),然后再处理您的请求。
+    </p>
+    <p>
+      对于您向我们提出的上述请求,我们将在15个工作日内做出答复。如您不满意我们的答复,还可以通过本隐私政策中提供的联系方式发起投诉。
+    </p>
+    <p>
+      对于您合理的请求,我们原则上不收取费用,<text class="bold-text"
+        >但对多次重复、超出合理限度的请求,我们将酌情收取一定费用。对于与您的身份不直接关联的信息、无合理理由重复申请的信息,或者需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者不切实际的请求,我们可能会予以拒绝。</text
+      >
+    </p>
+    <p class="bold-text">在以下情形中,按照法律法规要求,我们将无法响应您的请求:</p>
+    <p class="bold-text">1. 与我们履行法律法规规定的义务相关的;</p>
+    <p class="bold-text">2. 与国家安全、国防安全直接相关的;</p>
+    <p class="bold-text">3. 与公共安全、公共卫生、重大公共利益直接相关的;</p>
+    <p class="bold-text">4. 与刑事犯罪侦查、起诉、审判和执行判决等直接相关的;</p>
+    <p class="bold-text">5. 有充分证据表明个人信息主体存在主观恶意或滥用权利的;</p>
+    <p class="bold-text">
+      6. 出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人授权同意的;
+    </p>
+    <p class="bold-text">7. 响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;</p>
+    <p class="bold-text">8. 涉及商业秘密的。</p>
+    <p class="bold-text">六、对第三方责任的声明</p>
+
+    <p class="bold-text">
+      请您注意,您的交易相对方、通过中国生物小程序接入的第三方服务和由中国生物处接收您的个人信息的第三方可能有自己的隐私权保护政策;当您查看第三方创建的网页或使用第三方开发的应用程序时,这些第三方可能会放置他们自己的Cookie或网络Beacon,这些Cookie或网络Beacon不受我们的控制,且它们的使用不受本政策的约束。我们会努力去要求这些主体对您的个人信息采取保护措施,建议您与他们联系以获得关于他们的隐私权政策的详细情况。如您发现这些第三方创建的网页或第三方开发的应用程序存在风险时,建议您终止相关操作以保护您的合法权益。
+    </p>
+    <p class="bold-text">七、我们如何保护未成年人的信息</p>
+    <p>我们的中国生物小程序和服务面向成人。</p>
+    <p class="bold-text">八、本政策的适用及更新</p>
+    <p class="bold-text">
+      中国生物所有服务均适用本政策,除非相关服务已有独立的隐私权政策或相应的用户服务协议当中存在特殊约定。
+    </p>
+    <p class="bold-text">发生下列重大变化情形时,我们会适时对本政策进行更新:</p>
+    <p class="bold-text">1. 我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
+    <p class="bold-text">2. 收集、存储、使用个人信息的范围、目的、规则发生变化;</p>
+    <p class="bold-text">3. 对外提供个人信息的对象、范围、目的发生变化;</p>
+    <p class="bold-text">4. 您访问和管理个人信息的方式发生变化;</p>
+    <p class="bold-text">5. 数据安全能力、信息安全风险发生变化;</p>
+    <p class="bold-text">6. 用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
+    <p class="bold-text">7. 其他可能对您的个人信息权益产生重大影响的变化。</p>
+    <p class="bold-text">
+      由于中国生物的用户较多,如本政策发生更新,我们将以微信小程序推送通知、弹窗提示、发送短消息或者在中国生物官方网站发布公告的方式来通知您。如您在本政策更新生效后继续使用中国生物服务,即表示您已充分阅读、理解并接受更新后的政策并愿意受更新后的政策约束。
+    </p>
+    <p class="bold-text">九、本政策中关键词说明</p>
+    <p class="bold-text">
+      1.
+      个人信息:指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。本隐私政策中可能涉及到的个人信息包括但不限于:个人基本信息(包括姓名、电话号码、生日等);个人身份信息(包括身份证);网络身份标识信息(包括系统账号);个人财产信息(包括银行账号、交易记录以及虚拟财产信息等);个人上网记录(包括网站浏览记录、点击记录等);个人设备信息(包括唯一设备识别码等描述个人常用设备基本情况的信息);个人位置信息(包括行踪轨迹、精准定位信息等)。
+    </p>
+    <p class="bold-text">
+      2.
+      个人敏感信息:是指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息。本隐私政策中可能涉及到的个人敏感信息包括:个人身份认证信息(包括身份证、护照等);个人财产信息(银行账号、交易记录以及虚拟财产信息等);其他信息(行踪轨迹、通讯录信息等);14周岁以下的儿童信息。
+    </p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'policy'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+</style>

+ 224 - 0
src/pages-sub-packages/agreement/taxhelper.vue

@@ -0,0 +1,224 @@
+<!--
+ * @desc 税邦云协议模板(共享经济个体合作协议)
+ * @author linyuanjie
+ * @date 2022/3/30
+-->
+
+<template>
+  <view class="pl20 pr20 pb20">
+    <p class="title mt20 mb20 bold-text tc">共享经济个体合作协议</p>
+    <p>
+      《共享经济个体合作协议》(以下简称“本协议”)为永州市罗数云科技有限责任公司(以下简称“永州罗数云”或“我们”)与您(即本协议项下的个体经营者)签订的合作协议。感谢您选择我们为您提供共享经济综合服务,我们将依托综合实力竭诚为您提供规范、专业的服务。
+    </p>
+    <p class="underline-bold">特别提示:</p>
+    <p class="underline-bold">
+      您是为<text class="yellow-bgc">【】</text
+      >(以下称“企业客户”)提供与您的技能或您从事生产经营活动的经营范围相符服务的个体经营者,向您提供服务前,已默认您已取得提供的生产经营活动所必须的相关资质。我们将按照我们与企业客户签署的《共享经济综合服务协议》及本协议的约定,在您为企业客户提供服务完成后向您结算生产经营收入并代您办理相关涉税事务。
+    </p>
+    <p class="underline-bold">
+      您与企业客户系适用《中华人民共和国民法典》合同编相关法律规定约束的平等主体之间的合作关系,您提供服务前确认您的年龄符合要求(18-75周岁),不是企业客户(含关联方)的法定代表人、股东、董事、监事或其近亲属等,与企业客户及其关联企业之间不存在劳动/劳务合同关系或其他类似的劳动人事法律关系。如您不同意上述规定,请不要勾选同意本协议;一经发现您违反上述规定的,我们有权上报税务机关或/及其他相关国家机关,由税务机关或/及其他相关国家机关根据《中华人民共和国税收征收管理法》及其他相关法律法规的规定追究相关责任主体及您的法律责任。
+    </p>
+    <p class="underline-bold">
+      为维护您的自身权益,在您通过点击勾选同意本协议之前,请务必审慎阅读、充分理解本协议各条款内容。本协议中凡涉及粗体、斜体或下划线标识的条款,您均应重点阅读。阅读过程中,如您不同意本协议的任意内容,请您立即停止任何的申请/注册/签署程序,不要点击勾选同意或以其他方式进行后续操作,并请停止使用我们的服务;当您按照提示填写您的个人信息、阅读并同意本协议且完成全部注册申请确认,点击勾选同意或以其他方式确认本协议,即表示您已充分阅读、理解并同意接受本协议的全部内容。本协议自您点击勾选同意或以其他方式确认本协议时依法成立并生效,对您和我们即具有法律约束力。此后您不得以未阅读/不理解本协议内容或类似言辞做任何形式的抗辩。
+    </p>
+    <p class="underline-bold">
+      我们有权随时根据法律法规、政策、经营需要、业务发展等对本协议条款内容进行修订,或发布新的规则,或在未另行约定情况下,将我们在本合作协议项下的权利与义务转由我们指定的其他关联企业或其他合作伙伴行使与承继,相关变更将在罗格税邦云网站(网址:www.taxhelper.cn/contract-p4)予以公布,我们将不单独向您发出通知,您有责任登录罗格税邦云网站并知悉所有相关变更或通知。如您不同意相关变更,请立即停止使用服务,书面通知我们终止本协议,并同时注销账户信息。任何修订、新规则及提供服务方的变更一经公布即自动生效,成为本协议的一部分。如您继续执行协议,则表示您知悉并接受经修订后的协议。
+    </p>
+    <p>鉴于:</p>
+    <p>
+      我们通过永州市罗数云科技有限责任公司共享经济综合服务平台(以下简称“永州罗数云”)为诸多企业客户提供共享经济综合服务;您系我们为企业客户筛选、匹配的个体经营者,能满足企业客户的商业需求,为企业客户提供服务。您与我们将依据《中华人民共和国民法典》合同编及相关法律法规的规定,本着平等、自愿、诚信的原则,在平等互利的基础上签署本协议。
+    </p>
+    <p class="bold-text">第一条 定义</p>
+    <p>除非本协议中另有定义,下列词语应具有以下特定涵义:</p>
+    <p>
+      <text class="bold-text">1、关联方:</text
+      >指相互间直接或间接持有其中一方的股权/股份总和达到25%或以上的;或者直接或间接同为第三者所拥有或控制股权/股份达到25%或以上的。如果一方通过中间方对另一方间接持有股权/股份,只要其对中间方持股比例达到25%以上,则其对另一方的持股比例按照中间方对另一方的持股比例计算;两个以上具有夫妻、直系血亲、兄弟姐妹以及其他抚养、赡养关系的自然人共同持股同一企业,在判定关联关系时持股比例合并计算。
+    </p>
+    <p>
+      <text class="bold-text">2、个体经营者:</text
+      >指自我雇佣、自我管理、自担成本、自负盈亏并通过永州罗数云从事合法合规生产经营活动的个体。
+    </p>
+    <p>
+      <text class="bold-text">3、生产经营收入(税后):</text
+      >指您为企业客户提供服务并获得生产经营活动而获取的税后收入。
+    </p>
+    <p>
+      <text class="bold-text">4、服务费:</text
+      >指由我们向企业客户提供共享经济综合服务,我们就该等服务向企业客户收取的费用。
+    </p>
+    <p><text class="bold-text">5、身份标识:</text>指能够证明您本人身份的凭证,具体如下:</p>
+    <p>5.1您为中国公民且持有有效《中华人民共和国居民身份证》的,为居民身份证(简称“身份证”);</p>
+    <p>5.2您为华侨且没有居民身份证的,为有效的《中华人民共和国护照》和华侨身份证明;</p>
+    <p>5.3您为港澳居民的,为有效《港澳居民来往内地通行证》或《中华人民共和国港澳居民居住证》;</p>
+    <p>5.4您为台湾居民的,为有效的《台湾居民来往大陆通行证》或《中华人民共和国台湾居民居住证》;</p>
+    <p>
+      5.5您为持有有效《中华人民共和国外国人永久居留身份证》的外籍个人的,为永久居留证和外国护照;未持有永久居留证但持有有效《中华人民共和国外国人工作许可证》的,为工作许可证和外国护照;其他外籍个人,为有效的外国护照。
+    </p>
+    <p><text class="bold-text">6、罗格税邦云系统:</text>一套可以提供信息化服务和支持的系统。</p>
+    <p class="bold-text">第二条 合作内容</p>
+    <p>
+      1、我们依据与企业客户签署的《共享经济综合服务协议》的约定,依托共享经济资源向企业客户筛选并推荐您为企业客户提供相应服务,并按照企业客户业务规则查询、接受服务需求、履行服务过程中的相关义务并享有相关权利等。
+    </p>
+    <p>
+      2、<text class="bold-text"
+        >您委托我们(我们及我们指定的代为办理本款约定的委托事宜的必要方,本款内均作如上指代)代理您办理工商登记/税务登记/临时税务登记、申报纳税、发票(领用、开具、代开)、工商注销、税务注销等相关事宜,同意按照有关税收法律法规、政策规定及管辖主管税务机关的要求由我们代征或受您委托代缴相关税费款项,并同意在为您办理相关事宜时依法向办理事项对应的国家机关(包含但不限于市场监督局、主管税务机关等)出示本协议,您无需另行出具授权委托书。</text
+      >除特别约定外,我们代理申报缴纳您的生产经营所得相关税费时,有权从应付您的合作费用中扣除相关税费总额。
+    </p>
+    <p>
+      3、您应是自我雇佣、自我管理、自担成本、自负盈亏的个体经营者。<text class="bold-text"
+        >我们为使您满足企业客户业务需求而向您提供的服务,不导致我们与您之间构成劳动/劳务关系,我们不承担您任何社保福利待遇,也不承担您的任何医疗保险费用,且我们对您违反法律法规的行为不承担任何法律责任。</text
+      >
+    </p>
+    <p>4、我们服务的对象仅限于从事合法合规生产经营活动的个体。</p>
+    <p class="bold-text">第三条 服务费的结算及支付方式</p>
+    <p>
+      1、根据我们与企业客户签署的《共享经济综合服务协议》的约定,我们有权向企业客户就所提供的共享经济综合服务收取服务费,其中,服务费金额涵盖基于您为企业客户提供服务而取得的生产经营活动的收入。我们收到企业客户支付的服务费后,将依据企业客户提供的您所提供服务的数量、质效标准及考核结果核算您的生产经营收入(税后)并支付予您。<text
+        class="bold-text"
+        >如发生企业客户拖欠服务费情形,我们有权暂缓支付您的生产经营收入(税后),直至企业客户足额支付服务费。您同意为我们向企业客户追讨服务费提供相应之配合及协助。</text
+      >
+    </p>
+    <p>
+      2、<text class="bold-text"
+        >您应自行负担就您取得的生产经营收入需缴纳的各项税款,应我们要求,您应提供与相关税费申报缴纳相关的协助及信息。如果您拒绝提供相关协助或信息,我们有权暂缓支付生产经营收入(税后)。</text
+      >
+    </p>
+    <p class="bold-text">第四条 您的权利与义务</p>
+    <p class="bold-text">
+      1、您保证签署本协议时具有完全民事权利能力和民事行为能力,并满足所有履行本协议所需的法定条件或约定条件,保证为企业客户提供生产经营活动时,遵照其业务规则并自备所需要的设备设施、自行承担必要费用,如因您个人原因造成您自己或任意第三方损害的(包括但不限于人身、财产损害等),由您自行承担全部法律责任。
+    </p>
+    <p class="bold-text">2、您保证为企业客户提供的生产经营活动是以您自己名义进行的。</p>
+    <p>
+      <text class="bold-text"
+        >3、您保证在生产经营活动过程中遵守国家法律法规,不得从事违反法律或行政法规等行为(包括但不限于涉嫌洗钱、偷税、漏税、逃税等)及其他不得使用我们服务的行为(包括但不限于您为企业客户提供活动的特点、性质不符合本协议第二条约定的服务范围的情形),</text
+      >我们/企业客户主管税务机关或/及其他相关国家机关介入调查时,您应当予以协助并如实反映情况,不得阻挠、拒绝调查。
+    </p>
+    <p class="bold-text">4、您充分理解个体经营者的定义,并承诺不存在下列所述情形:</p>
+    <p class="bold-text">4.1与企业客户具有劳动/劳务合同关系或其他类似的劳动人事法律关系;</p>
+    <p class="bold-text">4.2为企业客户的法定代表人、股东、董事、监事;</p>
+    <p class="bold-text">4.3为企业客户的法定代表人、股东、董事、监事的近亲属;</p>
+    <p>4.4年龄不符合要求(应为18-75周岁);</p>
+    <p class="bold-text">4.5 外籍人士(加入中国以外国家的国籍);</p>
+    <p>4.6根据相关法律规定不适用于本协议第二条第3款范围规定的其他人员。</p>
+    <p>
+      <text class="bold-text"
+        >您保证向我们提供的信息均是真实的、有效的、合法的,如信息发生变更(如不再是个体经营者身份)应及时通知我们。</text
+      >您的账户信息以您实名提交至企业客户平台后台或您自行提交的信息为准,且您保证该账户为纳税义务人所有。自我们将应支付的生产经营收入(税后)支付至您的账户之日起,视为您收到前述费用。<text
+        class="bold-text"
+        >如因您提供信息有误等导致付款失败的,由您自行承担相应责任。</text
+      >您承诺您所提供的账户应符合中华人民共和国法律的规定,如果我们收到主管税务机关或/及其他相关国家机关任何调查请求的,您应提供协助并如实反映情况。
+    </p>
+    <p>
+      您保证向同创众盈提供的信息均是真实的、有效的、合法的,如信息发生变更(如不再是个体经营者身份)应及时通知同创众盈。您的账户信息以您实名提交至企业客户平台后台的信息为准,且您保证该账户为纳税义务人所有。自同创众盈将应支付的生产经营收入(税后)支付至您的账户之日起,视为您收到前述费用。如因您提供信息有误等导致付款失败的,由您自行承担相应责任。您承诺您所提供的账户应符合中华人民共和国法律的规定,如果同创众盈收到同创众盈主管税务机关或/及其他相关国家机关任何调查请求的,您应提供协助并如实反映情况。
+    </p>
+    <p class="bold-text">
+      5、您所使用的唯一身份标识仅限本人使用,因您泄露或提供给他人使用该等身份标识而造成的不利后果,由您自行承担。
+    </p>
+    <p class="bold-text">
+      6、您同意我们为实现本协议合作之目的,在为您提供服务的过程中收集使用您的一些必要的个人信息,如姓名、身份证件信息、联系方式、常住地址、银行账户信息、人脸信息及其他因提供的不同类别的生产经营活动履行本协议义务而必要之信息,并依法用于合理用途(如身份验证、客户服务、存档备份、参与调查、数据统计、数据分析或数据加工等处理、业绩展示/宣传等)。除法律法规规定外,未经您的同意,我们将不会擅自披露、改变或以其他方式使用您的个人信息。若您认为我们存在违反前述范围使用该等个人信息的,应立即与我们进行联系,我们将及时核实处理。
+    </p>
+    <p class="bold-text">
+      7、虚构生产经营活动或伪造、变造生产经营活动的相关证明材料将涉嫌构成虚开发票或虚开增值税专用发票的刑事犯罪,可能承担拘役、有期徒刑及罚金的刑事责任。您承诺您从事的生产经营活动是真实的,亦未从事涉嫌违反法律及行政法规的行为(包括但不限于虚开发票、洗钱、逃税、传销、赌博等)。
+    </p>
+    <p class="bold-text">
+      8、销售收入、直播带货收入、财产转让(含股权转让)收入、财产租赁收入、高管薪酬、利息股息红利、依劳动/劳务合同关系取得的收入等不属于本协议定义的生产经营收入范围,您承诺您取得生产经营收入不属于上述范围。
+    </p>
+    <p>9、您确认您提供服务的范围需要获取相关资质的,您已符合条件。</p>
+    <p class="bold-text">第五条 我们的权利与义务</p>
+    <p>
+      1、我们有权根据企业客户的业务需求以及企业客户安排的服务内容,就您提供的生产经营活动制定相应的服务标准细则,您应遵守前述服务标准细则。我们有权敦促您不得违背相关法律法规和前述服务标准细则,但该等敦促为平等主体之间为实现合同目的的敦促,适用《中华人民共和国民法典》合同编等相关法律法规的规定。
+    </p>
+    <p class="bold-text">
+      2、我们在向您支付生产经营收入(税后)时,我们(我们及我们指定的代为办理本款约定的委托事宜的必要方,本款内均作如上指代)代理您办理工商登记/税务登记/临时税务登记、申报缴税、发票(领用、开具、代开)、工商注销、税务注销等相关事宜,并同意按照有关税收法律法规、政策规定及管辖主管税务机关的要求由我们代征或受您委托代缴相关税费款项,并在为您办理相关事宜时依法向主管税务机关出示本协议。
+    </p>
+    <p class="bold-text">
+      3、我们发现您违反本协议第四条第4款之约定的,有权立即终止履行本协议,并向税务机关报告,您应自行承担由此产生的税务相关的处罚责任(包括但不限于根据税务机关的要求补缴相应的税款、滞纳金、罚金等)。
+    </p>
+    <p class="bold-text">
+      4、我们可以为实现本次合作内容从企业客户/您处收集、留存并合法使用您的个人信息,我们(含其股东、董事、监事、高级管理人员及其顾问)承诺对您所披露的个人信息进行保密,未经您授权或基于合法并可执行的法律、法规、法院命令、监管机构的要求或为遵守适用法律法规、履行网络安全保护义务或应对网络安全事件的需要进行披露,或为履行本协议之需要委托给我们的关联企业或者合作伙伴进行处理之外,我们(含其股东、董事、监事、高级管理人员及其顾问)不会将您的个人信息披露给任意第三方。我们承诺按照相关法律法规的要求对您的个人信息履行安全保护义务,保障网络免受干扰、破坏或未经授权的访问,防止网络数据泄露或被窃取、篡改。
+    </p>
+    <p>
+      5、我们因网络服务的特殊性需短时间中断服务对系统进行维护和升级,您理解并认可前述行为不属于我们违约情形。
+    </p>
+    <p>6、如企业客户与您之间另有服务或其他约定安排的,我们就未参与的安排不承担任何义务。</p>
+    <p class="bold-text">
+      7、我们向您提供服务前,已默认您已取得提供的生产经营活动所必须的相关资质,因未取得承接业务所需相应资质的风险由您自行承担。
+    </p>
+    <p class="bold-text">
+      8、我们仅就企业客户之委托事项为您提供共享经济综合服务,非经我们办理的工商登记/税务登记/临时税务登记及相关涉税事项不在我们的服务范围内,发生补税相关风险由您自行承担。
+    </p>
+    <p class="bold-text">
+      9、如我们受两个及以上企业客户委托同时为您提供共享经济综合服务,且您在企业客户处取得的累计生产经营收入经综合汇算后需要补税的,因此产生的补税责任及风险由您自行承担。
+    </p>
+    <p class="bold-text">第六条 违约责任</p>
+    <p>
+      1、除本协议另有约定外,本协议任意一方不履行或不完全履行本协议约定的义务和承诺即构成违约。违约方应当负责赔偿其违约行为给守约方造成的一切经济损失(本协议所称“经济损失”均指包括但不限于守约方遭受的损失以及因此支出的律师费、诉讼费、仲裁费、保全费、诉讼财产保全责任保险费、担保费、执行费、公证费、鉴定费、审计费、评估费、差旅费、复印费等合理费用)。
+    </p>
+    <p class="bold-text">
+      2、因政府行为(包括但不限于因中国政府机关不授予或调整我们相应经营资质或权利)或其他不可抗力因素导致本协议部分条款或全部条款无法履行的,遭受该行为的一方不承担违约责任。
+    </p>
+    <p class="bold-text">
+      3、因企业客户拖欠服务费导致我们暂缓支付您的生产经营收入(税后),将不视为我们的违约行为。
+    </p>
+    <p class="bold-text">第七条 协议效力及保密责任</p>
+    <p>
+      1、本协议任意一方应对本协议所涉及的所有内容以及协议双方在执行本协议过程中相关的法律、商业、合作业务的所有信息进行保密。除经对方允许或基于合法并可执行的法律、法规、法院命令、监管机构的要求或为遵守适用法律法规、履行网络安全保护义务或应对网络安全事件的需要所进行披露,或为履行本协议之需要委托给我们的关联企业或者合作伙伴进行处理之外,均不得向任意第三方披露。我们基于融资/资本运作需要可向投资方及其雇员、顾问披露本协议及与您有关的相关信息,但我们应与该投资方及其雇员、顾问签署保密协议,使该投资方及其雇员、顾问承担与我们相同的保密义务。
+    </p>
+    <p>2、保密期限应为:自协议生效之日起至协议终止后十年。</p>
+    <p class="bold-text">第八条 协议的终止</p>
+    <p>
+      1、自您点击勾选同意或以其他方式确认本协议时依法成立并生效,本协议有效期与我们与企业客户签署的《共享经济综合服务协议》的协议有效期保持一致。
+    </p>
+    <p>2、发生以下情形时,本协议终止并解除:</p>
+    <p class="bold-text">
+      2.1
+      任何一方提前30日书面通知对方要求终止协议的,但您要求终止协议应事先获得企业客户的同意并不得影响企业客户的运营;
+    </p>
+    <p class="bold-text">
+      2.2一方违反协议约定,且违约方在非违约方书面通知后15日内仍未予改正的,非违约方可以书面通知的形式终止本协议;
+    </p>
+    <p class="bold-text">
+      2.3
+      您如未能达到企业客户的要求,我们在工作验收时将给予警告;此后如仍发生类似情况的,我们可提前终止本协议;
+    </p>
+    <p class="bold-text">2.4 我们发现您存在违反第四条任一情形的;</p>
+    <p class="bold-text">
+      2.5
+      企业客户与我们签署的《共享经济综合服务协议》被解除或终止,导致本协议无法继续履行的,本协议自动终止。
+    </p>
+    <p class="bold-text">
+      2.6
+      我们发布新的新规则或变更协议条款后,您不同意相关变更,书面通知我们解除协议,并同时注销账户信息的。
+    </p>
+    <p>3、本协议的提前终止或解除不影响已经产生的权利义务关系。</p>
+    <p class="bold-text">
+      4、您应遵守本协议约定及相关法律法规的规定,我们有权自主判断您的行为是否违约或/及违规。如我们有合理理由或有证据认定您违反本协议或相关法律法规的,有权在不事先通知的情况下,限制、停止或取消您使用我们服务的资格。
+    </p>
+    <p class="bold-text">第八条 协议的终止</p>
+    <p>
+      本协议的订立、执行、解释和争议的解决均应适用中华人民共和国法律。凡因本协议引起的或与本协议有关的任何争议,协议双方应友好协商解决。如不能协商解决,任何一方可提交至北京市海淀区人民法院诉讼解决。
+    </p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'taxhelper'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+.yellow-bgc {
+  background-color: yellow;
+}
+</style>

+ 187 - 0
src/pages-sub-packages/agreement/xintaizi.vue

@@ -0,0 +1,187 @@
+<!--
+ * @desc 薪泰梓
+ * @author linyuanjie
+ * @date 2022/4/20
+-->
+
+<template>
+  <view class="pl20 pr20 pb20">
+    <p class="title mt20 mb20 bold-text tc">河南薪泰梓信息科技有限公司</p>
+    <p class="title mt20 mb20 bold-text tc">与</p>
+    <p class="title mt20 mb20 bold-text tc">自由职业者</p>
+    <p class="title mt20 mb20 bold-text tc">共享经济综合服务协议</p>
+    <p>甲 方:河南薪泰梓信息科技有限公司(以下简称“甲方”)</p>
+    <p>乙 方: (以下简称“乙方”)</p>
+    <p>证件号码:</p>
+    <p>联系电话:</p>
+    <p>联系邮箱:</p>
+    <p>(在本协议下,甲方和乙方统称为“双方”,或各自被称为“各方”或“一方”。)</p>
+    <p><text class="underline-bold">特别提示:</text></p>
+    <p class="underline-bold">
+      针对获得生产经营所得的自由职业者在使用本协议项下甲方(还包括甲方指定的合作方、关联方及其他分支机构,下同)提供的共享经济综合服务时,甲方承诺依法纳税、确保自然纳税人取得税后的合法收入。
+    </p>
+    <p class="underline-bold">
+      军人、公职人员等国家法律法规和纪律规定禁止从事兼职或经商的人员,严禁使用本协议项下甲方提供的共享经济综合服务。
+    </p>
+    <p class="underline-bold">
+      公司雇员等其他与公司具有劳动/劳务合同关系、或其他类似的劳动人事法律关系并从与其有前述关系的公司取得工资薪金所得的人员,严禁使用本协议项下甲方提供的共享经济综合服务;该类人员因从事生产经营而从非与其有前述关系的企、事业单位所取得的生产经营所得,甲方可为其提供本协议项下的共享经济综合服务。
+    </p>
+    <p class="underline-bold">
+      公司法定代表人、股东、董事、监事等从公司取得收入的高管人员,一律严禁使用本协议项下甲方提供的共享经济综合服务;该类人员因从事生产经营而从非与其有前述关系的企、事业单位所取得的生产经营所得,甲方同样不可为其提供本协议项下的共享经济综合服务。
+    </p>
+    <p class="underline-bold">一经发现有上述任一行为的,乙方应自行承担相关法律责任。</p>
+    <p class="underline-bold">
+      上述“公司”特指与乙方建立业务关系并提供相应生产经营活动的公司,乙方与其他公司之间的法律关系不受上述条款约束(公司法定代表人、股东、董事、监事等从公司取得收入的高管人员除外)。
+    </p>
+    <p>
+      依据《中华人民共和国税收征收管理法》及其细则、《中华人民共和国民法典》、《中华人民共和国发票管理办法》、《委托代征管理办法》等相关法律法规的规定,甲乙双方经协商一致,达成协议如下:
+    </p>
+    <p class="bold-text">1、定义</p>
+    <p>
+      1.1.
+      甲方系国内注册成立的科技公司,通过阿拉钉系统平台为自由职业者提供账户搭建与管理、交易管理及撮合、交易合同签订与存证、订单管理与查询、信息咨询及管理等其他现代服务,基于该等经济管理服务及经济业务往来,接受乙方委托,为乙方提供共享经济综合服务。
+    </p>
+    <p>
+      1.2.
+      乙方系具有完全的民事行为能力且具备相应专业技能及许可(如有)的自由职业者,接受甲方(包括甲方指定的合作方、关联方及其他分支机构,下同)提供的共享经济综合服务,与甲方或甲方企业客户之间建立业务关系并提供相应的生产经营活动。乙方承诺作为服务提供者,应遵守国家相关法律法规及行业规范,按照甲方与企业客户的业务具体要求完成服务内容,履行生产经营活动过程中的相关义务并享有相关权利。
+    </p>
+    <p>
+      1.3.阿拉钉系统平台:是由甲方合作方研发及运营维护的一套综合云服务平台,具备电子协议签署、电子数据存证、账户管理、交易管理、订单管理与查询等各项技术服务能力。
+    </p>
+    <p class="bold-text">2、合作内容</p>
+    <p>
+      2.1.乙方应自行负担就其生产经营所得需缴纳的各项税款及行政收费(如有),甲方及甲方指定的合作方、关联方及其他分支机构按照有关税收政策规定及相关主管税务机关的要求,接受乙方委托协助其向主管税务机关缴纳或代征前述税费。
+    </p>
+    <p>
+      2.2.甲方及甲方指定的合作方、关联方及其他分支机构接受乙方委托,通过本协议项下的服务将乙方生产经营所得完税后的金额发放至乙方,并接受乙方委托由甲方或主管税务机关代开增值税普通发票。
+    </p>
+    <p class="bold-text">3、甲方权利义务</p>
+    <p>3.1.甲方有权就乙方提供的生产经营活动制定相应规则及标准,乙方应当遵守。</p>
+    <p>
+      3.2.甲方协助乙方获取生产经营所得时,应当按照有关税收政策规定及主管税务机关授予的代征权限向乙方代征个人所得税等各项税款及行政收费(如有),或协助乙方按照有关税收政策规定及主管税务机关的要求缴纳个人所得税等各项税款及行政收费(如有)。
+    </p>
+    <p>
+      3.3.甲方有权对乙方提供的信息进行验证,但该等验证行为并不意味着甲方对乙方信息的真实性、有效性、合法性、完整性负责,也并不因此减轻或免除乙方的任何义务或责任。
+    </p>
+    <p>
+      3.4.甲方发现乙方违反相关法律法规或本协议规定的,甲方有权中止本协议。乙方应自行承担由此产生的税务相关的处罚责任,包括但不限于根据税务机关的要求补缴相应的税款、滞纳金等。
+    </p>
+    <p>3.5.甲方承诺对乙方所披露的个人隐私信息进行保密。</p>
+    <p>
+      3.6.甲方可以留存为实现本次合作内容从乙方处获取的乙方个人信息。但是,未经乙方授权,甲方不得将乙方个人信息披露给任何第三方。
+    </p>
+    <p>
+      3.7.甲方承诺将按照相关法律法规的要求,对从乙方处获得的乙方个人信息履行安全保护义务,保障网络免受干扰、破坏或未经授权的访问,防止网络数据泄露或被窃取、篡改。
+    </p>
+    <p>3.8.如乙方与其客户之间如有非因本协议产生的争议或纠纷的,与甲方无关,甲方不承担任何责任。</p>
+    <p>
+      3.9.甲方向乙方提供本协议项下服务在任何情况下均不得被理解为与乙方之间建立或存在劳动/劳务合同关系、或其他类似的劳动人事法律关系。
+    </p>
+    <p class="bold-text">4、乙方权利义务</p>
+    <p>
+      4.1.乙方保证提供的个人信息等均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。同时,乙方知悉并确认,当且仅当其通过了甲方系统或甲方合作的第三方系统的实名认证后,方能享有本协议项下的服务。
+    </p>
+    <p>
+      4.2.乙方保证提供各项业务往来信息,包括但不限于业务合作协议、相关补充协议及业务结算单等,均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。
+    </p>
+    <p>
+      4.3.乙方有义务向甲方提供与生产经营所得相对应的收入凭据,并保证其均是真实的、有效的、合法的、完整的,如信息变更应当及时通知甲方,与此有关的全部法律责任由乙方承担。
+    </p>
+    <p>
+      4.4.乙方有义务自行保护账户信息的安全,任何通过乙方账户进行的操作均将被视为乙方的真实意思表示,相应责任均由乙方自行承担。
+    </p>
+    <p>4.5.乙方承诺与其客户之间不具有下列关系:</p>
+    <p>1)与客户具有劳动/劳务合同关系、或其他类似的劳动人事法律关系;</p>
+    <p>2)与客户的关联企业具有劳动/劳务合同关系、或其他类似的劳动人事法律关系;</p>
+    <p>3)为客户及其关联企业或其他企业的法定代表人、董事、监事、股东等高管人员;</p>
+    <p>4)其他不适用于本协议适用范围之规定的人员关系。</p>
+    <p>
+      4.6.乙方发现甲方违反法律、行政法规的规定或者双方的约定收集、使用其个人信息的,有权要求其删除其个人信息;发现甲方收集、存储的其个人信息有错误的,有权要求其予以更正。甲方应当采取措施予以删除或者更正。
+    </p>
+    <p>
+      4.7.乙方保证活动过程中遵守国家法律法规,因乙方个人原因造成其个人或任何第三方损害的责任,由乙方承担全部法律责任。
+    </p>
+    <p>4.8.乙方不得申请代开以下发票:</p>
+    <p>1)凡带有抵扣功能的普通发票;</p>
+    <p>2)非税务部门管理的经营收入。</p>
+    <p>
+      4.9.乙方承诺应当基于真实业务交易向甲方申请代开或委托甲方由税务机关代开相应发票并提供真实、准确、完整的开票信息,否则若乙方违反该承诺造成的相关法律责任及损失由乙方自行承担,若由此造成甲方损失或被相关行政机关处罚的,乙方应当承担赔偿责任。
+    </p>
+    <p>
+      4.10.乙方不得从事违反法律及行政法规等行为,如洗钱、偷税漏税及其他甲方认为不得使用甲方服务的行为等。
+    </p>
+    <p>
+      4.11.乙方确认,其具有完全民事权利能力及完全民事行为能力,所有业务合作均为其真实意愿,且遵守国家法律法规及行业监管要求并满足所有履行本协议所需的法定条件或约定条件。
+    </p>
+    <p>4.12.乙方确认,已知晓其生产经营所得的计算方式及结算周期。</p>
+    <p>
+      4.13.乙方可自行在企业客户处查询生产经营所得的计算方式、结算周期、支付途径等信息,如有异议,可直接与企业客户沟通,甲方可在必要时提供相关协助。
+    </p>
+    <p>
+      4.14.
+      乙方委托授权甲方,根据乙方的委托及主管税务机关规定的或授予的委托代征范围、期限,及税种、税率等,依法代理乙方缴纳相关税费或代征乙方相关税费的事宜,各地主管税务机关的具体规定可能不一致。同时,如遇国家或地方政府及主管税务机关政策变更的,甲方有权根据变更后的政策规定自动调整本协议项下的权利义务乃至终止本协议。
+    </p>
+    <p>
+      4.15.为便利业务的开展,根据实际业务情况,甲方可能会安排一家或多家合作方、关联方及/或分支机构作为实际业务提供方,为乙方提供本协议项下约定的服务,乙方对此知情并完全同意。同时,乙方同意授权并委托甲方为其申请数字证书,并签署所需的相关协议,但该协议应以不加重乙方的合同义务为限。
+    </p>
+    <p>
+      4.16.乙方知悉并同意,经数字证书签署后的电子合同,与乙方以纸质形式进行的签章具有同等法律效力,对乙方具有不可撤销的法律约束力。乙方不得以未签署纸质合同为由、或未实际操作数字证书等理由,否认该等电子合同的法律效力。
+    </p>
+    <p class="bold-text">5、保密条款</p>
+    <p>
+      5.1.本协议任何一方应对本协议所涉及的所有内容以及协议各方在执行本协议过程中相关的一切法律、商业、合作业务的所有资讯进行保密。未经对方允许,均不得向对方以外的任意第三方披露。
+    </p>
+    <p>5.2.保密期应为:协议的有效期内及协议终止之后的十年。</p>
+    <p class="bold-text">6、违约责任</p>
+    <p>
+      任何一方违反本协议约定,即构成该方的违约;除本协议另有规定外,违约方应向守约方承担违约责任,补偿守约方承受或遭致的所有损失、责任、赔偿金或费用(包括但不限于合理的律师费、诉讼费、公证费等)。
+    </p>
+    <p class="bold-text">7、其他</p>
+    <p>
+      7.1.在本协议的任意一方或双方未能及时行使本协议项下的权利不应被视为放弃该权利,也不影响该方在将来行使该权利。
+    </p>
+    <p>
+      7.2.本协议的订立、执行和解释及争议的解决均应适用中国法律。凡因本协议引起的或与本协议有关的任何争议,协议各方应友好协商解决。如不能协商解决,双方一致同意提交至北京仲裁委员会仲裁。
+    </p>
+    <p>
+      7.3.双方同意,在本协议签订后,如另有补充协议,该等补充协议及附件构成本协议不可分割的组成部分,具有同等法律效。
+    </p>
+    <p>
+      7.4.本协议项下各方声明、承诺和保证:本协议任何一方已披露签署和履行本协议所应当向另一方披露的全部信息,且披露内容真实、准确、无遗漏。协议各方同时声明和承诺:本协议的签署和履行不与本协议任何一方已经签署的协议或需承担的任何义务相冲突,且也不会对本协议任何一方以外的第三方形成任何法律和商业上的冲突。
+    </p>
+    <p>
+      7.5.除本协议另有约定外,在履行本协议过程中的一切通知,甲方将通过在阿拉钉系统平台向乙方发送平台消息的方式送达乙方,甲方将通知消息发出之时即视为甲方完成通知义务。
+    </p>
+    <p>
+      7.6.本协议经甲方盖章、乙方签字之日起生效,本协议有效期为壹年。协议到期后如双方均未以书面方式提出异议,则本协议有效期自动顺延壹年。本协议壹式贰份,甲乙双方各执壹份,每份具有同等法律效力。
+    </p>
+    <p>(以下无正文,仅为签署页)</p>
+    <p>甲方(盖章):</p>
+    <p>日期:</p>
+    <p>乙方(签字):</p>
+    <p>日期:</p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'xintaizi'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+.yellow-bgc {
+  background-color: yellow;
+}
+</style>

+ 225 - 0
src/pages-sub-packages/agreement/zhengqizhixing.vue

@@ -0,0 +1,225 @@
+<!--
+ * @desc 安之慧
+ * @author linyuanjie
+ * @date 2022/9/8
+-->
+
+<template>
+  <view class="pl20 pr20 pb20">
+    <p class="title mt20 mb20 bold-text tc">自由职业者灵活用工服务合作协议</p>
+    <p>感谢您与我司即【北京安之慧互联网科技有限公司】签署本《服务协议》(下称“本协议”)。</p>
+    <p>
+      【审慎阅读】为维护您的自身权益,在您点击同意/或书面签署本协议之前,请认真阅读本协议,务必审慎阅读、充分理解各条款内容,特别是权利义务条款、法律适用和管辖条款。上述条款以粗体及下划
+      线标识,您应重点阅读。
+    </p>
+    <p>
+      【签约】当您按照提示填写您的个人信息、阅读并同意本协议且完成全部申请/或书面签署后,即表示您已充分阅读、理解并接受本协议的全部内容,且与我司达成一致意见并成为我司的合作人员,此后您
+      不得以未阅读/不理解本协议内容或类似言辞做任何形式的抗辩。阅读本协议的过程中,如果您不同意本协议或其中任何条款约定,请您立即停止任何的申请/注册/或书面签署程序。
+    </p>
+    <p>
+      【合作关系】您与我司通过本协议建立的是平等主体之间的合作关系,适用《中华人民共和国民法典》
+      和其他民事法律,不适用《劳动合同法》。
+    </p>
+    <p class="bold-text">特别提示:</p>
+    <p class="bold-text">
+      针对获得生产经营所得的灵活用工人员在使用本协议项下甲方提供的灵活用工人员服务时,甲方承诺依法纳税、确保自然人纳税人取得税后的合法收入。
+    </p>
+    <p class="bold-text">
+      军人、公职人员等国家法律法规和政策规定禁止从事兼职或经商的人员,严禁使用本协议项下甲方提供的灵活用工人员服务。
+    </p>
+    <p class="bold-text">
+      公司雇员等其他与公司具有劳动/劳务合同关系、或其他类似的劳动人事法律关系并从与其有前述关
+      系的公司取得工资薪金所得的人员,严禁使用本协议项下甲方提供的灵活用工人员服务;该类人员因从事
+      生产经营而从非与其有前述关系的企、事业单位所取得的生产经营所得,甲方可为其提供本协议项下的灵活用工人员服务。
+    </p>
+    <p class="bold-text">
+      公司法定代表人、股东、董事、监事等其他从所属公司取得收入的人员,一律严禁使用本协议项下甲
+      方提供的灵活用工人员服务;该类人员因从事生产经营而从非与其有前述关系的企、事业单位所取得的生
+      产经营所得,甲方可为其提供本协议项下的灵活用工人员服务。
+    </p>
+    <p class="bold-text">
+      一经发现乙方涉嫌有上述任一行为的,甲方有权终止服务并上报税务机关及其他相关国家机关。税务机关及其他相关国家机关根据《中华人民共和国税收征收管理法》及其他相关法律法规的规定追究责任主体的法律责任。
+    </p>
+    <p class="bold-text">协议条款:</p>
+    <p>
+      根据国家法律有关规定,双方按照平等自愿诚实信用的原则,就我司与您建立灵活用工服务合作关系、
+      由您为我司合作单位提供服务事宜订立本服务合作协议。
+    </p>
+    <p class="bold-text">第一条 服务工作内容</p>
+    <p>
+      1.我司因承接第三方(即我司服务合作单位,后文称为”需方”)的灵活用工服务项目分包合作需
+      要,特选用您提供/完成相关服务,该等服务工作的内容主要为您按照需方及需方的项目发包方要求,提供灵活用工服务。
+    </p>
+    <p>2.您应按照我司的要求及需方的标准完成工作。</p>
+    <p class="bold-text">第二条 协议效力</p>
+    <p>
+      1.您的签约信息(包括您的姓名、身份证号等信息),以您提供的信息为准(包括但不限于线上提供或线下提供)。您承诺并保证您所提供的签约信息真实、准确,以免影响您和我司之间的《自由职业者灵活用工服务合作协议》效力。本协议条款若在我司授权的网站上发布,自您线上点击确认之日起生效。
+    </p>
+    <p>
+      2.本协议有效期限为两年。期限届满,双方应另行签署新的协议;若双方未签署新的协议,而以实
+      际行动继续合作的,视为双方同意协议期限顺延直至按照本协议约定终止或解除时为止。
+    </p>
+    <p>3.本协议在发生下列情形时自然终止:</p>
+    <p>3.1经需方事先同意的情况下,您主动退出服务的;</p>
+    <p>3.2需方终止或变更业务模式而不需要您继续履行本协议的;</p>
+    <p>3.3需方认为您不适合继续提供服务的;</p>
+    <p>3.4我司和需方解除合作的;</p>
+    <p>3.5其他原因导致本协议不再继续履行的。</p>
+    <p>您清楚并了解协议期限届满、协议终止,我司以及需方无需支付您任何补偿。</p>
+    <p class="bold-text">第三条 我司的权利和义务</p>
+    <p>
+      1.您应根据我司的安排为需方提供服务,服务期间您应遵守需方的官方要求及相关政策,需方可根
+      据自身的运营要求制定的具体工作安排,您应予遵守。
+    </p>
+    <p>2.我司将按需方的相关规定对您为需方提供服务的工作成果进行验收。</p>
+    <p>
+      3.我司应按约定及时向您支付费用。此处您应明确:您作为我司向需方输出的合作人员,在需方正
+      常向我司结算情况下,您的相关费用结算将由我司完成支付。
+    </p>
+    <p>
+      4.您同意,您不可撤销地授权我司和合作公司有权为提供前述费用结算服务的需要获取您的相关信息(包括但
+      不限于个人身份信息、实名登记手机号码、银行账户相关信息等),并将您的相关信息提交第三方机构进行
+      身份验证。若您提供任何错误、虚假、失效或不完整的资料,或者我司或合作公司有合理的理由怀疑资料为
+      错误、虚假、过期或不完整,我司或合作公司有权暂停或终止向您提供部分或全部服务,对此我司或合作公
+      司不承担任何责任,您承诺并同意负担因此所产生的所有损失,包括但不限于直接损失、间接损失。若因国
+      家法律法规、部门规章或监管机构的要求,我司或合作公司需要您补充提供任何相关资料时,如您不能及时
+      配合提供,我司或合作公司有权暂停或终止向您提供部分或全部服务。
+    </p>
+    <p class="bold-text">第四条 您的权利和义务</p>
+    <p>
+      1.您应按时尽责地完成我司以及需方要求的工作内容,并达到规定的质量标准,不得有侵犯他人知识产权、财产权、人身权、肖像权、隐私权、商业秘密或其他合法权益以及其他违反国家法律法规、国家
+      政策、或有悖于公序良俗的内容。
+    </p>
+    <p>
+      2.协议期内,您应在我司以及需方许可范围内使用本协议有关的商业信息;协议期内以及协议终止后,您均有义务对双方合作的有关协议及合作过程中知悉的我司、需方的相关信息予以保密,未经书面许
+      可,您不得以任何方式向其它方披露、给予或转让该等保密信息。否则,因此导致我司及/或需方或其关联公司的损失,由您负责赔偿。
+    </p>
+    <p>
+      3.除本协议事项外,您不能以我司及/或需方的名义开展任何与完成约定的工作任务无关的业务或活动。
+    </p>
+    <p>
+      4.本协议项下,您为需方提供灵活用工服务。您可根据需方提供的相关交付要求自由选择相应的物料和工具,但在服务过程中产生的任何费用支出需由您本人承担。
+    </p>
+    <p>
+      5.相关服务通过需方网络平台提供,或者需方相关网络平台备案,需方网络平台可能将要求您签署、
+      点击电子协议,您同意点击签署。您点击确认后该协议将对您产生法律效力。
+    </p>
+    <p>6.您不得发表有损我司以及需方的相关言论,不得从事违反法律法规以及社会道德等的相关行为。</p>
+    <p class="bold-text">第五条 服务报酬的支付</p>
+    <p>
+      1.我司将按照“合作政策与规则”向您支付服务报酬。由于您所提供的服务内容、服务质量、服务时长等情况的不同,该等服务报酬金额可能会呈现浮动,您清楚并了解该等浮动为正常情况。我司以人民
+      币形式向您支付服务报酬,您应缴纳的个人所得税及其他税费由我司负责代扣代缴。
+    </p>
+    <p>
+      2.我司的服务报酬将以银行卡转账/支付宝的方式直接支付到您提交的本人开户的银行卡/支付宝账户中,故您需向我司提供您的身份证信息,收款账户信息,我司将为您的以上信息进行严格的保护,如因
+      您以上信息提供不准确导致的服务报酬支付失败、错误,均由您自行承担。
+    </p>
+    <p>
+      3.因您与我司系就需方相关项目服务开展的服务合作关系,故我司不承担您任何劳保福利待遇,也
+      不负责您的任何医疗保险费用。
+    </p>
+    <p class="bold-text">第六条 违约责任</p>
+    <p>
+      1.双方应按本协议约定履行,如有违反,守约方有权要求对方及时改正;造成对方损失的,守约方
+      有权要求违约方赔偿。
+    </p>
+    <p>
+      2.因不可抗力造成损失的,彼此不负赔偿责任,但发生不可抗力一方应及时将有关情况通知另一方,
+      并尽最大努力进行补救。本协议所称不可抗力是指不能预见、不能克服并不能避免且对一方当事人造成重大影响的客观事件,包括但不限于自然灾害如洪水、地震、火灾和风暴等以及社会事件如战争、动乱、政府行为、黑客事件、大范围电信事故等。
+    </p>
+    <p class="bold-text">第七条 协议的终止</p>
+    <p>1.发生以下情形时,本协议终止:</p>
+    <p>
+      1.1协议期限届满或任何一方提前 30
+      日书面通知对方要求终止协议的,但您要求终止协议应事先获得需方的同意并不得影响需方的运营;
+    </p>
+    <p>
+      1.2一方违反协议约定,且违约方在非违约方书面通知后 15
+      日内仍未予改正的,非违约方可以书面通知的形式终止本协议;
+    </p>
+    <p>
+      1.3您如首次未能达到我司的要求,我司在工作验收时将给予警告;此后如仍发生类似情况的,我司
+      可提前终止本协议。
+    </p>
+    <p>1.4本协议的提前终止不影响已经产生的权利义务关系。</p>
+    <p class="bold-text">第八条 涉税事务委托授权</p>
+    <p>
+      您/本人委托我司即【北京安之慧互联网科技有限公司】代理本协议交易项下的涉税事务,包括帮助代缴税款
+      和开具完税证明。
+    </p>
+    <p>
+      您/本人确认我司即【北京安之慧互联网科技有限公司】根据本协议授权提交的相关申报资料和信息是真实、
+      完整、准确,和符合有关法律法规的。
+    </p>
+    <p class="bold-text">第九条 其他</p>
+    <p>
+      1.因履行本协议发生的纠纷,双方应友好协商解决,协商不成的,提请我司所在地人民法院诉讼解决。
+    </p>
+    <p>2.我司有权根据业务需要修改本协议条款。</p>
+    <p>3.如果法律政策等发生变化的,我司将根据法律法规政策进行调整,您/本人应当予以配合。</p>
+    <p>附件:平台企业对自然人注册会员的代开发票风险提醒模板</p>
+    <p>代开发票温馨提示</p>
+    <p>各注册会员:</p>
+    <p>为防范发票虚开风险,我们在为您提供优质服务的同时,温馨提示如下:</p>
+    <p>一、您对本次提供的开票信息真实性、完整性和准确性承担法律责任。</p>
+    <p>二、虚开发票的定义</p>
+    <p>《中华人民共和国发票管理办法》第二十二条规定: 任何单位和个人不得有下列虚开发票行为:</p>
+    <p>(一)为他人、为自己开具与实际经营业务情况不符的发票;</p>
+    <p>(二)让他人为自己开具与实际经营业务情况不符的发票;</p>
+    <p>(三)介绍他人开具与实际经营业务情况不符的发票。</p>
+    <p>三、虚开发票的后果</p>
+    <p>《中华人民共和国刑法》相关规定:</p>
+    <p>
+      第二百零五条
+      【虚开增值税专用发票、用于骗取出口退税、抵扣税款发票罪】虚开增值税专用发票或者虚开用于骗取出口退税、抵扣税款的其他发票的,处三年以下有期徒刑或者拘役,并处二万元以上二
+      十万元以下罚金;虚开的税款数额较大或者有其他严重情节的,处三年以上十年以下有期徒刑,并处五万
+      元以上五十万元以下罚金;虚开的税款数额巨大或者有其他特别严重情节的,处十年以上有期徒刑或者无
+      期徒刑,并处五万元以上五十万元以下罚金或者没收财产。
+    </p>
+    <p>
+      单位犯本条规定之罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员,处三年
+      以下有期徒刑或者拘役;虚开的税款数额较大或者有其他严重情节的,处三年以上十年以下有期徒刑;虚
+      开的税款数额巨大或者有其他特别严重情节的,处十年以上有期徒刑或者无期徒刑。
+    </p>
+    <p>
+      虚开增值税专用发票或者虚开用于骗取出口退税、抵扣税款的其他发票,是指有为他人虚开、为自己
+      虚开、让他人为自己虚开、介绍他人虚开行为之一的。
+    </p>
+    <p>
+      第二百零五条之一
+      【虚开发票罪】虚开本法第二百零五条规定以外的其他发票,情节严重的,处二年以下有期徒刑、拘役或者管制,并处罚金;情节特别严重的,处二年以上七年以下有期徒刑,并处罚金。
+    </p>
+    <p>
+      单位犯前款罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员,依照前款的规
+      定处罚。
+    </p>
+    <p>本人已阅读《代开发票温馨提示》,知悉相关法律规定,愿意承担相关法律责任。</p>
+    <p>甲方:北京安之慧互联网科技有限公司</p>
+    <p>年 月 日</p>
+    <p>乙方:</p>
+    <p>年 月 日</p>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'zhengqizhixing'
+}
+</script>
+
+<style lang="scss" scoped>
+p:not(.title) {
+  text-indent: 2em;
+  line-height: 1.5em;
+}
+.underline-bold {
+  text-decoration: underline;
+  font-weight: bold;
+}
+.bold-text {
+  font-weight: bold;
+}
+.yellow-bgc {
+  background-color: yellow;
+}
+</style>

+ 175 - 0
src/pages-sub-packages/get-task/component/cardItem.vue

@@ -0,0 +1,175 @@
+<template>
+  <view class="card-item" @click="detailClick">
+    <view class="title">
+      <view class="t-l">
+        <text>
+          {{ props!.item!.scorePackageName
+          }}{{ props!.item!.packageSn ? `(${props!.item!.packageSn})` : '' }}
+        </text>
+        <view class="tags">
+          <uv-tags
+            v-if="props!.item!.packageType1 === '1' || props!.item!.packageType1 === '6'"
+            size="mini"
+            borderColor="rgba(63, 163, 241, .1)"
+            bgColor="rgba(63, 163, 241, .1)"
+            text="积分值"
+            color="#3FA3F1"
+            plain
+          />
+          <uv-tags
+            v-if="props!.item!.packageType1 === '2'"
+            size="mini"
+            borderColor="rgba(76,217,100, .1)"
+            bgColor="rgba(76,217,100, .1)"
+            color="#4cd964"
+            text="任务量"
+            plain
+          />
+          <uv-tags
+            v-if="props!.item!.packageType1 === '3'"
+            size="mini"
+            borderColor="rgba(221,82,77, .1)"
+            bgColor="rgba(221,82,77, .1)"
+            color="#dd524d"
+            text="通用"
+            plain
+          />
+          <uv-tags
+            v-if="props!.item!.packageType1 === '4'"
+            size="mini"
+            borderColor="rgba(221,82,77, .1)"
+            bgColor="rgba(221,82,77, .1)"
+            color="#dd524d"
+            text="特定"
+            plain
+          />
+        </view>
+      </view>
+      <view class="t-r">
+        <view class="btn" v-if="props.type === '1'" @click.stop="getTaskClick">立即领取</view>
+        <view class="status" v-else-if="props.type === '2'">
+          <template v-if="props!.item!.enableType == '0' && props!.item!.status === '0'">
+            <view class="point" :style="{ background: '#eeeeee' }"></view>未领取
+          </template>
+          <template v-if="props!.item!.enableType == '0' && props!.item!.status === '1'">
+            <view class="point" :style="{ background: '#288AFF' }"></view>审核中
+          </template>
+          <template v-if="props!.item!.enableType == '0' && props!.item!.status === '2'">
+            <view class="point" :style="{ background: '#34C939' }"></view>申领审核通过
+          </template>
+          <template v-if="props!.item!.enableType == '0' && props!.item!.status === '3'">
+            <view class="point" :style="{ background: '#DF2E2B' }"></view>审核未通过
+          </template>
+          <template v-if="props!.item!.enableType == '1'">
+            <view class="point" :style="{ background: '#DF2E2B' }"></view>已终止,全部收回
+          </template>
+          <template v-if="props!.item!.enableType == '2'">
+            <view class="point" :style="{ background: '#DF2E2B' }"></view>已终止,剩余收回
+          </template>
+        </view>
+      </view>
+    </view>
+    <view class="content">
+      <view class="info-list">
+        <text>发包企业:{{ props!.item!.packageEntName }}</text>
+      </view>
+      <view class="info-list">
+        <text>需求人数:{{ props!.item!.userGetNum }}/{{ props!.item!.userNum }}</text>
+        <text>预计积分值:{{ props!.item!.score }}分</text>
+        <text v-if="props!.item!.taskNum">任务数:{{ props!.item!.taskNum }}个</text>
+      </view>
+      <view class="info-list">
+        <text>发布时间:{{ formatTime(props!.item!.createTime) }}</text>
+      </view>
+      <view class="info-list">
+        <text>需求描述:{{ props!.item!.description || '无' }}</text>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import formatTime from '@/utils/formatTime'
+import { defineEmits } from 'vue'
+
+const emit = defineEmits(['getTaskClick'])
+
+const props = defineProps({
+  item: Object,
+  type: String
+})
+
+const getTaskClick = () => {
+  emit('getTaskClick')
+}
+
+const detailClick = () => {
+  uni.navigateTo({
+    url: `/pages-sub-packages/get-task/detail?id=${props!.item!.id}`
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.card-item {
+  margin-bottom: 16rpx;
+  padding: 30rpx;
+  box-sizing: border-box;
+  background-color: #fff;
+  width: 690rpx;
+  min-height: 300rpx;
+  .title {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    .t-l {
+      flex: 1;
+      min-height: 56rpx;
+      .tags {
+        display: inline-block;
+        margin-left: 20rpx;
+      }
+    }
+
+    .t-r {
+      .btn {
+        margin-left: 20rpx;
+        width: 160rpx;
+        background: #6eb657;
+        border-radius: 200rpx;
+        text-align: center;
+        line-height: 56rpx;
+        color: #fff;
+        font-size: 28rpx;
+        font-weight: 500;
+      }
+      .status {
+        display: flex;
+        align-items: center;
+        color: #999;
+        font-size: 28rpx;
+        font-weight: 400;
+        .point {
+          line-height: 56rpx;
+          display: inline-block;
+          width: 10rpx;
+          height: 10rpx;
+          border-radius: 100%;
+          margin-right: 10rpx;
+        }
+      }
+    }
+  }
+  .content {
+    .info-list {
+      margin-bottom: 10rpx;
+      text {
+        font-size: 24rpx;
+        color: #999;
+        margin-right: 10rpx;
+        font-weight: 400;
+      }
+    }
+  }
+}
+</style>

+ 289 - 0
src/pages-sub-packages/get-task/detail.vue

@@ -0,0 +1,289 @@
+<template>
+  <view class="task-detail">
+    <view class="detail">
+      <view class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">执行包名称</text>
+          <text class="cell-desc">{{ taskDetail?.packageName }}</text>
+        </view>
+      </view>
+      <view class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">需求人数</text>
+          <text class="cell-desc">{{ taskDetail?.userNum }}</text>
+        </view>
+      </view>
+      <view v-if="taskDetail?.packageType1 === '1'" class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">执行包值</text>
+          <text class="cell-desc">{{ taskDetail?.score }}</text>
+        </view>
+      </view>
+      <view v-else class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">预计积分值</text>
+          <text class="cell-desc">{{ taskDetail?.score }}</text>
+        </view>
+      </view>
+      <view v-if="taskDetail?.packageType1 != '1'" class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">任务个数</text>
+          <text class="cell-desc">{{ taskDetail?.taskNum }}</text>
+        </view>
+      </view>
+      <view class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">起止日期</text>
+          <text class="cell-desc">{{ taskDetail?.termDate }}</text>
+        </view>
+      </view>
+      <view class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">发包企业</text>
+          <text class="cell-desc">{{ taskDetail?.packageEntName }}</text>
+        </view>
+      </view>
+      <view class="cell-row">
+        <view class="cell-row-box">
+          <text class="cell-title">发布日期</text>
+          <text class="cell-desc">{{ taskDetail?.createTime }}</text>
+        </view>
+      </view>
+      <view v-show="taskDetail?.exportFlag === '1'" class="cell-row">
+        <uv-button @click="exportFn()" :customStyle="customBtnStyle">导出报告</uv-button>
+      </view>
+    </view>
+    <view class="rules" v-if="rulesList?.length > 0">
+      <view class="rules-con">
+        <view class="r-title">任务完成情况:</view>
+        <view class="table">
+          <uni-table border stripe emptyText="暂无更多数据">
+            <!-- 表头行 -->
+            <uni-tr>
+              <uni-th align="center">任务大类</uni-th>
+              <uni-th align="center">任务类型</uni-th>
+              <uni-th align="center" width="80">拆解个数</uni-th>
+              <uni-th align="center" width="80">完成个数</uni-th>
+            </uni-tr>
+            <!-- 表格数据行 -->
+            <uni-tr v-for="(item, index) in rulesList" :key="index">
+              <uni-td align="center">{{ item.baseId }}</uni-td>
+              <uni-td align="center">{{ item.taskTypeName }}</uni-td>
+              <uni-td align="center">{{ item.qty }}</uni-td>
+              <uni-td align="center">{{ item.count }}</uni-td>
+            </uni-tr>
+          </uni-table>
+        </view>
+      </view>
+    </view>
+    <view class="btn" v-if="taskDetail?.receiveFlag">
+      <uv-button
+        shape="circle"
+        :disabled="disabled"
+        :text="disabled ? '领取成功' : '领取执行包'"
+        :customStyle="customStyle"
+        @click="getTaskClick"
+      />
+    </view>
+    <!-- 导出 -->
+    <uv-modal ref="exportModal" title="报告导出" showCancelButton>
+      <view class="slot-content email-input">
+        <uv-input placeholder="请输入邮箱" border="surround" w v-model="emailValue" />
+      </view>
+      <template v-slot:confirmButton>
+        <view class="export-btns">
+          <button class="export-btn cancel" @click="exportModalCancel">取消</button>
+          <button class="export-btn confirm" @click="exportModalConfirm">确定</button>
+        </view>
+      </template>
+    </uv-modal>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+import {
+  receivePackage,
+  getScorePackageInfoById,
+  exportZbInfoFormWeiNewApi,
+  getPkgTaskDetailsApi
+} from '@/service/modules/getTask'
+
+import { validateEmail } from '@/utils/index'
+
+const id = ref()
+onLoad((e) => {
+  id.value = e?.id
+  getDetail()
+  getRules()
+})
+
+const taskDetail = ref()
+
+async function getDetail() {
+  let res = await getScorePackageInfoById(id.value)
+  if (res.code === 0) {
+    taskDetail.value = res.data
+  }
+}
+const rulesList = ref()
+async function getRules() {
+  let res = await getPkgTaskDetailsApi({
+    pkgId: id.value
+  })
+
+  if (res.code === 0) {
+    rulesList.value = res.data
+  }
+}
+const disabled = ref(false)
+// 领取执行包
+async function getTaskClick() {
+  uni.showLoading()
+  const res = await receivePackage(id.value)
+  if (res.code === 0) {
+    uni.hideLoading()
+    uni.showToast({
+      title: '领取成功',
+      icon: 'none'
+    })
+    disabled.value = true
+  }
+}
+
+const customStyle = {
+  background: '#6eb657',
+  color: '#ffffff'
+}
+
+const customBtnStyle = {
+  background: '#3fa3f1',
+  color: '#ffffff',
+  marginBottom: '30rpx'
+}
+
+const exportModal = ref()
+const exportFn = () => {
+  exportModal.value.open()
+}
+
+const emailValue = ref('')
+const exportModalCancel = () => {
+  emailValue.value = ''
+  exportModal.value.close()
+}
+const exportModalConfirm = async () => {
+  if (!validateEmail(emailValue.value)) {
+    return uni.showToast({
+      title: '请输入正确的邮箱',
+      icon: 'none',
+      duration: 1200
+    })
+  }
+  if (id.value) {
+    const res = await exportZbInfoFormWeiNewApi({
+      id: id.value,
+      email: emailValue.value
+    })
+    if (res.code === 1) {
+      uni.showToast({
+        title: res.msg || '导出失败,请联系管理员',
+        icon: 'none'
+      })
+    }
+    if (res.code === 0) {
+      uni.showToast({
+        title: '报告将发送至您的邮箱,请注意查收',
+        icon: 'none'
+      })
+    }
+    exportModalCancel()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.task-detail {
+  background: #f2f2f2;
+  .detail {
+    .cell-row {
+      background: #ffffff;
+      padding: 0 56rpx 0 66rpx;
+      .cell-row-box {
+        border-bottom: 1rpx solid #e2e2e2;
+        position: relative;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 32rpx 0;
+        &::before {
+          content: '*';
+          position: absolute;
+          left: -15px;
+          font-size: 14px;
+          color: #fa3534;
+          height: 9px;
+          line-height: 1;
+        }
+        .cell-title {
+          font-size: 30rpx;
+        }
+        .cell-desc {
+          font-size: 30rpx;
+          color: #898989;
+        }
+      }
+      &:last-child {
+        .cell-row-box {
+          border-bottom: none;
+        }
+      }
+    }
+  }
+  .rules {
+    padding-bottom: 150rpx;
+    margin-top: 20rpx;
+    background: #ffffff;
+    .rules-con {
+      .r-title {
+        padding: 22rpx 60rpx;
+        margin-bottom: 10rpx;
+      }
+      .table {
+        padding: 0 20rpx;
+      }
+    }
+  }
+  .btn {
+    box-shadow: 0px 0px 8rpx 0px rgba(193, 193, 193, 0.5);
+    padding: 28rpx 16rpx;
+    background: #ffffff;
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    z-index: 10;
+  }
+}
+.email-input {
+  width: 100%;
+}
+
+.export-btns {
+  display: flex;
+  justify-content: space-between;
+
+  .export-btn {
+    border: none;
+    background: none;
+    font-size: 32rpx;
+  }
+  .cancel {
+    color: #666;
+  }
+  .confirm {
+    color: #6eb657;
+  }
+}
+</style>

+ 270 - 0
src/pages-sub-packages/get-task/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <view class="get-list">
+    <view class="header">
+      <view class="search">
+        <uv-input
+          placeholder="请输入内容"
+          clearable
+          border="surround"
+          prefixIcon="search"
+          prefixIconStyle="font-size: 32px;color: #909399"
+          shape="circle"
+          @input="searchValChange"
+          :customStyle="customStyle"
+          v-model="params.packageName"
+        />
+      </view>
+      <view class="tabs">
+        <view class="tab-l">
+          <view class="tabs-item" @click="tabClick(1)">
+            <text :class="params.selType === 1 ? 'active-tab' : ''">可领取({{ allTotal }})</text>
+          </view>
+          <view class="tabs-item" @click="tabClick(2)">
+            <text :class="params.selType === 2 ? 'active-tab' : ''">已领取</text>
+          </view>
+        </view>
+        <view class="tab-r">
+          <view class="date" v-if="!dateStr.year || !dateStr.month" @click="showDatePicker">
+            <text>日期</text>
+            <uv-icon name="arrow-down-fill" color="#333" />
+          </view>
+          <view class="date" v-else>
+            <text @click="showDatePicker">{{ dateStr.year + '年' + dateStr.month + '月' }}</text>
+            <uv-icon name="close-circle" color="#333" @click="clearDate" />
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="content" v-if="params.total != 0">
+      <view v-show="params.selType === 1">
+        <cardItem
+          v-for="item in dataList"
+          :key="item.id"
+          :item="item"
+          type="1"
+          @getTaskClick="getTaskClick(item)"
+        />
+      </view>
+      <view v-show="params.selType === 2">
+        <cardItem v-for="item in dataList" :key="item.id" :item="item" type="2" />
+      </view>
+    </view>
+    <noData v-else />
+    <!-- 日期选择 -->
+    <uv-datetime-picker
+      ref="datetimePicker"
+      v-model="dateValue"
+      mode="year-month"
+      @confirm="dateConfirm"
+    />
+  </view>
+</template>
+
+<script setup lang="ts">
+import dayjs from 'dayjs'
+import { ref, reactive } from 'vue'
+import { onReachBottom, onShow } from '@dcloudio/uni-app'
+import { getPackageList, receivePackage } from '@/service/modules/getTask'
+import cardItem from './component/cardItem.vue'
+import noData from '@/components/noData/index.vue'
+import { debounce } from '@/utils/index'
+
+class Params {
+  total = -1
+  current = 1
+  size = 20
+  selType = 1
+  selDate = ''
+  packageName = ''
+}
+const params = ref(new Params())
+
+const resetParams = () => {
+  params.value = new Params()
+}
+const dataList = ref<any[]>([])
+
+const allTotal = ref(0)
+
+async function getList() {
+  uni.showLoading({
+    title: '加载中...'
+  })
+  let res = await getPackageList(params.value)
+  if (res.data) {
+    params.value.total = res.data.total
+    dataList.value = dataList.value.concat(res.data.records)
+    // 当获取的是可领取的包
+    if (params.value.selType === 1) {
+      allTotal.value = res.data.total
+    }
+  }
+  uni.hideLoading()
+}
+
+onShow(() => {
+  dataList.value = []
+  getList()
+})
+
+const customStyle = {
+  background: '#f6f6f6',
+  border: 'none',
+  height: '60rpx'
+}
+
+// tab切换
+const tabClick = (act: number) => {
+  if (params.value.selType === act) return
+  resetParams()
+  dataList.value = []
+  params.value.selType = act
+  getList()
+}
+
+// 日期选择
+const datetimePicker = ref()
+const dateValue = ref(Number(new Date()))
+const showDatePicker = () => datetimePicker.value.open()
+
+const dateStr = reactive({
+  year: '',
+  month: ''
+})
+
+const clearDate = () => {
+  dateStr.year = ''
+  dateStr.month = ''
+  dateValue.value = Number(new Date())
+  params.value.selDate = ''
+  params.value.current = 1
+  dataList.value = []
+  getList()
+}
+const dateConfirm = (e: any) => {
+  const date = dayjs(e.value).format('YYYY-MM')
+  params.value.selDate = date
+  let arr = date.split('-')
+  dateStr.year = arr[0]
+  dateStr.month = arr[1]
+  params.value.current = 1
+  dataList.value = []
+  getList()
+}
+
+const searchValChange = debounce(() => {
+  params.value.current = 1
+  dataList.value = []
+  getList()
+})
+
+// 底部
+onReachBottom(() => {
+  if (dataList.value.length === params.value.total) return
+  params.value.current++
+  getList()
+})
+
+// 领取执行包
+async function getTaskClick(item: any) {
+  const res = await receivePackage(item.id)
+  if (res.code === 0) {
+    uni.showToast({
+      title: '领取成功',
+      icon: 'none',
+      duration: 1000
+    })
+    setTimeout(() => {
+      params.value.current = 1
+      dataList.value = []
+      getList()
+    }, 1000)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.get-list {
+  min-height: 96vh;
+  background-color: #fafafa;
+  padding: 0 30rpx;
+
+  .header {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    z-index: 999;
+    background-color: #fff;
+
+    .search {
+      padding: 0 30rpx;
+    }
+
+    .tabs {
+      margin-top: 8rpx;
+      height: 80rpx;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+
+      .tab-l {
+        flex: 1;
+        display: flex;
+        justify-content: space-between;
+
+        .tabs-item {
+          flex: 1;
+          text-align: center;
+          color: #666;
+          font-size: 28rpx;
+          font-weight: 400;
+          text {
+            display: inline-block;
+            &.active-tab {
+              color: #333;
+              font-weight: 600;
+              position: relative;
+              &::after {
+                content: '';
+                display: block;
+                position: absolute;
+                width: 50%;
+                height: 6rpx;
+                background-color: #6eb657;
+                left: 50%;
+                top: 50rpx;
+                transform: translateX(-50%);
+              }
+            }
+          }
+        }
+      }
+      .tab-r {
+        width: 240rpx;
+        height: 40rpx;
+        border-left: 2rpx solid #ebebeb;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+
+        .date {
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          text {
+            margin-right: 10rpx;
+            font-size: 28rpx;
+            font-weight: 400;
+          }
+        }
+      }
+    }
+  }
+
+  .content {
+    margin-top: 180rpx;
+    padding-top: 24rpx;
+  }
+}
+</style>

+ 568 - 0
src/pages-sub-packages/task-history/index.vue

@@ -0,0 +1,568 @@
+<template>
+  <view class="get-list">
+    <!-- 顶部tab -->
+    <view class="header">
+      <view class="tabs">
+        <view class="tab-l">
+          <view class="tabs-item" @click="tabClick(1)">
+            <text :class="params.activeId === 1 ? 'active-tab' : ''">全部</text>
+          </view>
+          <view class="tabs-item" @click="tabClick(2)">
+            <text :class="params.activeId === 2 ? 'active-tab' : ''">进行中</text>
+          </view>
+          <view class="tabs-item" @click="tabClick(3)">
+            <text :class="params.activeId === 3 ? 'active-tab' : ''">审批中</text>
+          </view>
+          <view class="tabs-item" @click="tabClick(4)">
+            <text :class="params.activeId === 4 ? 'active-tab' : ''">已完成</text>
+          </view>
+        </view>
+        <view class="tab-r">
+          <view class="date" v-if="!dateStr.year || !dateStr.month" @click="showDatePicker">
+            <text>日期</text>
+            <uv-icon name="arrow-down-fill" color="#333" />
+          </view>
+          <view class="date" v-else>
+            <text @click="showDatePicker">{{ dateStr.year + '年' + dateStr.month + '月' }}</text>
+            <uv-icon name="close-circle" color="#333" @click="clearDate" />
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="content" v-if="params.total != 0">
+      <view class="notice">
+        <uv-notice-bar
+          text="任务包即将完成,请不要做积分较高的任务,避免浪费"
+          bgColor="#6eb657"
+          color="#fff"
+        />
+      </view>
+      <!-- 列表 -->
+      <view class="task-content">
+        <view class="task-list">
+          <view
+            v-for="item in dataList"
+            :key="item.statusId"
+            @click="getDetail(item)"
+            class="task-item"
+            :class="{ disable: item.taskAddFlag === '0' }"
+          >
+            <view class="task-top">
+              <view class="top-l">
+                <text class="name">{{ item.scorePackageName }}</text>
+                <view class="tag">
+                  <template v-if="item.taskAddFlag === '0'">
+                    <view class="gry">{{ getText(item.packageType1) }}</view>
+                  </template>
+                  <template v-else>
+                    <view
+                      v-if="item.packageType1 === '1' || item.packageType1 === '6'"
+                      class="main"
+                      >{{ getText(item.packageType1) }}</view
+                    >
+                    <view v-if="item.packageType1 === '2'" class="green">{{
+                      getText(item.packageType1)
+                    }}</view>
+                    <view v-if="item.packageType1 === '3'" class="main">{{
+                      getText(item.packageType1)
+                    }}</view>
+                    <view v-if="item.packageType1 === '4'" class="yellow">{{
+                      getText(item.packageType1)
+                    }}</view>
+                  </template>
+                </view>
+              </view>
+              <view class="top-r">
+                <view class="point"></view>
+                <template v-if="item.enableType == '0'">
+                  <template v-if="item.settleNoteStatus == '1'">
+                    <view class="is-settle">
+                      <view class="settle-text">已结算</view>
+                      <view>{{ item.notifyTime }}</view>
+                    </view>
+                  </template>
+                  <template v-else>
+                    <text v-if="item.status === '1'">审核中</text>
+                    <text v-if="item.status === '2'">申领审核通过</text>
+                    <text v-if="item.status === '3'">审核不通过</text>
+                  </template>
+                </template>
+                <text v-else-if="item.enableType == '1'">已终止,全部收回</text>
+                <text v-else-if="item.enableType == '2'">已终止,剩余收回</text>
+                <text v-else>进行中</text>
+              </view>
+            </view>
+            <view class="task-list-content">
+              <view class="task-info">
+                <text>发包方:{{ item.packageEntName }}</text>
+              </view>
+              <view class="task-info">
+                <text>发包时间:{{ formatTime(item.createTime) }}</text>
+                <text>接包时间:{{ formatTime(item.receiveTime) }}</text>
+              </view>
+              <view class="progress">
+                <uv-line-progress
+                  class="pro-one"
+                  v-if="item.taskAddFlag === '0'"
+                  round
+                  :percentage="100"
+                  activeColor="#999"
+                  inactiveColor="#f8f8f0"
+                ></uv-line-progress>
+                <uv-line-progress
+                  class="pro-two"
+                  v-else
+                  round
+                  :percentage="item.speedProgress"
+                  activeColor="#6eb657"
+                  inactiveColor="#f8f8f0"
+                ></uv-line-progress>
+                <view class="progress-info">
+                  <text
+                    v-if="item.packageType1 === '1' || item.packageType1 === '6'"
+                    class="pro-txt"
+                    :class="{ 'disable-text': item.taskAddFlag === '0' }"
+                  >
+                    {{ item.finishScore }}/{{ item.score }}
+                  </text>
+                  <text
+                    v-else
+                    class="pro-txt"
+                    :class="{ 'disable-text': item.taskAddFlag === '0' }"
+                  >
+                    {{ item.taskAddFlag === '1' ? item.taskFinishNum : item.taskNum2 }}/{{
+                      item.taskNum2
+                    }}
+                  </text>
+                </view>
+              </view>
+              <view class="btns" v-if="showBtn(item)">
+                <view class="btn" @click.stop.self="toQuizDetail(item)"><text>去答题</text></view>
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <!-- 无数据展示 -->
+    <noData v-else />
+    <!-- 日期选择 -->
+    <uv-datetime-picker
+      ref="datetimePicker"
+      v-model="dateValue"
+      mode="year-month"
+      @confirm="dateConfirm"
+    ></uv-datetime-picker>
+  </view>
+</template>
+
+<script setup lang="ts">
+import dayjs from 'dayjs'
+import { ref, reactive } from 'vue'
+import { onReachBottom, onLoad, onShow } from '@dcloudio/uni-app'
+import { getPackageList } from '@/service/modules/getTask'
+import noData from '@/components/noData/index.vue'
+import { getQuizPltTextResultGroupingApi } from '@/service/modules/quiz'
+
+class Params {
+  total = -1
+  current = 1
+  size = 20
+  selType = 2
+  selDate = ''
+  packageName = ''
+  activeId = 1
+}
+const params = ref(new Params())
+
+const resetParams = () => {
+  params.value = new Params()
+}
+const dataList = ref<any[]>([])
+
+async function getList() {
+  uni.showLoading({
+    title: '加载中...'
+  })
+  let res = await getPackageList(params.value)
+
+  if (res.data) {
+    uni.hideLoading()
+    params.value.total = res.data.total
+    dataList.value = dataList.value.concat(res.data.records)
+  }
+}
+
+const type = ref()
+onLoad((e) => {
+  if (e?.activeId) {
+    params.value.activeId = Number(e?.activeId)
+  }
+  type.value = e?.type
+
+  dataList.value = []
+  getQuizPltTextResultGroupingFn()
+  getList()
+})
+
+const passList = ref<number[]>([])
+const getQuizPltTextResultGroupingFn = async () => {
+  const res = await getQuizPltTextResultGroupingApi()
+  passList.value = res.data?.passed
+}
+
+const showBtn = (item: any) => {
+  const pkgQuizIds = item?.quizIds || []
+  let flag = pkgQuizIds.every((iten: number) => {
+    return passList.value?.includes(iten)
+  })
+  return !flag
+}
+
+const toQuizDetail = (item: any) => {
+  const pkgQuizIds = item?.quizIds || []
+  if (pkgQuizIds[0]) {
+    uni.navigateTo({
+      url: `/pages-sub-mine/quizDetail/index?id=${pkgQuizIds[0]}`
+    })
+  }
+}
+
+// tab切换
+const tabClick = (act: number) => {
+  if (params.value.activeId === act) return
+  resetParams()
+  dataList.value = []
+  params.value.activeId = act
+  getList()
+}
+
+// 日期选择
+const datetimePicker = ref()
+const dateValue = ref(Number(new Date()))
+const showDatePicker = () => datetimePicker.value.open()
+const dateStr = reactive({
+  year: '',
+  month: ''
+})
+const clearDate = () => {
+  dateStr.year = ''
+  dateStr.month = ''
+  dateValue.value = Number(new Date())
+  params.value.selDate = ''
+  params.value.current = 1
+  dataList.value = []
+  getList()
+}
+const dateConfirm = (e: any) => {
+  const date = dayjs(e.value).format('YYYY-MM')
+  params.value.selDate = date
+  let arr = date.split('-')
+  dateStr.year = arr[0]
+  dateStr.month = arr[1]
+  params.value.current = 1
+  dataList.value = []
+  getList()
+}
+
+// 底部
+onReachBottom(() => {
+  if (dataList.value.length === params.value.total) return
+  params.value.current++
+  getList()
+})
+
+function getDetail(item: any) {
+  if (type.value !== '1') {
+    uni.navigateTo({
+      url: `/pages-sub-packages/get-task/detail?id=${item.id}`
+    })
+  } else {
+    if (item.status === '3') {
+      return uni.showToast({
+        title: '当前无可查询的任务',
+        icon: 'none'
+      })
+    }
+    uni.navigateTo({
+      url: `/pages-sub-packages/task-list/index?id=${item.id}`
+    })
+  }
+}
+
+function getText(item: any) {
+  let str = ''
+  item = item + ''
+  switch (item) {
+    case '1':
+      str = '积分值'
+      break
+    case '2':
+      str = '任务量'
+      break
+    case '3':
+      str = '通用'
+      break
+    case '4':
+      str = '特定'
+      break
+    case '6':
+      str = '积分值'
+      break
+  }
+  return str
+}
+
+const formatTime = (time: string) => dayjs(time).format('YYYY-MM-DD')
+</script>
+
+<style lang="scss" scoped>
+.get-list {
+  min-height: 96vh;
+  background-color: #fafafa;
+  padding: 0 30rpx;
+
+  .header {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    z-index: 999;
+    background-color: #fff;
+
+    .tabs {
+      margin-top: 8rpx;
+      height: 80rpx;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+
+      .tab-l {
+        flex: 1;
+        display: flex;
+        justify-content: space-between;
+
+        .tabs-item {
+          flex: 1;
+          text-align: center;
+          color: #666;
+          font-size: 28rpx;
+          font-weight: 400;
+          text {
+            display: inline-block;
+            &.active-tab {
+              color: #333;
+              font-weight: 600;
+              position: relative;
+              &::after {
+                content: '';
+                display: block;
+                position: absolute;
+                width: 50%;
+                height: 6rpx;
+                background-color: #6eb657;
+                left: 50%;
+                top: 50rpx;
+                transform: translateX(-50%);
+              }
+            }
+          }
+        }
+      }
+      .tab-r {
+        width: 240rpx;
+        height: 40rpx;
+        border-left: 2rpx solid #ebebeb;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+
+        .date {
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          text {
+            margin-right: 10rpx;
+            font-size: 28rpx;
+            font-weight: 400;
+          }
+        }
+      }
+    }
+  }
+
+  .content {
+    margin-top: 100rpx;
+    padding-top: 24rpx;
+    .notice {
+      :deep(.uv-notice-bar) {
+        border-radius: 8rpx;
+        background: #f8b856;
+      }
+    }
+    .task-content {
+      background-color: #fafafa;
+      .task-list {
+        margin-top: 18rpx;
+        .task-item {
+          width: 100%;
+          background: #ffffff;
+          border-radius: 16rpx;
+          margin-bottom: 24rpx;
+
+          .task-top {
+            display: flex;
+            padding: 20rpx;
+            background: #f8f8f0;
+            border-top-left-radius: 16rpx;
+            border-top-right-radius: 16rpx;
+            .top-l {
+              flex: 1;
+              .name {
+                color: #333;
+                font-weight: 600;
+                font-size: 34rpx;
+                line-height: 50rpx;
+              }
+              .tag {
+                display: inline-block;
+                margin-left: 10rpx;
+                vertical-align: text-bottom;
+                view {
+                  line-height: 34rpx;
+                  text-align: center;
+                  display: inline-block;
+                  margin-left: 10rpx;
+                  padding: 0 12rpx;
+                  border-radius: 8rpx;
+                  font-size: 24rpx;
+                }
+                .main {
+                  border: 2rpx solid #6eb657;
+                  color: #6eb657;
+                }
+                .green {
+                  border: 2rpx solid #55d169;
+                  color: #55d169;
+                }
+                .yellow {
+                  border: 2rpx solid #ffbe1c;
+                  color: #ffbe1c;
+                }
+                .gry {
+                  border: 2rpx solid #d3d3d3;
+                  color: #999999;
+                }
+              }
+            }
+            .top-r {
+              max-width: 250rpx;
+              display: flex;
+              align-items: center;
+              .point {
+                line-height: 56rpx;
+                display: inline-block;
+                width: 10rpx;
+                height: 10rpx;
+                border-radius: 100%;
+                background-color: #6eb657;
+                margin-right: 10rpx;
+              }
+              text {
+                font-weight: 400;
+                line-height: 56rpx;
+                color: #6eb657;
+              }
+              .is-settle {
+                text-align: right;
+                color: #6b8e23;
+                font-size: 24rpx;
+              }
+            }
+          }
+          .task-list-content {
+            padding: 24rpx;
+            background: #fff;
+            .task-info {
+              margin-bottom: 8rpx;
+              text {
+                font-weight: 400;
+                margin-right: 30rpx;
+                font-size: 24rpx;
+                color: #999;
+              }
+            }
+            .progress {
+              margin-top: 20rpx;
+              display: flex;
+              justify-content: space-between;
+              .pro-one {
+                ::v-deep .u-progress {
+                  border: 2.5rpx solid #d5d5d5;
+                  width: 444rpx;
+                  .u-active {
+                    border-radius: 100rpx;
+                  }
+                }
+              }
+              .pro-two {
+                ::v-deep .u-progress {
+                  border: 2.5rpx solid #6eb657;
+                  width: 444rpx;
+                  .u-active {
+                    border-radius: 100rpx;
+                  }
+                }
+              }
+              .progress-info {
+                margin-left: 30rpx;
+                flex: 1;
+                text-align: right;
+              }
+              .disable-text {
+                color: #999;
+              }
+            }
+          }
+        }
+        .disable {
+          .task-top {
+            background-color: #f5f5f5;
+            .top-l {
+              .name {
+                color: #999;
+              }
+            }
+            .top-r {
+              .point {
+                background: #999;
+              }
+              text {
+                color: #999;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+.btns {
+  margin-top: 30rpx;
+  display: flex;
+
+  .btn {
+    display: flex;
+    align-items: center;
+    height: 34rpx;
+    margin-right: 36rpx;
+
+    text {
+      color: #6eb657;
+      font-size: 24rpx;
+      line-height: 34rpx;
+    }
+  }
+}
+</style>

+ 153 - 0
src/pages-sub-packages/task-list/index.vue

@@ -0,0 +1,153 @@
+<template>
+  <view class="task-list">
+    <view class="list" v-if="dataList.length">
+      <view class="list-item" v-for="item in dataList" :key="item.id" @click="detailClick(item.id)">
+        <view
+          class="item-top"
+          :class="{ 'disable-top': item.realFlag == '1' || item.taskStatus == '4' }"
+        >
+          <view
+            class="top-clock"
+            :class="{ 'disable-text': item.realFlag == '1' || item.taskStatus == '4' }"
+          >
+            <image
+              v-if="item.realFlag == '1' || item.taskStatus == '4'"
+              class="clock-icon"
+              src="/static/images/task/clock2.png"
+            />
+            <image v-else class="clock-icon" src="/static/images/task/clock.png" />
+            <text :class="{ 'disable-text': item.realFlag == '1' || item.taskStatus == '4' }">{{
+              formatTime(item.createTime)
+            }}</text>
+          </view>
+          <view class="top-ing" v-if="item.realFlag == '1' || item.taskStatus == '4'"
+            >审核不通过</view
+          >
+          <uv-icon
+            name="arrow-right"
+            :color="item.realFlag == '1' || item.taskStatus == '4' ? '#999999' : '#fff'"
+            size="16"
+          />
+        </view>
+        <view class="item-bottom">
+          <text :class="{ 'disable-text': item.realFlag == '1' || item.taskStatus == '4' }">{{
+            item.taskTypeId
+          }}</text>
+          <text :class="{ 'disable-text': item.realFlag == '1' || item.taskStatus == '4' }"
+            >+{{ item.score }}积分</text
+          >
+        </view>
+      </view>
+    </view>
+    <noData v-else />
+  </view>
+</template>
+
+<script setup lang="ts">
+import formatTime from '@/utils/formatTime'
+import { getTaskListByPackageIdApi } from '@/service/modules/getTask'
+import { onLoad, onReachBottom } from '@dcloudio/uni-app'
+import { reactive, ref } from 'vue'
+import { useLoginStore } from '@/store/login'
+import noData from '@/components/noData/index.vue'
+
+const loginStore = useLoginStore()
+
+const total = ref()
+const params = reactive({
+  taskUserId: loginStore?.currentUserInfo.userId,
+  scorePackageId: '',
+  current: 1,
+  size: 10
+})
+
+const dataList = ref<any[]>([])
+async function getTaskListByPackageId() {
+  const res = await getTaskListByPackageIdApi(params)
+  if (res.code === 0) {
+    dataList.value = dataList.value.concat(res.data.records)
+    total.value = res.data.total
+  }
+}
+onLoad((e) => {
+  params.scorePackageId = e?.id
+  getTaskListByPackageId()
+})
+
+onReachBottom(() => {
+  if (dataList.value.length === total.value) return
+  params.current++
+  getTaskListByPackageId()
+})
+
+const detailClick = (id: string) => {
+  uni.navigateTo({
+    url: `/pages/task/task-detail/index?id=${id}`
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.task-list {
+  .list {
+    margin-top: 20rpx;
+    padding: 30rpx;
+    .list-item {
+      border-radius: 12rpx;
+      margin-top: 32rpx;
+      box-shadow: 0 10rpx 20rpx 10rpx #eaeaea;
+      .item-top {
+        box-sizing: border-box;
+        border-top-right-radius: 12rpx;
+        border-top-left-radius: 12rpx;
+        height: 102rpx;
+        background: #6eb657;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 22rpx 34rpx;
+        .top-clock {
+          background: #ffffff;
+          border-radius: 10rpx;
+          display: flex;
+          align-items: center;
+          padding: 12rpx 18rpx;
+          font-size: 26rpx;
+          color: #6eb657;
+          .disable-text {
+            color: #9a9a9a;
+          }
+          .clock-icon {
+            width: 36rpx;
+            height: 36rpx;
+            margin-right: 20rpx;
+          }
+        }
+        .top-ing {
+          text-align: right;
+          line-height: 1.5;
+          font-size: 28rpx;
+          color: #ffffff;
+        }
+      }
+      .disable-top {
+        background: linear-gradient(180deg, rgba(203, 203, 203, 1) 0%, rgba(183, 183, 183, 1) 100%);
+      }
+      .disable-text {
+        color: #9a9a9a;
+      }
+      .item-bottom {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 44rpx 28rpx 22rpx;
+        font-size: 28rpx;
+        color: #6eb657;
+        .disable-text {
+          color: #9a9a9a;
+        }
+      }
+    }
+  }
+}
+</style>

+ 416 - 0
src/pages-sub-service-mangement/assignPoints/index.vue

@@ -0,0 +1,416 @@
+<template>
+  <view class="objectives-list">
+    <view class="search">
+      <view class="top-search">
+        <view class="search-input">
+          <uv-input
+            v-model="searchParams.scorePackageName"
+            :customStyle="customStyle"
+            clearable
+            shape="circle"
+            placeholder="请输入"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #6eb657"
+          ></uv-input>
+        </view>
+        <view class="search-button" @click="searchFn">搜索</view>
+        <uv-icon name="plus-circle" color="#6eb657" size="24" @click="addFn" />
+      </view>
+      <view class="search-content">
+        <view
+          class="search-list"
+          @click="searchClick('acceptSug')"
+          :class="searchParams.acceptSug ? 'active' : ''"
+        >
+          <text>承接对象</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.acceptSug ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+        <view
+          class="search-list"
+          @click="searchClick('period')"
+          :class="searchParams.period.length ? 'active' : ''"
+        >
+          <text>创建日期</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.period.length ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+      </view>
+    </view>
+
+    <view class="list" v-if="hasInfo">
+      <view
+        class="item"
+        v-for="item in listArr"
+        :key="item.id"
+        @click.stop.prevent.self="detailFn(item)"
+      >
+        <view class="header">
+          <view class="title">{{ item.scorePackageName }}</view>
+          <view class="status">
+            <text class="circle"></text>
+            <text>{{ getStatusName(item.packageFinishStatus) }}</text>
+          </view>
+        </view>
+        <view class="content">
+          <view class="txt">承接对象:{{ item.userList[0] }}</view>
+          <view class="txt">发布日期:{{ item.belongDate }}</view>
+          <view class="progress">
+            <uv-line-progress
+              class="pro-two"
+              round
+              :showText="false"
+              :percentage="item.finishRate"
+              activeColor="#95dc7e"
+              inactiveColor="#f8f8f0"
+            ></uv-line-progress>
+            <text>{{ item.finishRate }}%</text>
+          </view>
+          <view class="txt">{{ item.ysh }}/{{ item.score }}</view>
+          <view class="btns">
+            <template v-if="item.dsh != null && item.dsh != '0'">
+              <view class="btn" @click.stop.prevent.self="taskReview(item)">
+                <image src="@/static/images/icon/review-img.png" class="image" />
+                <text>任务审核</text>
+              </view>
+            </template>
+            <template v-if="item.dsh != null && item.dsh != '0'">
+              <view class="btn" @click.stop.prevent.self="quickAudit(item)">
+                <image src="@/static/images/icon/review-img.png" class="image" />
+                <text>批量审核</text>
+              </view>
+            </template>
+            <template v-if="item.dsh != null && item.dsh != '0'">
+              <view class="btn" @click.stop.prevent.self="quickAuditFn(item)">
+                <image src="@/static/images/icon/review-img.png" class="image" />
+                <text>快捷审核</text>
+              </view>
+            </template>
+
+            <!-- 终止  -->
+            <view
+              class="btn"
+              v-if="!['4', '5', '6', '9'].includes(item.scorePackageStatus)"
+              @click.stop.prevent.self="stopBtn(item)"
+            >
+              <image src="@/static/images/icon/close.png" class="image" />
+              <text>终止</text>
+            </view>
+            <view class="btn" @click.stop.prevent.self="viewFn(item)">
+              <image src="@/static/images/icon/detail.png" class="image" />
+              <text>查看</text>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <noData v-else />
+    <!-- 选择承接对象 -->
+    <uv-picker
+      :cancelText="searchParams.acceptSug ? '清空' : '取消'"
+      ref="pickerRef"
+      :columns="csoList"
+      keyName="gsmc"
+      @confirm="pickerConfim"
+      @cancel="pickerCancel"
+    ></uv-picker>
+    <!-- 月份范围 -->
+    <KDatePicker v-model="show" type="month" is-range @change="getDate" formatter="YYYY-MM-DD" />
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { onShow, onReachBottom } from '@dcloudio/uni-app'
+import { getListCsoApi } from '@/service/modules/objectivesList'
+import { getListApi } from '@/service/modules/assignPoints'
+import { getDictByNameApi } from '@/service/modules/getDict'
+import KDatePicker from '@/components/dateSelect/k-date-picker/KDatePicker.vue'
+import noData from '@/components/noData/index.vue'
+import { useReview } from '@/store/review'
+
+const reviewStore = useReview()
+
+const customStyle = {
+  backgroundColor: '#f6f6f6'
+}
+
+onShow(() => {
+  listArr.value = []
+  getDict()
+  getList()
+})
+
+class Params {
+  acceptSug = ''
+  period = [] as string[]
+  scorePackageName = ''
+  total = -1
+  current = 1
+  packageType1 = 1
+  packageType2 = 1
+  size = 10
+}
+
+const searchParams = ref(new Params())
+
+const hasInfo = ref(true)
+const listArr = ref<any[]>([])
+const getList = async () => {
+  uni.showLoading()
+  const res = await getListApi(searchParams.value)
+  if (res.code === 0) {
+    searchParams.value.total = res.data.total
+    listArr.value = listArr.value.concat(res.data.records)
+    hasInfo.value = !!listArr.value.length
+  }
+  uni.hideLoading()
+}
+
+const csoList = ref<any[]>([])
+const packageFinishStatusList = ref<any[]>([])
+const getDict = async () => {
+  getDictByNameApi('package_finish_status').then(
+    (res: any) => (packageFinishStatusList.value = res.data)
+  )
+  getListCsoApi().then((res: any) => (csoList.value = [res.data]))
+}
+const getCsoName = (acceptSug: number) => {
+  const curr = csoList.value[0]?.find((item: any) => item.id === acceptSug)
+  return curr?.gsmc
+}
+const getStatusName = (planState: string) => {
+  const curr = packageFinishStatusList.value?.find((item: any) => item.value === planState)
+  return curr?.label
+}
+
+const searchFn = () => {
+  listArr.value = []
+  searchParams.value.current = 1
+  getList()
+}
+
+onReachBottom(() => {
+  if (listArr.value.length === searchParams.value.total) return
+  searchParams.value.current++
+  getList()
+})
+const pickerRef = ref()
+const show = ref(false)
+
+const searchClick = (type: string) => {
+  if (type === 'acceptSug') {
+    pickerRef.value.open()
+  } else {
+    show.value = true
+  }
+}
+
+const pickerConfim = (e: any) => {
+  searchParams.value.acceptSug = e.value[0].id
+  searchFn()
+}
+
+const pickerCancel = () => {
+  if (searchParams.value.acceptSug) {
+    searchParams.value.acceptSug = ''
+    searchFn()
+  }
+}
+
+const getDate = (e: any[]) => {
+  if (!e[1]) return
+  searchParams.value.period = e
+  show.value = false
+  searchFn()
+}
+
+const addFn = () => {
+  uni.navigateTo({
+    url: '/pages-sub-service-mangement/assignPointsAdd/index?&type=1'
+  })
+}
+const detailFn = (row: any) => {
+  const info = JSON.stringify(row)
+  reviewStore.setAssignPointsInfo(info)
+  uni.navigateTo({
+    url: '/pages-sub-service-mangement/assignPointsAdd/detail?&type=2'
+  })
+}
+
+//
+const stopBtn = (row: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-service-mangement/stopServiceDelivery/index?type=${2}&id=${row.id}`
+  })
+}
+
+// 任务审核
+const taskReview = (row: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-service-mangement/taskAudit/index?&id=${row.id}&type=taskAudit&taskStatus=2&page=1`
+  })
+}
+// 快捷审核
+const quickAudit = (row: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-service-mangement/quickAudit/index?&id=${row.id}&type=taskAudit&taskStatus=2&page=1`
+  })
+}
+// 快捷审核
+const quickAuditFn = (row: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-service-mangement/quickAuditCard/index?&id=${row.id}&type=1`
+  })
+}
+
+const viewFn = (row: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-service-mangement/taskAudit/index?&id=${row.id}&type=taskAudit&page=1`
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.objectives-list {
+  padding: 24rpx 0;
+  .search {
+    position: fixed;
+    width: 750rpx;
+    padding: 0 30rpx;
+    top: 0;
+    height: 150rpx;
+    background-color: #fff;
+    z-index: 99;
+    .top-search {
+      display: flex;
+      align-items: center;
+
+      .search-input {
+        width: 540rpx;
+        height: 70rpx;
+      }
+      .search-button {
+        color: #6eb657;
+        font-size: 30rpx;
+        margin: 0 10px;
+        font-weight: 400;
+      }
+    }
+    .search-content {
+      margin-top: 24rpx;
+      padding-bottom: 10rpx;
+      display: flex;
+      .search-list {
+        display: flex;
+        align-content: center;
+        margin-right: 64rpx;
+        height: 40rpx;
+        text {
+          font-weight: 500;
+          line-height: 40rpx;
+          font-size: 28rpx;
+          color: #111111;
+          margin-right: 8rpx;
+        }
+      }
+      .active text {
+        color: #6eb657;
+      }
+    }
+  }
+
+  .list {
+    margin-top: 150rpx;
+    padding: 0 30rpx;
+    .item {
+      margin-bottom: 20rpx;
+      width: 100%;
+      border-radius: 16rpx;
+      box-shadow: 0px 2rpx 8rpx 0px rgba(0, 0, 0, 0.2);
+      .header {
+        background-color: #f8f8f0;
+        padding: 26rpx 20rpx;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        border-top-left-radius: 16rpx;
+        border-top-right-radius: 16rpx;
+        .title {
+          font-size: 32rpx;
+          line-height: 45rpx;
+          width: 70%;
+          font-weight: 500;
+          color: #333;
+          word-wrap: break-word;
+        }
+        .status {
+          .circle {
+            display: block;
+            border-radius: 50%;
+            background-color: #72b25b;
+            margin-right: 10rpx;
+            width: 15rpx;
+            height: 15rpx;
+          }
+          display: flex;
+          align-items: center;
+          color: #72b25b;
+        }
+      }
+      .content {
+        padding: 20rpx;
+        .txt {
+          font-weight: 400;
+          color: #999;
+          font-size: 22rpx;
+          line-height: 30rpx;
+          margin-bottom: 16rpx;
+        }
+        .progress {
+          display: flex;
+          align-items: center;
+          margin-bottom: 8rpx;
+          .pro-two {
+            width: 80%;
+          }
+          text {
+            margin-left: 10px;
+            color: #010101;
+            font-size: 26rpx;
+            line-height: 36rpx;
+          }
+        }
+        .btns {
+          margin-top: 30rpx;
+          display: flex;
+
+          .btn {
+            display: flex;
+            align-items: center;
+            height: 34rpx;
+            margin-right: 5rpx;
+
+            .image {
+              width: 28rpx;
+              height: 28rpx;
+              margin-right: 12rpx;
+            }
+            text {
+              color: #6eb657;
+              font-size: 24rpx;
+              line-height: 34rpx;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 88 - 0
src/pages-sub-service-mangement/assignPointsAdd/components/TableData.vue

@@ -0,0 +1,88 @@
+<template>
+  <view class="table">
+    <uni-table border stripe emptyText="暂无更多数据">
+      <!-- 表头行 -->
+      <uni-tr>
+        <uni-th align="center" width="50">序号</uni-th>
+        <uni-th align="center">上级服务类型</uni-th>
+        <uni-th align="center" width="50">积分值</uni-th>
+        <uni-th align="center" width="50">任务总个数</uni-th>
+        <uni-th align="center" width="50">已用个数</uni-th>
+        <uni-th align="center" width="50">任务个数</uni-th>
+        <uni-th align="center" width="80">任务积分值</uni-th>
+      </uni-tr>
+      <!-- 表格数据行 -->
+      <uni-tr v-for="(item, index) in tableData" :key="item?.taskTypeId" index>
+        <uni-td>{{ index + 1 }}</uni-td>
+        <uni-td>{{ item.baseId }}</uni-td>
+        <uni-td>{{ item.score }}</uni-td>
+        <uni-td>{{ item.allQty }}</uni-td>
+        <uni-td>{{ item.used }}</uni-td>
+        <uni-td>
+          <input type="number" @blur="(e) => change(e, index, item)" v-model="item.qty" />
+        </uni-td>
+        <uni-td>{{ item.subtotal }}</uni-td>
+      </uni-tr>
+      <!-- 结尾 -->
+      <uni-tr>
+        <uni-td>总计</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>{{ totalQty }}</uni-td>
+        <uni-td>{{ totalsubtotal }}</uni-td>
+      </uni-tr>
+    </uni-table>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref, defineEmits } from 'vue'
+
+const emit = defineEmits(['updateScope'])
+
+const tableData = ref<any[]>([])
+
+const totalQty = ref(0)
+const totalsubtotal = ref(0)
+
+const change = (detail: any, index: number, item: any) => {
+  let max = item.allQty - item.used
+  const value = tableData.value[index].qty
+  if (value > max) {
+    tableData.value[index].qty = max
+  }
+  tableData.value[index].subtotal = tableData.value[index].qty * tableData.value[index].score
+  totalQty.value = tableData.value.reduce((sum, row) => Number(sum) + Number(row.qty), 0)
+  totalsubtotal.value = tableData.value.reduce((sum, row) => Number(sum) + Number(row.subtotal), 0)
+  emit('updateScope', totalsubtotal.value)
+}
+
+const setData = (data: any[]) => {
+  tableData.value = [...data]
+  tableData.value.forEach((item, index) => {
+    item.index = index
+    item.score = item.price
+    item.subtotal = 0
+    item.baseId = item.taskTypeName
+    item.allQty = item.qty
+    item.qty = 0
+  })
+}
+const getData = () => {
+  return tableData.value
+}
+
+defineExpose({ setData, getData })
+</script>
+
+<style lang="scss" scoped>
+.table {
+  margin-top: 20rpx;
+  width: 640rpx;
+  min-height: 300rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+}
+</style>

+ 112 - 0
src/pages-sub-service-mangement/assignPointsAdd/components/treeList.ts

@@ -0,0 +1,112 @@
+export const treeList: any[] = [
+  {
+    taskTypeId: 'p-1',
+    taskTypeName: '学术会议服务',
+    show: true,
+    disabled: true,
+    checked: true,
+    children: [
+      { taskTypeId: '1', taskTypeName: 'POV科室会', disabled: true, checked: true },
+      { taskTypeId: '5', taskTypeName: '沙龙会', disabled: true, checked: true },
+      { taskTypeId: '2', taskTypeName: '区县学术会议', disabled: true, checked: true },
+      { taskTypeId: '3', taskTypeName: '市级学术会议', disabled: true, checked: true },
+      { taskTypeId: '4', taskTypeName: '省级学术会议', disabled: true, checked: true },
+      { taskTypeId: '64', taskTypeName: '线上学术会议', disabled: true, checked: true },
+      { taskTypeId: '19', taskTypeName: '健康教育课堂', disabled: true, checked: true }
+    ]
+  },
+  {
+    taskTypeId: 'p-2',
+    taskTypeName: '学术拜访服务',
+    show: true,
+    disabled: true,
+    checked: true,
+    children: [
+      { taskTypeId: '53', taskTypeName: '基础拜访', disabled: true, checked: true },
+      { taskTypeId: '51', taskTypeName: '专业拜访', disabled: true, checked: true },
+      { taskTypeId: '52', taskTypeName: '专项拜访', disabled: true, checked: true }
+    ]
+  },
+  {
+    taskTypeId: 'p-4',
+    taskTypeName: '产品推广',
+    show: true,
+    disabled: true,
+    checked: true,
+    children: [{ taskTypeId: '8', taskTypeName: '产品相册分享', disabled: true, checked: true }]
+  },
+  {
+    taskTypeId: 'p-5',
+    taskTypeName: '学术信息交流',
+    show: true,
+    disabled: true,
+    checked: true,
+    children: [{ taskTypeId: '9', taskTypeName: '学术信息交流', disabled: true, checked: true }]
+  },
+  {
+    taskTypeId: 'p-3',
+    taskTypeName: '商务协作',
+    show: true,
+    disabled: true,
+    checked: true,
+    children: [
+      { taskTypeId: '14', taskTypeName: '数据收集', disabled: true, checked: true },
+      { taskTypeId: '17', taskTypeName: '医学警戒信息收集', disabled: true, checked: true },
+      { taskTypeId: '12', taskTypeName: '产品展示', disabled: true, checked: true },
+      { taskTypeId: '13', taskTypeName: '业务宣传服务', disabled: true, checked: true }
+    ]
+  }
+]
+
+export const pFlist = [
+  {
+    taskTypeName: '学术会议服务',
+    taskTypeId: 'p-1',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '学术拜访服务',
+    taskTypeId: 'p-2',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '市场信息服务',
+    taskTypeId: 'p-1',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '学术会议服务',
+    taskTypeId: 'p-3',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '产品推广',
+    taskTypeId: 'p-4',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '学术信息交流',
+    taskTypeId: 'p-5',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '医药研发服务',
+    taskTypeId: 'p-6',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '专项服务',
+    taskTypeId: 'p-17',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '商业公司客户管理',
+    taskTypeId: 'p-18',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '代理商客户管理',
+    taskTypeId: 'p-19',
+    children: [] as any[]
+  }
+]

+ 209 - 0
src/pages-sub-service-mangement/assignPointsAdd/detail.vue

@@ -0,0 +1,209 @@
+<template>
+  <view class="add">
+    <view class="form">
+      <uv-form
+        labelPosition="left"
+        :model="form"
+        ref="formRef"
+        labelWidth="140"
+        :labelStyle="labelStyle"
+      >
+        <uv-form-item label="执行包名称" prop="scorePackageName" borderBottom required>
+          <uv-input
+            v-model="form.scorePackageName"
+            border="none"
+            placeholder="请输入"
+            inputAlign="right"
+            readonly
+          />
+        </uv-form-item>
+        <uv-form-item label="服务总值" prop="score" borderBottom required>
+          <uv-input v-model="form.score" inputAlign="right" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="发布日期" prop="belongDate" borderBottom required>
+          <uv-input v-model="form.belongDate" inputAlign="right" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="承接对象" prop="belongDate" borderBottom required>
+          <uv-input v-model="form.userListLabel" inputAlign="right" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="执行包状态" prop="scorePackageStatusName" borderBottom required>
+          <uv-input
+            v-model="form.scorePackageStatusName"
+            inputAlign="right"
+            readonly
+            border="none"
+          />
+        </uv-form-item>
+        <uv-form-item label="完成服务分值" prop="ysh" borderBottom required>
+          <uv-input v-model="form.ysh" readonly inputAlign="right" border="none" />
+        </uv-form-item>
+        <uv-form-item label="完成百分比(%)" prop="yshtt" borderBottom required>
+          <uv-input v-model="form.yshtt" readonly inputAlign="right" border="none" />
+        </uv-form-item>
+        <uv-form-item label="审核通过服务分值" prop="shtg" borderBottom required>
+          <uv-input v-model="form.shtg" readonly inputAlign="right" border="none" />
+        </uv-form-item>
+        <uv-form-item label="审核通过百分比(%)" prop="shtgtt" borderBottom required>
+          <uv-input v-model="form.shtgtt" readonly inputAlign="right" border="none" />
+        </uv-form-item>
+        <uv-form-item label="关联执行包名称" prop="relationScoreId" borderBottom required>
+          <uv-input v-model="form.relationScoreId" inputAlign="right" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="承接对象范围" prop="packageUserScopeName" borderBottom required>
+          <uv-input v-model="form.packageUserScopeName" inputAlign="right" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="承接对象范围" prop="typeidName" borderBottom required>
+          <uv-input v-model="form.typeidName" inputAlign="right" readonly border="none" />
+        </uv-form-item>
+      </uv-form>
+    </view>
+    <view class="task-type">
+      <view class="title">有效服务类型如下:</view>
+      <view class="item">
+        <view class="list" v-for="(item, index) in taskTypeList" :key="index">
+          <view class="dot">
+            <text></text>
+          </view>
+          <view class="txt"> {{ item.code }}:{{ item.label }}</view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad } from '@dcloudio/uni-app'
+import { useReview } from '@/store/review'
+import { ref } from 'vue'
+import { reactive } from 'vue'
+import { getTypeidPersonalApi, selectByScorePackageIdById } from '@/service/modules/assignPoints'
+import { getDictByNameApi } from '@/service/modules/getDict'
+
+const reviewStore = useReview()
+
+const currInfo = ref()
+onLoad((e) => {
+  const str = reviewStore.assignPointsInfo
+  if (str) {
+    currInfo.value = JSON.parse(reviewStore.assignPointsInfo)
+    initForm()
+  }
+})
+
+const labelStyle = {
+  fontWeight: 400,
+  fontSize: '30rpx',
+  color: '#000'
+}
+
+const form = reactive({
+  scorePackageName: '',
+  score: '',
+  belongDate: '',
+  userListLabel: '',
+  scorePackageStatusName: '',
+  ysh: 0,
+  yshtt: 0,
+  shtg: 0,
+  shtgtt: 0,
+  relationScoreId: '',
+  packageUserScopeName: '',
+  typeidName: ''
+})
+
+const plist = {
+  'p-1': '学术会议服务',
+  'p-2': '学术拜访服务',
+  'p-3': '市场信息服务',
+  'p-4': '产品推广',
+  'p-5': '学术信息交流',
+  'p-6': '医药研发服务',
+  'p-7': '',
+  'p-17': '专项服务',
+  'p-18': '商业公司客户管理',
+  'p-19': '代理商客户管理'
+} as any
+const taskTypeList = ref<any[]>([])
+const initForm = async () => {
+  const res = await getTypeidPersonalApi()
+  const resA = await getDictByNameApi('score_package_status')
+  form.scorePackageName = currInfo.value.scorePackageName
+  form.score = currInfo.value.score
+  form.belongDate = currInfo.value.belongDate
+  form.userListLabel = currInfo.value?.userList[0]
+  const currA = resA.data.find((item: any) => item.value == currInfo.value.scorePackageStatus)
+  if (currA) {
+    form.scorePackageStatusName = currA.label
+  }
+  form.ysh = currInfo.value?.ysh
+  form.yshtt = currInfo.value?.yshtt
+  form.shtg = currInfo.value?.shtg
+  form.shtgtt = currInfo.value?.shtgtt
+  form.relationScoreId = currInfo.value?.relationScoreId
+  form.packageUserScopeName = currInfo.value?.packageUserScopeName
+  const currB = res.data.find((item: any) => item.value == currInfo.value.typeid)
+  if (currB) {
+    form.typeidName = currB.label
+  }
+  const resC = await selectByScorePackageIdById({ id: currInfo.value?.id })
+  resC.data.forEach((item: any) => {
+    item.code = plist[item.code]
+  })
+  taskTypeList.value = resC.data
+}
+</script>
+
+<style lang="scss" scoped>
+.add {
+  background: #f2f2f2;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding: 24rpx;
+  .form {
+    background: #fff;
+    padding: 30rpx;
+    border-radius: 12rpx;
+  }
+}
+:deep(.uv-form-item__body__left) {
+  padding-left: 18rpx;
+}
+.task-type {
+  margin-top: 20rpx;
+  background: #fff;
+  border-radius: 12rpx;
+  padding: 20rpx 30rpx;
+
+  .title {
+    font-weight: 400;
+    font-size: 28rpx;
+    line-height: 40rpx;
+    color: #000;
+  }
+  .item {
+    margin-top: 30rpx;
+    .list {
+      display: flex;
+      margin-bottom: 24rpx;
+      .dot {
+        margin-right: 10rpx;
+        height: 36rpx;
+        display: flex;
+        align-items: center;
+        text {
+          display: block;
+          width: 8rpx;
+          height: 8rpx;
+          border-radius: 50%;
+          background-color: #606266;
+        }
+      }
+      .txt {
+        font-weight: 400;
+        font-size: 26rpx;
+        line-height: 36rpx;
+      }
+    }
+  }
+}
+</style>

+ 581 - 0
src/pages-sub-service-mangement/assignPointsAdd/index.vue

@@ -0,0 +1,581 @@
+<template>
+  <view class="add">
+    <view class="form">
+      <uv-form
+        labelPosition="left"
+        :model="form"
+        :rules="rules"
+        ref="formRef"
+        labelWidth="120"
+        :labelStyle="labelStyle"
+      >
+        <uv-form-item label="执行包名称" prop="scorePackageName" borderBottom required>
+          <uv-input
+            v-model="form.scorePackageName"
+            border="none"
+            placeholder="请输入"
+            :readonly="formDisabled"
+          />
+        </uv-form-item>
+        <uv-form-item
+          label="承接对象类型"
+          prop="typeidLabel"
+          borderBottom
+          @click="showSelect('typeidLabel')"
+          required
+        >
+          <uv-input v-model="form.typeidLabel" border="none" placeholder="请选择" readonly />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item
+          v-if="userListShow"
+          label="承接对象"
+          prop="userListLabel"
+          borderBottom
+          @click="showSelect('userListLabel')"
+          required
+        >
+          <uv-input v-model="form.userListLabel" border="none" placeholder="请选择" readonly />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item
+          label="关联服务企业"
+          prop="relatedServiceLabel"
+          borderBottom
+          @click="showSelect('relatedServiceLabel')"
+          required
+        >
+          <uv-input
+            v-model="form.relatedServiceLabel"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item
+          label="关联执行包名称"
+          prop="relationScoreIdLable"
+          borderBottom
+          @click="showSelect('relationScoreIdLable')"
+          required
+        >
+          <uv-input
+            v-model="form.relationScoreIdLable"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item label="推广产品" prop="drugtableLabel" borderBottom>
+          <uv-input v-model="form.drugtableLabel" border="none" placeholder="请选择" readonly />
+        </uv-form-item>
+        <uv-form-item label="可分配积分值" prop="kfpjf" borderBottom>
+          <uv-input v-model="form.kfpjf" type="number" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="服务总值" prop="score" borderBottom required>
+          <uv-input v-model="form.score" type="number" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item
+          label="接单对象范围"
+          prop="packageUserScopeLable"
+          borderBottom
+          @click="showSelect('packageUserScopeLable')"
+          required
+        >
+          <uv-input
+            v-model="form.packageUserScopeLable"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item label="生效日期" prop="startTime" borderBottom required>
+          <uv-input
+            prefixIcon="calendar"
+            prefixIconStyle="font-size: 22px;color: #909399"
+            v-model="form.startTime"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+        </uv-form-item>
+        <uv-form-item label="截止日期" prop="endTimeValue" borderBottom required>
+          <uv-input
+            prefixIcon="calendar"
+            prefixIconStyle="font-size: 22px;color: #909399"
+            v-model="form.endTimeValue"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+        </uv-form-item>
+        <uv-form-item label="执行包编号" prop="packageSn" borderBottom>
+          <uv-input v-model="form.packageSn" type="number" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="有效任务类型如下:" labelWidth="140" labelPosition="top" placeholder>
+          <!-- <taskTree ref="taskTreeRef" /> -->
+          <TableData
+            ref="tableRef"
+            @updateScope="
+              (val) => {
+                form.score = val
+              }
+            "
+          />
+        </uv-form-item>
+        <uv-form-item label="描述" prop="description" borderBottom labelWidth="40">
+          <uv-textarea
+            v-model="form.description"
+            placeholder="请输入内容"
+            height="48"
+          ></uv-textarea>
+        </uv-form-item>
+      </uv-form>
+    </view>
+    <view class="btn">
+      <view class="cancel" @click="cancelFn">取消</view>
+      <view class="confirm" @click="confirmFn(0)">确定</view>
+      <!-- <view class="confirm" @click="confirmFn(1)">确定并继续</view> -->
+    </view>
+    <!-- 选择承接对象类型 -->
+    <uv-picker
+      ref="typeidPickerRef"
+      :columns="[personalList]"
+      keyName="label"
+      @confirm="(e: any) => pickerConfim(e, 'typeidLabel')"
+    />
+    <!-- 选择承接对象类型 -->
+    <uv-picker
+      ref="userListPickerRef"
+      :columns="[objectScopeList5]"
+      keyName="label"
+      @confirm="(e: any) => pickerConfim(e, 'userListLabel')"
+    />
+    <!-- 选择关联服务企业 -->
+    <uv-picker
+      ref="relatedServicePickerRef"
+      :columns="[allParentDeptList]"
+      keyName="name"
+      @confirm="(e: any) => pickerConfim(e, 'relatedServiceLabel')"
+    />
+    <!-- 选择关联执行包 -->
+    <uv-picker
+      ref="relationScoreIdPickerRef"
+      :columns="[relationScoreList]"
+      keyName="scorePackageName"
+      @confirm="(e: any) => pickerConfim(e, 'relationScoreIdLable')"
+    />
+  </view>
+</template>
+
+<script setup lang="ts">
+import dayjs from 'dayjs'
+import { reactive, ref, toRaw } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import {
+  getTypeidPersonalApi,
+  getObjectScopeListApi,
+  getWmscorepackageSnApi,
+  getPackageScopeListApi,
+  getListAncestor,
+  getRelationScoreListApi,
+  addWmScorePackageApi
+} from '@/service/modules/assignPoints'
+
+import TableData from './components/TableData.vue'
+import { pFlist } from './components/treeList'
+
+const currentType = ref()
+const startDate = dayjs().format('YYYY-MM-DD')
+onLoad((e: any) => {
+  currentType.value = e?.type
+
+  getDict()
+})
+
+const personalList = ref<any[]>([])
+// 全职人员
+const objectScopeList5 = ref<any[]>([])
+// 分类
+const packageScopeList = ref<any[]>([])
+// 关联服务企业
+const allParentDeptList = ref<any[]>([])
+const getDict = () => {
+  getTypeidPersonalApi().then((res: any) => {
+    const arr: any[] = []
+    res.data.forEach((item: any) => {
+      const addnew = {
+        value: item.value,
+        label: item.label
+      }
+      arr.push(addnew)
+    })
+    personalList.value = arr.filter((item) => item.value === '3')
+  })
+  getObjectScopeListApi('5').then((res: any) => {
+    objectScopeList5.value = res.data?.map((item: any) => {
+      return {
+        value: item.id,
+        label: item.realname + ' ' + item.username
+      }
+    })
+  })
+  getPackageScopeListApi().then((res: any) => {
+    packageScopeList.value = res.data
+    if (currentType.value === '1') {
+      form.packageUserScope = res.data[0].value
+      form.packageUserScopeLable = res.data[0].label
+    }
+  })
+  // 获取执行包编号
+  if (currentType.value === '1') {
+    getWmscorepackageSnApi().then((res: any) => (form.packageSn = res.data))
+  }
+  // 获取关联服务企业
+  getListAncestor().then((res: any) => (allParentDeptList.value = res.data))
+}
+
+const formDisabled = ref(false)
+const typeidPickerRef = ref()
+const userListPickerRef = ref()
+const relatedServicePickerRef = ref()
+const relationScoreIdPickerRef = ref()
+
+const showSelect = (type: string) => {
+  if (formDisabled.value) return
+  switch (type) {
+    case 'typeidLabel':
+      typeidPickerRef.value.open()
+      break
+    case 'userListLabel':
+      if (form.typeid !== '3') return
+      userListPickerRef.value.open()
+      break
+    case 'relatedServiceLabel':
+      relatedServicePickerRef.value.open()
+      break
+    case 'relationScoreIdLable':
+      if (!relationScoreList.value.length) return
+      relationScoreIdPickerRef.value.open()
+      break
+
+    default:
+      break
+  }
+}
+// 控制是否可以选择接单对象范围
+const packageUserScopeDisable = ref(false)
+// 控制承接对象显示隐藏
+const userListShow = ref(true)
+const pickerConfim = (e: any, type: string) => {
+  if (type === 'typeidLabel') {
+    const value = e.value[0]
+    form.typeid = value.value
+    form.typeidLabel = value.label
+    // 选择全职
+    if (value?.value === '3') {
+      packageUserScopeDisable.value = true
+      form.packageUserScope = packageScopeList.value[0].value
+      form.packageUserScopeLable = packageScopeList.value[0].label
+      userListShow.value = true
+    } else {
+      userListShow.value = false
+      form.userListLabel = ''
+      form.userList = []
+    }
+  }
+  if (type === 'userListLabel') {
+    const value = e.value[0]
+    form.userList = [value.value]
+    form.userListLabel = value.label
+  }
+  if (type === 'relatedServiceLabel') {
+    const value = e.value[0]
+    form.relatedService = value.deptId + ''
+    form.relatedServiceLabel = value.name
+    form.relationScoreId = ''
+    form.relationScoreIdLable = ''
+    getRelationScoreListFn(value.deptId)
+  }
+  if (type === 'relationScoreIdLable') {
+    const value = e.value[0]
+    form.relationScoreId = value.id
+    form.relationScoreIdLable = value.scorePackageName
+    if (value.id === '-1') {
+      form.kfpjf = ''
+    } else {
+      form.drugtable = value?.drugtable
+      form.drugtableLabel = value?.drugtableName[0] || '测试qaq'
+      initRelationScoreIdFn(value.id)
+    }
+  }
+}
+
+const tableRef = ref()
+
+const relationScoreList = ref<any[]>([])
+const getRelationScoreListFn = async (id: number) => {
+  const obj = { relatedService: id }
+  const res = await getRelationScoreListApi(obj)
+  relationScoreList.value = res.data
+}
+const initRelationScoreIdFn = async (id: number) => {
+  const obj = { id: id }
+  const res = await getRelationScoreListApi(obj)
+  if (res.code === 0) {
+    form.kfpjf = res.data[0].kfpjf
+    const pkgTaskTypeQtyList = res.data[0].pkgTaskTypeQtyList
+    tableRef.value.setData(pkgTaskTypeQtyList, res.data[0].kfpjf)
+    form.startTime = res.data[0]?.startTime
+    form.endTimeValue = res.data[0]?.endTime
+    form.drugtable = res.data[0]?.drugtable
+    form.drugtableLabel = res.data[0]?.drugtableName[0] || '测试qaq'
+  }
+}
+const cancelFn = () => {
+  uni.navigateBack()
+}
+
+const confirmFn = (type: number) => {
+  const tableData = tableRef.value.getData()
+
+  let pkgTaskTypeQtyList = tableData.map((item: any) => {
+    return {
+      taskTypeName: item.taskTypeName,
+      price: item.score,
+      taskTypeId: item.taskTypeId,
+      qty: item.qty ? Number(item.qty) : 0
+    }
+  })
+  let treeArr = tableData.map((item: any) => {
+    return {
+      taskTypeName: item.taskTypeName,
+      taskTypeId: item.orgTaskTypeId
+    }
+  })
+  let flag = pkgTaskTypeQtyList.every((item: any) => item.qty == 0)
+  if (flag) {
+    return uni.showToast({
+      title: '请选择具体任务',
+      icon: 'none',
+      duration: 800
+    })
+  }
+
+  let arr = [...pFlist]
+  tableData.forEach((item: any) => {
+    const curr = arr.find((iten) => iten.taskTypeId === item.parent_id)
+    if (curr) {
+      curr.children.push({
+        taskTypeId: item.orgTaskTypeId,
+        taskTypeName: item.taskTypeName
+      })
+    }
+  })
+  let taskTypeList = []
+  taskTypeList = arr.concat(treeArr).filter((item) => {
+    if (!item.children || item.children.length > 0) {
+      return item
+    }
+  })
+
+  // data.forEach((item: any) => {
+  //   taskTypeList = taskTypeList.concat(...item.children)
+  // })
+  formRef.value
+    .validate()
+    .then(async () => {
+      if (form.typeid == '3') {
+        if (!form.userListLabel) {
+          return uni.showToast({
+            title: '接单对象不能为空',
+            icon: 'none',
+            duration: 800
+          })
+        }
+      }
+      if (Number(form.score) > Number(form.kfpjf) && form.relationScoreId != '-1') {
+        return uni.showToast({
+          title: '可分配积分不足',
+          icon: 'none'
+        })
+      }
+      if (Number(form.score) === 0) {
+        return uni.showToast({
+          title: '服务总值必须大于0',
+          icon: 'none'
+        })
+      }
+      if (!taskTypeList?.length) {
+        return uni.showToast({
+          title: '有效服务类型不能为空',
+          icon: 'none'
+        })
+      }
+      form.taskTypeList = taskTypeList
+
+      submitInfo(type, pkgTaskTypeQtyList)
+    })
+    .catch((err: any) => {
+      console.log('err', err)
+    })
+}
+const submitInfo = async (type: number, pkgTaskTypeQtyList: any) => {
+  const obj: any = toRaw(form)
+  obj.packageType1 = '1'
+  obj.packageType2 = '1'
+  obj.userNum = '1'
+  obj.pkgTaskTypeQtyList = pkgTaskTypeQtyList
+  const res = await addWmScorePackageApi(obj)
+  if (res.code === 0) {
+    uni.showToast({
+      title: '添加成功',
+      icon: 'none'
+    })
+    if (type === 0) {
+      setTimeout(() => {
+        uni.navigateBack()
+      }, 1000)
+    } else {
+      form.kfpjf = (form.kfpjf as number) - (form.score as number)
+      form.scorePackageName = ''
+      getWmscorepackageSnApi().then((res: any) => (form.packageSn = res.data))
+    }
+  } else {
+    uni.showToast({
+      title: res?.msg,
+      icon: 'none'
+    })
+  }
+}
+const labelStyle = {
+  fontWeight: 400,
+  fontSize: '30rpx',
+  color: '#000'
+}
+const formRef = ref()
+const form = reactive({
+  scorePackageName: '',
+  typeid: '',
+  typeidLabel: '',
+  userList: [] as any[],
+  userListLabel: '',
+  relatedService: '',
+  relatedServiceLabel: '',
+  relationScoreId: '',
+  relationScoreIdLable: '',
+  drugtable: [] as any[],
+  drugtableLabel: '',
+  kfpjf: '' as string | number,
+  score: '' as string | number,
+  packageUserScope: '',
+  packageUserScopeLable: '',
+  startTime: '',
+  endTimeValue: '',
+  packageSn: '',
+  description: '',
+  taskTypeList: [] as any[]
+})
+const rules = reactive({
+  scorePackageName: {
+    type: 'string',
+    required: true,
+    message: '请输入执行包名称',
+    trigger: ['blur', 'change']
+  },
+  typeidLabel: {
+    type: 'string',
+    required: true,
+    message: '请选择执行包名称',
+    trigger: ['blur', 'change']
+  },
+  relatedServiceLabel: {
+    type: 'string',
+    required: true,
+    message: '请选择关联服务企业',
+    trigger: ['blur', 'change']
+  },
+  relationScoreIdLable: {
+    type: 'string',
+    required: true,
+    message: '请选择关联执行包',
+    trigger: ['blur', 'change']
+  },
+  packageUserScopeLable: {
+    type: 'string',
+    required: true,
+    message: '请选择接单对象范围',
+    trigger: ['blur', 'change']
+  },
+  endTimeValue: {
+    type: 'string',
+    required: true,
+    message: '请选择接单对象范围',
+    trigger: ['blur', 'change']
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+.add {
+  background: #f2f2f2;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding: 24rpx;
+  .form {
+    background: #fff;
+    padding: 30rpx;
+    border-radius: 12rpx;
+  }
+}
+:deep(.uv-form-item__body__left) {
+  padding-left: 18rpx;
+}
+
+.btn {
+  margin-top: 20rpx;
+  box-sizing: border-box;
+  width: 700rpx;
+  height: 160rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+  display: flex;
+  padding: 30rpx 46rpx 54rpx;
+  justify-content: space-between;
+  box-sizing: border-box;
+
+  view {
+    font-weight: 400;
+    box-sizing: border-box;
+    font-size: 32rpx;
+    line-height: 45rpx;
+    border-radius: 8rpx;
+    height: 72rpx;
+    width: 290rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .cancel {
+    border: 2rpx solid #c7c7c7;
+    color: #111;
+  }
+  .confirm {
+    background-color: #6eb657;
+    color: #ffffff;
+  }
+}
+</style>

+ 131 - 0
src/pages-sub-service-mangement/generateReport/index.vue

@@ -0,0 +1,131 @@
+<template>
+  <view class="generate-report">
+    <view class="form">
+      <uv-form
+        labelPosition="left"
+        :model="form"
+        ref="formRef"
+        labelWidth="120"
+        :labelStyle="labelStyle"
+      >
+        <uv-form-item label="执行包名称" prop="score_package_name" borderBottom required>
+          <uv-input v-model="form.score_package_name" border="none" placeholder="请输入" readonly />
+        </uv-form-item>
+        <uv-form-item label="报告ID" prop="report_id" borderBottom required>
+          <uv-input v-model="form.report_id" border="none" placeholder="请输入" readonly />
+        </uv-form-item>
+        <uv-form-item label="完成积分值" prop="score" borderBottom required>
+          <uv-input v-model="form.score" border="none" placeholder="请输入" readonly />
+        </uv-form-item>
+        <uv-form-item label="合计服务数" prop="score_count" borderBottom required>
+          <uv-input v-model="form.score_count" border="none" placeholder="请输入" readonly />
+        </uv-form-item>
+        <uv-form-item label="结算企业" prop="description" borderBottom required>
+          <uv-input v-model="form.description" border="none" placeholder="请输入" readonly />
+        </uv-form-item>
+      </uv-form>
+    </view>
+    <view class="btn">
+      <view @click="generateApprovalFn">生成报告并审批</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad } from '@dcloudio/uni-app'
+import { ref, reactive } from 'vue'
+
+import { selectReportApi, saveAndUpdateWmReportApi } from '@/service/modules/taskManagement'
+
+const currentId = ref()
+
+onLoad((e: any) => {
+  currentId.value = e?.scorePackageId
+  selectReportFn()
+})
+const labelStyle = {
+  fontWeight: 400,
+  fontSize: '30rpx',
+  color: '#000'
+}
+const form = ref({
+  score_package_name: '',
+  report_id: '',
+  score: '',
+  score_count: '',
+  description: ''
+})
+
+const selectReportFn = async () => {
+  const obj = {
+    scorePackageId: currentId.value
+  }
+
+  const res = await selectReportApi(obj)
+  if (res.data == 0) {
+    uni.showToast({
+      icon: 'none',
+      title: '没有可生成报告的服务'
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+  } else {
+    form.value = res.data
+  }
+}
+
+const generateApprovalFn = async () => {
+  const obj = {
+    scorePackageId: currentId.value,
+    taskStatus: 3
+  }
+  const res = await saveAndUpdateWmReportApi(obj)
+  if (res.code === 0) {
+    uni.showToast({
+      title: '提交成功',
+      icon: 'none'
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.generate-report {
+  min-height: 100vh;
+  background-color: #f2f2f2;
+  padding: 24rpx;
+  .form {
+    background: #fff;
+    padding: 30rpx;
+    border-radius: 12rpx;
+  }
+}
+:deep(.uv-form-item__body__left) {
+  padding-left: 18rpx;
+}
+
+.btn {
+  width: 700rpx;
+  background-color: #fff;
+  height: 160rpx;
+  box-sizing: border-box;
+  border-radius: 12rpx;
+  position: fixed;
+  bottom: 40rpx;
+  left: 24rpx;
+  padding: 34rpx 46rpx 54rpx;
+  view {
+    background-color: #6eb657;
+    border-radius: 8rpx;
+    text-align: center;
+    line-height: 72rpx;
+    font-weight: 400;
+    color: #fff;
+    font-size: 32rpx;
+  }
+}
+</style>

+ 404 - 0
src/pages-sub-service-mangement/quickAudit/index.vue

@@ -0,0 +1,404 @@
+<template>
+  <view class="task-audit">
+    <view class="search">
+      <view class="top-search">
+        <view class="search-input">
+          <uv-input
+            v-model="searchParams.planName"
+            :customStyle="customStyle"
+            clearable
+            shape="circle"
+            placeholder="请输入"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #6eb657"
+          ></uv-input>
+        </view>
+        <view class="search-button" @click="searchFn">搜索</view>
+        <uv-icon name="plus-circle" color="#6eb657" size="24" />
+      </view>
+    </view>
+    <view class="checkbox">
+      <checkbox-group @change="checkboxAllChange">
+        <label>
+          <checkbox :checked="checkedAll" style="transform: scale(0.8)" color="#6eb657" />全选
+        </label>
+      </checkbox-group>
+    </view>
+    <view class="list" v-if="hasInfo">
+      <view class="list-content" v-for="item in listArr" :key="item.id">
+        <checkbox-group @change="checkboxChange(item)">
+          <checkbox :checked="item.checked" style="transform: scale(0.8)" color="#6eb657" />
+        </checkbox-group>
+        <view class="item" @click="onDetail(item)">
+          <view class="top">
+            <view class="top-l">
+              <image src="@/static/images/icon/review.png" class="image" />
+              <text>{{ item.lookintoDate }}</text>
+            </view>
+            <view class="top-r">
+              <text></text>
+              <view class="status">{{ item?.checkState?.displayInfo }}</view>
+            </view>
+          </view>
+          <view class="content">
+            <view class="title">
+              <view class="task-name">{{ item.taskTypeName || 'abcd' }}</view>
+              <view class="score">+{{ item.score }}积分</view>
+            </view>
+            <view class="num"> 任务编号:{{ item.taskNumber }} </view>
+          </view>
+        </view>
+      </view>
+      <view class="btn">
+        <view class="cancel" @click="reviewFn('4')">拒绝</view>
+        <view class="confirm" @click="reviewFn('3')">通过</view>
+      </view>
+    </view>
+    <noData v-else />
+  </view>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import { onShow, onLoad, onReachBottom } from '@dcloudio/uni-app'
+import {
+  getListApi,
+  getTaskListPageApi,
+  batchApprovalTaskApi,
+  reportBatchApprovalTaskApi
+} from '@/service/modules/taskAudit'
+import { useLoginStore } from '@/store/login'
+import noData from '@/components/noData/index.vue'
+import { useReview } from '@/store/review'
+
+const loginStore = useLoginStore()
+let userInfo: any = loginStore.currentUserInfo
+const roles: number[] = userInfo.roles
+
+const reviewStore = useReview()
+const currentId = ref()
+const taskStatus = ref()
+
+const checkedAll = ref(false)
+
+const checkboxAllChange = () => {
+  checkedAll.value = !checkedAll.value
+
+  listArr.value.forEach((item) => (item.checked = checkedAll.value))
+}
+
+const currentScoreId = ref()
+const currentPage = ref()
+
+onLoad((e) => {
+  currentId.value = e?.id
+  currentPage.value = e?.page
+  let text = ''
+  if (e?.page === '1') {
+    taskStatus.value = e?.taskStatus
+    searchParams.value.taskStatus = e?.taskStatus
+    searchParams.value.scorePackageId = e?.id
+    text = e?.taskStatus ? '任务审核' : '任务详情'
+  } else if (e?.page === '2') {
+    taskListPageParams.isApprovalPage = e?.type == 'approval' ? '1' : '0'
+    taskListPageParams.id = e?.id
+    text = e?.type == 'approval' ? '任务审核' : '任务详情'
+  }
+  uni.setNavigationBarTitle({
+    title: text
+  })
+})
+
+onShow(() => {
+  searchParams.value.current = 1
+  listArr.value = []
+  getList()
+})
+const customStyle = {
+  backgroundColor: '#f6f6f6'
+}
+
+class Params {
+  taskStatus = ''
+  scorePackageId = ''
+  planName = ''
+  total = -1
+  current = 1
+  size = 10
+}
+
+const searchParams = ref(new Params())
+
+const taskListPageParams = reactive({
+  isApprovalPage: '',
+  id: '',
+  current: 1,
+  size: 10
+})
+
+const checkboxChange = (item: any) => {
+  item.checked = !item.checked
+}
+
+const searchFn = () => {
+  listArr.value = []
+  searchParams.value.current = 1
+  getList()
+}
+
+const hasInfo = ref(true)
+const listArr = ref<any[]>([])
+
+const getList = async () => {
+  uni.showLoading()
+  let res
+  if (currentPage.value === '1') {
+    res = await getListApi(searchParams.value)
+  } else if (currentPage.value === '2') {
+    res = await getTaskListPageApi(taskListPageParams)
+  }
+  res.data.records.forEach((item: any) => {
+    item.checked = false
+  })
+  listArr.value = listArr.value.concat(res.data.records)
+  searchParams.value.total = res.data.total
+  hasInfo.value = !!listArr.value.length
+  uni.hideLoading()
+}
+
+const onDetail = (row: any) => {
+  const info = JSON.stringify(row)
+  reviewStore.setCurrentInfo(info)
+  if (currentPage.value === '1') {
+    const show = !!searchParams.value.taskStatus
+    uni.navigateTo({
+      url: `/pages-sub-service-mangement/taskAuditDetail/index?id=${row.id}&type=1&show=${show}`
+    })
+  } else if (currentPage.value === '2') {
+    const show = taskListPageParams.isApprovalPage === '1'
+    uni.navigateTo({
+      url: `/pages-sub-service-mangement/taskAuditDetail/index?id=${row.id}&type=2&reportId=${currentId.value}&show=${show}`
+    })
+  }
+}
+
+onReachBottom(() => {
+  if (listArr.value.length === searchParams.value.total) return
+  if (currentPage.value === '1') {
+    searchParams.value.current++
+  } else if (currentPage.value === '2') {
+    taskListPageParams.current++
+  }
+
+  getList()
+})
+
+const reviewFn = async (status: string) => {
+  const arr = listArr.value.filter((item) => item.checked)
+  if (!arr.length) {
+    return uni.showToast({
+      title: '请先选择数据',
+      icon: 'none'
+    })
+  }
+  const taskIdToNodeIdMap: any = {}
+  const idArr = arr.map((item) => item.id)
+  const ids = idArr.join(',')
+
+  arr.forEach((item) => {
+    if (currentPage.value === '1') {
+      taskIdToNodeIdMap[item.id] = item.checkState.curNodeId
+    } else if (currentPage.value === '2') {
+      taskIdToNodeIdMap[item.id] = item.checkState.nextNodeId
+      if (roles.includes(42)) {
+        taskIdToNodeIdMap[item.id] = 8
+      }
+      // 40 商务组
+      if (roles.includes(40)) {
+        taskIdToNodeIdMap[item.id] = 9
+      }
+    }
+  })
+  let res
+  if (currentPage.value === '1') {
+    let obj = {
+      id: ids,
+      taskIdToNodeIdMap: taskIdToNodeIdMap,
+      taskStatus: status
+    }
+    res = await batchApprovalTaskApi(obj)
+  } else if (currentPage.value === '2') {
+    let obj = {
+      reportId: currentId.value,
+      id: ids,
+      taskIds: ids,
+      taskIdToNodeIdMap: taskIdToNodeIdMap,
+      approvalOpinion: status == '3' ? '1' : '2'
+    }
+    res = await reportBatchApprovalTaskApi(obj)
+  }
+  if (res.data) {
+    uni.showToast({
+      title: '审核成功',
+      icon: 'none'
+    })
+  }
+  setTimeout(() => {
+    listArr.value = []
+    searchParams.value.current = 1
+    getList()
+  }, 1000)
+}
+</script>
+
+<style lang="scss" scoped>
+.task-audit {
+  padding: 24rpx 30rpx;
+
+  .search {
+    position: fixed;
+    width: 750rpx;
+    padding: 0 30rpx;
+    top: 0;
+    height: 60rpx;
+    background-color: #fff;
+    z-index: 99;
+    .top-search {
+      display: flex;
+      align-items: center;
+
+      .search-input {
+        width: 540rpx;
+        height: 70rpx;
+      }
+      .search-button {
+        color: #6eb657;
+        font-size: 30rpx;
+        margin: 0 10px;
+        font-weight: 400;
+      }
+    }
+  }
+  .checkbox {
+    margin-top: 80rpx;
+  }
+
+  .list {
+    margin-bottom: 120rpx;
+    padding-bottom: 60rpx;
+    .list-content {
+      display: flex;
+      align-items: center;
+      margin-top: 20rpx;
+    }
+    .item {
+      flex: 1;
+      box-shadow: 0px 4rpx 4rpx 0px rgba(0, 0, 0, 0.05);
+      margin-bottom: 20rpx;
+      border-radius: 16rpx;
+      .top {
+        padding: 0 30rpx;
+        box-sizing: border-box;
+        height: 100rpx;
+        background-color: #6eb657;
+        border-top-left-radius: 16rpx;
+        border-top-right-radius: 16rpx;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        .top-l {
+          display: flex;
+          align-items: center;
+
+          .image {
+            width: 28rpx;
+            height: 28rpx;
+          }
+          text {
+            font-size: 26rpx;
+            color: #fff;
+            line-height: 36rpx;
+            margin-left: 20rpx;
+          }
+        }
+        .top-r {
+          display: flex;
+          align-items: center;
+          text {
+            display: block;
+            width: 10rpx;
+            height: 10rpx;
+            background-color: #fff;
+            border-radius: 50%;
+            margin-right: 10rpx;
+          }
+          .status {
+            color: #fff;
+            font-size: 28rpx;
+            line-height: 40rpx;
+          }
+        }
+      }
+      .content {
+        background-color: #fff;
+        padding: 30rpx;
+        box-sizing: border-box;
+        .title {
+          display: flex;
+          justify-content: space-between;
+          margin-bottom: 20rpx;
+          align-items: center;
+          .task-name {
+            font-size: 32rpx;
+            line-height: 45rpx;
+            color: #313131;
+          }
+          .score {
+            font-size: 28rpx;
+            color: #72b25b;
+          }
+        }
+        .num {
+          font-weight: 400;
+          font-size: 22rpx;
+          line-height: 32rpx;
+          color: #999999;
+        }
+      }
+    }
+  }
+}
+
+.btn {
+  display: flex;
+  padding: 20rpx 30rpx;
+  box-sizing: border-box;
+  justify-content: space-between;
+  position: fixed;
+  background-color: #fff;
+  bottom: 0;
+  width: 700rpx;
+  height: 120rpx;
+
+  view {
+    font-weight: 400;
+    box-sizing: border-box;
+    font-size: 32rpx;
+    line-height: 45rpx;
+    border-radius: 8rpx;
+    height: 72rpx;
+    width: 290rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .cancel {
+    border: 2rpx solid #c7c7c7;
+    color: #111;
+  }
+  .confirm {
+    background-color: #6eb657;
+    color: #ffffff;
+  }
+}
+</style>

+ 155 - 0
src/pages-sub-service-mangement/quickAuditCard/components/cardList.vue

@@ -0,0 +1,155 @@
+<template>
+  <view class="card-list">
+    <view class="base-info">
+      <view class="title"> 任务类型: {{ getName(item.taskType) }} {{ props.index + 1 }}</view>
+      <view class="info">
+        <view>任务积分:{{ item.score }}</view>
+        <view>代表姓名:{{ item.taskUserName }}</view>
+      </view>
+      <view class="title">任务详情: </view>
+    </view>
+    <view class="task-detail">
+      <!-- 正常任务 -->
+      <view class="field-box" v-if="item.config?.length">
+        <template v-for="iten in item.config" :key="iten.id">
+          <!-- 文本展示类型 -->
+          <textCom v-if="textArr.includes(iten.taskFiledType)" :item="iten" :detailInfo="item" />
+          <!-- 下拉选择 -->
+          <selectCom
+            v-if="iten.taskFiledType == 'domain' || iten.taskFiledType == 'select'"
+            :item="iten"
+            :hideLine="true"
+            :detailInfo="item"
+            :dictList="item.dict"
+          />
+          <!-- 图片类型 -->
+          <template v-if="iten.taskFiledType == 'img' || iten.taskFiledType == 'sign'">
+            <imgCom :item="iten" :detailInfo="item" />
+          </template>
+          <!-- 长文本 -->
+          <template v-if="iten.taskFiledType == 'longtext'">
+            <longtextCom :item="iten" :detailInfo="item" />
+          </template>
+          <!-- 树形选择 -->
+        </template>
+      </view>
+      <!-- 转发类任务  -->
+      <view v-if="shareIdArr.includes(item.taskType)">
+        <shareCom :detailInfo="item" :ercodeUrl="ercodeUrl" />
+      </view>
+      <!-- 拜访类任务 -->
+      <view v-if="visitIdArr.includes(item.taskType)">
+        <visitCom :signInfoDetail="item.wmUserSignList" />
+      </view>
+    </view>
+    <view class="btn">
+      <view class="cancel" @click="reviewFn(0)">拒绝</view>
+      <view class="confirm" @click="reviewFn(1)">通过</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import textCom from '@/pages/task/task-detail/components/textCom.vue'
+import selectCom from '@/pages/task/task-detail/components/selectCom.vue'
+import imgCom from '@/pages/task/task-detail/components/imgCom.vue'
+import longtextCom from '@/pages/task/task-detail/components/longtextCom.vue'
+import visitCom from '@/pages/task/task-detail/components/visitCom.vue'
+import shareCom from '@/pages/task/task-detail/components/shareCom.vue'
+
+const props = defineProps(['item', 'index', 'taskList'])
+const emit = defineEmits(['reviewFn'])
+
+// 文本展示类型
+const textArr = [
+  'area',
+  'text',
+  'inputautoselect',
+  'map',
+  'datetime',
+  'datatimerange',
+  'number',
+  'money',
+  'tree'
+]
+
+// 转发分享类任务类型id
+const shareIdArr = ['8', '9', '10', '11']
+// 二维码
+const ercodeUrl = ref()
+
+// 拜访类任务类型id
+const visitIdArr = ['5', '6', '33']
+
+function getName(taskType: any) {
+  let curr = props.taskList?.find((item: any) => item.id == taskType)
+  if (curr) return curr.taskTypeName
+}
+
+const reviewFn = (type: number) => {
+  emit('reviewFn', type, props.index)
+}
+</script>
+
+<style lang="scss" scoped>
+.card-list {
+  margin-bottom: 30rpx;
+  background: #fff;
+
+  .base-info {
+    view {
+      line-height: 50rpx;
+    }
+    background-color: #fff;
+    padding: 20rpx;
+    padding-bottom: 0;
+    .title {
+      font-size: 32rpx;
+      color: #000;
+      font-weight: 800;
+      margin: 18rpx;
+    }
+  }
+
+  .task-detail {
+    box-sizing: border-box;
+    .poster-img {
+      padding: 20rpx;
+      width: 710rpx;
+    }
+    .line {
+      width: 100%;
+      height: 20rpx;
+      background: #f4f4f4;
+    }
+  }
+}
+.btn {
+  margin-top: 20rpx;
+  padding: 0 20rpx;
+  display: flex;
+  justify-content: space-between;
+
+  view {
+    font-weight: 400;
+    box-sizing: border-box;
+    font-size: 32rpx;
+    line-height: 45rpx;
+    border-radius: 8rpx;
+    height: 72rpx;
+    width: 290rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .cancel {
+    border: 2rpx solid #c7c7c7;
+    color: #111;
+  }
+  .confirm {
+    background-color: #6eb657;
+    color: #ffffff;
+  }
+}
+</style>

+ 146 - 0
src/pages-sub-service-mangement/quickAuditCard/index.vue

@@ -0,0 +1,146 @@
+<template>
+  <view class="quick-audit-card">
+    <view v-for="(item, index) in list" :key="index" class="card-list" v-show="item.show">
+      <CardList :item="item" :index="index" :taskList="taskListArr" @reviewFn="reviewFn" />
+      <uv-divider text="分割线" textColor="#6eb657" lineColor="#6eb657"></uv-divider>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onShow, onLoad, onReachBottom } from '@dcloudio/uni-app'
+import { reactive, ref } from 'vue'
+import {
+  getListApi,
+  getPackageTaskTypeApi,
+  batchApprovalTask,
+  wmreportBatchApprovalTask,
+  wmreportFetchListApi
+} from '@/service/modules/quickAuditCard'
+import { useLoginStore } from '@/store/login'
+import CardList from './components/cardList.vue'
+
+const loginStore = useLoginStore()
+let userInfo: any = loginStore.currentUserInfo
+const roles: number[] = userInfo?.roles || []
+
+const type = ref('')
+const id = ref('')
+onLoad((e) => {
+  type.value = e?.type
+  id.value = e?.id
+  getTaskListArr()
+  getList()
+})
+
+const taskListArr = ref<any[]>([])
+const getTaskListArr = async () => {
+  const res = await getPackageTaskTypeApi()
+  taskListArr.value = res.data
+}
+
+let list = ref<any[]>([])
+const getList = async () => {
+  let res
+  if (type.value === '1') {
+    res = await getListApi({
+      packageId: id.value
+    })
+  } else if (type.value === '2') {
+    res = await wmreportFetchListApi({
+      id: id.value
+    })
+  }
+  if (res.code === 0) {
+    list.value = res.data
+  }
+  // 针对图片处理
+  list.value.forEach((item) => {
+    if (item.config && item.config.length != 0) {
+      item.config.forEach((iten: any) => {
+        iten.taskFiledType = iten.taskFiledType.trim()
+        if (iten.taskFiledType == 'img') {
+          getImgList(item.wmTaskContent[iten.taskFiledKey], iten)
+        }
+      })
+    }
+    item.show = true
+  })
+}
+const getImgList = (urlStr: any, item: any) => {
+  if (item.taskFiledType != 'img') return ''
+  if (!urlStr) return ''
+  let uArr = urlStr.split(',')
+  if (!uArr) return ''
+  let imgList: any[] = []
+  let previewList: any[] = []
+  uArr.forEach((uItem: any) => {
+    let type = '无 '
+    if (uItem.includes(';1')) {
+      type = '拍照'
+      uItem = uItem.replace(';1', '')
+    }
+    if (uItem.includes(';2')) {
+      type = '相册'
+      uItem = uItem.replace(';2', '')
+    }
+    imgList.push({
+      type,
+      url: import.meta.env.VITE_APP_URL + uItem
+    })
+    previewList.push(import.meta.env.VITE_APP_URL + uItem)
+  })
+  item.imgList = imgList
+  item.previewList = previewList
+  return ''
+}
+// type  0 拒绝 1 通过
+const reviewFn = async (result: number, index: number) => {
+  const item = list.value[index]
+  let res
+  if (type.value === '1') {
+    const obj = {
+      id: item.id,
+      taskStatus: result == 0 ? 4 : 3,
+      taskIdToNodeIdMap: {
+        [item.id]: item.taskInfo.checkState.curNodeId
+      }
+    }
+    res = await batchApprovalTask(obj)
+  } else if (type.value === '2') {
+    const approvalOpinion = result == 1 ? 1 : 2
+    let nodeId = item.taskInfo.checkState.nextNodeId
+    if (roles.includes(42)) {
+      nodeId = 8
+    }
+    // 40 商务组
+    if (roles.includes(40)) {
+      nodeId = 9
+    }
+    let obj = {
+      reportId: id.value,
+      taskIds: id,
+      taskIdToNodeIdMap: {
+        [item.id]: nodeId
+      },
+      approvalOpinion: approvalOpinion
+    }
+    res = await wmreportBatchApprovalTask(obj)
+  }
+
+  if (res.code == 0) {
+    list.value[index].show = false
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.quick-audit-card {
+  background-color: #f8f8f8;
+  .card-list {
+    margin-bottom: 20rpx;
+    padding-bottom: 20rpx;
+    background-color: #fff;
+  }
+}
+</style>

+ 381 - 0
src/pages-sub-service-mangement/serviceDelivery/index.vue

@@ -0,0 +1,381 @@
+<template>
+  <view class="objectives-list">
+    <view class="search">
+      <view class="top-search">
+        <view class="search-input">
+          <uv-input
+            v-model="searchParams.scorePackageName"
+            :customStyle="customStyle"
+            clearable
+            shape="circle"
+            placeholder="请输入"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #6eb657"
+          ></uv-input>
+        </view>
+        <view class="search-button" @click="searchFn">搜索</view>
+        <uv-icon name="plus-circle" color="#6eb657" size="24" @click="addFn" />
+      </view>
+      <view class="search-content">
+        <view
+          class="search-list"
+          @click="searchClick('acceptSug')"
+          :class="searchParams.acceptSug ? 'active' : ''"
+        >
+          <text>承接对象</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.acceptSug ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+        <view
+          class="search-list"
+          @click="searchClick('period')"
+          :class="searchParams.allocationDate ? 'active' : ''"
+        >
+          <text>创建日期</text>
+          <uv-icon
+            name="arrow-down-fill"
+            :color="searchParams.allocationDate ? '#6eb657' : '#111111'"
+            size="14"
+          />
+        </view>
+      </view>
+    </view>
+
+    <view class="list" v-if="hasInfo">
+      <view class="item" v-for="item in listArr" :key="item.id">
+        <view class="header">
+          <view class="title">{{ item.scorePackageName }}</view>
+          <view class="status">
+            <text class="circle"></text>
+            <text>{{ getStatusName(item.packageFinishStatus) }}</text>
+          </view>
+        </view>
+        <view class="content">
+          <view class="txt">承接对象:{{ getCsoName(Number(item.acceptSug)) }}</view>
+          <view class="txt">分配日期:{{ item.allocationDate }}</view>
+          <view class="progress">
+            <uv-line-progress
+              class="pro-two"
+              round
+              :showText="false"
+              :percentage="item.finishRate"
+              activeColor="#95dc7e"
+              inactiveColor="#f8f8f0"
+            ></uv-line-progress>
+            <text>{{ item.finishRate }}%</text>
+          </view>
+          <view class="txt">{{ item.ysh }}/{{ item.score }}</view>
+          <view class="btns">
+            <view class="btn" @click.stop.prevent.self="toDetail(2, item)">
+              <image src="@/static/images/icon/detail.png" class="image" />
+              <text>查看</text>
+            </view>
+            <view class="btn" @click.stop.prevent.self="toDetail(3, item)">
+              <image src="@/static/images/icon/edit.png" class="image" />
+              <text>编辑</text>
+            </view>
+            <view class="btn" @click.stop.prevent.self="stopBtn(item)">
+              <image src="@/static/images/icon/close.png" class="image" />
+              <text>终止</text>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <noData v-else />
+    <!-- 选择承接对象 -->
+    <uv-picker
+      :cancelText="searchParams.acceptSug ? '清空' : '取消'"
+      ref="pickerRef"
+      :columns="csoList"
+      keyName="gsmc"
+      @confirm="pickerConfim"
+      @cancel="pickerCancel"
+    ></uv-picker>
+    <!-- 月份范围 -->
+    <KDatePicker
+      v-model="show"
+      type="day"
+      :confirmText="searchParams.allocationDate.length ? '清除' : '确定'"
+      is-range
+      @change="getDate"
+      formatter="YYYY-MM-DD"
+    />
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { onShow, onReachBottom } from '@dcloudio/uni-app'
+import { getListCsoApi } from '@/service/modules/objectivesList'
+import { getListApi } from '@/service/modules/serviceDelivery'
+import { getDictByNameApi } from '@/service/modules/getDict'
+import KDatePicker from '@/components/dateSelect/k-date-picker/KDatePicker.vue'
+import noData from '@/components/noData/index.vue'
+
+const customStyle = {
+  backgroundColor: '#f6f6f6'
+}
+
+onShow(() => {
+  listArr.value = []
+  getDict()
+  getList()
+})
+
+class Params {
+  acceptSug = ''
+  scorePackageName = ''
+  total = -1
+  current = 1
+  allocationDate = ''
+  endLabelDate = ''
+  size = 10
+}
+
+const searchParams = ref(new Params())
+
+const hasInfo = ref(true)
+const listArr = ref<any[]>([])
+const getList = async () => {
+  uni.showLoading()
+  const res = await getListApi(searchParams.value)
+  if (res.code === 0) {
+    searchParams.value.total = res.data.total
+    listArr.value = listArr.value.concat(res.data.records)
+    hasInfo.value = !!listArr.value.length
+  }
+  uni.hideLoading()
+}
+
+const csoList = ref<any[]>([])
+const packageFinishStatusList = ref<any[]>([])
+const getDict = async () => {
+  getDictByNameApi('package_finish_status').then(
+    (res: any) => (packageFinishStatusList.value = res.data)
+  )
+  getListCsoApi().then((res: any) => (csoList.value = [res.data]))
+}
+const getCsoName = (acceptSug: number) => {
+  const curr = csoList.value[0]?.find((item: any) => item.id === acceptSug)
+  return curr?.gsmc
+}
+const getStatusName = (planState: string) => {
+  const curr = packageFinishStatusList.value?.find((item: any) => item.value === planState)
+  return curr?.label
+}
+
+const searchFn = () => {
+  listArr.value = []
+  searchParams.value.current = 1
+  getList()
+}
+
+const pickerRef = ref()
+const show = ref(false)
+
+const searchClick = (type: string) => {
+  if (type === 'acceptSug') {
+    pickerRef.value.open()
+  } else {
+    show.value = true
+  }
+}
+
+const pickerConfim = (e: any) => {
+  searchParams.value.acceptSug = e.value[0].id
+  searchFn()
+}
+
+const pickerCancel = () => {
+  if (searchParams.value.acceptSug) {
+    searchParams.value.acceptSug = ''
+    searchFn()
+  }
+}
+
+const getDate = (e: any[]) => {
+  if (searchParams.value.allocationDate && searchParams.value.endLabelDate) {
+    searchParams.value.allocationDate = ''
+    searchParams.value.endLabelDate = ''
+  } else {
+    searchParams.value.allocationDate = e[0]
+    searchParams.value.endLabelDate = e[1]
+  }
+
+  show.value = false
+  searchFn()
+}
+
+onReachBottom(() => {
+  if (listArr.value.length === searchParams.value.total) return
+  searchParams.value.current++
+  getList()
+})
+const addFn = () => {
+  uni.navigateTo({
+    url: '/pages-sub-service-mangement/serviceDeliveryAdd/index?&type=1'
+  })
+}
+
+const toDetail = (type: number, row: any) => {
+  if (type === 3) {
+    if (['1', '2'].includes(row.packageFinishStatus)) {
+      return uni.showToast({
+        title: '当前执行包无法编辑',
+        icon: 'none'
+      })
+    }
+  }
+  uni.navigateTo({
+    url: `/pages-sub-service-mangement/serviceDeliveryAdd/index?&type=${type}&id=${row.id}`
+  })
+}
+//
+const stopBtn = (row: any) => {
+  uni.navigateTo({
+    url: `/pages-sub-service-mangement/stopServiceDelivery/index?type=${1}&id=${row.id}`
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+.objectives-list {
+  padding: 24rpx 0;
+  .search {
+    position: fixed;
+    width: 750rpx;
+    padding: 0 30rpx;
+    top: 0;
+    height: 150rpx;
+    background-color: #fff;
+    z-index: 99;
+    .top-search {
+      display: flex;
+      align-items: center;
+
+      .search-input {
+        width: 540rpx;
+        height: 70rpx;
+      }
+      .search-button {
+        color: #6eb657;
+        font-size: 30rpx;
+        margin: 0 10px;
+        font-weight: 400;
+      }
+    }
+    .search-content {
+      margin-top: 24rpx;
+      padding-bottom: 10rpx;
+      display: flex;
+      .search-list {
+        display: flex;
+        align-content: center;
+        margin-right: 64rpx;
+        height: 40rpx;
+        text {
+          font-weight: 500;
+          line-height: 40rpx;
+          font-size: 28rpx;
+          color: #111111;
+          margin-right: 8rpx;
+        }
+      }
+      .active text {
+        color: #6eb657;
+      }
+    }
+  }
+
+  .list {
+    margin-top: 150rpx;
+    padding: 0 30rpx;
+    .item {
+      margin-bottom: 20rpx;
+      width: 100%;
+      border-radius: 16rpx;
+      box-shadow: 0px 2rpx 8rpx 0px rgba(0, 0, 0, 0.2);
+      .header {
+        background-color: #f8f8f0;
+        padding: 26rpx 20rpx;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        border-top-left-radius: 16rpx;
+        border-top-right-radius: 16rpx;
+        .title {
+          font-size: 32rpx;
+          line-height: 45rpx;
+          width: 70%;
+          font-weight: 500;
+          color: #333;
+          word-wrap: break-word;
+        }
+        .status {
+          .circle {
+            display: block;
+            border-radius: 50%;
+            background-color: #72b25b;
+            margin-right: 10rpx;
+            width: 15rpx;
+            height: 15rpx;
+          }
+          display: flex;
+          align-items: center;
+          color: #72b25b;
+        }
+      }
+      .content {
+        padding: 20rpx;
+        .txt {
+          font-weight: 400;
+          color: #999;
+          font-size: 22rpx;
+          line-height: 30rpx;
+          margin-bottom: 16rpx;
+        }
+        .progress {
+          display: flex;
+          align-items: center;
+          margin-bottom: 8rpx;
+          .pro-two {
+            width: 80%;
+          }
+          text {
+            margin-left: 10px;
+            color: #010101;
+            font-size: 26rpx;
+            line-height: 36rpx;
+          }
+        }
+        .btns {
+          margin-top: 30rpx;
+          display: flex;
+
+          .btn {
+            display: flex;
+            align-items: center;
+            height: 34rpx;
+            margin-right: 36rpx;
+
+            .image {
+              width: 28rpx;
+              height: 28rpx;
+              margin-right: 12rpx;
+            }
+            text {
+              color: #6eb657;
+              font-size: 24rpx;
+              line-height: 34rpx;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 125 - 0
src/pages-sub-service-mangement/serviceDeliveryAdd/components/TableData.vue

@@ -0,0 +1,125 @@
+<template>
+  <view class="table">
+    <uni-table border stripe emptyText="暂无更多数据">
+      <!-- 表头行 -->
+      <uni-tr>
+        <uni-th align="center" width="50">序号</uni-th>
+        <uni-th align="center">上级服务类型</uni-th>
+        <uni-th align="center" width="50">占比(%)</uni-th>
+        <uni-th align="center">任务类型</uni-th>
+        <uni-th align="center" width="50">积分值</uni-th>
+        <uni-th align="center" width="50">任务个数</uni-th>
+        <uni-th align="center" width="80">任务积分值</uni-th>
+      </uni-tr>
+      <!-- 表格数据行 -->
+      <uni-tr v-for="(item, index) in tableData" :key="item?.taskTypeId" index>
+        <uni-td>{{ index + 1 }}</uni-td>
+        <uni-td>{{ showInfo(item, index) }}</uni-td>
+        <uni-td>
+          <text
+            :class="{
+              error: item.score != 0 && (item.percentage < 25 || item.percentage > 50)
+            }"
+            >{{ showPercentage(item, index) }}</text
+          >
+        </uni-td>
+        <uni-td>{{ item.taskTypeName }}</uni-td>
+        <uni-td>{{ item.score }}</uni-td>
+        <uni-td>
+          <input type="number" @blur="(e) => change(e, index, item)" v-model="item.qty" />
+        </uni-td>
+        <uni-td>{{ item.subtotal }}</uni-td>
+      </uni-tr>
+      <!-- 结尾 -->
+      <uni-tr>
+        <uni-td>总计</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>---</uni-td>
+        <uni-td>{{ totalQty }}</uni-td>
+        <uni-td>{{ totalsubtotal }}</uni-td>
+      </uni-tr>
+    </uni-table>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+
+const tableData = ref<any[]>([])
+
+const totalQty = ref(0)
+const totalsubtotal = ref(0)
+
+const change = (detail: any, index: number) => {
+  tableData.value[index].subtotal = tableData.value[index].qty * tableData.value[index].score
+  totalQty.value = tableData.value.reduce((sum, row) => Number(sum) + Number(row.qty), 0)
+  totalsubtotal.value = tableData.value.reduce((sum, row) => Number(sum) + Number(row.subtotal), 0)
+}
+
+const setData = (data: any[], planDetails: any, planScore: number) => {
+  totalQty.value = planDetails.qty
+  totalsubtotal.value = planDetails.total
+  tableData.value = data
+  let arr = tableData.value.map((item) => item.baseId)
+  arr = [...new Set(arr)]
+  for (let currBaseId of arr) {
+    const allSubtotal = tableData.value.reduce((accumulator, currentValue) => {
+      if (currentValue.baseId === currBaseId) {
+        return accumulator + currentValue.subtotal
+      }
+      return accumulator
+    }, 0)
+
+    const percentage = calculatePercentage(allSubtotal, planScore)
+
+    tableData.value.forEach((item) => {
+      if (item.baseId === currBaseId) {
+        item.percentage = percentage
+      }
+    })
+  }
+}
+const getData = () => {
+  return tableData.value
+}
+
+const calculatePercentage = (part: any, total: any) => {
+  if (total === 0) return 0 // 避免除以0错误
+  return Number(((part / total) * 100).toFixed(2))
+}
+
+const showInfo = (item: any, index: number) => {
+  if (index === 0) {
+    return item.baseId
+  }
+  if (tableData.value[index - 1].baseId === item.baseId) {
+    return ''
+  } else {
+    return item.baseId
+  }
+}
+const showPercentage = (item: any, index: number) => {
+  if (index === 0) {
+    return item.percentage
+  }
+  if (tableData.value[index - 1].baseId === item.baseId) {
+    return ''
+  } else {
+    return item.percentage
+  }
+}
+
+defineExpose({ setData, getData })
+</script>
+
+<style lang="scss" scoped>
+.table {
+  margin-top: 20rpx;
+  width: 640rpx;
+  min-height: 300rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+}
+</style>

+ 134 - 0
src/pages-sub-service-mangement/serviceDeliveryAdd/components/taskTree.vue

@@ -0,0 +1,134 @@
+<template>
+  <view class="tree">
+    <view class="tree-content" v-for="(item, index) in treeListData" :key="index">
+      <view class="title">
+        <uv-icon
+          :name="item.show ? 'arrow-down-fill' : 'play-right-fill'"
+          color="#c0c4cc"
+          size="14"
+          class="icon"
+          @click="changeShow(index)"
+        ></uv-icon>
+        <view class="checkbox">
+          <checkbox-group @change="fChange(index)">
+            <label>
+              <checkbox
+                activeColor="#6eb657"
+                activeBackgroundColor="#6eb657"
+                :checked="item.checked"
+                :disabled="item.disabled"
+                style="transform: scale(0.7)"
+              />
+              {{ item.taskTypeName }}
+            </label>
+          </checkbox-group>
+        </view>
+      </view>
+      <view class="children" v-show="item.show">
+        <checkbox-group
+          v-for="(iten, indey) in item.children"
+          :key="iten.taskTypeId"
+          @change="cChange(index, indey)"
+        >
+          <label>
+            <checkbox
+              activeColor="#6eb657"
+              activeBackgroundColor="#6eb657"
+              :disabled="iten.disabled"
+              :checked="iten.checked"
+              style="transform: scale(0.7)"
+            />
+            {{ iten.taskTypeName }}
+          </label>
+        </checkbox-group>
+      </view>
+    </view>
+    <view class="border"></view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { treeList } from './treeList'
+
+const treeListData = ref(treeList)
+const changeShow = (index: number) => {
+  treeListData.value[index].show = !treeListData.value[index].show
+}
+
+const fChange = (index: number) => {
+  treeListData.value[index].checked = !treeListData.value[index].checked
+  treeListData.value[index].children.forEach(
+    (item: any) => (item.checked = treeListData.value[index].checked)
+  )
+}
+const cChange = (index: number, indey: number) => {
+  treeListData.value[index].children[indey].checked =
+    !treeListData.value[index].children[indey].checked
+  const arr = treeListData.value[index].children.filter((item: any) => item.checked)
+  treeListData.value[index].checked = arr.length
+}
+
+const mapData = () => {
+  const arr = treeListData.value.filter((item) => item.checked)
+  arr.forEach((item) => {
+    item.children = item.children.filter((item: any) => item.checked)
+  })
+  return arr
+}
+
+const initData = (arr: string[]) => {
+  const treeListCopy = JSON.parse(JSON.stringify(treeList))
+  // treeListCopy.forEach((item: any) => {
+  //   item.disabled = true
+  //   item.checked = arr.includes(item.taskTypeId)
+  //   item.children.forEach((iten: any) => {
+  //     iten.disabled = true
+  //     iten.checked = arr.includes(item.taskTypeId)
+  //   })
+  // })
+  treeListData.value = treeListCopy
+}
+
+const editData = (arr: string[]) => {
+  const treeListCopy = JSON.parse(JSON.stringify(treeList))
+  treeListCopy.forEach((item: any) => {
+    item.checked = arr.includes(item.taskTypeId)
+    item.children.forEach((iten: any) => {
+      iten.checked = arr.includes(item.taskTypeId)
+    })
+  })
+  treeListData.value = treeListCopy
+}
+
+defineExpose({ mapData, initData, editData })
+</script>
+
+<style lang="scss" scoped>
+.tree-content {
+  margin-top: 24rpx;
+  .title {
+    display: flex;
+    align-items: center;
+    height: 48rpx;
+    margin-bottom: 12rpx;
+  }
+  .children {
+    padding-left: 50rpx;
+  }
+  .checkbox {
+    margin-left: 10rpx;
+    display: flex;
+    align-items: center;
+    height: 48rpx;
+    transition: all 1s ease-in;
+  }
+}
+.border {
+  width: 100%;
+  height: 1px;
+  background-color: #d6d7d9;
+  margin-top: 20rpx;
+  transform: scaleY(0.5);
+}
+</style>

+ 112 - 0
src/pages-sub-service-mangement/serviceDeliveryAdd/components/treeList.ts

@@ -0,0 +1,112 @@
+export const treeList: any[] = [
+  {
+    taskTypeId: 'p-1',
+    taskTypeName: '学术会议服务',
+    show: false,
+    disabled: true,
+    checked: true,
+    children: [
+      { taskTypeId: '1', taskTypeName: 'POV科室会', disabled: true, checked: true },
+      { taskTypeId: '5', taskTypeName: '沙龙会', disabled: true, checked: true },
+      { taskTypeId: '2', taskTypeName: '区县学术会议', disabled: true, checked: true },
+      { taskTypeId: '3', taskTypeName: '市级学术会议', disabled: true, checked: true },
+      { taskTypeId: '4', taskTypeName: '省级学术会议', disabled: true, checked: true },
+      { taskTypeId: '64', taskTypeName: '线上学术会议', disabled: true, checked: true },
+      { taskTypeId: '19', taskTypeName: '健康教育课堂', disabled: true, checked: true }
+    ]
+  },
+  {
+    taskTypeId: 'p-2',
+    taskTypeName: '学术拜访服务',
+    show: false,
+    disabled: true,
+    checked: true,
+    children: [
+      { taskTypeId: '53', taskTypeName: '基础拜访', disabled: true, checked: true },
+      { taskTypeId: '51', taskTypeName: '专业拜访', disabled: true, checked: true },
+      { taskTypeId: '52', taskTypeName: '专项拜访', disabled: true, checked: true }
+    ]
+  },
+  {
+    taskTypeId: 'p-4',
+    taskTypeName: '产品推广',
+    show: false,
+    disabled: true,
+    checked: true,
+    children: [{ taskTypeId: '8', taskTypeName: '产品相册分享', disabled: true, checked: true }]
+  },
+  {
+    taskTypeId: 'p-5',
+    taskTypeName: '学术信息交流',
+    show: false,
+    disabled: true,
+    checked: true,
+    children: [{ taskTypeId: '9', taskTypeName: '学术信息交流', disabled: true, checked: true }]
+  },
+  {
+    taskTypeId: 'p-3',
+    taskTypeName: '商务协作',
+    show: false,
+    disabled: true,
+    checked: true,
+    children: [
+      { taskTypeId: '14', taskTypeName: '数据收集', disabled: true, checked: true },
+      { taskTypeId: '17', taskTypeName: '医学警戒信息收集', disabled: true, checked: true },
+      { taskTypeId: '12', taskTypeName: '产品展示', disabled: true, checked: true },
+      { taskTypeId: '13', taskTypeName: '业务宣传服务', disabled: true, checked: true }
+    ]
+  }
+]
+
+export const pFlist = [
+  {
+    taskTypeName: '学术会议服务',
+    taskTypeId: 'p-1',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '学术拜访服务',
+    taskTypeId: 'p-2',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '市场信息服务',
+    taskTypeId: 'p-1',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '学术会议服务',
+    taskTypeId: 'p-3',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '产品推广',
+    taskTypeId: 'p-4',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '学术信息交流',
+    taskTypeId: 'p-5',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '医药研发服务',
+    taskTypeId: 'p-6',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '专项服务',
+    taskTypeId: 'p-17',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '商业公司客户管理',
+    taskTypeId: 'p-18',
+    children: [] as any[]
+  },
+  {
+    taskTypeName: '代理商客户管理',
+    taskTypeId: 'p-19',
+    children: [] as any[]
+  }
+]

+ 667 - 0
src/pages-sub-service-mangement/serviceDeliveryAdd/index.vue

@@ -0,0 +1,667 @@
+<template>
+  <view class="service-delivery-add">
+    <view class="message">
+      <uv-text
+        type="error"
+        text="本系统中的年度服务目标、【年度服务预算】、年度服务计划等,无论是否经由一方或双方同意或者确认,均不构成双方之间的协议;服务量、服务费用价格与金额等应以另行签署的合同为准。"
+      ></uv-text>
+    </view>
+    <view class="form">
+      <uv-form
+        labelPosition="left"
+        :model="form"
+        :rules="rules"
+        ref="formRef"
+        labelWidth="120"
+        :labelStyle="labelStyle"
+      >
+        <uv-form-item label="执行包名称" prop="scorePackageName" borderBottom required>
+          <uv-input
+            v-model="form.scorePackageName"
+            border="none"
+            placeholder="请输入"
+            :readonly="formDisabled"
+          />
+        </uv-form-item>
+        <uv-form-item
+          label="所属月份"
+          prop="belongDate"
+          borderBottom
+          @click="showSelect('belongDate')"
+          required
+        >
+          <uv-input
+            prefixIcon="calendar"
+            prefixIconStyle="font-size: 22px;color: #909399"
+            v-model="form.belongDate"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+        </uv-form-item>
+        <uv-form-item
+          label="关联服务企业"
+          prop="relatedServiceLabel"
+          borderBottom
+          @click="showSelect('relatedServiceLabel')"
+          required
+        >
+          <uv-input
+            v-model="form.relatedServiceLabel"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item
+          label="关联执行包名称"
+          prop="relationScoreIdLable"
+          borderBottom
+          @click="showSelect('relationScoreIdLable')"
+          required
+        >
+          <uv-input
+            v-model="form.relationScoreIdLable"
+            border="none"
+            placeholder="请选择"
+            readonly
+          />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item
+          label="服务目标"
+          prop="planIdLabel"
+          borderBottom
+          @click="showSelect('planIdLabel')"
+          required
+        >
+          <uv-input v-model="form.planIdLabel" border="none" placeholder="请选择" readonly />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+        <uv-form-item label="承接对象" prop="acceptSugLabel" borderBottom required>
+          <uv-input v-model="form.acceptSugLabel" border="none" placeholder="请选择" readonly />
+        </uv-form-item>
+        <uv-form-item label="生效日期" prop="startTime" borderBottom required>
+          <uv-input v-model="form.startTime" border="none" placeholder="请选择" readonly />
+        </uv-form-item>
+        <uv-form-item label="截止日期" prop="endTimeValue" borderBottom required>
+          <uv-input v-model="form.endTimeValue" border="none" placeholder="请选择" readonly />
+        </uv-form-item>
+
+        <uv-form-item label="可分配积分值" prop="kfpjf" borderBottom>
+          <uv-input v-model="form.kfpjf" type="number" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="执行包总值" prop="score" borderBottom required>
+          <uv-input v-model="form.score" type="number" readonly border="none" />
+        </uv-form-item>
+        <uv-form-item label="推广产品" prop="drugtableLabel" borderBottom>
+          <uv-input v-model="form.drugtableLabel" border="none" placeholder="请选择" readonly />
+        </uv-form-item>
+        <!-- 服务区域 -->
+        <uv-form-item
+          v-if="IS_DLS"
+          label="服务区域"
+          prop="planIdLabel"
+          borderBottom
+          @click="showSelect('provAbbr')"
+          required
+        >
+          <uv-input v-model="form.provAbbr" border="none" placeholder="请选择" readonly />
+          <template v-slot:right>
+            <uv-icon name="arrow-right"></uv-icon>
+          </template>
+        </uv-form-item>
+
+        <uv-form-item label="有效任务类型如下:" labelWidth="140" labelPosition="top" placeholder>
+          <template v-if="!IS_DLS">
+            <taskTree ref="taskTreeRef" />
+          </template>
+          <template v-else>
+            <TableData ref="tableRef" />
+          </template>
+        </uv-form-item>
+        <uv-form-item label="描述" prop="description" borderBottom labelWidth="40">
+          <uv-textarea
+            v-model="form.description"
+            placeholder="请输入内容"
+            height="48"
+          ></uv-textarea>
+        </uv-form-item>
+      </uv-form>
+
+      <!-- 选择服务企业 -->
+      <uv-picker
+        ref="csoPickerRef"
+        :columns="[csoList]"
+        keyName="name"
+        @confirm="(e: any) => pickerConfim(e, 'relatedServiceLabel')"
+      ></uv-picker>
+      <!-- 选择关联执行包 -->
+      <uv-picker
+        ref="relationPickerRef"
+        :columns="[gljfbOptionsList]"
+        keyName="relationScoreName"
+        @confirm="(e: any) => pickerConfim(e, 'relationScoreIdLable')"
+      ></uv-picker>
+      <!-- 选择服务目标 -->
+      <uv-picker
+        ref="planPickerRef"
+        :columns="[planList]"
+        keyName="planName"
+        @confirm="(e: any) => pickerConfim(e, 'planIdLabel')"
+      ></uv-picker>
+      <!-- 选择区域 -->
+      <uv-picker
+        ref="provAbbrRef"
+        :columns="[provAbbrArr]"
+        @confirm="(e: any) => pickerConfim(e, 'provAbbrArr')"
+      ></uv-picker>
+    </view>
+    <view class="btn" v-if="currentType != 2">
+      <view class="cancel" @click="cancelFn">取消</view>
+      <view class="confirm" @click="confirmFn">确定</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import dayjs from 'dayjs'
+import KDatePicker from '@/components/dateSelect/k-date-picker/KDatePicker.vue'
+import { ref, reactive } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useLoginStore } from '@/store/login'
+import {
+  getListAncestorApi,
+  getPlanListApi,
+  selectKfpjfApi,
+  wmscorepackageSaveApi,
+  getSelectWmScorePackageApi,
+  getSelectRelationScoreIdApi,
+  wmscorepackageUpdateByIdsApi
+} from '@/service/modules/serviceDelivery'
+import taskTree from './components/taskTree.vue'
+import TableData from './components/TableData.vue'
+import { pFlist } from './components/treeList'
+import { toRaw } from 'vue'
+
+const loginStore = useLoginStore()
+
+let userInfo: any = loginStore.currentUserInfo
+const roles = userInfo.roles
+const formDisabled = ref(false)
+const editDisabled = ref(false)
+const currentType = ref()
+const currentId = ref()
+
+const IS_DLS = ref(false)
+onLoad(async (e: any) => {
+  if (roles.includes(4)) {
+    IS_DLS.value = true
+  }
+
+  const date = dayjs().format('YYYY-MM')
+  form.belongDate = date
+
+  // 获取字典
+  getDict()
+  currentType.value = e?.type
+  currentId.value = e?.id
+  if (e?.type === '2') {
+    formDisabled.value = true
+    initInfo()
+  } else if (e?.type == '3') {
+    editDisabled.value = true
+    initInfo()
+  }
+})
+
+const initInfo = async () => {
+  const obj = {
+    scoreId: currentId.value
+  }
+  const res = await getSelectWmScorePackageApi(obj)
+  const detail = res.data
+  form.scorePackageName = detail.scorePackageName
+  form.belongDate = detail.belongDate
+  form.relatedService = detail.relatedService
+  form.relatedServiceLabel = detail.relatedServiceName
+  form.relationScoreId = detail.relationScoreId
+  form.relationScoreIdLable = detail.relationScoreName || '无'
+  form.planIdLabel = detail.plan.planName
+  form.planId = detail.plan.planId
+  form.startTime = detail.startTime
+  form.endTimeValue = detail.endTime
+  form.acceptSug = detail.acceptSug
+  form.acceptSugLabel = detail.acceptSugName
+  form.drugtable = detail.drugtable
+  form.drugtableLabel = detail?.drugtableName[0]
+  form.entTaskLimit = detail.entTaskLimit
+  form.description = detail.description
+  form.score = detail.score
+
+  if (IS_DLS.value) {
+    if (currentType.value === '2') {
+      tableRef.value.setData(detail.taskTypeSet)
+    } else if (currentType.value === '3') {
+      tableRef.value.setData(detail.taskTypeSet)
+    }
+  } else {
+    if (currentType.value === '2') {
+      taskTreeRef.value.initData(detail.taskTypeSet)
+    } else if (currentType.value === '3') {
+      taskTreeRef.value.editData(detail.taskTypeSet)
+    }
+  }
+}
+
+const labelStyle = {
+  fontWeight: 400,
+  fontSize: '30rpx',
+  color: '#000'
+}
+
+const csoList = ref<any[]>([])
+const planList = ref<any[]>([])
+const provAbbrArr = ref<any[]>([])
+
+const planPickerRef = ref()
+const csoPickerRef = ref()
+const relationPickerRef = ref()
+const provAbbrRef = ref()
+const planIdLabelFlag = ref(false)
+const showSelect = (type: string) => {
+  if (formDisabled.value) return
+  switch (type) {
+    case 'relatedServiceLabel':
+      if (roles.includes(3)) return
+      if (editDisabled.value) return
+      csoPickerRef.value.open()
+      break
+    case 'relationScoreIdLable':
+      if (roles.includes(3)) return
+      if (!gljfbOptionsList.value.length) return
+      relationPickerRef.value.open()
+      break
+    case 'planIdLabel':
+      if (roles.includes(3) || planIdLabelFlag.value) {
+        planPickerRef.value.open()
+      }
+      break
+    case 'provAbbr':
+      if (!form.planIdLabel) return
+      if (provAbbrArr.value.length) {
+        provAbbrRef.value.open()
+      }
+      break
+    default:
+      break
+  }
+}
+
+const tableRef = ref()
+const pickerConfim = (e: any, type: string) => {
+  if (type === 'relatedServiceLabel') {
+    const value = e.value[0]
+    form.relationScoreId = ''
+    form.relationScoreIdLable = ''
+    form.relatedService = value.deptId
+    form.relatedServiceLabel = value.name
+    initRelationScore(value.deptId)
+  }
+  if (type === 'relationScoreIdLable') {
+    const value = e.value[0]
+    form.relationScoreId = value.id
+    form.relationScoreIdLable = value.relationScoreName
+    initScoreById(value.id)
+    planIdLabelFlag.value = true
+    getPlanList(value.id)
+  }
+  if (type === 'planIdLabel') {
+    const value = e.value[0]
+    form.planId = value.planId
+    form.planIdLabel = value.planName
+    const curr = selectKfpjfList.value.find((item) => item.deptId == value.consigneeId)
+    provAbbrArr.value = curr?.provAbbr?.split(',')
+
+    form.acceptSug = curr?.id
+    form.acceptSugLabel = curr?.gsmc
+    form.drugtableLabel = value.skuInfo.skuName
+    form.drugtable = [value.skuInfo.skuId]
+    form.startTime = value.planIssue
+    form.endTimeValue = value.planExpiry
+    form.score = value.planScore
+    if (IS_DLS.value) {
+      if (!value.planItems) {
+        return uni.showModal({
+          title: '提示',
+          showCancel: false,
+          content: `服务目标【${value.planName}】不存在可用的拆解详情,请核实!`,
+          success: function (res) {
+            if (res.confirm) {
+              console.log('用户点击确定')
+            } else if (res.cancel) {
+              console.log('用户点击取消')
+            }
+          }
+        })
+      }
+      tableRef.value.setData(value.planItems, value.planDetails, value.planScore)
+      form.score = value?.planDetails?.total + ''
+    }
+  }
+  if (type == 'provAbbrArr') {
+    const value = e.value[0]
+    console.log('value', value)
+
+    form.provAbbr = value
+  }
+}
+
+const gljfbOptionsList = ref<any[]>([])
+const initRelationScore = async (id: number) => {
+  const obj = {
+    relatedService: id
+  }
+  const res = await getSelectRelationScoreIdApi(obj)
+  gljfbOptionsList.value = res.data
+}
+
+const initScoreById = (id: string) => {
+  selectKfpjf(id)
+}
+
+const getDict = () => {
+  let obj = {
+    onlySelf: false
+  }
+  if (roles.includes(3)) {
+    obj.onlySelf = true
+  }
+  // 获取关联服务企业
+  getListAncestorApi(obj).then((res: any) => {
+    // 当发包对象为药企管理员
+    if (roles.includes(3)) {
+      form.relatedServiceLabel = res.data[0].name
+      form.relatedService = res.data[0].deptId
+      form.relationScoreIdLable = '无'
+      form.relationScoreId = '-1'
+      selectKfpjf('-1')
+      getPlanList(-1)
+    }
+    csoList.value = res.data
+  })
+}
+
+const getPlanList = (pkgId: string | number) => {
+  getPlanListApi({
+    planType: 'QRT',
+    pkgId: pkgId
+  }).then((res: any) => {
+    res.data.forEach((item: any) => {
+      item.planName = item.planName + `(${item.planIssue} ~ ${item.planExpiry})`
+    })
+    planList.value = res.data
+  })
+}
+
+const selectKfpjfList = ref<any[]>([])
+const selectKfpjf = async (id: string) => {
+  const res = await selectKfpjfApi({ id })
+  const arr = res.data[0].acceptSug.map((item: any) => {
+    return {
+      gsmc: item.gsmc,
+      deptId: item.deptId,
+      provAbbr: item.provAbbr,
+      id: item.id
+    }
+  })
+  selectKfpjfList.value = arr
+  if (!roles.includes(3)) {
+    const treeValue = res.data[1].wmScoreTaskTypeList
+    taskTreeRef.value.initData(treeValue)
+    form.kfpjf = res.data[1].kfpjf
+  }
+}
+const cancelFn = () => {
+  uni.navigateBack()
+}
+
+const taskTreeRef = ref()
+const confirmFn = () => {
+  let wmScoreTaskTypeList: any[]
+  let pkgTaskTypeQtyList: any[]
+  if (!IS_DLS.value) {
+    const data = taskTreeRef.value.mapData()
+    wmScoreTaskTypeList = [...data]
+    data.forEach((item: any) => {
+      wmScoreTaskTypeList = wmScoreTaskTypeList.concat(...item.children)
+    })
+  } else {
+    const tableData = tableRef.value.getData()
+    pkgTaskTypeQtyList = tableData.map((item: any) => {
+      return {
+        taskTypeName: item.taskTypeName,
+        price: item.score,
+        taskTypeId: item.taskTypeId,
+        qty: item.qty
+      }
+    })
+
+    let treeArr = tableData.map((item: any) => {
+      return {
+        taskTypeName: item.taskTypeName,
+        taskTypeId: item.orgTaskTypeId
+      }
+    })
+    let arr = [...pFlist]
+    tableData.forEach((item: any) => {
+      const curr = arr.find((iten) => iten.taskTypeId === item.parent_id)
+      if (curr) {
+        curr.children.push({
+          taskTypeId: item.orgTaskTypeId,
+          taskTypeName: item.taskTypeName
+        })
+      }
+    })
+    wmScoreTaskTypeList = arr.concat(treeArr).filter((item) => {
+      if (!item.children || item.children.length > 0) {
+        return item
+      }
+    })
+  }
+
+  formRef.value
+    .validate()
+    .then(async () => {
+      if (Number(form.score) > Number(form.kfpjf) && form.relationScoreId != '-1') {
+        uni.showToast({
+          title: '可分配积分不足',
+          icon: 'none'
+        })
+        return false
+      }
+      if (IS_DLS.value && !form.provAbbr) {
+        return uni.showToast({
+          title: '请选择区域',
+          icon: 'none'
+        })
+      }
+
+      form.wmScoreTaskTypeList = wmScoreTaskTypeList
+      form.pkgTaskTypeQtyList = pkgTaskTypeQtyList
+      form.agentTypeId = form.relationScoreId === '-1' ? '1' : '2'
+      form.relationScoreId = form.relationScoreId === '-1' ? '' : form.relationScoreId
+      form.kfpjf = form.kfpjf === '' ? '0' : form.kfpjf
+
+      let res
+      let text
+      if (currentType.value === '1') {
+        res = await wmscorepackageSaveApi(form)
+        text = '添加成功'
+      } else {
+        const obj: any = toRaw(form)
+        obj.id = currentId
+        res = await wmscorepackageUpdateByIdsApi(form)
+        text = '编辑成功'
+      }
+      if (res.code === 0) {
+        uni.showToast({
+          title: text,
+          icon: 'none'
+        })
+        setTimeout(() => {
+          uni.navigateBack()
+        }, 1000)
+      }
+    })
+    .catch((err: any) => {
+      console.log('err', err)
+    })
+}
+
+const formRef = ref()
+const form = reactive({
+  scorePackageName: '',
+  belongDate: '',
+  relatedService: '',
+  relatedServiceLabel: '',
+  agentTypeId: '',
+  relationScoreId: '',
+  relationScoreIdLable: '',
+  kfpjf: '',
+  score: '',
+  planId: '',
+  planIdLabel: '',
+  acceptSug: '',
+  acceptSugLabel: '',
+  drugtable: [] as any[],
+  drugtableLabel: '',
+  entTaskLimit: '',
+  startTime: '',
+  endTimeValue: '',
+  provAbbr: '',
+  wmScoreTaskTypeList: [] as any[],
+  pkgTaskTypeQtyList: [] as any[],
+  description: ''
+})
+
+const rules = reactive({
+  scorePackageName: {
+    type: 'string',
+    required: true,
+    message: '请输入执行包名称',
+    trigger: ['blur', 'change']
+  },
+  belongDate: {
+    type: 'string',
+    required: true,
+    message: '请选择所属月份',
+    trigger: ['blur', 'change']
+  },
+  relatedServiceLabel: {
+    type: 'string',
+    required: true,
+    message: '请选择管理服务企业',
+    trigger: ['blur', 'change']
+  },
+  relationScoreIdLable: {
+    type: 'string',
+    required: true,
+    message: '管理服务包名称',
+    trigger: ['blur', 'change']
+  },
+  planIdLabel: {
+    type: 'string',
+    required: true,
+    message: '请输入执行包名称',
+    trigger: ['blur', 'change']
+  },
+  endTimeValue: {
+    type: 'string',
+    required: true,
+    message: '请选择截止日期',
+    trigger: ['blur', 'change']
+  },
+  acceptSugLabel: {
+    type: 'string',
+    required: true,
+    message: '请选择承接对象',
+    trigger: ['blur', 'change']
+  },
+  provAbbr: {
+    type: 'string',
+    required: IS_DLS.value,
+    message: '请选择服务区域',
+    trigger: ['blur', 'change']
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+.service-delivery-add {
+  background: #f2f2f2;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding: 24rpx;
+
+  .message {
+    background: #fff;
+    padding: 30rpx;
+    border-radius: 12rpx;
+    width: 100%;
+    box-sizing: border-box;
+  }
+
+  .form {
+    margin-top: 20rpx;
+    background: #fff;
+    padding: 30rpx;
+    border-radius: 12rpx;
+  }
+}
+
+:deep(.uv-form-item__body__left) {
+  padding-left: 18rpx;
+}
+
+.btn {
+  margin-top: 20rpx;
+  box-sizing: border-box;
+  width: 700rpx;
+  height: 160rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+  display: flex;
+  padding: 30rpx 46rpx 54rpx;
+  justify-content: space-between;
+  box-sizing: border-box;
+
+  view {
+    font-weight: 400;
+    box-sizing: border-box;
+    font-size: 32rpx;
+    line-height: 45rpx;
+    border-radius: 8rpx;
+    height: 72rpx;
+    width: 290rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .cancel {
+    border: 2rpx solid #c7c7c7;
+    color: #111;
+  }
+  .confirm {
+    background-color: #6eb657;
+    color: #ffffff;
+  }
+}
+</style>

+ 125 - 0
src/pages-sub-service-mangement/stopServiceDelivery/index.vue

@@ -0,0 +1,125 @@
+<template>
+  <view class="stop-service">
+    <view class="form">
+      <uv-form labelPosition="left" :model="form" ref="formRef">
+        <uv-form-item
+          label="请选择积分收回方式"
+          prop="enableFlag"
+          required
+          labelPosition="top"
+          labelWidth="240"
+        >
+          <uv-radio-group v-model="form.enableFlag" placement="column" activeColor="#6EB657">
+            <uv-radio :customStyle="{ marginTop: '20px' }" label="全部收回" name="1"> </uv-radio>
+            <uv-radio :customStyle="{ marginTop: '16px' }" label="剩余收回" name="2"> </uv-radio>
+          </uv-radio-group>
+        </uv-form-item>
+      </uv-form>
+    </view>
+    <view class="btn">
+      <view class="cancel" @click="cancelFn">取消</view>
+      <view class="confirm" @click="confirmFn">确定</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad } from '@dcloudio/uni-app'
+import { reactive, ref } from 'vue'
+import { stopWmScorePackageApi, updateEnableApi } from '@/service/modules/serviceDelivery'
+
+const currentId = ref()
+const currentType = ref()
+onLoad((e: any) => {
+  currentId.value = e?.id
+  currentType.value = e?.type
+})
+
+const form = reactive({
+  enableFlag: ''
+})
+
+const cancelFn = () => {
+  uni.navigateBack()
+}
+
+const confirmFn = async () => {
+  if (!form.enableFlag) {
+    return uni.showToast({
+      title: '请选择回收方式!',
+      icon: 'none'
+    })
+  }
+  const obj = {
+    enableType: form.enableFlag,
+    id: currentId.value
+  }
+  let res
+
+  if (currentType.value === '1') {
+    res = await stopWmScorePackageApi(obj)
+  } else if (currentType.value === '2') {
+    res = await updateEnableApi(obj)
+  }
+  if (res.data) {
+    uni.showToast({
+      title: '终止成功',
+      icon: 'none'
+    })
+    setTimeout(() => {
+      uni.navigateBack()
+    }, 1000)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.stop-service {
+  background-color: #f2f2f2;
+  height: 100vh;
+  padding: 24rpx;
+
+  .form {
+    width: 100%;
+    height: 230rpx;
+    background-color: #fff;
+    border-radius: 12rpx;
+    padding: 30rpx;
+  }
+}
+
+.btn {
+  position: fixed;
+  bottom: 40rpx;
+  box-sizing: border-box;
+  width: 700rpx;
+  height: 160rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+  display: flex;
+  padding: 30rpx 46rpx 54rpx;
+  justify-content: space-between;
+  box-sizing: border-box;
+
+  view {
+    font-weight: 400;
+    box-sizing: border-box;
+    font-size: 32rpx;
+    line-height: 45rpx;
+    border-radius: 8rpx;
+    height: 72rpx;
+    width: 290rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .cancel {
+    border: 2rpx solid #c7c7c7;
+    color: #111;
+  }
+  .confirm {
+    background-color: #6eb657;
+    color: #ffffff;
+  }
+}
+</style>

+ 262 - 0
src/pages-sub-service-mangement/taskAudit/index.vue

@@ -0,0 +1,262 @@
+<template>
+  <view class="task-audit">
+    <view class="search">
+      <view class="top-search">
+        <view class="search-input">
+          <uv-input
+            v-model="searchParams.planName"
+            :customStyle="customStyle"
+            clearable
+            shape="circle"
+            placeholder="请输入"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #6eb657"
+          ></uv-input>
+        </view>
+        <view class="search-button" @click="searchFn">搜索</view>
+        <uv-icon name="plus-circle" color="#6eb657" size="24" />
+      </view>
+    </view>
+    <view class="list" v-if="hasInfo">
+      <view class="item" v-for="item in listArr" :key="item.id" @click="onDetail(item)">
+        <view class="top">
+          <view class="top-l">
+            <image src="@/static/images/icon/review.png" class="image" />
+            <text>{{ item.lookintoDate }}</text>
+          </view>
+          <view class="top-r">
+            <text></text>
+            <view class="status">{{ item?.checkState?.displayInfo }}</view>
+          </view>
+        </view>
+        <view class="content">
+          <view class="title">
+            <view class="task-name">{{ item.taskTypeName || 'abcd' }}</view>
+            <view class="score">+{{ item.score }}积分</view>
+          </view>
+          <view class="num"> 任务编号:{{ item.taskNumber }} </view>
+        </view>
+      </view>
+    </view>
+    <noData v-else />
+  </view>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import { onShow, onLoad, onReachBottom } from '@dcloudio/uni-app'
+import { getListApi, getTaskListPageApi } from '@/service/modules/taskAudit'
+
+import noData from '@/components/noData/index.vue'
+import { useReview } from '@/store/review'
+
+const reviewStore = useReview()
+
+const currentId = ref()
+const taskStatus = ref()
+
+const currentScoreId = ref()
+const currentPage = ref()
+
+onLoad((e) => {
+  currentId.value = e?.id
+  currentPage.value = e?.page
+  let text = ''
+  if (e?.page === '1') {
+    taskStatus.value = e?.taskStatus
+    searchParams.value.taskStatus = e?.taskStatus
+    searchParams.value.scorePackageId = e?.id
+    text = e?.taskStatus ? '任务审核' : '任务详情'
+  } else if (e?.page === '2') {
+    taskListPageParams.isApprovalPage = e?.type == 'approval' ? '1' : '0'
+    taskListPageParams.id = e?.id
+    text = e?.type == 'approval' ? '任务审核' : '任务详情'
+  }
+  uni.setNavigationBarTitle({
+    title: text
+  })
+})
+
+onShow(() => {
+  searchParams.value.current = 1
+  listArr.value = []
+  getList()
+})
+const customStyle = {
+  backgroundColor: '#f6f6f6'
+}
+
+class Params {
+  taskStatus = ''
+  scorePackageId = ''
+  planName = ''
+  total = -1
+  current = 1
+  size = 10
+}
+
+const searchParams = ref(new Params())
+
+const taskListPageParams = reactive({
+  isApprovalPage: '',
+  id: '',
+  current: 1,
+  size: 10
+})
+
+const searchFn = () => {
+  listArr.value = []
+  searchParams.value.current = 1
+  getList()
+}
+
+const hasInfo = ref(true)
+const listArr = ref<any[]>([])
+
+const getList = async () => {
+  let res
+  if (currentPage.value === '1') {
+    res = await getListApi(searchParams.value)
+  } else if (currentPage.value === '2') {
+    res = await getTaskListPageApi(taskListPageParams)
+  }
+  listArr.value = listArr.value.concat(res.data.records)
+  searchParams.value.total = res.data.total
+  hasInfo.value = !!listArr.value.length
+}
+
+const onDetail = (row: any) => {
+  const info = JSON.stringify(row)
+  reviewStore.setCurrentInfo(info)
+  if (currentPage.value === '1') {
+    const show = !!searchParams.value.taskStatus
+    uni.navigateTo({
+      url: `/pages-sub-service-mangement/taskAuditDetail/index?id=${row.id}&type=1&show=${show}`
+    })
+  } else if (currentPage.value === '2') {
+    const show = taskListPageParams.isApprovalPage === '1'
+    uni.navigateTo({
+      url: `/pages-sub-service-mangement/taskAuditDetail/index?id=${row.id}&type=2&reportId=${currentId.value}&show=${show}`
+    })
+  }
+}
+
+onReachBottom(() => {
+  if (listArr.value.length === searchParams.value.total) return
+  if (currentPage.value === '1') {
+    searchParams.value.current++
+  } else if (currentPage.value === '2') {
+    taskListPageParams.current++
+  }
+
+  getList()
+})
+</script>
+
+<style lang="scss" scoped>
+.task-audit {
+  padding: 24rpx 30rpx;
+
+  .search {
+    position: fixed;
+    width: 750rpx;
+    padding: 0 30rpx;
+    top: 0;
+    height: 60rpx;
+    background-color: #fff;
+    z-index: 99;
+    .top-search {
+      display: flex;
+      align-items: center;
+
+      .search-input {
+        width: 540rpx;
+        height: 70rpx;
+      }
+      .search-button {
+        color: #6eb657;
+        font-size: 30rpx;
+        margin: 0 10px;
+        font-weight: 400;
+      }
+    }
+  }
+  .list {
+    margin-top: 80rpx;
+    .item {
+      box-shadow: 0px 4rpx 4rpx 0px rgba(0, 0, 0, 0.05);
+      margin-bottom: 20rpx;
+      border-radius: 16rpx;
+      .top {
+        padding: 0 30rpx;
+        box-sizing: border-box;
+        height: 100rpx;
+        background-color: #6eb657;
+        border-top-left-radius: 16rpx;
+        border-top-right-radius: 16rpx;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        .top-l {
+          display: flex;
+          align-items: center;
+
+          .image {
+            width: 28rpx;
+            height: 28rpx;
+          }
+          text {
+            font-size: 26rpx;
+            color: #fff;
+            line-height: 36rpx;
+            margin-left: 20rpx;
+          }
+        }
+        .top-r {
+          display: flex;
+          align-items: center;
+          text {
+            display: block;
+            width: 10rpx;
+            height: 10rpx;
+            background-color: #fff;
+            border-radius: 50%;
+            margin-right: 10rpx;
+          }
+          .status {
+            color: #fff;
+            font-size: 28rpx;
+            line-height: 40rpx;
+          }
+        }
+      }
+      .content {
+        background-color: #fff;
+        padding: 30rpx;
+        box-sizing: border-box;
+        .title {
+          display: flex;
+          justify-content: space-between;
+          margin-bottom: 20rpx;
+          align-items: center;
+          .task-name {
+            font-size: 32rpx;
+            line-height: 45rpx;
+            color: #313131;
+          }
+          .score {
+            font-size: 28rpx;
+            color: #72b25b;
+          }
+        }
+        .num {
+          font-weight: 400;
+          font-size: 22rpx;
+          line-height: 32rpx;
+          color: #999999;
+        }
+      }
+    }
+  }
+}
+</style>

+ 348 - 0
src/pages-sub-service-mangement/taskAuditDetail/index.vue

@@ -0,0 +1,348 @@
+<template>
+  <view class="task-detail">
+    <!-- 分享的图片展示 -->
+    <image
+      v-if="isShareImg"
+      mode="widthFix"
+      class="poster-img"
+      :src="detailInfo?.taskInfo?.shareImgUrl"
+    />
+    <!-- 正常任务 -->
+    <view class="field-box" v-else-if="configList?.length">
+      <template v-for="item in configList" :key="item.id">
+        <!-- 文本展示类型 -->
+        <textCom
+          v-if="textArr.includes(item.taskFiledType)"
+          :item="item"
+          :detailInfo="detailInfo"
+        />
+        <!-- 下拉选择 -->
+        <selectCom
+          v-if="item.taskFiledType == 'domain' || item.taskFiledType == 'select'"
+          :item="item"
+          :detailInfo="detailInfo"
+          :dictList="dictList"
+        />
+        <!-- 图片类型 -->
+        <template v-if="item.taskFiledType == 'img' || item.taskFiledType == 'sign'">
+          <view class="line" />
+          <imgCom :item="item" :detailInfo="detailInfo" />
+        </template>
+        <!-- 长文本 -->
+        <template v-if="item.taskFiledType == 'longtext'">
+          <view class="line" />
+          <longtextCom :item="item" :detailInfo="detailInfo" />
+        </template>
+        <!-- 树形选择 -->
+      </template>
+    </view>
+    <!-- 转发类任务 -->
+    <view v-if="shareIdArr.includes(taskTypeId)">
+      <shareCom :detailInfo="detailInfo" :ercodeUrl="ercodeUrl" />
+    </view>
+    <!-- 拜访类任务 -->
+    <view v-if="visitIdArr.includes(taskTypeId)">
+      <visitCom :signInfoDetail="signInfoDetail" />
+    </view>
+
+    <view class="review-btn botton-content" v-if="showBtn">
+      <view class="review-form">
+        <uv-form
+          labelPosition="left"
+          :model="reviewForm"
+          :rules="reviewFormRules"
+          ref="reviewFormRef"
+          labelWidth="80"
+        >
+          <uv-form-item label="审核说明" prop="taskStatusInfo" borderBottom required>
+            <uv-textarea
+              v-model="reviewForm.taskStatusInfo"
+              placeholder="请输入审核说明"
+              height="48"
+            ></uv-textarea>
+          </uv-form-item>
+        </uv-form>
+      </view>
+      <view class="btn">
+        <view class="cancel" @click="reviewFn('4')">拒绝</view>
+        <view class="confirm" @click="reviewFn('3')">通过</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import {
+  getTaskInfoByIdApi,
+  getTaskContentConfigByTaskTypeIdApi,
+  getH5TaskContentConfigByTaskTypeIdApi,
+  getSignInfoByTaskIdApi,
+  getQrCodeByUrlApi
+} from '@/service/modules/getTask'
+import { approvalTaskApi, approvalReportApi } from '@/service/modules/taskAudit'
+
+import { onLoad } from '@dcloudio/uni-app'
+import { reactive, ref } from 'vue'
+
+import textCom from '@/pages/task/task-detail/components/textCom.vue'
+import selectCom from '@/pages/task/task-detail/components/selectCom.vue'
+import imgCom from '@/pages/task/task-detail/components/imgCom.vue'
+import longtextCom from '@/pages/task/task-detail/components/longtextCom.vue'
+import visitCom from '@/pages/task/task-detail/components/visitCom.vue'
+import shareCom from '@/pages/task/task-detail/components/shareCom.vue'
+
+import { useReview } from '@/store/review'
+import { useLoginStore } from '@/store/login'
+
+const loginStore = useLoginStore()
+let userInfo: any = loginStore.currentUserInfo
+const roles: number[] = userInfo.roles
+
+const reviewStore = useReview()
+// 文本展示类型
+const textArr = [
+  'area',
+  'text',
+  'inputautoselect',
+  'map',
+  'datetime',
+  'datatimerange',
+  'number',
+  'money',
+  'tree'
+]
+// 转发分享类任务类型id
+const shareIdArr = ['8', '9', '10', '11']
+// 二维码
+const ercodeUrl = ref()
+
+// 拜访类任务类型id
+const visitIdArr = ['5', '6', '33']
+const detailId = ref()
+const currentInfo = ref()
+const currentType = ref()
+const currentReportId = ref()
+const showBtn = ref(false)
+onLoad((e) => {
+  currentType.value = e?.type
+  currentReportId.value = e?.reportId
+  const info = reviewStore.currentInfo
+  if (info) {
+    currentInfo.value = JSON.parse(info)
+  }
+  reviewStore.setCurrentInfo('')
+
+  if (e?.show === 'true') {
+    if (roles.includes(currentInfo.value.checkState.roleId)) {
+      showBtn.value = true
+    }
+
+    if ((roles.includes(40) || roles.includes(42)) && currentInfo.value.checkState.roleId == -1) {
+      showBtn.value = true
+    }
+    if (roles.includes(39) && currentInfo.value.checkState.nextNodeId == -1) {
+      showBtn.value = false
+    }
+  }
+
+  if (e?.id) {
+    detailId.value = e.id
+    getTaskDetail()
+  }
+})
+
+const detailInfo = ref()
+const taskTypeId = ref()
+const isShareImg = ref(false)
+const getTaskDetail = async () => {
+  const res = await getTaskInfoByIdApi(detailId.value)
+  const data = res.data
+  detailInfo.value = data
+
+  taskTypeId.value = data.taskType
+  // 分享类型的任务id
+  const shareTypeArr = ['7', '8', '9', '10', '11']
+  // 任务类型是分享的
+  if (shareTypeArr.includes(data.taskType)) {
+    if (data.taskInfo.shareImgUrl) {
+      isShareImg.value = true
+    } else {
+      // 分享类型为文章
+      const articleIdArr = ['9', '10']
+      let type = articleIdArr.includes(data.taskType) ? 'article' : ''
+      getErrCode(data.shareId, type)
+    }
+  } else {
+    // 拜访类型的任务id
+    const arr = ['5', '6', '33']
+    if (arr.includes(data.taskType)) {
+      getSignInfoByTaskId()
+    } else {
+      getTaskContentConfigByTaskTypeId()
+    }
+  }
+}
+
+const signInfoDetail = ref()
+// 拜访类型,获取拜访的列表
+const getSignInfoByTaskId = async () => {
+  const res = await getSignInfoByTaskIdApi({ id: detailId.value })
+  if (res.code === 0) {
+    signInfoDetail.value = res.data
+  }
+}
+
+const configList = ref()
+const dictList = ref()
+const getTaskContentConfigByTaskTypeId = async () => {
+  let res
+  // #ifdef  MP-WEIXIN
+  res = await getTaskContentConfigByTaskTypeIdApi(taskTypeId.value)
+  // #endif
+  // #ifdef  H5
+  res = await getH5TaskContentConfigByTaskTypeIdApi(taskTypeId.value)
+  // #endif
+  if (res.code === 0) {
+    let data = res.data
+    let keys = Object.keys(data)
+    if (keys.includes('config')) {
+      configList.value = data.config
+      dictList.value = data.dict
+    } else {
+      configList.value = data[taskTypeId.value].config
+      dictList.value = data[taskTypeId.value].dict
+    }
+    configList?.value.forEach((item: any) => {
+      item.taskFiledType = item.taskFiledType.trim()
+    })
+  }
+}
+
+const getErrCode = async (shareId: string, type: string) => {
+  let shareUrl = `${
+    import.meta.env.VITE_APP_URL
+  }/h5/#/pages/artile/detail?type=${type}&id=${shareId}`
+  const res = await getQrCodeByUrlApi(shareUrl)
+  if (res.code === 0) {
+    ercodeUrl.value = import.meta.env.VITE_APP_URL + res.data.data.url
+  }
+}
+
+// 审核提交
+// 审核相关
+const reviewFormRef = ref()
+const reviewForm = reactive({
+  taskStatusInfo: ''
+})
+const reviewFormRules = reactive({
+  taskStatusInfo: {
+    type: 'string',
+    required: true,
+    message: '请输入审核说明',
+    trigger: ['blur', 'change']
+  }
+})
+
+const reviewFn = (flag: string) => {
+  reviewFormRef.value
+    .validate()
+    .then(async () => {
+      let obj: any = {}
+      let res
+      if (currentType.value === '1') {
+        obj = {
+          id: detailId.value,
+          taskStatus: flag,
+          taskStatusInfo: reviewForm.taskStatusInfo,
+          nodeId: currentInfo.value?.checkState.curNodeId
+        }
+        res = await approvalTaskApi(obj)
+      } else if (currentType.value === '2') {
+        obj = {
+          id: currentReportId.value,
+          taskIds: detailId.value,
+          approvalOpinion: flag == '3' ? '1' : '2',
+          approvalInfo: reviewForm.taskStatusInfo,
+          taskStatusInfo: reviewForm.taskStatusInfo,
+          nodeId: currentInfo.value?.checkState.nextNodeId
+        }
+        if (roles.includes(42)) {
+          obj.nodeId = 8
+        }
+        // 40 商务组
+        if (roles.includes(40)) {
+          obj.nodeId = 9
+        }
+        res = await approvalReportApi(obj)
+      }
+
+      if (res.code === 0) {
+        uni.showToast({
+          title: '审核成功',
+          icon: 'none'
+        })
+        setTimeout(() => {
+          uni.navigateBack()
+        }, 1000)
+      }
+    })
+    .catch((err: any) => {
+      console.log('err', err)
+    })
+}
+</script>
+
+<style lang="scss" scoped>
+.task-detail {
+  background: #f2f2f2;
+  min-height: 100vh;
+  box-sizing: border-box;
+  .poster-img {
+    padding: 20rpx;
+    width: 710rpx;
+  }
+  .line {
+    width: 100%;
+    height: 20rpx;
+    background: #f4f4f4;
+  }
+}
+
+.botton-content {
+  margin: 20rpx 0;
+  padding: 30rpx 46rpx 54rpx;
+  box-sizing: border-box;
+  background-color: #fff;
+  min-height: 160rpx;
+  border-radius: 12rpx;
+}
+
+.btn {
+  display: flex;
+  justify-content: space-between;
+
+  view {
+    font-weight: 400;
+    box-sizing: border-box;
+    font-size: 32rpx;
+    line-height: 45rpx;
+    border-radius: 8rpx;
+    height: 72rpx;
+    width: 290rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .cancel {
+    border: 2rpx solid #c7c7c7;
+    color: #111;
+  }
+  .confirm {
+    background-color: #6eb657;
+    color: #ffffff;
+  }
+}
+.review-form {
+  margin-bottom: 54rpx;
+}
+</style>

Some files were not shown because too many files changed in this diff