ZaiZai 1 year ago
parent
commit
fbf1457f99
100 changed files with 4296 additions and 19 deletions
  1. 8 0
      .editorconfig
  2. 7 17
      .gitignore
  3. 62 2
      README.md
  4. 14 0
      index.html
  5. 42 0
      package.json
  6. 6 0
      postcss.config.js
  7. BIN
      public/favicon.ico
  8. 51 0
      src/App.vue
  9. 6 0
      src/api/index.js
  10. 75 0
      src/api/modules/archiveFile/archiveFile.js
  11. 44 0
      src/api/modules/data-fill/division.js
  12. 101 0
      src/api/modules/data-fill/query.js
  13. 21 0
      src/api/modules/menu.js
  14. 28 0
      src/api/modules/oss.js
  15. 69 0
      src/api/modules/other-file/projectScanning.js
  16. 36 0
      src/api/modules/other.js
  17. 84 0
      src/api/modules/tasks/data.js
  18. 52 0
      src/api/modules/tasks/flow.js
  19. 36 0
      src/api/modules/tasks/message.js
  20. 88 0
      src/api/modules/user.js
  21. 44 0
      src/api/modules/userInfo/index.js
  22. 16 0
      src/api/request/header.js
  23. 39 0
      src/api/request/httpApi.js
  24. 60 0
      src/api/request/index.js
  25. 26 0
      src/api/util/auth.js
  26. BIN
      src/assets/icon/blue.png
  27. BIN
      src/assets/icon/brown.png
  28. BIN
      src/assets/icon/color.png
  29. BIN
      src/assets/icon/cyan.png
  30. BIN
      src/assets/icon/green.png
  31. BIN
      src/assets/icon/grey.png
  32. BIN
      src/assets/icon/mauve.png
  33. BIN
      src/assets/icon/orange.png
  34. BIN
      src/assets/icon/pink.png
  35. BIN
      src/assets/icon/purple.png
  36. BIN
      src/assets/icon/red.png
  37. BIN
      src/assets/icon/white.png
  38. BIN
      src/assets/icon/yellow.png
  39. BIN
      src/assets/images/Web515.png
  40. BIN
      src/assets/images/avatar.png
  41. BIN
      src/assets/images/color.png
  42. BIN
      src/assets/images/screen.png
  43. BIN
      src/assets/images/screen1.png
  44. BIN
      src/assets/images/short.png
  45. BIN
      src/assets/images/short1.png
  46. BIN
      src/assets/images/theme.png
  47. BIN
      src/assets/images/video.png
  48. BIN
      src/assets/images/video1.png
  49. BIN
      src/assets/images/word.png
  50. BIN
      src/assets/images/word1.png
  51. BIN
      src/assets/login/bd.png
  52. BIN
      src/assets/login/bg.png
  53. BIN
      src/assets/login/bim.png
  54. BIN
      src/assets/login/ca.png
  55. BIN
      src/assets/login/cube1.png
  56. BIN
      src/assets/login/cube2.png
  57. BIN
      src/assets/login/gis.png
  58. BIN
      src/assets/login/icon.png
  59. BIN
      src/assets/login/s1.png
  60. BIN
      src/assets/login/s2.png
  61. BIN
      src/assets/login/s3.png
  62. BIN
      src/assets/logo/logo-1.png
  63. BIN
      src/assets/logo/logo-2.png
  64. BIN
      src/assets/logo/name-dark.png
  65. BIN
      src/assets/logo/name-white.png
  66. BIN
      src/assets/view/152211@2x.png
  67. BIN
      src/assets/view/152221@2x.png
  68. 508 0
      src/assets/view/403.svg
  69. 314 0
      src/assets/view/404.svg
  70. 191 0
      src/assets/view/500.svg
  71. BIN
      src/assets/view/Web2x_x.webp
  72. BIN
      src/assets/view/bannerbgColor.png
  73. BIN
      src/assets/view/bannerbgcolor1.png
  74. 1 0
      src/assets/view/bgcolor.svg
  75. 0 0
      src/assets/view/dev.svg
  76. 169 0
      src/assets/view/notableform.svg
  77. BIN
      src/assets/view/testBgbig.PNG
  78. BIN
      src/assets/view/testBgsamll.PNG
  79. BIN
      src/assets/view/text-1.png
  80. BIN
      src/assets/view/text-2.png
  81. BIN
      src/assets/view/text-3.png
  82. 24 0
      src/components/AppConfig/index.vue
  83. 28 0
      src/components/plugins/element/HcImage.vue
  84. 278 0
      src/components/tree/hc-tree-1.vue
  85. 329 0
      src/components/tree/hc-tree.vue
  86. 8 0
      src/config/app.js
  87. 25 0
      src/config/theme.js
  88. 74 0
      src/global/components/hc-auto-complete/index.vue
  89. 174 0
      src/global/components/hc-card/index.vue
  90. 110 0
      src/global/components/hc-card/item.vue
  91. 168 0
      src/global/components/hc-context-menu/index.vue
  92. 154 0
      src/global/components/hc-counter/index.vue
  93. 64 0
      src/global/components/hc-date-picker/index.vue
  94. 179 0
      src/global/components/hc-dialog/index.vue
  95. 176 0
      src/global/components/hc-drag-modal/index.vue
  96. 61 0
      src/global/components/hc-drag-modal/modal.scss
  97. 138 0
      src/global/components/hc-drawer/index.vue
  98. 43 0
      src/global/components/hc-icon/index.vue
  99. 28 0
      src/global/components/hc-img/index.vue
  100. 37 0
      src/global/components/hc-loading/index.vue

+ 8 - 0
.editorconfig

@@ -0,0 +1,8 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true

+ 7 - 17
.gitignore

@@ -1,20 +1,10 @@
-# ---> Actionscript
-# Build and Release Folders
-bin/
-bin-debug/
-bin-release/
+node_modules
 
-# Other files and folders
-.settings/
+.idea
+.vscode
+.DS_Store
 
-# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
-# should NOT be excluded as they contain compiler settings and other important
-# information for Eclipse / Flash Builder.
-
-# ---> Ada
-# Object file
-*.o
-
-# Ada Library Information
-*.ali
+dist
 
+src/config/index.js
+vite.config.js

+ 62 - 2
README.md

@@ -1,3 +1,63 @@
-# hc_archives
+# client
+
+客户端,vue3
+
+---
+
+
+## node.js 的版本需要  14.18+
+
+```shell
+
+// 检查你的node版本, 如果低于 14.18, 请先更新node.js
+
+node -v
+
+```
+
+---
+
+
+### 推荐使用  `yarn` 管理依赖
+
+如果电脑上还没有安装 `yarn` ,执行以下命令安装 `yarn`
+
+``` shell
+npm install -g yarn
+
+//或者
+
+cnpm install -g yarn
+```
+
+然后在 此项目下 执行
+
+```shell
+yarn
+
+// 或者
+
+yarn install
+```
+
+---
+
+
+### `yarn` 的相关命令
+
+安装依赖
+
+```shell
+yarn add 依赖名
+
+// 或者
+yarn add -D 依赖名
+```
+
+
+检测依赖更新
+
+```shell
+yarn upgrade-interactive --latest
+```
 
-档案管理

+ 14 - 0
index.html

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="zh">
+    <head>
+        <meta charset="UTF-8"/>
+        <link rel="icon" href="/favicon.ico"/>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+        <script type='text/javascript' src='http://47.110.251.215:6831/web-apps/apps/api/documents/api.js'></script>
+        <title>泓创智诚</title>
+    </head>
+    <body>
+        <div id="app"></div>
+        <script type="module" src="/src/main.js"></script>
+    </body>
+</html>

+ 42 - 0
package.json

@@ -0,0 +1,42 @@
+{
+    "name": "archives",
+    "private": true,
+    "version": "3.5.0",
+    "scripts": {
+        "dev": "vite",
+        "build": "vite build"
+    },
+    "dependencies": {
+        "axios": "^1.2.2",
+        "crypto-js": "^4.1.1",
+        "dayjs": "^1.11.7",
+        "echarts": "^5.4.1",
+        "element-plus": "^2.2.28",
+        "js-base64": "^3.7.3",
+        "js-cookie": "^3.0.1",
+        "js-md5": "^0.7.3",
+        "js-web-screen-shot": "^1.8.0",
+        "nprogress": "^0.2.0",
+        "pinia": "^2.0.28",
+        "remixicon": "^2.5.0",
+        "sortablejs": "^1.15.0",
+        "split.js": "^1.6.5",
+        "vue": "^3.2.45",
+        "vue-router": "^4.1.6",
+        "vue-utils-plus": "^1.0.5",
+        "vuedraggable": "^4.1.0"
+    },
+    "devDependencies": {
+        "@vitejs/plugin-vue": "^4.0.0",
+        "@vue/compiler-sfc": "^3.2.45",
+        "autoprefixer": "^10.4.13",
+        "codemirror": "^6.0.1",
+        "postcss": "^8.4.20",
+        "sass": "^1.57.1",
+        "tailwindcss": "3.1.8",
+        "unplugin-auto-import": "^0.12.1",
+        "unplugin-vue-components": "^0.22.12",
+        "vfonts": "^0.0.3",
+        "vite": "^4.0.4"
+    }
+}

+ 6 - 0
postcss.config.js

@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}

BIN
public/favicon.ico


+ 51 - 0
src/App.vue

@@ -0,0 +1,51 @@
+<template>
+    <AppConfig>
+        <router-view/>
+    </AppConfig>
+</template>
+
+<script setup>
+import {nextTick, ref, watch} from "vue";
+import {useAppStore} from "~src/store";
+import AppConfig from "~com/AppConfig/index.vue";
+import {setMainColor} from "~src/utils/tools";
+import {getObjValue, ulog, useOsTheme} from "vue-utils-plus"
+import config from '~src/config/index';
+
+//初始变量
+const appStore = useAppStore()
+const UserTheme = ref(appStore.getTheme)
+
+//监听
+watch(() => [
+    appStore.getTheme,
+    appStore.getThemeVal,
+    appStore.getColor
+], ([Theme,ThemeVal,ColorVal]) => {
+    UserTheme.value = Theme
+    setUserTheme(ThemeVal, ColorVal)
+})
+
+nextTick(()=> {
+    setUserTheme(appStore.getThemeVal, appStore.getColor)
+    ulog('客户端 启动成功', '当前开发版本 v' + config?.dev_version)
+})
+
+//设置主题
+const setUserTheme = (theme, appColor) => {
+    const colorVal = getObjValue(appColor)
+    //设置主色调
+    setMainColor(colorVal?.color)
+    const colorName = colorVal?.name || 'green'
+    //设置主题
+    let val = UserTheme.value
+    if (val === 'auto') {
+        theme = useOsTheme().value;
+    }
+    if (theme === '') {
+        theme = val;
+    }
+    //挂载相关样式
+    document.documentElement.setAttribute('class',`${theme} color-${colorName}`)
+}
+</script>

+ 6 - 0
src/api/index.js

@@ -0,0 +1,6 @@
+//请求配置
+export default {
+    putFile: '/api/blade-resource/oss/endpoint/put-file',       //上传文件
+    removeFile: '/api/blade-resource/oss/endpoint/remove-file', //移除文件
+    uploadFile: '/api/blade-resource/oss/endpoint/upload-file', //上传文件,转PDF
+}

+ 75 - 0
src/api/modules/archiveFile/archiveFile.js

@@ -0,0 +1,75 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+  //分页
+  async getarchiveFilePage(form, msg = true) {
+      return httpApi({
+          url: '/api/blade-archive/archiveFile/page',
+          method: 'post',
+          params: form
+      }, msg);
+  },
+
+  //批量新增
+  async batchUploadSave(form, msg = true) {
+    return httpApi({
+        url: '/api/blade-archive/archiveFile/batchSave',
+        method: 'post',
+        data: form
+    }, msg)
+  },
+
+  //批量修改
+  async batchUpdateSort(form, msg = true) {
+    return httpApi({
+        url: '/api/blade-archive/archiveFile/batchUpdateSort',
+        method: 'post',
+        data: form
+    }, msg)
+  },
+
+  //获取未分盒的文件列表
+  async pageByBoxName(form, msg = true) {
+    return httpApi({
+        url: '/api/blade-archive/archiveFile/pageByBoxName',
+        method: 'post',
+        params: form
+    }, msg);
+  },
+
+  //获取已有盒号和案卷名
+  async getBoxNameAndBoxNumber(form, msg = true) {
+    return httpApi({
+        url: '/api/blade-archive/archiveFile/getBoxNameAndBoxNumber',
+        method: 'post',
+        params: form
+    }, msg);
+  },
+
+  //设置分盒
+  async allocation(form, msg = true) {
+    return httpApi({
+        url: '/api/blade-archive/archiveFile/allocation',
+        method: 'post',
+        data: form
+    }, msg)
+  },
+
+  //检测案卷名是否重复
+  async getIsBoxName(form, msg = true) {
+    return httpApi({
+        url: '/api/blade-archive/archiveFile/getIsBoxName',
+        method: 'post',
+        params: form
+    }, msg);
+  },
+  
+  //跨目录移动
+  async migrateFile(form, msg = true) {
+    return httpApi({
+        url: '/api/blade-archive/archiveFile/migrateFile',
+        method: 'post',
+        params: form
+    }, msg);
+  },
+}

+ 44 - 0
src/api/modules/data-fill/division.js

@@ -0,0 +1,44 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //获取关联的合同段树
+    async getContractInfoTree(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/contractInfo/tree2',
+            method: 'get',
+            params: form
+        },msg);
+    },
+    //未识别合同段划分节点 手动关联
+    async setImportRelation(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/wbsTreeContract/import-relation',
+            method: 'post',
+            data: form
+        },msg);
+    },
+    //标记/取消隐蔽工程节点
+    async concealedWorksNnode(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/wbsTreeContract/concealed-works-node',
+            method: 'get',
+            params: form
+        },msg);
+    },
+    //项目级懒加载节点树形结构-表单类型划分树
+    async tabTypeLazyTree(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/wbsPrivate/tab-Type-lazy-tree',
+            method: 'get',
+            params: form
+        },msg);
+    },
+    //添加合同段节点树
+    async addWbsContractInfo(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/wbsPrivate/add-wbs-contract-info',
+            method: 'post',
+            params: form
+        },msg);
+    },
+}

+ 101 - 0
src/api/modules/data-fill/query.js

@@ -0,0 +1,101 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //获取当前合同段的划分树
+    async queryWbsTreeData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/queryContractWbsTreeByContractIdAndType',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //根据合同段ID获取所有填报人
+    async getFileUser(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/getFileUserByContractId',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+    //获取当前合同段下所有的上报批次
+    async getReportNumber(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/getReportNumberByContractId',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+    //获取流程状态分类和文件类型分类
+    async getDictBizClassify(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/getDictBizClassifyByCode',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+    //分页数据
+    async getPageData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/page',
+            method: 'post',
+            data: form
+        }, msg)
+    },
+    //批量废除
+    async batchAbolish(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/batchAbolish',
+            method: 'post',
+            params: form
+        }, msg)
+    },
+    //批量下载
+    async batchDownloadFileToZip(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/batchDownloadFileToZip',
+            method: 'post',
+            params: form,
+            responseType: 'blob'
+        }, msg)
+    },
+    //批量打印
+    async batchPrint(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/batchPrint',
+            method: 'post',
+            params: form
+        }, msg)
+    },
+    //本地验签
+    async localVerify(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/localVerify',
+            method: 'post',
+            params: form
+        }, msg)
+    },
+    //在线验签
+    async onlineVerify(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/onlineVerify',
+            method: 'post',
+            params: form
+        }, msg)
+    },
+    //输入框查询合同段树
+    async searchContractTree(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/informationWriteQuery/searchContractTree',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+    //获取流程状态
+    async getFirstTaskStatus(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/query-task-type-status?typeOrStatus=first_task_status',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+}

+ 21 - 0
src/api/modules/menu.js

@@ -0,0 +1,21 @@
+import {httpApi} from "../request/httpApi";
+import website from "~src/config/index";
+
+export const getRoutes = (msg = true) => httpApi({
+  url: '/api/blade-system/menu/routes',
+  method: 'get',
+  params: {
+      sysType: website.clientId
+  }
+}, msg);
+
+export const getButtons = (msg = true) => httpApi({
+    url: '/api/blade-system/menu/buttons',
+    method: 'get'
+}, msg);
+
+export const getAazyList = (form, msg = true) => httpApi({
+    url: '/api/blade-system/menu/lazy-list',
+    method: 'get',
+    params: form
+}, msg);

+ 28 - 0
src/api/modules/oss.js

@@ -0,0 +1,28 @@
+import {httpApi} from "../request/httpApi";
+
+export default {
+    //上传文件
+    async putFile(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-resource/oss/endpoint/put-file',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //移除文件
+    async removeFile(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-resource/oss/endpoint/remove-file',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+    //上传文件
+    async uploadFile(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-resource/oss/endpoint/upload-file',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+}

+ 69 - 0
src/api/modules/other-file/projectScanning.js

@@ -0,0 +1,69 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //获取归档划分树
+    async getClassIfyList(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/tree',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+    //分页
+    async getarchiveFilePage(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/page',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+    //批量新增
+    async batchUploadSave(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/batchSave',
+            method: 'post',
+            data: form
+        }, msg)
+    },
+    //逻辑删除
+    async removeArchiveFile(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/remove',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+    //批量编辑
+    async batchEditSave(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/batchEdit',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //批量废除
+    async batchAbolishSave(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/batchAbolish',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+    //批量下载
+    async batchDownloadFileToZip(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/batchDownloadFileToZip',
+            method: 'post',
+            params: form,
+            responseType: 'blob'
+        }, msg)
+    },
+    //批量认证
+    async batchCertification(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/archiveFile/batchCertification',
+            method: 'post',
+            data: form
+        }, msg)
+    },
+}

+ 36 - 0
src/api/modules/other.js

@@ -0,0 +1,36 @@
+import {httpApi} from "../request/httpApi";
+
+//用户配置保存
+export const userConfigSave = (form, msg = true) => httpApi({
+    url: '/api/blade-business/defaultConfig/saveOrUpdate',
+    method: 'post',
+    data: form
+}, msg);
+
+//用户配置详情
+export const userConfigInfo = (form, msg = true) => httpApi({
+    url: '/api/blade-business/defaultConfig/detail',
+    method: 'get',
+    params: form
+}, msg);
+
+//获取类型
+export const getDictionary = (form, msg = true) => httpApi({
+    url: '/api/blade-system/dict/dictionary',
+    method: 'get',
+    params: form
+}, msg);
+
+//获取用户列表
+export const getContractUserList = (form, msg = true) => httpApi({
+    url: '/api/blade-manager/contractInfo/get-contract-userList',
+    method: 'get',
+    params: form
+}, msg);
+
+//获取档案的树
+export const getArchiveTreeLazyTree = (form, msg = true) => httpApi({
+    url: '/api/blade-manager/archiveTreeContract/lazy-tree',
+    method: 'get',
+    params: form
+}, msg);

+ 84 - 0
src/api/modules/tasks/data.js

@@ -0,0 +1,84 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //获取任务类型或任务状态
+    async queryTaskTypeStatus(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/query-task-type-status',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //获取当前合同段的上报批次
+    async queryBatchList(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/query-batch-list',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //获取当前用户待办流程
+    async queryUserToDoTaskList(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/user-to-do-task-list',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //审批页详情
+    async queryApprovalParameter(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/query-approval-parameter',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //完成任务
+    async saveCompleteApprovalTask(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/complete-approval-task',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //已办任务
+    async queryUserDoneTaskList(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/query-user-done-task-list',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //批量审批
+    async batchCompleteApprovalTask(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/batch-complete-approval-task',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //获取发起
+    async queryUserStartFlow(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/query-user-start-flow',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //批量页详情
+    async queryTaskInfo(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/batch-approval-parameter',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //校验电签短信验证码
+    async checkSmsCode(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/task/check-sms-code',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+}

+ 52 - 0
src/api/modules/tasks/flow.js

@@ -0,0 +1,52 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //分页数据
+    async getPageData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/fixedFlow/page',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+    //获取系统所有角色划分
+    async queryAllRoleList(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/fixedFlow/queryAllRoleList',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //详情
+    async queryFixedFlowDetail(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/fixedFlow/detail',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //新增
+    async addFixedFlowData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/fixedFlow/save',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //修改
+    async updateFixedFlowData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/fixedFlow/update',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //删除
+    async removeFixedFlowData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/fixedFlow/remove',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+}

+ 36 - 0
src/api/modules/tasks/message.js

@@ -0,0 +1,36 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //分页数据
+    async getPageData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/messageWarning/list',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+    //删除消息
+    async removeData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/messageWarning/remove',
+            method: 'post',
+            params: form
+        }, msg)
+    },
+    //获取当前用户的消息数量
+    async queryCurrentUserMessageCount(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/messageWarning/queryCurrentUserMessageCount',
+            method: 'get',
+            params: form
+        }, msg)
+    },
+    //标记已读
+    async setMessageWarningRead(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/messageWarning/setMessageWarningRead',
+            method: 'post',
+            params: form
+        }, msg)
+    },
+}

+ 88 - 0
src/api/modules/user.js

@@ -0,0 +1,88 @@
+import {httpApi} from "../request/httpApi";
+import website from "~src/config/index";
+import md5 from 'js-md5'
+
+export const userLogin = ({tenantId, deptId, roleId, username, password, type, key, code}, msg = true) => httpApi({
+    url: '/api/blade-auth/oauth/token',
+    method: 'post',
+    headers: {
+        'Tenant-Id': tenantId,
+        'Dept-Id': (website.switchMode ? deptId : ''),
+        'Role-Id': (website.switchMode ? roleId : ''),
+        'Captcha-Key': key,
+        'Captcha-Code': code,
+    },
+    params: {
+        tenantId,
+        username,
+        password: md5(password),
+        grant_type: (website.captchaMode ? "captcha" : "password"),
+        scope: "all",
+        type
+    }
+}, msg);
+
+export const refreshToken = (refresh_token, tenantId, deptId, roleId, msg = true) => httpApi({
+    url: '/api/blade-auth/oauth/token',
+    method: 'post',
+    headers: {
+        'Tenant-Id': tenantId,
+        'Dept-Id': (website.switchMode ? deptId : ''),
+        'Role-Id': (website.switchMode ? roleId : '')
+    },
+    params: {
+        tenantId,
+        refresh_token,
+        grant_type: "refresh_token",
+        scope: "all",
+    }
+}, msg);
+
+export const logout = (msg = true) => httpApi({
+    url: '/api/blade-auth/oauth/logout',
+    method: 'get'
+}, msg);
+
+export const registerGuest = (form, oauthId, msg = true) => httpApi({
+    url: '/api/blade-user/register-guest',
+    method: 'post',
+    params: {
+        tenantId: form.tenantId,
+        name: form.name,
+        account: form.account,
+        password: form.password,
+        oauthId
+    }
+}, msg);
+
+export const getProjectAndContract = (msg = true) => httpApi({
+    url: '/api/blade-business/userViewProjectContract/queryUserViewProjectAndContract',
+    method: 'get'
+}, msg);
+
+export const getCaptcha = (msg = true) => httpApi({
+    url: '/api/blade-auth/oauth/captcha',
+    method: 'get'
+}, msg);
+
+export const getUserInfo = (msg = true) => httpApi({
+    url: '/api/blade-auth/oauth/user-info',
+    method: 'get'
+}, msg);
+
+export const sendLogs = (list, msg = true) => httpApi({
+    url: '/api/blade-auth/oauth/logout',
+    method: 'post',
+    data: list
+}, msg);
+
+export const clearCache = (msg = true) => httpApi({
+    url: '/api/blade-auth/oauth/clear-cache',
+    method: 'get'
+}, msg);
+
+export const loginByToken = (form, msg = true) => httpApi({
+    url: '/api/blade-user/loginByToken',
+    method: 'post',
+    params: form
+}, msg);

+ 44 - 0
src/api/modules/userInfo/index.js

@@ -0,0 +1,44 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //修改密码
+    async updatePassword(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-user/update-password',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+    //设置默认项目
+    async setDefaultProject(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/defaultProject/save',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //获取默认项目
+    async getDefaultProject(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/defaultProject/queryUserDefault',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //更新用户信息
+    async updateUserInfo(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-user/update-info',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //获取用户信息
+    async queryCurrentUserData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/userViewProjectContract/queryCurrentUserData',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+}

+ 16 - 0
src/api/request/header.js

@@ -0,0 +1,16 @@
+import {Base64} from 'js-base64';
+import website from '~src/config';
+import {getToken} from '~src/api/util/auth';
+
+export function getTokenHeader(text= false) {
+    let headers = {};
+    headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
+    //让每个请求携带token
+    const token = getToken()
+    if (token) headers[website.tokenHeader] = 'bearer ' + token
+    //headers中配置text请求
+    if (text === true) {
+        headers["Content-Type"] = "text/plain";
+    }
+    return headers;
+}

+ 39 - 0
src/api/request/httpApi.js

@@ -0,0 +1,39 @@
+import request from "./index";
+import {getObjValue} from "vue-utils-plus"
+
+//封装的请求
+export const httpApi = async (obj, message= true) => {
+    return new Promise( (resolve) => {
+        //发起请求
+        request(obj).then((response) => {
+            resolve(getResData(response,false));
+        }).catch((response) => {
+            if (message) {
+                window.$message?.error(getMsgVal(response));
+            }
+            resolve(getResData(response,true));
+        })
+    });
+}
+
+//处理数据
+const getResData = (response, error = false) => {
+    const headers = getObjValue(response?.headers)
+    return {
+        response,
+        res: response?.data,
+        data: response?.data?.data,
+        code: response?.data?.code,
+        msg: response?.data?.msg,
+        status: response?.status,
+        disposition: headers['content-disposition'],
+        message: getMsgVal(response),
+        error: error
+    }
+}
+
+//获取msg消息内容
+const getMsgVal = (response) => {
+    const {msg, error_description} = getObjValue(response.data)
+    return msg || error_description || '未知错误';
+}

+ 60 - 0
src/api/request/index.js

@@ -0,0 +1,60 @@
+import axios from 'axios';
+import {Base64} from 'js-base64';
+import website from '~src/config';
+import router from '~src/router/index';
+import {getToken} from '~src/api/util/auth';
+import {toSerialize} from "vue-utils-plus"
+
+//默认超时时间
+axios.defaults.timeout = 300000;
+//返回其他状态码
+axios.defaults.validateStatus = function (status) {
+    return status >= 200 && status <= 500;
+};
+//跨域请求,允许保存cookie
+axios.defaults.withCredentials = true;
+
+//http request拦截
+axios.interceptors.request.use(config => {
+    const meta = (config['meta'] || {});
+    const isToken = meta['isToken'] === false;
+    config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
+    //让每个请求携带token
+    const token = getToken()
+    if (token && !isToken) {
+        config.headers[website.tokenHeader] = 'bearer ' + token
+    }
+    //headers中配置text请求
+    if (config['text'] === true) {
+        config.headers["Content-Type"] = "text/plain";
+    }
+    //headers中配置serialize为true开启序列化
+    if (config.method === 'post' && meta['isSerialize'] === true) {
+        config.data = toSerialize(config.data);
+    }
+    return config
+}, error => {
+    return Promise.reject(error)
+});
+
+//http response 拦截
+axios.interceptors.response.use(res => {
+    //获取状态码
+    const status = res.data?.code || res.status;
+    const message = res.data?.msg || res.data['error_description'] || '未知错误';
+    //如果是401则跳转到登录页面
+    if (status === 401) {
+        window.$message?.error(message || '身份失效!');
+        router.push({path: '/login'})
+    }
+    // 如果请求为非200, 自行catch逻辑处理
+    if (status !== 200) {
+        return Promise.reject(res);
+    }
+    return res;
+}, error => {
+    window.$message?.error('请求异常!');
+    return Promise.reject(new Error(error));
+});
+
+export default axios;

+ 26 - 0
src/api/util/auth.js

@@ -0,0 +1,26 @@
+import Cookies from 'js-cookie'
+import config from "~src/config/index";
+
+export const getToken = () => {
+    return Cookies.get(config.tokenKey)
+}
+
+export const setToken = (token) => {
+    return Cookies.set(config['tokenKey'], token)
+}
+
+export const getRefreshToken = () => {
+    return Cookies.get(config['refreshTokenKey'])
+}
+
+export const setRefreshToken = (token) => {
+    return Cookies.set(config['refreshTokenKey'], token)
+}
+
+export const removeToken = () => {
+    return Cookies.remove(config['tokenKey'])
+}
+
+export const removeRefreshToken = () => {
+    return Cookies.remove(config['refreshTokenKey'])
+}

BIN
src/assets/icon/blue.png


BIN
src/assets/icon/brown.png


BIN
src/assets/icon/color.png


BIN
src/assets/icon/cyan.png


BIN
src/assets/icon/green.png


BIN
src/assets/icon/grey.png


BIN
src/assets/icon/mauve.png


BIN
src/assets/icon/orange.png


BIN
src/assets/icon/pink.png


BIN
src/assets/icon/purple.png


BIN
src/assets/icon/red.png


BIN
src/assets/icon/white.png


BIN
src/assets/icon/yellow.png


BIN
src/assets/images/Web515.png


BIN
src/assets/images/avatar.png


BIN
src/assets/images/color.png


BIN
src/assets/images/screen.png


BIN
src/assets/images/screen1.png


BIN
src/assets/images/short.png


BIN
src/assets/images/short1.png


BIN
src/assets/images/theme.png


BIN
src/assets/images/video.png


BIN
src/assets/images/video1.png


BIN
src/assets/images/word.png


BIN
src/assets/images/word1.png


BIN
src/assets/login/bd.png


BIN
src/assets/login/bg.png


BIN
src/assets/login/bim.png


BIN
src/assets/login/ca.png


BIN
src/assets/login/cube1.png


BIN
src/assets/login/cube2.png


BIN
src/assets/login/gis.png


BIN
src/assets/login/icon.png


BIN
src/assets/login/s1.png


BIN
src/assets/login/s2.png


BIN
src/assets/login/s3.png


BIN
src/assets/logo/logo-1.png


BIN
src/assets/logo/logo-2.png


BIN
src/assets/logo/name-dark.png


BIN
src/assets/logo/name-white.png


BIN
src/assets/view/152211@2x.png


BIN
src/assets/view/152221@2x.png


+ 508 - 0
src/assets/view/403.svg

@@ -0,0 +1,508 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="227px" height="269px" viewBox="0 0 227 269" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
+    <title>Group 9</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <path d="M0,131.5 C1.52216317e-15,101.788282 2.0023434,70.3064817 6.0070302,37.054599 L6.00703147,37.0545992 C8.23177711,18.5819983 23.2321456,4.27478563 41.7892683,2.9258328 C68.6224469,0.975277594 91.0407969,-6.24317082e-09 109.044318,0 C127.133265,6.27279111e-09 149.842798,0.984554771 177.17292,2.9536643 L177.17292,2.95366535 C195.745345,4.29179116 210.761581,18.6099912 212.981582,37.0977487 C216.993859,70.5112465 218.999998,102.082949 219,131.812857 C219.000002,161.472158 217.003381,192.843579 213.010137,225.927119 L213.010136,225.927119 C210.780269,244.401296 195.772997,258.705423 177.213148,260.046888 C149.974602,262.015629 127.477504,263 109.721856,263 C91.927568,263 69.2911098,262.01134 41.8124813,260.034021 L41.8124814,260.03402 C23.2430488,258.697792 8.22697111,244.385384 6.00173205,225.9014 C2.00057735,192.665746 1.52149174e-15,161.198612 0,131.5 Z" id="path-1"></path>
+        <filter x="-4.5%" y="-1.4%" width="106.2%" height="104.4%" filterUnits="objectBoundingBox" id="filter-2">
+            <feMorphology radius="0.81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="-6" dy="4" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M39.654321,130.992298 C39.654321,110.09311 40.5351746,89.1940983 42.2968819,68.2952631 L42.2968835,68.2952632 C43.2666685,56.7908671 52.197293,47.5570778 63.6629191,46.2039222 C78.8424188,44.4124609 94.0195118,43.5167302 109.194198,43.5167302 C124.360772,43.5167302 139.527341,44.4115034 154.693904,46.2010498 L154.693904,46.2010495 C166.164025,47.5544421 175.09671,56.7944422 176.061501,68.3037662 C177.833381,89.4411461 178.719321,110.482698 178.719321,131.428422 C178.719321,152.307984 177.838969,173.187319 176.078265,194.066429 L176.078265,194.066429 C175.10807,205.571375 166.17633,214.805149 154.709997,216.157282 C139.486491,217.95247 124.287302,218.850064 109.112431,218.850064 C93.9666716,218.850064 78.8209665,217.95591 63.6753158,216.167604 L63.6753156,216.167605 C52.2067135,214.813462 43.275345,205.574785 42.309801,194.06695 C40.539481,172.967394 39.654321,151.94251 39.654321,130.992298 Z" id="path-3"></path>
+        <filter x="-6.0%" y="-2.3%" width="108.6%" height="105.9%" filterUnits="objectBoundingBox" id="filter-4">
+            <feMorphology radius="0.81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="-5" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M161.510068,89.8583333 L176.8425,89.8583333 L176.8425,107.391667 L161.510068,107.391667 L161.510068,107.391667 C157.8829,107.391667 154.9425,104.451267 154.9425,100.824099 L154.9425,96.4259009 L154.9425,96.4259009 C154.9425,92.7987335 157.8829,89.8583333 161.510068,89.8583333 Z" id="path-5"></path>
+        <filter x="-13.7%" y="-5.7%" width="118.3%" height="117.1%" filterUnits="objectBoundingBox" id="filter-6">
+            <feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M183.957568,89.8583333 L199.29,89.8583333 L199.29,107.391667 L183.957568,107.391667 L183.957568,107.391667 C180.3304,107.391667 177.39,104.451267 177.39,100.824099 L177.39,96.4259009 L177.39,96.4259009 C177.39,92.7987335 180.3304,89.8583333 183.957568,89.8583333 Z" id="path-7"></path>
+        <filter x="-2.3%" y="-2.9%" width="109.1%" height="111.4%" filterUnits="objectBoundingBox" id="filter-8">
+            <feOffset dx="1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <filter x="-55.5%" y="-9.3%" width="177.5%" height="148.0%" filterUnits="objectBoundingBox" id="filter-9">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-55.5%" y="-9.3%" width="177.5%" height="148.0%" filterUnits="objectBoundingBox" id="filter-10">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <path d="M8.86493515,17.2480344 C8.4007802,16.9327578 8.09567896,16.3993146 8.09567896,15.7943295 C8.09567896,14.82567 8.87784133,14.0404164 9.84268751,14.0404164 C10.8075337,14.0404164 11.5896961,14.82567 11.5896961,15.7943295 C11.5896961,16.3993146 11.2845948,16.9327578 10.8204399,17.2480344 L11.7961308,19.984547 C11.9101195,20.3042502 11.743355,20.6558271 11.4236517,20.7698158 C11.3574028,20.7934365 11.2875908,20.8055099 11.2172568,20.8055099 L8.46811816,20.8055099 L8.46811816,20.8055099 C8.1287016,20.8055099 7.85355011,20.5303584 7.85355011,20.1909418 C7.85355011,20.1206079 7.86562345,20.0507959 7.8892442,19.984547 L8.86493515,17.2480344 Z" id="path-11"></path>
+        <filter x="-12.0%" y="-7.4%" width="124.1%" height="114.8%" filterUnits="objectBoundingBox" id="filter-12">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetInner1"></feOffset>
+            <feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-13">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-14">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-15">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-16">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-17">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-18">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-19">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-20">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-21">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-22">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-23">
+            <feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-24">
+            <feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-25">
+            <feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-26">
+            <feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-27">
+            <feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-28">
+            <feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-29">
+            <feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-30" x="79.0833333" y="68.7939815" width="60.8333333" height="24.3518519"></rect>
+        <filter x="-2.5%" y="-2.1%" width="103.3%" height="108.2%" filterUnits="objectBoundingBox" id="filter-31">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <rect id="path-32" x="119.233333" y="71.2346165" width="18.2504951" height="19.5072939"></rect>
+        <path d="M6.69173423,0.214583333 L15.4541667,0.214583333 L15.4541667,30.8979167 L6.69173423,30.8979167 L6.69173423,30.8979167 C3.06456682,30.8979167 0.124166667,27.9575165 0.124166667,24.3303491 L0.124166667,6.7821509 L0.124166667,6.7821509 C0.124166667,3.15498349 3.06456682,0.214583333 6.69173423,0.214583333 Z" id="path-34"></path>
+        <filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="filter-35">
+            <feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.866666667   0 0 0 0 0.890196078   0 0 0 0 0.909803922  0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-36">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-37">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <path d="M42.8291667,11.875589 L42.8291667,19.236911 C42.8291667,19.9264853 42.3373793,20.5354959 41.738915,20.595957 L17.6441667,22.6791667 L17.6441667,8.43333333 L41.738915,10.516543 C42.3410444,10.5773757 42.8291667,11.185286 42.8291667,11.875589 Z" id="path-38"></path>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-39">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-40">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-41" x="12.23" y="6.78958333" width="7.1175" height="17.5333333" rx="1.09459459"></rect>
+        <filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="filter-42">
+            <feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M6.69173423,0.214583333 L15.4541667,0.214583333 L15.4541667,30.8979167 L6.69173423,30.8979167 L6.69173423,30.8979167 C3.06456682,30.8979167 0.124166667,27.9575165 0.124166667,24.3303491 L0.124166667,6.7821509 L0.124166667,6.7821509 C0.124166667,3.15498349 3.06456682,0.214583333 6.69173423,0.214583333 Z" id="path-43"></path>
+        <filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="filter-44">
+            <feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.866666667   0 0 0 0 0.890196078   0 0 0 0 0.909803922  0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-45">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-46">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <path d="M42.8291667,11.875589 L42.8291667,19.236911 C42.8291667,19.9264853 42.3373793,20.5354959 41.738915,20.595957 L17.6441667,22.6791667 L17.6441667,8.43333333 L41.738915,10.516543 C42.3410444,10.5773757 42.8291667,11.185286 42.8291667,11.875589 Z" id="path-47"></path>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-48">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-49">
+            <feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-50" x="12.23" y="6.78958333" width="7.1175" height="17.5333333" rx="1.09459459"></rect>
+        <filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="filter-51">
+            <feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M24.5975819,18.9156325 C22.7107005,18.6906938 20.1873316,18.3702571 18.5998357,18.0903387 C15.7716385,17.5916513 10.2254435,16.2267099 10.2254435,16.2267099 L9.43228672,20.7249253 C9.43228672,20.7249253 15.1331234,21.2766981 17.950402,21.7734603 C19.3152185,22.0141143 21.3273422,22.4758916 23.0359088,22.887195 C22.0718328,24.3735021 20.9147108,26.1229174 20.0932954,27.2534987 C18.405278,29.5768553 14.7471849,33.9633914 14.7471849,33.9633914 L18.4424572,36.6481639 C18.4424572,36.6481639 21.4374695,31.7661671 23.1189701,29.4517801 C23.9598468,28.2944125 25.3148663,26.6203912 26.4570264,25.2388063 C27.4382453,26.7462318 28.6051214,28.5736505 29.3214044,29.8142891 C30.7573178,32.301364 33.2767374,37.4273633 33.2767374,37.4273633 L37.2324017,35.1435594 C37.2324017,35.1435594 33.990657,30.4217925 32.5602872,27.9443193 C31.8079686,26.6412654 30.764866,24.5861738 29.94691,22.9346427 C31.7349883,22.451283 33.9931664,21.8608332 35.4733174,21.5462174 C38.2823878,20.9491311 43.9360463,20.1370415 43.9360463,20.1370415 L42.9863873,15.669247 C42.9863873,15.669247 37.4939659,17.2932232 34.6957402,17.8880045 C33.1431973,18.2180076 30.6947576,18.5971515 28.8277097,18.8686298 C28.722602,16.9801623 28.6032977,14.4864013 28.6032977,12.8962937 C28.6032977,10.024467 28.984416,4.32551158 28.984416,4.32551158 L24.4168083,4.32551158 C24.4168083,4.32551158 24.8633581,10.0355541 24.8633581,12.8962937 C24.8633581,14.5048733 24.7214143,17.0240015 24.5975819,18.9156325 Z" id="path-52"></path>
+        <filter x="-14.6%" y="-6.2%" width="120.9%" height="121.4%" filterUnits="objectBoundingBox" id="filter-54">
+            <feMorphology radius="0.547297297" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="-3" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
+            <feColorMatrix values="0 0 0 0 0.639215686   0 0 0 0 0.694117647   0 0 0 0 0.749019608  0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <ellipse id="path-55" cx="26.802716" cy="22.6705733" rx="4.38" ry="4.38333333"></ellipse>
+        <filter x="-34.2%" y="-11.4%" width="145.7%" height="134.2%" filterUnits="objectBoundingBox" id="filter-56">
+            <feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0.596078431   0 0 0 0 0.647058824   0 0 0 0 0.701960784  0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="403" transform="translate(-592.000000, -260.000000)">
+            <g id="Group-9" transform="translate(599.000000, 261.000000)">
+                <g id="Group-11">
+                    <g id="Rectangle-355">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+                        <use stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-1"></use>
+                    </g>
+                    <g id="Rectangle-355">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
+                        <use stroke="#A3B1BF" stroke-width="1.62" fill-opacity="0.15" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-3"></use>
+                    </g>
+                    <g id="Rectangle-357">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
+                        <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-5"></use>
+                        <path stroke="#A3B1BF" stroke-width="1.62" d="M176.0325,106.581667 L176.0325,90.6683333 L161.510068,90.6683333 C158.330251,90.6683333 155.7525,93.2460841 155.7525,96.4259009 L155.7525,100.824099 C155.7525,104.003916 158.330251,106.581667 161.510068,106.581667 L176.0325,106.581667 Z"></path>
+                    </g>
+                    <g id="Rectangle-357" transform="translate(188.340000, 98.625000) scale(-1, 1) translate(-188.340000, -98.625000) ">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
+                        <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-7"></use>
+                        <path stroke="#A3B1BF" stroke-width="1.62" d="M198.48,106.581667 L198.48,90.6683333 L183.957568,90.6683333 C180.777751,90.6683333 178.2,93.2460841 178.2,96.4259009 L178.2,100.824099 C178.2,104.003916 180.777751,106.581667 183.957568,106.581667 L198.48,106.581667 Z"></path>
+                    </g>
+                    <path d="M169.537821,109.198898 L179.520726,109.198898 L179.520726,106.316665 C179.657239,106.659699 174.968976,106.316665 172.419859,106.316665 L174.153055,100.243742 C171.605657,100.243742 169.537821,102.294522 169.537821,104.822572 L169.537821,109.198898 Z M181.404585,106.764356 L181.334952,105.82938 C178.493277,106.319657 175.877716,105.82938 172.088276,105.82938 L174.153055,98.0162037 C170.365914,98.0162037 167.291667,101.063519 167.291667,104.822572 L167.291667,106.764356 L166.869647,106.764356 L166.869647,106.764356 C165.758829,106.764356 164.858333,107.664852 164.858333,108.775669 L164.858333,108.775669 L164.858333,115.540394 C164.858333,119.983665 168.460316,123.585648 172.903588,123.585648 L176.279745,123.585648 C180.723017,123.585648 184.325,119.983665 184.325,115.540394 L184.325,108.775669 C184.325,107.664852 183.424504,106.764356 182.313686,106.764356 L181.404585,106.764356 Z" id="Shape" fill="#D4DBE2" fill-rule="nonzero"></path>
+                    <g id="Group-6" filter="url(#filter-9)" transform="translate(160.419753, 95.472603)">
+                        <ellipse id="Oval-191" stroke="#D9D9D9" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#D9D9D9" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-10)" transform="translate(189.259259, 95.472603)">
+                        <ellipse id="Oval-191" stroke="#D9D9D9" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#D9D9D9" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="lock" transform="translate(166.683333, 96.798611)">
+                        <path d="M2.43333333,9.34812925 L2.43333333,7.750693 C2.43333333,4.33901358 4.64933408,1.45058816 7.70555556,0.476293029 L7.70555556,4.05203095 C6.57838885,4.84048413 5.84,6.15673686 5.84,7.64734194 L5.84,9.34812925 L14.4830461,9.34812925 C14.4830461,8.8280509 14.4830461,8.25372782 14.4830461,7.64734194 C14.4830461,6.44285214 14.0009139,5.352206 13.2211113,4.56188949 L13.2211113,0.864048014 C15.7633754,2.09038625 17.52,4.7131478 17.52,7.750693 C17.52,8.30041562 17.52,8.83504216 17.52,9.3491485 C18.6008993,9.38327886 19.4666667,10.2702555 19.4666667,11.3594429 L19.4666667,18.3317768 C19.4666667,22.7750482 15.8646835,26.3770314 11.4214121,26.3770314 L8.04525456,26.3770314 C3.60198316,26.3770314 5.4414381e-16,22.7750482 0,18.3317768 L0,11.3594429 C-1.36035952e-16,10.248625 0.900495789,9.34812925 2.01131364,9.34812925 L2.01131364,9.34812925 L2.43333333,9.34812925 Z" id="Combined-Shape" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5"></path>
+                        <g id="Oval-1115">
+                            <use fill-opacity="0.3" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-11"></use>
+                            <use fill="black" fill-opacity="1" filter="url(#filter-12)" xlink:href="#path-11"></use>
+                        </g>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-13)" transform="translate(64.000000, 75.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-11" filter="url(#filter-14)" transform="translate(152.000000, 75.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-2" filter="url(#filter-15)" transform="translate(57.000000, 120.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-3" filter="url(#filter-16)" transform="translate(57.000000, 137.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-4" filter="url(#filter-17)" transform="translate(64.000000, 186.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-5" filter="url(#filter-18)" transform="translate(93.000000, 191.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-6" filter="url(#filter-19)" transform="translate(122.000000, 191.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-7" filter="url(#filter-20)" transform="translate(152.000000, 186.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-21)" transform="translate(160.419753, 95.472603)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-22)" transform="translate(189.259259, 95.472603)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-23)" transform="translate(25.000000, 38.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-8" filter="url(#filter-24)" transform="translate(25.000000, 218.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-9" filter="url(#filter-25)" transform="translate(106.000000, 237.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
+                    </g>
+                    <g id="Group-6-Copy-10" filter="url(#filter-26)" transform="translate(185.000000, 219.000000)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-27)" transform="translate(14.419753, 129.698630)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-28)" transform="translate(105.444444, 20.715753)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
+                    </g>
+                    <g id="Group-6" filter="url(#filter-29)" transform="translate(185.055000, 37.806250)">
+                        <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F5F5F5" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
+                        <polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
+                    </g>
+                    <g id="Rectangle-373">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-31)" xlink:href="#path-30"></use>
+                        <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-30"></use>
+                        <rect stroke="#A3B1BF" stroke-width="2.43" x="80.2983333" y="70.0089815" width="58.4033333" height="21.9218519"></rect>
+                    </g>
+                    <mask id="mask-33" fill="white">
+                        <use xlink:href="#path-32"></use>
+                    </mask>
+                    <use id="Mask" fill-opacity="0.3" fill="#A3B1BF" xlink:href="#path-32"></use>
+                    <rect id="Rectangle-375" fill="#A3B1BF" x="114.366667" y="77.3171296" width="1.825" height="8.11728395" rx="0.9125"></rect>
+                    <rect id="Rectangle-375" fill="#A3B1BF" x="118.016667" y="72.6496914" width="2.43333333" height="16.2345679" rx="1.21666667"></rect>
+                    <g id="Group-4" transform="translate(25.000000, 88.000000)">
+                        <g id="Rectangle-369">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-35)" xlink:href="#path-34"></use>
+                            <use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-34"></use>
+                            <path stroke="#A3B1BF" stroke-width="1.62" d="M14.6441667,30.0879167 L14.6441667,1.02458333 L6.69173423,1.02458333 C3.51191747,1.02458333 0.934166667,3.60233414 0.934166667,6.7821509 L0.934166667,24.3303491 C0.934166667,27.5101659 3.51191747,30.0879167 6.69173423,30.0879167 L14.6441667,30.0879167 Z"></path>
+                        </g>
+                        <g id="Group-6" filter="url(#filter-36)" transform="translate(6.207500, 6.789583)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Group-6" filter="url(#filter-37)" transform="translate(6.543210, 19.181507)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Rectangle-371">
+                            <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-38"></use>
+                            <path stroke="#A3B1BF" stroke-width="1.62" d="M18.4541667,9.31638699 L18.4541667,21.7961161 L41.6574976,19.7900592 C41.8219325,19.7734468 42.0191667,19.5280875 42.0191667,19.236911 L42.0191667,11.875589 C42.0191667,11.5822335 41.824213,11.3392839 41.6691435,11.3235325 L18.4541667,9.31638699 Z"></path>
+                        </g>
+                        <g id="Group-6" filter="url(#filter-39)" transform="translate(23.000000, 13.000000)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Group-6-Copy" filter="url(#filter-40)" transform="translate(33.000000, 13.000000)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Rectangle-370">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-42)" xlink:href="#path-41"></use>
+                            <use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-41"></use>
+                            <rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.59958333" width="5.4975" height="15.9133333" rx="1.09459459"></rect>
+                        </g>
+                        <path d="M13.59875,15.55625 L17.97875,15.55625" id="Line" stroke="#A3B1BF" stroke-width="2.18918919" stroke-linecap="square"></path>
+                    </g>
+                    <g id="Group-4-Copy" transform="translate(25.000000, 145.000000)">
+                        <g id="Rectangle-369">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-44)" xlink:href="#path-43"></use>
+                            <use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-43"></use>
+                            <path stroke="#A3B1BF" stroke-width="1.62" d="M14.6441667,30.0879167 L14.6441667,1.02458333 L6.69173423,1.02458333 C3.51191747,1.02458333 0.934166667,3.60233414 0.934166667,6.7821509 L0.934166667,24.3303491 C0.934166667,27.5101659 3.51191747,30.0879167 6.69173423,30.0879167 L14.6441667,30.0879167 Z"></path>
+                        </g>
+                        <g id="Group-6" filter="url(#filter-45)" transform="translate(6.207500, 6.789583)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Group-6" filter="url(#filter-46)" transform="translate(6.543210, 19.181507)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Rectangle-371">
+                            <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-47"></use>
+                            <path stroke="#A3B1BF" stroke-width="1.62" d="M18.4541667,9.31638699 L18.4541667,21.7961161 L41.6574976,19.7900592 C41.8219325,19.7734468 42.0191667,19.5280875 42.0191667,19.236911 L42.0191667,11.875589 C42.0191667,11.5822335 41.824213,11.3392839 41.6691435,11.3235325 L18.4541667,9.31638699 Z"></path>
+                        </g>
+                        <g id="Group-6" filter="url(#filter-48)" transform="translate(23.000000, 13.000000)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Group-6-Copy" filter="url(#filter-49)" transform="translate(33.000000, 13.000000)">
+                            <ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
+                            <polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
+                        </g>
+                        <g id="Rectangle-370">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-51)" xlink:href="#path-50"></use>
+                            <use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-50"></use>
+                            <rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.59958333" width="5.4975" height="15.9133333" rx="1.09459459"></rect>
+                        </g>
+                        <path d="M13.59875,15.55625 L17.97875,15.55625" id="Line" stroke="#A3B1BF" stroke-width="2.18918919" stroke-linecap="square"></path>
+                    </g>
+                </g>
+                <g id="Group-17" transform="translate(135.185185, 131.500000)">
+                    <path d="M22.4835494,46.23099 C10.0861375,46.23099 0.0360493827,36.1732534 0.0360493827,23.7664066 C0.0360493827,11.3595599 10.0861375,1.30182331 22.4835494,1.30182331 C34.8809613,1.30182331 44.9310494,11.3595599 44.9310494,23.7664066 C44.9310494,36.1732534 34.8809613,46.23099 22.4835494,46.23099 Z M22.4835494,39.65599 C31.2524505,39.65599 38.3610494,32.5419812 38.3610494,23.7664066 C38.3610494,14.9908321 31.2524505,7.87682331 22.4835494,7.87682331 C13.7146483,7.87682331 6.60604938,14.9908321 6.60604938,23.7664066 C6.60604938,32.5419812 13.7146483,39.65599 22.4835494,39.65599 Z" id="Oval-190" fill-opacity="0.3" fill="#A3B1BF"></path>
+                    <mask id="mask-53" fill="white">
+                        <use xlink:href="#path-52"></use>
+                    </mask>
+                    <g id="Mask">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-54)" xlink:href="#path-52"></use>
+                        <use stroke="#A3B1BF" stroke-width="1.09459459" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-52"></use>
+                    </g>
+                    <g id="Group-7" transform="translate(0.360494, 0.078598)" fill="#98A5B3">
+                        <path d="M20.5636489,0.927088888 C22.1113303,0.589405992 23.7186545,0.411496914 25.3675,0.411496914 C37.7649119,0.411496914 47.815,10.4692335 47.815,22.8760802 C47.815,33.7386653 40.1110508,42.8005273 29.8728116,44.8880725 L27.4696515,38.6276265 C35.2448963,37.5983622 41.245,30.9384541 41.245,22.8760802 C41.245,14.1005057 34.1364011,6.98649691 25.3675,6.98649691 C22.0362626,6.98649691 18.9446369,8.01317718 16.3913275,9.76760576 L15.30877,6.94744709 L20.5636489,0.927088888 Z" id="Oval-190"></path>
+                    </g>
+                    <path d="M26.802716,45.1351566 C14.4053041,45.1351566 4.35521605,35.0774201 4.35521605,22.6705733 C4.35521605,10.2637265 14.4053041,0.20598998 26.802716,0.20598998 C39.200128,0.20598998 49.250216,10.2637265 49.250216,22.6705733 C49.250216,35.0774201 39.200128,45.1351566 26.802716,45.1351566 Z M26.802716,38.5601566 C35.5716172,38.5601566 42.680216,31.4461479 42.680216,22.6705733 C42.680216,13.8949988 35.5716172,6.78098998 26.802716,6.78098998 C18.0338149,6.78098998 10.925216,13.8949988 10.925216,22.6705733 C10.925216,31.4461479 18.0338149,38.5601566 26.802716,38.5601566 Z" id="Oval-190" fill="#A3B1BF"></path>
+                    <path d="M37.5685802,6.47400902 C37.5685802,6.47400902 40.3560433,8.0639828 43.0005786,12.4958138 C45.6451139,16.9276447 45.9870813,21.4863845 45.9870813,21.4863845" id="Line" stroke="#F7FAFC" stroke-width="1.62" stroke-linecap="round"></path>
+                    <g id="Oval-199">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-56)" xlink:href="#path-55"></use>
+                        <use fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-55"></use>
+                    </g>
+                    <path d="M27.0403924,24.1861178 C28.3842853,24.1861178 29.4737257,23.0958483 29.4737257,21.7509326 C29.4737257,20.406017 28.3842853,19.3157475 27.0403924,19.3157475 C27.0403924,19.3157475 27.6699621,20.406017 27.6699621,21.7509326 C27.6699621,23.0958483 27.0403924,24.1861178 27.0403924,24.1861178 Z" id="Oval-199" fill="#F7FAFC" transform="translate(28.257059, 21.750933) rotate(-43.000000) translate(-28.257059, -21.750933) "></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 314 - 0
src/assets/view/404.svg

@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="423px" height="341px" viewBox="0 0 423 341" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
+    <title>Group 4</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="404" transform="translate(-484.000000, -221.000000)">
+            <g id="Group-4" transform="translate(464.000000, 222.000000)">
+                <g id="Group-5" transform="translate(75.417348, 0.163879)" stroke="#A3B1BF" stroke-width="1.62" opacity="0.6" stroke-linejoin="round" stroke-dasharray="12.15">
+                    <path d="M169.575185,288.890375 C103.647066,288.890375 50.2010204,235.455806 50.2010204,169.540425 C50.2010204,103.625045 103.647066,50.1904762 169.575185,50.1904762 C235.50394,50.1904762 288.94935,103.625045 288.94935,169.540425 C288.94935,235.455806 235.50394,288.890375 169.575185,288.890375 Z" id="Stroke-1"></path>
+                    <path d="M169.405699,338.555288 C76.0274364,338.555288 0.329411882,262.872619 0.329411882,169.513299 C0.329411882,76.1539786 76.0274364,0.471309613 169.405699,0.471309613 C262.783961,0.471309613 338.481985,76.1539786 338.481985,169.513299 C338.481985,262.872619 262.783961,338.555288 169.405699,338.555288 Z" id="Stroke-3"></path>
+                </g>
+                <polygon id="Fill-6" fill="#F5F5F5" transform="translate(106.914750, 199.432805) rotate(22.000000) translate(-106.914750, -199.432805) " points="97.7112298 198.803016 116.11827 190.231152 107.544667 208.634458"></polygon>
+                <polygon id="Stroke-7" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(106.914750, 199.432805) rotate(22.000000) translate(-106.914750, -199.432805) " points="97.7112298 198.803016 116.11827 190.231152 107.544667 208.634458"></polygon>
+                <polygon id="Fill-8" transform="translate(58.996118, 219.767028) rotate(22.000000) translate(-58.996118, -219.767028) " points="38.8543444 215.183828 54.4119879 199.629341 79.1378915 224.350228 63.580248 239.904716"></polygon>
+                <polygon id="Stroke-9" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(58.996118, 219.767028) rotate(22.000000) translate(-58.996118, -219.767028) " points="38.8543444 215.183828 54.4119879 199.629341 79.1378915 224.350228 63.580248 239.904716"></polygon>
+                <polygon id="Fill-10" fill="#F5F5F5" transform="translate(71.226096, 214.577614) rotate(22.000000) translate(-71.226096, -214.577614) " points="51.4642422 198.657893 55.3028278 194.820086 90.9879502 230.497335 87.1487294 234.335141"></polygon>
+                <polygon id="Stroke-11" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" transform="translate(71.226096, 214.577614) rotate(22.000000) translate(-71.226096, -214.577614) " points="51.4642422 198.657893 55.3028278 194.820086 90.9879502 230.497335 87.1487294 234.335141"></polygon>
+                <polygon id="Fill-12" transform="translate(84.698338, 273.903349) rotate(22.000000) translate(-84.698338, -273.903349) " points="56.0769883 259.690379 70.4821667 245.288122 113.319688 288.116319 98.9145099 302.518575"></polygon>
+                <polygon id="Stroke-13" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(84.698338, 273.903349) rotate(22.000000) translate(-84.698338, -273.903349) " points="56.0769883 259.690379 70.4821667 245.288122 113.319688 288.116319 98.9145099 302.518575"></polygon>
+                <polygon id="Fill-14" transform="translate(75.456149, 212.782520) rotate(22.000000) translate(-75.456149, -212.782520) " points="63.8911557 203.879723 66.5512281 201.22019 87.0211429 221.685318 84.3604352 224.34485"></polygon>
+                <polygon id="Stroke-15" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(75.456149, 212.782520) rotate(22.000000) translate(-75.456149, -212.782520) " points="63.8911557 203.879723 66.5512281 201.22019 87.0211429 221.685318 84.3604352 224.34485"></polygon>
+                <polygon id="Fill-16" fill="#F5F5F5" transform="translate(78.176142, 202.618192) rotate(22.000000) translate(-78.176142, -202.618192) " points="74.4026766 205.006817 80.5652518 198.845492 81.9496076 200.229567 75.7870324 206.390892"></polygon>
+                <polygon id="Stroke-17" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(78.176142, 202.618192) rotate(22.000000) translate(-78.176142, -202.618192) " points="74.4026766 205.006817 80.5652518 198.845492 81.9496076 200.229567 75.7870324 206.390892"></polygon>
+                <polygon id="Fill-18" fill="#F5F5F5" transform="translate(84.676979, 217.928886) rotate(22.000000) translate(-84.676979, -217.928886) " points="80.9035138 220.317511 87.066089 214.156186 88.4504448 215.540261 82.2878696 221.701586"></polygon>
+                <polygon id="Stroke-19" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(84.676979, 217.928886) rotate(22.000000) translate(-84.676979, -217.928886) " points="80.9035138 220.317511 87.066089 214.156186 88.4504448 215.540261 82.2878696 221.701586"></polygon>
+                <polygon id="Fill-20" transform="translate(70.238421, 242.404581) rotate(22.000000) translate(-70.238421, -242.404581) " points="67.8493111 238.631881 74.0118863 244.793206 72.6275305 246.177281 66.4649553 240.015956"></polygon>
+                <polygon id="Stroke-21" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(70.238421, 242.404581) rotate(22.000000) translate(-70.238421, -242.404581) " points="67.8493111 238.631881 74.0118863 244.793206 72.6275305 246.177281 66.4649553 240.015956"></polygon>
+                <polygon id="Fill-22" transform="translate(48.081755, 224.398789) rotate(22.000000) translate(-48.081755, -224.398789) " points="35.1127107 220.725179 36.3242602 211.432376 61.0507992 236.153899 51.756111 237.365203"></polygon>
+                <polygon id="Stroke-23" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(48.081755, 224.398789) rotate(22.000000) translate(-48.081755, -224.398789) " points="35.1127107 220.725179 36.3242602 211.432376 61.0507992 236.153899 51.756111 237.365203"></polygon>
+                <polygon id="Fill-24" transform="translate(38.612968, 228.416820) rotate(22.000000) translate(-38.612968, -228.416820) " points="32.9179858 217.470622 26.2496982 216.056058 50.9762371 240.777581 49.5613861 234.110647"></polygon>
+                <polygon id="Stroke-25" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(38.612968, 228.416820) rotate(22.000000) translate(-38.612968, -228.416820) " points="32.9179858 217.470622 26.2496982 216.056058 50.9762371 240.777581 49.5613861 234.110647"></polygon>
+                <polygon id="Fill-26" transform="translate(31.086342, 221.523909) rotate(22.000000) translate(-31.086342, -221.523909) " points="32.6469986 217.297684 26.8592604 218.37941 34.2314793 225.750133 35.3134242 219.963569"></polygon>
+                <polygon id="Stroke-27" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(31.086342, 221.523909) rotate(22.000000) translate(-31.086342, -221.523909) " points="32.6469986 217.297684 26.8592604 218.37941 34.2314793 225.750133 35.3134242 219.963569"></polygon>
+                <polygon id="Fill-28" transform="translate(38.344372, 238.617819) rotate(22.000000) translate(-38.344372, -238.617819) " points="39.9050284 234.391595 34.1172902 235.47332 41.4895091 242.844044 42.571454 237.05748"></polygon>
+                <polygon id="Stroke-29" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(38.344372, 238.617819) rotate(22.000000) translate(-38.344372, -238.617819) " points="39.9050284 234.391595 34.1172902 235.47332 41.4895091 242.844044 42.571454 237.05748"></polygon>
+                <polygon id="Fill-30" fill="#F0F2F5" transform="translate(75.352798, 203.766862) rotate(22.000000) translate(-75.352798, -203.766862) " points="71.4417859 201.708217 73.2937351 199.856644 79.2638092 205.824871 77.4118601 207.67708"></polygon>
+                <polygon id="Stroke-31" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(75.352798, 203.766862) rotate(22.000000) translate(-75.352798, -203.766862) " points="71.4417859 201.708217 73.2937351 199.856644 79.2638092 205.824871 77.4118601 207.67708"></polygon>
+                <polygon id="Fill-32" fill="#F0F2F5" transform="translate(81.871541, 219.119730) rotate(22.000000) translate(-81.871541, -219.119730) " points="77.9605297 217.061085 79.8124789 215.209512 85.7825531 221.177739 83.9306039 223.029948"></polygon>
+                <polygon id="Stroke-33" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(81.871541, 219.119730) rotate(22.000000) translate(-81.871541, -219.119730) " points="77.9605297 217.061085 79.8124789 215.209512 85.7825531 221.177739 83.9306039 223.029948"></polygon>
+                <polygon id="Fill-34" transform="translate(68.034935, 237.215417) rotate(22.000000) translate(-68.034935, -237.215417) " points="65.1594898 237.106164 67.9256601 234.340555 70.9103796 237.324669 68.1442092 240.090278"></polygon>
+                <polygon id="Stroke-35" stroke="#A3B1BF" stroke-width="1.62" fill="#F5F5F5" stroke-linejoin="round" transform="translate(68.034935, 237.215417) rotate(22.000000) translate(-68.034935, -237.215417) " points="65.1594898 237.106164 67.9256601 234.340555 70.9103796 237.324669 68.1442092 240.090278"></polygon>
+                <path d="M90.2556147,213.065319 C79.2271463,202.039088 74.6433339,188.153875 78.4889079,179.512775 C79.1248602,178.084237 80.8319571,175.429786 84.5339495,179.131027 C88.2353065,182.832268 120.560237,215.150007 123.931865,218.52095 C127.303492,221.891894 125.245065,224.192545 123.817508,224.827733 C115.174655,228.675068 101.284718,224.092186 90.2556147,213.065319 Z" id="Fill-36" fill="#F5F5F5" transform="translate(101.453924, 201.708917) rotate(22.000000) translate(-101.453924, -201.708917) "></path>
+                <path d="M90.2556147,213.065319 C79.2271463,202.039088 74.6433339,188.153875 78.4889079,179.512775 C79.1248602,178.084237 80.8319571,175.429786 84.5339495,179.131027 C88.2353065,182.832268 120.560237,215.150007 123.931865,218.52095 C127.303492,221.891894 125.245065,224.192545 123.817508,224.827733 C115.174655,228.675068 101.284718,224.092186 90.2556147,213.065319 Z" id="Stroke-38" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" transform="translate(101.453924, 201.708917) rotate(22.000000) translate(-101.453924, -201.708917) "></path>
+                <polygon id="Fill-40" fill="#F0F2F5" transform="translate(86.633853, 208.038961) rotate(22.000000) translate(-86.633853, -208.038961) " points="77.9716233 201.230061 79.8235724 199.378488 95.2960835 214.84786 93.4441343 216.699433"></polygon>
+                <polygon id="Stroke-42" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(86.633853, 208.038961) rotate(22.000000) translate(-86.633853, -208.038961) " points="77.9716233 201.230061 79.8235724 199.378488 95.2960835 214.84786 93.4441343 216.699433"></polygon>
+                <path d="M121.635514,196.068815 C120.517356,197.186746 118.704797,197.186746 117.586639,196.068815 C116.469116,194.950884 116.469116,193.138692 117.586639,192.020761 C118.704797,190.903465 120.517356,190.903465 121.635514,192.020761 C122.753672,193.138692 122.753672,194.950884 121.635514,196.068815" id="Fill-44" fill="#A3B1BF" transform="translate(119.611315, 194.045026) rotate(22.000000) translate(-119.611315, -194.045026) "></path>
+                <polygon id="Fill-46" fill-opacity="0.6" fill="#A3B1BF" transform="translate(81.250567, 248.056422) rotate(22.000000) translate(-81.250567, -248.056422) " points="81.2505672 249.672341 79.6343206 248.056422 81.2505672 246.440503 82.8668137 248.056422"></polygon>
+                <polygon id="Stroke-48" transform="translate(81.250567, 248.056422) rotate(22.000000) translate(-81.250567, -248.056422) " points="81.2505672 249.672341 79.6343206 248.056422 81.2505672 246.440503 82.8668137 248.056422"></polygon>
+                <polygon id="Fill-50" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.702196, 251.475282) rotate(22.000000) translate(-82.702196, -251.475282) " points="82.7021965 253.091201 81.0859499 251.475282 82.7021965 249.859363 84.318443 251.475282"></polygon>
+                <polygon id="Stroke-52" transform="translate(82.702196, 251.475282) rotate(22.000000) translate(-82.702196, -251.475282) " points="82.7021965 253.091201 81.0859499 251.475282 82.7021965 249.859363 84.318443 251.475282"></polygon>
+                <polygon id="Fill-54" fill-opacity="0.6" fill="#A3B1BF" transform="translate(84.153791, 254.894059) rotate(22.000000) translate(-84.153791, -254.894059) " points="84.1537906 256.509978 82.5375441 254.894059 84.1537906 253.278141 85.7700372 254.894059"></polygon>
+                <polygon id="Stroke-56" transform="translate(84.153791, 254.894059) rotate(22.000000) translate(-84.153791, -254.894059) " points="84.1537906 256.509978 82.5375441 254.894059 84.1537906 253.278141 85.7700372 254.894059"></polygon>
+                <polygon id="Fill-58" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.605385, 258.312837) rotate(22.000000) translate(-85.605385, -258.312837) " points="85.6053848 259.928756 83.9891383 258.312837 85.6053848 256.696918 87.2216313 258.312837"></polygon>
+                <polygon id="Stroke-60" transform="translate(85.605385, 258.312837) rotate(22.000000) translate(-85.605385, -258.312837) " points="85.6053848 259.928756 83.9891383 258.312837 85.6053848 256.696918 87.2216313 258.312837"></polygon>
+                <polygon id="Fill-62" fill-opacity="0.6" fill="#A3B1BF" transform="translate(78.094482, 249.395723) rotate(22.000000) translate(-78.094482, -249.395723) " points="78.0944819 251.011642 76.4782353 249.395723 78.0944819 247.779804 79.7107284 249.395723"></polygon>
+                <polygon id="Stroke-64" transform="translate(78.094482, 249.395723) rotate(22.000000) translate(-78.094482, -249.395723) " points="78.0944819 251.011642 76.4782353 249.395723 78.0944819 247.779804 79.7107284 249.395723"></polygon>
+                <polygon id="Fill-66" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.546052, 252.814559) rotate(22.000000) translate(-79.546052, -252.814559) " points="79.5460522 254.430478 77.9298057 252.814559 79.5460522 251.198641 81.1622988 252.814559"></polygon>
+                <polygon id="Stroke-68" transform="translate(79.546052, 252.814559) rotate(22.000000) translate(-79.546052, -252.814559) " points="79.5460522 254.430478 77.9298057 252.814559 79.5460522 251.198641 81.1622988 252.814559"></polygon>
+                <polygon id="Fill-70" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.997705, 256.233360) rotate(22.000000) translate(-80.997705, -256.233360) " points="80.9977053 257.849279 79.3814588 256.23336 80.9977053 254.617442 82.6139518 256.23336"></polygon>
+                <polygon id="Stroke-72" transform="translate(80.997705, 256.233360) rotate(22.000000) translate(-80.997705, -256.233360) " points="79.3814588 256.23336 80.9977053 254.617442 82.6139518 256.23336 80.9977053 257.849279"></polygon>
+                <polygon id="Fill-74" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.449276, 259.652197) rotate(22.000000) translate(-82.449276, -259.652197) " points="82.4492757 261.268115 80.8330292 259.652197 82.4492757 258.036278 84.0655222 259.652197"></polygon>
+                <polygon id="Stroke-76" transform="translate(82.449276, 259.652197) rotate(22.000000) translate(-82.449276, -259.652197) " points="82.4492757 261.268115 80.8330292 259.652197 82.4492757 258.036278 84.0655222 259.652197"></polygon>
+                <polygon id="Fill-78" fill-opacity="0.6" fill="#A3B1BF" transform="translate(74.938373, 250.735083) rotate(22.000000) translate(-74.938373, -250.735083) " points="74.9383727 252.351002 73.3221262 250.735083 74.9383727 249.119164 76.5546193 250.735083"></polygon>
+                <polygon id="Stroke-80" transform="translate(74.938373, 250.735083) rotate(22.000000) translate(-74.938373, -250.735083) " points="74.9383727 252.351002 73.3221262 250.735083 74.9383727 249.119164 76.5546193 250.735083"></polygon>
+                <polygon id="Fill-82" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.389967, 254.153860) rotate(22.000000) translate(-76.389967, -254.153860) " points="76.3899669 255.769779 74.7737204 254.15386 76.3899669 252.537942 78.0062134 254.15386"></polygon>
+                <polygon id="Stroke-84" transform="translate(76.389967, 254.153860) rotate(22.000000) translate(-76.389967, -254.153860) " points="76.3899669 255.769779 74.7737204 254.15386 76.3899669 252.537942 78.0062134 254.15386"></polygon>
+                <polygon id="Fill-86" fill-opacity="0.6" fill="#A3B1BF" transform="translate(77.841620, 257.572661) rotate(22.000000) translate(-77.841620, -257.572661) " points="77.84162 259.18858 76.2253735 257.572661 77.84162 255.956743 79.4578665 257.572661"></polygon>
+                <polygon id="Stroke-88" transform="translate(77.841620, 257.572661) rotate(22.000000) translate(-77.841620, -257.572661) " points="77.84162 259.18858 76.2253735 257.572661 77.84162 255.956743 79.4578665 257.572661"></polygon>
+                <polygon id="Fill-90" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.293190, 260.991498) rotate(22.000000) translate(-79.293190, -260.991498) " points="79.2931904 262.607416 77.6769438 260.991498 79.2931904 259.375579 80.9094369 260.991498"></polygon>
+                <polygon id="Stroke-92" transform="translate(79.293190, 260.991498) rotate(22.000000) translate(-79.293190, -260.991498) " points="79.2931904 262.607416 77.6769438 260.991498 79.2931904 259.375579 80.9094369 260.991498"></polygon>
+                <polygon id="Fill-94" fill-opacity="0.6" fill="#A3B1BF" transform="translate(71.782287, 252.074384) rotate(22.000000) translate(-71.782287, -252.074384) " points="71.7822874 253.690302 70.1660409 252.074384 71.7822874 250.458465 73.3985339 252.074384"></polygon>
+                <polygon id="Stroke-96" transform="translate(71.782287, 252.074384) rotate(22.000000) translate(-71.782287, -252.074384) " points="71.7822874 253.690302 70.1660409 252.074384 71.7822874 250.458465 73.3985339 252.074384"></polygon>
+                <polygon id="Fill-98" fill-opacity="0.6" fill="#A3B1BF" transform="translate(73.233882, 255.493161) rotate(22.000000) translate(-73.233882, -255.493161) " points="73.2338816 257.10908 71.6176351 255.493161 73.2338816 253.877242 74.8501281 255.493161"></polygon>
+                <polygon id="Stroke-100" transform="translate(73.233882, 255.493161) rotate(22.000000) translate(-73.233882, -255.493161) " points="73.2338816 257.10908 71.6176351 255.493161 73.2338816 253.877242 74.8501281 255.493161"></polygon>
+                <polygon id="Fill-102" fill-opacity="0.6" fill="#A3B1BF" transform="translate(74.685535, 258.911962) rotate(22.000000) translate(-74.685535, -258.911962) " points="74.6855347 260.527881 73.0692881 258.911962 74.6855347 257.296044 76.3017812 258.911962"></polygon>
+                <polygon id="Stroke-104" transform="translate(74.685535, 258.911962) rotate(22.000000) translate(-74.685535, -258.911962) " points="74.6855347 260.527881 73.0692881 258.911962 74.6855347 257.296044 76.3017812 258.911962"></polygon>
+                <polygon id="Fill-106" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.137105, 262.330799) rotate(22.000000) translate(-76.137105, -262.330799) " points="76.137105 263.946717 74.5208585 262.330799 76.137105 260.71488 77.7533516 262.330799"></polygon>
+                <polygon id="Stroke-108" transform="translate(76.137105, 262.330799) rotate(22.000000) translate(-76.137105, -262.330799) " points="76.137105 263.946717 74.5208585 262.330799 76.137105 260.71488 77.7533516 262.330799"></polygon>
+                <polygon id="Fill-110" fill-opacity="0.6" fill="#A3B1BF" transform="translate(68.626202, 253.413685) rotate(22.000000) translate(-68.626202, -253.413685) " points="68.6262021 255.029603 67.0099556 253.413685 68.6262021 251.797766 70.2424486 253.413685"></polygon>
+                <polygon id="Stroke-112" transform="translate(68.626202, 253.413685) rotate(22.000000) translate(-68.626202, -253.413685) " points="68.6262021 255.029603 67.0099556 253.413685 68.6262021 251.797766 70.2424486 253.413685"></polygon>
+                <polygon id="Fill-114" fill-opacity="0.6" fill="#A3B1BF" transform="translate(70.077796, 256.832462) rotate(22.000000) translate(-70.077796, -256.832462) " points="70.0777963 258.448381 68.4615497 256.832462 70.0777963 255.216543 71.6940428 256.832462"></polygon>
+                <polygon id="Stroke-116" transform="translate(70.077796, 256.832462) rotate(22.000000) translate(-70.077796, -256.832462) " points="70.0777963 258.448381 68.4615497 256.832462 70.0777963 255.216543 71.6940428 256.832462"></polygon>
+                <polygon id="Fill-118" fill-opacity="0.6" fill="#A3B1BF" transform="translate(71.529426, 260.251322) rotate(22.000000) translate(-71.529426, -260.251322) " points="71.5294256 261.867241 69.913179 260.251322 71.5294256 258.635403 73.1456721 260.251322"></polygon>
+                <polygon id="Stroke-120" transform="translate(71.529426, 260.251322) rotate(22.000000) translate(-71.529426, -260.251322) " points="71.5294256 261.867241 69.913179 260.251322 71.5294256 258.635403 73.1456721 260.251322"></polygon>
+                <polygon id="Fill-122" fill-opacity="0.6" fill="#A3B1BF" transform="translate(72.981020, 263.670099) rotate(22.000000) translate(-72.981020, -263.670099) " points="72.9810197 265.286018 71.3647732 263.670099 72.9810197 262.054181 74.5972663 263.670099"></polygon>
+                <polygon id="Stroke-124" transform="translate(72.981020, 263.670099) rotate(22.000000) translate(-72.981020, -263.670099) " points="72.9810197 265.286018 71.3647732 263.670099 72.9810197 262.054181 74.5972663 263.670099"></polygon>
+                <polygon id="Fill-126" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.852907, 265.961362) rotate(22.000000) translate(-88.852907, -265.961362) " points="88.8529067 267.577281 87.2366602 265.961362 88.8529067 264.345443 90.4691533 265.961362"></polygon>
+                <polygon id="Stroke-128" transform="translate(88.852907, 265.961362) rotate(22.000000) translate(-88.852907, -265.961362) " points="88.8529067 267.577281 87.2366602 265.961362 88.8529067 264.345443 90.4691533 265.961362"></polygon>
+                <polygon id="Fill-130" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.304501, 269.380139) rotate(22.000000) translate(-90.304501, -269.380139) " points="90.3045009 270.996058 88.6882544 269.380139 90.3045009 267.764221 91.9207474 269.380139"></polygon>
+                <polygon id="Stroke-132" transform="translate(90.304501, 269.380139) rotate(22.000000) translate(-90.304501, -269.380139) " points="90.3045009 270.996058 88.6882544 269.380139 90.3045009 267.764221 91.9207474 269.380139"></polygon>
+                <polygon id="Fill-134" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.756130, 272.798999) rotate(22.000000) translate(-91.756130, -272.798999) " points="91.7561302 274.414918 90.1398837 272.798999 91.7561302 271.183081 93.3723767 272.798999"></polygon>
+                <polygon id="Stroke-136" transform="translate(91.756130, 272.798999) rotate(22.000000) translate(-91.756130, -272.798999) " points="91.7561302 274.414918 90.1398837 272.798999 91.7561302 271.183081 93.3723767 272.798999"></polygon>
+                <polygon id="Fill-138" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.207724, 276.217777) rotate(22.000000) translate(-93.207724, -276.217777) " points="93.2077244 277.833695 91.5914778 276.217777 93.2077244 274.601858 94.8239709 276.217777"></polygon>
+                <polygon id="Stroke-140" transform="translate(93.207724, 276.217777) rotate(22.000000) translate(-93.207724, -276.217777) " points="93.2077244 277.833695 91.5914778 276.217777 93.2077244 274.601858 94.8239709 276.217777"></polygon>
+                <polygon id="Fill-142" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.696821, 267.300663) rotate(22.000000) translate(-85.696821, -267.300663) " points="85.6968214 268.916582 84.0805749 267.300663 85.6968214 265.684744 87.313068 267.300663"></polygon>
+                <polygon id="Stroke-144" transform="translate(85.696821, 267.300663) rotate(22.000000) translate(-85.696821, -267.300663) " points="85.6968214 268.916582 84.0805749 267.300663 85.6968214 265.684744 87.313068 267.300663"></polygon>
+                <polygon id="Fill-146" fill-opacity="0.6" fill="#A3B1BF" transform="translate(87.148416, 270.719440) rotate(22.000000) translate(-87.148416, -270.719440) " points="87.1484156 272.335359 85.5321691 270.71944 87.1484156 269.103521 88.7646621 270.71944"></polygon>
+                <polygon id="Stroke-148" transform="translate(87.148416, 270.719440) rotate(22.000000) translate(-87.148416, -270.719440) " points="87.1484156 272.335359 85.5321691 270.71944 87.1484156 269.103521 88.7646621 270.71944"></polygon>
+                <polygon id="Fill-150" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.599986, 274.138276) rotate(22.000000) translate(-88.599986, -274.138276) " points="88.599986 275.754195 86.9837394 274.138276 88.599986 272.522358 90.2162325 274.138276"></polygon>
+                <polygon id="Stroke-152" transform="translate(88.599986, 274.138276) rotate(22.000000) translate(-88.599986, -274.138276) " points="88.599986 275.754195 86.9837394 274.138276 88.599986 272.522358 90.2162325 274.138276"></polygon>
+                <polygon id="Fill-154" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.051639, 277.557078) rotate(22.000000) translate(-90.051639, -277.557078) " points="90.0516391 279.172996 88.4353925 277.557078 90.0516391 275.941159 91.6678856 277.557078"></polygon>
+                <polygon id="Stroke-156" transform="translate(90.051639, 277.557078) rotate(22.000000) translate(-90.051639, -277.557078) " points="90.0516391 279.172996 88.4353925 277.557078 90.0516391 275.941159 91.6678856 277.557078"></polygon>
+                <polygon id="Fill-158" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.540736, 268.639964) rotate(22.000000) translate(-82.540736, -268.639964) " points="82.5407361 270.255882 80.9244896 268.639964 82.5407361 267.024045 84.1569826 268.639964"></polygon>
+                <polygon id="Stroke-160" transform="translate(82.540736, 268.639964) rotate(22.000000) translate(-82.540736, -268.639964) " points="82.5407361 270.255882 80.9244896 268.639964 82.5407361 267.024045 84.1569826 268.639964"></polygon>
+                <polygon id="Fill-162" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.992306, 272.058800) rotate(22.000000) translate(-83.992306, -272.058800) " points="83.9923065 273.674719 82.3760599 272.0588 83.9923065 270.442881 85.608553 272.0588"></polygon>
+                <polygon id="Stroke-164" transform="translate(83.992306, 272.058800) rotate(22.000000) translate(-83.992306, -272.058800) " points="83.9923065 273.674719 82.3760599 272.0588 83.9923065 270.442881 85.608553 272.0588"></polygon>
+                <polygon id="Fill-166" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.443901, 275.477577) rotate(22.000000) translate(-85.443901, -275.477577) " points="85.4439007 277.093496 83.8276541 275.477577 85.4439007 273.861659 87.0601472 275.477577"></polygon>
+                <polygon id="Stroke-168" transform="translate(85.443901, 275.477577) rotate(22.000000) translate(-85.443901, -275.477577) " points="85.4439007 277.093496 83.8276541 275.477577 85.4439007 273.861659 87.0601472 275.477577"></polygon>
+                <polygon id="Fill-170" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.895554, 278.896378) rotate(22.000000) translate(-86.895554, -278.896378) " points="86.8955537 280.512297 85.2793072 278.896378 86.8955537 277.28046 88.5118003 278.896378"></polygon>
+                <polygon id="Stroke-172" transform="translate(86.895554, 278.896378) rotate(22.000000) translate(-86.895554, -278.896378) " points="86.8955537 280.512297 85.2793072 278.896378 86.8955537 277.28046 88.5118003 278.896378"></polygon>
+                <polygon id="Fill-174" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.384651, 269.979265) rotate(22.000000) translate(-79.384651, -269.979265) " points="79.3846508 271.595183 77.7684043 269.979265 79.3846508 268.363346 81.0008973 269.979265"></polygon>
+                <polygon id="Stroke-176" transform="translate(79.384651, 269.979265) rotate(22.000000) translate(-79.384651, -269.979265) " points="79.3846508 271.595183 77.7684043 269.979265 79.3846508 268.363346 81.0008973 269.979265"></polygon>
+                <polygon id="Fill-178" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.836221, 273.398101) rotate(22.000000) translate(-80.836221, -273.398101) " points="80.8362212 275.01402 79.2199746 273.398101 80.8362212 271.782182 82.4524677 273.398101"></polygon>
+                <polygon id="Stroke-180" transform="translate(80.836221, 273.398101) rotate(22.000000) translate(-80.836221, -273.398101) " points="80.8362212 275.01402 79.2199746 273.398101 80.8362212 271.782182 82.4524677 273.398101"></polygon>
+                <polygon id="Fill-182" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.287815, 276.816878) rotate(22.000000) translate(-82.287815, -276.816878) " points="82.2878153 278.432797 80.6715688 276.816878 82.2878153 275.20096 83.9040619 276.816878"></polygon>
+                <polygon id="Stroke-184" transform="translate(82.287815, 276.816878) rotate(22.000000) translate(-82.287815, -276.816878) " points="82.2878153 278.432797 80.6715688 276.816878 82.2878153 275.20096 83.9040619 276.816878"></polygon>
+                <polygon id="Fill-186" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.739445, 280.235738) rotate(22.000000) translate(-83.739445, -280.235738) " points="83.7394446 281.851657 82.1231981 280.235738 83.7394446 278.61982 85.3556912 280.235738"></polygon>
+                <polygon id="Stroke-188" transform="translate(83.739445, 280.235738) rotate(22.000000) translate(-83.739445, -280.235738) " points="83.7394446 281.851657 82.1231981 280.235738 83.7394446 278.61982 85.3556912 280.235738"></polygon>
+                <polygon id="Fill-190" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.228483, 271.318601) rotate(22.000000) translate(-76.228483, -271.318601) " points="76.2284828 272.934519 74.6122362 271.318601 76.2284828 269.702682 77.8447293 271.318601"></polygon>
+                <polygon id="Stroke-192" transform="translate(76.228483, 271.318601) rotate(22.000000) translate(-76.228483, -271.318601) " points="76.2284828 272.934519 74.6122362 271.318601 76.2284828 269.702682 77.8447293 271.318601"></polygon>
+                <polygon id="Fill-194" fill-opacity="0.6" fill="#A3B1BF" transform="translate(77.680136, 274.737402) rotate(22.000000) translate(-77.680136, -274.737402) " points="77.6801358 276.353321 76.0638893 274.737402 77.6801358 273.121483 79.2963824 274.737402"></polygon>
+                <polygon id="Stroke-196" transform="translate(77.680136, 274.737402) rotate(22.000000) translate(-77.680136, -274.737402) " points="77.6801358 276.353321 76.0638893 274.737402 77.6801358 273.121483 79.2963824 274.737402"></polygon>
+                <polygon id="Fill-198" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.131730, 278.156179) rotate(22.000000) translate(-79.131730, -278.156179) " points="79.13173 279.772098 77.5154835 278.156179 79.13173 276.540261 80.7479765 278.156179"></polygon>
+                <polygon id="Stroke-200" transform="translate(79.131730, 278.156179) rotate(22.000000) translate(-79.131730, -278.156179) " points="79.13173 279.772098 77.5154835 278.156179 79.13173 276.540261 80.7479765 278.156179"></polygon>
+                <polygon id="Fill-202" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.583359, 281.575039) rotate(22.000000) translate(-80.583359, -281.575039) " points="80.5833593 283.190958 78.9671128 281.575039 80.5833593 279.959121 82.1996058 281.575039"></polygon>
+                <polygon id="Stroke-204" transform="translate(80.583359, 281.575039) rotate(22.000000) translate(-80.583359, -281.575039) " points="80.5833593 283.190958 78.9671128 281.575039 80.5833593 279.959121 82.1996058 281.575039"></polygon>
+                <polygon id="Fill-206" fill-opacity="0.6" fill="#A3B1BF" transform="translate(96.455246, 283.866302) rotate(22.000000) translate(-96.455246, -283.866302) " points="96.4552463 285.48222 94.8389998 283.866302 96.4552463 282.250383 98.0714929 283.866302"></polygon>
+                <polygon id="Stroke-208" transform="translate(96.455246, 283.866302) rotate(22.000000) translate(-96.455246, -283.866302) " points="96.4552463 285.48222 94.8389998 283.866302 96.4552463 282.250383 98.0714929 283.866302"></polygon>
+                <polygon id="Fill-210" fill-opacity="0.6" fill="#A3B1BF" transform="translate(97.906840, 287.285079) rotate(22.000000) translate(-97.906840, -287.285079) " points="97.9068405 288.900998 96.290594 287.285079 97.9068405 285.66916 99.523087 287.285079"></polygon>
+                <polygon id="Stroke-212" transform="translate(97.906840, 287.285079) rotate(22.000000) translate(-97.906840, -287.285079) " points="97.9068405 288.900998 96.290594 287.285079 97.9068405 285.66916 99.523087 287.285079"></polygon>
+                <polygon id="Fill-214" fill-opacity="0.6" fill="#A3B1BF" transform="translate(99.358435, 290.703856) rotate(22.000000) translate(-99.358435, -290.703856) " points="99.3584347 292.319775 97.7421881 290.703856 99.3584347 289.087938 100.974681 290.703856"></polygon>
+                <polygon id="Stroke-216" transform="translate(99.358435, 290.703856) rotate(22.000000) translate(-99.358435, -290.703856) " points="99.3584347 292.319775 97.7421881 290.703856 99.3584347 289.087938 100.974681 290.703856"></polygon>
+                <polygon id="Fill-218" fill-opacity="0.6" fill="#A3B1BF" transform="translate(100.810064, 294.122716) rotate(22.000000) translate(-100.810064, -294.122716) " points="100.810064 295.738635 99.1938174 294.122716 100.810064 292.506798 102.42631 294.122716"></polygon>
+                <polygon id="Stroke-220" transform="translate(100.810064, 294.122716) rotate(22.000000) translate(-100.810064, -294.122716) " points="100.810064 295.738635 99.1938174 294.122716 100.810064 292.506798 102.42631 294.122716"></polygon>
+                <polygon id="Fill-222" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.299102, 285.205579) rotate(22.000000) translate(-93.299102, -285.205579) " points="93.2991021 286.821497 91.6828556 285.205579 93.2991021 283.58966 94.9153486 285.205579"></polygon>
+                <polygon id="Stroke-224" transform="translate(93.299102, 285.205579) rotate(22.000000) translate(-93.299102, -285.205579) " points="93.2991021 286.821497 91.6828556 285.205579 93.2991021 283.58966 94.9153486 285.205579"></polygon>
+                <polygon id="Fill-226" fill-opacity="0.6" fill="#A3B1BF" transform="translate(94.750755, 288.624380) rotate(22.000000) translate(-94.750755, -288.624380) " points="94.7507552 290.240299 93.1345086 288.62438 94.7507552 287.008461 96.3670017 288.62438"></polygon>
+                <polygon id="Stroke-228" transform="translate(94.750755, 288.624380) rotate(22.000000) translate(-94.750755, -288.624380) " points="94.7507552 290.240299 93.1345086 288.62438 94.7507552 287.008461 96.3670017 288.62438"></polygon>
+                <polygon id="Fill-230" fill-opacity="0.6" fill="#A3B1BF" transform="translate(96.202326, 292.043216) rotate(22.000000) translate(-96.202326, -292.043216) " points="96.2023255 293.659135 94.586079 292.043216 96.2023255 290.427297 97.8185721 292.043216"></polygon>
+                <polygon id="Stroke-232" transform="translate(96.202326, 292.043216) rotate(22.000000) translate(-96.202326, -292.043216) " points="96.2023255 293.659135 94.586079 292.043216 96.2023255 290.427297 97.8185721 292.043216"></polygon>
+                <polygon id="Fill-234" fill-opacity="0.6" fill="#A3B1BF" transform="translate(97.653979, 295.462017) rotate(22.000000) translate(-97.653979, -295.462017) " points="97.6539786 297.077936 96.0377321 295.462017 97.6539786 293.846099 99.2702252 295.462017"></polygon>
+                <polygon id="Stroke-236" transform="translate(97.653979, 295.462017) rotate(22.000000) translate(-97.653979, -295.462017) " points="97.6539786 297.077936 96.0377321 295.462017 97.6539786 293.846099 99.2702252 295.462017"></polygon>
+                <polygon id="Fill-238" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.143017, 286.544880) rotate(22.000000) translate(-90.143017, -286.544880) " points="90.1430168 288.160798 88.5267702 286.54488 90.1430168 284.928961 91.7592633 286.54488"></polygon>
+                <polygon id="Stroke-240" transform="translate(90.143017, 286.544880) rotate(22.000000) translate(-90.143017, -286.544880) " points="90.1430168 288.160798 88.5267702 286.54488 90.1430168 284.928961 91.7592633 286.54488"></polygon>
+                <polygon id="Fill-242" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.594670, 289.963681) rotate(22.000000) translate(-91.594670, -289.963681) " points="91.5946698 291.5796 89.9784233 289.963681 91.5946698 288.347762 93.2109164 289.963681"></polygon>
+                <polygon id="Stroke-244" transform="translate(91.594670, 289.963681) rotate(22.000000) translate(-91.594670, -289.963681) " points="91.5946698 291.5796 89.9784233 289.963681 91.5946698 288.347762 93.2109164 289.963681"></polygon>
+                <polygon id="Fill-246" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.046240, 293.382517) rotate(22.000000) translate(-93.046240, -293.382517) " points="93.0462402 294.998436 91.4299937 293.382517 93.0462402 291.766598 94.6624868 293.382517"></polygon>
+                <polygon id="Stroke-248" transform="translate(93.046240, 293.382517) rotate(22.000000) translate(-93.046240, -293.382517) " points="93.0462402 294.998436 91.4299937 293.382517 93.0462402 291.766598 94.6624868 293.382517"></polygon>
+                <polygon id="Fill-250" fill-opacity="0.6" fill="#A3B1BF" transform="translate(94.497893, 296.801318) rotate(22.000000) translate(-94.497893, -296.801318) " points="94.4978933 298.417237 92.8816468 296.801318 94.4978933 295.1854 96.1141398 296.801318"></polygon>
+                <polygon id="Stroke-252" transform="translate(94.497893, 296.801318) rotate(22.000000) translate(-94.497893, -296.801318) " points="94.4978933 298.417237 92.8816468 296.801318 94.4978933 295.1854 96.1141398 296.801318"></polygon>
+                <polygon id="Fill-254" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.986931, 287.884181) rotate(22.000000) translate(-86.986931, -287.884181) " points="86.9869315 289.500099 85.3706849 287.884181 86.9869315 286.268262 88.603178 287.884181"></polygon>
+                <polygon id="Stroke-256" transform="translate(86.986931, 287.884181) rotate(22.000000) translate(-86.986931, -287.884181) " points="86.9869315 289.500099 85.3706849 287.884181 86.9869315 286.268262 88.603178 287.884181"></polygon>
+                <polygon id="Fill-258" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.438585, 291.302982) rotate(22.000000) translate(-88.438585, -291.302982) " points="88.4385845 292.9189 86.822338 291.302982 88.4385845 289.687063 90.0548311 291.302982"></polygon>
+                <polygon id="Stroke-260" transform="translate(88.438585, 291.302982) rotate(22.000000) translate(-88.438585, -291.302982) " points="88.4385845 292.9189 86.822338 291.302982 88.4385845 289.687063 90.0548311 291.302982"></polygon>
+                <polygon id="Fill-262" fill-opacity="0.6" fill="#A3B1BF" transform="translate(89.890155, 294.721818) rotate(22.000000) translate(-89.890155, -294.721818) " points="89.8901549 296.337737 88.2739084 294.721818 89.8901549 293.105899 91.5064014 294.721818"></polygon>
+                <polygon id="Stroke-264" transform="translate(89.890155, 294.721818) rotate(22.000000) translate(-89.890155, -294.721818) " points="89.8901549 296.337737 88.2739084 294.721818 89.8901549 293.105899 91.5064014 294.721818"></polygon>
+                <polygon id="Fill-266" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.341749, 298.140595) rotate(22.000000) translate(-91.341749, -298.140595) " points="91.3417491 299.756514 89.7255025 298.140595 91.3417491 296.524677 92.9579956 298.140595"></polygon>
+                <polygon id="Stroke-268" transform="translate(91.341749, 298.140595) rotate(22.000000) translate(-91.341749, -298.140595) " points="91.3417491 299.756514 89.7255025 298.140595 91.3417491 296.524677 92.9579956 298.140595"></polygon>
+                <polygon id="Fill-270" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.830846, 289.223482) rotate(22.000000) translate(-83.830846, -289.223482) " points="83.8308461 290.8394 82.2145996 289.223482 83.8308461 287.607563 85.4470927 289.223482"></polygon>
+                <polygon id="Stroke-272" transform="translate(83.830846, 289.223482) rotate(22.000000) translate(-83.830846, -289.223482) " points="82.2145996 289.223482 83.8308461 287.607563 85.4470927 289.223482 83.8308461 290.8394"></polygon>
+                <polygon id="Fill-274" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.282417, 292.642318) rotate(22.000000) translate(-85.282417, -292.642318) " points="85.2824165 294.258236 83.66617 292.642318 85.2824165 291.026399 86.898663 292.642318"></polygon>
+                <polygon id="Stroke-276" transform="translate(85.282417, 292.642318) rotate(22.000000) translate(-85.282417, -292.642318) " points="85.2824165 294.258236 83.66617 292.642318 85.2824165 291.026399 86.898663 292.642318"></polygon>
+                <polygon id="Fill-278" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.734070, 296.061119) rotate(22.000000) translate(-86.734070, -296.061119) " points="86.7340696 297.677038 85.1178231 296.061119 86.7340696 294.4452 88.3503161 296.061119"></polygon>
+                <polygon id="Stroke-280" transform="translate(86.734070, 296.061119) rotate(22.000000) translate(-86.734070, -296.061119) " points="86.7340696 297.677038 85.1178231 296.061119 86.7340696 294.4452 88.3503161 296.061119"></polygon>
+                <polygon id="Fill-282" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.185664, 299.479896) rotate(22.000000) translate(-88.185664, -299.479896) " points="88.1856638 301.095815 86.5694172 299.479896 88.1856638 297.863978 89.8019103 299.479896"></polygon>
+                <polygon id="Stroke-284" transform="translate(88.185664, 299.479896) rotate(22.000000) translate(-88.185664, -299.479896) " points="88.1856638 301.095815 86.5694172 299.479896 88.1856638 297.863978 89.8019103 299.479896"></polygon>
+                <polygon id="Fill-286" transform="translate(37.779995, 163.402514) rotate(22.000000) translate(-37.779995, -163.402514) " points="51.9961666 192.018058 66.401345 177.615802 23.5644587 134.78697 9.15864501 149.189862"></polygon>
+                <polygon id="Fill-290" transform="translate(50.400318, 195.682118) rotate(22.000000) translate(-50.400318, -195.682118) " points="54.1737837 198.070743 48.0112085 191.909418 46.6268527 193.293493 52.7894279 199.454818"></polygon>
+                <polygon id="Stroke-292" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(50.400318, 195.682118) rotate(22.000000) translate(-50.400318, -195.682118) " points="54.1737837 198.070743 48.0112085 191.909418 46.6268527 193.293493 52.7894279 199.454818"></polygon>
+                <polygon id="Fill-294" fill-opacity="0.8" fill="#A3B1BF" transform="translate(52.603532, 200.871447) rotate(22.000000) translate(-52.603532, -200.871447) " points="52.712807 203.746308 55.4789773 200.980699 52.4942579 197.996585 49.7280876 200.762195"></polygon>
+                <polygon id="Stroke-296" stroke="#A3B1BF" stroke-width="1.62" fill="#FFFFFF" stroke-linejoin="round" transform="translate(52.603532, 200.871447) rotate(22.000000) translate(-52.603532, -200.871447) " points="52.712807 203.746308 55.4789773 200.980699 52.4942579 197.996585 49.7280876 200.762195"></polygon>
+                <polygon id="Fill-298" fill-opacity="0.8" fill="#A3B1BF" transform="translate(53.983257, 183.836778) rotate(22.000000) translate(-53.983257, -183.836778) " points="52.3670108 183.836778 53.9832574 185.452697 55.5995039 183.836778 53.9832574 182.22086"></polygon>
+                <polygon id="Stroke-300" transform="translate(53.983257, 183.836778) rotate(22.000000) translate(-53.983257, -183.836778) " points="52.3670108 183.836778 53.9832574 185.452697 55.5995039 183.836778 53.9832574 182.22086"></polygon>
+                <polygon id="Fill-302" fill-opacity="0.8" fill="#A3B1BF" transform="translate(52.531663, 180.418001) rotate(22.000000) translate(-52.531663, -180.418001) " points="50.9154167 180.418001 52.5316632 182.03392 54.1479097 180.418001 52.5316632 178.802082"></polygon>
+                <polygon id="Stroke-304" transform="translate(52.531663, 180.418001) rotate(22.000000) translate(-52.531663, -180.418001) " points="50.9154167 180.418001 52.5316632 182.03392 54.1479097 180.418001 52.5316632 178.802082"></polygon>
+                <polygon id="Fill-306" fill-opacity="0.8" fill="#A3B1BF" transform="translate(51.080034, 176.999141) rotate(22.000000) translate(-51.080034, -176.999141) " points="49.4637874 176.999141 51.0800339 178.61506 52.6962805 176.999141 51.0800339 175.383222"></polygon>
+                <polygon id="Stroke-308" transform="translate(51.080034, 176.999141) rotate(22.000000) translate(-51.080034, -176.999141) " points="49.4637874 176.999141 51.0800339 178.61506 52.6962805 176.999141 51.0800339 175.383222"></polygon>
+                <polygon id="Fill-310" fill-opacity="0.8" fill="#A3B1BF" transform="translate(49.628440, 173.580364) rotate(22.000000) translate(-49.628440, -173.580364) " points="48.0121932 173.580364 49.6284397 175.196282 51.2446863 173.580364 49.6284397 171.964445"></polygon>
+                <polygon id="Stroke-312" transform="translate(49.628440, 173.580364) rotate(22.000000) translate(-49.628440, -173.580364) " points="48.0121932 173.580364 49.6284397 175.196282 51.2446863 173.580364 49.6284397 171.964445"></polygon>
+                <polygon id="Fill-314" fill-opacity="0.8" fill="#A3B1BF" transform="translate(50.827172, 185.176079) rotate(22.000000) translate(-50.827172, -185.176079) " points="49.2109255 185.176079 50.8271721 186.791998 52.4434186 185.176079 50.8271721 183.560161"></polygon>
+                <polygon id="Stroke-316" transform="translate(50.827172, 185.176079) rotate(22.000000) translate(-50.827172, -185.176079) " points="49.2109255 185.176079 50.8271721 186.791998 52.4434186 185.176079 50.8271721 183.560161"></polygon>
+                <polygon id="Fill-318" fill-opacity="0.8" fill="#A3B1BF" transform="translate(49.375578, 181.757302) rotate(22.000000) translate(-49.375578, -181.757302) " points="47.7593313 181.757302 49.3755779 183.373221 50.9918244 181.757302 49.3755779 180.141383"></polygon>
+                <polygon id="Stroke-320" transform="translate(49.375578, 181.757302) rotate(22.000000) translate(-49.375578, -181.757302) " points="47.7593313 181.757302 49.3755779 183.373221 50.9918244 181.757302 49.3755779 180.141383"></polygon>
+                <polygon id="Fill-322" fill-opacity="0.8" fill="#A3B1BF" transform="translate(47.923949, 178.338442) rotate(22.000000) translate(-47.923949, -178.338442) " points="46.3077021 178.338442 47.9239486 179.954361 49.5401951 178.338442 47.9239486 176.722523"></polygon>
+                <polygon id="Stroke-324" transform="translate(47.923949, 178.338442) rotate(22.000000) translate(-47.923949, -178.338442) " points="46.3077021 178.338442 47.9239486 179.954361 49.5401951 178.338442 47.9239486 176.722523"></polygon>
+                <polygon id="Fill-326" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.472354, 174.919665) rotate(22.000000) translate(-46.472354, -174.919665) " points="44.8561079 174.919665 46.4723544 176.535583 48.088601 174.919665 46.4723544 173.303746"></polygon>
+                <polygon id="Stroke-328" transform="translate(46.472354, 174.919665) rotate(22.000000) translate(-46.472354, -174.919665) " points="44.8561079 174.919665 46.4723544 176.535583 48.088601 174.919665 46.4723544 173.303746"></polygon>
+                <polygon id="Fill-330" fill-opacity="0.8" fill="#A3B1BF" transform="translate(47.671087, 186.515380) rotate(22.000000) translate(-47.671087, -186.515380) " points="46.0548402 186.51538 47.6710867 188.131299 49.2873333 186.51538 47.6710867 184.899461"></polygon>
+                <polygon id="Stroke-332" transform="translate(47.671087, 186.515380) rotate(22.000000) translate(-47.671087, -186.515380) " points="46.0548402 186.51538 47.6710867 188.131299 49.2873333 186.51538 47.6710867 184.899461"></polygon>
+                <polygon id="Fill-334" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.219493, 183.096603) rotate(22.000000) translate(-46.219493, -183.096603) " points="44.603246 183.096603 46.2194926 184.712521 47.8357391 183.096603 46.2194926 181.480684"></polygon>
+                <polygon id="Stroke-336" transform="translate(46.219493, 183.096603) rotate(22.000000) translate(-46.219493, -183.096603) " points="44.603246 183.096603 46.2194926 184.712521 47.8357391 183.096603 46.2194926 181.480684"></polygon>
+                <polygon id="Fill-338" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.767839, 179.677802) rotate(22.000000) translate(-44.767839, -179.677802) " points="43.1515929 179.677802 44.7678395 181.29372 46.384086 179.677802 44.7678395 178.061883"></polygon>
+                <polygon id="Stroke-340" transform="translate(44.767839, 179.677802) rotate(22.000000) translate(-44.767839, -179.677802) " points="43.1515929 179.677802 44.7678395 181.29372 46.384086 179.677802 44.7678395 178.061883"></polygon>
+                <polygon id="Fill-342" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.316269, 176.258965) rotate(22.000000) translate(-43.316269, -176.258965) " points="41.7000226 176.258965 43.3162691 177.874884 44.9325156 176.258965 43.3162691 174.643047"></polygon>
+                <polygon id="Stroke-344" transform="translate(43.316269, 176.258965) rotate(22.000000) translate(-43.316269, -176.258965) " points="41.7000226 176.258965 43.3162691 177.874884 44.9325156 176.258965 43.3162691 174.643047"></polygon>
+                <polygon id="Fill-346" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.514978, 187.854740) rotate(22.000000) translate(-44.514978, -187.854740) " points="42.8987311 187.85474 44.5149776 189.470659 46.1312242 187.85474 44.5149776 186.238821"></polygon>
+                <polygon id="Stroke-348" transform="translate(44.514978, 187.854740) rotate(22.000000) translate(-44.514978, -187.854740) " points="42.8987311 187.85474 44.5149776 189.470659 46.1312242 187.85474 44.5149776 186.238821"></polygon>
+                <polygon id="Fill-350" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.063348, 184.435880) rotate(22.000000) translate(-43.063348, -184.435880) " points="41.4471018 184.43588 43.0633483 186.051799 44.6795949 184.43588 43.0633483 182.819961"></polygon>
+                <polygon id="Stroke-352" transform="translate(43.063348, 184.435880) rotate(22.000000) translate(-43.063348, -184.435880) " points="41.4471018 184.43588 43.0633483 186.051799 44.6795949 184.43588 43.0633483 182.819961"></polygon>
+                <polygon id="Fill-354" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.611754, 181.017103) rotate(22.000000) translate(-41.611754, -181.017103) " points="39.9955076 181.017103 41.6117542 182.633021 43.2280007 181.017103 41.6117542 179.401184"></polygon>
+                <polygon id="Stroke-356" transform="translate(41.611754, 181.017103) rotate(22.000000) translate(-41.611754, -181.017103) " points="39.9955076 181.017103 41.6117542 182.633021 43.2280007 181.017103 41.6117542 179.401184"></polygon>
+                <polygon id="Fill-358" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.160184, 177.598266) rotate(22.000000) translate(-40.160184, -177.598266) " points="38.5439373 177.598266 40.1601838 179.214185 41.7764303 177.598266 40.1601838 175.982348"></polygon>
+                <polygon id="Stroke-360" transform="translate(40.160184, 177.598266) rotate(22.000000) translate(-40.160184, -177.598266) " points="38.5439373 177.598266 40.1601838 179.214185 41.7764303 177.598266 40.1601838 175.982348"></polygon>
+                <polygon id="Fill-362" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.358892, 189.194041) rotate(22.000000) translate(-41.358892, -189.194041) " points="39.7426458 189.194041 41.3588923 190.80996 42.9751388 189.194041 41.3588923 187.578122"></polygon>
+                <polygon id="Stroke-364" transform="translate(41.358892, 189.194041) rotate(22.000000) translate(-41.358892, -189.194041) " points="39.7426458 189.194041 41.3588923 190.80996 42.9751388 189.194041 41.3588923 187.578122"></polygon>
+                <polygon id="Fill-366" fill-opacity="0.8" fill="#A3B1BF" transform="translate(39.907263, 185.775181) rotate(22.000000) translate(-39.907263, -185.775181) " points="38.2910165 185.775181 39.907263 187.3911 41.5235095 185.775181 39.907263 184.159262"></polygon>
+                <polygon id="Stroke-368" transform="translate(39.907263, 185.775181) rotate(22.000000) translate(-39.907263, -185.775181) " points="38.2910165 185.775181 39.907263 187.3911 41.5235095 185.775181 39.907263 184.159262"></polygon>
+                <polygon id="Fill-370" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.455669, 182.356404) rotate(22.000000) translate(-38.455669, -182.356404) " points="36.8394223 182.356404 38.4556688 183.972322 40.0719154 182.356404 38.4556688 180.740485"></polygon>
+                <polygon id="Stroke-372" transform="translate(38.455669, 182.356404) rotate(22.000000) translate(-38.455669, -182.356404) " points="36.8394223 182.356404 38.4556688 183.972322 40.0719154 182.356404 38.4556688 180.740485"></polygon>
+                <polygon id="Fill-374" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.004016, 178.937602) rotate(22.000000) translate(-37.004016, -178.937602) " points="35.3877692 178.937602 37.0040158 180.553521 38.6202623 178.937602 37.0040158 177.321684"></polygon>
+                <polygon id="Stroke-376" transform="translate(37.004016, 178.937602) rotate(22.000000) translate(-37.004016, -178.937602) " points="35.3877692 178.937602 37.0040158 180.553521 38.6202623 178.937602 37.0040158 177.321684"></polygon>
+                <polygon id="Fill-378" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.380894, 165.931897) rotate(22.000000) translate(-46.380894, -165.931897) " points="44.7646475 165.931897 46.380894 167.547816 47.9971405 165.931897 46.380894 164.315979"></polygon>
+                <polygon id="Stroke-380" transform="translate(46.380894, 165.931897) rotate(22.000000) translate(-46.380894, -165.931897) " points="44.7646475 165.931897 46.380894 167.547816 47.9971405 165.931897 46.380894 164.315979"></polygon>
+                <polygon id="Fill-382" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.929324, 162.513061) rotate(22.000000) translate(-44.929324, -162.513061) " points="43.3130771 162.513061 44.9293236 164.12898 46.5455702 162.513061 44.9293236 160.897143"></polygon>
+                <polygon id="Stroke-384" transform="translate(44.929324, 162.513061) rotate(22.000000) translate(-44.929324, -162.513061) " points="43.3130771 162.513061 44.9293236 164.12898 46.5455702 162.513061 44.9293236 160.897143"></polygon>
+                <polygon id="Fill-386" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.477729, 159.094284) rotate(22.000000) translate(-43.477729, -159.094284) " points="41.8614829 159.094284 43.4777295 160.710203 45.093976 159.094284 43.4777295 157.478365"></polygon>
+                <polygon id="Stroke-388" transform="translate(43.477729, 159.094284) rotate(22.000000) translate(-43.477729, -159.094284) " points="41.8614829 159.094284 43.4777295 160.710203 45.093976 159.094284 43.4777295 157.478365"></polygon>
+                <polygon id="Fill-390" fill-opacity="0.8" fill="#A3B1BF" transform="translate(42.026100, 155.675424) rotate(22.000000) translate(-42.026100, -155.675424) " points="40.4098536 155.675424 42.0261002 157.291342 43.6423467 155.675424 42.0261002 154.059505"></polygon>
+                <polygon id="Stroke-392" transform="translate(42.026100, 155.675424) rotate(22.000000) translate(-42.026100, -155.675424) " points="40.4098536 155.675424 42.0261002 157.291342 43.6423467 155.675424 42.0261002 154.059505"></polygon>
+                <polygon id="Fill-394" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.224809, 167.271198) rotate(22.000000) translate(-43.224809, -167.271198) " points="41.6085622 167.271198 43.2248087 168.887117 44.8410552 167.271198 43.2248087 165.65528"></polygon>
+                <polygon id="Stroke-396" transform="translate(43.224809, 167.271198) rotate(22.000000) translate(-43.224809, -167.271198) " points="41.6085622 167.271198 43.2248087 168.887117 44.8410552 167.271198 43.2248087 165.65528"></polygon>
+                <polygon id="Fill-398" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.773238, 163.852362) rotate(22.000000) translate(-41.773238, -163.852362) " points="40.1569918 163.852362 41.7732383 165.468281 43.3894848 163.852362 41.7732383 162.236443"></polygon>
+                <polygon id="Stroke-400" transform="translate(41.773238, 163.852362) rotate(22.000000) translate(-41.773238, -163.852362) " points="40.1569918 163.852362 41.7732383 165.468281 43.3894848 163.852362 41.7732383 162.236443"></polygon>
+                <polygon id="Fill-402" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.321585, 160.433561) rotate(22.000000) translate(-40.321585, -160.433561) " points="38.7053387 160.433561 40.3215852 162.04948 41.9378318 160.433561 40.3215852 158.817642"></polygon>
+                <polygon id="Stroke-404" transform="translate(40.321585, 160.433561) rotate(22.000000) translate(-40.321585, -160.433561) " points="38.7053387 160.433561 40.3215852 162.04948 41.9378318 160.433561 40.3215852 158.817642"></polygon>
+                <polygon id="Fill-406" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.869991, 157.014784) rotate(22.000000) translate(-38.869991, -157.014784) " points="37.2537445 157.014784 38.8699911 158.630702 40.4862376 157.014784 38.8699911 155.398865"></polygon>
+                <polygon id="Stroke-408" transform="translate(38.869991, 157.014784) rotate(22.000000) translate(-38.869991, -157.014784) " points="37.2537445 157.014784 38.8699911 158.630702 40.4862376 157.014784 38.8699911 155.398865"></polygon>
+                <polygon id="Fill-410" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.068723, 168.610499) rotate(22.000000) translate(-40.068723, -168.610499) " points="38.4524768 168.610499 40.0687234 170.226418 41.6849699 168.610499 40.0687234 166.994581"></polygon>
+                <polygon id="Stroke-412" transform="translate(40.068723, 168.610499) rotate(22.000000) translate(-40.068723, -168.610499) " points="38.4524768 168.610499 40.0687234 170.226418 41.6849699 168.610499 40.0687234 166.994581"></polygon>
+                <polygon id="Fill-414" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.617129, 165.191722) rotate(22.000000) translate(-38.617129, -165.191722) " points="37.0008827 165.191722 38.6171292 166.807641 40.2333757 165.191722 38.6171292 163.575803"></polygon>
+                <polygon id="Stroke-416" transform="translate(38.617129, 165.191722) rotate(22.000000) translate(-38.617129, -165.191722) " points="37.0008827 165.191722 38.6171292 166.807641 40.2333757 165.191722 38.6171292 163.575803"></polygon>
+                <polygon id="Fill-418" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.165500, 161.772862) rotate(22.000000) translate(-37.165500, -161.772862) " points="35.5492534 161.772862 37.1654999 163.388781 38.7817464 161.772862 37.1654999 160.156943"></polygon>
+                <polygon id="Stroke-420" transform="translate(37.165500, 161.772862) rotate(22.000000) translate(-37.165500, -161.772862) " points="35.5492534 161.772862 37.1654999 163.388781 38.7817464 161.772862 37.1654999 160.156943"></polygon>
+                <polygon id="Fill-422" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.713906, 158.354085) rotate(22.000000) translate(-35.713906, -158.354085) " points="34.0976592 158.354085 35.7139057 159.970003 37.3301523 158.354085 35.7139057 156.738166"></polygon>
+                <polygon id="Stroke-424" transform="translate(35.713906, 158.354085) rotate(22.000000) translate(-35.713906, -158.354085) " points="34.0976592 158.354085 35.7139057 159.970003 37.3301523 158.354085 35.7139057 156.738166"></polygon>
+                <polygon id="Fill-426" fill-opacity="0.8" fill="#A3B1BF" transform="translate(36.912638, 169.949800) rotate(22.000000) translate(-36.912638, -169.949800) " points="35.2963915 169.9498 36.912638 171.565719 38.5288846 169.9498 36.912638 168.333882"></polygon>
+                <polygon id="Stroke-428" transform="translate(36.912638, 169.949800) rotate(22.000000) translate(-36.912638, -169.949800) " points="35.2963915 169.9498 36.912638 171.565719 38.5288846 169.9498 36.912638 168.333882"></polygon>
+                <polygon id="Fill-430" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.461068, 166.530964) rotate(22.000000) translate(-35.461068, -166.530964) " points="33.8448211 166.530964 35.4610677 168.146883 37.0773142 166.530964 35.4610677 164.915045"></polygon>
+                <polygon id="Stroke-432" transform="translate(35.461068, 166.530964) rotate(22.000000) translate(-35.461068, -166.530964) " points="33.8448211 166.530964 35.4610677 168.146883 37.0773142 166.530964 35.4610677 164.915045"></polygon>
+                <polygon id="Fill-434" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.009415, 163.112163) rotate(22.000000) translate(-34.009415, -163.112163) " points="32.3931681 163.112163 34.0094146 164.728081 35.6256611 163.112163 34.0094146 161.496244"></polygon>
+                <polygon id="Stroke-436" transform="translate(34.009415, 163.112163) rotate(22.000000) translate(-34.009415, -163.112163) " points="32.3931681 163.112163 34.0094146 164.728081 35.6256611 163.112163 34.0094146 161.496244"></polygon>
+                <polygon id="Fill-438" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.557820, 159.693385) rotate(22.000000) translate(-32.557820, -159.693385) " points="30.9415739 159.693385 32.5578204 161.309304 34.174067 159.693385 32.5578204 158.077467"></polygon>
+                <polygon id="Stroke-440" transform="translate(32.557820, 159.693385) rotate(22.000000) translate(-32.557820, -159.693385) " points="30.9415739 159.693385 32.5578204 161.309304 34.174067 159.693385 32.5578204 158.077467"></polygon>
+                <polygon id="Fill-442" fill-opacity="0.8" fill="#A3B1BF" transform="translate(33.756553, 171.289101) rotate(22.000000) translate(-33.756553, -171.289101) " points="32.1403062 171.289101 33.7565527 172.90502 35.3727993 171.289101 33.7565527 169.673182"></polygon>
+                <polygon id="Stroke-444" transform="translate(33.756553, 171.289101) rotate(22.000000) translate(-33.756553, -171.289101) " points="32.1403062 171.289101 33.7565527 172.90502 35.3727993 171.289101 33.7565527 169.673182"></polygon>
+                <polygon id="Fill-446" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.304959, 167.870324) rotate(22.000000) translate(-32.304959, -167.870324) " points="30.688712 167.870324 32.3049586 169.486242 33.9212051 167.870324 32.3049586 166.254405"></polygon>
+                <polygon id="Stroke-448" transform="translate(32.304959, 167.870324) rotate(22.000000) translate(-32.304959, -167.870324) " points="30.688712 167.870324 32.3049586 169.486242 33.9212051 167.870324 32.3049586 166.254405"></polygon>
+                <polygon id="Fill-450" fill-opacity="0.8" fill="#A3B1BF" transform="translate(30.853329, 164.451464) rotate(22.000000) translate(-30.853329, -164.451464) " points="29.2370827 164.451464 30.8533293 166.067382 32.4695758 164.451464 30.8533293 162.835545"></polygon>
+                <polygon id="Stroke-452" transform="translate(30.853329, 164.451464) rotate(22.000000) translate(-30.853329, -164.451464) " points="29.2370827 164.451464 30.8533293 166.067382 32.4695758 164.451464 30.8533293 162.835545"></polygon>
+                <polygon id="Fill-454" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.401735, 161.032686) rotate(22.000000) translate(-29.401735, -161.032686) " points="27.7854886 161.032686 29.4017351 162.648605 31.0179816 161.032686 29.4017351 159.416768"></polygon>
+                <polygon id="Stroke-456" transform="translate(29.401735, 161.032686) rotate(22.000000) translate(-29.401735, -161.032686) " points="27.7854886 161.032686 29.4017351 162.648605 31.0179816 161.032686 29.4017351 159.416768"></polygon>
+                <polygon id="Fill-458" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.778613, 148.026981) rotate(22.000000) translate(-38.778613, -148.026981) " points="37.1623668 148.026981 38.7786133 149.6429 40.3948599 148.026981 38.7786133 146.411063"></polygon>
+                <polygon id="Stroke-460" transform="translate(38.778613, 148.026981) rotate(22.000000) translate(-38.778613, -148.026981) " points="37.1623668 148.026981 38.7786133 149.6429 40.3948599 148.026981 38.7786133 146.411063"></polygon>
+                <polygon id="Fill-462" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.326984, 144.608121) rotate(22.000000) translate(-37.326984, -144.608121) " points="35.7107375 144.608121 37.3269841 146.22404 38.9432306 144.608121 37.3269841 142.992203"></polygon>
+                <polygon id="Stroke-464" transform="translate(37.326984, 144.608121) rotate(22.000000) translate(-37.326984, -144.608121) " points="35.7107375 144.608121 37.3269841 146.22404 38.9432306 144.608121 37.3269841 142.992203"></polygon>
+                <polygon id="Fill-466" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.875390, 141.189344) rotate(22.000000) translate(-35.875390, -141.189344) " points="34.2591433 141.189344 35.8753899 142.805263 37.4916364 141.189344 35.8753899 139.573425"></polygon>
+                <polygon id="Stroke-468" transform="translate(35.875390, 141.189344) rotate(22.000000) translate(-35.875390, -141.189344) " points="34.2591433 141.189344 35.8753899 142.805263 37.4916364 141.189344 35.8753899 139.573425"></polygon>
+                <polygon id="Fill-470" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.423796, 137.770567) rotate(22.000000) translate(-34.423796, -137.770567) " points="32.8075492 137.770567 34.4237957 139.386485 36.0400422 137.770567 34.4237957 136.154648"></polygon>
+                <polygon id="Stroke-472" fill="#B2BECA" transform="translate(34.423796, 137.770567) rotate(22.000000) translate(-34.423796, -137.770567) " points="34.4237957 139.386485 36.0400422 137.770567 34.4237957 136.154648 32.8075492 137.770567"></polygon>
+                <polygon id="Fill-474" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.622528, 149.366282) rotate(22.000000) translate(-35.622528, -149.366282) " points="34.0062815 149.366282 35.622528 150.982201 37.2387746 149.366282 35.622528 147.750364"></polygon>
+                <polygon id="Stroke-476" transform="translate(35.622528, 149.366282) rotate(22.000000) translate(-35.622528, -149.366282) " points="34.0062815 149.366282 35.622528 150.982201 37.2387746 149.366282 35.622528 147.750364"></polygon>
+                <polygon id="Fill-478" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.170875, 145.947481) rotate(22.000000) translate(-34.170875, -145.947481) " points="32.5546284 145.947481 34.1708749 147.5634 35.7871215 145.947481 34.1708749 144.331563"></polygon>
+                <polygon id="Stroke-480" transform="translate(34.170875, 145.947481) rotate(22.000000) translate(-34.170875, -145.947481) " points="32.5546284 145.947481 34.1708749 147.5634 35.7871215 145.947481 34.1708749 144.331563"></polygon>
+                <polygon id="Fill-482" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.719305, 142.528645) rotate(22.000000) translate(-32.719305, -142.528645) " points="31.103058 142.528645 32.7193046 144.144564 34.3355511 142.528645 32.7193046 140.912726"></polygon>
+                <polygon id="Stroke-484" transform="translate(32.719305, 142.528645) rotate(22.000000) translate(-32.719305, -142.528645) " points="31.103058 142.528645 32.7193046 144.144564 34.3355511 142.528645 32.7193046 140.912726"></polygon>
+                <polygon id="Fill-486" fill-opacity="0.8" fill="#A3B1BF" transform="translate(31.267651, 139.109844) rotate(22.000000) translate(-31.267651, -139.109844) " points="29.651405 139.109844 31.2676515 140.725763 32.883898 139.109844 31.2676515 137.493925"></polygon>
+                <polygon id="Stroke-488" transform="translate(31.267651, 139.109844) rotate(22.000000) translate(-31.267651, -139.109844) " points="29.651405 139.109844 31.2676515 140.725763 32.883898 139.109844 31.2676515 137.493925"></polygon>
+                <polygon id="Fill-490" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.466384, 150.705559) rotate(22.000000) translate(-32.466384, -150.705559) " points="30.8501373 150.705559 32.4663838 152.321478 34.0826303 150.705559 32.4663838 149.089641"></polygon>
+                <polygon id="Stroke-492" transform="translate(32.466384, 150.705559) rotate(22.000000) translate(-32.466384, -150.705559) " points="30.8501373 150.705559 32.4663838 152.321478 34.0826303 150.705559 32.4663838 149.089641"></polygon>
+                <polygon id="Fill-494" fill-opacity="0.8" fill="#A3B1BF" transform="translate(31.014790, 147.286782) rotate(22.000000) translate(-31.014790, -147.286782) " points="29.3985431 147.286782 31.0147896 148.902701 32.6310362 147.286782 31.0147896 145.670863"></polygon>
+                <polygon id="Stroke-496" transform="translate(31.014790, 147.286782) rotate(22.000000) translate(-31.014790, -147.286782) " points="29.3985431 147.286782 31.0147896 148.902701 32.6310362 147.286782 31.0147896 145.670863"></polygon>
+                <polygon id="Fill-498" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.563219, 143.867946) rotate(22.000000) translate(-29.563219, -143.867946) " points="27.9469727 143.867946 29.5632192 145.483865 31.1794658 143.867946 29.5632192 142.252027"></polygon>
+                <polygon id="Stroke-500" transform="translate(29.563219, 143.867946) rotate(22.000000) translate(-29.563219, -143.867946) " points="27.9469727 143.867946 29.5632192 145.483865 31.1794658 143.867946 29.5632192 142.252027"></polygon>
+                <polygon id="Fill-502" fill-opacity="0.8" fill="#A3B1BF" transform="translate(28.111566, 140.449145) rotate(22.000000) translate(-28.111566, -140.449145) " points="26.4953196 140.449145 28.1115662 142.065063 29.7278127 140.449145 28.1115662 138.833226"></polygon>
+                <polygon id="Stroke-504" transform="translate(28.111566, 140.449145) rotate(22.000000) translate(-28.111566, -140.449145) " points="26.4953196 140.449145 28.1115662 142.065063 29.7278127 140.449145 28.1115662 138.833226"></polygon>
+                <polygon id="Fill-506" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.310298, 152.044860) rotate(22.000000) translate(-29.310298, -152.044860) " points="27.6940519 152.04486 29.3102985 153.660779 30.926545 152.04486 29.3102985 150.428942"></polygon>
+                <polygon id="Stroke-508" transform="translate(29.310298, 152.044860) rotate(22.000000) translate(-29.310298, -152.044860) " points="27.6940519 152.04486 29.3102985 153.660779 30.926545 152.04486 29.3102985 150.428942"></polygon>
+                <polygon id="Fill-510" fill-opacity="0.8" fill="#A3B1BF" transform="translate(27.858704, 148.626083) rotate(22.000000) translate(-27.858704, -148.626083) " points="26.2424578 148.626083 27.8587043 150.242002 29.4749508 148.626083 27.8587043 147.010164"></polygon>
+                <polygon id="Stroke-512" transform="translate(27.858704, 148.626083) rotate(22.000000) translate(-27.858704, -148.626083) " points="26.2424578 148.626083 27.8587043 150.242002 29.4749508 148.626083 27.8587043 147.010164"></polygon>
+                <polygon id="Fill-514" fill-opacity="0.8" fill="#A3B1BF" transform="translate(26.407134, 145.207247) rotate(22.000000) translate(-26.407134, -145.207247) " points="24.7908874 145.207247 26.4071339 146.823166 28.0233805 145.207247 26.4071339 143.591328"></polygon>
+                <polygon id="Stroke-516" transform="translate(26.407134, 145.207247) rotate(22.000000) translate(-26.407134, -145.207247) " points="24.7908874 145.207247 26.4071339 146.823166 28.0233805 145.207247 26.4071339 143.591328"></polygon>
+                <polygon id="Fill-518" fill-opacity="0.8" fill="#A3B1BF" transform="translate(24.955481, 141.788446) rotate(22.000000) translate(-24.955481, -141.788446) " points="23.3392343 141.788446 24.9554808 143.404364 26.5717274 141.788446 24.9554808 140.172527"></polygon>
+                <polygon id="Stroke-520" transform="translate(24.955481, 141.788446) rotate(22.000000) translate(-24.955481, -141.788446) " points="23.3392343 141.788446 24.9554808 143.404364 26.5717274 141.788446 24.9554808 140.172527"></polygon>
+                <polygon id="Fill-522" fill-opacity="0.8" fill="#A3B1BF" transform="translate(26.154213, 153.384161) rotate(22.000000) translate(-26.154213, -153.384161) " points="24.5379666 153.384161 26.1542132 155.00008 27.7704597 153.384161 26.1542132 151.768243"></polygon>
+                <polygon id="Stroke-524" transform="translate(26.154213, 153.384161) rotate(22.000000) translate(-26.154213, -153.384161) " points="24.5379666 153.384161 26.1542132 155.00008 27.7704597 153.384161 26.1542132 151.768243"></polygon>
+                <polygon id="Fill-526" fill-opacity="0.8" fill="#A3B1BF" transform="translate(24.702619, 149.965384) rotate(22.000000) translate(-24.702619, -149.965384) " points="23.0863724 149.965384 24.702619 151.581303 26.3188655 149.965384 24.702619 148.349465"></polygon>
+                <polygon id="Stroke-528" transform="translate(24.702619, 149.965384) rotate(22.000000) translate(-24.702619, -149.965384) " points="23.0863724 149.965384 24.702619 151.581303 26.3188655 149.965384 24.702619 148.349465"></polygon>
+                <polygon id="Fill-530" fill-opacity="0.8" fill="#A3B1BF" transform="translate(23.250966, 146.546583) rotate(22.000000) translate(-23.250966, -146.546583) " points="21.6347194 146.546583 23.2509659 148.162502 24.8672124 146.546583 23.2509659 144.930664"></polygon>
+                <polygon id="Stroke-532" transform="translate(23.250966, 146.546583) rotate(22.000000) translate(-23.250966, -146.546583) " points="21.6347194 146.546583 23.2509659 148.162502 24.8672124 146.546583 23.2509659 144.930664"></polygon>
+                <polygon id="Fill-534" fill-opacity="0.8" fill="#A3B1BF" transform="translate(21.799396, 143.127747) rotate(22.000000) translate(-21.799396, -143.127747) " points="20.183149 143.127747 21.7993955 144.743665 23.4156421 143.127747 21.7993955 141.511828"></polygon>
+                <polygon id="Stroke-536" transform="translate(21.799396, 143.127747) rotate(22.000000) translate(-21.799396, -143.127747) " points="20.183149 143.127747 21.7993955 144.743665 23.4156421 143.127747 21.7993955 141.511828"></polygon>
+                <path d="M129.314819,189.942425 C126.372666,187.000233 124.490222,184.112668 125.110927,183.492089 C125.731631,182.87151 128.619783,184.753573 131.562571,187.695129 C134.504724,190.637321 136.387169,193.524886 135.766464,194.145465 C135.145759,194.766044 132.257608,192.883981 129.314819,189.942425 Z" id="Fill-538" fill="#F5F5F5" transform="translate(130.438695, 188.818777) rotate(22.000000) translate(-130.438695, -188.818777) "></path>
+                <path d="M129.314819,189.942425 C126.372666,187.000233 124.490222,184.112668 125.110927,183.492089 C125.731631,182.87151 128.619783,184.753573 131.562571,187.695129 C134.504724,190.637321 136.387169,193.524886 135.766464,194.145465 C135.145759,194.766044 132.257608,192.883981 129.314819,189.942425 Z" id="Stroke-540" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(130.438695, 188.818777) rotate(22.000000) translate(-130.438695, -188.818777) "></path>
+                <path d="M136.083433,187.715086 C130.20421,181.837055 126.443133,176.067006 127.683272,174.827118 C128.92341,173.587231 134.69463,177.347545 140.573854,183.225576 C146.453713,189.104243 150.21479,194.874292 148.974651,196.114179 C147.734513,197.354066 141.963293,193.593752 136.083433,187.715086 Z" id="Fill-542" fill="#F5F5F5" transform="translate(138.328961, 185.470648) rotate(22.000000) translate(-138.328961, -185.470648) "></path>
+                <path d="M136.083433,187.715086 C130.20421,181.837055 126.443133,176.067006 127.683272,174.827118 C128.92341,173.587231 134.69463,177.347545 140.573854,183.225576 C146.453713,189.104243 150.21479,194.874292 148.974651,196.114179 C147.734513,197.354066 141.963293,193.593752 136.083433,187.715086 Z" id="Stroke-544" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(138.328961, 185.470648) rotate(22.000000) translate(-138.328961, -185.470648) "></path>
+                <path d="M146.697288,183.650834 C138.818086,175.773231 133.777481,168.04045 135.43947,166.378798 C137.101459,164.717146 144.835809,169.756729 152.715011,177.634332 C160.594213,185.511936 165.634818,193.244716 163.972829,194.906369 C162.310839,196.568021 154.57649,191.528438 146.697288,183.650834 Z" id="Fill-546" fill-opacity="0.35" fill="#F5F5F5" transform="translate(149.706149, 180.642583) rotate(22.000000) translate(-149.706149, -180.642583) "></path>
+                <path d="M146.697288,183.650834 C138.818086,175.773231 133.777481,168.04045 135.43947,166.378798 C137.101459,164.717146 144.835809,169.756729 152.715011,177.634332 C160.594213,185.511936 165.634818,193.244716 163.972829,194.906369 C162.310839,196.568021 154.57649,191.528438 146.697288,183.650834 Z" id="Stroke-548" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(149.706149, 180.642583) rotate(22.000000) translate(-149.706149, -180.642583) "></path>
+                <path d="M65.2279553,90.2345285 C62.4548336,90.0320836 60.4105231,89.3345405 60.4105231,88.5051511 C60.4105231,87.676673 62.4503446,86.9797514 65.2188187,86.7764428 C65.4149139,84.0068366 66.0879499,81.9659221 66.8880741,81.9659221 C67.6881984,81.9659221 68.3612344,84.0068366 68.5573295,86.7764428 C71.3258036,86.9797514 73.3656251,87.676673 73.3656251,88.5051511 C73.3656251,89.3345405 71.3213146,90.0320836 68.548193,90.2345285 C68.3410329,92.9408238 67.6762073,94.9210242 66.8880741,94.9210242 C66.0999409,94.9210242 65.4351154,92.9408238 65.2279553,90.2345285 Z" id="Oval-80-Copy-3" fill-opacity="0.4" fill="#A3B1BF" opacity="0.85" transform="translate(66.888074, 88.443473) rotate(-340.000000) translate(-66.888074, -88.443473) "></path>
+                <path d="M118.775569,329.140492 L118.424988,329.526146 C117.522244,330.5192 115.985396,330.592411 114.992341,329.689667 C114.596934,329.330218 114.331035,328.850456 114.235803,328.324641 L114.143075,327.812647 L113.669257,327.599091 C112.445737,327.047635 111.900921,325.608734 112.452377,324.385214 C112.672015,323.8979 113.046204,323.496601 113.516991,323.243469 L113.97521,322.997095 L114.032158,322.478985 C114.178786,321.144967 115.379087,320.182398 116.713105,320.329026 C117.24418,320.387399 117.741214,320.61917 118.127299,320.988476 L118.503957,321.348765 L119.01334,321.242962 C120.327346,320.970031 121.613813,321.813989 121.886744,323.127995 C121.995449,323.651349 121.928561,324.195943 121.696437,324.677436 L121.470742,325.145594 L121.728812,325.597409 C122.394441,326.762759 121.989337,328.247061 120.823987,328.91269 C120.359975,329.177726 119.82154,329.282421 119.292023,329.21057 L118.775569,329.140492 Z" id="Star-1-Copy-16" fill-opacity="0.4" fill="#A3B1BF"></path>
+                <path d="M432.83752,120.004816 L432.837087,120.005044 L432.837087,120.005044 C432.092472,120.396429 431.171561,120.110079 430.780176,119.365464 C430.624337,119.068978 430.570573,118.729391 430.627206,118.399266 L430.627206,118.399266 L430.627206,118.399266 L430.627206,118.399266 C430.024845,117.812233 430.01242,116.848039 430.599453,116.245678 C430.833262,116.005765 431.139652,115.849637 431.471171,115.801474 L431.471471,115.801431 L431.471471,115.801431 L431.471471,115.801431 C431.843891,115.046982 432.757399,114.737288 433.511848,115.109709 C433.812195,115.25797 434.055308,115.501083 434.20357,115.801431 L434.20357,115.801431 L434.203869,115.801474 L434.203869,115.801474 C435.036229,115.922398 435.612963,116.695187 435.492039,117.527547 C435.443876,117.859067 435.287748,118.165457 435.047835,118.399266 L435.047835,118.399266 L435.047835,118.399266 L435.047835,118.399266 C435.190066,119.228364 434.63325,120.015783 433.804152,120.158014 C433.474027,120.214647 433.134439,120.160883 432.837954,120.005044 L432.83752,120.004816 Z" id="Star-1-Copy-18" fill-opacity="0.4" fill="#A3B1BF" transform="translate(432.837619, 117.566125) rotate(-3.000000) translate(-432.837619, -117.566125) "></path>
+                <path d="M99.7727703,38.762372 L99.0266308,39.1545584 L99.0266308,39.1545584 C97.8386845,39.7789675 96.36948,39.3221304 95.7450708,38.134184 C95.4964477,37.6611755 95.4106732,37.1194035 95.5010241,36.5927278 L95.6433921,35.7628333 L95.0407812,35.1755563 L95.0407812,35.1755563 C94.0796578,34.2388893 94.059832,32.7004261 94.996499,31.7393027 C95.369563,31.3564979 95.8584376,31.1073808 96.3874089,31.0305329 L97.2206742,30.9094778 L97.5937913,30.1536188 L97.5937913,30.1536188 C98.1878378,28.950202 99.6449697,28.4562097 100.848387,29.0502562 C101.327469,29.2867472 101.715258,29.6745363 101.951749,30.1536188 L102.324866,30.9094778 L103.158132,31.0305329 L103.158132,31.0305329 C104.486241,31.223478 105.406474,32.4565366 105.213529,33.7846464 C105.136681,34.3136177 104.887564,34.8024923 104.504759,35.1755563 L103.902148,35.7628333 L104.044516,36.5927278 L104.044516,36.5927278 C104.27143,37.9154575 103.383095,39.1716915 102.060366,39.398605 C101.53369,39.4889559 100.991918,39.4031814 100.51891,39.1545584 L99.7727703,38.762372 Z" id="Star-1-Copy-19" fill-opacity="0.4" fill="#A3B1BF" transform="translate(99.772928, 34.116388) rotate(19.000000) translate(-99.772928, -34.116388) "></path>
+                <path d="M396.631073,305.744172 L396.098125,305.608596 C394.797498,305.277731 394.01135,303.955146 394.342215,302.654518 C394.473956,302.136643 394.772729,301.676633 395.192288,301.345694 L395.623376,301.00566 L395.587617,300.458372 C395.500116,299.119176 396.514815,297.962609 397.854012,297.875108 C398.387399,297.840257 398.917395,297.982247 399.361919,298.279089 L399.818473,298.583965 L400.329362,298.380373 C401.576068,297.883555 402.989473,298.491459 403.486291,299.738164 C403.684076,300.23448 403.712777,300.782145 403.567956,301.296416 L403.418882,301.825788 L403.76981,302.247972 C404.627682,303.280038 404.486471,304.812135 403.454406,305.670007 C403.043346,306.011688 402.531095,306.208301 401.996987,306.229395 L401.44896,306.251039 L401.15585,306.715309 C400.439401,307.850123 398.938655,308.189275 397.80384,307.472826 C397.351988,307.187555 397.006767,306.761296 396.821614,306.260029 L396.631073,305.744172 Z" id="Star-1-Copy-20" fill-opacity="0.4" fill="#A3B1BF"></path>
+                <path d="M439.755536,146.347757 L439.755103,146.347984 L439.755103,146.347984 C439.010488,146.739369 438.089577,146.45302 437.698192,145.708405 C437.542353,145.411919 437.488589,145.072331 437.545222,144.742206 L437.545222,144.742206 L437.545222,144.742206 L437.545222,144.742206 C436.942861,144.155173 436.930436,143.190979 437.517469,142.588619 C437.751277,142.348705 438.057668,142.192577 438.389187,142.144415 L438.389487,142.144371 L438.389487,142.144371 L438.389487,142.144371 C438.761907,141.389923 439.675415,141.080228 440.429864,141.452649 C440.730211,141.600911 440.973324,141.844024 441.121586,142.144371 L441.121586,142.144371 L441.121885,142.144415 L441.121885,142.144415 C441.954245,142.265338 442.530978,143.038128 442.410055,143.870488 C442.361892,144.202007 442.205764,144.508398 441.965851,144.742206 L441.965851,144.742206 L441.965851,144.742206 L441.965851,144.742206 C442.108082,145.571305 441.551266,146.358723 440.722168,146.500955 C440.392043,146.557588 440.052455,146.503823 439.755969,146.347984 L439.755536,146.347757 Z" id="Star-1-Copy-21" fill-opacity="0.4" fill="#A3B1BF" transform="translate(439.755635, 143.909066) rotate(-12.000000) translate(-439.755635, -143.909066) "></path>
+                <path d="M244.621971,220.61341 C277.15945,220.61341 303.536288,194.242112 303.536288,161.711467 C303.536288,129.180822 277.15945,102.809524 244.621971,102.809524 C212.084491,102.809524 185.707653,129.180822 185.707653,161.711467 C185.707653,194.242112 212.084491,220.61341 244.621971,220.61341 Z" id="Oval-8-Copy-2" fill-opacity="0.66" fill="#A3B1BF"></path>
+                <path d="M245.345696,141.060063 C241.146656,141.060063 237.880736,142.342349 235.547936,144.906921 C233.215136,147.354921 232.107056,150.618921 232.107056,154.698921 L236.714336,154.698921 C236.714336,151.842921 237.355856,149.628063 238.638896,147.996063 C240.038576,146.072635 242.196416,145.140063 245.112416,145.140063 C247.561856,145.140063 249.486416,145.781206 250.827776,147.180063 C252.110816,148.462349 252.810656,150.269206 252.810656,152.600635 C252.810656,154.232635 252.227456,155.748063 251.061056,157.205206 C250.711136,157.671492 250.011296,158.370921 249.078176,159.303492 C245.928896,162.101206 244.004336,164.316063 243.187856,166.064635 C242.488016,167.521778 242.138096,169.212063 242.138096,171.135492 L242.138096,172.476063 L246.803696,172.476063 L246.803696,171.135492 C246.803696,169.561778 247.153616,168.162921 247.911776,166.880635 C248.494976,165.831492 249.369776,164.782349 250.652816,163.674921 C253.218896,161.401778 254.793536,159.886349 255.376736,159.186921 C256.834736,157.263492 257.592896,154.990349 257.592896,152.367492 C257.592896,148.870349 256.484816,146.130921 254.326976,144.149206 C252.052496,142.050921 249.078176,141.060063 245.345696,141.060063 Z M244.470896,176.556063 C243.479456,176.556063 242.662976,176.847492 241.963136,177.546921 C241.263296,178.188063 240.971696,179.004063 240.971696,179.994921 C240.971696,180.985778 241.263296,181.801778 241.963136,182.501206 C242.662976,183.142349 243.479456,183.492063 244.470896,183.492063 C245.462336,183.492063 246.278816,183.142349 246.978656,182.501206 C247.678496,181.860063 248.028416,181.044063 248.028416,179.994921 C248.028416,179.004063 247.678496,178.188063 247.036976,177.546921 C246.337136,176.847492 245.462336,176.556063 244.470896,176.556063 Z" id="?" fill="#FFFFFF"></path>
+                <path d="M223.261662,133.139924 C229.077338,129.782947 239.631808,125.828273 236.274126,120.013819 C232.916444,114.199364 220.565868,115.043746 214.750193,118.400722 C208.934517,121.757699 202.729834,131.623951 206.087516,137.438405 C209.445198,143.252859 217.445986,136.4969 223.261662,133.139924" id="Oval-8-Copy-2" fill="#FAFAFA"></path>
+                <path d="M249.679003,119.820589 C252.365149,119.820589 254.5427,117.643495 254.5427,114.957913 C254.5427,112.272332 252.365149,110.095238 249.679003,110.095238 C246.992857,110.095238 244.815306,112.272332 244.815306,114.957913 C244.815306,117.643495 246.992857,119.820589 249.679003,119.820589 Z" id="Oval-10-Copy" fill="#FAFAFA"></path>
+                <path d="M421.5,321.5 L423,323" id="Line-2" stroke="#979797" stroke-linecap="square"></path>
+            </g>
+        </g>
+    </g>
+</svg>

File diff suppressed because it is too large
+ 191 - 0
src/assets/view/500.svg


BIN
src/assets/view/Web2x_x.webp


BIN
src/assets/view/bannerbgColor.png


BIN
src/assets/view/bannerbgcolor1.png


+ 1 - 0
src/assets/view/bgcolor.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><defs><linearGradient id="1" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(6.123233995736766e-17, 1, -1.5199849878025897, 6.123233995736766e-17, 0.5, 0)"><stop stop-color="#0014b7" stop-opacity="1" offset="0"></stop><stop stop-color="#2232c8" stop-opacity="0.73" offset="0.46"></stop><stop stop-color="#3b48d5" stop-opacity="0.532" offset="1"></stop><stop stop-color="#4752db" stop-opacity="0.438" offset="0.733"></stop><stop stop-color="#4f59df" stop-opacity="0.378" offset="0.77"></stop><stop stop-color="#5760e3" stop-opacity="0.318" offset="0.86"></stop><stop stop-color="#5b64e5" stop-opacity="0.283" offset="1"></stop><stop stop-color="#7f83f7" stop-opacity="0" offset="1"></stop></linearGradient></defs><rect width="100%" height="100%" fill="url(#1)"></rect></svg>

File diff suppressed because it is too large
+ 0 - 0
src/assets/view/dev.svg


+ 169 - 0
src/assets/view/notableform.svg

@@ -0,0 +1,169 @@
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1024 1024" height="1024px" width="1024px">
+    <title>没有收藏</title>
+    <defs>
+        <linearGradient id="linearGradient-1" y2="44.0501254%" x2="50%" y1="-29.88559%" x1="50%">
+            <stop offset="0%" stop-color="#CFDFFA"></stop>
+            <stop offset="100%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-2" y2="69.8229089%" x2="53.6226986%" y1="33.7484636%" x1="50%">
+            <stop offset="0%" stop-color="#CFDFFA"></stop>
+            <stop offset="100%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-3" y2="66.4977364%" x2="53.6226986%" y1="36.47456%" x1="50%">
+            <stop offset="0%" stop-color="#CFDFFA"></stop>
+            <stop offset="100%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-4" y2="100%" x2="57.28025%" y1="11.4973736%" x1="50%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-5" y2="131.881015%" x2="51.9400923%" y1="11.4973736%" x1="50%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-6" y2="128.49897%" x2="74.2827921%" y1="13.0877007%" x1="50%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-7" y2="131.881015%" x2="54.0733641%" y1="11.4973736%" x1="50%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-8" y2="131.881015%" x2="51.9795749%" y1="11.4973736%" x1="50%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-9" y2="131.881015%" x2="55.3643684%" y1="11.4973736%" x1="50%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-10" y2="53.7022797%" x2="74.2827921%" y1="48.2590898%" x1="50%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-11" y2="93.8707843%" x2="51.9359856%" y1="-91.6326561%" x1="54.5180881%">
+            <stop offset="0%" stop-color="#5792F0"></stop>
+            <stop offset="100%" stop-opacity="0" stop-color="#BFD4FA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-12" y2="-1.23255816%" x2="-17.9385803%" y1="119.605122%" x1="118.461169%">
+            <stop offset="0%" stop-color="#5792F0"></stop>
+            <stop offset="100%" stop-color="#BFD4FA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-13" y2="50%" x2="-11.3176499%" y1="50%" x1="146.853724%">
+            <stop offset="0%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+            <stop offset="100%" stop-color="#CFDFFA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-14" y2="50%" x2="-11.3176499%" y1="50%" x1="146.853724%">
+            <stop offset="0%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+            <stop offset="100%" stop-color="#CFDFFA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-15" y2="30.1198066%" x2="-17.9385803%" y1="77.0094511%" x1="118.461169%">
+            <stop offset="0%" stop-color="#5792F0"></stop>
+            <stop offset="100%" stop-color="#BFD4FA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-16" y2="134.19466%" x2="25.7283138%" y1="3.55271368e-13%" x1="64.3532982%">
+            <stop offset="0%" stop-color="#CFDFFA"></stop>
+            <stop offset="100%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-17" y2="50%" x2="-11.3176499%" y1="50%" x1="146.853724%">
+            <stop offset="0%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+            <stop offset="100%" stop-color="#CFDFFA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-18" y2="50%" x2="-11.3176499%" y1="50%" x1="146.853724%">
+            <stop offset="0%" stop-opacity="0" stop-color="#EAF0FC"></stop>
+            <stop offset="100%" stop-color="#CFDFFA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-19" y2="-11.5290622%" x2="-17.9385803%" y1="188.087506%" x1="219.196164%">
+            <stop offset="0%" stop-color="#5792F0"></stop>
+            <stop offset="100%" stop-color="#BFD4FA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-20" y2="-11.5290622%" x2="-17.9385803%" y1="173.082361%" x1="228.328534%">
+            <stop offset="0%" stop-color="#5792F0"></stop>
+            <stop offset="100%" stop-color="#BFD4FA"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-21" y2="73.6326896%" x2="100%" y1="11.7098971%" x1="14.3474826%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-22" y2="93.1271749%" x2="50%" y1="-31.010887%" x1="43.707299%">
+            <stop offset="0%" stop-color="#BFD4FA"></stop>
+            <stop offset="100%" stop-color="#5792F0"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-23" y2="100%" x2="50%" y1="12.9243097%" x1="50%">
+            <stop offset="0%" stop-color="#FFCDA5"></stop>
+            <stop offset="100%" stop-color="#FFE8D1"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-24" y2="100%" x2="88.72%" y1="0%" x1="42.3145579%">
+            <stop offset="0%" stop-color="#FFF2DF"></stop>
+            <stop offset="100%" stop-color="#FEE0BC"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-25" y2="61.3220709%" x2="210.359568%" y1="25.7376426%" x1="35.6067948%">
+            <stop offset="0%" stop-color="#FEE127"></stop>
+            <stop offset="100%" stop-color="#F9AB21"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-26" y2="100%" x2="50%" y1="0%" x1="50%">
+            <stop offset="0%" stop-color="#FEE127"></stop>
+            <stop offset="100%" stop-color="#F9AB21"></stop>
+        </linearGradient>
+        <linearGradient id="linearGradient-27" y2="38.1816114%" x2="126.959811%" y1="25.7376426%" x1="33.2709467%">
+            <stop offset="0%" stop-color="#FEE127"></stop>
+            <stop offset="100%" stop-color="#F9AB21"></stop>
+        </linearGradient>
+    </defs>
+    <g fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="没有收藏">
+        <rect height="1024" width="1024" y="0" x="0" id="矩形"></rect>
+        <g transform="translate(32.000000, 149.000000)" id="编组">
+            <g id="背景">
+                <ellipse ry="250" rx="480" cy="766" cx="480" fill="url(#linearGradient-1)" id="椭圆形"></ellipse>
+                <path fill="url(#linearGradient-2)" id="云" d="M814,116.212121 C814,130.606061 800.181818,142.121212 782.727273,142.121212 L686,142.121212 C668.545455,140.969697 654,130.030303 654,115.060606 C654,105.272727 660.545455,96.6363636 670,92.030303 C669.272727,90.3030303 668.545455,88.5757576 668.545455,86.8484848 C668.545455,77.0606061 678,68.4242424 690.363636,68.4242424 C695.454545,68.4242424 699.818182,70.1515152 703.454545,72.4545455 C712.181818,59.2121212 728.181818,50 747.090909,50 C773.272727,50 794.363636,67.8484848 794.363636,89.7272727 L794.363636,92.030303 C806,96.0606061 814,105.272727 814,116.212121 Z"></path>
+                <path fill="url(#linearGradient-3)" id="云" d="M166.222222,0 C190.894883,0 211.8847,15.7681262 219.664106,37.7768098 L256.5,37.7777778 C266.164983,37.7777778 274,45.6127947 274,55.2777778 L274,98.0555556 C274,107.720539 266.164983,115.555556 256.5,115.555556 L78.1666667,115.555556 C68.5016835,115.555556 60.6666667,107.720539 60.6666667,98.0555556 L60.6669111,85.6467185 C56.4406838,78.8453656 54,70.81882 54,62.2222222 C54,37.6762333 73.8984556,17.7777778 98.4444444,17.7777778 C106.377692,17.7777778 113.825468,19.8563268 120.272891,23.4985432 C130.565544,9.26259942 147.312185,0 166.222222,0 Z"></path>
+                <g transform="translate(170.000000, 570.000000)" id="草">
+                    <ellipse ry="4" rx="12.8" cy="78" cx="26.8" fill="#CCDCF6" id="椭圆形"></ellipse>
+                    <path fill-rule="nonzero" fill="url(#linearGradient-4)" id="路径-42" d="M13.2096985,76.4334696 C14.9527214,47.3262499 22.2548023,30.479152 35.1159413,25.892176 C40.1793835,25.2161532 45.8226773,24.1997042 41.8878028,30.7617951 C37.9529282,37.3238861 27.4160559,34.7701422 16.879533,76.4161198 C15.9265298,78.1966928 14.7032516,78.202476 13.2096985,76.4334696 Z"></path>
+                    <path fill-rule="nonzero" fill="url(#linearGradient-5)" id="路径-41" d="M12.9692534,76.0688036 C9.54744327,48.8820916 6.74680699,31.7849012 4.56734456,24.7772324 C1.2981509,14.2657291 -5.66257226,-5.963969 8.82439601,1.68943966 C23.3113643,9.34284832 25.0241679,48.6011298 18.327685,72.4929976 C16.2462776,78.5387167 14.4601337,79.730652 12.9692534,76.0688036 Z"></path>
+                </g>
+                <g fill-rule="nonzero" transform="translate(686.120225, 515.426704)" id="草">
+                    <path fill="url(#linearGradient-6)" id="路径-43" d="M65.8576891,95.4430222 C63.3395468,83.9806553 55.9856639,75.9680543 43.7960405,71.4052192 C29.8759357,66.9305791 22.2494886,61.6117041 30.9599814,57.7550267 C38.3155159,57.1703291 54.0022982,51.4419217 65.8576891,85.6583003 C66.6827635,88.9740418 66.6827635,92.2356158 65.8576891,95.4430222 Z"></path>
+                    <path fill="url(#linearGradient-7)" id="路径-44" d="M66.4764949,97.2611071 C59.1454779,69.8960192 50.8174439,49.9170768 41.4923928,37.3242799 C34.6452589,28.7188412 35.1250476,16.405104 41.4923928,13.6218727 C48.0100381,12.8970718 60.0222617,11.7760378 69.0669112,58.9373338 C69.6381527,62.1812743 72.8251647,81.1589956 69.0669112,93.4066801 C68.5106318,95.0875751 67.6471596,96.3723841 66.4764949,97.2611071 Z"></path>
+                    <path fill="url(#linearGradient-8)" id="路径-45" d="M68.1696321,91.0804085 C71.4853494,78.835463 71.0643832,62.8586309 66.9067333,43.1499123 C60.5471905,24.0440706 49.6921744,0.541796566 69.4774519,0 C77.5044316,1.09154868 87.1972186,9.50543486 83.5347739,51.4392686 C81.3029234,68.3604083 77.4213217,78.3565362 73.3477064,91.0804085 C71.9266832,91.8737887 70.2006584,91.8737887 68.1696321,91.0804085 Z"></path>
+                    <path fill="url(#linearGradient-9)" id="路径-46" d="M72.0427224,95.836031 C70.7154818,61.2121058 77.0522244,36.363996 91.0529503,21.2917016 C94.833726,16.2551414 109.217459,11.5380494 109.163159,27.3263959 C107.661554,34.1152854 104.448437,48.6087163 85.9202741,70.7214245 C79.8162941,78.7025415 75.8046094,90.365172 75.7655073,93.0996265 C75.7394392,94.9225962 74.4985109,95.834731 72.0427224,95.836031 Z"></path>
+                    <path fill="url(#linearGradient-10)" id="路径-47" d="M0,100.407711 C13.8643816,97.8236334 21.5103995,95.6299697 22.9380537,93.8267198 C25.0795349,91.1218449 43.9450099,79.5080271 55.7094426,89.2905093 C58.2703723,85.9992821 66.4835238,83.4391237 71.1837342,89.2905093 C73.3341085,80.0524096 86.7490663,74.1360276 92.583369,75.0945046 C99.1537088,74.5803177 118.55034,74.7942504 120,100.407711 C114.707841,100.530921 74.7078414,100.530921 0,100.407711 Z"></path>
+                </g>
+            </g>
+            <g transform="translate(236.000000, 178.000000)" id="文件夹">
+                <polygon points="153.754575 263.865464 313.39591 447.002576 369.92636 670.058761 126.332242 631.651818" transform="translate(248.129301, 466.962113) rotate(-50.000000) translate(-248.129301, -466.962113)" opacity="0.3" fill-rule="nonzero" fill="url(#linearGradient-11)" id="路径"></polygon>
+                <path fill-rule="nonzero" fill="url(#linearGradient-12)" id="矩形" d="M20.8,126 L100.736372,126 L114.018551,147.042432 L244.743075,146.809884 C262.416159,146.778445 276.76851,161.079824 276.799949,178.752908 C276.799983,178.771883 276.8,178.790858 276.8,178.809833 L276.8,359.6 L276.8,359.6 L20.8,359.6 L20.8,126 Z"></path>
+                <rect height="230.4" width="208" y="177.2" x="48" fill="url(#linearGradient-13)" id="矩形"></rect>
+                <rect height="203.2" width="217.6" y="199.6" x="43.2" fill="#FFFFFF" id="矩形"></rect>
+                <rect height="187.2" width="225.6" y="214" x="41.6" fill="url(#linearGradient-14)" id="矩形"></rect>
+                <polygon points="0 234.8 304 234.8 276.363636 407.6 27.6363636 407.6" fill-rule="nonzero" fill="url(#linearGradient-15)" id="矩形"></polygon>
+                <rect rx="5.6" height="11.2" width="11.2" y="310" x="176" fill="url(#linearGradient-16)" id="矩形"></rect>
+                <rect rx="5.6" height="11.2" width="49.6" y="310" x="198.4" fill="url(#linearGradient-17)" id="矩形"></rect>
+                <rect rx="5.6" height="11.2" width="72" y="334" x="174.4" fill="url(#linearGradient-18)" id="矩形备份-2"></rect>
+                <circle r="24" cy="114.8" cx="136" fill-rule="nonzero" fill="url(#linearGradient-19)" id="椭圆形"></circle>
+                <polygon points="136 122.8 126.595436 127.744272 128.391548 117.272136 120.783096 109.855728 131.297718 108.327864 136 98.8 140.702282 108.327864 151.216904 109.855728 143.608452 117.272136 145.404564 127.744272" fill="#FFFFFF" id="星形"></polygon>
+                <circle r="51.2" cy="51.2" cx="264.8" fill-rule="nonzero" fill="url(#linearGradient-20)" id="椭圆形"></circle>
+                <path fill-rule="nonzero" fill="#FFFFFF" id="形状" d="M261.6,61.4 L261.6,54.6 L264.8,54.6 C270.24,54.6 274.4,50.18 274.4,44.4 L274.4,41 C274.4,35.22 270.24,30.8 264.8,30.8 C259.36,30.8 255.2,35.22 255.2,41 L255.2,44.4 L248.8,44.4 L248.8,41 C248.8,31.48 255.84,24 264.8,24 C273.76,24 280.8,31.48 280.8,41 L280.8,44.4 C280.8,52.56 275.36,59.36 268,61.06 L268,68.2 L261.6,68.2 L261.6,61.4 L261.6,61.4 Z M261.6,71.6 L268,71.6 L268,78.4 L261.6,78.4 L261.6,71.6 Z"></path>
+            </g>
+            <g transform="translate(584.000000, 353.200000)" id="人物">
+                <ellipse ry="16" rx="50" cy="246.8" cx="54" fill="#CCDCF6" id="椭圆形"></ellipse>
+                <path fill-rule="nonzero" fill="url(#linearGradient-21)" id="路径-52" d="M38.6300477,235.235362 L37.8007519,240.654984 C34.4234067,240.760606 30.750592,241.753363 26.7823078,243.633257 C24.2287309,245.271596 24.1150782,246.01393 24.0328715,247.424613 C23.9780671,248.365068 31.1929355,248.365068 45.6774767,247.424613 L45.6774767,233.249114 L38.6300477,235.235362 Z"></path>
+                <path fill-rule="nonzero" fill="url(#linearGradient-21)" id="路径-52备份-2" d="M70.6300477,235.235362 L69.8007519,240.654984 C66.4234067,240.760606 62.750592,241.753363 58.7823078,243.633257 C56.2287309,245.271596 56.1150782,246.01393 56.0328715,247.424613 C55.9780671,248.365068 63.1929355,248.365068 77.6774767,247.424613 L77.6774767,233.249114 L70.6300477,235.235362 Z"></path>
+                <path fill-rule="nonzero" fill="url(#linearGradient-22)" id="腿" d="M63.4798058,123.785314 C68.6750615,123.805568 72.8281177,124.432399 72.8281177,124.432399 C72.8281177,124.432399 71.3760846,143.047994 72.5330361,163.348918 C74.4320731,196.615503 79.3228235,238.234089 79.3228235,238.234089 L68.9920634,238.234089 C68.9920634,238.234089 52.013417,182.003971 52.1927293,145.31426 C46.0431551,176.221219 46.8317641,238.771761 46.8317641,238.771761 L35.9634303,237.694667 C35.9634303,237.694667 32.1302975,199.819086 31.1837007,169.374698 C30.4182428,144.709705 32.5013401,126.250105 32.5013401,126.250105 C37.8190756,125.533357 43.2048111,125.470098 48.5379757,126.061745 C48.5519929,126.063397 48.5660146,126.065057 48.5800408,126.066726 C50.9329551,125.295295 53.8831978,124.50135 56.8908161,124.137612 C58.9422461,123.889246 61.0228754,123.792804 62.9738901,123.785314 L63.4798058,123.785314 Z"></path>
+                <g transform="translate(59.617349, 26.476940) scale(-1, 1) translate(-59.617349, -26.476940) translate(39.617349, 0.000000)" id="头">
+                    <rect height="14.7259384" width="14.7259384" y="38.2279411" x="15.9030099" fill="url(#linearGradient-23)" id="矩形"></rect>
+                    <ellipse ry="16.7340209" rx="14.7259384" cy="26.8488069" cx="25.2740616" fill="url(#linearGradient-24)" id="椭圆形"></ellipse>
+                    <path fill="#483029" id="路径-53" d="M38.633377,16.179698 C34.5465891,21.8060201 29.9159912,25.1974521 24.7415832,26.3539941 C22.9496901,27.2264212 19.0354404,24.5262489 18.2108894,28.1619803 C17.9766837,30.5999513 19.3518129,33.9457585 21.2979246,33.3437386 C20.6077901,35.4939378 18.6707419,37.9181311 15.4867798,40.6163185 C12.2024395,41.904943 8.88101335,41.4257987 5.52250136,39.1788855 C0.957681042,34.8920992 -4.44906325,20.6753232 6.06580044,8.46502605 C6.39150047,8.27630082 18.4960557,-3.32957295 33.4895535,6.58602551 C37.2526076,9.03034944 38.9672155,12.2282403 38.633377,16.179698 Z"></path>
+                    <circle r="7.43734262" cy="7.43734262" cx="7.87067988" fill="#483029" id="椭圆形"></circle>
+                </g>
+                <g transform="translate(0.000000, 45.644812)" id="上半身">
+                    <path fill="url(#linearGradient-25)" id="胳膊" d="M47.4943933,1.16269478 C47.4943933,1.16269478 40.7649057,4.14935926 37.465851,9.66511959 C32.0297096,18.7573381 28.911665,34.2935028 28.911665,34.2935028 C28.911665,34.2935028 28.6605865,39.0199718 25.0783387,45.7277882 C21.1807829,53.0245285 19.770656,53.937346 19.770656,53.937346 C19.770656,53.937346 14.2031364,57.7156215 12.6908264,58.0421248 C10.8456914,58.44112 6.49852997,60.3876713 6.49852997,60.3876713 L9.44724254,69.4752506 C9.44724254,69.4752506 21.5807569,68.3516263 30.0940696,64.4910003 C36.4527785,61.6055345 38.9402073,53.9361861 38.9402073,53.9361861 L47.4943933,1.16269478 Z"></path>
+                    <path fill="url(#linearGradient-26)" id="衣服" d="M50.7916593,7.13421412 L63.7101596,0 C63.7101596,0 64.9070727,1.1067661 65.3932869,1.63451783 C66.3496868,2.31558043 67.1981191,2.98015972 67.1981191,2.98015972 C67.1981191,2.98015972 70.4627421,4.85369773 72.269418,7.90617719 C74.4346737,11.564497 74.333517,24.0315557 74.333517,24.0315557 C74.333517,24.0315557 73.9659562,33.3514762 74.6283877,43.0890847 C75.7725088,59.9074319 76.2900544,79.8255612 76.2900544,79.8255612 C76.2900544,79.8255612 62.8670572,80.5482145 52.7450904,80.6198363 C42.0888519,80.6949385 31.8632971,80.0315143 31.8632971,80.0315143 L38.3504648,20.5133809 C38.3504648,20.5133809 39.3314227,10.3500227 43.0713244,4.38771248 C44.7150127,1.76292735 48.8987557,0.667910149 48.8987557,0.667910149 L50.7916593,7.13421412 Z"></path>
+                    <path fill="url(#linearGradient-27)" id="胳膊-2" d="M67.5514778,3.21508422 C67.5514778,3.21508422 73.4956155,7.02380631 75.5159214,10.5448807 C78.5638975,15.8602736 79.9389901,39.864067 79.9389901,39.864067 C79.9389901,39.864067 80.4586643,43.9378194 78.4646339,47.1938636 C76.3333859,50.6734726 56.933193,62.4400607 56.933193,62.4400607 L41.0072256,71.2356426 L35.9914948,60.0942243 L63.1254894,40.1572241 C63.1254894,40.1572241 64.3721233,39.1745245 64.6027652,37.8116776 C64.81589,36.5387206 62.2408757,21.6860092 62.2408757,21.6860092 C62.2408757,21.6860092 61.1986079,15.7524057 62.8306181,11.424352 C64.2845379,7.57039496 67.5514778,3.21508422 67.5514778,3.21508422 Z"></path>
+                    <path fill="#483029" id="iPad" d="M2.07254159,46.0209453 L32.4530396,46.0209453 C32.8442956,46.0211759 33.2194344,46.1757666 33.4959299,46.4507091 C33.7724253,46.7256516 33.9276283,47.0984239 33.9273959,47.4870206 L34.8120102,67.4240207 C34.8120102,67.8126411 34.6571414,68.1854579 34.3806292,68.4604175 C34.1041169,68.7353764 33.7289331,68.8900965 33.3376534,68.8900965 L4.13664039,68.8900965 C3.74536069,68.8900965 3.37017684,68.7353764 3.09366461,68.4604175 C2.81715237,68.1854579 2.66197427,67.8126411 2.6622841,67.4240207 L0.598185043,47.4870206 C0.598185043,47.0984239 0.753155943,46.7256516 1.0296514,46.4507091 C1.30614685,46.1757666 1.68128568,46.0211759 2.07254159,46.0209453 L2.07254159,46.0209453 Z"></path>
+                    <path fill="#FEE0BC" id="手" d="M35.9914948,60.3876713 L27.5599285,60.6527015 C27.5599285,60.6527015 26.7979344,60.6184854 26.7716587,61.9793025 C26.783305,62.3212404 26.9860204,62.6281685 27.2971719,62.7749731 L29.3963049,63.5709337 C28.3653918,63.8457659 27.3106608,64.0233369 26.2461456,64.1012841 C24.8478345,64.1796035 23.4461908,64.1796035 22.0478796,64.1012841 C22.0478796,64.1012841 21.1340707,64.0082046 21.2596099,65.4275951 C21.3968272,66.9241167 21.7851231,69.141498 21.7851231,69.141498 C21.7851231,69.141498 21.9632136,70.6557078 23.8842561,70.9972897 C26.3541678,71.4377502 32.2807881,71.52764 32.2807881,71.52764 C33.7723166,71.5472061 35.2632918,71.4585301 36.7418107,71.2623196 C37.95633,71.073841 40.4145636,70.2013291 40.4145636,70.2013291 C40.4145636,70.2013291 39.3547787,67.5536361 38.3329476,65.0088822 C37.6686297,63.4130751 36.8859963,61.8684301 35.9914948,60.3876713 Z M2.48127403,60.5167068 L9.65744782,60.0919046 C9.65744782,60.0919046 10.2997417,59.9985351 10.4194418,61.2857005 C10.4427467,61.6002286 10.2959827,61.9033567 10.0340655,62.081661 L8.30863078,63.0040474 C9.20139076,63.1815884 10.1104494,63.2655592 11.0208624,63.2545793 C12.2140537,63.2164637 13.4036613,63.1040254 14.5826736,62.9179271 C14.5826736,62.9179271 15.3534262,62.7561252 15.3476529,64.111433 C15.3417482,65.5403925 15.1694966,67.672523 15.1694966,67.672523 C15.0904664,68.5970274 14.4309134,69.3705458 13.5258083,69.6002264 C11.4617096,70.2161175 6.4372201,70.7763345 6.4372201,70.7763345 C5.17417585,70.9141637 3.90193154,70.9496572 2.63308893,70.8824627 C2.16888567,70.8459267 1.54702846,70.9465451 1.10910085,70.6504884 C0.732184525,70.3464167 0.438072494,69.9533105 0.253682253,69.5071469 C-0.0941210224,67.7368613 -0.0841970439,65.9155718 0.282877427,64.1491287 C0.454830137,63.3267759 0.68806028,62.5182478 0.980642087,61.7302205 C1.18585627,61.0602717 1.77914639,60.5804967 2.48127403,60.5167068 L2.48127403,60.5167068 Z"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

BIN
src/assets/view/testBgbig.PNG


BIN
src/assets/view/testBgsamll.PNG


BIN
src/assets/view/text-1.png


BIN
src/assets/view/text-2.png


BIN
src/assets/view/text-3.png


+ 24 - 0
src/components/AppConfig/index.vue

@@ -0,0 +1,24 @@
+<template>
+    <el-config-provider :locale="zhCn">
+        <slot></slot>
+    </el-config-provider>
+</template>
+
+<script setup>
+import split from "split.js";
+import {HcLog} from '~uti/tools'
+import { ElMessage, ElLoading, ElNotification,ElMessageBox } from 'element-plus'
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
+
+// 将ui的函数挂载在windows对象上
+function registerElTools () {
+    window['$loading'] = ElLoading;
+    window['$messageBox'] = ElMessageBox;
+    window['$message'] = ElMessage;
+    window['$notification'] = ElNotification;
+    window['$HcLog'] = HcLog;
+    window['$split'] = split;
+}
+
+registerElTools()
+</script>

+ 28 - 0
src/components/plugins/element/HcImage.vue

@@ -0,0 +1,28 @@
+<template>
+    <ElImage :class="ui" :src="src" :previewSrcList="srcs" :initial-index="index" :fit="fit" crossOrigin="anonymous"/>
+</template>
+
+<script setup>
+defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    src: {
+        type: String,
+        default: ''
+    },
+    srcs: {
+        type: Array,
+        default: () => ([])
+    },
+    index: {
+        type: [String,Number],
+        default: -1
+    },
+    fit: {
+        type: String,
+        default: 'cover'
+    },
+})
+</script>

+ 278 - 0
src/components/tree/hc-tree-1.vue

@@ -0,0 +1,278 @@
+<template>
+    <el-radio-group v-model="radioKeys" @change="treeRadioChange">
+        <ElTree class="hc-tree-node tree-line" :class="ui" ref="ElTreeRef" :props="ElTreeProps" :load="ElTreeLoadNode" lazy highlight-current accordion node-key="id"
+                show-checkbox :default-expanded-keys="defaultExpandedCids" @node-click="ElTreeClick" @node-contextmenu="ElTreeLabelContextMenu" :indent="0">
+            <template #default="{ node, data }">
+                <div class="data-custom-tree-node" :id="`${idPrefix}${data['id']}`">
+                    <!--树组件,节点名称-->
+                    <div class="label level-name" v-if="node.level === 1">{{ node.label }}</div>
+                    <div class="label" v-else>
+                        <el-radio class="size-xl" :label="data['id']" @click.stop v-if="isRadio">{{ node.label }}</el-radio>
+                        <span v-else>{{ node.label }}</span>
+                    </div>
+                    <!--树组件,操作菜单-->
+                    <div class="menu-icon" :class="node.showTreeMenu?'show':''" v-if="node.level !== 1 && menusData.length > 0">
+                        <div class="cu-tree-node-popover-menu-icon" @click.prevent.stop="ElTreeLabelContextMenu($event,data,node)">
+                            <HcIcon name="apps" ui="text-2xl"/>
+                        </div>
+                    </div>
+                    <!--树组件,操作菜单 END-->
+                </div>
+            </template>
+        </ElTree>
+    </el-radio-group>
+    <!--右键菜单-->
+    <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect" v-if="menusData.length > 0" @closed="handleMenuClosed">
+        <template #sort="{item}">
+            <HcIcon :name="item.icon" :line="false" class="menu-item-icon"/>
+            <span class="menu-item-name">{{item.label}}</span>
+        </template>
+    </HcContextMenu>
+</template>
+
+<script setup>
+import {ref,nextTick,watch} from "vue";
+import {getArchiveTreeLazyTree} from '~api/other';
+import {isItem,getArrValue,getObjValue,isValueNull} from "vue-utils-plus"
+
+//参数
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    menus: {
+        type: Array,
+        default: () => ([])
+    },
+    projectId: {
+        type: [String,Number],
+        default: ''
+    },
+    contractId: {
+        type: [String,Number],
+        default: ''
+    },
+    autoExpandKeys: {
+        type: Array,
+        default: () => ([])
+    },
+    idPrefix: {
+        type: String,
+        default: 'hc-tree-'
+    },
+    isAutoKeys: {
+        type: Boolean,
+        default: true
+    },
+    isAutoClick: {
+        type: Boolean,
+        default: true
+    },
+    isRadio: {
+        type: Boolean,
+        default: false
+    },
+    radioKey: {
+        type: String,
+        default: ''
+    },
+})
+
+//变量
+const ElTreeRef = ref(null)
+const treeRefNode = ref(null)
+const treeRefData = ref(null)
+const ElTreeProps = ref({
+    label: 'title',
+    children: 'children',
+    isLeaf: 'isLeaf'
+})
+const menusData = ref(props.menus)
+const isAutoKeys = ref(props.isAutoKeys)
+const TreeExpandKey = ref(props.autoExpandKeys)
+const projectId = ref(props.projectId);
+const contractId = ref(props.contractId);
+const idPrefix = ref(props.idPrefix);
+const radioKeys = ref(Number(props.radioKey));
+
+//监听
+watch(() => [
+    props.menus,
+    props.isAutoKeys,
+    props.autoExpandKeys,
+    props.projectId,
+    props.contractId,
+    props.idPrefix,
+    props.radioKey,
+], ([menus, AutoKeys, expandKeys, UserProjectId, UserContractId, UserIdPrefix, radioKey]) => {
+    menusData.value = menus
+    isAutoKeys.value = AutoKeys
+    TreeExpandKey.value = expandKeys
+    projectId.value = UserProjectId
+    contractId.value = UserContractId
+    idPrefix.value = UserIdPrefix
+    radioKeys.value = Number(radioKey)
+})
+
+//事件
+const emit = defineEmits(['menuTap','nodeTap', 'nodeLoading', 'radioChange'])
+
+//单选框事件
+const treeRadioChange = (val) => {
+    emit('radioChange', val)
+}
+
+//树形结构异步加载数据
+const defaultExpandedCids = ref([])
+const ElTreeLoadNode = async (node, resolve) => {
+    let parentId = 0;
+    if (node.level !== 0) {
+        const nodeData = getObjValue(node?.data);
+        parentId = nodeData?.id || ''
+    }
+    //获取数据
+    const {error, code, data} = await getArchiveTreeLazyTree({
+        parentId,
+        projectId:projectId.value,
+        contractId:contractId.value
+    })
+    //处理数据
+    if (!error && code === 200) {
+        let clickKey = '', defaultExpandedArr = [];
+        const keys = TreeExpandKey.value || []
+        const resData = getArrValue(data)
+        for (let i = 0; i < resData.length; i++) {
+            const item = resData[i];
+            resData[i].isLeaf = !item.hasChildren
+        }
+        if (keys.length > 0) {
+            let lastKey = keys[keys.length-1];
+            for (const item of resData) {
+                //自动展开
+                if (isItem(keys,item?.id)) {
+                    defaultExpandedArr.push(item?.id)
+                }
+                //最后一个,选中点击
+                if (item?.id === lastKey) {
+                    clickKey = item?.id
+                }
+            }
+        } else if (node.level === 0) {
+            defaultExpandedArr.push(resData[0]?.id)
+        }
+        //自动展开
+        defaultExpandedCids.value = defaultExpandedArr
+        if (node.level === 0) {
+            emit('nodeLoading')
+        }
+        resolve(resData)
+        //最后一个,执行点击
+        if (props.isAutoClick && clickKey) {
+            await nextTick(() => {
+                document.getElementById(`${idPrefix.value}${clickKey}`)?.click()
+            })
+        }
+    } else {
+        if (node.level === 0) {
+            emit('nodeLoading')
+        }
+        resolve([])
+    }
+}
+
+//节点被点击
+const ElTreeClick = async (data,node) => {
+    if (isAutoKeys.value) {
+        let autoKeysArr = []
+        await getNodeExpandKeys(node, autoKeysArr)
+        const autoKeys = autoKeysArr.reverse()
+        emit('nodeTap', {node, data, keys: autoKeys})
+    } else {
+        emit('nodeTap', {node, data, keys: []})
+    }
+}
+
+//处理自动展开的节点KEY
+const getNodeExpandKeys = async (node, newKeys) => {
+    const parent = node?.parent ?? []
+    const keyId = node?.data?.id ?? ''
+    if (keyId) {
+        newKeys.push(keyId)
+        await getNodeExpandKeys(parent, newKeys)
+    }
+}
+
+//鼠标右键事件
+const contextMenuRef = ref(null)
+const ElTreeLabelContextMenu = (e,data,node) => {
+    const rows = menusData.value || [];
+    if (node.level !== 1 && rows.length > 0) {
+        e.preventDefault();
+        treeRefNode.value = node;
+        treeRefData.value = data;
+        node.showTreeMenu = true
+        //展开菜单
+        contextMenuRef.value?.showMenu(e)
+    }
+}
+
+//鼠标右键菜单被点击
+const handleMenuSelect = ({key}) => {
+    const node = treeRefNode.value;
+    const data = treeRefData.value;
+    emit('menuTap', {key, node, data})
+}
+
+const handleMenuClosed = () => {
+    const node = treeRefNode.value;
+    if (!isValueNull(node)) {
+        treeRefNode.value['showTreeMenu'] = false
+    }
+}
+
+//设置树菜单的标记数据
+const removeElTreeNode = (key) => {
+    //根据 data 或者 key 拿到 Tree 组件中的 node
+    let node = ElTreeRef.value.getNode(key)
+    //删除 Tree 中的一个节点,使用此方法必须设置 node-key 属性
+    ElTreeRef.value.remove(node)
+}
+
+// 暴露出去
+defineExpose({
+    removeElTreeNode
+})
+</script>
+
+<style lang="scss" scoped>
+@import "../../styles/app/tree.scss";
+.data-custom-tree-node {
+    .menu-icon {
+        position: absolute;
+        pointer-events: none;
+        transition: opacity 0.2s;
+        opacity: 0;
+        right: 0;
+        background: rgba(255, 255, 255, 0.25);
+        border-radius: 2px;
+        .cu-tree-node-popover-menu-icon {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+    }
+    &:hover {
+        .menu-icon {
+            opacity: 1;
+            pointer-events: all;
+            cursor: context-menu;
+        }
+    }
+    .menu-icon.show {
+        opacity: 1;
+        pointer-events: all;
+        cursor: context-menu;
+    }
+}
+</style>

+ 329 - 0
src/components/tree/hc-tree.vue

@@ -0,0 +1,329 @@
+<template>
+  
+          <el-radio-group v-model="radioKeys" @change="treeRadioChange">
+            <ElTree class="hc-tree-node tree-line" :class="ui" ref="ElTreeRef" :props="ElTreeProps" :load="ElTreeLoadNode" lazy highlight-current accordion node-key="id"
+                    :default-expanded-keys="defaultExpandedCids" @node-click="ElTreeClick" @node-contextmenu="ElTreeLabelContextMenu" :indent="0" >
+                <template #default="{ node, data }">
+                    <div class="data-custom-tree-node" :id="`${idPrefix}${data['id']}`">
+                        <!--树组件,节点名称-->
+                        <div class="label level-name" v-if="node.level === 1" >{{ node.label }}</div>
+                        <div class="label" v-else>
+                            <el-radio class="size-xl" :label="data['id']" @click.stop v-if="isRadio && showRadioFun(data)">{{ node.label }}</el-radio>
+                            <span v-else>{{ node.label }}</span>  
+                            <div class="menu-icon1" :class="node.showTreeMenu?'show':''" v-if="node.level !== 1 && menusData.length > 0">
+                                <div class="cu-tree-node-popover-menu-icon" @click.prevent.stop="ElTreeLabelContextMenu($event,data,node)">
+                                    <HcIcon name="apps" ui="text-2xl"/>
+                                </div>
+                            </div>
+                        </div>
+                        <!--树组件,操作菜单-->
+                        <!-- <div class="menu-icon" :class="node.showTreeMenu?'show':''" v-if="node.level !== 1 && menusData.length > 0">
+                            <div class="cu-tree-node-popover-menu-icon" @click.prevent.stop="ElTreeLabelContextMenu($event,data,node)">
+                                <HcIcon name="apps" ui="text-2xl"/>
+                            </div>
+                        </div> -->
+                        <!--树组件,操作菜单 END-->
+                    </div>
+                </template>
+            </ElTree>
+          </el-radio-group>
+   
+ 
+ 
+
+    <!--右键菜单-->
+    <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect" v-if="menusData.length > 0" @closed="handleMenuClosed">
+        <template #sort="{item}">
+            <HcIcon :name="item.icon" :line="false" class="menu-item-icon"/>
+            <span class="menu-item-name">{{item.label}}</span>
+        </template>
+    </HcContextMenu>
+</template>
+
+<script setup>
+import {ref,nextTick,watch} from "vue";
+import { getArchiveTreeLazyTree } from '~api/other';
+import {isItem,getArrValue,getObjValue,isValueNull} from "vue-utils-plus"
+
+//参数
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    menus: {
+        type: Array,
+        default: () => ([])
+    },
+    projectId: {
+        type: [String,Number],
+        default: ''
+    },
+    contractId: {
+        type: [String,Number],
+        default: ''
+    },
+    autoExpandKeys: {
+        type: Array,
+        default: () => ([])
+    },
+    idPrefix: {
+        type: String,
+        default: 'hc-tree-'
+    },
+    isAutoKeys: {
+        type: Boolean,
+        default: true
+    },
+    isAutoClick: {
+        type: Boolean,
+        default: true
+    },
+    isRadio: {
+        type: Boolean,
+        default: false
+    },
+    radioKey: {
+        type: String,
+        default: ''
+    },
+    showRadioFun:{
+        type:Function,
+        default() {
+            return true;
+        }
+    }
+})
+
+//变量
+const ElTreeRef = ref(null)
+const treeRefNode = ref(null)
+const treeRefData = ref(null)
+const ElTreeProps = ref({
+    label: 'title',
+    children: 'children',
+    isLeaf: 'isLeaf'
+})
+const menusData = ref(props.menus)
+const isAutoKeys = ref(props.isAutoKeys)
+const TreeExpandKey = ref(props.autoExpandKeys)
+const projectId = ref(props.projectId);
+const contractId = ref(props.contractId);
+const idPrefix = ref(props.idPrefix);
+const radioKeys = ref(Number(props.radioKey));
+
+//监听
+watch(() => [
+    props.menus,
+    props.isAutoKeys,
+    props.autoExpandKeys,
+    props.projectId,
+    props.contractId,
+    props.idPrefix,
+    props.radioKey,
+], ([menus, AutoKeys, expandKeys, UserProjectId, UserContractId, UserIdPrefix, radioKey]) => {
+    menusData.value = menus
+    isAutoKeys.value = AutoKeys
+    TreeExpandKey.value = expandKeys
+    projectId.value = UserProjectId
+    contractId.value = UserContractId
+    idPrefix.value = UserIdPrefix
+    radioKeys.value = Number(radioKey)
+})
+
+//事件
+const emit = defineEmits(['menuTap','nodeTap', 'nodeLoading', 'radioChange'])
+
+//单选框事件
+const treeRadioChange = (val) => {
+    emit('radioChange', val)
+}
+
+//树形结构异步加载数据
+const defaultExpandedCids = ref([])
+const ElTreeLoadNode = async (node, resolve) => {
+    let parentId = 0;
+    if (node.level !== 0) {
+        const nodeData = getObjValue(node?.data);
+        parentId = nodeData?.id || ''
+    }
+    //获取数据
+    const {error, code, data} = await getArchiveTreeLazyTree({
+        parentId,
+        projectId:projectId.value,
+        contractId:contractId.value
+    })
+    //处理数据
+    if (!error && code === 200) {
+        let clickKey = '', defaultExpandedArr = [];
+        const keys = TreeExpandKey.value || []
+        const resData = getArrValue(data)
+        for (let i = 0; i < resData.length; i++) {
+            const item = resData[i];
+            resData[i].isLeaf = !item.hasChildren
+        }
+        if (keys.length > 0) {
+            let lastKey = keys[keys.length-1];
+            for (const item of resData) {
+                //自动展开
+                if (isItem(keys,item?.id)) {
+                    defaultExpandedArr.push(item?.id)
+                }
+                //最后一个,选中点击
+                if (item?.id === lastKey) {
+                    clickKey = item?.id
+                }
+            }
+        } else if (node.level === 0) {
+            defaultExpandedArr.push(resData[0]?.id)
+        }
+        //自动展开
+        defaultExpandedCids.value = defaultExpandedArr
+        if (node.level === 0) {
+            emit('nodeLoading')
+        }
+        resolve(resData)
+        //最后一个,执行点击
+        if (props.isAutoClick && clickKey) {
+            await nextTick(() => {
+                document.getElementById(`${idPrefix.value}${clickKey}`)?.click()
+            })
+        }
+    } else {
+        if (node.level === 0) {
+            emit('nodeLoading')
+        }
+        resolve([])
+    }
+}
+
+//节点被点击
+const ElTreeClick = async (data,node) => {
+    if (isAutoKeys.value) {
+        let autoKeysArr = []
+        await getNodeExpandKeys(node, autoKeysArr)
+        const autoKeys = autoKeysArr.reverse()
+        emit('nodeTap', {node, data, keys: autoKeys})
+    } else {
+        emit('nodeTap', {node, data, keys: []})
+    }
+}
+
+//处理自动展开的节点KEY
+const getNodeExpandKeys = async (node, newKeys) => {
+    const parent = node?.parent ?? []
+    const keyId = node?.data?.id ?? ''
+    if (keyId) {
+        newKeys.push(keyId)
+        await getNodeExpandKeys(parent, newKeys)
+    }
+}
+
+//鼠标右键事件
+const contextMenuRef = ref(null)
+const ElTreeLabelContextMenu = (e,data,node) => {
+    const rows = menusData.value || [];
+    if (node.level !== 1 && rows.length > 0) {
+        e.preventDefault();
+        treeRefNode.value = node;
+        treeRefData.value = data;
+        node.showTreeMenu = true
+        //展开菜单
+        contextMenuRef.value?.showMenu(e)
+    }
+}
+
+//鼠标右键菜单被点击
+const handleMenuSelect = ({key}) => {
+    const node = treeRefNode.value;
+    const data = treeRefData.value;
+    emit('menuTap', {key, node, data})
+}
+
+const handleMenuClosed = () => {
+    const node = treeRefNode.value;
+    if (!isValueNull(node)) {
+        treeRefNode.value['showTreeMenu'] = false
+    }
+}
+
+//设置树菜单的标记数据
+const removeElTreeNode = (key) => {
+    //根据 data 或者 key 拿到 Tree 组件中的 node
+    let node = ElTreeRef.value.getNode(key)
+    //删除 Tree 中的一个节点,使用此方法必须设置 node-key 属性
+    ElTreeRef.value.remove(node)
+}
+
+// 暴露出去
+defineExpose({
+    removeElTreeNode
+})
+</script>
+
+<style lang="scss" scoped>
+@import "../../styles/app/tree.scss";
+.el-radio-group {
+    width: auto;
+   
+}
+.data-custom-tree-node {
+    .label{
+        line-height: 30px;
+    }
+    .menu-icon {
+        position: absolute;
+        pointer-events: none;
+        transition: opacity 0.2s;
+        opacity: 0;
+        right: 0;
+        background: rgba(255, 255, 255, 0.25);
+        border-radius: 2px;
+        .cu-tree-node-popover-menu-icon {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+    }
+    &:hover {
+        .menu-icon {
+            opacity: 1;
+            pointer-events: all;
+            cursor: context-menu;
+        }
+    }
+    .menu-icon.show {
+        opacity: 1;
+        pointer-events: all;
+        cursor: context-menu;
+    }
+        .menu-icon1 {
+        // position: absolute;
+        vertical-align: bottom;
+        display:inline-block;
+        pointer-events: none;
+        transition: opacity 0.2s;
+        opacity: 0;
+        // right: 0;
+        background: rgba(255, 255, 255, 0.25);
+        border-radius: 2px;
+        .cu-tree-node-popover-menu-icon {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+    }
+    &:hover {
+        .menu-icon1 {
+            opacity: 1;
+            pointer-events: all;
+            cursor: context-menu;
+        }
+    }
+    .menu-icon1.show {
+        opacity: 1;
+        pointer-events: all;
+        cursor: context-menu;
+    }
+}
+</style>

+ 8 - 0
src/config/app.js

@@ -0,0 +1,8 @@
+import theme from './theme';
+
+//默认配置
+export default {
+    theme: 'light', //用户可选择类型:auto,light, dark
+    color: theme.color[0],
+    homeTheme: theme.home[0]
+}

+ 25 - 0
src/config/theme.js

@@ -0,0 +1,25 @@
+import config from '~src/config/index';
+
+//主题配置
+export default {
+    color: [
+        {name: 'green', color: '#1ECC95', label: '森绿'}, {name: 'blue', color: '#0081ff', label: '海蓝'},
+        {name: 'cyan', color: '#37c0fe', label: '天青'}, {name: 'purple', color: '#8044de', label: '姹紫'},
+        {name: 'mauve', color: '#b745cb', label: '木槿'}, {name: 'pink', color: '#e03997', label: '桃粉'},
+        {name: 'red', color: '#e54d42', label: '嫣红'}, {name: 'orange', color: '#f37b1d', label: '橘橙'},
+        {name: 'yellow', color: '#fbbd08', label: '明黄'}, {name: 'brown', color: '#a5673f', label: '棕褐'}
+    ],
+    home: [
+        {name: 'theme-1', bg: `${config.ossUrl}/upload/20221008/9f223d74916b7508a7ae4120d8cb71e3.jpg`},
+        {name: 'theme-2', bg: `${config.ossUrl}/upload/20220623/1eec681ebe2581d2e69752f0491010a8.jpg`},
+        {name: 'theme-3', bg: `${config.ossUrl}/upload/20221008/6ad0567af950c67b643eff5cec54cb4c.jpg`},
+        {name: 'theme-4', bg: `${config.ossUrl}/upload/20221008/a9b7d291459725b2ad6e098b5c95163f.jpg`},
+        {name: 'theme-5', bg: `${config.ossUrl}/upload/20221008/db82718cc12a95939a8e74a499725d01.jpg`},
+        {name: 'theme-6', bg: `${config.ossUrl}/upload/20221008/e8059aa4a4b50fb153095b9b05e891d4.jpg`},
+        {name: 'theme-7', bg: `${config.ossUrl}/upload/20221008/e5dbf99038c346b875d72e96efcf4a12.jpg`},
+        {name: 'theme-8', bg: `${config.ossUrl}/upload/20221008/e0d88163f4e678a233c510389af556e2.jpg`},
+        {name: 'theme-9', bg: `${config.ossUrl}/upload/20221008/45073e66f18787d1437ef37294edb5ac.jpg`},
+        {name: 'theme-10', bg: `${config.ossUrl}/upload/20221008/4201b40b869c5346ee1ee19f44c73a6a.jpg`},
+        {name: 'theme-11', bg: `${config.ossUrl}/upload/20221008/fd8d568edf61d6824a5a2e3e8e4a0ec4.jpg`},
+    ],
+}

+ 74 - 0
src/global/components/hc-auto-complete/index.vue

@@ -0,0 +1,74 @@
+<template>
+    <el-autocomplete :class="[block ? 'block' : '', ui]" v-model="modelValues" :fetch-suggestions="queryFetch" :value-key="keys" :placeholder="placeholder" @select="handleFetchSelect" @change="handleFetchChange"/>
+</template>
+
+<script setup>
+import {ref,watch} from "vue";
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    modelValue: {
+        type: String,
+        default: ''
+    },
+    datas: {
+        type: Array,
+        default: () => ([])
+    },
+    keys: {
+        type: String,
+        default: 'userName'
+    },
+    placeholder: {
+        type: String,
+        default: '请选择或输入'
+    },
+    block: {
+        type: Boolean,
+        default: true
+    },
+})
+
+//初始变量
+const queryData = ref(props.datas)
+const modelValues = ref(props.modelValue)
+
+//监听
+watch(() => [
+    props.datas,
+    props.modelValue,
+], ([datas, val]) => {
+    queryData.value = datas;
+    modelValues.value = val;
+})
+
+//数据筛选处理
+const queryFetch = (key, cb) => {
+    const results = key ? queryData.value.filter(createFilter(key)) : queryData.value
+    cb(results)
+}
+const createFilter = (key) => {
+    return (item) => {
+        const str = item[props.keys]
+        return (str.toLowerCase().indexOf(key.toLowerCase()) === 0)
+    }
+}
+
+//事件
+const emit = defineEmits(['change', 'update:modelValue'])
+
+//被选择
+const handleFetchSelect = (item) => {
+    const str = item[props.keys]
+    emit('update:modelValue', str)
+    emit('change', str)
+}
+
+//失去焦点
+const handleFetchChange = (val) => {
+    emit('update:modelValue', val)
+    emit('change', val)
+}
+</script>

+ 174 - 0
src/global/components/hc-card/index.vue

@@ -0,0 +1,174 @@
+<template>
+    <el-card class="hc-card-box" shadow="never"
+             :class="[
+                 (isSlotHeader || title || isSlotExtra || extraText)?'is-header':'',
+                  isSlotSearchBar?'is-search-bar':'',
+                   `is-action-${actionSize}`,
+                   ui
+             ]"
+    >
+        <template #header v-if="isSlotHeader || title || isSlotExtra || extraText">
+            <div class="hc-card-header-box">
+                <div class="hc-card-header">
+                    <div class="title text-lg" v-if="!isSlotHeader && title">{{ title }}</div>
+                    <slot v-if="isSlotHeader" name='header'/>
+                </div>
+                <div class="hc-card-header-extra" v-if="isSlotExtra || extraText">
+                    <div class="extra" v-if="!isSlotExtra && extraText">{{ extraText }}</div>
+                    <slot v-if="isSlotExtra" name='extra'/>
+                </div>
+            </div>
+        </template>
+        <div class="hc-card-search-bar" v-if="isSlotSearchBar">
+            <slot name='search'/>
+        </div>
+        <div class="hc-card-main-box" :id="idRef" :class="isSlotAction?'is-action':''">
+            <template v-if="scrollbar">
+                <el-scrollbar>
+                    <slot></slot>
+                </el-scrollbar>
+            </template>
+            <template v-else>
+                <slot></slot>
+            </template>
+        </div>
+        <div class="hc-card-action-box" :class="actionUi" v-if="isSlotAction">
+            <slot name='action'/>
+        </div>
+    </el-card>
+</template>
+
+<script setup>
+import {ref,useSlots} from "vue";
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    title: {
+        type: [String,Number],
+        default: ''
+    },
+    extraText: {
+        type: [String,Number],
+        default: ''
+    },
+    scrollbar: {
+        type: Boolean,
+        default: false
+    },
+    actionSize: {
+        type: [String,Number],
+        default: 'lg'
+    },
+    idRef: {
+        type: [String,Number],
+        default: ''
+    },
+    actionUi: {
+        type: String,
+        default: ''
+    },
+})
+
+const slots = useSlots()
+
+//判断<slot>是否有传值
+const isSlotHeader = ref(!!slots.header);
+const isSlotExtra = ref(!!slots.extra);
+const isSlotAction = ref(!!slots.action);
+const isSlotSearchBar = ref(!!slots.search);
+</script>
+
+<style lang="scss">
+.hc-card-box.el-card {
+    height: 100%;
+    position: relative;
+    --el-card-padding: 24px;
+    --el-card-bg-color: #f1f5f8;
+    --el-card-border-radius: 10px;
+    --el-text-color-primary: #1A1A1A;
+    box-shadow: -2px 0 10px 0 rgba(32,37,50,0.03), 0 10px 21px 20px rgba(32,37,50,0.03);
+    border: 0;
+    .el-card__header {
+        height: 70px;
+        padding: 14px 24px;
+        border-bottom: 1px solid #e9e9e9;
+        overflow-x: auto;
+        overflow-y: hidden;
+    }
+    .hc-card-header-box {
+        position: relative;
+        display: flex;
+        align-items: center;
+        height: 100%;
+        .hc-card-header {
+            position: relative;
+            flex: 1;
+            display: flex;
+            align-items: center;
+        }
+        .hc-card-header-extra {
+            position: relative;
+            display: flex;
+            align-items: center;
+            margin-left: 24px;
+        }
+    }
+    .el-card__body {
+        position: relative;
+        height: 100%;
+        .hc-card-search-bar {
+            position: relative;
+            margin-bottom: 20px;
+            display: flex;
+            align-items: center;
+            overflow-x: auto;
+            overflow-y: hidden;
+        }
+        .hc-card-main-box {
+            position: relative;
+            height: 100%;
+        }
+        .hc-card-action-box {
+            position: absolute;
+            height: auto;
+            margin: -24px;
+            width: 100%;
+            bottom: 24px;
+            padding: 20px 24px;
+            border-top: 1px solid #e9e9e9;
+            background-color: #f1f5f8;
+        }
+    }
+    &.is-header .el-card__body {
+        height: calc(100% - 70px);
+    }
+    &.is-header .el-card__body .hc-card-main-box:not(.is-action) {
+        height: 100%;
+    }
+    &.is-action-df .el-card__body .hc-card-main-box.is-action {
+        height: calc(100% - 63.5px);
+    }
+    &.is-action-lg .el-card__body .hc-card-main-box.is-action {
+        height: calc(100% - 80px);
+    }
+    &.is-search-bar.is-action-df .el-card__body .hc-card-main-box {
+        height: calc(100% - 40px);
+        &.is-action {
+            height: calc(100% - 124px);
+        }
+    }
+    &.is-search-bar.is-action-lg .el-card__body .hc-card-main-box {
+        height: calc(100% - 40px);
+        &.is-action {
+            height: calc(100% - 124px);
+        }
+    }
+}
+.hc-card-box.el-card:not(.is-header) {
+    .el-card__body {
+        height: 100%;
+    }
+}
+</style>

+ 110 - 0
src/global/components/hc-card/item.vue

@@ -0,0 +1,110 @@
+<template>
+    <div class="hc-card-item-box"
+         :class="[
+             (isSlotHeader || title || isSlotExtra || extraText)?'is-header':'',
+             isSlotAction ? 'is-action' : '', ui
+         ]">
+        <div class="hc-card-item-header" v-if="isSlotHeader || title || isSlotExtra || extraText">
+            <div class="item-header">
+                <span v-if="!isSlotHeader && title">{{ title }}</span>
+                <slot v-if="isSlotHeader" name='header'/>
+            </div>
+            <div class="item-extra" v-if="isSlotExtra || extraText">
+                <span v-if="!isSlotExtra && extraText">{{ extraText }}</span>
+                <slot v-if="isSlotExtra" name='extra'/>
+            </div>
+        </div>
+        <div class="hc-card-item-body">
+            <template v-if="scrollbar">
+                <el-scrollbar>
+                    <slot></slot>
+                </el-scrollbar>
+            </template>
+            <template v-else>
+                <slot></slot>
+            </template>
+        </div>
+        <div class="hc-card-item-action" v-if="isSlotAction">
+            <slot name='action'/>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import {ref,useSlots} from "vue";
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    title: {
+        type: [String,Number],
+        default: ''
+    },
+    extraText: {
+        type: [String,Number],
+        default: ''
+    },
+    scrollbar: {
+        type: Boolean,
+        default: false
+    },
+})
+
+const slots = useSlots()
+
+//判断<slot>是否有传值
+const isSlotHeader = ref(!!slots.header);
+const isSlotExtra = ref(!!slots.extra);
+const isSlotAction = ref(!!slots.action);
+</script>
+
+<style lang="scss" scoped>
+.hc-card-item-box {
+    position: relative;
+    height: 100%;
+    background: #E7EEF4;
+    border-radius: 10px;
+    padding: 14px;
+    .hc-card-item-header {
+        position: relative;
+        font-weight: bold;
+        display: flex;
+        align-items: center;
+        height: 32px;
+        margin-bottom: 14px;
+        color: var(--el-color-primary-dark-2);
+        .item-header {
+            flex: 1;
+            position: relative;
+            display: flex;
+            align-items: center;
+        }
+        .item-extra {
+            position: relative;
+            display: flex;
+            align-items: center;
+            margin-left: 120px;
+        }
+    }
+    .hc-card-item-body {
+        position: relative;
+        height: 100%;
+        overflow: hidden;
+    }
+    .hc-card-item-action {
+        position: relative;
+        margin-top: 18px;
+        height: 32px;
+    }
+    &.is-header:not(.is-action),
+    &.is-action:not(.is-header) {
+        .hc-card-item-body {
+            height: calc(100% - 46px);
+        }
+    }
+    &.is-header.is-action .hc-card-item-body {
+        height: calc(100% - 46px - 50px);
+    }
+}
+</style>

+ 168 - 0
src/global/components/hc-context-menu/index.vue

@@ -0,0 +1,168 @@
+<template>
+    <div class="hc-context-menu-box" :class="ui" :id="uuid" v-click-outside="onClickOutside">
+        <template v-for="item in menus">
+            <div class="hc-context-menu-item" @click.stop="optionClicked(item)">
+                <slot :name='item.key' :item="item" v-if="item.isSlot"/>
+                <template v-else>
+                    <HcIcon :name="item.icon" class="menu-item-icon" v-if="item.icon"/>
+                    <span class="menu-item-name">{{item.label}}</span>
+                </template>
+            </div>
+        </template>
+    </div>
+</template>
+
+<script setup>
+import {ref, useSlots, watch, nextTick, onMounted, onBeforeUnmount} from "vue";
+import {ClickOutside as vClickOutside} from 'element-plus'
+import {getRandom, deepClone} from "vue-utils-plus"
+
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    datas: {
+        type: Array,
+        default: () => ([])
+    }
+})
+
+//初始变量
+const uuid = getRandom()
+const menus = ref(props.datas)
+
+//监听表头
+watch(() => [
+    props.datas
+], ([datas]) => {
+    setIsSlots(datas)
+})
+
+//加载完成
+nextTick(()=>{
+    setIsSlots(props.datas)
+})
+
+//渲染完成
+onMounted(()=>{
+    document.body.addEventListener('keyup', onEscKeyRelease);
+})
+
+//判断<slot>是否有传值
+const slots = useSlots()
+const setIsSlots = (datas) => {
+    let arr = deepClone(datas)
+    for (let i = 0; i < arr.length; i++) {
+        arr[i].isSlot = !!slots[arr[i].key]
+    }
+    menus.value = arr
+}
+
+//显示菜单
+const showMenu = (event) => {
+    let menu = document.getElementById(uuid);
+    if (!menu) return;
+    //取宽高
+    menu.style.visibility = 'hidden';
+    menu.style.display = 'block';
+    let menuWidth = menu.offsetWidth;
+    let menuHeight = menu.offsetHeight;
+    menu.removeAttribute('style');
+    //宽
+    if (menuWidth + event.pageX >= window.innerWidth) {
+        menu.style.left = event.pageX - menuWidth + 2 + 'px';
+    } else {
+        menu.style.left = event.pageX - 2 + 'px';
+    }
+    //高
+    if (menuHeight + event.pageY >= window.innerHeight) {
+        menu.style.top = event.pageY - menuHeight + 2 + 'px';
+    } else {
+        menu.style.top = event.pageY - 2 + 'px';
+    }
+    menu.classList.add('active');
+}
+
+//事件
+const emit = defineEmits(['closed', 'item-click'])
+
+const hideContextMenu = () => {
+    const element = document.getElementById(uuid);
+    if (element) {
+        element.classList.remove('active');
+        emit('closed')
+    }
+}
+
+const onClickOutside = () => {
+    hideContextMenu()
+}
+
+//菜单被点击
+const optionClicked = (item) => {
+    hideContextMenu()
+    emit('item-click', item)
+}
+
+const onEscKeyRelease = (event) => {
+    if (event.keyCode === 27) {
+        hideContextMenu()
+    }
+}
+
+//卸载之前
+onBeforeUnmount(() => {
+    document.removeEventListener('keyup', onEscKeyRelease);
+})
+
+// 暴露出去
+defineExpose({
+    showMenu
+})
+</script>
+
+<style lang="scss" scoped>
+.hc-context-menu-box {
+    position: fixed;
+    background-color: #fff;
+    border-radius: 4px;
+    width: max-content;
+    display: none;
+    left: 0;
+    top: 0;
+    box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
+    z-index: 1000000;
+    &.active {
+        display: block;
+    }
+    .hc-context-menu-item {
+        align-items: center;
+        padding: 5px 15px;
+        display: flex;
+        cursor: pointer;
+        position: relative;
+        height: 40px;
+        font-size: 16px;
+        color: #333639;
+        .menu-item-icon {
+            margin-right: 6px;
+        }
+        &:hover {
+            background-color: #f3f3f5;
+        }
+        &:first-of-type {
+            margin-top: 4px;
+        }
+        &:last-of-type {
+            margin-bottom: 4px;
+        }
+    }
+}
+</style>
+
+<style lang="scss">
+.hc-context-menu-box .hc-context-menu-item .menu-item-icon {
+    margin-right: 6px;
+}
+</style>

+ 154 - 0
src/global/components/hc-counter/index.vue

@@ -0,0 +1,154 @@
+<template>
+    <div class="hc-counter-box" :class="[block?'hc-counter-block':'', size, ui]">
+        <div class="counter-box">
+            <div class="counter-btn first" :disabled="modelValues <= 1" @click="moveBtnClick">-</div>
+            <div class='counter-val w-20'>
+                <span>{{modelValues}}</span>
+                <span class="ml-2" v-if="text">{{text}}</span>
+            </div>
+            <div class="counter-btn end" @click="addBtnClick">+</div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import {nextTick, ref, watch} from "vue";
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    modelValue: {
+        type: [String,Number],
+        default: 1
+    },
+    text: {
+        type: String,
+        default: ''
+    },
+    block: {
+        type: Boolean,
+        default: false
+    },
+    size: {
+        type: String,
+        default: ''
+    },
+})
+
+const modelValues = ref(1)
+
+nextTick(() => {
+    setModelVal(props.modelValue)
+})
+
+//监听
+watch(() => [
+    props.modelValue,
+], ([val]) => {
+    setModelVal(val)
+})
+
+//转换
+const setModelVal = (val) => {
+    modelValues.value = Number(val)
+    setEmitData(val)
+}
+
+const emit = defineEmits(['update:modelValue','addClick','moveClick', 'change'])
+
+//减少
+const moveBtnClick = () => {
+    let val = modelValues.value - 1;
+    if (val < 1) {
+        modelValues.value =  1;
+    } else {
+        modelValues.value =  val;
+        setEmitData(val)
+    }
+}
+
+//增加
+const addBtnClick = () => {
+    let val = modelValues.value + 1;
+    modelValues.value =  val;
+    setEmitData(val)
+}
+
+//事件
+const setEmitData = (val) => {
+    emit('update:modelValue', val)
+    emit('addClick', val)
+    emit('change', val)
+}
+
+</script>
+
+<style lang="scss" scoped>
+.hc-counter-box {
+    position: relative;
+    display: inline-block;
+    height: 32px;
+    .counter-box {
+        display: flex;
+        align-items: center;
+        height: inherit;
+        color: #000000;
+        .counter-btn {
+            height: 32px;
+            width: 32px;
+            border: 1px solid #dddfe6;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 22px;
+            font-weight: 100;
+            cursor: pointer;
+            user-select: none;
+            background-color: white;
+            transition: color 0.2s, background-color 0.2s;
+            &.first {
+                border-radius: 4px 0 0 4px;
+            }
+            &.end {
+                border-radius: 0 4px 4px 0;
+            }
+            &:hover {
+                color: var(--el-color-primary);
+                background-color: var(--el-color-primary-light-8);
+            }
+            &[disabled=true] {
+                cursor: not-allowed;
+                color: #c5c5c5;
+                background-color: #f3f3f3;
+            }
+        }
+        .counter-val {
+            height: inherit;
+            border-top: 1px solid #dddfe6;
+            border-bottom: 1px solid #dddfe6;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+    }
+    &.hc-counter-block {
+        width: 100%;
+        .counter-box {
+            width: 100%;
+            .counter-val {
+                width: auto;
+                flex: 1;
+            }
+        }
+    }
+    &.large {
+        height: 40px;
+        .counter-btn {
+            height: 40px;
+            width: 40px;
+            font-size: 26px;
+        }
+    }
+}
+</style>

+ 64 - 0
src/global/components/hc-date-picker/index.vue

@@ -0,0 +1,64 @@
+<template>
+    <el-date-picker class="hc-date-picker" v-model="betweenDate" :type="isType" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" :clearable="isClearable" :value-format="isFormat" @change="betweenDateUpdate"/>
+</template>
+
+<script setup>
+import { ref,watch } from "vue";
+const props = defineProps({
+    dates: {
+        type: Array,
+        default: () => ([])
+    },
+    clearable: {
+        type: Boolean,
+        default: false
+    },
+    type: {
+        type: String,
+        default: 'daterange'
+    },
+    format: {
+        type: String,
+        default: 'YYYY-MM-DD'
+    },
+})
+
+//初始变量
+const betweenDate = ref(props.dates)
+const isType = ref(props.type)
+const isFormat = ref(props.format)
+const isClearable = ref(props.clearable)
+
+//监听
+watch(() => [
+    props.dates,
+    props.type,
+    props.format,
+    props.clearable,
+], ([dates,type,format,clearable]) => {
+    betweenDate.value = dates
+    isType.value = type
+    isFormat.value = format
+    isClearable.value = clearable
+})
+
+//事件
+const emit = defineEmits(['change'])
+const betweenDateUpdate = (arr) => {
+    let res = arr ?? [], query = '';
+    let obj = {start: null, end: null}
+    if (res.length > 0) {
+        obj = {start: res[0], end: res[1]}
+    }
+    if (obj['start'] && obj['end']) {
+        query = `${obj['start']}~${obj['end']}`
+    }
+    emit('change', {val: obj, arr: res, query})
+}
+</script>
+
+<style lang="scss">
+.hc-date-picker.el-range-editor.el-input__wrapper {
+    width: 100%;
+}
+</style>

+ 179 - 0
src/global/components/hc-dialog/index.vue

@@ -0,0 +1,179 @@
+<template>
+    <el-dialog v-model="isShow" class="hc-modal-border" :class="[isTable?'hc-modal-table':'', isSlotExtra?'hc-modal-header-extra':'', padding ? '':'hc-modal-no-padding', ui]" :append-to-body="appendToBody"
+               :style="isBgColor?'--el-dialog-bg-color:' + isBgColor:''" :title="title" :show-close="isClose" :width="isWidth" draggable destroy-on-close @closed="dialogClosed">
+        <template #header v-if="isSlotHeader || isSlotExtra">
+            <slot name='header' v-if="isSlotHeader"/>
+            <div role="heading" class="el-dialog__title" v-if="!isSlotHeader && isSlotExtra">{{title}}</div>
+            <slot name='extra' v-if="isSlotExtra"/>
+        </template>
+        <slot></slot>
+        <template #footer v-if="footer">
+            <slot name='footer' v-if="isSlotFooter"/>
+            <div class="lr-dialog-footer" v-else-if="isRowFooter">
+                <div class="left">
+                    <slot name='leftRowFooter'/>
+                </div>
+                <div class="right flex">
+                    <slot name='rightRowFooter'/>
+                </div>
+            </div>
+            <div class="dialog-footer" :class="isFooterCenter?'text-center':''" v-else>
+                <el-button size="large" @click="cancelClick">
+                    <HcIcon name="close"/>
+                    <span>{{cancelText}}</span>
+                </el-button>
+                <el-button type="primary" hc-btn :loading="isLoading" @click="saveClick">
+                    <HcIcon name="check"/>
+                    <span>{{saveText}}</span>
+                </el-button>
+            </div>
+        </template>
+    </el-dialog>
+</template>
+
+<script setup>
+import {ref, watch, useSlots} from "vue";
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    show: {
+        type: Boolean,
+        default: false
+    },
+    title: {
+        type: [String,Number],
+        default: 'dialog'
+    },
+    widths: {
+        type: String,
+        default: '38rem'
+    },
+    loading: {
+        type: Boolean,
+        default: false
+    },
+    footer: {
+        type: Boolean,
+        default: true
+    },
+    cancelText: {
+        type: [String,Number],
+        default: '取消'
+    },
+    saveText: {
+        type: [String,Number],
+        default: '提交'
+    },
+    bgColor: {
+        type: [String,Number],
+        default: '#f1f5f8'
+    },
+    isTable: {
+        type: Boolean,
+        default: false
+    },
+    isRowFooter: {
+        type: Boolean,
+        default: false
+    },
+    isClose: {
+        type: Boolean,
+        default: true
+    },
+    padding: {
+        type: Boolean,
+        default: true
+    },
+    isFooterCenter: {
+        type: Boolean,
+        default: false
+    },
+    appendToBody: {
+        type: Boolean,
+        default: false
+    },
+    cancelClose: {
+        type: Boolean,
+        default: true
+    },
+})
+
+//变量
+const isShow = ref(props.show)
+const isWidth = ref(props.widths)
+const isLoading = ref(props.loading)
+const isBgColor = ref(props.bgColor)
+
+//监听
+watch(() => [
+    props.show,
+    props.widths,
+    props.loading,
+    props.bgColor,
+], ([show, width, loading, bgColor]) => {
+    isShow.value = show
+    isWidth.value = width
+    isLoading.value = loading
+    isBgColor.value = bgColor
+})
+
+//判断<slot>是否有传值
+const slots = useSlots()
+const isSlotHeader = ref(!!slots.header);
+const isSlotExtra = ref(!!slots.extra);
+const isSlotFooter = ref(!!slots.footer);
+
+const emit = defineEmits(['close', 'cancel', 'save'])
+
+//取消
+const cancelClick = () => {
+    if (props.cancelClose) {
+        dialogClosed()
+        emit('cancel')
+    } else {
+        emit('cancel')
+    }
+}
+
+//关闭
+const dialogClosed = () => {
+    isShow.value = false
+    emit('close', false)
+}
+
+//按钮保存
+const saveClick = () => {
+    emit('save')
+}
+</script>
+
+<style lang="scss">
+.el-overlay-dialog {
+    .el-dialog.hc-modal-border.hc-modal-header-extra,
+    .el-dialog.hc-modal-header-extra {
+        .el-dialog__header {
+            position: relative;
+            display: flex;
+            align-items: center;
+            padding: 8px var(--el-dialog-padding-primary);
+            .el-dialog__title {
+                flex: 1;
+            }
+            .el-dialog__headerbtn {
+                position: relative;
+                top: initial;
+                right: initial;
+                width: auto;
+                height: inherit;
+                margin-left: 24px;
+                font-size: 18px;
+            }
+        }
+    }
+    .el-dialog.hc-modal-no-padding .el-dialog__body {
+        padding: 0;
+    }
+}
+</style>

+ 176 - 0
src/global/components/hc-drag-modal/index.vue

@@ -0,0 +1,176 @@
+<template>
+    <div class="ui-drag-modal-box-hide" v-if="isBody">
+        <Teleport to="#app">
+            <div class="ui-drag-modal-box" :class="[isModalShow?'ui-drag-modal-show':'']" :id="'drag-modal-' + uuid"
+                 :style="{left: dragModalLeft + 'px', top: dragModalTop + 'px', width: widthVal + 'px', height: heightVal + 'px'}">
+                <div class="ui-drag-modal-dialog shadow-xl" :class="[bg,ui]" :style="{width: widthVal + 'px', height: heightVal + 'px'}" @mousedown="dragModalMouseDown">
+                    <div class="ui-drag-modal-dialog-header" :class="titleBorder?'border-bottom':''">
+                        <div class="ui-drag-modal-dialog-title text-lg" :class="titleUi">
+                            <span v-if="title">{{title}}</span>
+                        </div>
+                        <div class="ui-drag-modal-dialog-close" v-if="closeIcon" @click="_closeClick()">
+                            <HcIcon name="close"/>
+                        </div>
+                    </div>
+                    <div class="ui-drag-modal-dialog-body" @mousedown.stop="dragModalBodyMouseDown">
+                        <slot></slot>
+                    </div>
+                    <span class="ui-drag-modal-resize" @mousedown="dragModalResizeMouseDown"/>
+                </div>
+            </div>
+        </Teleport>
+    </div>
+</template>
+
+<script setup>
+import { ref,nextTick,watch } from "vue"
+import { getRandom } from "vue-utils-plus"
+//参数
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    bg: {
+        type: String,
+        default: ''
+    },
+    widths: {
+        type: [Number,String],
+        default: 340
+    },
+    title: {
+        type: String,
+        default: ''
+    },
+    titleUi: {
+        type: [String,Object,Array],
+        default: ''
+    },
+    titleBorder: {
+        type: Boolean,
+        default: false
+    },
+    closeIcon: {
+        type: Boolean,
+        default: false
+    },
+    isShow: {
+        type: Boolean,
+        default: false
+    },
+    lefts: {
+        type: [Number,String],
+        default: 0
+    },
+    tops: {
+        type: [Number,String],
+        default: 0
+    },
+})
+
+//变量
+const uuid = getRandom()
+const isBody = ref(false)
+const isModalShow = ref(props.isShow)
+const dragModalLeft = ref(parseInt(props.lefts + ''))
+const dragModalTop = ref(parseInt(props.tops + ''))
+const widthVal = ref(parseInt(props.widths + ''))
+const heightVal = ref(440)
+
+//监听
+watch(() => props.isShow, (isShow) => {
+    isModalShow.value = isShow;
+})
+
+//
+nextTick(()=> {
+    //页面渲染完成后,再让 vue3 的 Teleport,把弹出框挂载到外部节点上。
+    isBody.value = true
+})
+
+//弹窗拖动
+const dragModalMouseDown = (event) => {
+    // 阻止默认事件和冒泡
+    event.preventDefault()
+    event.stopPropagation()
+    //获取相关dom元素
+    let body = document.body, dom = document.getElementById('drag-modal-' + uuid)
+    // 鼠标按下,计算当前元素距离可视区的距离
+    const disX = event.clientX - dom.offsetLeft, disY = event.clientY - dom.offsetTop;
+    const lefts = body.clientWidth - dom.clientWidth, tops = body.clientHeight - dom.clientHeight;
+    document.onmousemove = (ve) => {
+        // 通过事件委托,计算移动的距离
+        let left = ve.clientX - disX, top = ve.clientY - disY
+        // 判断是否超出可视区
+        if (left <= 0) left = 0
+        if (left > lefts) {
+            left = lefts
+        }
+
+        if (top <= 0) top = 0
+        if (top > tops) {
+            top = tops
+        }
+        // 移动当前元素
+        dragModalLeft.value = left
+        dragModalTop.value = top
+    }
+    document.onmouseup = () => {
+        document.onmousemove = null;
+        document.onmouseup = null;
+    }
+}
+
+//禁止拖动
+const dragModalBodyMouseDown = () => {}
+
+
+//弹窗改变宽高
+const dragModalResizeMouseDown = (event) => {
+    // 阻止默认事件和冒泡
+    event.preventDefault()
+    event.stopPropagation()
+    //获取相关dom元素
+    let body = document.body, dom = document.getElementById('drag-modal-' + uuid)
+    let clientX = event.clientX, clientY = event.clientY;
+    let offsetWidth = dom.offsetWidth, clientHeight = dom.clientHeight;
+    document.onmousemove = (e) => {
+        //拖拽时为了对宽和高 限制一下范围,定义两个变量
+        let W =  e.clientX - clientX + offsetWidth;
+        let H =  e.clientY - clientY + clientHeight;
+
+        if(body.offsetWidth - e.clientX < 0){
+            W = body.offsetWidth - parseInt(dom.style.marginLeft);
+        }
+        if(body.offsetHeight - e.clientY < 0){
+            H = body.offsetHeight - parseInt(dom.style.marginTop);
+        }
+
+        widthVal.value = W;// 拖拽后物体的宽
+        heightVal.value = H;// 拖拽后物体的高
+    }
+    document.onmouseup = () => {
+        document.onmousemove = null;
+        document.onmouseup = null;
+    }
+}
+
+
+//事件
+const emit = defineEmits(['close'])
+const show = () => {
+    isModalShow.value = true;
+}
+const hide = () => {
+    isModalShow.value = false;
+}
+const _closeClick = () => {
+    hide();
+    emit('close', false)
+}
+</script>
+
+<style lang="scss" scoped>
+@import './modal.scss';
+</style>

+ 61 - 0
src/global/components/hc-drag-modal/modal.scss

@@ -0,0 +1,61 @@
+.ui-drag-modal-box-hide {
+    display: none;
+}
+.ui-drag-modal-box {
+    position: fixed;
+    top: 0;
+    left: 0;
+    opacity: 0;
+    z-index: -1024;
+    transition: opacity 0.3s, z-index 0.3s;
+    .ui-drag-modal-dialog {
+        position: relative;
+        min-width: 340px;
+        min-height: 380px;
+        display: inline-block;
+        border-radius: 5px;
+        z-index: 8001;
+        background: #f5f6f8;
+        box-shadow: 0 16px 24px 0 rgba(26,26,26,0.12), 0 2px 12px 0 rgba(26,26,26,0.10);
+        .ui-drag-modal-dialog-header {
+            position: relative;
+            display: flex;
+            align-items: center;
+            .ui-drag-modal-dialog-title {
+                flex: 1;
+                cursor: all-scroll;
+                user-select: none;
+                padding: 15px 14px 2px;
+            }
+            .ui-drag-modal-dialog-close {
+                display: flex;
+                align-items: center;
+                justify-content: flex-end;
+                cursor: pointer;
+                margin-right: 15px;
+                font-size: 20px;
+                transition: opacity 0.3s;
+                &:hover {
+                    opacity: .6;
+                }
+            }
+        }
+        .ui-drag-modal-dialog-body {
+            position: relative;
+            height: calc(100% - 75px);
+            margin: 14px;
+        }
+        .ui-drag-modal-resize {
+            position: absolute;
+            width: 15px;
+            height: 15px;
+            right: 0;
+            bottom: 0;
+            cursor: se-resize;
+        }
+    }
+    &.ui-drag-modal-show {
+        opacity: 1;
+        z-index: 8000;
+    }
+}

+ 138 - 0
src/global/components/hc-drawer/index.vue

@@ -0,0 +1,138 @@
+<template>
+    <Suspense v-if="isBody">
+        <Teleport :to="`#${toId}`">
+            <el-drawer ref="drawerRef" :modal-class="uis" :class="`hc-drawer-box ${ui}`" v-model="isShow" :with-header="false" :direction="direction" :size="size" destroy-on-close @closed="drawerClosed">
+                <HcCard :title="title" :extraText="extraText" :actionSize="actionSize" :scrollbar="scrollbar" :actionUi="actionUi" v-if="isCard">
+                    <template #header v-if="isSlotHeader">
+                        <slot name='header'/>
+                    </template>
+                    <template #extra v-if="isSlotExtra">
+                        <slot name='extra'/>
+                    </template>
+                    <template #search v-if="isSlotSearchBar">
+                        <slot name='search'/>
+                    </template>
+                    <template #action v-if="isSlotAction">
+                        <slot name='action'/>
+                    </template>
+                    <slot></slot>
+                </HcCard>
+                <slot v-if="!isCard"></slot>
+            </el-drawer>
+        </Teleport>
+    </Suspense>
+</template>
+
+<script setup>
+import {ref, nextTick, watch, useSlots} from "vue";
+const props = defineProps({
+    uis: {
+        type: String,
+        default: ''
+    },
+    ui: {
+        type: String,
+        default: ''
+    },
+    show: {
+        type: Boolean,
+        default: false
+    },
+    toId: {
+        type: [String,Number],
+        default: ''
+    },
+    title: {
+        type: [String,Number],
+        default: ''
+    },
+    //rtl / ltr / ttb / btt
+    direction: {
+        type: String,
+        default: 'ttb'
+    },
+    scrollbar: {
+        type: Boolean,
+        default: false
+    },
+    extraText: {
+        type: [String,Number],
+        default: ''
+    },
+    actionSize: {
+        type: [String,Number],
+        default: 'lg'
+    },
+    size: {
+        type: [String,Number],
+        default: '100%'
+    },
+    isCard: {
+        type: Boolean,
+        default: true
+    },
+    actionUi: {
+        type: String,
+        default: ''
+    },
+})
+
+//变量
+const isShow = ref(props.show)
+const isBody = ref(false)
+
+//监听
+watch(() => [
+    props.show
+], ([show]) => {
+    isShow.value = show
+})
+
+//渲染完成
+nextTick(()=> {
+    //页面渲染完成后,再让 vue3 的 Teleport,挂载到指定节点
+    isBody.value = true
+})
+
+//判断<slot>是否有传值
+const slots = useSlots()
+const isSlotHeader = ref(!!slots.header);
+const isSlotExtra = ref(!!slots.extra);
+const isSlotAction = ref(!!slots.action);
+const isSlotSearchBar = ref(!!slots.search);
+
+const drawerRef = ref(null)
+const emit = defineEmits(['close'])
+
+//关闭
+const drawerClosed = () => {
+    isShow.value = false
+    emit('close', false)
+}
+
+const handleClose = () => {
+    drawerRef.value?.handleClose()
+}
+
+// 暴露出去
+defineExpose({
+    handleClose
+})
+</script>
+
+<style lang="scss">
+.hc-card-box.el-card .el-card__body .hc-card-main-box .el-overlay {
+    position: absolute;
+    .hc-drawer-box.el-drawer {
+        background-color: transparent;
+        box-shadow: initial;
+        .el-drawer__body {
+            padding: 24px;
+            overflow: hidden;
+            .data-fill-list-box .el-collapse .el-collapse-item__wrap .el-collapse-item__content .data-fill-list-item-content {
+                height: calc(100vh - 545px);
+            }
+        }
+    }
+}
+</style>

+ 43 - 0
src/global/components/hc-icon/index.vue

@@ -0,0 +1,43 @@
+<template>
+    <i class="hc-icon-i" :class="[`ri-${nameVal}${isFill ? '-fill' : line ? '-line' : ''}`, hui]"></i>
+</template>
+
+<script setup>
+import { ref,watch } from "vue"
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    //图标名
+    name: {
+        type: [String,Number],
+        default: ''
+    },
+    //是否填充
+    fill: {
+        type: Boolean,
+        default: false
+    },
+    line: {
+        type: Boolean,
+        default: true
+    },
+})
+
+//初始变量
+const hui = ref(props.ui)
+const nameVal = ref(props.name)
+const isFill = ref(props.fill)
+
+//监听
+watch(() => [
+    props.ui,
+    props.name,
+    props.fill,
+], ([ui,name,fill]) => {
+    hui.value = ui;
+    nameVal.value = name;
+    isFill.value = fill;
+})
+</script>

+ 28 - 0
src/global/components/hc-img/index.vue

@@ -0,0 +1,28 @@
+<template>
+    <ElImage :class="ui" :src="src" :previewSrcList="srcs" :initial-index="index" :fit="fit" crossOrigin="anonymous"/>
+</template>
+
+<script setup>
+defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    src: {
+        type: String,
+        default: ''
+    },
+    srcs: {
+        type: Array,
+        default: () => ([])
+    },
+    index: {
+        type: [String,Number],
+        default: -1
+    },
+    fit: {
+        type: String,
+        default: 'cover'
+    },
+})
+</script>

+ 37 - 0
src/global/components/hc-loading/index.vue

@@ -0,0 +1,37 @@
+<template>
+    <div class="hc-loading-box">
+        <div class="loader-inner">
+            <div class="loader-icon-span">
+                <HcIcon class="loader-icon" name="loader-2"/>
+            </div>
+            <div class="loader-num">{{ nums }}%</div>
+            <div class="loader-tip">请稍等一下,系统正在为您分配本次验收抽检范围...</div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import {ref, watch} from "vue";
+
+const props = defineProps({
+    num: {
+        type: [String, Number],
+        default: 0
+    },
+})
+
+//变量
+const nums = ref(props.num)
+
+//监听
+watch(() => [
+    props.pages?.num,
+], ([num]) => {
+    nums.value = num;
+})
+
+</script>
+
+<style lang="scss" scoped>
+@import "./style.scss";
+</style>

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