commit 63df4f07ecf148c09a406812f6f7186210557fb3 Author: old burden Date: Wed Jan 14 14:58:41 2026 +0800 init diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9aeb564 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml new file mode 100644 index 0000000..b0c1c68 --- /dev/null +++ b/.idea/prettier.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/工程代码.iml b/.idea/工程代码.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/工程代码.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/admin-ui/.editorconfig b/admin-ui/.editorconfig new file mode 100644 index 0000000..7034f9b --- /dev/null +++ b/admin-ui/.editorconfig @@ -0,0 +1,22 @@ +# 告诉EditorConfig插件,这是根文件,不用继续往上查找 +root = true + +# 匹配全部文件 +[*] +# 设置字符集 +charset = utf-8 +# 缩进风格,可选space、tab +indent_style = space +# 缩进的空格数 +indent_size = 2 +# 结尾换行符,可选lf、cr、crlf +end_of_line = lf +# 在文件结尾插入新行 +insert_final_newline = true +# 删除一行中的前后空格 +trim_trailing_whitespace = true + +# 匹配md结尾的文件 +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/admin-ui/.env.development b/admin-ui/.env.development new file mode 100644 index 0000000..8951a26 --- /dev/null +++ b/admin-ui/.env.development @@ -0,0 +1,11 @@ +# 页面标题 +VUE_APP_TITLE = 管理系统 + +# 开发环境配置 +ENV = 'development' + +# 若依管理系统/开发环境 +VUE_APP_BASE_API = '/dev-api' + +# 路由懒加载 +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/admin-ui/.env.production b/admin-ui/.env.production new file mode 100644 index 0000000..8bda2ca --- /dev/null +++ b/admin-ui/.env.production @@ -0,0 +1,8 @@ +# 页面标题 +VUE_APP_TITLE = 管理系统 + +# 生产环境配置 +ENV = 'production' + +# 若依管理系统/生产环境 +VUE_APP_BASE_API = 'https://admin-api.undressing.name' diff --git a/admin-ui/.env.staging b/admin-ui/.env.staging new file mode 100644 index 0000000..a7ed22f --- /dev/null +++ b/admin-ui/.env.staging @@ -0,0 +1,12 @@ +# 页面标题 +VUE_APP_TITLE = 管理系统 + +BABEL_ENV = production + +NODE_ENV = production + +# 测试环境配置 +ENV = 'staging' + +# 若依管理系统/测试环境 +VUE_APP_BASE_API = '/api' diff --git a/admin-ui/.gitignore b/admin-ui/.gitignore new file mode 100644 index 0000000..78a752d --- /dev/null +++ b/admin-ui/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/admin-ui/README.md b/admin-ui/README.md new file mode 100644 index 0000000..00c0ab8 --- /dev/null +++ b/admin-ui/README.md @@ -0,0 +1,30 @@ +## 开发 + +```bash +# 克隆项目 +git clone https://gitee.com/y_project/RuoYi-Vue + +# 进入项目目录 +cd ruoyi-ui + +# 安装依赖 +npm install + +# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 +npm install --registry=https://registry.npmmirror.com + +# 启动服务 +npm run dev +``` + +浏览器访问 http://localhost:80 + +## 发布 + +```bash +# 构建测试环境 +npm run build:stage + +# 构建生产环境 +npm run build:prod +``` \ No newline at end of file diff --git a/admin-ui/babel.config.js b/admin-ui/babel.config.js new file mode 100644 index 0000000..c8267b2 --- /dev/null +++ b/admin-ui/babel.config.js @@ -0,0 +1,13 @@ +module.exports = { + presets: [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset' + ], + 'env': { + 'development': { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + 'plugins': ['dynamic-import-node'] + } + } +} \ No newline at end of file diff --git a/admin-ui/package.json b/admin-ui/package.json new file mode 100644 index 0000000..45fbb46 --- /dev/null +++ b/admin-ui/package.json @@ -0,0 +1,72 @@ +{ + "name": "ruoyi", + "version": "3.9.0", + "description": "若依管理系统", + "author": "若依", + "license": "MIT", + "scripts": { + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview" + }, + "keywords": [ + "vue", + "admin", + "dashboard", + "element-ui", + "boilerplate", + "admin-template", + "management-system" + ], + "repository": { + "type": "git", + "url": "https://gitee.com/y_project/RuoYi-Vue.git" + }, + "dependencies": { + "@riophae/vue-treeselect": "0.4.0", + "axios": "0.28.1", + "clipboard": "2.0.8", + "core-js": "3.37.1", + "echarts": "^5.4.0", + "element-ui": "2.15.14", + "file-saver": "2.0.5", + "fuse.js": "6.4.3", + "highlight.js": "9.18.5", + "js-beautify": "1.13.0", + "js-cookie": "3.0.1", + "jsencrypt": "3.0.0-rc.1", + "nprogress": "0.2.0", + "quill": "^2.0.2", + "screenfull": "5.0.2", + "sortablejs": "1.10.2", + "splitpanes": "2.4.1", + "vue": "^2.6.12", + "vue-count-to": "1.0.13", + "vue-cropper": "0.5.5", + "vue-router": "3.4.9", + "vue-template-compiler": "^2.6.12", + "vuedraggable": "2.24.3", + "vuex": "3.6.0" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.6", + "@vue/cli-service": "4.4.6", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "4.1.0", + "compression-webpack-plugin": "6.1.2", + "connect": "3.6.6", + "sass": "1.32.13", + "sass-loader": "10.1.1", + "script-ext-html-webpack-plugin": "2.1.5", + "svg-sprite-loader": "5.1.1" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ] +} diff --git a/admin-ui/public/favicon.ico b/admin-ui/public/favicon.ico new file mode 100644 index 0000000..e263760 Binary files /dev/null and b/admin-ui/public/favicon.ico differ diff --git a/admin-ui/public/html/ie.html b/admin-ui/public/html/ie.html new file mode 100644 index 0000000..052ffcd --- /dev/null +++ b/admin-ui/public/html/ie.html @@ -0,0 +1,46 @@ + + + + + + 请升级您的浏览器 + + + + + + +

请升级您的浏览器,以便我们更好的为您提供服务!

+

您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。

+
+

请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束

+

自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明

+
+

您可以选择更先进的浏览器

+

推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。

+ +
+ + \ No newline at end of file diff --git a/admin-ui/public/index.html b/admin-ui/public/index.html new file mode 100644 index 0000000..925455c --- /dev/null +++ b/admin-ui/public/index.html @@ -0,0 +1,208 @@ + + + + + + + + + <%= webpackConfig.name %> + + + + +
+
+
+
+
+
正在加载系统资源,请耐心等待
+
+
+ + diff --git a/admin-ui/public/robots.txt b/admin-ui/public/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/admin-ui/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/admin-ui/public/styles/theme-chalk/index.css b/admin-ui/public/styles/theme-chalk/index.css new file mode 100644 index 0000000..b78d5a9 --- /dev/null +++ b/admin-ui/public/styles/theme-chalk/index.css @@ -0,0 +1 @@ +@charset "UTF-8";[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:"\e6a0"}.el-icon-ice-cream-square:before{content:"\e6a3"}.el-icon-lollipop:before{content:"\e6a4"}.el-icon-potato-strips:before{content:"\e6a5"}.el-icon-milk-tea:before{content:"\e6a6"}.el-icon-ice-drink:before{content:"\e6a7"}.el-icon-ice-tea:before{content:"\e6a9"}.el-icon-coffee:before{content:"\e6aa"}.el-icon-orange:before{content:"\e6ab"}.el-icon-pear:before{content:"\e6ac"}.el-icon-apple:before{content:"\e6ad"}.el-icon-cherry:before{content:"\e6ae"}.el-icon-watermelon:before{content:"\e6af"}.el-icon-grape:before{content:"\e6b0"}.el-icon-refrigerator:before{content:"\e6b1"}.el-icon-goblet-square-full:before{content:"\e6b2"}.el-icon-goblet-square:before{content:"\e6b3"}.el-icon-goblet-full:before{content:"\e6b4"}.el-icon-goblet:before{content:"\e6b5"}.el-icon-cold-drink:before{content:"\e6b6"}.el-icon-coffee-cup:before{content:"\e6b8"}.el-icon-water-cup:before{content:"\e6b9"}.el-icon-hot-water:before{content:"\e6ba"}.el-icon-ice-cream:before{content:"\e6bb"}.el-icon-dessert:before{content:"\e6bc"}.el-icon-sugar:before{content:"\e6bd"}.el-icon-tableware:before{content:"\e6be"}.el-icon-burger:before{content:"\e6bf"}.el-icon-knife-fork:before{content:"\e6c1"}.el-icon-fork-spoon:before{content:"\e6c2"}.el-icon-chicken:before{content:"\e6c3"}.el-icon-food:before{content:"\e6c4"}.el-icon-dish-1:before{content:"\e6c5"}.el-icon-dish:before{content:"\e6c6"}.el-icon-moon-night:before{content:"\e6ee"}.el-icon-moon:before{content:"\e6f0"}.el-icon-cloudy-and-sunny:before{content:"\e6f1"}.el-icon-partly-cloudy:before{content:"\e6f2"}.el-icon-cloudy:before{content:"\e6f3"}.el-icon-sunny:before{content:"\e6f6"}.el-icon-sunset:before{content:"\e6f7"}.el-icon-sunrise-1:before{content:"\e6f8"}.el-icon-sunrise:before{content:"\e6f9"}.el-icon-heavy-rain:before{content:"\e6fa"}.el-icon-lightning:before{content:"\e6fb"}.el-icon-light-rain:before{content:"\e6fc"}.el-icon-wind-power:before{content:"\e6fd"}.el-icon-baseball:before{content:"\e712"}.el-icon-soccer:before{content:"\e713"}.el-icon-football:before{content:"\e715"}.el-icon-basketball:before{content:"\e716"}.el-icon-ship:before{content:"\e73f"}.el-icon-truck:before{content:"\e740"}.el-icon-bicycle:before{content:"\e741"}.el-icon-mobile-phone:before{content:"\e6d3"}.el-icon-service:before{content:"\e6d4"}.el-icon-key:before{content:"\e6e2"}.el-icon-unlock:before{content:"\e6e4"}.el-icon-lock:before{content:"\e6e5"}.el-icon-watch:before{content:"\e6fe"}.el-icon-watch-1:before{content:"\e6ff"}.el-icon-timer:before{content:"\e702"}.el-icon-alarm-clock:before{content:"\e703"}.el-icon-map-location:before{content:"\e704"}.el-icon-delete-location:before{content:"\e705"}.el-icon-add-location:before{content:"\e706"}.el-icon-location-information:before{content:"\e707"}.el-icon-location-outline:before{content:"\e708"}.el-icon-location:before{content:"\e79e"}.el-icon-place:before{content:"\e709"}.el-icon-discover:before{content:"\e70a"}.el-icon-first-aid-kit:before{content:"\e70b"}.el-icon-trophy-1:before{content:"\e70c"}.el-icon-trophy:before{content:"\e70d"}.el-icon-medal:before{content:"\e70e"}.el-icon-medal-1:before{content:"\e70f"}.el-icon-stopwatch:before{content:"\e710"}.el-icon-mic:before{content:"\e711"}.el-icon-copy-document:before{content:"\e718"}.el-icon-full-screen:before{content:"\e719"}.el-icon-switch-button:before{content:"\e71b"}.el-icon-aim:before{content:"\e71c"}.el-icon-crop:before{content:"\e71d"}.el-icon-odometer:before{content:"\e71e"}.el-icon-time:before{content:"\e71f"}.el-icon-bangzhu:before{content:"\e724"}.el-icon-close-notification:before{content:"\e726"}.el-icon-microphone:before{content:"\e727"}.el-icon-turn-off-microphone:before{content:"\e728"}.el-icon-position:before{content:"\e729"}.el-icon-postcard:before{content:"\e72a"}.el-icon-message:before{content:"\e72b"}.el-icon-chat-line-square:before{content:"\e72d"}.el-icon-chat-dot-square:before{content:"\e72e"}.el-icon-chat-dot-round:before{content:"\e72f"}.el-icon-chat-square:before{content:"\e730"}.el-icon-chat-line-round:before{content:"\e731"}.el-icon-chat-round:before{content:"\e732"}.el-icon-set-up:before{content:"\e733"}.el-icon-turn-off:before{content:"\e734"}.el-icon-open:before{content:"\e735"}.el-icon-connection:before{content:"\e736"}.el-icon-link:before{content:"\e737"}.el-icon-cpu:before{content:"\e738"}.el-icon-thumb:before{content:"\e739"}.el-icon-female:before{content:"\e73a"}.el-icon-male:before{content:"\e73b"}.el-icon-guide:before{content:"\e73c"}.el-icon-news:before{content:"\e73e"}.el-icon-price-tag:before{content:"\e744"}.el-icon-discount:before{content:"\e745"}.el-icon-wallet:before{content:"\e747"}.el-icon-coin:before{content:"\e748"}.el-icon-money:before{content:"\e749"}.el-icon-bank-card:before{content:"\e74a"}.el-icon-box:before{content:"\e74b"}.el-icon-present:before{content:"\e74c"}.el-icon-sell:before{content:"\e6d5"}.el-icon-sold-out:before{content:"\e6d6"}.el-icon-shopping-bag-2:before{content:"\e74d"}.el-icon-shopping-bag-1:before{content:"\e74e"}.el-icon-shopping-cart-2:before{content:"\e74f"}.el-icon-shopping-cart-1:before{content:"\e750"}.el-icon-shopping-cart-full:before{content:"\e751"}.el-icon-smoking:before{content:"\e752"}.el-icon-no-smoking:before{content:"\e753"}.el-icon-house:before{content:"\e754"}.el-icon-table-lamp:before{content:"\e755"}.el-icon-school:before{content:"\e756"}.el-icon-office-building:before{content:"\e757"}.el-icon-toilet-paper:before{content:"\e758"}.el-icon-notebook-2:before{content:"\e759"}.el-icon-notebook-1:before{content:"\e75a"}.el-icon-files:before{content:"\e75b"}.el-icon-collection:before{content:"\e75c"}.el-icon-receiving:before{content:"\e75d"}.el-icon-suitcase-1:before{content:"\e760"}.el-icon-suitcase:before{content:"\e761"}.el-icon-film:before{content:"\e763"}.el-icon-collection-tag:before{content:"\e765"}.el-icon-data-analysis:before{content:"\e766"}.el-icon-pie-chart:before{content:"\e767"}.el-icon-data-board:before{content:"\e768"}.el-icon-data-line:before{content:"\e76d"}.el-icon-reading:before{content:"\e769"}.el-icon-magic-stick:before{content:"\e76a"}.el-icon-coordinate:before{content:"\e76b"}.el-icon-mouse:before{content:"\e76c"}.el-icon-brush:before{content:"\e76e"}.el-icon-headset:before{content:"\e76f"}.el-icon-umbrella:before{content:"\e770"}.el-icon-scissors:before{content:"\e771"}.el-icon-mobile:before{content:"\e773"}.el-icon-attract:before{content:"\e774"}.el-icon-monitor:before{content:"\e775"}.el-icon-search:before{content:"\e778"}.el-icon-takeaway-box:before{content:"\e77a"}.el-icon-paperclip:before{content:"\e77d"}.el-icon-printer:before{content:"\e77e"}.el-icon-document-add:before{content:"\e782"}.el-icon-document:before{content:"\e785"}.el-icon-document-checked:before{content:"\e786"}.el-icon-document-copy:before{content:"\e787"}.el-icon-document-delete:before{content:"\e788"}.el-icon-document-remove:before{content:"\e789"}.el-icon-tickets:before{content:"\e78b"}.el-icon-folder-checked:before{content:"\e77f"}.el-icon-folder-delete:before{content:"\e780"}.el-icon-folder-remove:before{content:"\e781"}.el-icon-folder-add:before{content:"\e783"}.el-icon-folder-opened:before{content:"\e784"}.el-icon-folder:before{content:"\e78a"}.el-icon-edit-outline:before{content:"\e764"}.el-icon-edit:before{content:"\e78c"}.el-icon-date:before{content:"\e78e"}.el-icon-c-scale-to-original:before{content:"\e7c6"}.el-icon-view:before{content:"\e6ce"}.el-icon-loading:before{content:"\e6cf"}.el-icon-rank:before{content:"\e6d1"}.el-icon-sort-down:before{content:"\e7c4"}.el-icon-sort-up:before{content:"\e7c5"}.el-icon-sort:before{content:"\e6d2"}.el-icon-finished:before{content:"\e6cd"}.el-icon-refresh-left:before{content:"\e6c7"}.el-icon-refresh-right:before{content:"\e6c8"}.el-icon-refresh:before{content:"\e6d0"}.el-icon-video-play:before{content:"\e7c0"}.el-icon-video-pause:before{content:"\e7c1"}.el-icon-d-arrow-right:before{content:"\e6dc"}.el-icon-d-arrow-left:before{content:"\e6dd"}.el-icon-arrow-up:before{content:"\e6e1"}.el-icon-arrow-down:before{content:"\e6df"}.el-icon-arrow-right:before{content:"\e6e0"}.el-icon-arrow-left:before{content:"\e6de"}.el-icon-top-right:before{content:"\e6e7"}.el-icon-top-left:before{content:"\e6e8"}.el-icon-top:before{content:"\e6e6"}.el-icon-bottom:before{content:"\e6eb"}.el-icon-right:before{content:"\e6e9"}.el-icon-back:before{content:"\e6ea"}.el-icon-bottom-right:before{content:"\e6ec"}.el-icon-bottom-left:before{content:"\e6ed"}.el-icon-caret-top:before{content:"\e78f"}.el-icon-caret-bottom:before{content:"\e790"}.el-icon-caret-right:before{content:"\e791"}.el-icon-caret-left:before{content:"\e792"}.el-icon-d-caret:before{content:"\e79a"}.el-icon-share:before{content:"\e793"}.el-icon-menu:before{content:"\e798"}.el-icon-s-grid:before{content:"\e7a6"}.el-icon-s-check:before{content:"\e7a7"}.el-icon-s-data:before{content:"\e7a8"}.el-icon-s-opportunity:before{content:"\e7aa"}.el-icon-s-custom:before{content:"\e7ab"}.el-icon-s-claim:before{content:"\e7ad"}.el-icon-s-finance:before{content:"\e7ae"}.el-icon-s-comment:before{content:"\e7af"}.el-icon-s-flag:before{content:"\e7b0"}.el-icon-s-marketing:before{content:"\e7b1"}.el-icon-s-shop:before{content:"\e7b4"}.el-icon-s-open:before{content:"\e7b5"}.el-icon-s-management:before{content:"\e7b6"}.el-icon-s-ticket:before{content:"\e7b7"}.el-icon-s-release:before{content:"\e7b8"}.el-icon-s-home:before{content:"\e7b9"}.el-icon-s-promotion:before{content:"\e7ba"}.el-icon-s-operation:before{content:"\e7bb"}.el-icon-s-unfold:before{content:"\e7bc"}.el-icon-s-fold:before{content:"\e7a9"}.el-icon-s-platform:before{content:"\e7bd"}.el-icon-s-order:before{content:"\e7be"}.el-icon-s-cooperation:before{content:"\e7bf"}.el-icon-bell:before{content:"\e725"}.el-icon-message-solid:before{content:"\e799"}.el-icon-video-camera:before{content:"\e772"}.el-icon-video-camera-solid:before{content:"\e796"}.el-icon-camera:before{content:"\e779"}.el-icon-camera-solid:before{content:"\e79b"}.el-icon-download:before{content:"\e77c"}.el-icon-upload2:before{content:"\e77b"}.el-icon-upload:before{content:"\e7c3"}.el-icon-picture-outline-round:before{content:"\e75f"}.el-icon-picture-outline:before{content:"\e75e"}.el-icon-picture:before{content:"\e79f"}.el-icon-close:before{content:"\e6db"}.el-icon-check:before{content:"\e6da"}.el-icon-plus:before{content:"\e6d9"}.el-icon-minus:before{content:"\e6d8"}.el-icon-help:before{content:"\e73d"}.el-icon-s-help:before{content:"\e7b3"}.el-icon-circle-close:before{content:"\e78d"}.el-icon-circle-check:before{content:"\e720"}.el-icon-circle-plus-outline:before{content:"\e723"}.el-icon-remove-outline:before{content:"\e722"}.el-icon-zoom-out:before{content:"\e776"}.el-icon-zoom-in:before{content:"\e777"}.el-icon-error:before{content:"\e79d"}.el-icon-success:before{content:"\e79c"}.el-icon-circle-plus:before{content:"\e7a0"}.el-icon-remove:before{content:"\e7a2"}.el-icon-info:before{content:"\e7a1"}.el-icon-question:before{content:"\e7a4"}.el-icon-warning-outline:before{content:"\e6c9"}.el-icon-warning:before{content:"\e7a3"}.el-icon-goods:before{content:"\e7c2"}.el-icon-s-goods:before{content:"\e7b2"}.el-icon-star-off:before{content:"\e717"}.el-icon-star-on:before{content:"\e797"}.el-icon-more-outline:before{content:"\e6cc"}.el-icon-more:before{content:"\e794"}.el-icon-phone-outline:before{content:"\e6cb"}.el-icon-phone:before{content:"\e795"}.el-icon-user:before{content:"\e6e3"}.el-icon-user-solid:before{content:"\e7a5"}.el-icon-setting:before{content:"\e6ca"}.el-icon-s-tools:before{content:"\e7ac"}.el-icon-delete:before{content:"\e6d7"}.el-icon-delete-solid:before{content:"\e7c9"}.el-icon-eleme:before{content:"\e7c7"}.el-icon-platform-eleme:before{content:"\e7ca"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination::after,.el-pagination::before{display:table;content:""}.el-pagination::after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409EFF}.el-pagination button:disabled{color:#C0C4CC;background-color:#FFF;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat #FFF;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#C0C4CC;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .arrow.disabled{visibility:hidden}.el-pagination--small .more::before,.el-pagination--small li.more::before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409EFF}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-dialog,.el-pager li{-webkit-box-sizing:border-box}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#C0C4CC}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409EFF}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409EFF;color:#FFF}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-pager .more::before{line-height:30px}.el-pager li{padding:0 4px;background:#FFF;font-size:13px;min-width:35.5px;height:28px;line-height:28px;box-sizing:border-box;text-align:center}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#C0C4CC}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409EFF}.el-pager li.active{color:#409EFF;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;background:#FFF;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409EFF}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #E4E7ED;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#FFF}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#F5F7FA}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#FFF}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default::before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover:not(.is-disabled)::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing){outline-width:0}.el-dropdown [disabled]{cursor:not-allowed;color:#bbb}.el-dropdown-menu{position:absolute;top:0;left:0;z-index:10;padding:10px 0;margin:5px 0;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item,.el-menu-item{font-size:14px;padding:0 20px;cursor:pointer}.el-dropdown-menu__item{list-style:none;line-height:36px;margin:0;color:#606266;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #EBEEF5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#FFF}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#FFF}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu::after,.el-menu::before{display:table;content:""}.el-breadcrumb__item:last-child .el-breadcrumb__separator,.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu::after{clear:both}.el-menu.el-menu--horizontal{border-bottom:solid 1px #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409EFF;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--collapse .el-submenu,.el-menu-item{position:relative}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#FFF;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409EFF;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;list-style:none}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-submenu{min-width:200px}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;z-index:10;border:1px solid #E4E7ED;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;min-width:200px;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{color:#303133;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.el-radio-button__inner,.el-submenu__title{-webkit-box-sizing:border-box;position:relative;white-space:nowrap}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409EFF}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409EFF}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{background:#FFF;border:1px solid #DCDFE6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409EFF}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #409EFF;box-shadow:-1px 0 0 0 #409EFF}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#F2F6FC}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-picker-panel,.el-popover,.el-select-dropdown,.el-table-filter,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409EFF}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #DCDFE6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#DCDFE6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-input__prefix,.el-input__suffix{-webkit-transition:all .3s;color:#C0C4CC}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#FFF}.el-switch.is-checked .el-switch__core{border-color:#409EFF;background-color:#409EFF}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #E4E7ED;border-radius:4px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item{padding-right:40px}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409EFF;background-color:#FFF}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#F5F7FA}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\e6da";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#FFF}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#F5F7FA}.el-select-dropdown__item.selected{color:#409EFF;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#E4E7ED}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#C0C4CC}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409EFF}.el-select .el-input .el-select__caret{color:#C0C4CC;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#C0C4CC;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#E4E7ED}.el-range-editor.is-active,.el-range-editor.is-active:hover,.el-select .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#C0C4CC;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select__tags-text{overflow:hidden;text-overflow:ellipsis}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5;display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-select .el-tag__close.el-icon-close{background-color:#C0C4CC;top:0;color:#FFF;-ms-flex-negative:0;flex-shrink:0}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#FFF}.el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;font-size:12px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th.el-table__cell{background:#F5F7FA}.el-table .el-table__cell{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table--medium .el-table__cell{padding:10px 0}.el-table--small{font-size:12px}.el-table--small .el-table__cell{padding:8px 0}.el-table--mini{font-size:12px}.el-table--mini .el-table__cell{padding:6px 0}.el-table tr{background-color:#FFF}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:1px solid #EBEEF5}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#FFF}.el-table th.el-table__cell>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th.el-table__cell>.cell.highlight{color:#409EFF}.el-table th.el-table__cell.required>div::before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td.el-table__cell div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td,.el-table .cell,.el-table-filter{-webkit-box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table .cell{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-left:10px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #EBEEF5}.el-table--border::after,.el-table--group::after,.el-table::before{content:'';position:absolute;background-color:#EBEEF5;z-index:1}.el-table--border::after,.el-table--group::after{top:0;right:0;width:1px;height:100%}.el-table::before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border .el-table__cell,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #EBEEF5}.el-table--border .el-table__cell:first-child .cell{padding-left:10px}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:1px solid #EBEEF5;border-bottom-width:1px}.el-table--border th.el-table__cell,.el-table__fixed-right-patch{border-bottom:1px solid #EBEEF5}.el-table--hidden{visibility:hidden}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right::before,.el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#EBEEF5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#FFF}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td.el-table__cell{border-top:1px solid #EBEEF5;background-color:#F5F7FA;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td.el-table__cell{border-top:1px solid #EBEEF5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td.el-table__cell,.el-table__header-wrapper tbody td.el-table__cell{background-color:#F5F7FA;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #EBEEF5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#C0C4CC;top:5px}.el-table .sort-caret.descending{border-top-color:#C0C4CC;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409EFF}.el-table .descending .sort-caret.descending{border-top-color:#409EFF}.el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:#FAFAFA}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell,.el-table--striped .el-table__body tr.el-table__row--striped.selection-row td.el-table__cell{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.selection-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row.selection-row>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell{background-color:#F5F7FA}.el-table__body tr.current-row>td.el-table__cell,.el-table__body tr.selection-row>td.el-table__cell{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #EBEEF5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td.el-table__cell{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:#F5F7FA}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #EBEEF5;border-radius:2px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-sizing:border-box;margin:2px 0}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409EFF;color:#FFF}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #EBEEF5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table td.in-range div,.el-date-table td.in-range div:hover,.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#F2F6FC}.el-table-filter__bottom button:hover{color:#409EFF}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;height:30px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td div{height:30px;padding:3px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#C0C4CC}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409EFF;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#FFF}.el-date-table td.available:hover{color:#409EFF}.el-date-table td.current:not(.disabled) span{color:#FFF;background-color:#409EFF}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#FFF}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409EFF}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#F5F7FA;opacity:1;cursor:not-allowed;color:#C0C4CC}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#F2F6FC;border-radius:15px}.el-date-table td.selected div:hover{background-color:#F2F6FC}.el-date-table td.selected span{background-color:#409EFF;color:#FFF;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:solid 1px #EBEEF5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409EFF;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#FFF}.el-month-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-month-table td.disabled .cell:hover{color:#C0C4CC}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409EFF}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#F2F6FC}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#FFF}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#FFF;background-color:#409EFF}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409EFF}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409EFF;font-weight:700}.el-year-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-year-table td.disabled .cell:hover{color:#C0C4CC}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409EFF}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#FFF}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #EBEEF5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409EFF}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409EFF;font-weight:700}.time-select-item.disabled{color:#E4E7ED;cursor:not-allowed}.time-select-item:hover{background-color:#F5F7FA;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#C0C4CC;float:left;line-height:32px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input:-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::placeholder{color:#C0C4CC}.el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#C0C4CC;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#E4E7ED}.el-range-editor.is-disabled input{background-color:#F5F7FA;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::placeholder{color:#C0C4CC}.el-range-editor.is-disabled .el-range-separator{color:#C0C4CC}.el-picker-panel{color:#606266;border:1px solid #E4E7ED;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#FFF;border-radius:4px;line-height:30px;margin:5px 0}.el-picker-panel__body-wrapper::after,.el-picker-panel__body::after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#FFF;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409EFF}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409EFF}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409EFF}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#FFF;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#FFF;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409EFF}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list::after,.el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#F5F7FA;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#C0C4CC;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #E4E7ED;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content::after,.el-time-panel__content::before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #E4E7ED;border-bottom:1px solid #E4E7ED}.el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409EFF}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #E4E7ED}.el-popover{position:absolute;background:#FFF;min-width:150px;border-radius:4px;border:1px solid #EBEEF5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover,.el-cascader__dropdown,.el-color-picker__panel,.el-message-box,.el-notification{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#FFF;border-radius:4px;border:1px solid #EBEEF5;font-size:18px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper::after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#F56C6C}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409EFF}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status::before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67C23A}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#E6A23C}.el-message-box__status.el-icon-error{color:#F56C6C}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#F56C6C;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#C0C4CC}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#409EFF;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item::after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__content::after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#F56C6C;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#F56C6C;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#F56C6C}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409EFF;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.el-tabs__new-tab:hover{color:#409EFF}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#E4E7ED;z-index:1}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409EFF inset;box-shadow:0 0 2px 2px #409EFF inset;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs--card>.el-tabs__header .el-tabs__active-bar,.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs__item .el-icon-close:hover{background-color:#C0C4CC;color:#FFF}.el-tabs__item.is-active{color:#409EFF}.el-tabs__item:hover{color:#409EFF;cursor:pointer}.el-tabs__item.is-disabled{color:#C0C4CC;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #E4E7ED}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #E4E7ED;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #E4E7ED;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#FFF}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close{width:14px}.el-tabs--border-card{background:#FFF;border:1px solid #DCDFE6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#F5F7FA;border-bottom:1px solid #E4E7ED;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-col-offset-0,.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409EFF;background-color:#FFF;border-right-color:#DCDFE6;border-left-color:#DCDFE6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409EFF}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#C0C4CC}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-cascader-menu:last-child .el-cascader-node,.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #DCDFE6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left::after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left::after,.el-tabs--left .el-tabs__nav-wrap.is-right::after,.el-tabs--right .el-tabs__nav-wrap.is-left::after,.el-tabs--right .el-tabs__nav-wrap.is-right::after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-button-group>.el-button:not(:last-child),.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #E4E7ED;border-bottom:none;border-top:1px solid #E4E7ED;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #E4E7ED;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #E4E7ED;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #E4E7ED;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right::after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #E4E7ED}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #E4E7ED;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #E4E7ED;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #E4E7ED;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#FFF;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409EFF}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#F5F7FA}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409EFF;color:#fff}.el-tree-node__content:hover,.el-upload-list__item:hover{background-color:#F5F7FA}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#C0C4CC;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#C0C4CC}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#FFF;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#C0C4CC}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#FFF}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67C23A}.el-alert--success.is-light .el-alert__description{color:#67C23A}.el-alert--success.is-dark{background-color:#67C23A;color:#FFF}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#FFF}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#E6A23C}.el-alert--warning.is-light .el-alert__description{color:#E6A23C}.el-alert--warning.is-dark{background-color:#E6A23C;color:#FFF}.el-alert--error.is-light{background-color:#fef0f0;color:#F56C6C}.el-alert--error.is-light .el-alert__description{color:#F56C6C}.el-alert--error.is-dark{background-color:#F56C6C;color:#FFF}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active,.el-upload iframe{opacity:0}.el-carousel__arrow--right,.el-notification.right{right:16px}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #EBEEF5;position:fixed;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67C23A}.el-notification .el-icon-error{color:#F56C6C}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#E6A23C}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#F5F7FA;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409EFF}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409EFF}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #DCDFE6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #DCDFE6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#E4E7ED;color:#E4E7ED}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#E4E7ED;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #DCDFE6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #DCDFE6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing){outline-width:0}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-button-group::after,.el-button-group::before,.el-color-dropdown__main-wrapper::after,.el-link.is-underline:hover:after,.el-page-header__left::after,.el-progress-bar__inner::after,.el-row::after,.el-row::before,.el-slider::after,.el-slider::before,.el-slider__button-wrapper::after,.el-transfer-panel .el-transfer-panel__footer::after,.el-upload-cover::after,.el-upload-list--picture-card .el-upload-list__item-actions::after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#FFF}.el-tooltip__popper.is-light{background:#FFF;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#FFF}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#FFF}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#FFF}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#FFF}.el-slider::after,.el-slider::before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper::after{display:inline-block;vertical-align:middle}.el-slider::after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#E4E7ED;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button{border-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409EFF;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal}.el-image-viewer__btn,.el-slider__button,.el-step__icon-inner{-moz-user-select:none;-ms-user-select:none}.el-slider__button-wrapper::after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409EFF;background-color:#FFF;border-radius:50%;-webkit-transition:.2s;transition:.2s;-webkit-user-select:none;user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#FFF;transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #DCDFE6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#C0C4CC}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409EFF}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-10,.el-col-pull-11,.el-col-pull-12,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-2,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-push-0,.el-col-push-1,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-2,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-row,.el-upload-dragger,.el-upload-list__item{position:relative}.el-loading-spinner .el-loading-text{color:#409EFF;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409EFF;stroke-linecap:round}.el-loading-spinner i{color:#409EFF}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-col-0{width:0%}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;cursor:pointer;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409EFF;color:#409EFF}.el-upload:focus .el-upload-dragger{border-color:#409EFF}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;cursor:pointer;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#C0C4CC;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #DCDFE6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409EFF;font-style:normal}.el-upload-dragger:hover{border-color:#409EFF}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409EFF}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67C23A}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409EFF}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409EFF;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409EFF}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#FFF}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#FFF;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#FFF;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#FFF;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67C23A}.el-progress.is-success .el-progress__text{color:#67C23A}.el-progress.is-warning .el-progress-bar__inner{background-color:#E6A23C}.el-badge__content,.el-progress.is-exception .el-progress-bar__inner{background-color:#F56C6C}.el-progress.is-warning .el-progress__text{color:#E6A23C}.el-progress.is-exception .el-progress__text{color:#F56C6C}.el-progress-bar{padding-right:50px;display:inline-block;vertical-align:middle;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__header,.el-message,.el-step__icon{-webkit-box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#EBEEF5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409EFF;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-progress-bar__inner::after{display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#FFF;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#EBEEF5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67C23A}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#E6A23C}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#F56C6C}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#C0C4CC;font-size:16px}.el-message__closeBtn:focus{outline-width:0}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67C23A}.el-message .el-icon-error{color:#F56C6C}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#E6A23C}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{border-radius:10px;color:#FFF;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #FFF}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409EFF}.el-badge__content--success{background-color:#67C23A}.el-badge__content--warning{background-color:#E6A23C}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#F56C6C}.el-card{border-radius:4px;border:1px solid #EBEEF5;background-color:#FFF;overflow:hidden;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #EBEEF5;box-sizing:border-box}.el-card__body,.el-main{padding:20px}.el-rate{height:20px;line-height:1}.el-rate:active,.el-rate:focus{outline-width:0}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#C0C4CC;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#F5F7FA}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#C0C4CC;border-color:#C0C4CC}.el-step__head.is-success{color:#67C23A;border-color:#67C23A}.el-step__head.is-error{color:#F56C6C;border-color:#F56C6C}.el-step__head.is-finish{color:#409EFF;border-color:#409EFF}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;box-sizing:border-box;background:#FFF;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step.is-horizontal,.el-step__icon-inner{display:inline-block}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{-webkit-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#C0C4CC}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#C0C4CC}.el-step__title.is-success{color:#67C23A}.el-step__title.is-error{color:#F56C6C}.el-step__title.is-finish{color:#409EFF}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#C0C4CC}.el-step__description.is-success{color:#67C23A}.el-step__description.is-error{color:#F56C6C}.el-step__description.is-finish{color:#409EFF}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow::after,.el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#C0C4CC}.el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#FFF;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#C0C4CC;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#FFF;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;position:absolute;top:0;left:0}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#FFF;opacity:.24;-webkit-transition:.2s;transition:.2s}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-fade-in-enter,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #EBEEF5;border-bottom:1px solid #EBEEF5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#FFF;color:#303133;cursor:pointer;border-bottom:1px solid #EBEEF5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409EFF}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#FFF;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #EBEEF5}.el-cascader__search-input,.el-cascader__tags,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-cascader,.el-tag{display:inline-block}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#FFF;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#FFF}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#FFF;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#FFF}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409EFF;border-width:1px;border-style:solid;border-radius:4px;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409EFF}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67C23A}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close::before{display:block}.el-tag--dark{background-color:#409eff;border-color:#409eff;color:#fff}.el-tag--dark.is-hit{border-color:#409EFF}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#FFF;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67C23A}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409EFF}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67C23A}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#C0C4CC}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#C0C4CC}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#FFF;border:1px solid #E4E7ED;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#C0C4CC;color:#FFF}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#F5F7FA}.el-cascader__suggestion-item.is-checked{color:#409EFF;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#C0C4CC}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#C0C4CC}.el-cascader__search-input:-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::placeholder{color:#C0C4CC}.el-color-predefine{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409EFF;box-shadow:0 0 3px 2px #409EFF}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper::after{display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409EFF;border-color:#409EFF}.el-color-dropdown__link-btn{cursor:pointer;color:#409EFF;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409EFF,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__icon,.el-input,.el-textarea{display:inline-block;width:100%}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty{font-size:12px;color:#999;position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#FFF;text-align:center;font-size:12px}.el-input__prefix,.el-input__suffix{position:absolute;top:0;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-input__inner,.el-textarea__inner,.el-transfer-panel{-webkit-box-sizing:border-box}.el-textarea{position:relative;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#FFF;background-image:none;border:1px solid #DCDFE6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea__inner:hover{border-color:#C0C4CC}.el-textarea__inner:focus{outline:0;border-color:#409EFF}.el-textarea .el-input__count{color:#909399;background:#FFF;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea.is-exceed .el-textarea__inner{border-color:#F56C6C}.el-textarea.is-exceed .el-input__count{color:#F56C6C}.el-input{position:relative;font-size:14px}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#C0C4CC;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input,.el-input__inner{font-size:inherit}.el-input .el-input__count .el-input__count-inner{background:#FFF;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#FFF;background-image:none;border-radius:4px;border:1px solid #DCDFE6;box-sizing:border-box;color:#606266;display:inline-block;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__inner::-ms-reveal{display:none}.el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input__inner::placeholder{color:#C0C4CC}.el-input__inner:hover{border-color:#C0C4CC}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409EFF;outline:0}.el-input__suffix{height:100%;right:5px;transition:all .3s;pointer-events:none}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{height:100%;left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-image-viewer__btn,.el-image__preview,.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#F56C6C}.el-input.is-exceed .el-input__suffix .el-input__count{color:#F56C6C}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#F5F7FA;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #DCDFE6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#FFF;background-color:#409EFF;font-size:0}.el-button-group>.el-button+.el-button,.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-divider__text,.el-image__error,.el-link,.el-timeline,.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #DCDFE6;background-color:#F5F7FA;color:#C0C4CC}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer-panel{border:1px solid #EBEEF5;border-radius:4px;overflow:hidden;background:#FFF;display:inline-block;vertical-align:middle;width:200px;max-height:100%;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409EFF}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#F5F7FA;margin:0;padding-left:15px;border-bottom:1px solid #EBEEF5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-container,.el-header{-webkit-box-sizing:border-box}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#FFF;margin:0;padding:0;border-top:1px solid #EBEEF5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.el-container{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;min-width:0}.el-container.is-vertical,.el-drawer,.el-empty,.el-result{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-container.is-vertical{-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #E4E7ED}.el-timeline-item__icon{color:#FFF;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#E4E7ED;border-radius:50%;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409EFF}.el-timeline-item__node--success{background-color:#67C23A}.el-timeline-item__node--warning{background-color:#E6A23C}.el-timeline-item__node--danger{background-color:#F56C6C}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0;font-weight:500}.el-link.is-underline:hover:after{position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409EFF}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409EFF}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409EFF}.el-link.el-link--default.is-disabled{color:#C0C4CC}.el-link.el-link--primary{color:#409EFF}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#F56C6C}.el-link.el-link--danger{color:#F56C6C}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67C23A}.el-link.el-link--success{color:#67C23A}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#E6A23C}.el-link.el-link--warning{color:#E6A23C}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#DCDFE6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#FFF;padding:0 20px;font-weight:500;color:#303133}.el-image__error,.el-image__placeholder{background:#F5F7FA}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#C0C4CC;vertical-align:middle}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;user-select:none}.el-button,.el-checkbox,.el-checkbox-button__inner,.el-empty__image img,.el-radio{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:24px;color:#fff;background-color:#606266}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff;top:50%}.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%);left:40px}.el-image-viewer__next{-webkit-transform:translateY(-50%);transform:translateY(-50%);right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button,.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#FFF;border-color:#409EFF;color:#409EFF}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#FFF;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#FFF;border-color:#EBEEF5;color:#C0C4CC}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#FFF;background-color:#409EFF;border-color:#409EFF}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#FFF}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#FFF;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409EFF;border-color:#409EFF;color:#FFF}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#FFF;background-color:#67C23A;border-color:#67C23A}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#FFF}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#FFF}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#FFF;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67C23A;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67C23A;border-color:#67C23A;color:#FFF}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#FFF;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#FFF;background-color:#E6A23C;border-color:#E6A23C}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#FFF}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#FFF}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#FFF;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#E6A23C;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#E6A23C;border-color:#E6A23C;color:#FFF}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#FFF;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#FFF;background-color:#F56C6C;border-color:#F56C6C}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#FFF}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#FFF}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#FFF;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#F56C6C;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#F56C6C;border-color:#F56C6C;color:#FFF}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#FFF;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#FFF;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#FFF}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#FFF}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#FFF;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#FFF}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#FFF;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini{font-size:12px;border-radius:3px}.el-button--mini.is-circle{padding:7px}.el-button--text{border-color:transparent;color:#409EFF;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover{border-color:transparent}.el-button-group .el-button--danger:last-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:last-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:last-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:last-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:last-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child),.el-button-group>.el-dropdown>.el-button{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:first-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:first-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:first-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:first-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-right-color:rgba(255,255,255,.5)}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button.is-active,.el-button-group>.el-button:not(.is-disabled):active,.el-button-group>.el-button:not(.is-disabled):focus,.el-button-group>.el-button:not(.is-disabled):hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #EBEEF5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#C0C4CC}.el-backtop,.el-calendar-table td.is-today{color:#409EFF}.el-calendar-table td{border-bottom:1px solid #EBEEF5;border-right:1px solid #EBEEF5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#F2F8FE}.el-calendar-table tr:first-child td{border-top:1px solid #EBEEF5}.el-calendar-table tr td:first-child{border-left:1px solid #EBEEF5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#F2F8FE}.el-backtop{position:fixed;background-color:#FFF;width:40px;height:40px;border-radius:50%;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#F2F6FC}.el-page-header{display:flex;line-height:24px}.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;margin-right:40px;position:relative}.el-page-header__left::after{position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#DCDFE6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409EFF}.el-checkbox.is-bordered.is-disabled{border-color:#EBEEF5;cursor:not-allowed}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#DCDFE6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#C0C4CC}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#C0C4CC}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#C0C4CC;border-color:#C0C4CC}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409EFF;border-color:#409EFF}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#C0C4CC;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409EFF}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409EFF}.el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#FFF;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #DCDFE6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#FFF;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409EFF}.el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #FFF;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409EFF}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409EFF}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#EBEEF5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409EFF}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-avatar,.el-cascader-panel,.el-radio,.el-radio--medium.is-bordered .el-radio__label,.el-radio__label{font-size:14px}.el-radio{color:#606266;font-weight:500;line-height:1;cursor:pointer;white-space:nowrap;outline:0;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-cascader-menu,.el-cascader-menu__list,.el-radio__inner{-webkit-box-sizing:border-box}.el-radio.is-bordered.is-checked{border-color:#409EFF}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#EBEEF5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#F5F7FA;border-color:#E4E7ED}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{white-space:nowrap;cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#F5F7FA}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#C0C4CC}.el-radio__input.is-disabled+span.el-radio__label{color:#C0C4CC;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409EFF;background:#409EFF}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409EFF}.el-radio__input.is-focus .el-radio__inner{border-color:#409EFF}.el-radio__inner{border:1px solid #DCDFE6;border-radius:100%;width:14px;height:14px;background-color:#FFF;cursor:pointer;box-sizing:border-box}.el-radio__inner:hover{border-color:#409EFF}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#FFF;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-radio__label{padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px}.el-cascader-panel.is-bordered{border:1px solid #E4E7ED;border-radius:4px}.el-cascader-menu{min-width:180px;box-sizing:border-box;color:#606266;border-right:solid 1px #E4E7ED}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;box-sizing:border-box}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#C0C4CC}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409EFF;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#F5F7FA}.el-cascader-node.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden;color:#fff;background:#C0C4CC;width:40px;height:40px;line-height:40px}.el-drawer,.el-drawer__body>*{-webkit-box-sizing:border-box}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-empty__image img,.el-empty__image svg{vertical-align:top;height:100%;width:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#FFF;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);overflow:hidden;outline:0}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.el-drawer__body>*{box-sizing:border-box}.el-drawer.ltr,.el-drawer.rtl{height:100%;top:0;bottom:0}.el-drawer.btt,.el-drawer.ttb{width:100%;left:0;right:0}.el-drawer__container{position:relative;left:0;right:0;top:0;bottom:0;height:100%;width:100%}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-statistic{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;color:#000;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum";text-align:center}.el-statistic .head{margin-bottom:4px;color:#606266;font-size:13px}.el-statistic .con{font-family:Sans-serif;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#303133}.el-statistic .con .number{font-size:20px;padding:0 4px}.el-statistic .con span{display:inline-block;margin:0;line-height:100%}.el-popconfirm__main,.el-skeleton__image{display:-ms-flexbox;-webkit-box-align:center;display:-webkit-box}.el-popconfirm__main{display:flex;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:#f2f2f2}.el-skeleton.is-animated .el-skeleton__item{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-skeleton__item{background:#f2f2f2;display:inline-block;height:16px;border-radius:4px;width:100%}.el-skeleton__circle{border-radius:50%;width:36px;height:36px;line-height:36px}.el-skeleton__circle--lg{width:40px;height:40px;line-height:40px}.el-skeleton__circle--md{width:28px;height:28px;line-height:28px}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:13px}.el-skeleton__caption{height:12px}.el-skeleton__h1{height:20px}.el-skeleton__h3{height:18px}.el-skeleton__h5{height:16px}.el-skeleton__image{width:unset;display:flex;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:0}.el-skeleton__image svg{fill:#DCDDE0;width:22%;height:22%}.el-empty{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 0}.el-empty__image{width:160px}.el-empty__image img{user-select:none;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{fill:#DCDDE0}.el-empty__description{margin-top:20px}.el-empty__description p{margin:0;font-size:14px;color:#909399}.el-empty__bottom,.el-result__title{margin-top:20px}.el-descriptions{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px;color:#303133}.el-descriptions__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.el-descriptions__title{font-size:16px;font-weight:700}.el-descriptions--mini,.el-descriptions--small{font-size:12px}.el-descriptions__body{color:#606266;background-color:#FFF}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%;table-layout:fixed}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;font-weight:400;line-height:1.5}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-right{text-align:right}.el-descriptions .is-bordered{table-layout:auto}.el-descriptions .is-bordered .el-descriptions-item__cell{border:1px solid #EBEEF5;padding:12px 10px}.el-descriptions :not(.is-bordered) .el-descriptions-item__cell{padding-bottom:12px}.el-descriptions--medium.is-bordered .el-descriptions-item__cell{padding:10px}.el-descriptions--medium:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:10px}.el-descriptions--small.is-bordered .el-descriptions-item__cell{padding:8px 10px}.el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:8px}.el-descriptions--mini.is-bordered .el-descriptions-item__cell{padding:6px 10px}.el-descriptions--mini:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:6px}.el-descriptions-item{vertical-align:top}.el-descriptions-item__container{display:-webkit-box;display:-ms-flexbox;display:flex}.el-descriptions-item__container .el-descriptions-item__content,.el-descriptions-item__container .el-descriptions-item__label{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-descriptions-item__container .el-descriptions-item__content{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-descriptions-item__label.has-colon::after{content:':';position:relative;top:-.5px}.el-descriptions-item__label.is-bordered-label{font-weight:700;color:#909399;background:#fafafa}.el-descriptions-item__label:not(.is-bordered-label){margin-right:10px}.el-descriptions-item__content{word-break:break-word;overflow-wrap:break-word}.el-result{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 30px}.el-result__icon svg{width:64px;height:64px}.el-result__title p{margin:0;font-size:20px;color:#303133;line-height:1.3}.el-result__subtitle{margin-top:10px}.el-result__subtitle p{margin:0;font-size:14px;color:#606266;line-height:1.3}.el-result__extra{margin-top:30px }.el-result .icon-success{fill:#67C23A}.el-result .icon-error{fill:#F56C6C}.el-result .icon-info{fill:#909399}.el-result .icon-warning{fill:#E6A23C} \ No newline at end of file diff --git a/admin-ui/public/world/world.js b/admin-ui/public/world/world.js new file mode 100644 index 0000000..bd8cbb6 --- /dev/null +++ b/admin-ui/public/world/world.js @@ -0,0 +1 @@ +!function(e,o){"function"==typeof define&&define.amd?define(["exports","echarts"],o):"object"==typeof exports&&"string"!=typeof exports.nodeName?o(exports,require("echarts")):o({},e.echarts)}(this,function(e,o){var t=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)};o?o.registerMap?o.registerMap("world",{type:"FeatureCollection",crs:{type:"name",properties:{name:"urn:ogc:def:crs:OGC:1.3:CRS84"}},features:[{geometry:{type:"Polygon",coordinates:["@@࠿@ᠳ࡚с̶ʩт˷˔ƹͮɠͲ˖рԜ׷҄̕ҴNܾͰؼ÷۸ήԪ‡Үƴ̮¿ঞɪֶϤϲŹƛе²֭ĝDZƊĠǔōϭñėށ؅ਓɁȥԯ঻ƻԓࣗඩअ৯۝ڻो֑য়ߝล໥ϓ؇UļāļƫȖɩ̌]ᶼ̈́͘ɮ͜ɪ͚€®ĞĚ۪ƼɦːϪǰ;Ąߞᢌᣮ"],encodeOffsets:[[49130,8189]]},properties:{name:"Somalia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ƛ¬Ð@ĞÆÒªDZ"],encodeOffsets:[[9810,48188]]},properties:{name:"Liechtenstein",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@⌗†øĒ୬ͪࣆيʊˆ҄ؔ^˶ȇɪÈצϲ֌ĐФ؜ְദ׼ҢڴήࡔլİtʍԾ΃ʤ›՘IJʢË΢ǒŎɽĠPĀmǶVǢgΤ̑Įவňȵ’Ǒ¼ýĈå²yĞÇÞ³œëąÍĥʹ೵]Ɂ³Ɨ{‘ΡʼnƑcăZÉSÍƫH˃ǨǓѭLJƣġǥÕȿÕǃñÿśıƇħěŽđұĿЍU“ƉÝå‹Sĵ^čfʉdʇǍ·ƒণ֣oۋ@Ĺ"],encodeOffsets:[[-8891,28445]]},properties:{name:"Morocco",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@⌘…@ķœ@@@Ŕ@@̷@̩@ǕBȍ@ȋ@ƍ@ĩ᫫@@ɋ@΃@ɭ@ŕ@қ@΃Oх̉űƽw½gΉɩķƯtįQJ–dz˜՟TšRšPėRŏᇷCฝCċα`ý§¨Ƙ࢘Ӕ׎ŰшΞ׎LJĹèƤ࠴݂Ģָ͌܌۴КͲޞŚƀ","@@i˷@@j˸"],encodeOffsets:[[-13351,28480],[-8984,28120]]},properties:{name:"W. Sahara",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@A@ƟwđĵȏÒʁč«Ǔƅ@ã̌Ο˘SǴʒÊÆ`Å_֡˰ϟʊkˆIŠDZʪĠɁ˔˶àϷˈȘѬ˻W²ɤ˲ÚͩǀºĬȋːÈĆѠŎNJĘȘoø`Ȓg¤_€cº·¶ÙȈėÒ÷´›fFfV\\T^Qhɿ՘ɳ†kĝƱƨ÷YißMµGuOD‡Ǝ‰Ĩãɰ™İŸÈßĜhŴĬŬ~Ũ±â›Z‰ƒ]ãNÇk¹ėnjƽɣȭkƒěHãƺ˝Ǵ謭’¡İÃƩǝÿďȫ•Ẹ̀Q‘ßço}ß]ĕUΥ@Ʌ±@@"],encodeOffsets:[[22080,43262]]},properties:{name:"Serbia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@хǑޟ˜ܯőࡡԧ¡á͘з¤̧սշŊƉ™ˏͭąٝ°̺׿ٓɥɓӱŒз·ʫɫƚν@ӧʟƆƋʇğԻzЛϭĭ޿ॕʳכ]ʛŷѿĘࣻõЍĺٵȀ͋ĠШъȒȢȌȜxèFƆ·ǴăĆˁȡ|ɍ‚ƒZ{ƒZØaŤDĠŽƲDèij̎őͨaŦ̰̚˽êóļ@͒ƂDzȸZíĊ•´ubSv\\vÀT˜„ΠŠhňǞjΔö’´ƌ„’FgÈèTɶǓЀ«Ȁǫ͊î̲džzĺîĢƘ؜Ɣ˒Ř˞Lj°òŠńƲъ„ÖŖ¾ŚšǶRɄJǮˊרȋ¦HʲpȮ‹ńċľsĺ¤ÚR|¼[þJ¬wNwNÌÛļûĢmnjÂpp^ªô¤ʂĸ®T¸S–Z^‚b\\~VvL¤QȂƓR¦„¼¶^ê}ĞlôÒÈŒ”ǐ`Ɛ™ǢbÀèHϱĸ^ŽǠŶˌ̆ѨīÞŗ­Ƀ”aÎJĊtÄB~oűځĈʁŔů࠰˨ȦȨˈŢƠ®ĈRľsª_ÂW\\—a÷ËvkĄOΘĈŠ˜²˜ʹkҋČѼ­§MÕryŠWJ·oğ}ƽáHiĸã|u^Q"],encodeOffsets:[[76331,37911]]},properties:{name:"Afghanistan",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ÂR̮cҮƠ͎Åǖ@ǔˆ|ɔDªĞƶHNJšŖ̈ƄĺTNJ|ʖ€ĞGR_¿ƽA½n½¦ƒʬGɼEҾi°oČ଩ýٵ͔ӑĠճēśnʕ¬ÓŠIàþÖÚ~ɈqɘM͚IJ̴™ŐŢdܓ×މoěG±ðƁIĵY൑@ȗ@@ڟ@ˑ@ˑBౝǶ֡া࡙ࢳǑ೟Ƶҧƀ਩¼ҹͺሹTᅍeғ̴ʟÌՋȭǃN‘OėFǗ–ģµƇoŒ͆ƖËܼɠˌ҆ლζ֌θɌƴȞǀЊ¢ݐс޴˫ߚ̢̤hˊүஒґۤݴɦƌOՎNዲQĮ…ĘÇƈǕžϡÐŻĚƉÆ˕Ԃۻ"],["@@̆Ƅ„_øęÞËr___ğ™ı•ͅ˭DeÌ·‹ӏɫ‰θƅːОΖ"]],encodeOffsets:[[[18002,-8293]],[[12802,-4697]]]},properties:{name:"Angola",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@Π˗ä̋ÝԍȄ́ɊßQÙÚŷűŻȉ̍ǝ©¡aq›uwW@yÐğBƧůÙPь‹XkAűˬѽ̨ŚAĹɐȨࠐDŮȡæ½ʮ̾ϦŒŷɴÒ"],encodeOffsets:[[20546,43569]]},properties:{name:"Albania",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Ł•^ĊĤ³"],["@@ɨ÷ϫƯħƾƊ¡sƜƖ"]],encodeOffsets:[[[20135,61632]],[[20470,61800]]]},properties:{name:"Aland",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@Ɵ½íIir[ò\\¢Ö ÈOŢ~y@esQm"],encodeOffsets:[[1747,43524]]},properties:{name:"Andorra",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ʙOǘøĂç"],["@@š‚ȆĶãŷ"],["@@ø֟˗ȫÁǸǣï…ԿƖw´ŷѡĹÂĹ˧څ[˥ççᒣʾ߳४oǪǘÚȱɴ‘ѼƸॺí̆ĐȾĚ̌҂ৎࠠŞɦò_m̙ź‘"]],encodeOffsets:[[[55223,24758]],[[54613,24841]],[[57650,26267]]]},properties:{name:"United Arab Emirates",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ؠQۓƫĵÜǪĢ"],["@@nᇜ͠έLJvµǥˠ›Ÿɏ׶УࢸНࢴŧʕȣ࢑įԭņ౳¦"],["@@ȴǛߖȡפϿବӗɒ˳͉ӡȧɇ“˽ͫЛoÁŒıξ”บɿɮȜǴGƌùÚD涐ÌE悶̆ž rºʒàǞȔɌͦžʮbΰƠ¥ʐĒɜũȈԵƛ۩ЧʩхŃɫˇԽ˳ŽƩǟXࢣ਍ʉƽƯɃƅ曡•ě½õijģ“ă¾ɣÙßdƕqùşȅiߜ‘l•gĝ‡ëĿēk©z¿HÃiÉZǜÁEÕáųeû¤ͩɅŷĻҩžѻőēȰ͗آ˯͆˿Ʒ̛fʳɔɧ˜¥ÞщܿਟՍ̍൱ͷઃŻأ€УƊϋȰʼnŁMĒå¯̩ŽÍīʩžБůǻӃǿ֋¥਻ΤɛŧŬਅϘŷƒƋŴcˎ’ňƗ¢θĖƒƙZ΍Εƻϟ̲ЛŹ³ýתǭѫȁ΋͏Yש͏͍R̅ҧšكʗցڛþؖ͟ӁٺóɖɁÛʗΉǁʔ@ľĩൿࡕǿʛş֡γƻ·̒LƷˋÉ͎KƨůԹ˻˃ѹƄ†ƒеίăрýѬ֯ౡ̊࿩fЩϘÊܞƛØգŋ̉Ԩ«֊þŴ˜\\Đʊ͐ƢÌ̮ȒĠvɌǃȞƠ͒ψʔ‡̶ȬưƧЮȴǨī̀ͮȺȹ̒ϏÚmŎڬRĐǠ«Ĵԛ¶ŞϢȋӨżĢͩȺŽب̜ǤƉͬiߪȊʼğǤƄž»͖Ʋ„Ś֖Ҙˤʷ۾qޚŘˎմϲUҐŝɶƌČ˺܆ǚ܂߆ɝèÀˊ˻ڨĠł˥͚ÆΞǰłƀ֌ǒFĦƶīĆÉيǘȄƞׄМЪˠ٪Ɉ\\ɰƖɭцƪˈƫ؞Ǫˠƫ̂ʾ̘ݨ̞̈ࢂƽưǢʾɼʚ̆Ē–¼”ʆİxzžEÜ}™ǘşöãîSƖ`Ѷ_͘ijèţžħ‚čÔƧ¢Çd‚–NJʒѾ°š࣠€Ǽʗî·ƚ÷ƄƣΔӍ׶Ћ"]],encodeOffsets:[[[-66098,-56029]],[[-70300,-56170]],[[-62550,-24224]]]},properties:{name:"Argentina",childNum:3}},{geometry:{type:"Polygon",coordinates:["@@́{ř̮ǯŔfƖ˟§ʭôķƶɛ½Г˲Իðą̘ŸȦʁ͚՚Ú؞Þdž€ǀťıÑѢȓǫƣÜşєʣßǫʳ¡Ժ͏ɼīŷȀƭƹúʇ"],encodeOffsets:[[47607,39841]]},properties:{name:"Armenia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@āɆœƃë"],encodeOffsets:[[-174823,-14695]]},properties:{name:"American Samoa",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@īƨǜMïƙ"],["@@΂ŜªūȩÃŚÕٸǔȢťƙțȃúͽñȐŵɖ¨ĻƣࠅƦƇƥƫJÌ҈ħĊȜͼŒǗëȃŐy"],["@@ƥÈè þħ"]],encodeOffsets:[[[70946,-50236]],[[70846,-50288]],[[53079,-47554]]]},properties:{name:"Fr. S. Antarctic Lands",childNum:3}},{geometry:{type:"Polygon",coordinates:["@@ťowîÐÒĎŏ"],encodeOffsets:[[-63197,17446]]},properties:{name:"Antigua and Barb.",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŸēǡÎƮŸÔı"],["@@Ȫb࢈ͥ;ðŀùŢƨϸQƖƂɂyĄþȺÙńଡŇȶʏԑlԟƇñĈ§ĐŸþȏêķǁŻȲ­ΧȻºæijǡ˱˙Ĕщ£ƞǴ¼˫p͕̮ʏאɨɗ¢ŚƹǪą¥FƪЅՊĵΆÔʸ˚ĩ"],["@@£ÝÏÒĴL"],["@@‹éŠżBÑ"],["@@ÞƯ͑êʴĆ"],["@@ʠȓbƿǩõ˵͢ȞĨ"],["@@÷Dzƌ˖Š̻dzƋ"],["@@’Çȏ|ƾŒ"],["@@˪ZǎŁϟȅƩȩüϡ¥ǷŤĈŢגƀɀyXı"],["@@ĥɩRʨĔ}"],["@@ǿɪcɂȤѫ"],["@@čǘ¾̞ǂǀédžĨðþ˫ɭֿ"],["@@þCȷǡȸĨ"],["@@ŅÁĮƶXij"],["@@ĕP–ŊÀř"],["@@jɇǗȞƮj"],["@@„ľàēģi"],["@@̉ƙŒɲʚÔĢĵǃµ"],["@@ųÈÈĮìƵ"],["@@ÕgIżàœ"],["@@ěWÌŖĽ"],["@@ƪdũʉǤģ³ğҷèö̆Țǂ¸Ņ"],["@@īPþŸnƇ"],["@@ƃ×ʤǮşŕ"],["@@Ŭřҿ|żň›ƴŢŠƒ˽"],["@@ͼ–ȶŨɪȹӳЩρʸŅΨȠƹ"],["@@Ñ»ɆΪƳ̭"],["@@ğɠĂÌ^˫"],["@@Í̉ʖ˱ƺڭʟǪԝǤĩјȚƦɕ՞ϙŜ௳ˠЉƂƒǶ؇ÿՙʪɽ¦ΣٌΓɼ^˘͡ࡢѧŀLJŻZĥѪқȾϟɀܥĴ¨ŶƇȰŔŦϸͧxƦĔ…ƞ࢑ʼ˙֬˵ʤЋ˜ǣǔͱɔȗÒ͑ưů¡ਗϬ࢝”εӯཝñܹ͓ԡõͥ˫ȩzá̏ťѩ֯W̃ſáĜq̡ЁÉћԟۏɗාϝȯകƍࡧؕ՝ÁĴƕŊ®Çʱȭɾȉ‰ŧȢͥŌŪŢÇŴƷL˩əȯƈǎGǪɆȓLjеȥɨÕृԡࣩκؗĬŋįƛr΍ʌԷưԗնÔӪŅʔٓڔǬ¶ĤóMȢٕɡ˳|˞ӶkɖͳԀͭࠉڷąŌ˘̈́DĒلςӨã͈ŠĚǫѠNȳ̷̉ǡλڵͳҏՋàˑƩĴŧÝѳ̖ĀĊȞÿȗԸˣ˪ĉʢƵŜʳtŅƼÕȘńdNƶӋ˺ϟpϣȒҗ§࣏ј̣ĝഁ±༱ԕ୷ƒঃӭџŏإݵଗÙ÷İտ¢ಧů͹ͥұģٓэҭģࣃĢѽNJΟ̴ұƞ_ج̬Ŀ˘ϔ`఼Է॔ȃ஖ׇࣀř؞۽঒ڽ„ƎȎБŸ‹ĒĂbƘϩԴ´ĪɘșVʣŊĬŚʵĊÓŀĖAπڟஔÔӈɤϜŽшĥɶ˸َϬfջȢŢ˨Ѥغ˨Ұϰא̈́טÉښ̄ҪĨ̒ɢМ—ஊκ˸ʆи۾ј̬ǕӀĪΎϬ̊ɀ̎Ӿ࣫~ЬȨ÷˜Ǟ͑άŔØeNJĺ€ŊǃƼİɌĻІ]̯ĔXƔƈhÔȲŧďĻǶ¸ɞĺEŌȈ̶ƗTŔƍEÏŲǘƀˊīƫ;ͶȚ¢Ȑއ—ȧƄ¼ÐůŌļ„ѤŊsØƉŨŨƖšǰǤIƖńœҰʍ؈֯ġԱðĖĊÕáɊʹɦМğƂɵ¬ʐ̮ɥFʐDznȳƴþøˍƒ˦Όň΂ΠɪĿƂ„ǀȚɨǾ”JǺȶŃLdžΘʦŬǫՂGDŽĂƂğČƈǞXçöš͖ǗƂͷbȿƢŜĸǎʼnƬô̌ʁɺĈȊʡ؀ŁќȅˀÌʦǫǂwעͪǽ͑ʮdÖȗƮWÌňáŎnjȆɶɱƬc¨ęΉι¶ǿŏȅƕò̯ƓxՋҥە¤ƑلЗðƓΎīäǫǾ`ל̕ҔС٠ƱȨίڌ̽ЎàˎǮϰߜˬ஀đӲÒˊĹ̘ƢҎˆˈǢɃȼVŠƴ̀úßǨजʎȪۓ©ŁȐȭþץʴŏ"],["@@ëµ¹ĸȤÞĥ"]],encodeOffsets:[[[150893,-44438]],[[148525,-41765]],[[151795,-41487]],[[148260,-41478]],[[151887,-41274]],[[151553,-40711]],[[147383,-41078]],[[148803,-39414]],[[140899,-36596]],[[157224,-28094]],[[115900,-26678]],[[156752,-26368]],[[154775,-24054]],[[118217,-21286]],[[152621,-20778]],[[149789,-18668]],[[142807,-17525]],[[142857,-16970]],[[140384,-16156]],[[127588,-15771]],[[128204,-14929]],[[139996,-14135]],[[139508,-14156]],[[139611,-11880]],[[133591,-11959]],[[133754,-11649]],[[139877,-11651]],[[135776,-11574]],[[146616,-12241]],[[145690,-10961]]]},properties:{name:"Australia",childNum:30}},{geometry:{type:"Polygon",coordinates:["@@ñDZʀ͋ãʣթƒɊśȝŕV̡ͥťŕƻࣃÑ˿ǥ܋ĶǭˆśFƵ^׃Čù~·¶½ÚĩČo¦ˆ˜Š„I\\wPͥąȻXā]ǁMġ‘Ñݍ½iÇOĉLÍfϬğPčBuTD†‘ÆÅjǹőҫǦ«ǶĈǒď´ȌªúoŎŸÀvqL±Ŕ{cíƼòˆ¨ˆŔšSƨLêoŌGƚŃ२ȐdxMÀZR¸_ð@Ŝcnj_î}t_aDuvkΉø}žDd~bÒLÚſʲƘNjǼϤǐĜ|òÀ¦ƞXN`TŲAŲNZ†JłXhȠƑբE͂ͰࠬȱФ–ΆǓ"],encodeOffsets:[[17360,49766]]},properties:{name:"Austria",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Փň֍ը£¬ɜ¾ĸƵʮóˠ¨eƕǰœŚ̭"],["@@ݒ࢙ˎǻ΀áƸȋϓŒ̯ĻȏӯŽɑǓˋŷĔƃʝ\\͹ɵqԃόʞƒǁȆǾƄ˛ʈ౉ٷùʈƺ‚ǿƮĬŸɻԹ͐ʴ¢àǬѓʤÛŠǬƤѡȔIJÒƿŦǺŐÂvڲɟ̂ěĔXüҊðT”­´ˁƐķǎȸDŽˎßӌѽЈéڂը"]],encodeOffsets:[[[47222,39811]],[[49739,42849]]]},properties:{name:"Azerbaijan",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@guûƿcy¤«£ŇR§è—öcʕÐO€ōiƃ͇͟ϟչȕů˃LLJԮZپǭ˪ôľʎdzʶ^ƜàÀ̈́ǀÝʔĔŨñ"],encodeOffsets:[[31287,-2457]]},properties:{name:"Burundi",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ʦq̈ʣȋ˥w†…Aá\\ğí£Í}©™•ž͋ʁw՝ɸ£̪ɯljͫVtɴСºÿƞ˓°Ɠȼ̇{ȟ̆ۚɾèōЂ˘ƮڰêƸDžӨŁđͅ"],encodeOffsets:[[5831,51994]]},properties:{name:"Belgium",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@“ÁÁŏEĕŶǽbm…l“’ʻàƋ¿ǃĿQ›ͻɷȍɽ׏ɧ‡Ó֩aл„ɍ€Ù†ÃAƒck_wL˝‡óVŃjån»k¥cÇ{ȍ࣫ŹžàȹזĀJqႬǷʾ±ՔӇ͞ŚԜѴϠҮyΆДo˚τƌڒׁ"],encodeOffsets:[[3682,11977]]},properties:{name:"Benin",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@­ΏȀɃ ɯǂɥӪ̃DZNC˕ӠͿҒÈĸȡŹƁˈ΋΅Гҭzѳϟ΃ҽƊȗ¨˟ȩΑê຋WíͿļƇVֽ^óºĽV«ko¥ƒ¥D·Øs†ŸÜ“Ü­†­€ÃĆ¿žÇYʕ–ǫM͟ŕïÅćÕDķÚĉSą˜ґӂɗ̄ԮȬ˪ϞӶȼɪɘ©ˮɈĸď˚ƬǀǠĄΜǿȎĈ®͆ʢUÞʬʌɸЊ¹Şʎޤ̨ʐȒѲXϠŭ"],encodeOffsets:[[223,15270]]},properties:{name:"Burkina Faso",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@÷r¢dž–Ƿ"],["@@‰ç\\ƪnā"],["@@ęψΒÒ́"],["@@ũšŠĐȟ"],["@@əqƒɚƫѐĀzɮ͇ùͩ"],["@@|JeƊÊAɪ̻ɖnńĊæŶɫD͍oȉZ¬WɆÕв«ாDΚȍéāőžo[Aġğɷ­ijǽǗij|̓ŧǃͱǖӻÞŌİǩÈWŎÖFȠˆÖŰŦQĀ@ô¦LÆ[ǞLòχzˁĒǍx¥Î՗\\ÏPVЇŽƉʧŒŵūŨуɣ͐ljনÇ«ˉӴɛȱɩ›ʑή©ӆ£ƛʉ†˔ǃſѝƲ͓͝ҁƇ¶Ŝɨɉő‰þÈ̎ơЛȱǻïђḍūNjɓŶ™͸ʼn̜iǰ¥ǔàŬǡÌuȦ¿¶ËľŐˠ\\Ê\\ĮNœUšå¨ťjƉĜĥNátÉįÞLŒ`¤ĖǜLú„AºäìȐİ@̚ˆ\\Êõ˜ïƂɡž̗ɲ‘~šȸƶƜĚĦ­Đ‡XfæŰƒȏɐ"]],encodeOffsets:[[[94157,22025]],[[94079,22357]],[[93339,22708]],[[93755,22920]],[[92957,22620]],[[91076,26876]]]},properties:{name:"Bangladesh",childNum:6}},{geometry:{type:"Polygon",coordinates:["@@ĵ̓˧Nǡǭ‘νͻɿѼнҏmƱŐ¥\\ȝ…—é‡ɧuÇˍÏŵsySyFyĵxÿckkgÞŵXñg¥Í…ţśfɏŧ‡ŋiБĦƫòwr§î}FγyoµkQ́ÕċAđZ½SōGëÁȫ^ôͺƕɈЯːà^p~àèR’Qnół~ǴˬŦƪǞįđ¢«®dzĎƹ˞Gä„ĜlŽ‚šĄÀŠŠ˸ƩƇʼn¨ħᓞƏ؀˲ܸƈ˶ŭϬ˴Ƿ̨}"],encodeOffsets:[[29272,44793]]},properties:{name:"Bulgaria",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ÛĝƄHɜĬXl̛"],encodeOffsets:[[51822,26505]]},properties:{name:"Bahrain",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@řǵѡGBņƂôʎ‰ƪƄ€ĵ"],["@@ʚďΏ¬Ķ¤"],["@@Ï{̶̀¡ǀĖ`\\lj̵˙"],["@@ǽWņɀĭ"],["@@͏ɬþĒƻʹЎٱ"],["@@̻źxÌ̄ȅ"],["@@ĹĉrŖĈ‹"],["@@ćïŞ¬®áWͯǓ\\ȓϾ˼|"],["@@Ǐ»Ăńˋ΢ΚЩ"],["@@Ƿ`ʊvѕ"],["@@CȳʣƧďǦȃ¨ËêNJv€ҌȤęȚ̓"],["@@ʰſǾLJ—ЭųƚĚJ¬ʠǫnjɁĴƇIÐŚ¾Ý"],["@@ӐۑDžȯDŽǀěǜǺĖÍ"],["@@ƩĸƀŎPͼɫʈη¶Έ@Ͼ̽xǑŇý·˱"]],encodeOffsets:[[[-74779,21702]],[[-74794,22968]],[[-75987,22747]],[[-75834,23269]],[[-76636,23444]],[[-77480,24013]],[[-76215,24646]],[[-79521,24832]],[[-77115,24781]],[[-79203,25615]],[[-79609,25301]],[[-78488,26100]],[[-80376,27371]],[[-79079,26526]]]},properties:{name:"Bahamas",childNum:14}},{geometry:{type:"Polygon",coordinates:["@@˼Xȗѫϸˇ˵ßɂ˓ʩğ{D©OS«^­To_ðƛSáM™®ëNď¿Ù«§ǟœ_›™nLJäŕġå٥˲ç”ÆÌ̓τࠉ֮Ṷ̌ͬȶªΎȬVɞƱȦǨ͚¼ݨǗ܌@ƤǍƞ["],encodeOffsets:[[19464,45947]]},properties:{name:"Bosnia and Herz.",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ŘñࣸįkŻº¹Î“ŰÊ®fº@ät¶Œ²ZĘQLjR͢ƭʀąKơãÇUoHy±æïh¥@‹ůŕs­[¯PmƼóڟ~oÝőĢĪƉĖăȌíƎ¯†sX}Wŗãy›ÈeƞJǬ_ɀŅɈˇ»OÇaĝ•˝ƭʕ^ƳĂɁI{Uo½ß›™Œw¶³øÑüÁ~jȏOȃpw¤m”•ÊāJqǃNȑEҝȥGŕÿ÷µóåëĿ§ýzÔ»TÃj©ƵåʏǢۃăȳȶ“C¡u‡w§Sßkıě“L•d£ðÉh֡~ƅĩSĂͥrubŅŜËRķMƯbࠥŸண±çýŹġůÕwKñŽÓ\\íHýĭQM¢ѮБȸجОαজØiƦMϨŽž}æwʬòŮIlpŠĶšvƪWÆlʺʂàšwl¥{‘Ú‡NJ’¿Ħïd¹BSjjž¬êÄڒzNvSņŘǜĘxň`è”Úĸ”^ʺQ ØņÌ_jáZƻXrX|¦Ü¢ĊpÜFœϬƎѲӒ̂"],encodeOffsets:[[28824,57491]]},properties:{name:"Belarus",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ÝŝĔɜuĽ"],["@@˵CÒྪzƀ˞KʄИȒv­ħȀOœĿƽԭÌÿğݑӥد"]],encodeOffsets:[[[-89961,17841]],[[-91027,16272]]]},properties:{name:"Belize",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ŏgǎнõ"],encodeOffsets:[[-66283,33069]]},properties:{name:"Bermuda",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ĭއҀޕU฿̇ѥޗAх̽গljȤࣟ¯™ʑѽ•ljc¡ÈÓƨČĪçŤ͗Ĵѵ`ƕ_íTõäǗŠšÛ|Hwy…į“ė•»̅đɻʙǡʽƕƒǽ‹ǷZí´Cˢʯ݀Uˌ̣ͰØɰɗƜ[˾ǖŰDÄgžįĮEhļƊĦńMpkx̭ʐġŀUž¡ƀÅ̾«Ŝ¨Āǁî}nǕξ@B@œUÒĽŠl¢ԔҸWƔDŽŚ̽DŽǡѐȾͼǝɰ^ƘЪՂǟФĂڬʚ͆ݥನ̌G͌±ƜďɾĀ˜ˆä|ƀXĨiʲʘۺЬরǀĈι]ę綕³S·Ħ͕VōÇȅǢх͸ʹؚ̨͋˼ǝɼVʬ˟ծƋnçŴƑÐÁî±ǶBÄaĂ^ʌz¬RӐʥŒՇČ֛ŇIƳI¬›ŴƥŚƋŠΟhȗXŗ൚¹”DÖf¢r~AIǥĵƅO§fǭ–ƛlŹ¢¡̜șðgÔjš»RĉIJɵÚƥúûßÅŵϟµƳÆʼnΏיɪȡu‘Õi»]ÕăÅ["],encodeOffsets:[[-59555,-20648]]},properties:{name:"Bolivia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@˛XȦņƦÑ̯"],["@@åĦłĴ›ș"],["@@LJMŲƘ–Ɖ"],["@@ȗ}İĊĨË"],["@@×§™àĬœFÓ"],["@@ÚǼÊĥţĕ"],["@@ĉćĮːcȇ"],["@@ř¯–ĘĄ§"],["@@ėeɐ̮ŒξʖĞĀĿī̗ҳ΋"],["@@јÆ؊őυࣽǣĽőĐ½ƽɭôçǛǻßɕòχëɅҢ€ĨŸpŏtñƞŴՒͮƀԶĥ"],["@@ɯǑģĐǐƨDŽå"],["@@͕f˜ƬŌçÑĩ"],["@@ƯʓΟÈÈǂ҈Š"],["@@cūƯ¾ɂҌ’˧ÿĵ"],["@@ĝ…iƂȈĺÿȵ"],["@@Ɓy…ǾŰ\\˜ǟ"],["@@ŁIJǡÀ¿Nwʫ̃şݭĘ˝ŒõXŷOƅI½øŻŌŸʰ˕Άƥ†N¶œ„ƢHLżĢ˜`¢’¶ʲɪňĠfà‚ǜH¤nȒȦ–Gðn҂vQ°ÍÌgФtϴċ´^†~PøLÀŸ²µÀ­âÁnP’–––ptzvĖdffHȐĩ̄ˆ”¢¸VĈ¢ØOšRĜvJV¥–§¦ŸżQr犁œArY–iˆ¡èʬñ̦ȠܪťːˊɌպ֦݈Ęɀ˞ǽь࿫Ɍʯтƛ¸йͩ˝ϯԧѷʵוઁȻJλǃ׼…ࢬհǤەʌɇͺƸɾā;ǎ˓ޥƮŸȸӴȂòʀ˼ȺŁĨŎıôfȾˮ΂ҶÌŜąjŞ࿄ؕṇ̌Ɇɂ̘ɣµÅņ®ĨʳǿdzĀĝȒǤ®Ǔś‘ÍƗőՋʈɔǬЊļmñ˅ɔȎВæÚłόõ׀˝̼žͬƛࡌĸєÇనܗΪн΢́˚ķńǗӬƹ࢔ƂķҸ๱Aߑэ੓ΡЅŃ`LƉљՕ̵ƿΑͭơ˭EŶˣ܇ˣЭ͏̿ʏ˾ƉƕôįÑȩǏǽ·ȉĎu¹ίĚ\\įԽƮ৫˓ૃ¤ѳйңŏ્ǽƛͧ۟ͥ˯Ƒ˧ýɣ гףʻɱɩ¿̭ޓiǑȰÍɡ֥ğٚʢ¢ǃĊ٫ŧ‰ŵĔÉً˛śǝяNݩχषڣºŏɯȻbĚǻŽÕƝɋؒĻʔėɝȹöù—ȳŇ÷ǎީÇ݉ƭпЅʝЋЭҭࣁԹۧऱܙoʆ͐²΄ʢĢ̞ƴrdžɄǘwɺŔYdƼϯīɯˬŠˣĿ͗ÛÞŭαϹɹȅуÈʁѱࠃ׿ԕwJÅzË®@РhÀ|’ô¸îêĄĚö쁴ύɸƇ̄ƃĖʥĈ̶̯ϕǦ±‡ç†͑ͺtqMo…]ƒţģŃßU«B[ôhż΅͞Υ˺ʍ‹ÿŝ˳n³Öœ¢ƆĚưɄʊƾࢤ਎ǠWƪԾ˴ɬˈцńШʪƜ۪ȇԶɛŪʏđƟ¦JŤŚǴŒĊžۆ‹Ƭ¨ÀtfǕŪƻơ̈ƉĉoħgûZã\\£wð@Ö_ƹºi áކŇƆMĐăĒţxǕ@±bűƠ«`˝ƹ঱ŸZʼĦڨíʶÁ‚oNJm¦ƒ|ƒ¬ƒ’[²kÖÆ\\ÖĄ¼^Öjv’ƙŮďôΒך]ń©F¶ƴŶϠàÆùüÙƦıɶQĊ™¼ÓiïhǷŴţæ¡¢kź•ƜeǮP¨ĶƆJǦ}B¡qÕe“C൙ºWŘgȘ‰ΠřƌųƦ«œʼTċ֜őՈӏʦ«Qʋyā]ɹ`í²ÏÂųƒmèխƌȿNJ«ŖɹU˽ǞؙŽ̧͌ͷʺǡц²̔ĥ͖T¸–´èŜ^Ěćκযƿ۹ЫʱʗħjſWã{˛˅ɽÿƛĐ͋²ȝPĭGăEƑlķFė«ŻÃÏa©E¥R·„éà¿}ƒ˜୞¶ƶÇs{]ͻ˹׃ȉŗۻ]ǕвۣĊĴŪĶŪGńąĢŏƐĉÆ·Ʀ‹jŵĦƵЄXþŸ|¯^Õ쩚‡ti|jjp|KńǸš|vŘ‡ŒˆȖԸτĉ̲vΠĄƶʢþњ²zŐxú¶ŜĞĮĬÌΊȴܸżĞĶÈ´à^džQłd¾™v«à¯Ģ^ڟ¤L‚vLÆfˆɺ಄ɨఈȟּν̶b׾ӨŶˎÑƅ͢ґRHղචXãŀÀŢɐȧ҈̲ʀ΍ŒѥǦŽѼϥʌf͈ǖƄşƒŽêF̴ΖݲΠǒͶӜȌ˜Ɍցúƥ࣮ϕΦijɜDzŕ͒[ƞǓָ^К̍ŨΦʪŜɐ·˨ĊҔːɸfͰΐËǸ‘x{TøhNJƒ¨nÖUČgŶſƃңϘƱ"]],encodeOffsets:[[[-49649,-28433]],[[-49750,-27035]],[[-46346,-24462]],[[-45188,-23697]],[[-39837,-13796]],[[-39673,-13411]],[[-45567,-3010]],[[-45960,-1349]],[[-53076,-1468]],[[-50819,-234]],[[-51868,-134]],[[-50630,-115]],[[-50931,275]],[[-51636,143]],[[-51356,403]],[[-51506,1986]],[[-61132,4458]]]},properties:{name:"Brazil",childNum:17}},{geometry:{type:"Polygon",coordinates:["@@ıj‡ǜȂųÇÑ"],encodeOffsets:[[-60921,13396]]},properties:{name:"Barbados",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Ĩ@ŴҟƷŒãє"],["@@ɽƳĀ˙ƽ̗ӷҰ̢ÌӒ̤€Ĺ"]],encodeOffsets:[[[117788,5018]],[[117788,5018]]]},properties:{name:"Brunei",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ǝŰīĞGČh’Q®í×«ÛyÉSŸLi‚ŒÅL»q‘§gſCƝ§ŻJ½º{@ŝÝҟcͥIJş—éýƯ}ƭmŻdoºɇÎƹě¤ƵĆijǶl˜ĸâTf´Ű҄Ԅ² ĮªĆ|ÊÌæŽêb̰É^w{Ĺh[ľSźPîMʲď´HŰĆ P†]¼•ɲĉSƍ"],encodeOffsets:[[93832,28427]]},properties:{name:"Bhutan",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@_ƧגࠁȖԋࡔҿĒͅͰqSһ̂Ыࡘȱbȃǎ½àߦ‰ȡgĭÅÉĭęïՇdzͭΏ›“ֵέȿ֍ǽŽƓƽ¯ɡµĉĵ›ͥޑʯÿݏ\\řĠȉNÙtщʺȫFɩƙɿ֥£Ý“ɇƛŁLJã±ȇ×§ą—…ߣOĉĚŸ۞̧٦ϙ̶EᙶࡄŽIᵦሶˎ͌ϯզξʌ{͆Ț̌z"],encodeOffsets:[[25865,-18220]]},properties:{name:"Botswana",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ڊअoЛŻȍÎʣԠųŨ̽ҾŻ̈ˡgɁĈʼn࣪ڕ­ƯǦ͗Պ̃ɒԩ˥úȿřટɀϭ́صvݷˣҫ¼ωӵ༩˞˧̰ΛɔʱŽγȣЋқ`ܱŕŨˁĻ֙ǀ݋Ƴţ֣ʇҽĵ՜޹ޘÃϪ˩ˊƗ֬®ӮƻƤʶȮϾުɰˊВaΞƨƖƶȪ˃ܪζޒ¾ҜԢȇƲÐĒୖǂβɺވݒô̔؈̮̔Ý"],encodeOffsets:[[23409,11182]]},properties:{name:"Central African Rep.",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ˣ\\͠¤»¿"],["@@œ­Ăƪ’Ļ"],["@@ĵÌƚR£Ý"],["@@ƍWʈĸĹğ"],["@@ͥyɰĶǰŦùȡ"],["@@ȬǍɽ˒¢ɸǼɭWκ̖Ôī̤‰nǽۥ̍ԡcƓŤ”ϢҎՂϲǨÜɡƋϻԡ˙"],["@@ŊĀҪŝघAуǿKȍЫøń´ƉĎàüȡſΫÐįƘ̑xsƦɃ”ͨΞÿʉɶʵ"],["@@ŢqȡuìLjѺDzѥ̑"],["@@ĉƒǔȪĉǥ"],["@@ॴΠͰӮࢨҔ܈Ǥذɶࢢ޺ਞֆႺӲૼkԶˋʡɦųēɣއͷ֕Ƙٹƕ̂іųȰȫԘƪʢĹǫ̙ͿɣЦ‘§ȧ˺ӧՂÙì·ȋï̔ƍࡄį¥ýɤuѸȸƮDZʆ€ŤħÌŏƯ×ΰÙቱկʡ’Kǟ͝ƒďƁÇĊı‰Tǹ৥ۇɋ˜űȠȧfÉˤ˚Φɹŏ²Î൤ۨˀ˃–ǎ؎ŮోSҸИƕ{ųŠūʷगΑȍĀêĎ΍ˑε{ɃĒȯHÇΰ̳ľIଘέɜכœħǸljŒٝىʏګӋՓϳhǃʃᥫE›A"],["@@zùƓ‚ڏ"],["@@țûÝâʺZ"],["@@ĦéʯÇPĮƺ„"],["@@ʡĦZĴǂLĆȥ"],["@@ਫŌோ֌̔°੮ȣ࢖Οĸŧė›"],["@@įˈȒNjġĻ"],["@@෺˕նڋۮʱоաĚôâɓɗó˿Âৡ̀ɪɢŒƺĩǕҿã˵ƄƺĀʵÀbźӫImnj΂è͟ ͇ȌǯÜɒċïıĤͫ‰•ˊΚ‘jƮӻíʍȸάĮ؄ȃ"],["@@Ŀůϓ¹Șʛ޳ࡵ÷ͥդтdƥֆ˜ՙ̧ɪ¨ǽǿײŽ€įĪŖĻέ܎ϔ°ǓЬĦ˴ĵžƱӳ̓ʸpħĕɔ§΃ɗࣲȬĝțЉǍ’ijʥËȚIȍȓLjś̌͞ΖĬʭԍȌ”ƌǺňȁϯݥǩÀɡáOю΋ʳƏ”˘ҺŝˈǟĔʝϥ\\Ŧ͏ƋϫЕЇŋŲάŦרшӧGǫǏҩŒɖøRȐޓɇಿƔٽƇǡƔ¤ɒ߈Ѷ۱Š˚ǂÃądž©ˀФΎąĝøĴŸǯzmņǔƀȌ«œǰвڰɈĠijìɚˀ̔˒րȤˮćrĜǪ•"],["@@ȋŸİèĜȟ"],["@@ɓ¸̼Üħœ"],["@@ÑʞNJôķ͑"],["@@વʬNJŖײhͺϩ"],["@@Ĵɯ˳—ѢƫœĻ˦ƍ»ĥƪWßřߍՊlǺͷŚژ¸"],["@@–ΝƙȕÉЊŹõɵʔŤ˄Ͷƕäơ"],["@@ſrðǂÐdz"],["@@֛̈́ÈòюǏdžLJÿÝ"],["@@ůĩˍ¢ɌǔDzŋ"],["@@̒yŘṯ̌ʭ̈„¬̌ϼĚʑۧ͝ĵͳĸ˔xΛƜȟˤ€˒ͤ"],["@@jŸŰcƙœ"],["@@̤Ɍœǯȏ›"],["@@áäВƮͯɑ"],["@@ȩ͋M˞ˁ˳ɧÉȄ˒ϋȣѼծß̟ɞΜ˰˫"],["@@Ěř̽ŎɤL"],["@@ûÓÆƒvý"],["@@Njã¦ƺŦĕ"],["@@‡Íʝàĉłΰœ"],["@@őØɾɮɦřΑǫ"],["@@ŗWΪĐʑ÷"],["@@ԋʆդZ—ʟ"],["@@Œū˳ƒǢe"],["@@ɒƏ‹ȅЯγϗȊJʔ˪ʆ͎f"],["@@̞oYıΡHÞŚ"],["@@έ¤ϡɶٸŝĘƻ"],["@@sȋҕ˝ϕNjֵ£DZʚ҆Ϛୂ¦"],["@@̀ȣ·ijӿʸֈ "],["@@ֿǎȚĀИƭqğ"],["@@ΘǔΖȫႆӗ̾γǯǑࢸØѶ˟سʧ૧ȶõȄ۱Ǽૡۭٓǃ́Ӧ୏īȂˈְȢĹήʦ߾Ѩ͔͈ƟÁȣːȽ"],["@@Οƴ­ɒͤſêʅ"],["@@аåĉëډŠʍ̠ԶƓ¼ƙ"],["@@ʌMśşůŮ"],["@@DžNϤłɝŏ"],["@@§ëǛĤĒȢŲə"],["@@ߝœŏȨ৴ÇòǧǷS"],["@@ʟĎÉɜɐǤɾĹƣϓ"],["@@ԈűĻ׵ӟƧএƒ̡κƮɘѼ˨ޜš"],["@@LJÒȆö}Ƈ"],["@@ѕźϘD¾Ž"],["@@ѥƪĦƌʮ‘Ēʣ"],["@@ϱĄʜŦɾÓħƕ"],["@@͇“~ɖ̊ȁ"],["@@Ǜk˜ŚƄĭ"],["@@Ǣވ˲ϑλγė"],["@@ŋƕƉİʖ¦"],["@@͑ŊLjƔѨ×˝ȅ"],["@@šƮˀĩƝÃ"],["@@ÜǏʗÛǴñǩdɈ̦"],["@@ʳÜˀÆKš"],["@@UěڷĿێȜ"],["@@ĹſгFÎĿۇư̶Ğ࠲S"],["@@फ़ʣҤϑОÓ࣏॑̕Ô܉ʤ͏Ǜň̋ÍȫƐƠࡀǠùȨъĭƅ˺ΈÄ̎ǿ"],["@@̖įٟîΊ‚"],["@@­Gȟ{ͻǕΗʭ̯ȍՑԩٵ@ܥFɗMĿ“˝įöœr­MƟ’õœ‰ÆÓɏƇࣗ͏ٽıЕŧϻǵϷǵɁ@ϝʨ‚ɲӄ̘̾܌ªĆ̅ౚÇɜ̱ƞ֡ʤļƬūĺ̥ũΘˉGȋœǭ̚ǍäӧȬࡩΔ҇Dz҉ǴՓȰࣝʳૻŔȷÀ˿ŕԱȴ˽sÇ@ïƄ˯ŐΟ¼ijWˣùŧæ٥ŖûĸùŜµɌNžʧÆMͅȣBܑ@Ω@ܑ@੻@⿿@、@、@ᅍ@Χ@Ω@੻@ີ@Šćž@čąƓʂ̌Ŝͭ¯ö˰˽ʃлǦŠŐƨűȠĂʕ²¤΂ĵ’ʷʟēсȼɱͰǔϢǗ̝ΕaÁŶďƵϟ€̓øҚİԡsŞƄŭzJLjĩšΧ¡յʄʐϨؒĄիHˣȕƳǐ°Ѥ̜ƒǐѺ˫ЕͬȰʚÉúŸǃ؍̧ʻсɋ̶ːƆĈȒ˧ƵȀҢʽíƇˆұȐùƔˈƞ§ų̃śΈEǢţɻǪϽÒõNJȜĤΫaʣΡʱƕ٫ЈʖΆΖĆϩ£̃Ȭܴ࢔ȟĈɅх†ݦëƄ˅\\ÁĞƟ„ەʘ̑„“ǞȧĔĆɳł¸Æ¢®ÍÞšŌěþϛϘɯɲɫɾ֟̆ģøÁÎʅdžɡöěʒˇƒ˭]ԳĽšĿǁiĥʵȟCˁğŵ«ƉíçZÓʼ؋͔ҧˮˇŚ¢ö¶Ĝ@ÂŽGχUʟũЕĮÕåȥ”ȩ”@Ӭ@݄@௰@݄@௰@݄@௰@݂@݄໒ŕྞҧग़çܨǕ֯ʒ̨¬˭îȀǘͲEŶƈֺT¢ǢѼƥʛɉࡖƴȼǐј|íâ˚ƒࡸǞЄȄ؄‰ɨĐxǏহ̃गį݉ˡԍ̣ɾćǕöْZšȚ޲̒϶Ñɘøþȭܒі਀ȸɑƓĔċǜ¨চђУƄưžٞɷࠎف؎Nj̒ÜƹǖӶ̨ȇŒμľŰ͑ʂÝǵ˙ںrцΞߦLजŽ۔ɽណϻঘÛƹŘڪƒےǏր̅ōō֙F̥řʳȕʨëᕊŗ౜ĞޔǞόɓӾ•ƼɥȨƨՀ˻EƉчEਤ׋ϛ˺]ȴӌđک߀ƈǾାƐ֤͢שÛųƅࡕuĩƁӵgͩŦ;˂ᅰʸДùʸΑ،ƷƔƕ࡚ªॺ͇٠—ૼŪઘĥђæȁɠপϥȼȨҁļϡ¯ϩφζΤÎŋŘўwθȭҠ²ʕɭلǰͯةȒȧΜµō̦{EţࡇŽՔιȽː՘ZŢˀͣЎdžʄ׺¦ઞҢ͹͎dzǹ҇fѢːƝdžՔĔŇLJǺɊاşǎǁÓॣȎӯ΂ɈʨʎOŨ̹©ʓƖĒβ͔ƤмÝƂžϹæग़ΈΪǽҾmڢЗ·஖ٍ֣´LJŋ҈Åމ̵ӜJʹţ׮ĪȧijࡲÍЏǃ́fِͻāͿ̴ǽަ࠼ࢴ˹ΆӍáąϡ’„˳ߢٯڤʰޘ৾ٴÖȩÒȶȖѳƄĵԨ᝜ŻȔ÷̩ęώíêƉ܌¿ӣʫӜƒČljՏǗՙWˤʩǮ¤Š˧ִ̩ơΫ࿃ו्Ԑʵ²ɣĹ͂xўɃ̖ϿΥà˭ëࠍ̢क›pƋؐȯళٻѣT๻ӲşÉಋâ͖ı¶øࢺśߚε࿒ųࣟ࡝ױDž͏ĸÎũПÀǏŲȗƼƹʿn\\ʏցğছȰ̙‡ଝ̠ŘɿʒqĝĜਆɍʷŗԼŤܺɉɬ͇ؿɓދ`ΦȑԫǷǑȨƳ֫ǒʦűΫʁȻRɨƥԍʇԅ݃ɃęwਗƙǗ֞̑ΙǬτߎUظ୿ུ̫ͭˮ࿘Ϳܾ͑ӾϑྡྷЗ˺LJŭɧʰǦॴ|౤ȹƤɉǣӋʄΩųڋ׊ԇȓǫ̤g݆ҋŪɻ΃ɛ̼ƶ̾qٌѩ͝ΤͲϊʢƑŚəƠʠɁɸ҆Фʝ̙ͨࡂĖ̄ȷĆĂÐӅф࿀Զঞބà׊ʅ٠̤̅ଝ֎يז†ʞ̈́ćŕĚǐ˲ʝÈŐ¶ȓʀƬĬʋĈǜƚӻT֖ئэɶĥϚٖʒಲɍxŗϖŐ׬Ǒ[Ą߈ɘࡤ̉íʅɢèɼùƾŵƩý̎ĐȒÓǹƩδɿ०÷ʊDZЪƸĊNj̕΁ð̩࠙¥ޞěªӝ˴ƿηĭ£ŕŔ̷Ǐ̬ÑѦǐӖjˈƉŸɑŅˑַɕՄŰͤθŐǃƧſʶɠàΏĞȈ܈ɸ̠ʨ̢̡“͞˔Ǡ˴ЎźʎĐÁžξç̳ŶsȦ;KťŘ̖΢ˊ¿äą̉ƅРª¶˓ƜæʲʻǏōƜēȤ²ľřұş؈\\ƒǙȚVƪǥ֍˽˞ŚԬNǽɯϗƻٴŜƲƳ̆»SʥѷĻӘ˱ơզȥˡुĶٔɳǝđў¿ʍʼn̊]Âƙů©̢Ň̄ÚƴǷȄ¶ÉœǼƙΥΝܞȾÎĥɂiͱ̥Ӡ͖ɘ¥Ǿʽ͎ÃμĐҶʅʛǣءƃǕƭৃǷ˓ȧȿ¶ʜƕȕȃඬײ׺Ĩ͍płĨٴÅʀ̷͛ƯNJţЬɪ͂tоʙƘɑIӍѫĉӠÏ}ġȟ~ˈɋ੿ֱಅƋୁࠓ໵dzǍňڝÌṽ÷Ϗǽαթއŵୣ࠻૿Ɏॸʃú×ȁ̝ׯԋҿ˿ԣğएБзЅһȣɷ|˺ƻ؟˻"],["@@ʻºȘNJäɃ"],["@@ߎ¸ʈʢҐŠఞɭԿ̛Ȃ±ం̤ϣ̆ոq੆εӊ۝̀ćюɦ޳੊ǬǘಠŹࣈ΁ࡼৱŇљ޲εюĹzŪ଼̓ĪţѨq¼αуƜƏŵ҅ŮΏŅqƕ܁þΔƟÑɣ֤ɬʹWDŽυࢍǙඩ¤҅¢ðƊਿĨ͛ȶٿοޥÉछɑᵽƳЩ̀Ý̚ྣôݩŢֵՊᔔɐ࿢ñࡌìᄿ͎ምĕഅ˜֩ɒIŬ៺ϬᕏďʑÚОNJ۹UͻĬ˜ȆؚɸɣƐ̈ǦᰶتδÙžȏЃБ"],["@@൏ҼʶǺઞÒؘǃ…ɡ֕͡"],["@@ੂVࣤƓࡰտ൹®ఝŝсÎ̥ͰӿĠÓ͘ાÇ"],["@@ߐŢҤAɬĻľԒ՝ÈӓʐӸȸࢎǁҷɜȀÌ׽œʷʨ͚ȚࡌƁ৕ʺࢎ̎Ք‘ªƆຆżҒăैܩߝϩ԰ŜˁҗزʨʢȋžɸĪۦƥOȕ΢ƋɷȄƎɀসơ߽ʖؘɊႤŹո̃ܵёࡨ͐׌ķęŗݛŏш…ʝϧђΰ֤ļ̯͑ТƸ҂ʯćɊ͂Š੖ƋΌƫɟȝϋU׍ɛݞǺ̺ÑҜŒź³õɓे̣ԪÎŹ̻ϘϠࡾɞ௢ȡŎŇ෍ρ੾Ɗȗȋɞֺ͂אʁŤʭڣਗɏئÆ੶įѪůRť෗ÂՑőՀØӪę§ʁ஻ÖञŻɬƭ৒ÇʑōĠɓǎÂÈā€ƨΚÐșϓтȦàů̘žĞʗ]ǢвŸĉȳ͐¬ڎɱƃǿׇFܨïȶĨҨţ։΋تńӪ™ɌŠ٪̛ƥŋԃîҬɩ͕ÁԅĈhƯҖLJՏgȰƵɵNjѓdʑǐŽŧȗ¡˂™u͗ȱʩةȴÜȔʇʅ܅ծߦҬҷȩۑåƚǪ΁Óޡж÷ďȗšèɓփƂךεƕĕБˆՍʆʏ¥Ҁķ~ǩːąÏǫ̰àϞǟǿÿ՜ѿÀƼΞɹɴƐ֐ɉɉŃϤÉśő̯SΊɟЮ@ĵĥ͚ǫɇϯѷѦļсͬ˹ЫV®ʳफИIĭƻŠȫȨ—Ǐ৏֐ƞʽ٫ʬΕk٨ѿϸá»ë๎ڧť˅ᎋ̦ӷƚЀՋIӅŮʯüƈIJ͵¯թ̎ԤƐޅŮĮƒ˗ÍߥӚƸƸ՝IŻŹÅƸ˥ŒȁƼȧÅȌɥࡩx©ōࣵŻݻĺʇŞ¥τؠɐ†Ɍ఼ȍ͕̈́ĂƖχʐՎ[ࡺȂӲeܫֶ୐ҼȶʬӌȊࣃऒ҉LA˖ʝ^ņŷɽMԻɢƪȦ༳̅zʼԔlʲƴۉɎȚnjё÷̇ÀȚŞ؛ÐƵͦёSڃ̀˵ǟҖƅwɝԿ÷ᅗĶؘ̌եDzؓėܙƠ׫ŸೕŲ̇ÙҕĞÙːேǿߍȼ֡ӊഢįפÈᖑϜ³ߘঀ࠮ࠢː๨ńࡈŇࢭ΃տӵςۙ৐ҝೇ˻"],["@@܀ǵదƀрÁƚƃԽƏ̒ī९ϑڈòѐͳҊêŬƃ̗ȕǀЩ߿ǡԉ„šDŽľΉϵśһîଷ٠ԩƐџCࠟϘъ˂޲̙ڎªöǢɤÏ΃ʔײ`ғŪѯëՑDzҠĨϢųχ˼ࠈHUŴ"],["@@ס³ϋêขǶӓȫ"],["@@ߔǁഄiȸŃร࣑ჿHφõǺȹЛͣࠃ_ӿܸھ޼νǾƊƈຬĴ"],["@@ѾîôƵӖȖࡼY၊ԧÂƯᱝىҩ͍֕÷σקܑĭɷ²ଃ̍ދӪએʞңLႢຐݯӤᧈǔ࿈ʿơĵ"],["@@ͧ_ˬĮ¼č"],["@@ҙÞ˺°Ǡō"],["@@٣ĤҔʂנȱЏų"],["@@}̟߱ჃͪըΌࣜƾࠂǩ̮ͧ"],["@@۱ŋÉŌԬŨʐŧ"],["@@̽ƴ̨ÆVȹ"],["@@ЧµӟĄ๘к׏҇"],["@@ӛéՊʬ­ȁ"],["@@ȀÛӑƅء_ɰżߋ^ƺĔωVĝŔ഼ŀтʕ"],["@@ࠆőɓđ࢟Yȑɮіºªé"],["@@ǃץМóÒɅˇôȍùǢʏ̷ÖÙƗᄩsȽƲ˴¸Ӈƈ౤ʖ᭣ƹǭðոɴঠÝχ¢ϩȦ̀ŒӛĪׄĀದсȹnjӒzܻĆξÎ܏DzࡠĞޤƕưȔࡔȑ"],["@@͗t଀ňߧŻ"],["@@ӎ½ʡDžڰðʬDZȤ̂࢜ßĨˁӕҗࢽƋ૑h̙IJᶿկॷŠաɚఐɔ঒šӠȦᔱƿšdž͖ƂңdŷǍ̃ŠÀǁӋģͥŜ˅ūعǠࣵ¾ʶȐল„޺Ƽઃýاº̤ńຼľඡ¾ϤȦலmࢗĈۖȒڰ̶ȵूI൪չᄘMDƂާȘ͒Ǻ۟ȌৼϊՌ×Ʀֱ"],["@@ۣȒΜĒφą}ȝ"],["@@ੱ¨ߌĎ˦ŵ"],["@@ࣆţʯ˓ҐƢෆ¼ٚƻܻ‘ᅌŻĹĥ၁€ᅊΥ̱ȗؖģɬǤόūІÂdžùʂŐલȇkŒ႔ʒאË࣪æ໨ǝۀ̳ܻȍ࠘įҗë͹Îîˋඩģڝ´ډ̺SˇݥÝՕĊÓ÷ʷḙ̂ďᔫIģ˴ࡱɵ࠳¶˝ǤɇƗΑL۷ԜǢӪݿѐᆵ÷ٟȈ͜ĈਕżД¸̙ƦކĀಮŹ"],["@@ٹȍѨǕω‹ʲDžࢫƯȟȿّľĦͲމʕʏ͛пǞ°ˡ͗śзƒσ̜̫Ǘ્ƒ¹ǰʻw͒ȀߪĎᐄܐሺ†ǑłѺè߮ƹ"],["@@ͧ±ٟİs˄রŷLȉ"],["@@ց’ۏҶϖG࢜ͯ_Ǐ"],["@@ᆸ«ȯɯᏋdǩǼ׮ü"],["@@ַ€ÏŸ੊§džāׇ"],["@@ϣƒ׉ǎղƌм˕"],["@@۰y਱ȫ״ѝȧᆣƉڕƔ§̾ᙎǘ"],["@@˦˭ඹÐ̇ģԩúࣻḚ́ƚနɤࢾë"],["@@ઐšΏƑͪűႱɧ֗ʆ״¾कƤʃϖߚRবɁ"],["@@܎νܺǘӚɷ׌fۚȣό؏झqڣ̤ಃ°Ľĺ৹ġۇüūǚ૶YϙĄղĐہœ„ǪرƳŰȀڏLlǮńæ࿰O"],["@@ŹɍथƤHǐݴ€̤ť"],["@@ਰґஂé͈˿ւ¯˙ʴ܌ȹɱߐǡˋˁߪ°ˤſ̠ŐԘ˝ྑʹևʣΡˎ¶ϫّ¢åͯ৷Ξјϓ٫ƘˉƫรƎйŮࠚèୱÆ̱ŤЌtߣźೊ̔਺ø౫ÞणƅƩĤ࠱ĥҹȦ੖Ǭ૳Ù܋ɌƷȂᅄó͒Ŭॣ¹ࠩư܂ª̔ͅှƉೱɼ҆ǰ෎¨޷Ș়`ॲdz"],["@@ᣈ÷႟ɯᦜŪˆĒЖĻܨ†̧ͨ٬Ð࣪ßȉɏᛏχᇃŁჁ˕ᾆǘ♩टঋƀϔʱຓġద}ۍ˥ࢣÉ࿧ưޠıĢɃᅡ÷୩ĈઞɭऺSƇǍ῅טŏൂÄ๨ɋ͡ǥ಍ƒਈƷ֟ˉᅫÃÃΩՍƩ༩w࣯ǰ̜Ƴً¡ʨýቒOѦʫ׆îʲȇʩƹᑝͭƥʠرrڿȔʠɍ൷[˵Ȉ§ˋܭ«િɾȏǩ֣ÒŕŚOǗݯhċ̰¥̏ۗ¬ʼn̒ऐɸ೰æܳɂ˯̊੘âখͷ܌čࡤ®ࡖκĬŤহϫ౓vɏ̲޴ɦͤgֿÂņʎڭΗՍyʢɘ࠱ǻ՛¦شԈະŜผţ౪ǦׁÓဇþzĺڶÅᜁږßΎᙲ{ႊҗ৲ã̐ÂݕpဏՊㄾҖ༓ò໦ДℹٳགྷÝ֌ǎᇏȵ໩̑Ĉ߶ɖጎȊᐯħಣ̫֣L঍ɠᗄĂಊɂያǥጉ¡˗ŞتàϷàნǔݍ྿ƅԂȖఃÃ̗ĨᳮΌ࢜ř͢þ೨Ë೑Ȣ฀Țቜ̹ĆƜᣒͫ᠛Қ٢ľλĠੈ³ŭǨቘċ୿Ȝᒌ_ഞ̣όØಷͲᗮJ์ʕڃƸՊƪۢh࢘ǗŧƲप„Кĉ"]],encodeOffsets:[[[-61222,44995]],[[-68364,45755]],[[-62424,46582]],[[-75463,46680]],[[-75332,46561]],[[-62571,47048]],[[-65342,47584]],[[-63400,48420]],[[-55528,48580]],[[-76501,46084]],[[-129118,50539]],[[-55863,50779]],[[-55391,50939]],[[-129680,50797]],[[-63284,50273]],[[-128188,51300]],[[-130250,51856]],[[-56789,52774]],[[-130994,52710]],[[-81289,53199]],[[-131449,53659]],[[-82669,54014]],[[-134915,54473]],[[-131637,54211]],[[-132267,54393]],[[-132964,54444]],[[-133361,55254]],[[-135839,55427]],[[-134069,55787]],[[-133709,56085]],[[-81897,57557]],[[-80830,57617]],[[-63225,58936]],[[-81629,58896]],[[-70819,60458]],[[-65952,61816]],[[-69871,61687]],[[-80416,62187]],[[-66388,62839]],[[-66591,63365]],[[-81454,63910]],[[-66379,64061]],[[-72025,64050]],[[-83968,64466]],[[-79745,64994]],[[-78517,64916]],[[-86957,66828]],[[-86706,67149]],[[-85735,67376]],[[-110686,68614]],[[-64185,68666]],[[-110489,69020]],[[-75388,69411]],[[-88673,69362]],[[-77492,69963]],[[-80878,69830]],[[-107049,70048]],[[-76678,69990]],[[-104290,70233]],[[-102622,70459]],[[-102394,70670]],[[-81111,70498]],[[-92364,71086]],[[-78843,70804]],[[-103599,71063]],[[-97805,71244]],[[-69544,71210]],[[-79901,71389]],[[-81337,71463]],[[-99778,71315]],[[-88998,71796]],[[-76501,46084]],[[-99105,74688]],[[-117270,74336]],[[-107815,74670]],[[-81446,75423]],[[-88667,72716]],[[-102401,75721]],[[-100628,75642]],[[-95406,75941]],[[-122609,75892]],[[-99692,76315]],[[-97594,76294]],[[-106618,76838]],[[-95787,76829]],[[-98384,77323]],[[-96795,77568]],[[-121168,77394]],[[-80960,77749]],[[-104680,77840]],[[-106519,78422]],[[-100045,78302]],[[-103655,78418]],[[-110891,77883]],[[-91879,78344]],[[-116286,78586]],[[-96558,78759]],[[-118324,79220]],[[-91989,79123]],[[-107067,78994]],[[-97776,79660]],[[-104134,79562]],[[-116564,79621]],[[-113109,79978]],[[-112451,80539]],[[-98513,80417]],[[-105908,81220]],[[-101162,81901]],[[-94090,83081]],[[-71156,85010]]]},properties:{name:"Canada",childNum:110}},{geometry:{type:"Polygon",coordinates:["@@ÅÑ@ĝ«ÏƜŽBAҬǥǺŒÆi’ÅC…ŸʼnOςĩȟзK¥]u­mÁN‡ŠwzµfĿ¡S‘Tďľ¯Ląků§¹B§TďƨyAā^čɵíǡťǕȍǦή̡ƚóǘӓǿųíõȫ֑ēǕÕp‡lÉü³†ĿĪ[ɀƯlűMě‰ñ½‡ŝħãI‡RAÂÆp¼–„ʌɾǂhÞxĮƘ²–nl€ŐĘŌĔvˆnj@bč°ÌºƘŠǨ³ɮƆ۴HĘxX^G\\]NčMVSt‚˜ŘœߜɃĐ³ćǑ@A"],encodeOffsets:[[9757,48405]]},properties:{name:"Switzerland",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ɫªƎŞĞLJ"],["@@ɓśŽĬә™șȬࢲFƔƧ"],["@@ڪĉό¸ŽǑˤċȠ͙ۋNJoǬʫÎƓŅƬƥȗ€ӋʠĄɞƴ‹"],["@@ƾċ͚¸ĶǣƫÁ߱ʎϐl"],["@@̲áķɗˣŤЍÏɗɈǶƌԚŭ"],["@@”ąʹSɶǿǟǑϱĻĚɘɳ‚“ƑʼnXēɎѿƸͰŖѰÓ"],["@@ؚŭѦʅγ ʥǮ͹`ω˪˞ƣ"],["@@mᇛ۩IȥŬٱą૫ƶąĈņĂ؄SʂĮĆƃ͞—ҩΘIȐ˰ɎŸ̟ȿeĀŋ̮ȱάÖШɁǬŴߋʢƍȄºƔآʲɿè׉—ħʖˀŤȿdžϐËѬˮȸƳ͆úƆÛ"],["@@ʊ˭ƃˁƁPɅМʂƄ"],["@@½ijΩCȯȑŖ̆ΖÒƬÍ"],["@@ğë_ʄʾ{ƽƛ"],["@@ͥŸĺ˦Ϛćƭƽ"],["@@ʃ˕Ɂ‰źĨăȊАn"],["@@ıܝƙIįʈƀʪȣĝėˍН¼ȲʢƉŔ͌öĽĺɖǀ®Ȓ̌…Ð͋"],["@@şƪâЬƲÜȜԑ̏ş"],["@@̙…ʏР\\ƖʬŖˢم"],["@@űÖˮ”ƻĩ"],["@@ŷÅȋĂ͈ЬCѧ"],["@@ƽƜĂĜüɷ"],["@@ȯãƙð¡ŐȦʴβƣǫɫ"],["@@ɣǑɲԕʍűԏהĮƦͼìĒȾʔőķ"],["@@ŧāƿ¦˨œ"],["@@˻Wɭł̎ாђčĖʟ¡ɯˋij̔̏ˁȅoƿ"],["@@ƻ_ĦðÖÏ"],["@@ŻšĒĢÑ"],["@@ƾƯ̇ࢁݧ̝ʽ̗Ƭ́ǩ˟Ƭ؝Ʃˇɮхɯƕɇ[˟٩ЛЩƝ׃ǗȃÊىĬąĥƵǑEſ֋ǯŁÅΝ˦͙ğŁ˼ڧ¿ˉɞç߅ǙÛ˹܅ƋċŞɵVҏճϱŗˍrޙʸ۽җˣř֕Ʊƒ¼͕ƃŽĠǣȉʻjߩƊ̛ͫǣاͪȹŻġȌӧŝϡԜµ¬ijďǟګQnōϐÙȺ̑ͭȹĬ̿ȳǧƨЭȫƯˆ̵χʓƟ͑DŽȝuɋȑğḘ̈͏ơďʉ˛[ýų¬։̊ԧդŌƜ×ÉܝЪϗ࿪eౢ̉ڟŶ͉ɑথʯǙࡓʩĕ݃ɂȧʂЄĮ¦ʑϐ¨ɄϞǘ¾ȈƉ ݝ̱ɫ˟хǼ˘Кɲ©˰ƐԚœ׷ìDZĕɱø·ҍѭȤͼŊİȂĵŕ˻¿έ Ɂ҆βŇŴƀΤãϸǪȌȿęƹżňďʸŔƶɫLj΁Ĵӌ̃ޗȭȟȶύĬɢÀS̐ܿǠɻ͎΄h÷LjŎĠɺŃȐˣ˪ĵŶϐ˕˫ǩ˺Ȣq֭ˈʞȂ̀i̫ǰ„ưϢKɏƲƆ΄ʉЕũČtڲ˨ĶϷVġϸৌūǿŸę˴ȋɯʉ‘ΫɢĸŔʔģĞö̉ƈ˘ȼŽͦşlµıгŨnȔҳƽĢȡɵȔڂҞţʈކĜˆɪƒüՕǏԟ̻ƉΨÂöʴŦˆvɑȫϱĔƒɆ֖śΚϸŒ˨ęѕǸèɔԾȴ¸ŞbƄԏɤ”ɪžŠÔȘáʶˊʆ÷̶ØƐŢGşɄ޶Ȁǁñ΂˗Ôϴɔ˜Ŵȋlj·ƨʏɟ͏Nġ€ĤƊƿÄŽͰʜॾɖƤƺӆʙ׸²ЀǓ˼A̜¼Ÿ͖nĊДѾޮ‰ƤͲЪȆ޲˴њßҶʒμɋႀʢɨǀìвǟ؊DzɈȄܞƈȎɼ੒ÇҞɤԤŅѺƴ࣠Ǜʼ~ǖȚǪɄరįՎࡨɕଢаŜľǺ¥ʌƖ®ĊÞÚÈǖν~mǂí§ÿ¬śÆ̽¢ſVŽĢĿȦǟ֛²“lwPoħŃĻƉFgİĭhCÃǕů\\˽ɘƛ×ɯ̤ͯVˋʰܿDˡʦÍǾŒƖ„"]],encodeOffsets:[[[-68903,-57115]],[[-68689,-56477]],[[-71375,-56237]],[[-72695,-56184]],[[-73103,-55329]],[[-74673,-54765]],[[-76170,-54192]],[[-70277,-53916]],[[-76618,-52869]],[[-76348,-52507]],[[-77109,-51896]],[[-76856,-51503]],[[-76909,-50008]],[[-76263,-50327]],[[-77322,-49933]],[[-76356,-49758]],[[-76914,-48985]],[[-76096,-46788]],[[-75399,-45897]],[[-74737,-45854]],[[-75504,-45460]],[[-75582,-44879]],[[-75543,-44386]],[[-80695,-34453]],[[-111902,-27791]],[[-68807,-23369]]]},properties:{name:"Chile",childNum:26}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŀ˯̻̩ǃҙ͓ʥҡȕۉˊ‰٦ԤϨċNðĪބƠΖßÂƌȦū"],["@@ŘScĭȉ†Ėü"],["@@ijaļòGÏ"],["@@QƜægÓų"],["@@ý§\\Ěâ±"],["@@ĵolǦĮ¡cœ"],["@@ĵoØŢžı"],["@@ɭ¦¯ŊˆÙXĕ"],["@@˽´ʷɌնʿ"],["@@ɽǬKŮ˽ĚǙҧ͑…̿݅͟§ȴ͉şȁ߿ŦȍȦDZ™هۏऋϏѷϣɋƍϣ’ڻɽܝҡʯ¥wśУŏ³ǂӖǂ«ĤLjƔҗAQƆɀĂ@ǦʆĘЊӺυζėŅү°׏֛ࣳГΏӏ֯īɍƈƥ‰Ƚ˳·ȑǬˁȼŇަşŲ˻ŗ̳ˮNjЈbҪϾ¯´аżݠ̻ΖÌԢŁȃ˭Öķƭĩ΃ń݇̇ȱjîǁƹ}ÕʃȵÛÅƤŧsõëdžőܗַɛϝˆčࣈЋԔ੏c̕ШȣÀǿϞ͝VħƻRˡŬ͇VϟȤПƛְ¢ÔƏܼпǾͷϭŅԅι̹„ɉūʦ¾ŜƛՀƞΜ˙ͼĝӛ͕κĸoЃǙĸȗÁNJȫśiĺåƿǭŔ̉˳ÏŁĖƿʑǯuîijȵʻjƗˡ˅ljΧǡ»·ȢħįĹ²ʘϙΗɻ˗ÈNJơʌ°á΋êǙω¸ĘǽʷmËɽɫÿhǵӍLåũƏOǶȓΫ΅ƋHĉɃÝłǩŕƟÌ¥ǍșĉÎÛƇĉËȝǿˆͱƯDZªšőʫĈ˻ǙǝŜćȏʍXɁyͩ̌BɠčsǃDžȈˉG̳ͳų»ŐœʥũŒȅƗȏǜ¯ȣ̣Ğ˹ʓӯ¡ϙʟſľɍͥDzě«ƓǖŹƕȉϱÎðìʱЀfǸɀ̌ȳšķƔkŹͩĥŸƒˣ’ƭɪħHnɫƫ¼ßŕɱ¥dzŬ΃͉ˆʵ°ħѮȖɸȧŊə§ŋĦʯ¡Ӊ΢Ήǫƫ˃˅ıȓĆǛɓˑȮŅNjƓƴ́˓ѕʬ×ƛȭ»©£‡ʇRçĒkJQ‰qs³uß©©—mDzΩN£HƟqʓÞđaO±¡oMƋìɕ¥…\\ovY®RěÆlεž¹ǀЋʃϧRǧɸoɨ؋Ĉ˄۬õĠүĺθŽɾƄǼԻUխǙŦˌƩɚªʄżĂè͎dž”Őɺdž`˔ɸûǬĸĮ®ԆóڌǕìŻęȣՖϳ˦½MęſÙċ…‹gʼn–ėʛȅë»٫˼ϧÜԽ̳࢓ƇϫɝʱҍӁ¢׍”r”KºÄ’MlVžzʬ܍دî‘RćgğHůΌǠTƎɻĎ÷°ŸOůą³GʱĐíNŹOĽTg\\|ĺ]xцįrĻRéaåÉËą{ĭ©±Ÿӷس· ÉÊaüæȶhЛŜȏðŵçŵ•ői_B¿Ƚ`ȧÑ˧Nűbķøï’û€ûn¤yrÛP»c‹Ĺĝ‡ã€ġÀåþ·]ůÍq“d¾åŪåîå¶ɣCǕb÷p…´„ĤŽôAjVµNǵ³·NӉ̐­ŀ¡ĶuÂá„ïv̑ăΫή޹ϜƫɚǁŠdzrȋ¥Ƌȳß­LJǔĥ®ֵɺbĬʃǤɓÜɵĊɿ˶̧áXȐ½dž‚ȲȗȚ‘îƔy®̈Žb·ƒšɄŞqш—¨‚Ķm®ƏĶëîå͆³ǢȲǸ…ľÑŽҍǺƗ˺éǂƒ̂ȱ`̑gŷ‚ǡšǯ¾ĥ¢bą¨ËšWĪ£Qĭ“œuÕA}fÝżƃȾ˪mÜeÂýņ˜ĕ ÿdħ…‰Z¡Ū}~ʕÖėe¹_ǓêûB·]]R{vķäGjƾâĢ~¶pXIz‰Öq¨NȒźȋǺçܠ҅ǘɃĵȋÊėȺĠĪǕɖ|ƘIªLj’ìøPzĜ—¤GŒjzz¦°Ď¬Ä۶ʈ{Ȇ°~VŜ™ĚHŊvɾنCĺˍǎE͘ņ¼áގìºĈņœîdäjŒ¢ŽĬƐì–â`ԂŸŚ€Ą€ŢIƖtȈǦbøäžʦŤҨȈЈĮØĆÎhʴdfVXb‹ŊMҜ˰ŜůƜͪIJα޼ń԰ԡƚǀļ൐˾Ɇǁ˒¸Ɍÿøʤʟƞ׸೺ࠤǹմDĴšטȞƠdžŋ֊ȊЂڦŦɒѪўŠĀQȞȸ˜ªE¸ƋŇijô÷ǒ±‚yãŷˤéĔËĔg¦ÇRćĚ¥ƀËâYŊñδvèqǼƫ®Eâj¢–ÎQÚōô™ĺsdkĂųÒȁŬƹÔąìeÐ}”ÑÚœ×БŠÿ¤ÓJÍ˷ѕǺˡƢl҆ş۶ÉžDǬrؔù৒ӿ՚Õqȧǚïˬ֫ѴұېÎቚȅѠĠĒMζ­ӖÅͺYê]æo˂ʅƸ·ΘÅмï՜ɉʊžʶ¤nj€@ǿ̦]ĸ£ÌjÆ¢æØİ„ҮȈݸʜ୶ƆѠոlĔdߨˌԜӊܸ˶®ŔѽҬиגŔdäeʤIôŸĈÿĠ…˾ÕɄeǨ{âaÆdȌŐŸ ¨z˶ȚŠǀƮ|Ʋ“ȲXѦÌѢʀ˜´W¦_”̌͸ʞĊЌup|AžŠĎ\\„‚`ĞDǎÏˤŰðXŸĄ[ƨWÌTØSĸÌĨsǢąƜqŤZŬmðD”l͜~ƼƽʖՉшÁ€ř’ĵ‚ÍÄĻĸ͔ؗHΕ˯Å^ǹŞı~§bşbĝIśsœJ½`ïCſËåßăqɿǀûɌβŬÀVĈIĠ|ĺܦਸ৆ʻӠ˦ڸȈðDzƵńݺ৐ֶжÿЄӳÈvżݢкᔺɘৢ΋ɚÎӘƉ׊ֱӪ੗͐ͣ~̛Ɇş‘΁Ϙȝע€̤ȍθ^הй̜AɑɄɕÑ˓Ȕʹ౞LȚȜξƄ˘Qۚɶ̺ĵċȗƾʵӭ΍ʱࢯΧգȿġÓ̩ƫč࣫ʠͽ˽Ϸŝɰ٭D׋ǁЏէƥĒLJ"],["@@ƅ€ǦüŸĻ"],["@@ɂzDȵ˥ÎàŮ"],[],["@@těřlĦð"],["@@Ɨ׏ԛژƇδºцބ୊ҬȰ˰ʧѿຩ͝ҩ"]],encodeOffsets:[[[113551,20472]],[[113035,21600]],[[115348,22160]],[[115498,22121]],[[121020,25085]],[[122697,26068]],[[124162,28761]],[[125232,30683]],[[124788,32249]],[[133660,43557]],[[116734,22744]],[[116752,23053]],[],[[121250,25111]],[[123913,23164]]]},properties:{name:"China",childNum:15}},{geometry:{type:"Polygon",coordinates:["@@ҒӁƗĊTĸÙÖCŶŖ͠ŖǬNʖ•ÈZÀÄą®°…òŷt…¸×¨C¤„lpT£gå“ʱ´i”ˤſĀӻ‹ÕoOwfY‰¯qķ÷ƛБɣףȔࢍǤģŽƗ»ɻ̑¦ŶŭȉٯưЧ×ӒKܥû͏Ôí¹ʲi܏ij്և{ȆÙƼՒ¯ʔƳÈÿXÑĴŽmցîÿ¨ʱ„ʧƠɜΰëЮkdžàW̓v„øƞUĚĮǰúýXێ†ZżN¢ʄnŊUîû˜@oɤșŦZnjŠŒľÂk†‘ŒáŒnȐȭäcВƐDŽˢɞɶñ̲ǓÈǘɐNp˜mĶLÆT´nnƞăȜƂºˋC}£ùFcĺ¹èMńĦX¢ª†ŴšŚNƤŁĶL"],encodeOffsets:[[-5388,10568]]},properties:{name:"Côte d'Ivoire",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ɯˉϽީʵȭƼƣ­ӭƘ֫˪ˉÄϩ޺ޗĶ՛ĽӿˉȨ۵Ĉ˗ƾઇ‹ÕĂඉžǯEgōț@ʱ@ڻ@ġžƒ|K„IlsNlȢńҐɵϬĀðĽWïƾƸ°ċĦ¤úǣT·ťΥƚçϴɏİIŽĭ²ƨЌʂܸатʒ˼”p®hƐIJĖÚr‹dŸjkô]ĶBNJƼ̊ʉàáÖȫ gìZƒêŲƎzNJàÀǢƒāž–ÖǨȴǼ׌ƞˀƮ|ΘŊŴrÌÎΖ®ļɨŚÒЈŨŔĸθƐɦNJɢöÒ܄ðHºh̜ȌºքčŮȷ¸óøķՎƲAǼ±͖ѧȠց©ؙĒϷŦʕ͈̋உwɡʍ̘Чڄիθ٧Íɛ"],encodeOffsets:[[15852,7705]]},properties:{name:"Cameroon",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@͔ϵͼʛȢuʦƴмħȴȂǪsѤԕ˂ūàǯƞ@æőÌçŷ̯üǍį͡ϔƻÜȍહ਍Qˏǻͳşణ͉˧ÅЋɉǣdȡĶíǮ˩YٽLjԭBŸß˵CÁfëǚѡªŵZÓU«ėǃU¹vŭ†š¦ãĴȇöÙƎģŨĥĚĹĎƓĀɍ̂؝༓ʕyʥϿσǠϡ”ܷɗࡡČȵӦҋΠÍndžʌÔiઁȃDŽ̑űƿ|ʅόƭöśˌ۵ʔΑծ˭͕ڡÚ֩ɢ»ΊމǣWʌͱɒÅģÉ̳œ͙ijɗPɇrÙ}ýÕߏ‰J«ÔmʖĔŜğմ͓Ӓþٴċବ¯pҽjɻFʫH¥„m¾B¾ÀƾQ^ĝJʕlj{ĹU̇Ɓ™ŕGljĝƵC©{ɓǓ‡Ǖ@͍ÆүƟ̫dÁQԁۼÅ˖ęƊÏżϢƇǖėÈĭ†ዱRՍMƋPؙŧȩȰɬƒծ¨ˆÒ’nfȞȮIJ”Ġœ``^„¤CɺȝȶĮ¶ɢȊ}ΖƼüųëŕœȷʠ¥ંबȒآCܒ˚˴˶Ԫܼ֪ˎᓀΚފĴҮ_ܲЌҜδȤʲΜɓ˨̯༪˝ϊӶҬ»ݸˤضuϮ̂ઠȿɀŚ˦ù"],encodeOffsets:[[28061,5232]]},properties:{name:"Dem. Rep. Congo",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ijҭΙމˍᒿܻ֩˵ԩ˙˳Dܑȑءઁफʟ¦›ȸìŖûŴΕƻȉ~µɡȵĭɹȞ£D]ƒq`ÝÊ÷Ĝƒ`̅ƃНΕȫςխղĖȎɨƞƴƋnjb°̆ǿޜǎȇŬÊдϬÏ͐ê]ʹƄĒǠėǖ͋ЊçɦɎź˝ĚsǦ؋ŘȆ˞øૈԩ̶øҶ̾ɪĚɸȽЀˣ¢Փƛ™Ғĸ̼ઈŒ˘ƽ۶ćˊȧľԀʈҾŤ֤݌ƴ֚ƿ˂ļŖŧ"],encodeOffsets:[[19057,3562]]},properties:{name:"Congo",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@՛ǏʑЁχ̣Ư˿ŗם̟ԃʶÆɘųŌЙɴ˹çٙɞŹǜ˳݆͢ĔԜŗמۣߤ„ԨŐ̈́ğPȿ̍և}ٙnjե̎ϕҡԹȬ@΄͹ˬকǥ‹ѦɿΎ̱҇ɏȨ¿šäĿඟWGձҒQƆ͡ˍÒӧŵa׽ξ̵Ƞֻɧఇɹಃe‡ǛƼÕƘµŽ“~ͩ‚՜़Ëfㄥ°ɿŒÓZµÂǫľ­X·gñgéÉǙkƋĢNjÒ¥[Žû©ȟ×؇N£°Ƒ¾•ϔʥŚƗώǕªÃÒ¹xÉÎрÅx‹–§Þéɪ¡À£¢“’½¼Ù†ÁŒs®iœ˱Ųū³Яǒг̌ȉǟݵƄÑȰȡǜГŌ֭ЦƓƘȞȎǺÙ]ӪƦń̌tɆǨئ৔ƽi]ƒãħ§ʬĥ‡ƘƼÈ˘ñԐƉǴʈȲȁͮĎͰҁպŜЂȊŏ˾΀ʁѶĔƈѮӋÓįŚ•^͊ůɚզΒɀ͚̈́î“ɼŢЎƛ¿ɚϾԐоќħƻőĬćɐҲۤsࢎԀŞʦΞȚϞíŀʏƵƹ"],encodeOffsets:[[-73031,12147]]},properties:{name:"Colombia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@нǏtĆƂ»"],["@@|ɳʇƼɌø"],["@@ȧŲÔ̈́Ā…ÔЯ"]],encodeOffsets:[[[44840,-12602]],[[45544,-12371]],[[44509,-12186]]]},properties:{name:"Comoros",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŏk±ŪƖlƍ"],["@@yƾú±¿ŋ"],["@@»ûǛœ—̰ʰˏ"],["@@ȌÉcŁȽD–Lj"],["@@°§ǭxãęÙłʼH"],["@@ý–¢ŠœƵ"],["@@ǥ^Ƃø¤ĕ"],["@@śU{žʬî°åǃů"]],encodeOffsets:[[[-24891,15213]],[[-23738,15501]],[[-24006,15369]],[[-23467,16627]],[[-24665,17022]],[[-23437,17059]],[[-25484,17222]],[[-25773,17354]]]},properties:{name:"Cape Verde",childNum:8}},{geometry:{type:"Polygon",coordinates:["@@ʜԑӌթǸýIecgµƒƁð—i_¹{}‰W]i@͛¸GĊŖZ‡ǃƧ¾ėVũa‰ƓĭŰɡȳʂȢʵIJƮʧɃ’DžƚĶDŽĻ̄܁Θő˦ѩ˾Aœ̎ʉDžǿȧǬʹüȍ͞ƶϞȫźƎƐƈń֦ȳɴĎ׸ʻǦ¨ÒŎ"],encodeOffsets:[[-85649,11180]]},properties:{name:"Costa Rica",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ͭŋȋŸǰAğǘúŶɸ«Ÿˋ"],["@@ȽŘʈ…‰đ"],["@@ƋؖĆĶƝ"],["@@ӚKİďж¢ʈƅҜ³ҚЕӸ“ࢤӍŞQïĎðc̔ȑȅĨŇźĘȚɑ२ȁńĭŅɽۼÁ̴ɡ̄û\\Ľ߳ɡ‡ĚśīܱĆಳœԤҬŁȤݗIJ̽ʖȥҎՉMܻʌɉɂҥ¥űǎċƃӃĔȓƤ̰ĠŅƨݱbաϹѫ«ʼnȑЅƕBż͕ÕҼǾ…ʮˆʎڎʨஜǐ"]],encodeOffsets:[[[-84543,22090]],[[-79533,22479]],[[-79748,22659]],[[-83801,23719]]]},properties:{name:"Cuba",childNum:4}},{geometry:{type:"Polygon",coordinates:["@@ȳèƍȨ΂ˏ"],encodeOffsets:[[-70401,12350]]},properties:{name:"Curaçao",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ɚ™ʡuˆÐ"],["@@çSƎ°å›"]],encodeOffsets:[[[-83322,19814]],[[-81739,20186]]]},properties:{name:"Cayman Is.",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ѹÃýƌϵÙǧìƖRÀǮ֔‰ߖʶԩ̳Àȑ"],encodeOffsets:[[34821,35907]]},properties:{name:"N. Cyprus",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@Ǩë϶ÚþƋѺĞÛ̍eׇͳҹƆōȌ_ňΊö"],encodeOffsets:[[33498,36016]]},properties:{name:"Cyprus",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@òFòrVņ࡜ͷɲšŚçǫųήˑ̎Ŕğdž҈ơʌ¬ÙDžȺŧźÂ҆ſɪ̱֟ɇÙlj˝ƩԻŸƵȯ΅ǔУ•ࠫȲ́ͯաFȟƒ›¤í¼řêęG‘nП̒ȡìʓ˚ĺŚ΍θŠ@m´™žÁzrȴǀϼĈƒhী͜£ŜȎ™^ˆ‰zGS·šoÆc˜F€rXb"],encodeOffsets:[[15165,52080]]},properties:{name:"Czech Rep.",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ɭ‘ćȼ̶ǩ"],["@@CďѣœŬ̸˒řªƩ"],["@@ʂŵŹǝܨſʀÂIǕǓęĚáМ§װȊϸʤϠ³ΚɧɶXŢʥͦϐƣĮɭCÉCc•ýÙáŻÿU¯ŀăɖŗĘį¥ć_Ñh–‰ÄyÔƗųȽŘǣyé^iƲ»~yx˷ñēŗIYWaq—EÅd™pT¸yH‡Š]ȍš¤śি͛ƑgϻćȳƿyqÂ±š‘n‰@SQ@…ǤōǾɑĹřʔ˙ȢëР̑’mĚHŚé£WgIŁY…ʣK]SYM¥Ɲñ¿ě{ϣǏnjǻ±ƗƀÉKÙaÑc}Cõ~ϊulCv`bs‚í~Џ¤YQN¿cw॥ȏ½JñÔo~DhŋHépƧK—T‰ő‡©ƻñdîœ|A~Itur¿‚ō ùpȋ©ߛɄŗ›—TsŽUĎN^MH[W[åWqa۳GBӄѦۈֹƮ׷R͡ʖŤ̄ʁİǸy¼NðȌ˦̇ʤ°żDžŀɮİÌʬȿ̒ܐƒÛĨʾʦʋìź˔„ƒՎĻǐǰǠ؊TČȉŘmôƊƌDZļИӲeӠʩЅʰ͡Ě[ʞɿþ˜Ĩɿξ࣎ß"],["@@ŦɦÓŽɀOˑė"]],encodeOffsets:[[[14539,55214]],[[14039,55688]],[[9974,56142]],[[8508,56102]]]},properties:{name:"Germany",childNum:4}},{geometry:{type:"Polygon",coordinates:["@@˕п̩æٓčKצӰپ~z”v|OȌŏ–¸Ŭ’®dAĺ”ĤžȤ˻xɳثѿıX¾ÙϬüǠõ"],encodeOffsets:[[44284,11776]]},properties:{name:"Djibouti",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ÿké΀ƴęIɹ"],encodeOffsets:[[-62752,15615]]},properties:{name:"Dominica",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@͆ívŅʷ§ΟŨpƘʬ£"],["@@α§žŲɴĉ"],["@@ɉhsƎɾƵ"],["@@ĥĎˢʰǻͽ"],["@@͹äæǎ̰ŵ›Ļ"],["@@ŠЏ˽íϡĬŅ̐چĂ"],["@@ĩ‘¢ľÈë"],["@@̓ˋǖƯ˕ĉ‘̻ǁ•ǩΐ̯dʵѢ̀€ʰǢNJɑ ɪ̒Ŵ̠¯Sɻ"],["@@ƭTʨ¼ĹÏ"],["@@࣍à¯ўНƴ€ࡎѐģǼȪƮ¸Ŋû¶ʼɗHȃʓʭ»ƹǀˮɒۄÂѼ΀ծƀ˝भզƫơǛι{ŕ̇ɻkĶçεɣäȑǽȏɺÑPţ"]],encodeOffsets:[[[11635,56210]],[[12851,56285]],[[10303,56204]],[[10992,56065]],[[15450,56343]],[[10901,56945]],[[12970,56931]],[[12871,57124]],[[11318,58627]],[[9974,56142]]]},properties:{name:"Denmark",childNum:10,cp:[10.2768332,56.1773879]}},{geometry:{type:"Polygon",coordinates:["@@ċøˆǜǜk~ĤŊ״ÆٖɳȦ„Ǽ̹юw̻Åcõ߂dz̄ʗ̇ͫȻNJ˷‚зH׫ȏƑĴ͏ÁΉՙljŜŗɠHƐxÊsÐġÚÉĄ»ð\\XĶHļĴbÐM¬ÕŌƈǬ"],encodeOffsets:[[-73366,19657]]},properties:{name:"Dominican Rep.",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@Ţŵ׳CɃšē†ăçij‡ėȵؙչj̥˾ҝȢįȄїװЃĮϛÂȻʜ१ǫĩж޿ĢୡƗϣŖי͡ʟ™ɡҬ؟ɊحŠėʒÆےȥϰڝ␣ᕧ൩୧ഝ˯ܹſȣĮŖʶĿτ௏Ѻ×ƪϏɚiʆ᣽ၮ᜿༸ἡኒ@̸@Ȳpیত֤¸„ʈǎʊcĎeĶ]ŒTÞæ”ƊЎVҲŀžĒĨĜDzʤDŽòɀÖǦÖƤĢѮLjǧǔG˄ÎƬÊTĄYƒd΢Ŋ|’´Ƙʂ೶^ĦʺªźÝ´ĝȱzćæ»þ‘ǒŇȶĭஶ˯Ȃ¹¸yØҞâ਺֮͆{̢ˤֆʀഺƂ͊ƸڲĤࠖ@ҌȻৈπφƓʾ¤…ľצȣ֔ærēͥ˃"],encodeOffsets:[[8405,37396]]},properties:{name:"Algeria",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@šm¤ȰŦîƠ³ȇȻ"],["@@ā”–à¬ij"],["@@Džn˒ǖŋȃ"],["@@ǩĄVĂɚĆÜƣšħ"],["@@ƹb‰Ɔƾ|†ǣ"],["@@ʙÂòĢǨƣ"],["@@ЈٷęǁȍáʍpÛŖ̀ʪȽɬ¹ɞƗtȢļøč"],["@@ç”üÈSě"],["@@˻_K‡Ò•УÈƇƒƳṬĉ]vw`YųӍѥԏӷί঳Ι͉ЫĕÚʫ܏ˁƧđ¥e³X¡I±_i…½—kġ‚åB¿|Ëô³ØĄ]Ō½»žÕYïQ¡~ı²čÀـ·]ăė÷Ÿ“D¯€SŠœ¸úńčF‡’Iža¦jº¬€ŒuŠ´ŠrŒf¥ˢåǂ̤ȘȞӢĥіéЗĕQpǠɹ̑խπƠˬţܚ̊ȘĊɚƢ‡ǗɄμѲ•ՈূΠ’Ⱦ֮ХДŋȢǛÒȯݶƃȊǠд̋аǑ"]],encodeOffsets:[[[-82054,-3044]],[[-92594,-1372]],[[-91564,-932]],[[-92502,-790]],[[-93620,-471]],[[-92747,-342]],[[-93462,26]],[[-80803,1283]],[[-77091,-109]]]},properties:{name:"Ecuador",childNum:9}},{geometry:{type:"Polygon",coordinates:["@@քนƕǥ˱੉ƯɃϭʄљѪֳ஀ǥ˿Ҏࣅղ֕DʓʦΟĢ҉ਠᆣӸҋȱc‰šnj۩҂ˉբՍ⮿AªŸï°ŝǙƗOᢱBᢳ@@᳾@ᴀɵࡦɐВĝրʢːȚšіĜଖȱʖƑࠎƋҴȁܞͬʖ€ƢǘѺĠ̡ųςžæŠψŧ̬êȺǙȳŢķDž˦ǗưĜÅþ͘ȋࣂ¾ҀNJ¢ĩ"],encodeOffsets:[[35068,31958]]},properties:{name:"Egypt",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ɐĭΣ„wêļgŋÌbŨƺNj"],["@@„ąħ´ä’"],["@@ijňԉˎ׃Ę˫µ¿Ē½ ¥@y•ƷĕʵµÕHǭȆǿò·Ö¹–ÁťĥɁ¹œßƣqIZȿʠțƳdz˜ŏOŗ£eCʎkNJoǠkNJŞȖ̈޺sˠúƨEÈhż\\ŽªDĞgȮj– ¶ưŒˆȢŔЄł\\‚nj¶žv†¤ĚǀƴΦޛɞএФڟà̄˺ϥࠆͥКՙӲͩż̿ľRɰ̙Ƣ³~üêنĭģĹ“cB‘«·ūÁ—ȋŐ{P“u}yõĔÃüùĠƵĤûŦāƄͷˆΣО"]],encodeOffsets:[[[41105,16073]],[[41039,16469]],[[41922,14319]]]},properties:{name:"Eritrea",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ąƏƧĬɮ¤"],["@@‰˯ɯwĉǰłƆʂM"],["@@ŝĄÈðżýåõ"],["@@ëȓȩŧȻ˨ڂȤǯǏ"],["@@ŕħƅœɔĬȔЬŬ€ÑПɥë"],["@@ƓɞÒðǞĵěȗ"],["@@ť—ŠŨ̢Ȋ]ȗȧā"],["@@ǁA~ĆƄă"],["@@ȅ]ŀƪǺ’ºçƭĵ"],["@@ˈý͛ͫɭìċƂǛÃʼnĀڐͰ[Ư"],["@@ΩĮ[Ė̼}ÊDž"],["@@͒Ɨ¥ƿƈ¤׶ʩ৾ğÆžؚȽ[¡†ģîJƠ¾żÌĖÕমàŠХȱƩޟЕࢥȍˋȩƪčʛěޡँĺϧ΀ʭ؇ωʙҟĀśԙÏˁƣЃԡ቉·ʵDZйéǃʍɝğΑƌ˿ϘƖɶƭçϽϔҕċҤФϮůMȥɶ̄ԊҍԘΘjŤĮâȊŗŪȈƨı֔׺ѮˣŠÛɨѹɍŭؽkħ˚ѕǑġƐǒƚĿXðłçȔȃĘǢʵƮ´ǔްɞOŠɄĬтœϊƻ৸ú૖ȕޘĔҺŭƜêҎŃҘä"]],encodeOffsets:[[[-18317,28478]],[[-15770,28823]],[[-17597,28695]],[[-16726,29062]],[[-14537,28846]],[[-18262,29178]],[[-14045,29606]],[[1633,39601]],[[1480,39853]],[[3221,40746]],[[4397,40799]],[[-1837,44450]]]},properties:{name:"Spain",childNum:12,cp:[-2.9366964,40.3438963]}},{geometry:{type:"MultiPolygon",coordinates:[["@@צƝӿȁ̝[̿ʉLjȊʱĜgȢيľ"],["@@ȟĠȊUVĉ"],["@@͋ŗōƤ̕äӾŦɖą\\Ə"],["@@Ŝğ׻ӱÌӇɶ̍ȣÑţŏ¡ś͕æηßȟÐ՛ˎ͗öƋ®շŽă•‘JǦОΏó̅ĂɑʢƠňȽŐÀɴӶĄʠƲࣂ¤ÆIJ௺ǁࢌ„"]],encodeOffsets:[[[23161,60029]],[[23904,59956]],[[23474,60239]],[[28685,60912]]]},properties:{name:"Estonia",childNum:4}},{geometry:{type:"Polygon",coordinates:["@@ÖGʶ¶ƸĖz–¦@¾ŸÀđˬ¶ׄėԊˍĴŇΤН͸˅ĂƃüťƶģúğÄûöēӯٽLץٔĎ̪åɟͱƺͭ˸˓ʪст̵ᠴ࡙ࡀ@ᢋᣭߝͽăϩǯɥˏ۩ƻĝę­ūBɋ_ğcŵCǙĨɋǺޡΟ©ąŏƩƍķݗŦſJȏ\\ś~޳ԘȽƂݑ´ɑ˸MŤnžl¨±ǀΙj½ @žHˆʅ̬ɯڬիӆƉʄݻ͠ʂҌ֢NĴĐJޔȞؖ„ϾȒȆǘőƈIJƲߞҸڴϤŒͰాfDؤŐPǴ—ȜƴɀʟYrJÞƤ¼ŔĤɂÄŦº•¸ÕȀñǮȅ"],encodeOffsets:[[39354,14775]]},properties:{name:"Ethiopia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ȬɯřʃĸĈì"],["@@ų¥ÙŠȎù"],["@@ǖ™ƋƛłŒ‰"],["@@ɫªͦZĹÃ"],["@@ҩı̞Áʩ̏ǶʣֆŅզͥޟٵࢌও͗ďĝ́ȀēȇƩЀǟ˓ЈȱSƭљʉৄѵ̒˕̅ͻహ޹ལࡓਖ਼ĽˆDzljǙΟ¦äŏɷ×ďÈ৯ʿࠛ‡ωƛƬǦʋǀƋŷʋyĺ̐९ǺƜ࠶̋ͰĥـюʦėƒٲĘǴ˴ࣈؘٖͤ߬¸ºԴ֡LjŸǂЇ­ϣϔʎҸ̇ˌþʚɻŒƺдڇΎܙźିѠόJ@ƢѸºۊҭގÑѾƂࣴdzڴͬ˘מϠȊԐQԶƄ୨ͥLjǕХʝĶŽ"]],encodeOffsets:[[[22708,61820]],[[21966,61983]],[[21727,64760]],[[25445,66551]],[[29662,70679]]]},properties:{name:"Finland",childNum:5}},{geometry:{type:"MultiPolygon",coordinates:[["@@ѻŭ͂ǀź‘"],["@@ăÒ¬ò˜ƃ"],["@@ʾɽÜέױƷՑƾµǶȬ˘˂Ŷϲb"],["@@đAĒƮ@ƫ"],["@@s@²@ê@ŞĈĩȥ"],["@@ϋĊĞyÑ"],["@@λϿHġ̦ȔCȍё½ǻĀǏƿʧÛǫǂðƔȆSغ͎ϔĆ@_"]],encodeOffsets:[[[182772,-19429]],[[183654,-18536]],[[182559,-17788]],[[184320,-17370]],[[-184294,-17331]],[[-184247,-16898]],[[184320,-16556]]]},properties:{name:"Fiji",childNum:7}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŤQÑŷǓĜł®"],["@@ݲĒĴÉչҕ˙cęŹ˩¡ɳŌ؈ʈ˿º˲Ö˕ʀʂĕ"],["@@ƍĬǤw•ó"],["@@Τ¯éƅȦùZƂʄ„ƘőŷÅƚ«ݡʥ~ƍҗæņŽɯm¯ĥɅƤàǬјȬ‹njȸȆ"]],encodeOffsets:[[[-62483,-53028]],[[-61733,-52697]],[[-61554,-52629]],[[-60262,-52500]]]},properties:{name:"Falkland Is.",childNum:4}},{geometry:{type:"MultiPolygon",coordinates:[["@@ιÆʼnǺàż̎EƬș•Ǜ"],["@@ġænȲŌċ—ȋ"],["@@֥݇ɋչˏˉܩŦ̥ȟʫò率¢•jqZXRŠN„B¦ÖìœŪɄ¼ĖtƨƒŨ`”ŀƤ®ĄsƲˇΦŇڂҼ޶ࡪ˿ԞН…ƝĖüƌũ²̫ƦʄƦӗ"],["@@ȥw¬ŔǝȸʊýĎɕ"],["@@ãJ¼Ĥhĭ"],["@@ƛ°Xʘǐë‹ɛ"],["@@ǍC¨ɺʤȿŽu"],["@@Ð֧̩س͇ǠäĦɟȘâƐœɚȾɀмʦʮİDZ"],["@@‡ñƥȞǮū"],["@@†ƒÞ_zY~mªQÀRž~¾\\Ǝ͢ʕ׸QֺƭѥۇAӃɭƅǧ´Ɨ‰É¹Č¯@akiw‡ŋēŏėk•mƗ±cƣʹǩWijkƗŁÅBÁˆQäJĨžˆŞò¾ĜŠŲNưk\\ȿŀĩ´…¦·dƒȗƹ̘̟ÉšϋƟ̜ȫýЯΚǓˌvŧͭޡӋϡŁ׫ž̅Ǽ̇ÑکDŽյ̵ǧɷƆПভßĕÖË€ŻžHĎš€ÇP՟ؙȾÅŽ৽Ġ׵ʪƇ£¦ǀ͑ƘʺƀȪ࠸ƚŊÛØýćƒܮ҂ҁȯϾͽȸƐvĩӐ՟Ǣɭʜ’ȒƫŀƚĤʈµțĂѹBÜƆ˽˜cĤ౱ǔ̯Ǽ̌ŌȹĴˮ\\Бº—ôȚƚદȆҐʯȸĤϊÅĈĪѼ™ǃŸcͮɭКԈGĶʕࠌûӤŸʋº¶ǎࢸʞ̆ɈäՐܒDzȠ̅̈|ƔȻ˔¯ĀƝТ¹sɳͬUɰNJ¤̩՞ɷʂx"]],encodeOffsets:[[[57137,-21851]],[[46265,-13288]],[[-52892,4159]],[[-62286,14843]],[[-62700,16272]],[[-63067,16392]],[[-62799,16620]],[[9708,43833]],[[-1206,47006]],[[5929,50728]]]},properties:{name:"France",childNum:10,cp:[2.8719426,46.8222422]}},{geometry:{type:"MultiPolygon",coordinates:[["@@ÐýəzNJÄ"],["@@qœƹvĬƗϓˬҔµ"],["@@ś«SŴŰć"]],encodeOffsets:[[[-7359,63631]],[[-6790,63722]],[[-6559,63753]]]},properties:{name:"Faeroe Is.",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ōY£ŦƈLjŗ"],["@@ÛåĴƤ—ý"]],encodeOffsets:[[[162115,6978]],[[141459,9729]]]},properties:{name:"Micronesia",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ķ̻šґՔƜˤ¡ȾϿęɷ̽ɩ÷ҵԪ̵÷ેȅ˝ŒŗǥŗętŹ˞ɥɍЉèǕ͌ǟĘƃđ^ͳ͏éϫÐÉгȈū›ǍȀš¯̅NjaƳƌɧƝĕȍڃݺԿҞ˸éοƸ˙϶ƸPǽÐȓѠʂ˕ƶÞǥ’¨džţµśì̥רȴć̌˴¸׎ĨƷˠīǤŴϣĐȅɌƞĦĺówϤž^’zzJ²Iz£`wĒமEѼG՜hŎǰFඊÖā"],encodeOffsets:[[13613,2214]]},properties:{name:"Gabon",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ƻďʽàɀĜȺë"],["@@Ů_˗ƟǍɄɆ€IJă"],["@@γ{̛̈ˉɯʁVїɪ̪ƲſĔ̢Î˨˘زŰτăˌ˝ƉƩʞnĦƍǛ¤Äɵ΋ȅǗŒ"],["@@ȏ‚\\ȔǴɕ"],["@@ÖȡȿófƔǣÙ|Ģˬĺ"],["@@ďà̆Ȏȵʭ"],["@@҇§ƤǔŭĸƸ†˼Žaū"],["@@ƉɠŦSdɋ"],["@@TLJϴ½ɵǧïƀʍBρȪϤȘƊƕ"],["@@pű˩Ìʺæ"],["@@̗ɩňÓҵɫčÄȐĠȓɒ̠N§ĦҐǜś"],["@@đǍٷ̣ěƮƒɷȭؚŌૢKʘȓڽދ׽ǕΦ†ǰŧֿȍΩÊجťϘÚϞĽЮ˧Τܯ८ӯķă˒΍͕ņ͝Y̮ӄ̙îƧʻɇȠąɼƄиOԐǥøʅŽ̝̋ů™ƗνÕŜƃϻęࠬđaƱοɋ։ų࣭UՋŎèÛƵÕћmIĹߵĨͽëɳͣѝź҃đ͟ɃчX஺ड़ࢪ`נҊܡ̍ԇǜ˿mŦúʛæџĩɡĪ]ǬߺˠȦɜķ̾ӧğΒ˴ۺǒˤã‚Ɩˆį˅ǠȀԺˍMͻ˶ĘʲάưћI΁ƕܡÆÿſķÒŝȌиѠǏ̺ʌÆɓĦšĜΫɭŦʾ˛ǝũԙƥ¯ȐϾėɆΠנϷȏЗƦ͸Ŭŋ¦ʦˤțŪǴƘƍĺŘǴϜ@ɍǂÚƚˤpQʰӬ­তŘǦ]³ĵ"],["@@ɜĻҍÄlƆɆč"],["@@ɌýȹӇRɴ̻ňʐ¦ǓƌǪĬ²Ó"]],encodeOffsets:[[[-1091,51907]],[[-4297,54602]],[[-6367,55387]],[[-5227,56780]],[[-6275,57273]],[[-6113,57155]],[[-5916,57697]],[[-7423,58487]],[[-6292,58886]],[[-7378,59068]],[[-6347,59765]],[[-3184,59920]],[[-3130,60447]],[[-1339,61991]]]},properties:{name:"United Kingdom",childNum:14,cp:[-2.5830348,54.4598409]}},{geometry:{type:"Polygon",coordinates:["@@˂Ə®³S“‰ïûÑēẂĜڱɠÁuǹŏsYƑe؝Ýէuȑ˜«ŽWz~nmhûžųĪít…Òƒ^ÓNÙMaOoWčijғ²ďÁ™Rß~ĿvÇhLjǂ¾ɞɱׄշͺ̽êПɰžÆ¼Ìӂgʚīޙɲ“ǵͳর¥ȚßR•ö»Ѐŧĉƈ½`eEs›U“lmÆmŎI zĊlȐòƨœɠōâŊjTÔuň‰öeƶũȂLŤ‹loýȫH}ӘǷǾĉȷǃĸǍ"],encodeOffsets:[[47417,42504]]},properties:{name:"Georgia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@àāă̇ϼ͍ĭիà“ğşʘËҡĭû˂ͻƽڷŔljĝхǰͯϚ̧ȥɻׅ«ቕ࠵थ˜ʢļɼƘǣĤȓࢎɤפƜВĸø°rZŠeŽPxÖp‚ŒÿӼ£ƀ“̳j”ʲTŊU¬¹ľ]ôU־Ļƈî΀ຌXΒéˠȪȘ§"],encodeOffsets:[[-70,11383]]},properties:{name:"Ghana",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ħǥǔƷ̺džȊʳκ˂ѪƵͬȎ‹Ǭ̐¿ȎЕGȽ΢ʳɣ̛ˢeÐщɔƏbƅƏǃdБȮãmȏ⋐‹n…ĽÁ‰‹YNjȚťpɣŅüʼnVʃmO¡Wݐ…܍þWŽùĭǯVě÷ƛuƒǕœ³™ơŊȗΧȑ̃ǘĀʎůդɛLjʁěéøï§GÛV…]đij½ŇLs\\ˆÆƪʌī̸ģng\\Ex¾ŜJzÙĄʏͶőŜq¬Ëf՗GșįʉnʼnNjǕ˥ǝġijNjǷiť̸ɉĬBͤʼn“ȍɈ͍ĜƵʪbǼëßĉȰģŒóƑۀPƚª°äƒˬºÜŒvàFŸœŀÖÀ~ŤOƚZȄÒDȊM¦ßœŏľ¾Ìń`òǺ¹ĬHæլ“lťŊ˜҂ljࡔÄ"],encodeOffsets:[[-11662,12703]]},properties:{name:"Guinea",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@½ɸžŒɌǣࠤǖשiǻĕǭȴࢬAèŠˎîמʷή’ŴŕΛƟݻːŕƇѷÑiƗۃEĩ÷"],encodeOffsets:[[-17165,13378]]},properties:{name:"Gambia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ËovŒ–ġ"],["@@ŰƜê¡ř"],["@@ķX¸ĸÀŏ"],["@@©ĻĩİƔL"],["@@Ń_½ËǰƙN¥CȉȃÑʽI¿}ĿÕŷ›ßE‹u·ÛƓ˫­á›«§Ò’ŌƗģLŀƩ¾ŽƮĽ^΀ǀƁöƵÓõĠ†Ĵ͜łܧƵlŶǽiǃŒêƼljɱŴ°TŖaĖhƦÚĈ^ʰgɞ¬͈DŽ܆GʆA˰AGåºīñǹ"]],encodeOffsets:[[[-16277,11349]],[[-16501,11325]],[[-16283,11741]],[[-16370,12168]],[[-14090,12557]]]},properties:{name:"Guinea-Bissau",childNum:5}},{geometry:{type:"MultiPolygon",coordinates:[["@@Fѻ஭đŽ_xy¤±JyI‘y›]Pnõ¼ĽrΞڎwŠlȤtMT¯†{Ġڼ@ʲ@Ȝ@H՛"],["@@Ƥ@Šŋȯ͹ȓ”UƼɬʶ"]],encodeOffsets:[[[11605,1566]],[[8946,3849]]]},properties:{name:"Eq. Guinea",childNum:2}},{geometry:{type:"MultiPolygon",coordinates:[["@@˄ºµċȶŕୂW¾ȍѺNJŻʝଫíûžȵÒܷĆmɸĒiÄŢĬĵ"],["@@ėŐŸȈŸ̗"],["@@ť€’ƎĔǍ"],["@@ŅzBǶѠɚŧ̳ȳŕ"],["@@ĥ…ŽĬØå"],["@@DžČúú«"],["@@ɠƠŘ}ͷš"],["@@īA˒Ĩǥĥ"],["@@ċ]ŤŎŅ"],["@@ơ…ňΚã"],["@@õāŢƎłjȕ"],["@@ĉN¸à’í"],["@@÷ÐŴe»©"],["@@´Ęɞˑŧ"],["@@ċ¯ƇŎɔÝ"],["@@É£úžoę"],["@@ȘďǭÃɛâȲò"],["@@Ęąƥ™ǗdžÔØǒĽ"],["@@{ÇəɦɎ³ˆũ"],["@@ŰʿȥŠÓńĉ­Ǯʜ¦û"],["@@ǝtČĠũȄ˄ƒÇ˓"],["@@ŏuŞɘMȡ"],["@@ői¯LjǂƝ"],["@@ĠũԒƏŰέˀą©ť˗ŚƟɮ͝¬̞͍ͯÎ͚ƊƂÕ"],["@@ƺɿęviď̡ĜƒİǙđȓĖ˒Ƥȶ™"],["@@NjzȧʲɾNãėȚȡ"],["@@åƥěðƿ•GŮ͊a"],["@@ɑ‚ĞŪŴƫ"],["@@޷ɤʽŗˇøͧȉˍpĔˡ̄ùŌƯίǰƻ{ȪǷiűʁɒȧ’ǜ˷ؗЎtLjʗă‹ϫآܣơ×Nƀȫ¤‡ŕƲŏлƛֺǥβʹʄݶœIϳѥ̜ϷſϠρ˟ęνǬμँϋ̆ʏˋ̇ҬĿÁɅʹ̀ĆʴүъɼʰɊkƔŸ࡬̡˲Ɣٗʲďç̕²бùšƒwħDžV˿Ь˾lNŒͽL΋ʔġȀûĄćÌlBŒWҋÚOƨŰA’ÏĞ@zxXœvr‚¢bǞªȊ̎ŲżÙŸRÚԤfªxŸ°ǶƲdžxʺ‘Ģlĸޏź̺SìÂŐH¼TĒYČB͂ÖlRp¶ˤEЀ~EɌǑȂRŞ£IJÓ֠ÌŦÌ†h¦Uò·ƶllĀdĶwɖī˜ǗʙƍBʅʗȑ"]],encodeOffsets:[[[24425,36389]],[[27829,36317]],[[23608,37059]],[[28512,36792]],[[26095,37267]],[[27096,37464]],[[27597,37609]],[[26480,37674]],[[27669,37847]],[[25886,37959]],[[26159,37855]],[[25113,38017]],[[26013,38318]],[[26655,38431]],[[25863,38503]],[[24941,38479]],[[27469,38719]],[[21390,38713]],[[25592,38666]],[[21108,39305]],[[26721,39136]],[[21184,39536]],[[25267,39741]],[[23978,39894]],[[27045,40274]],[[20560,40380]],[[26049,40943]],[[25369,41590]],[[26664,41705]]]},properties:{name:"Greece",childNum:29}},{geometry:{type:"Polygon",coordinates:["@@@ƢЎĝǯ"],encodeOffsets:[[-63196,12301]]},properties:{name:"Grenada",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ĩķ΁ĈӪƼ½Ƌ"],["@@ǧàLjĦ`Dž"],["@@ǁwŗǨȴNJΒÛ˫ʝ"],["@@ּřŪǝත̉ԕŮѲ¾ƓÚँƢŎȤϸOяLjϬƸࣚģӆɕ"],["@@ύ`ZĈδħ"],["@@~ɥۇǗ͗ČறÇΘΪ࠸ڬƘ͘Ĺ"],["@@Οò̼Ɯ¤ɍ"],["@@ҥȑխž৔Ô"],["@@Ԟ̷੹‡ƻˊܘö"],["@@х͚Ǡɰʦ։"],["@@ۓĘࢴ‹ȟË"],["@@ࢣėЏŎॾǠјušǟ"],["@@བྷɞѩʸܼˆచǯ¬ͭ"],["@@ↂʭ㇓Ƨ‘ď㞆ƨպʁ᝚ȱಇʹ㏱ƍʵę̀ī෢Ġᗆ¡ܘʧৄʾ๠´ĜϽབྷەᰦܦᆦȯ૮͈཈Œຶōࡈȍෑ̳૛ā§ȕቍǃۖūҩƧ೧áଝî؃ȷ঄۩ᅡѧԅߙܰǠ଺ljpŹ׍ľѧÑϘȿ޴ūܜŒÉЙဏŤॅțӏĚΣ÷ؚŋ͞ʩ୒«ԂϱcӝߩŒএʓӫĆҎŽ׬Ģľρώ˶ζ@זέçəݙAͫũ઩ĜX˒͇ɛƾʽ๤ţš̗໳ȉݕňޥ̮ѧƋۿɀؖ˹੩ɏ৩ƶؔƿࡩġǶÏኔˠަ\\ᄄЭɍڣ๳͈ҽҐၷ˓༂ƾƎˍϽȡϜøᗨ׉ѩ̣ÀœIJƸҠžȖߝܣÁ«ͮɇΡ՗\\եǘӹӖ૕̊ঢ়°gÿਫ਼«Čʟࠍțද–΀ćßǑࡃɇᏚfœęࠟțƪŏ̚Ǯ఼Ŷ༦ǵ୐[Cûعŏ_ĝۇ±łůҳEBūݥƭĆāԗɳڇǵᙡͅԳ\\ϗijͷ¸Ġő̱³ଉ͂Ǝϑ࠯̩࢕ࠅࠫͻ֭džȦʧؽʹŭƪśǻͭæ̅Ƿқo֨֞݅æͼĽ̛͙͉ĘˈʡခŽԄǹ̟ǕˇýۥªIJțʼ ЊλԋɏڣÜҦƫΎVÊͿȋLJɯg˷ϝϥPˣŜҒȣɱȡࢃaڐŵƙΓDzʝЍŝȨċ̵܍˝ȱ݅Ò׬ǡúˣǓŏՓĈʠƕȽ—ǭ`¨Ā̅Eǂ̐͛ɍ١ƼXƜͤîȀǨԽȁ֓ƞăƊɬψࡇ͵ળ¡ΊȔԭN•ƶгṷ́ˀûʦҪDŽڛåÐȠٟȬjȾъ˔ԅȇ࣡ېß̪ઌǪȏK¦Ė७ǭĻĐʮɒތȖМȷĥɎͩÀϋκȪ͹нƙ‡Ŋ֕ґ˱޾ɹƤޘ͔ѸÀՋ«۟ɗǭňοHþ͐ʉÒᆖ۪ົ֯х¿Ķє͊Ƭն°ࢳ˜υǰðʄॎ˦ႬȅҵƔǞĨڝÍӣĊଢ଼ʋӪք଺ų˖¸ȸʮࠧǕহǛ˂κĈࠚƣ֬ŰŚŒχ݃͜ڌ–ٻڈڰ࿳œ٥Ȳ࠭Ĵѡɺ̬ĶନÍྰ͕Ǭ¬օƞÈɞѣƂيQ̛İോ¾ĬɸऺǶඛýʜȔэҲɳ™ϘϿҕlj´Ǘ؍ùݽƼɺҶЎȶحƩ¯ĸ˺®ʳČ֪IJǀʨ˭Ťǹç͉Ú͊ˌۅȚɠǜ̶͗ࡋGѲĀUǮϲĈኻۜˈźɡƶᖟЀᄓǎҩœϵČࢿƽыĞӷċѷØˊȣఉø૭˨଴ɄಷîiɈޙƗѹǨɺŬཔj۾Ƹุĉʩʹ࠹Ɓ޷àؕœহȜΞŢঁyಝ͌̄ʎےŢᖂȞԮƲᒪŖࢄ۞ԨĊᖏmǧʶᒈԬژ¶׌Ɨŀˢ௾íӾ؆ಾ|ᖖѫᕭզ◴݆̂ƿĬѕ֚҄ᅈΩ଒p୧ϸݲö⪴׉ЮӴૉ͈ᶰÇюÎ♣ĠǤي፾ȸ෬ƍߌȚᇚ˫ӽ̺ࡶń㹪Ê"]],encodeOffsets:[[[-47377,62241]],[[-37920,67105]],[[-52237,71222]],[[-53996,71624]],[[-52915,72556]],[[-26042,72624]],[[-54820,72746]],[[-56337,74539]],[[-18432,77218]],[[-19028,77868]],[[-73387,79182]],[[-18035,81742]],[[-45941,84054]],[[-30671,85571]]]},properties:{name:"Greenland",childNum:14}},{geometry:{type:"Polygon",coordinates:["@@˶DʔŁRƾ̮ȅ—…ÿáˍɉɷǩƳãáǧºǑQ¿īÝÛĩǯsvůс˳ŸƕїNJ٩¼ܛҲÜΘ^Žœtr ĥȺĖƦŀǪȄ̮ʬBϢ@ɶ@ƴ@ÚDYøTĊ‚ø@’­¤ĕz·–@°sȧÞɟƆη͚ǶAǠCHӂໞAÑྩ"],encodeOffsets:[[-91374,16270]]},properties:{name:"Guatemala",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ýƚȐƾƛǗʻ"],encodeOffsets:[[148216,13578]]},properties:{name:"Guam",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ĽdzĠŝķƧ͋{ǥƛÒŷǩӇ΂ש̀aĘѱвۇȆāУsËh¯ÎuRǗ§ā¯óœ›¡£mǛG߁ğg©Ņʱʑµ_¡ġ—KŻơG›ƒµ…M΅Ʀʯ˖ŋ CĄÓ‚_vB̼œöĕ˞Šݮʬ̄Mx¿ÀıǢłϗƲƄҤŵƀċhÿ·ĽWlj„÷gՓפ]‚ôĢà䯜€’oƞB¾}ÈmÚ¶ĚάÖ̮Ƞ~øG–g`ĵbµm»X¥²í˘ǤɸИȬ–Ğt~Į´d¶ƻȲۈЋׄ֩~̟ljխɒϮδÅϊϡˀŹ„Չ"],encodeOffsets:[[-58567,5682]]},properties:{name:"Guyana",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ȯŸǵǪӰŗʼnq"],encodeOffsets:[[75477,-54412]]},properties:{name:"Heard I. and McDonald Is.",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ݷȱĝxǷŲĽµ×ƛűɩѳϟgMƒOǓĸ³îʓɽ]țhĽWsaW¡PÁ„ȓhÿeyÁIå[›—ùǹ¥_ɹYŵ̾˙ž‚ĺÈʖazϤ÷Jĉ_ƇĞʡŗ…F]¨MºO^ԝ͢ȯœLjLjRÀ¹ǒâǨƴäɸǪˎɊĀ☆ĆyɎƮ౤ąΞƞ¥ÐфĽєøΐƿʤjиΕǩĪřw`ûƘMƖƣɚDůŬɶŇâƉĉ̥ɍ`Ĺĉč"],encodeOffsets:[[-85642,15234]]},properties:{name:"Honduras",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŘËͳøɜk"],["@@Ҍá˱mǙĐ"],["@@٦˱æŃ׋̪ٹǾԺı"],["@@ʛ`•ĎϊÓė™"],["@@Æ×ƕĤЋ"],["@@ƧȬhɞƀщ"],["@@̟ĒĶŪȪȻ"],["@@ÇąȌˏ¹īͪƿ˱Ù±ɣƝ\\ƣǎ܋@ݧǘ͙»ȥǧɝƲȫU©΍̮ȵǔͫࠊ֭̈́σÅËֵϢёŶ΃oڥոÁì̊`Ы˦ŁВʯǼȥ’ϝп˿ը̤­Ю®¶pŢŶpK¶áŦÿƊlƀ£ŌSĈvYˆ‡OŽÐäÝÖ̀ňpĺQÄͼI€b‚кǮǸŸĚUöq®]ƮËļÝτ˽иǥҨ‹ƨ˜€bĎĂȬr"]],encodeOffsets:[[[18031,43796]],[[17051,44029]],[[18092,43927]],[[17189,44310]],[[15741,45030]],[[14836,45732]],[[15166,46057]],[[19360,47035]]]},properties:{name:"Croatia",childNum:8}},{geometry:{type:"MultiPolygon",coordinates:[["@@cÏɋêǗƎЈƧ"],["@@ƇǫÖŋN«aÏĻijĵG[W¼ïÊăĢÙtÏșíâýÊĩ˜ۇÝёČ̥½řůӽ΄úƦƆŽூȑΎŞ|ĎϵͬĜ̴؟ʀȂƊӦdΖſ͖¡²ll}žǛ‡ǛČ÷"]],encodeOffsets:[[[-74551,19229]],[[-73366,19657]]]},properties:{name:"Haiti",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ĺDˢɯƾqĜƍ݃χ݅ਇ̣‰ūħė„ȑƒqd£`ȑh÷_ȗpljėًſčāaƧ—ҧŒзǦσ˾ĽÞƫÌ­^ț̜DžL̢ŦUͦȞŖɉŜժ„äʤԬȣ߲dÊǴ۬Ȉ˚Û͐ŰƀȚ߲tˆǵ̪Ê"],encodeOffsets:[[22663,49568]]},properties:{name:"Hungary",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ĹVhŘѴʌ ƧЁɑ"],["@@ƭ†ʚĠīť"],["@@ùŽŐľ•Ƌ"],["@@ٮө¢ãœƙɑóʙĂҙΨџÊŃǀ˲ŶլÈÐÕ"],["@@՟՗֯ǕţÞĤLjŃĤĶ̒˞ɰȸñƌȨВȺ^ġDzV£ŭŝoĜʣ"],["@@Ұ䞤č"],["@@õ•ĺŜŤwƧÍ"],["@@áJ¾ʴĢ÷ýȅ"],["@@ʗ“NJƈĴƒeï"],["@@ŃǧÔÅ̅u͏ŀȂ˜_ʶ˺Ȝˊōßɷ"],["@@ŝǝǿêʾȶ Ł"],["@@̹ʙ˕ŠȸǪí–͔úŲé"],["@@˧âȞŖĊǷ"],["@@ÅƺƤˆĝȁ"],["@@Ќæŭفõ¦ȜŪ–"],["@@ʞÑăíǟÆFú"],["@@्ʋȣìïďʗeСŐ՟±ďƈÈɺآƮۮ˱Ѭĺ̚ơѸ˘ÎèƉŠƄäøȇȉʃ"],["@@ñȶɒƀ˃ǁ"],["@@̴ŒĐőǴİǠ̷͑Éòć̓mċƴǃƓेɑɭþ Њˢƒ͸·ȪʇƎaɠŖΛɀ¹NJ̦xŀǏ"],["@@ɎɃҹω÷ɶωǎũDzЄiǺĸʚõ"],["@@ĿïĕȦǢatœ"],["@@ˡʃγÄȯĉƪ˒Ȩ—ͬŔLjă"],["@@£ĢĖc±ý"],["@@ȩŋիfδېǶńЌ¤Ȁʱϟӟ"],["@@DZDrˀъӔþëûÏg̟ʣ̻"],["@@șîƠZºć"],["@@ş¤ĈƘĩ"],["@@őFOĈŢč"],["@@׽ijͳŶŢƢǚhނNĊñȕŧ"],["@@Ɓfjüʲßƙ"],["@@ŋtŜúOĭ"],["@@ǵ΁ț`b̦ôXãɦΠɁ"],["@@ʘǩ֐Ï̈щ฼Ɓ΄ѰŚWǬɁ̠ҠȵϞƒĠʛŪé@ȻȀėРÇӖú˶ƅmԥǒ̫ૣОӗĹঙĔݹƀ૙ώғŒʏʼn҅ÖՏɄۡĔĈ˓ŀ߉þĬƞĨįƞˀŎZè˸ǦǞـƷȆǎ˞ē"],["@@“ƓSׄ¨ѯ"],["@@ŏPĔÞ|í"],["@@ٽ§ʲƪȳ"],["@@ӵɯʉɬŮ®”ƪřŀŖIȖʈƨɻ"],["@@åïʘ֜eɏNj˛"],["@@ɍƀɖ™Gĥ"],["@@™ă‘ĆìA"],["@@ȟƴĘƺņñBɻ"],["@@åıɿÊĨɀwʬ˪۸˅ūǡ€ŋ"],["@@`ɫşØé͝ǸǍǿÕſɟƕP·ƦưɺòӼȆȚĘƏ"],["@@¨­ʧǂɀœ"],["@@ƕĩęǔȲ‚~ī"],["@@Ɲ«ºļĤÏ"],["@@ʡą«ÒͺƸ«ƃ"],["@@‰Ɵ½ĈĈØ"],["@@ȳŝJҦǦǦ„ԭ"],["@@̮ʭFȯҙDžЅȀƃƸ‚ˆٮf"],["@@ťÔƘAqÑ"],["@@ՀĽdžšʒσ¯ʋ߯Ҁ˧C›ĿԕȀ̅ǵ͑ʔȗ˵qɲ˒̚ږŒƸĕʺŮɪã"],["@@’ũɕ˼KǜɌǹ{Ƴ"],["@@ŷȕǓŠȱϧʐĒ̖ƞŠ͆ƕÚŏéƗ"],["@@ǁáwʜǺǹ"],["@@ȣð‡Țɬˉ"],["@@lj̀ºĐŐЏ"],["@@ʶƒܑįûĆ՘®"],["@@ÆɽƛÛѕƲԬƨ"],["@@ȀMłƑݫŅóŬôǘҪ"],["@@சǧ֑āهʪ"],["@@ī•ƒĀŰ©"],["@@ːڛϠğǧˑ²Ʃ֙ȺdzզշŜ˜Ͼł¢ĬǡhǔDŽzŖƏ"],["@@ĩpžƮÌǝ"],["@@ӹÉƕŜɄɎь˟"],["@@tǽǔŸĦč‡ġȥVďƭmʾɕʃážĆɀʰV"],["@@ȹąZʖɤ­ƒš"],["@@ēD…Ŕƚ¯ç"],["@@˯ƘȍΌØȒɎbˬ֣ēų"],["@@ǿ¼ğʞ̠–ͯ"],["@@є×М̱ǯĵȽŠƙ̘č¹əȘ"],["@@ťh¬ŢúƉ"],["@@Ɖ–ŴÎVģ"],["@@băȏoǮĴ"],["@@@NjDᲗħͥĨƓBᇳࠉޢĪɮƳƫҥóŗǨ̝ɋǖմ˹˰ΰ¼˥°ȵǚɜàΧўţͨàĘƥŠŞŎɃ…uȴٿѨ։ń՛ʎڅäѡ̺xľưbԵOijŲơkʝ˴ƎΦş¡ɷœŸįХŷƍ˫JƇ̔ĬŸıɎٽьɔĞдğϺ̐ђƽ®ƤŶºħĈŊLj߫Ɲս~ʅɄýβ՗ƖʡǐɒÈʺҠŸӸ̈ϴ½ԬʷфeŚđ‘Żǀ̣Ź̝öӳɞѯpɀŨžØͫŢršʧ̪ƅȢp̺̌Ҁ؈ִƘČâ¡ƺֶ̞သܫ۪ćŀƉȎE"],["@@ĮōȑljėǐǼň"],["@@ĬűÝšɴǗij×řİƉ‘LƎƗŤrƒŌÑĤô"],["@@ʼnqNȮƐK“ǯ"],["@@ɳSôŌǀķ"],["@@϶ũÀş˫Ï͏ɲɶɏůċ½ŮśÏˁƂłŘϚÌ"],["@@űAİʲĕȎȆɍíɯ"],["@@ȐęҷĀĄǨȤǍ"],["@@ũP¢ŴĈƃ"],["@@ҋĢ`Țиȕtĥ"],["@@ĝpľší"],["@@ϷƶpĘɲùƖǓ"],["@@Ĭ]×ƧőèþĞ"],["@@ÞƕñǽŗȀƿ‡ĢƔȊˆ"],["@@ŭðo˒ƾƍ_ȳ"],["@@ϚЭģ·ŗ‚ãȦǕĨ˛ДɶĪł×"],["@@PŇЍɸϾů"],["@@ϱѳ֣ƑЧlɥƖဝ©ιð͗ɓƭϵ¦̟ƬˁɶƝŴˣК~ΪіͦĕʼƨԠD¹Ć˼ôǪß°Ň³ȏЋĔշջ͡řǩǝʝb޾ࡻĜʗūΛπϵƄhr˝ŷªԗǙÝʕϗÖďƮŌШ؍Ӓƌ̔CΔơĘȍkͣʁƨُaއšѹŶϏГ\\ȟĭƇêǓʠȠڔ|ШſѬЇqŃŞë֪ʸȨȖҬYѬǘфǠȎŐƱĹٰŦň³ǖĖǦ̚Ѷ˨įɠͰǶÚ˔ëǀƧ܄¥ͶơȔĆܪûԒ͌ΎψƐ\\ļƷ́э"],["@@Vʏǿ³ùʐʤ´"],["@@Ű_ðǮnjĬ¾ȲϺƠ^ϻ͹ȕţ̎Ʒʐ˫ޕɌăƣúҟϔէ͇ǀ̕϶bѼƝ˖ÐȦƯʖǠנ;̘ṷ̋ľŋ@̵̝ˉäƓ"],["@@ȏŢƸa˜Ŀ"],["@@ƃcÝɚ͒ʦòĻÅȿƛƟ"],["@@սʞùƜƮÂѬ̽žŽ"],["@@čiČĨBý"],["@@ËǘŨïÛħ"],["@@CËéĮî¡"],["@@ġŶŐqmŃ"],["@@ūt•ɬǂʟ"],["@@ōƽ¥óƒȢb"],["@@ǹ^ŦĘȭƢȸȠŨșÝʝ"],["@@ğāʾ͗؃ÇʒǑLțɒʼn•œň•·½άяɷʓ৐࢛ϙƗ˵¼ʅȌ¬ǭȁƅȇг·ҹĊϓկϝƣƮ\\ʃБϧŰ@xśřǻɂƅ‰ǯDZ•\\̋ƏƒúLJʧϿਖ਼ӗƗژãėďŒ@Ǯ죯èͅƩāɔɡ§ʹ˂¿ɇdzœƃá˅äΩș‡жŅƘٝƳčÚÎòǑĥŇŊˉÙƇ߸ŗŜpӴǏɜѹǢĨƚɁȺŖΠʿ˚yҴ–ȆƢĴķ[ÆɌʬΪɂĘùōĬɿܐمԄǂתɨŎĜʞʒĶϼPÂŏԮǕɾǖԠdˌѺ™ɪͤɮĉĤŒɖňŌǪRȌ঄ƴžռnӰƒЊƕ"],["@@ĥŒĠǀûðˆǢƐɏĕɍ"],["@@ࢰoלړ¸ˑ஦އږ࠳̪ȭ¹ʜǾ^βӃҘɁ̶ԋբɛqƍϧǗڐʢ˪ȍĪȭ̝ȩoƛĖēÏġʂʻ՞ŷžٿˢɯǍуːȌΨSծ؍Ǜяòǿĉˣ²܅śڷͱɦɣǑωȎœ̻éW٧ۚઙެ·Ҭңδ׃ޚ…˄ҟज՛ܺѕʴӁౚݧдġЦǗňΟԌѱȮܭ܄̹ԺlʀͶšш˃̠Å"]],encodeOffsets:[[[125900,-11171]],[[124809,-10844]],[[126379,-10549]],[[122893,-9599]],[[128070,-9740]],[[118385,-8980]],[[125929,-8750]],[[122332,-8950]],[[126278,-8555]],[[119441,-8820]],[[127270,-8529]],[[126900,-8471]],[[142229,-8589]],[[120378,-8568]],[[127566,-8336]],[[130892,-8293]],[[125730,-8818]],[[134003,-8518]],[[121081,-8517]],[[118219,-8350]],[[132955,-8145]],[[129845,-7851]],[[130478,-7806]],[[141861,-8472]],[[134478,-8191]],[[135150,-7374]],[[131759,-7355]],[[123674,-7289]],[[116577,-7275]],[[118147,-7138]],[[107779,-6799]],[[137766,-6596]],[[109951,-6151]],[[123421,-6449]],[[115425,-5950]],[[135995,-5991]],[[137981,-5843]],[[136117,-6043]],[[104825,-5610]],[[126594,-5398]],[[124972,-5568]],[[125589,-5395]],[[126137,-4660]],[[136777,-4347]],[[126201,-4211]],[[131649,-3671]],[[131355,-3762]],[[119219,-3547]],[[119095,-3960]],[[129906,-3161]],[[109452,-3077]],[[132869,-2934]],[[102836,-3259]],[[110805,-3069]],[[102609,-2806]],[[102240,-2399]],[[129081,-2510]],[[129049,-1832]],[[133482,-1731]],[[127969,-1746]],[[138726,-1630]],[[111568,-1658]],[[108591,-1709]],[[126564,-1745]],[[131229,-1700]],[[126170,-1199]],[[112344,-1209]],[[138205,-1142]],[[101544,-1820]],[[134146,-1347]],[[138633,-667]],[[130356,-799]],[[133762,-541]],[[124790,-416]],[[144357,-2672]],[[106982,-342]],[[130629,-326]],[[130304,-507]],[[106227,-356]],[[133953,-4]],[[100823,-543]],[[107294,-180]],[[105764,555]],[[105501,765]],[[105907,1074]],[[105643,892]],[[106522,1209]],[[107096,1246]],[[104886,1014]],[[99822,1501]],[[104952,1495]],[[127887,1020]],[[104150,2129]],[[130799,869]],[[99671,2126]],[[131537,2102]],[[98779,2417]],[[111501,2976]],[[108299,2932]],[[108837,3233]],[[120483,3360]],[[128674,3519]],[[120714,4287]],[[110916,3779]],[[120397,4271]],[[129861,4131]],[[98809,5355]]]},properties:{name:"Indonesia",childNum:107}},{geometry:{type:"Polygon",coordinates:["@@̽ĥ̤ˬZȅ"],encodeOffsets:[[-4517,55486]]},properties:{name:"Isle of Man",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ʬ@ĤмӼþʜόώeլԟ͚ƺ̃͠đUz­ŽƓ’íȘșKąuū¾DžWǫ̑âʀ˵ɶĉɔÛʄǣaīֶɹĦ­rә`·O¹yiŕĿœāŭƛíƃ½ůBėoĻÁϏqėƒĽh‘ƀěĈ³Ā¯¼Mb€n|Î_Ө˃ָϿšP¢r˜^¤YډƨĝƐíƬ`¢[„ÛpßҲůä’^†ÀjĖQǐ»èeɚĪŜÁɂãň¥€£\\Aĥ€¥юɳĐsɴČâWªŸŽš´‰Ǵœ׎ǵ˄ĶɬǏłÂμ\\Ŭ¯€Zzˆ´ƀ¦ŜGèŸĸįƄS¢ƎԬFĀ‘xAÀ‚`ŒjŶ–ŶèȐï±СbûÊɸŸSeķák—Ĵǵʒũƺ„ɈÏp¹ĐI¬YƮnư~êþИͦıҠdŞÞ|@À¹źIƞ¨ĐP°K¨hֶ“Ӡ£ʨҎϬɢࢎƈՎ̰Ϧ×٢˿áƷfÙǞɵC¡ůdſƎԙ‡ࠩԵšƕRʃ’ċjiF{şɫ˗ʽĩȱŴįǭϯĭƍëŷǿϙ͡ŔȗeŁÜ޳aŸũ£Ŀˋê̝ùųęǥ¯]±léĂçv·ĵ±ƒ[ÐÍ՘w¦đǎy˂ñφǝIÅ\\¥K@óRÿƷǻEȟǕ½įǪÝŋǕӼDŽͲ̈́ŨĴ{Ǿǘ®ĴĠɸBĢp\\ŒêĂΙȎ஽Cб¬ɅÖ«XY€pȊC͎ŵɬĉåmŃɕ‚ɩ̼ÉBfƉ{IɏžƑȐůžeåˆW®ďęĥƵƛ™ȷ’}̘ɱɢðƁö—[É̙‡į@ëȏ¹ãƒBùŽKĕǛ]£M‹²ÝÈÃâsĦMƊěŦiæ§V™M›[ĭ[Éō˟ÊĽÀµvȥƢ›€oy˿jǯŊ̛m˳ßBĐʅNjúħƇGΞĉĮµϱś›ƃŦ…ŕǑÒŜϐɇȢǾɅ˯ͧԻƵȷƭĥɓŐͿȋ͗̽ʳŋ †őףȏßHPLjɋŋÉƋɖ€֝с֕۩ำ৑č҉йȗЏPʳӡ˧Ř̓ƹȫ՗łԃÉɟǎؑųȔÿěɾȳħ̵֟כƓ֧Ět¦šUܽѯÇׅ̿äț͢şγÜҷƏȓǵŏэҕʱϝȦљӲȓҤçЎŐ͙êEĥ͖ųƐЅੴٹৠӁྰεӤů˔Ō@Ƈƨ¼òŷ¤ǡ̄ԍᓶĆіřƫĔRȂƦkǗîĵϾȐۼãϐDžɈĤČķSоʐӍ­ƂɴƭH€ƸɌÖՁŒļåċȥɡƢāšǓȩ̿ࠫΕʱDӻ̔ঁ৒æŬȎŵݴʌˀѢųű֥Ʊέöԁ˼ȉ͎̠ɾҕɉÍɔİÒĊnĜbĈAŚCHʨXxh^lNhIz›ˆDŒvìgÈ\\ÌcĬAǬPĬEȸěʘĺLjÌɎÀfQ¯p«äƒ´O¨PŽbææ–h°C¾B~ÙŢL vˆž†wÎÏŔÕƞȍ̢EȲáÁiµGƷtƑǠ¤π…ǜէɌĈ̶ˠʦżȄĂż¤ž¨ƆúîCŠïÀƗĚ¹ÜJʼİ̞Ž˞þfî¸ŊƲƚƐ̎¦°ҾɸВݾάƆÞÌ ¼Qº•ÐbêĢîˤ̼”@ŊÈļÚO†]šýÖbÚºǢY¸ÑDŽ`ª|®æÒĔ¸˨ŠÊ`ĬˆâŜWN"]],encodeOffsets:[[[77130,33061]]]},properties:{name:"India",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@¿µáƠĆŏAƨžƁ"],encodeOffsets:[[74232,-7554]]},properties:{name:"Br. Indian Ocean Ter.",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ˋÄɨt¤÷"],["@@Ňŭˎ࡛λӧŜĉӅñÙøࣽΣ̏¼űϵŽޣġDzǨԃãѬɰدÙδ˖ЗZ„ÒӮšőźɰŦ܊ŎǧÜƹĵحÅϜɆƔɲ̴Ģӫ~ӝƦsŖͬ²Ƴļ˖à@Ø˯_¸Țȣ¼ŠĒౖaßĘЬʚՋ’͘ǪĒɎԜĢRʇ̌ͨ̈Ņɍũ˧˗̡Íƀē̩ƱјɩʂUˊɰ̜̇δ|"]],encodeOffsets:[[[-10186,55208]],[[-6367,55387]]]},properties:{name:"Ireland",childNum:2}},{geometry:{type:"MultiPolygon",coordinates:[["@@ȝȃեĝϜȂIŖѮHû}"],["@@͂|ొٸ˜ʇǽƃǂȅʝƑԄϋɶrüқǰʑ߬Nj͸ͣӰɫ࣒ķೠʸŮ@ȣÝʔ‡±ѴڈńǚʶКɰݠ|ƚƚنƒƈȱނʵҰdТơźɏԞʑɺ˙ٺLþϝ¹ǵČğTȻhÇEƒ‘³Ƌõ‘iΓŇǝ‰gĥã¿S[uTuvańŽȷYƁDZ@͑ôĻ˾é̙̯bťŒͧĴ̍CçƱCğHǻ|Ƒ„YɎȢ{˄Ăą¸dzEƅwçȋțȑȡЧщLjǏİķب࠷ܺ́j͵}҇ΐY|Q¼‰œ±HwÁŸRǕQ]±wcƟܙƥÓőĩXʃţ»{ƛuŷamÍ©McT·ĝqʡyë¯MĵÿؽƲŹżġĿߍƜ΅ÃȽŘ௳Ȧʣࡒʵ˞ԡ`ଝՙїLjҕ|࡛ԈǹʘϏǪχʻɤǻԂǏŨRNJǙìsɰЗтćɸѡƛѷʰǒŜȅ†é͕̻ƃ˔™†ēȼ˅ưIѲ˥Z@ͰØǚÜnjīŢĻŸáÀƵʰ™fƏOҩ̰ljĄálƻNgfYª@¸¼ôJ²ŁƼԻҲŪȴéɊ”ĤŘO”ȌȲȘĶªü lΗŀşǞÈŲŦŽæ„Vzė¢͡BΏnjķ˺…”©V•D¹¾ʍ֞|ŰȃŨbɴ͇ǔȨΪŵªuϚȽҔ̮œǖ̆Ȗı֎էՔŇ"]],encodeOffsets:[[[57537,27568]],[[47222,39811]]]},properties:{name:"Iran",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ŗP“ģêɉũȳԼұłƻI±»ó@·Z©heɞyNJăҪ̯ƎPœeƶʯâ¿ļŷĬšÛNj×Ǚ@ͯ˦YJѱˆƯǺ˕ûqċfdzìƅ{Gy˭ĪзąȯϳŗDžÙóƋƍƧ൝Ŋ߉վ෗ਚഃۀğž˻²˗¢ҷèŮĴ›Ĝǥɣ࣊ᇴࢴǪ˸ƆܸµزĶŌ̺êӐјĆhưĸĘĦ†TĀ‹ÌSž˜ӪşƊGƪúĐW”gŠƒbŸMųäך‚Ü¢ǢIJÂE¾O†oʎ֝º½–CªU†“ĸ˹ΐNj͢AĘ¡U{åťÇűŠǝ˜ĿkÍûŸķ©ȯȗ“ȋ"],encodeOffsets:[[46733,35404]]},properties:{name:"Iraq",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ߔźѫɋΜėŇɋκpåDZʴÈҤĻƿƏǦˍϏʙ˹H÷ɃϝƣݽťڵʻধŷŋƫקŇಙŲʝŌäIJȥÉуǨఽį¥ɌLjû˔¢،˸ӷÅĒǜ̢Ĥџỵ̈ɚଏ³ǧŀਦƶݬDĦŞؕR֒ɂࢷŐ࠹ơӛİȒø͢ÛȡȨАćˤÐҟČʶ€ɅŘ̀NeƂθǗ̠ššƃƤ”GƊуŤϴ®ՍÔƠúѦBࡨͻ‚ʅʅeѼϧ˚̶̌ÅȺѼ׾˧ĚʶҌĞעϙŽΤ͠]̚ƭͮȨ˄Ý̔бɂʔÜɜQϊʉ"],encodeOffsets:[[-15916,67818]]},properties:{name:"Iceland",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ǷÿGkcȋÉNå¤a–çjģlŅ×¯Ĺ¯ƫ†ȹWŸqsPclMÐlØkÜÉɅŭÏȟӐĤБྣÍßփบĒìDÐƨƎ£¸NPǎʮβীʬOϨ̚œЛŁǷ"],encodeOffsets:[[36647,33521]]},properties:{name:"Israel",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Бٗǒ͹Ƶ̯ԣĢ̝ʲȥEء͆ѽĬǣȎʤ̨ƚů͜Ƃкǯ૤Ơ͊ŚàÏ"],["@@µċ¯ŮĦ¡"],["@@ã•Īľ…ç"],["@@Ƣ͏ƋșåएыÔ÷ɳˉ‹ȗɼňՒŝàẦɿ̠†ɘ̈Áր΂͚ȫbœ"],["@@rŧʍzɜĮ"],["@@ǰ‡Fgeq˙½¥M}PmlYúLÂǁƘģģýûƸΟ@޵˙¡ǡʢɯɳȷŮлঘշϒݍѾϏՆʻ࠸ɛ͑ႮܛьηįͱɟĬdz˾Ͽ¼ǹƌɃ™ͿׯӾ̯º͍ҵǕÑ͡Чϻ˩EߥȜӢˌŪ\\ƴѣࢤدȾEȘƳǘΧÍĶŊΓêʻΤթPϩȎ࠱یзĒvŪϫʹNj€˝࠘டЌٕҝљğŨͮˋuΙǔþа̛ȬόƠÊŢ̗̠ȘƺˆkÖoǖ‚֒ĔöȬŴîÈÀԔôǗ̢ƙP_£ÃƨƕÐ`ư̾ĎɶĂ]zBĐƧ¨SºAۨĆl°KĒĽS¢Teŀy¶‰xMˆnÂv®¦^¸LȠÏi¸W´PΠŊvSĎAĠOЫÎeĊKÈP€j¾ÐÞĢ’ǂNĂ^ȼWͦĆxOJ[‰ƒ‡—p¥Īċ¾Ù¸µú}ׄċƶ]ŜEǮ‡gµ—[׃ƍćlė"]],encodeOffsets:[[[15951,39138]],[[8683,40006]],[[8485,42025]],[[9864,41864]],[[10645,43887]],[[13744,47322]]]},properties:{name:"Italy",childNum:6}},{geometry:{type:"Polygon",coordinates:["@@ފʱŞȧ˃¡˟ĞùĿƧ€íƑƁIJͿšɵʞʛĪļƈ˾ØԦÃ"],encodeOffsets:[[-79115,18901]]},properties:{name:"Jamaica",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ǻ¯`øǜ‡"],encodeOffsets:[[-2067,50413]]},properties:{name:"Jersey",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ůį…YӱŭɛÇԱŽɹÍɍÃ࡬࠯į³NjāgcacãƗ¿őka׵Ň©…ĥƑīƟNjŝǵŻऱŸnǞВྤĸْiƂdȌHlǸĀӬ̇ϒÏ࿦ࢲɤࣉǦžœěŭij"],encodeOffsets:[[40085,32896]]},properties:{name:"Jordan",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ǩŽúĆƐ«Ÿç"],["@@Ɓƙ©öǾŶQÑ"],["@@ƥS^ŜƈŇ"],["@@͡ǭÁʑų·ɊԌDŽuƂǸHȕ"],["@@ĉNPƜúƩ"],["@@ïåǝĺѴɤȥʷ"],["@@ƩDµļĠÞŪÛiŁ"],["@@õ DŽ͔čγ"],["@@ŝȂ®ãý"],["@@Ĺ\\¤ɺƄh‚Ǜįġ"],["@@ȔōǛŸwƮ"],["@@áĤĦƲÔŝėŷ"],["@@ķŸǘƺßř"],["@@ķQ˜IJàğ"],["@@Ѯ@ƅˡ̠g£ŗżȡ˻Ε˕ࢻɡ‚xƱ΋ȭø׈ķXĉŽ‚͓͙Ĩ­İٖxŴőƘN˒ϐѼţŒ¦Ʀʹ̄ģÓ¤ɇŶD\\ŵʉÎʉǙ¸żŭˮˀǫΉ͔|ĜȠkeĬҐǔĴǚȚĀȦ³Ȇɥ"],["@@Ʈȣ“¶Ô"],["@@ÿlzƨƉ"],["@@ɼ{ĐͿ̣dzǏ̡ȉǜ˛À̅ŵʷѣơ÷ƋTÊŠǷ\\çќ͉÷Ԣ̌ʖ;ɐƋ͜ìlȐ̄ĖΆû"],["@@č»ÍĄƜ‡"],["@@ĝïƁü˲ɀÑɋ"],["@@ıbƸˈÅ˩"],["@@ōqĪö Úŗ"],["@@ijPrȾɈȦ¥ȫĸSȗȳ"],["@@Ȑ‚sֳ̰γưܥÛˋ̇̕á̟̝ÅūǃࢅΫݑʦыΓǷđˡѕɡc͎ɪʐəÔƹȽtɓǛŲȋiƍρȽȁ‡̘ЦƹČѽѹթÌЙçǴdžʽ¾ûďtʬý^ɫ̹̈ȳuġѱū΍ԫȃÙȱÈ˙Ϣwʀˆˢ֧Ůб§ɹƿۛȋС±˿àƕУͽǶۓÛ{ʊĬŌ̌j೎ईࢶGৌȬŸȅ̔mȈĔNJƊẘՊՀŪՠЖŞΡͻİɽȖëɤǖڲɢӆՂДɊςڂɚزÏȘɅÆɨ˸ó˴̜ȼÂ̜ʄOĸ̫ǀĢƶ·ł˖ύÇDĪŔɄʖŏ"],["@@¥ĴńˆÝŻ"],["@@ų†¤ĀĐŅ"],["@@Á¿ǒĐŏ"],["@@ݠǁռͲȕ֑ǚ̡аìމ͕ߝijґϳljΗ୕ӠύΝǣɵǴȓHŻɟۘЧŵÉ˷àɱʟʥí÷ŤĦ˰ɭ̬rʮӔ̼‘̊ظĻȤČ͘ৠƫ֢ìȶɪĞߒ۵߆ҭ"]],encodeOffsets:[[[126862,24863]],[[127277,25105]],[[128455,25337]],[[131337,27293]],[[132095,28387]],[[132560,28886]],[[133758,30990]],[[134103,31127]],[[133511,33202]],[[133205,33004]],[[131754,33571]],[[132175,33629]],[[132600,34021]],[[132911,34559]],[[134323,34410]],[[135441,34760]],[[132383,34943]],[[137583,35079]],[[137577,35312]],[[138172,35112]],[[132491,35179]],[[136572,37073]],[[141665,38730]],[[144619,42366]],[[142829,43091]],[[144687,46203]],[[144459,46421]],[[147277,45176]]]},properties:{name:"Japan",childNum:28}},{geometry:{type:"Polygon",coordinates:["@@ķȤ›øÍŖøĤ£Dz»Ǣ™ŸƒłEŶRÚ^́Njɉŋĵ½"],encodeOffsets:[[78898,35953]]},properties:{name:"Siachen Glacier",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ǁèĪŨÑŏŪÿ"],["@@ѝ‰ɑѩڥťȉЁŌ։ƟDžחȝijŢճCࠣǺ׷೹ʠƝ÷ʣɋĀˑ·Ʌǂ൏˽ƿĻԢƙŃԯβ޻ͩıŰƛ˯śNқśĨűĢ㚽vȍƴĀbᅛǔ˹™řUӝTûR§GěđՓØ۳˰˕ĝˣʼnęʥyğÒƹåVă¢ƒŒΫ´ďÞǭ’ɣâџÄȷ¯û`Ɠ£̧ͥ®ûທەӍңWɇɿ„ȳźÆȂƩƘਏcǯۆЩVúࠢʟħʳζӹͼϳƍਡÞ৻ŗࠛݸᏟঊᓡһBᶡҗsӣ֚؝̶ࣃƿҿ̯ĒࠖוĠʁʐˏ`LʶЃװнŐáŖƂƌ॒ý҅͠΀ξຈuΩȮ̤ԴÅ֐ӱŔ́Ƌ߭ʀકѝҏÛīƳׅɦbŶͶdڕ޸ֻĄǃÁȑаͻư–ͤˢ̂ȕǼòˤҒ֊ɶjՊѩΤÐőֺזȪƦȚؼǦҠτ̶çƲƟ݀Ƞ̐ȑ٤@ڪχΒщòЎ࢚έڲξѨžβƧͮǞѨwѲ̳ӎ×ÐŅʐöȸɦ̮ƝѤbϔƒƔ϶ࣹ˜ιʂ߸ͺȃ˶ɰʠ࢈„ΡȈϯº~ƄʲÞұĊɄͮזÓᒂπՄ™͜ʄᖮ̔¨Ƹ٪Ȕ৤ȏҲŤϖץý͗ފMƴĶɖ͑ƨNJԜƩМîͿ˭ĎɓϞƠвōČƆ٦ȺǼǐ୴̒ƵʟȝNÂŇୀهᅂᐳπƞrȦʌĢͤđ±ȇˈWàǻࡸWɤƒԄĐӴȁ͆҉֖ƫȲϏߖĭдɸ£ǵגБ"]],encodeOffsets:[[[51389,45932]],[[89419,50264]]]},properties:{name:"Kazakhstan",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@Κi²ƿk§mŽNţɒ˷ݒ³ȾƁڒяŢćŜ}Ȑ[ƀIݘťƎĸŐƪªĆޢΠɌǹǚħŶDĠdɌ`ŬAɩ͙ɭ͛̓͗^ᶻɪ̋ƬȕĂĻVĹɟȿ̓áPȷɇɧΟůęҿɉ˛̵ݵɥǷഩ৐ŠϞḭ႘’নǾδɀɚÒƦˈǞƬЌBŤYǚå̘nÀϩָ“ǎO°˜njGœ›”Ł”ďäj´­hſ˦ǜǘǠǜɔɊȨȠǦǞƸƲ¶Ņ"],encodeOffsets:[[36174,5494]]},properties:{name:"Kenya",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@·ƭ鬿¨•”ɛןŪȓ²\\Ú[zƒl֝ǫʡNJৡ¿«ʪ†úz¨¸kȋšTIÒE~мƴՐȓ͢ɾ˂‚͜œςʌɐWZŴǞ©ѺʬЉ”ʛƤÍGåsuXKþa°£\\ÁmÿnãPiĮÅLJ^³t‰ôwO‡}Hŕ»¹AáˆWǥ_Yʁ|ȿÔŃƨҫƞ֨ϬƦ ǒîHpgjç˜āˆ³ec­ų̈ͦƔ¤ü_ȸ°Ͷ½ĪEɤãǬĒÝά³„‹Ą¡æUÑƺzĠĚʦˤŊ˖Ğ۴˯Ք×ĜǍHüQӞSŘV˼šᅜǓÜġþ»Ôµ¼ÁвÏŲġŜħŒʼnWaeUʳcÍg׹࡯˵Ǘčč•ãa÷ȇǥƕsšJăřԁ á_ë•īƏ¡i‹cã›íćŅë¹Ý»â͗ŅǍFĹˎ…DɽŭʼnuęGśšÃÅ|ċΙLJƙ›Ɓcÿ«Ã¯ďy£iyH‹˜£‚ěOy…›¥›ěuë[ƉXéc§}YϿr","@@ćXÍ`]@LgÐÓ¬Gø‹|","@@nƀů€³ÎeF›ÁìăAaå¬SüC¨R"],encodeOffsets:[[74384,40332],[72361,40812],[72916,40850]]},properties:{name:"Kyrgyzstan",childNum:3}},{geometry:{type:"Polygon",coordinates:["@@ұȲʃđŸĮƴȆǃɎƭȍǛOwҠƩ˂]ÉǓ͐f˲ɋȴƍݞǮt̨ҪʒǐೢĄʜǛ¬®˜²\\TFwl¹Ž·ĖùƴžǪÏüĝÖ«ƌE¶ņyàûŖsä|\\Ƃ`t`†ô˜SòWü¼°Â|{„™ˆuȍԫž«ŠiĀ^rC°ÂŒ†‚S BƸƨô‹†PĖŢƿӟɰׁʼn΁€֓ħĕƱšљ˙ʉ}]ɗͣÒŽĻJ˹ʰɍFȱʻÎćł̋ùęɧÈBǭǑƕΣĻ"],encodeOffsets:[[106933,10662]]},properties:{name:"Cambodia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ƔĭͷƌŤ¯ÒĊÝâͳiĥ"],["@@ÄŃőÞΦ"]],encodeOffsets:[[[-161118,1901]],[[-163163,4018]]]},properties:{name:"Kiribati",childNum:2}},{geometry:{type:"MultiPolygon",coordinates:[["@@ƉöƠŰӂ°yƣҝı"],["@@ģÖȆĎġƣ"],["@@ƑŘÒ ĀƷ"],["@@UćƳv“ŞȞË"],["@@ÿ½ƁňƮŤÔǭ"],["@@IōýfWǘĠï"],["@@࢚ೃ]ࡍƚCŹҫ˽̿ӅkÉȗ΁Ŷ˓ÉBȝʽĐÚǓŻƋŵêÖǬ̋ˇţÖȇǕɣ̠ɖrÌńơAŇˤ˔ΖĿÜɞȌdzʜ«ѸʳCiä˜Ȣʢ·òĽĘĪȗɊĥӴϦфߖr˰ˆ"]],encodeOffsets:[[[129359,34021]],[[129264,35196]],[[129201,35565]],[[131140,35642]],[[131831,35634]],[[129558,38643]],[[131456,39551]]]},properties:{name:"Korea",childNum:7}},{geometry:{type:"MultiPolygon",coordinates:[["@@āYĉǀĔưƎǑÕƃ"],["@@٫SȧϨݵĚƌƎÚôŘdžȰϴиĆĠiȎÿvŭŚəƣšȹȉˢ͢ڿ"]],encodeOffsets:[[[49434,30336]],[[49606,29228]]]},properties:{name:"Kuwait",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ϤЋâȓÞD‚€xödRŒŁĉΑ‚ÁȄʻĚ©Ɇ»ƠéϺȾżýȠƣ§û­sљ‘™rcĖU収J‘`ÁlgŲE”ƒ’ñAÃħĩYÉ·çŽŕ•OʉØǓMEe{ŽçXå‡¿ă¯‰sI‡੊ջA…µĵxù̀Ɂ¼ÝÎÿĒȷˆ˓ɚǕÄÕþšÜ£pÝP±ZƛĢƃꑪŽ”ˆfU–ıŽ™ϸʹGû}Ɵéo‰ĪƷ¸·Ȏƙ¶å€¯gřх½ÙÝrÃj™U­Jĥ­“§ď…OóŒƷƧŸAT…­ÁqDÿ]‰j¬Ó¬Çއvƒš{|ɵđ…ós_Ɓ_{[tãþŕxßµŅƋFÕ¬ûĞǩÐƳĕú¸mºCx¼lĊ¤ä°®¸l¼tɆpöYĠ—ð@ňŀȚpĈDÒe˜ȉŊNƄÙ¦Ƴ²ďÊȓʲËƴMȤ`NJ´ȊÛƊʽȦėİŃƢŭȒĉǧoęlƍÆšŠķJß]‹‡E…€…auÁg§‹µë‘ğȳé÷­•‘JygK™`eĀŽÿhę¾ǡƂŸNǓñóӇ³f™óŧĻËQQšÿȷȁ¿eǑĔȢҺMŦñĶEˆȪ҈õ̎pƆQ¾חJīǠĺΠǝǪċŸßÿsXPºN²°ǼÆŠÜÆèzƂB¶ˆIhËJwŽ^ÐƔɒ͆Ǽ¸Č¶kĩœÅQÃZ­pu†[ƌ ĊFƌëpN²¢bPÝĒrʔGƠM¤DZژnªªªŔŠr€RlIæđƸ¨ÈuŠƒ"],encodeOffsets:[[104579,22917]]},properties:{name:"Lao PDR",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ϧ̙ʫPҐ঒ˠ͌΄z¯ƃƦÉäǯʳʝòï͇ñ¤ƕƓŹ"],encodeOffsets:[[36730,34235]]},properties:{name:"Lebanon",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@àūìЭɛίʨƟʲƒĀ§òǑÒijĀWƴǰʓƻՑV˿|ȅ׵Ȫܻ϶१ࡰ࡝ԢǹȀȪ˜͞ʲȘȄÞʾ®°ƂÀÜʠ¨Hð€ê÷ʂĜɜLJŰգÿʍ̄ǗȒžȘΨƢʼn"],encodeOffsets:[[-8690,7740]]},properties:{name:"Liberia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ʡˏĞտɏБɶࡥ@᳿@᳽Aေ࠽M@нủཤ↏Ⴒࡉϕٛ̓؟Ҽౙ˴ϯڞۑȦʑÅşĘɉخҫؠšɢ͢ʠŕךƘϤġୢе߀ǬĪ͂ƄŒŽņżƀǠďֲƈȆǜ¨ŐnjǾŶƮüƎìDŽöŮÌ~ºCªãİ@ŞLĬP̌ǼŸÁƀsϼȟЊµѾĨཤѯѼ߷ᅀн۶їϢűӸȈͰЌƻܖǐʹо̦ࡠ̚Ҩeݺʥ`ʋƲı۾ǡؾsɮˡ"],encodeOffsets:[[25755,32415]]},properties:{name:"Libya",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@³ĕķŰƒȒZɫ"],encodeOffsets:[[-62356,14154]]},properties:{name:"Saint Lucia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@|ÙſŊń¯"],["@@ɪaϬίѠܣŪצʃϞܟY͙ȋЍލϑϧ~ƟŦȣ֪ũ଒ŠĦ†ɵŪ݌ƜʾY̰˼ą͏ƚÁƎ"]],encodeOffsets:[[[81792,9268]],[[81902,10049]]]},properties:{name:"Sri Lanka",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ɉkɛ̓Ñęʭ€͝˒ƛ˴ŗˆȦĚψӢȊÈŀĀŰàȪðĤl–Z֨ёîȕ‹Ĺ±Ŀŵő™ǿϛǧ"],encodeOffsets:[[29335,-30849]]},properties:{name:"Lesotho",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@µPǸˤƁ˳"],["@@و~’m¦™xʁßɹÅkƩX™u‰ĵkoϙçåx~Ս×jǠë¶ñ’ĥ”éd›JwšfépÏLµïŖHЊʸɏǀгJ۱ǚDdžƧ̞OǮO ɦIJ˶ńβüڔUþ_Ú³ÜN܊ަđڂŒƖǓԀăްοC›qÛ¡ĉ¥ÛW{ŽqƼWâY`iƥţʹR“]Ùķç“Ň_ėwŗǛTŅMu‘yÃÙ«éiTiŪeÀĥlj‘"]],encodeOffsets:[[[21461,56606]],[[26187,55440]]]},properties:{name:"Lithuania",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ţ̃ƍž½[}¿Q©R}nyZÝ`…„YЃɼš–|¨¦ÐĠîĨYjNEMïz»È·ÊyǸõ"],encodeOffsets:[[6643,50994]]},properties:{name:"Luxembourg",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ӑ́ѱ‚ϫƍޯπӿĄƕǔځőʵÆԯŒÛ‰ÝMƕÔړV̓åÝU˵Ńɥırوքغۚź؞Փ̢ıؠɼ¹Զ’IĄ–ոžƌ­͘õ՜ˍȠÏθàȄÏŞYŤCÎÿɐħ‚oTO«LJ̋Ɩl–[šĥĬşĄ¯P‡¸ĻnÑT±­į"],encodeOffsets:[[28824,57491]]},properties:{name:"Latvia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@řŰƒ࢖Ɨ˲ϩ̦Տۄ̥Ęl†Ǩþ®_˞@˒Ěڔ˫êFמƵTЋːǓĮ˟ŮåƄ¯ÆĕOċUïǨī±Ǔc“S͇ĔŹZå÷gFGł]f‘FƿË…F¿\\ÕÀĥ…£qÝĉÑġ•Sí½·ėµÏÏNŭǁg›]«ƒ"],encodeOffsets:[[28890,46542]]},properties:{name:"Moldova",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ĥƷǘ͠ñǧ"],["@@ʼnkkŀIJÀ„Ɠ"],["@@Ͱ՝ʢඇȼչɱәǁƄŃ̂ȓÃƦ߷Ó˟ˉΧzփīο஭₵́గ͋ލϗ̥Ӎãճ˩ʫOছӚ̫אª٪ϧ६tϜǰӜʤƪԖ੎šдǭ̔KˬNjϞ»ݬϊׄ°Тζ˜˄ȊĴïɌšĐƮϪÜȰƽËǰŦǚϼʚƂǷMʆɔ͒Ħ¬\\ʝʞ̺dž‡LJʬȈΆĥź¶ŨĊÈǺĻҔϞļάŏ̲Ū‚ɲ̠˨̑"]],encodeOffsets:[[[51135,-17308]],[[49503,-13684]],[[50728,-12730]]]},properties:{name:"Madagascar",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ōAɼìŭé"],["@@ƾǸöƩɳ"],["@@ĕ¥ŘŘñ"],["@@zĥƉdžŐß"],["@@ȩȴŘи‡ύŚʝ"],["@@Ŀƻ–Ǥêg"],["@@Ƶ†ĴɞÂʣ"],["@@Ûȣȡàú̚ŜŒèȡ"],["@@˹Ɋùɠ͖ɩžȿ"],["@@ѫ೑ƥཉâͻϖҕÿʓtʚ̵Ϯӊહؘ܇Ɣѵјҍţ^ʚŇÿÞҎÉ͒ƽ˶̇ނɜ֘ŽόǨϼ”¼ƿ͊ÓɒƘËɶÿUזϲž͆ǜǼŜࣀ҄ɠଔʜϬ†َƁÀČƱxˬfǰƝªɩŻ̩еұi̳ȷȋ˜éȄ|ȟșFÿż|ɕۻĵƟƣɂr˄ɛ̯ȑuʃЗ˝LyſໝBGӁǟDǵBθ͙ɠƅ¨ÝtÇ@¯¸•Ėy®£@‘÷SĉZ÷ÙCƳ@ɵ@ϡ@ʫAȃ̭ĿǩĕƥĦȹqŸ›s]ÛΗඳ౐ϩȚ©·ΦǧևƶØĪǟyËŎƋšȆË˭࣡Пԁ„̓ƸӍ¶ٟ˴ȯȖޭƺঁКْ࣏ٿĔدɚЃцࡵИҗ֖ƿΆΆnjÇƦƹ²ɲʼz̸ȇņǽ̴H˶ūʨ॥ੈۣӺȨĥ^ňρłˣϼȖ]թˈùżȭ³ŤɆʻšǁŔ‘ʲȎɮê«ƅʀǧƪɫOǃ̈́ηźǷʾÀˎӻĔ࢑ࢪݫൎXѺӝƖŕDzǁÒǛĹڅͦŦɇýЫ˨॓ڜջɌχʚŅĦʉȈóŘԉͼʩϼ܃ƎćăʤȎƟɺޗԖޟxѵʖȭÂȪʀƑ̆љɌƳÙˏѕɟ̙װ૏ߜij[ɩʢF؜ʵբե̴œ̦ĭޞÍȱȶԓɄāǴϡʰ—Ěϼ·ɨöCąȜčõȴě^Ǿаݛިإͼ͙ࢢȟƔ‹Ȝˡ̦¹ƜĐĮȑŬɽҊ፺ƴġǧẘষᛠJFϚ๠WʢˉচگЌ߿ͦʓߊ͙ɶǾɸҊ̄ĴۢāּԁϪܕڔٻ¤Э̊ԡผәȖø"]],encodeOffsets:[[[-93884,19126]],[[-89026,20791]],[[-109058,22130]],[[-113220,25604]],[[-114746,25135]],[[-113766,26646]],[[-117934,28744]],[[-114895,29702]],[[-115871,29750]],[[-99477,26585]]]},properties:{name:"Mexico",childNum:10}},{geometry:{type:"Polygon",coordinates:["@@аˏƖɇó͹ōI·Źķġkʹ’DžwǵƱŷ¯©wԣeɉàȃ̂ÞԎƆ@¬ǔʂĎȐÑĒĶƠxB@Ɇ²ѼV"],encodeOffsets:[[22881,43330]]},properties:{name:"Macedonia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@Nᅫħ՛ɹտ˕ǿ_ŃύÒ·ïෛÍ̑ʑؗÏϟŮѱWʏȑޣ̧ŝʍЉºʋɷÝʫʡV­ͅȍćΛȀǟăƫƿĐ˙ɇķª˭ɩɗӵȻŽϝȫ˩ƒԭ\\řMų™©…W¡ŃĥéNķºEd¤úD~¹ˌțƁçtõÐmoS±KÅnĵo—ɏMÇǗ̱ǔɵòˡɝaƆɓƐÏъˡfɤ̜ΡʴHȾȍЖ̏ÀŒǫͫȍѩƶιˁȉʴ̹DžǓƸĨǦAҌȵάǑ­ȇˊĀȰ·˦ǫɄ«̎ƨÁpjºɘԶìòƤŀ WюЋɄɬي£жîAĮl¢Ú°`ŵ–oẀKŸڊűƆijńyȬyȾyȾyȼíظǙฮ̵᨜íظ³к{ȾuȒʴ@ˠ@ˌBی@ᝀ༷᣾ၭjʅϐəØƩௐѹŀσŕʵȤĭܺƀ"],encodeOffsets:[[4330,19603]]},properties:{name:"Mali",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ʼníƀǸĿ"],encodeOffsets:[[14916,36714]]},properties:{name:"Malta",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ñƤƤğı"],["@@¾dzDžŬňÈ"],["@@sǥÿz·ȌƬŸ"],["@@¥ưŦŅÿ©"],["@@ÁģÁÊńš"],["@@žĽũřC˼Đã"],["@@KƏ™ɤ¦ē"],["@@ÑHĀĢmĩ"],["@@ÅćoŪǴDzĽɓ"],["@@⬾ǘ„Ƀ"],["@@ǟƸɎC­Ƴ"],["@@Țʼn™ąũKĥƚÐÂ"],["@@lřčǒâ·"],["@@ZăĝɐĄƋ"],["@@·ċͅǻõljŸi}]ÏxÌIJgµ‡ƁAçyÛÅÅş¯ǻM±ijÀ£ŠÃRƛĉɗŒxdzΉ§ƃ˛қë̙¼ǕʏÑܹ̹ÏɒȑØб؜ۑȆթƦò¬ÅÏƝȍŋ‡ֵ̭ƏVȑ̲ԭӊե[ֻʀЛǮ٣Υ֧εύ¯ЃŝŽćբǮʼÈԖŔňȫf¼ФąjàĒđۂ̿ی§˧ÆUϖDžЮĠ@ǧǦďࡢŁŨŢҤ̍ƧӔ̉ʲ¶̵ťˏ˫ǣȯɚŖ˕ҽɳ̽ϑó„ž˺ƛɫȟO¥̬șɹ–ԜɗΗǽß̬ಬΙ঎ÚRƧŸqͨĭ͙ȉńdz˾˨ŋƤǞ͗ˮĄŘϩƂĵDZŅǼÆʬȧǙÀƎŽȈYɣͱиŧфŶŬʨőƊUЈOŽĪź‚B¦wnjďĚǦúŴé̞ŀˌŪ¤b ޴łÛȘf͢œȀϚìŸĮƎǮϰųİĪȲ˘ʾpŤàؐ°E|kjČQʄŢƖࠪԶԚˆƀƍŰcD¢ǝɶeÚâƸò¾ʚȆ“ĖjŎ„ŠÚČĚƀ¾Nϴ˥ȤՕżĚǖëôڋ­ԅķĭüǫ˓ɷDž_ŏɹDž“ç͍Żā©ʃƪəťˋծǚԼVƃǻžɽ€ηҰĹöğ˃۫،ćpɧǨɷϨQЌʄºƿ"]],encodeOffsets:[[[100539,10172]],[[100567,11216]],[[100920,12027]],[[100881,12191]],[[100420,12688]],[[100776,12901]],[[100675,13414]],[[97081,16199]],[[96745,16329]],[[99917,16644]],[[95940,19133]],[[95964,20028]],[[95736,20370]],[[95243,20403]],[[103567,22086]]]},properties:{name:"Myanmar",childNum:15}},{geometry:{type:"Polygon",coordinates:["@@Ϡʉ֢˯ʑÉTdzɳÑőŸ̽ϥ¾ʭݿ׈ĠæáŖmLjb|z^Ŕ`CƬĚÚ¬ĐÀìMš­¢NTÄąŞV~p`®Sª]„TªP|Crë"],encodeOffsets:[[19680,44493]]},properties:{name:"Montenegro",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ܷ˵ԛӉߧˋēcշkџ€୵ƅݷʛҭȇįƒå×Å¡ËiНÂ@ȀNjʵ£ʉ՛ɊлðΗÆƷ¸ˁʆåpé^͹ZӕÆε®đNџğ቙ȆۏÍѳҲ˫֬ǙðrȨՙÖ৑ԀؓúǫqŽCɁvţ„ϏP҅Šơkǹˢ˸іIÎ£Ô‰ĀØВÙŔ“ÒÏ~ëfǿʀÑȂßþa¶clĹtóšÙŎÍR¡•ái­FǻƬçrγuÛ¢­áZſÌę¦QĈ¥ÈēhēÌˣêäŸȓìõøŊĴ³äRŠUžĸD¬n”„òŠÞǐφ†ǖ‹‚âŠXžroŽUĐzÐ~n”‚Ÿ_â¤ĖØdSƼΆdžԐňºŒž ɘĠDzŒÈV’NØC‚®̜ƠʦCôRƎƎÒ»ǚī°I¶x’ÌÞVîWƌƣ॰¡Ĕ˫ɔǕ¼H˜`Dz@ƴĝΊoҘòȾć֞eȈŵŶVȖƜΐĒȺʎ|ȚœˆÇˆ£”ǡ˸ɸоҌˊɆˈࡺ̥ĨeǐMȪGÊY܂ɕDŽ^ɀʔ˚H«c›Tĝ˜µjȃĐģyŏࡠ͓ˢ¿ø`ânɶmરːۮƛŴ\\ǦVŘ_ȖĭČġĒ­ø—ĪEʆGʈ‡¤ʙψɏĬ¯üeԼXǼÚu֞ċȔ¦ʀÝIJp̈́ŚŎªþ[մèΒĞǠsĞbĞœŠ¢ŒÜÔĖżÞńÊņÆ؊ɢϐ‘ɖăɬǃø‹Ä_ƆSňKàtŌžǪºèCŔǚµŎąܥ਷{ĹJğUćū¿ĩ±üɋʀƿĄræàƀÌðD¾_ŔIŜtĞJŠa¨aIJ}ǺŝÆ]Ζ˰ؘGΓļķÎÃĶŘ‘ÄՊчƾʕƻij›“kïCūnţYƛrǡĆħt­[ɯ×TËSƧXă\\ŷïWˣůǍÐĝC_[ƒ‰čBo{Ћvʝĉ̋ͷ`“X¥—³ѡɿѥËȱWƱ”ƭ{şƿɃŷñáǟÙȋŏÅcҍÄ˽Öğ†ćĀó ʣJãfœcзבѾҫ­œ"],encodeOffsets:[[114564,44729]]},properties:{name:"Mongolia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@èЦÏō"],encodeOffsets:[[149250,15497]]},properties:{name:"N. Mariana Is.",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@MˎÃȨfɜĥ¼Ž఺ƽӌɇΈɏࣤŢĒࡂࡄÛƊŜАр֦ǷԄÔʈųƎʘӦĭఐÒƞࡏʄס;ڡz•̒Əո᠂ࠒκүبŤŌơˆחʛҁʂЩ;χƮśŸƯº£ÞGÒZdlSʐ§ƚ©ÆU\\ÚƺĮǸȬˆĠ| ŽŠČĐࣈuzgNJƁǦǛɞħŢŅƌȝɈͷǤÇȆEĜƹߎȼЌ®ĐƖZŐEȈHȤQðkºFÊhżŊłCƞéþÑ`½Ī‰֤ŞͦťƚˆƸĂǐʊӒijиȸۢɊƠüЌ̚ŰǓĿēĢÅǍуň֟›ЧĀţť̇ŎCvख़ĶûÍ˗ňİÎʟȏͭ„ũ֕ߵNjÍ®šٓҋ߃ɧݳйʱɇ҇ٵş¨wţ͍ōݿۍʣĤĚĵ§յɸ˩ʊ܁¢طʵÖ˶Öŏž׷ǣۭƞu©ȭлӭၽ۷̷ћɒɛĘƺkƙ™ӟEe҃YŹzñK"],encodeOffsets:[[32884,-27483]]},properties:{name:"Mozambique",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ÃćĐŒƀ}Ƈ"],["@@ŷډṿL³Ʀ‡S“™k£Bĭгíً¤ɃɫэЌʯǙËƱ™ȽűDž¹oiʭŦ˛Ȱ̵φʯЦ̅ĨĥqγζׅĆٷljЃ ǝ˝ěmƯƒá@ϖÔ˄ζઌƵबʧ̞ǬŴŝȠيȁΦljeɇϞş¥ȝ_þČβพD६BϪBȖ@Ȗ@Ŷ@QŐOĘQŢSޗՠ·˚ĸưŖöƀĔĴà¾hƾx̌ŲNц@΄@Ҝ@Ŗ@ɮ@΄@Ɍ൞@޴@̼@ƾ@Ǡ@@Ī@Ǝ@ȌAȎ@ǖ@̪ἢኑۋ@ˋA˟@ʳ@ǔก̶ᨛǚอîطzȻzȽ´ЩĴŃŲƅ"]],encodeOffsets:[[[-16766,20180]],[[-5488,16674]]]},properties:{name:"Mauritania",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ӓ~Ė–Á"],encodeOffsets:[[-63640,17143]]},properties:{name:"Montserrat",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@˩¶ĈȲȮǎŔȇşɭ"],encodeOffsets:[[59035,-20976]]},properties:{name:"Mauritius",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ŏFƕY“YÍȻЋƺߍFěÈȅ͸ǣȞɇņƋĨšǜɝƂǥžȃďࣇ‰ċŸğ{ȫ‡ĭǷÙƹV[ªÅ¨ƙTʏckÑYÝH¹¤ ưƭŜͽψʁЪʜ҂‡טŋƢاţЧՄƕËƷːŃĊʠ̬PѰҌ̔Ɵ’óǐªΠÑɰˆ\\Ĥȸñʲ̴ʤĝƌ_’QĮǻǔtì\\üďĒďžŷeÙǸࠀəĚƦ˚ȣȾёĈҩ¹ʍƔɕĮ« Ínī"],encodeOffsets:[[35799,-11856]]},properties:{name:"Malawi",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ßnnˤ²̑"],["@@ûˆ²ĖŠŝ"],["@@ȡa¸þƪÛ"],["@@ćW°ƺþµ¥ī"],["@@ÐęƥăćžǞ "],["@@ȪÏǎʹӀϡˌҷpྕ̼̑΀ܛ‚˭ŕrŏǰTƙʟIǷĵĻǼՉʺளࡼJ̲ӭ״ä´Ʊ̎ɫഢȋϪŤȮìŏΆ÷ĴǷưEÑЅŎőϊɪĺŇǐ ȒΖ"],["@@ЉƖӯ„ջmƳŽȋঃǩQŇŋ‹ɕĊģͣɭšɩˋѹԟcɽǕԭǖÁŐϻOʑĵěʝɧōשԃǁ܏نīʀúŎȢɛР›ܾ˕ǍƌȪӨ¹ȪȢDÌ̤ఎΚ޾ࣨŞ̊Ӹүƾ̘ÿ˚ɾƴäѓƸ‹ųҠȠ„ưƈœːƺDŽŘÏŘæܺନĎų¿ȃ˺̨Đ{ÄəˆƑìƋ¥̉ţįфƚĦDžƱَå͊ČȰǵՆƯ˜ĕŸůʳŗշ…ÙƇ̈́˛[ĻґŇʽþĹơ"],["@@½«aŨǚüFŋĿ«"]],encodeOffsets:[[[114063,2474]],[[106723,2798]],[[120714,4287]],[[102696,5422]],[[102245,6621]],[[104552,6393]],[[120397,4271]],[[119954,7341]]]},properties:{name:"Malaysia",childNum:8}},{geometry:{type:"Polygon",coordinates:["@@ݨƈϪ‹ɦ§Ɏȋ̋yͅșʋ|եν͋ϰስˍJᵥࡃFᙵ@ᲃ@šυĻȏƃÉƙë‹܍¬ܧǂċǒVȜƝŘōĐĻµ·…ù›mŋµŇ‡ŝ폛ؓնͅӤǝ݆Ɵdžʼnઆ˯ۨๆࡗಂʁؚ׭੐ֵި•ɀRфƈnĤ¸ǘ•ĘE’PDŽMՌȬʠËҔ̱ᅌfሼSҺ͹ਨ»Ҫſೠƶࢴǒ"],encodeOffsets:[[23942,-18064]]},properties:{name:"Namibia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@č_@ĈĎç"],["@@ņ]eƝŹsŷȼƤ²ný"],["@@˟Ǝ‘ÚƂĴőêȰYĒΫ"],["@@Ȟ‰ٌХЄл੾ەxțǑ­ʱĶಓ߼ُںğ˶Ťĕ"]],encodeOffsets:[[[171566,-23166]],[[172044,-21944]],[[171419,-21668]],[[168144,-20731]]]},properties:{name:"New Caledonia",childNum:4}},{geometry:{type:"Polygon",coordinates:["@@ǠఉΦӋgȅ͂͗ȓωɕᠵङঃޛଵ¶ȷĎίƭEēϝȅǻĹLJȝ౉ɺЛ“ȷ¥›UӍϫΏVϛðʛŸ̡Țŝ€ƕ^ؙ˱ɅĜщҨīJ̃Đ̅ĜÛ[­mĵáӝqѡɳǙֵʧȵ©۫ڑׂσƋp˙ˇΌźƂķȢґÇӟ΀D˖DzMө̄ǁɦŸɰǿɄ®ΐؘÐ̒ʒොθðώÑ`ń˖ȀɺրĨ՜Mᅬഞ˰൪୨␤ᕨౚ˳ؠһٜ̈́"],encodeOffsets:[[15339,23549]]},properties:{name:"Niger",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ƇoòŎÖĝ"],["@@Ɇěؚ˲Ɩ]Şվ͑ϜïΐUӎϬœVȸ¦М”ొɹLjȞٮ̀ƮF˜ϑŎƯĄϹtƓô÷ȸ·Ďŭ¹փ̛ȋ¹gïGك÷ÑljɡƏɥķηŧœÑЇɧř­ĻÍΕqËʼnųȻÓýƧßŗǻ׋ǧȳ•ÕĂŽǡƑÝ¿{ljͭɑ¡hÕȬßẩʊljƻĵAó^ilc oŒėÙƏı­g“o¯ġÅıƛħЯсʁܷǙˑɿƶº̋ձƒħŊȷěǩƚàǝșĻŽˬþ̏ȑƒ­ŖsœʓPļćŻǟ¼͏ʸŝʤÃƸþrę”CŤƴŘƍÓƽŎɎàŇĄǷÇɃ͔ί˔ࠗâɢƞʋÕāŅՇw|ȎdÈl¦k¼kæUńˆôK˞`xdlB„çݨÔ֪ɨˆɾאɸȎœͼŀRÀDŽßƌ‘ʼk”±´ŵǾFĖÂՔÄÎÆc٤ʨȶǚֶѢɴӞrĶâ®nÜ\\ڶǵъҧ"]],encodeOffsets:[[[7476,4525]],[[6968,13423]]]},properties:{name:"Nigeria",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@Ñōǥ§׷ʼɳč֥ȴƇŃྦྷེîàƊĹò¶ɺZ¦`úǺœ˜æ\\ÂJfz«˔OÂX¢tbľXȜgž^ĀŊòĂ¾˜¤Z´íǔķ„PhNLdE²¤¨ЊˢŲɪǖȒǸűĞwݸȲĊĎĸ€ɐ_w‰qÁijÃöÍÛĪÝĤ΃ȋ˿Ż֩²ރĭ¢†ɈƉDZØБñˆ½Ǖľ‰¬Ƶǹ˻Ȏ͏"],encodeOffsets:[[-85649,11180]]},properties:{name:"Nicaragua",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ũVĪ̀į"],encodeOffsets:[[-173878,-19541]]},properties:{name:"Niue",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@£ħīɪƐƁ"],["@@˗ƭЁŽçŎ݂R"],["@@łù́¼ɀ~"],["@@Ʃ‡ƪŮ@ĥ"],["@@ٷżʜ²ѾĿɧŀƮ\\ȣǚҊоʊՎʖhЄʸѾŚو†͎ƃƑՍ˓ƒŽŹʌëʽʥÜħ܏Ƒɀ̑ËʫɭįdžĿ¯ŻʥrĒ͆ӧłƷdžگé"],["@@ŕLͤžɍ©"]],encodeOffsets:[[[-69842,12437]],[[4328,52620]],[[4044,52982]],[[5004,54345]],[[4328,52620]],[[5454,54668]]]},properties:{name:"Netherlands",childNum:6,cp:[5.0752777,52.358465]}},{geometry:{type:"MultiPolygon",coordinates:[["@@Hıōɒņş"],["@@ƅCÀĤĆğ"],["@@ʣÜɨ¶|ő"],["@@ƷhВİlč˅‰"],["@@ЭJʀĞǮħ"],["@@ů­ȴɂăǓ"],["@@ȌŸܱȇÒƒӔĖ"],["@@^˛ۉ Ր˲Ɯµ"],["@@ӌˆdžȱҙȗ෽DZॾΦÐάӆɒʍح"],["@@тù­ʵϳAͽƷɭ¶Ljʔ̠hŤǸ"],["@@Dž{ÎŜĸğ"],["@@˃Yzńʘ`Mʼn"],["@@̒¡ɯǗҥȭջiȀǮ˚\\Ϫϴļƫ"],["@@Ȫŝ΁DŽƘ¥"],["@@ϥɡǿƌԘƠÎÉ"],["@@ʩIÀƼȪƱ"],["@@ԥɱЁu̩Ţ௒Ɔ"],["@@QȵֱĈýǟחœΟɵĵžЦʞLJǖ୧ͦԵƃԏRϟȉ˗םڳͫࣳǴѽƁލÒۉҮѷ¹@ơϋIы_ȚƟͅбඕǘ͗ӷӻŜғǫտϿɶ̷ࠗӅ¼Ʒ߅ƩÁۣ۟؁άįÂʓƱƅٍ¼ΉÙԯ͹ƧʯʮࡋŭӃ،̳ƣʕ΋µʚҩđ˿گѝİʫŽ̧ƟaéńҭŮȩӤΓى˱§ʇżČšఫۛঋķŃńʋ­ÎƔߟɖŵϜҚĕɞŊɝ£ǭŬÀǜ϶ȼਯ͓ÌͶȘŲʦ«ώƂУœԴЬȌPŸǩЀ̠۽ƓࡍקºϘОˆ͹èůȬіȰͻıŅÈě͸๨ĔɖǃDŜӄĴɑøĆŔɧɧӕľǻŽ޳́ðĕȶ˰¬·ȌDƘࣰù׸è௵ÈĽȊ٠ɎƦÉк¸Ħ¼ҳ»ǼǠદŸĩĞюĊ઻¥ǦǬՌƚѼOѮȵϹˆВƲɱƀǺĒҺOhőҔƒ˘ȝتЇƎժƲǏĀʂĖųžͣŅjŵ݉ɏЧǎ࠾ײߪ˜ĠÎ˱¹njȆ֜Ǡ̊ã΂ȬлŽʃĂҰԼ̀°ȽŦੂǔޓÇþΈؼźʵĦϨǴ઴êࠉÌѪʮՎȏĈƢϋæ²Ǝϗď±ŪˮƐЦqʱĶ׊ƈʮ̇ĝμଌĠ࢏ĚೲԾƄ˂րœʧžӪɎѲ†åָ̛ѪɩԥζǮɆkįͤҔqɨľҖƭԳͰߺ€̨Ģ֚͟sȊࣼдƁŀͨƦԜƃцT؋سലۦÛѽͼĐǎȜ̦¼ʽȚ̌Ũڜĭгʟ̾SáΛ՜Ԭހǻ˞²݈έֱű௫ڠīLjȽʞUŲŨdžŝψ¾"],["@@Ңūҩ‡ɣÖɬĞ"],["@@ߞ˴Aŕߛǝ"],["@@̝ļ˔HŠŃ"],["@@μeɌ̉ॸß˭ƃຈȡጇЩŌʊํÿ،϶஥Ұ୊İ"],["@@ܮͅ࠵ȘӁτ׊ʕ"],["@@ղMີ«ԺĬҊ±"],["@@ࢢęƓΏؔȀʀ˽৺ǥ׼¨ٺ̭෱ŋ᠏ၽይվ̵ɰטbȎƐᄨĞijĎᛗŃ·ɎՄmఐ˒ਂ˜үŒˬƈଫDžƒʢ̱ş˝ú§ʳѷť߯ƒ຅״ߪ‰ȩ̒щb̷ŻЃ͠Èɺ̄åҬĔӮěOĒஎœîũਇũٺJגȗӂϢเۓѷצΰ̰Ҕţ"],["@@࢙UᅮĠओĉ"],["@@ୢǙƊ̒ҶÔĚʋশƤᓂǛ˴Ʌವч෋ǫ࢙ŒƲ၉[؛üϡĐठƂႷXЁƚԎĜ߃Ěபṳ͞঒ȓ"]],encodeOffsets:[[[5208,61755]],[[5078,62551]],[[8298,64858]],[[8675,65196]],[[11501,66423]],[[13284,69504]],[[14206,69904]],[[15573,70598]],[[16139,70207]],[[17924,71267]],[[30676,71472]],[[21278,71772]],[[19718,71749]],[[20242,71902]],[[24183,72243]],[[24595,72261]],[[24004,72516]],[[31611,71459]],[[26201,72850]],[[-9168,72540]],[[19681,76177]],[[22127,80482]],[[11521,80498]],[[29745,80806]],[[17190,81825]],[[33307,82042]],[[21400,82176]]]},properties:{name:"Norway",childNum:27}},{geometry:{type:"Polygon",coordinates:["@@R¡IJƃžķJç¥ś³ſy‡Yקmɫǐ˃ĵ׍Ƕdz›µŠõǂáVɵĉčtэɲ¨BĦ[ž¤Ň¦ɁäśÂəĩçfǏ¼ĕR¿i]…ã‘ҳŰmރޡ\\ƫ_ƏîƧĞي£Z—]¡q™OֹЀӥ˄Í`m{a»Nÿ°ĉ´ŽĜg’„ľžĘrÂÐpļCĘÀŰîƄŮƜɪȂzjº‚¸Pǰşà®ƌȴȌ¦Ǵqǂ‰ƪə޼ϛάί̒ĆðuâƒvÁ¢ĵ®Ŀӊ̏¸MǶ´¶M‚UBióƒģ†³øoǖaɤDæµæíæũ‚½”cÎr^۸€æýĢ¿äЈŒĺ¼dÜOzq€£Ƹ­ð‘ĸ÷Ųa˨MȨÒȾ_Łأ"],encodeOffsets:[[90096,27786]]},properties:{name:"Nepal",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@§ÓėØƀC"],["@@lë̓ŒDzɨƔiǝ"],["@@ďÑǔŗ׿ǁɼ̐cǨƠJDŽƕ"],["@@šijʼn¸ð¼"],["@@ǡŁuĘĝoƶȫƳûĩäØƺʗzʂĚ͜o"],["@@őµƸǪ¥ų"],["@@ۦ̖ů̇ǜɺʬsɛȇ˨Śʧ˙\\ȭǘÏࢽਡԇʝĤéǩğƖjĨƩɢ±OǕӁ€mĮƷşɕƔŨǍ߃̱āկūBĪŅ΍էÚƽ̙Ï؛ԡ́Í߭`NjȲ̅GʫǼƝý՗šƺȬɡëÌŸȍÙIŐѠĴǥÈnjĪɍWRÚƪ¼¥ĆʊċØĶǡƖȞ”ÃĴǺŖ²ŋfǀʪƨĺÍ©ƐԎЂ؆İSŘ֐Ȭ΀̼ƀeýØʸ`óêŢ¢ÎËȢʾ–ƕ`DŽʈȢƢ֔ϲɌLjӺтΰʮAǯqyĽʆƱńα"],["@@Ǔ¾˜ŞżǛ"],["@@ƮútđՌǑƁƬ®ɔҏƹW΀їãҁӞŷðdzƂJç؎ʾɑ˰އঔ̉آςѸŗɥܟʕƝÉѣ͕Ɣϑůř˩ƞıɣПܟࢱ֡ͭŧnjʅM_ǜȗÇѸ֘ü˨ĉƦūƎࣙϊƝdžæưҮƪǘƬǢݜńü˽צŰįǐŌŭŠʱDʋϘǴğQ̦ĿÜ]ïǻńĹǶFğȾʹĥաۊǶȊȿƳ¿¶ǓȦØDŽСҼ˴vãęʲͱ"]],encodeOffsets:[[[173239,-53757]],[[170211,-51979]],[[172181,-47986]],[[170987,-46264]],[[-180405,-44790]],[[178089,-41844]],[[177271,-42269]],[[179757,-37149]],[[177428,-35773]]]},properties:{name:"New Zealand",childNum:9}},{geometry:{type:"MultiPolygon",coordinates:[["@@åO@ńȲ˾ÈƏȓʡ"],["@@ɄёОЩ൲ϵրܙͦŵmʏέ؅Ѝ͕ΟץɝdˆƦÙSʵ́ŭӇĈ։ࠣɛωٟݻŧȉɏhɝǯʁ࠷ƒϩȵѱĥछጊᠾ࠾֐၌ϣמ\\˦˨چÁĺѢĺ³Ÿƕx†ՀǤðÂǷ˘Ȭ"],["@@Ź’n̚ñ`˨ʎĩי"]],encodeOffsets:[[[60132,20704]],[[57742,25579]],[[57650,26267]]]},properties:{name:"Oman",childNum:3}},{geometry:{type:"Polygon",coordinates:["@@MΥ٫֕ۖߕÄ޽ںՓe˂ȕDƳ¦“Ȟ_šd€[iű˜ĩljǖJ̆Ʒáśī‡É_˧şĕ·ãÑ{­_©ÒǃZ·¹ǡaÙüÕ`™N…ĻÙŇǓ@ˣ̻ġíaé–ÏR¹Ÿ»ÝËΫƅГݽһɷ§¯ƍ̍Ʊƙ·ʼneí˟ý̛ʻįÛIęº¿Ƙȍôƅù§¥āŻŹȅ˟ʣć̵ըɋ†Ǜ£οƐǟ¼iľI´HÄjàHȱȎ̡ÖƟÐőv͛…u‡KŸÚšA}½¯D•gååa§O³Pã„o¬R°e‚ɏ¿DžËʗĹõNç¬Ù¢īDǫMīBËdÇ[ëh‹u‡C¡¦kMg_WuGʧȡFěaĉmıÑ£ēɋŲLJų̟̂řӨϿĖG̬̿͂ljĝ˰£ළřıĻԋȀх¥Ãţྥqjbzêrʤ€ĜSºNdΪbnvŸ|Ɯ‚¼ʄŤĪWÔŒܚƦdƠ²xR^Qǖ Gx›²»Š{RΏZ~҈iͶܹ̂ا࠸ıĸDžǐ͌ğٶǿЎĹࣼöҀėʜŸל^ॖʴĮ߀МϮԼyʈĠƅƌӨʠξ@ɬƙΈʬ‹иɔӲٔɦ̹؀ٞ¯ͮÚːʼnƊվո£̨͗и¢âࡢԨ۸Ŋ"],encodeOffsets:[[74844,37750]]},properties:{name:"Pakistan",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Ƚĸ’Ŝê|łʏ"],["@@¿ƌÞr]ƽ"],["@@ēƇʂѵ˽ͿȉŐśЁѩۨŒ~Ūʜ͎Ʌ˵̨ĽċƧĞUųĕɰӓ̴ΝwƯijŇDZƙ׫͍Bŗϔӛսɱȟ¨ƍԼǡɱȣĄȉΔγ¶ÛĮϋVƽÙ[ƧůɢƔĮbŠUŪ½ĘˆÄżĤ¯ØĉÆ·H@͜^jŠX|~`º˜lƂïäЭŊā€ǿŶc³ƇƖąʢnĩƶҐ̟ѢĚװ˔Ҧ͜శ̥תӝ"]],encodeOffsets:[[[-83561,7509]],[[-80791,8473]],[[-79231,8867]]]},properties:{name:"Panama",childNum:3}},{geometry:{type:"Polygon",coordinates:["@@Էσ‡ȕˆ‹ŽŗȳÏLŃo{iij{ˆsª™Öë°] {WýƶЃŶħŒgR‡I«°ñĊÅŐƏĆġHŃĵũijũۤĉǖбۼ^ȊŘØ„ͼ˺|^Èty©m­Mݗଢ଼ž„À~ê߸…¦OªFÐbżÄʬĸEƒkĄFݦಧʙͅāګǠУЩՁ]ƗǞɯȽͻǢя̾ǃǃřXƓԓҷk¡ľşVÑ@›@AÙÉĉÛƕ­¦ʋĽǹЯśޙ֎Ǐ͚޹Ӱ੕юୁڒίњͳɠω٪ݺˆδԝ࡮ˏʐÉͬ΍͂đϜϙغӛఈԫڀԯࣈ७ײmƴȞ†¤Ǧϡߺ¬̆پۜƮĞæǁ¦ˡ‹e‰q‰³őv«i¹b¥Jˆ‘ĎEùћ·T‰°”Cø ĄĘ¸^ÚĎ¿IJ±¢}ðRÖZ¼¾^ŋžă²×ÎóÀ{æÁ˜l޾j†²^Môf´ž¤ƨĔŽ˂ʬܐĖÙ͊Ь঴ΚӸΰѦԐŴӎZŽƄwS̤ƑƴÇƈϤіLˆʊgǞü˰űl›t­Â‹Ú…¾»”‘¤¡¢¿êɩ¨ÝŒ•NJ·ÊͺwÄÑǖ©Ƙύʦř–ϓƒ½¤¯؈MȠتŽÄ¼Ä¾¨\\njÑƌġǚlêÊòh¸hɚŕ¶ÁÔYʀő¦¯äƒÌe՛ऻǤíšEÄh–€’J”}¶ÖƗŴģ¨×KŁu£KÙ ġ]ß°u¬½šŁcDžRß]ƥƩܷŻΉȳą‹ĭīśĝùµŏw±yýљƵʡŸăuÍĊ̱"],encodeOffsets:[[-74892,-6621]]},properties:{name:"Peru",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@έƽ̀ɚîÛ"],["@@ɂŕĭÏΗêʄļ"],["@@őYŃȼȎÞɠśȗƣ"],["@@ōýbĦĬg"],["@@©Û·ôržêfFƻ"],["@@ËoKľØč"],["@@šUWĀźé"],["@@éœķöǢž"],["@@ƾ™Ĥ˙Ƒ̙Ȑģþɿo̵ŔŽXίͧ͝Eҗ̩ࡰŕÏʷӕǪȋâУˑ͉ĩЄʯǍ׷̜œƠýӶȆ͸ғΠơSďͳʛʘɅƝ©NJƧ”Љہƫf‘Țˎض֘DzŜɸ͒ɨΒɩ¥͑ͰƲǨ̶˜‹ŚΆɮēÌƄʐWwخ҈λ"],["@@ÉÔèȄĊɑħ…"],["@@Ѕǁƽrijnj̚ˌƌrȮŏdȩ"],["@@ǏǢƠ˒pѳ"],["@@Ļ}¸ƺƀÏûë"],["@@ģ¡AƶƐŐ©ɣ"],["@@ŗIŅɖʯƎƋ˸ÒŜ͔ŀΖƔ͐ɰĜɈ϶ţͿޓWɑƞ˩ǃǫ"],["@@`Ѥո઴ƒܽʯɫˣ֭"],["@@¸ŏáBjŎ"],["@@ýÓŎ̄༾๜èиȺ˺u̡ƈϟˉơƫɡ·ŧ̅ևऽۇ"],["@@űč´Ŏþ"],["@@̘|ĆƉ[ΧɊБŁıŻƬ˭ȷŖLԨĽƲǻīԦȴlj"],["@@ĿMĻưŴlĈǍ"],["@@˼g´ŻɜÏȽˇʟƒƓۇ͇Ų৖ƿǰĨ”Ͼɽ"],["@@ÿYëɚƦ‰Fǵ"],["@@ņ¬òǩʯGĿʖǸŏ"],["@@șŪƲŒ¨Ƶ"],["@@äǥǺʼn™ԇè̙ƌǁхĄǕǒįǼÞǨң͚ŵΖߐ•"],["@@˘ˑJǵӑ϶ˇʓâքЖʝ"],["@@ãȽùȎàɢŦ°§ʡ"],["@@HñƁʸźȅ"],["@@ðŷ·΀˘ɇ"],["@@мŸːʧdбū˳Ɓå˃ʖɫքʿȲÀĖʮ"],["@@ǚÝġɑƥľîDz"],["@@ƭčŗŎƾΐNJǧÁȧ"],["@@č̋ÿ͐ǎƒ"],["@@شˏnj‚ĞƆIJyħڙ̰ґ͑߃ґɃXɛǷ́ʮӳËŽŜ΍ϐȧÜÈóŶάƜʴʼnƘοǐðnȎиȋSīɍÛɨ̓ƒƃ̜ÙéϿƵļÒȐՙņŭͮӋϺŃkǘЭÉǛȉ˞ԉΖɵăƁNjȽ~ɉǤǟãi͒ʲʰfŸ̛ȤJͯű{ǁ˸Ɨ¶ʹ୼¶ÒˢɻǬÀU౺ȰܶтĜ"],["@@ă«IJƘmī"],["@@TùſîŬL"]],encodeOffsets:[[[123137,5383]],[[124068,6222]],[[125024,6583]],[[125888,7587]],[[119890,8073]],[[120172,8412]],[[127803,9363]],[[126667,9460]],[[129031,9545]],[[129085,10001]],[[127585,10023]],[[128707,10153]],[[122795,10738]],[[125594,10725]],[[126087,9282]],[[126332,9677]],[[126728,11555]],[[120127,8643]],[[122739,11802]],[[127565,11616]],[[127600,11769]],[[125437,11894]],[[122920,11985]],[[122983,12460]],[[125599,12605]],[[128246,12829]],[[126686,12583]],[[125025,12652]],[[126746,12753]],[[126241,13162]],[[123602,13803]],[[124841,13866]],[[127339,13960]],[[124963,15366]],[[124008,19063]],[[124848,19349]],[[124438,19827]]]},properties:{name:"Philippines",childNum:37}},{geometry:{type:"Polygon",coordinates:["@@áŦŔƾ±ˣ"],encodeOffsets:[[137826,7560]]},properties:{name:"Palau",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Ȍġǧ™ɡĨénj˨ŷ"],["@@ƅÁćÞɎ["],["@@]ßĉ’ĨŽ"],["@@ǺÂÅȧɫĒƷ͐ʰʻ"],["@@ɔÑĘȿϩ˜ÔöÑƨü\\"],["@@ȡŎĊžĤµtȕ"],["@@˒ġ^ŝϝǘĮ¨"],["@@dÑijʀĦĘU˅"],["@@ɝĪɔoJù"],["@@ȵǘ\\Ŕɖij{Ƿ"],["@@ȧƧ̿ŢšΎϋ̈́}Ф̬Ƨ̼ѱ̘ȡŔʳ"],["@@ƝŀłĮœȭ"],["@@ę˔üĆĂǡãǷ"],["@@ŕ¸Ħņpƽ"],["@@ǜìʐҝЙ̯ɅƆʁÇďǯę̍Zʉً̯˿ۏwɩDzʃٗϔĂǔުĥЈ¼ŌÜņμä·ćȧĢǷ׼ÞΪФ̂Þßֶ˔ă"],["@@qó𳥬€ù"],["@@AᇴħƔĨͦCᲘ@njྴׯԖġҶ̽ΊiԠѯȺ‰ζοkӣ໒ջȢɏ˜̇؏·ƑħȤҙ޾؍ĶϙǢşŐ̙ԬhÄϹؼDžȿıĨǧࠌȇ͹Ñǜǯ˝ŗʫÞəȌအʄكִ­ˢ˩Ğԇܾࢷɲġƞ̓Ä̯DžЧʠʌНĝí˅zĄǙࣷķƩżşyɦƣ˖r˂ŇɠʍUǗ؁̭ΕƄअ©ƁĒ"],["@@ÕÛŷǒÑш͛Ҧ৳وˑøäƔ২֭ࠠܕĬȷƕͻ"],["@@ɫBǡƾɠøǞïPLJ"],["@@̶ĉșĻևuĠȠΌ\\"],["@@ȁèˆIJƺǙ"]],encodeOffsets:[[[157221,-11751]],[[157984,-11634]],[[154521,-10818]],[[154707,-10260]],[[154142,-9570]],[[153954,-9721]],[[156295,-9174]],[[154734,-8943]],[[147033,-8685]],[[151579,-5966]],[[159701,-6847]],[[150709,-5562]],[[158359,-5563]],[[149524,-4839]],[[155562,-4399]],[[156335,-3208]],[[144360,-9337]],[[156637,-4870]],[[154048,-2725]],[[150598,-2007]],[[153360,-1590]]]},properties:{name:"Papua New Guinea",childNum:21}},{geometry:{type:"Polygon",coordinates:["@@βছثНВȷ¡ѭºǩδοċÁĀɹıķɕ֥ГˣʗµÉX¯ºʼnX·uĽŢ÷ʷQÅRϟņ͋ǞҹNǯēыÐʱǡʧpdƘ˧ȎʗǕˇĤɩ̲҅ƀŹÁȹŨÚdžʋ«҇ƢĠDž̍œέ˒ǬŴřèɱ™࡛͸UŅñqñEJZĔ؞òy˸{zƱ¼]jzêŗǤŴȾÓƘÃz•Šgž`Ò¦ĈėİɕŘĿĄV°żĀÚâ–þDdDÊŽϒ˘ùsƸ̅ņဌ˸̾ɜ๜ʆμŻ˕¼ʹ̿٤øԖ࿮»ӂS†N¶ÐKêoŽex™œIêcĦ“ò‘ìµ€ǟ"],encodeOffsets:[[24049,55235]]},properties:{name:"Poland",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ū€ɸGŋw"],["@@тÁPś̍ɥ਍jÉ̶ĘŔࡼ¯"]],encodeOffsets:[[[-66995,18541]],[[-67716,18888]]]},properties:{name:"Puerto Rico",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ƈȝϛijЕЃ¡ܗ̯ŋۣԃߋ̉ơӗ͢ĻӴϯ˯˅ߕqϥуɝĆɅŕ̇ȲΉɕŸIJ˓ôǾŴџ¢̈́άФň͕ĴȮО£ȨӯȚŗťɵ͞ѸϤऌϐوېDzšȎȥࠀťŠȂȳ݆͊῭͒͠†ǚҨ˾ęLŭɾǫ"],encodeOffsets:[[133660,43557]]},properties:{name:"Dem. Rep. Korea",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@мġ˙ăǩˈĐ"],["@@ϼGQÕҙAģŌǔ«"],["@@è‘͝GÿĢͶÇ"],["@@ǛÖŨ’´ħ"],["@@ʻļɒpªū"],["@@ũYlĒľ÷"],["@@έƣٙĮͳõƸͰÉࡠǴmŋĀΏÏ‹ǬȖøȖ˨́˯ȃ›ĻĎĘҒҌٸŸ՘ÏߒōÆĢƪіǒĨ˙ؾlɎŮѺÜɧˤş׹ѭIJ֓ȇƧŘũáȉţĭΗiҎԗ̃ԉȦɵŰNУϭŽң"]],encodeOffsets:[[[-17603,33658]],[[-26264,38750]],[[-28822,39376]],[[-29328,39450]],[[-27725,39571]],[[-31884,40353]],[[-7583,38072]]]},properties:{name:"Portugal",childNum:7,cp:[-8.7440694,39.9251454]}},{geometry:{type:"Polygon",coordinates:["@@lÕ\\±„‘„«‚{p¥pljîʵĥڧYʻলŷ˞ƺ¬_˜ïĚñ²_ǖ@ŤwĄđNđňƃâޅjŸº¹`ė@Õx羅ä[üYĨhĊp̜ƊƼõÎÍňۏɑŽۅ‹ĉřdzIţaߝʭɋͥǝȓʑßq¹ŸË…µFåËåµÙCƋúdzHɭțนɾν‘‹IJpÂͬМ”˾ȨɈ͊Ӣɑ˴ଫӘףЀߕȢȳǜ׵ЌΓӎƃƤƙöíºB|sx̾ঘBцѦޘเ̈ޖVވѿj̅"],encodeOffsets:[[-59555,-20648]]},properties:{name:"Paraguay",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@đëƒì]~ɼɘ —D_ƫȝ"],["@@ÐȠɆŮÛÊ×lÏkkNOdŠÔ…Ⱥ°Ƭ°ĺņØĤkêi`•æ£ÊKjƃķّӏģ"]],encodeOffsets:[[[35173,32044]],[[35718,32121]]]},properties:{name:"Palestine",childNum:2}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŨŸIĿƅŊȥE³ƞɌ–¶Ɨ"],["@@°£Ə¢ĠB"],["@@ǒŸʳóĢŔ"],["@@ËÈրIć"],["@@ŧemŎƴG]ğ"]],encodeOffsets:[[[-152905,-18114]],[[-146883,-17018]],[[-142360,-9927]],[[-143437,-9652]],[[-143434,-9124]]]},properties:{name:"Fr. Polynesia",childNum:5}},{geometry:{type:"Polygon",coordinates:["@@÷iíkÏ@³RlÓì©Ģ€¼XŽýіȾӨɒƠʀȿ·ͅľЅƱ͓Ƈ½"],encodeOffsets:[[52499,25198]]},properties:{name:"Qatar",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ĘēŒ¯˲©MÎĦiˢĨƲbƐ£ŚġůΕёï Ǿǡ³ʱধ̧~˳Ǹϫ‚˵ŮܷƇ׿˱ᓝƐ§ĨƈŊ˗ƈaVNjƾºĘÆlæM„^YŠáœŧ²ū}ųīěgƷŀɯšħäƍŠCˆvP¶HàNZjƧøĞƲ…l՗ɴgʀ]R[SeUeE³œÑøȇĘįŒrȒ„ĘƒŬĨ̤Š݆ਈ݄ψƮºìæÂEǤāȄLߚÃʹǧТƾȌlȂˆɈtÖҔ¤zúŘvƪ~̦ėՐۃϪ̥Ƙ˱Ƒ࢕Śů"],encodeOffsets:[[28890,46542]]},properties:{name:"Romania",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ýÎɚbƛï"],["@@̢µջ˯˝ɑ}ƱāǦظՄ"],["@@ֻ˝ɋ[ٓӕ̊Ϟ՜̶ƂŎķɤjШȒtŭȧ›"],["@@ȭ£ѠήӺƾܫӇ"],["@@ɻËӆ˂ʉȵ"],["@@ǗcǶ̒]˭"],["@@ѱɕݬqǢϲĒΖ̸ƧЁ"],["@@ȥØǬŊĤeéƻ"],["@@ӂறƙ݉ŦϛѢଋݮൣ֑ԠˇÀՃħѿृa˫ֈߋɦ•Ă͡ů˧űѾףŢсڃȷ҄Ǫׄ×ϔǾΨ˅ئɴیÛࢾŠӼПќ½ҌǐѪҞˌƀ͒¡ưϖ̷͔ΪĨ"],["@@Ļƣ˹~϶Ŧ"],["@@ɠ·С̵ɑǮȕé̂΀̨ĕ"],["@@۲ǙдIɐƿşʷGÏðŕԇFࡹ‚ಉÊ̶ϲҞÖ͊ʖ¶O̥ʟʹánj‚ ˢ"],["@@IũݥԎѲdyū͸˛"],["@@ĵˆǒĚÛš"],["@@ƏÿʒьھǦ˜˯ࠗʁ"],["@@‹ǣȿƤʌ€"],["@@̳ÀűƾӘ±±Nj"],["@@ަƻƲǩԄŔƅɔÖӝȒ܆ɫ¿Ïሴҝ{ˑ̺äŸóÙ؍ΠïĠNjʺňhȱʔǤϩǔŪʼϵŮܶ°ѮÛƓĩÄĩÈź֢“ХĦ৲ŏઊӵāāʬž¶ĿϺu­ŧ׫ŏŁȳىǂˆʣڧ_݃ƼҨȍÛƯ̑w͂—ÔƁܹșʆuċƋоǷ˱AƏĨµǕ˅©ɀͷƥ۹̒ۗîϫǬȩϮ߳ŤεġޣOѵҌNJeȂ͚˹Ƿɳǂƹdz̗lęʃπ͑կϙ@ȶ@ȶ@ȴ@ȶ@ȶ@ȴ@ȶ@ȴ@ȶ@ȶ@ȴ@ȶ@ȶ@ȴ@ȶBȶǜ™"],["@@՛˛׹įЅÀij϶ѴȎ͊b࢒˙"],["@@͓ъ΢Ȟا"],["@@ܑìНȤвĬࡢőƣʩ"],["@@UǫګIœŪҥvεΦѺŤ୸ѳ"],["@@ʐűƛȹٯˈռä"],["@@ƫɼ૆δ@қख़Ɠ"],["@@ȻëխĚن¸Ťå"],["@@ذģԢʣཡȹӫÖ@Ҝ़"],["@@ٗt݆˄Ԯů؛LJ"],["@@ܱňҀȲ˲̹"],["@@ЕĐdŒٚŸʧǁ"],["@@Ͽ™ŷâԸ‡"],["@@ठěʵͧ׿ɍėԩং۟ঞͅЕŝٕŨĪƕڿŀ࣯W৽njʌǶТŽطǸDDŽఉ¯ΩƢÒ΢֜¸ΆǨɊ˨˱ļڒŀıɢಬǢѠá"],["@@Ցµ›˒ߎž־˷ߝá"],["@@঄˝Ğ˳༕ä޹Š݃ąતіऎ~"],["@@ؙh˨¼Ͳã"],["@@ԍßǹˆ܂Lyȱ"],["@@ԕʱ੻ɐ͂VǤƼબů"],["@@ͲDĿŷ֙Àͨô"],["@@ǍƟ˕”¶ƎϠÂNă"],["@@൘˜ƄƩሜãƩDZࢣƟધxᅭͰ͐͜ɐǯ"],["@@йiȺϦЂȩȁǑ"],["@@٤Ǖ֜юসɯࡢ@ඤ˩૷У܋ÔχȄǴ͂ՑkğʣޮΡջűСƞกŧӱİӧʵࡍŠ१Ѻ˼niͶπTūǒծƆײèै̱"],["@@țſࠩþÎØॸU"],["@@®ƝҿƪђK"],["@@فWࡐŒɍĹ"],["@@㎅ޡ࣡ʵȌđ۝ʛιêǗǧыZêɫ܍dzUȵϋÎȖƯӟʕ҅Í஡ƀקđҋΒ݊njזϮڞÞүŌޔˤׁƖȎÎ҈ăɰɆٚSϜ˒ۖNJ୮Ȯ֎qɔǮ๨›రŢᧂՐ۬ÝϦȏ঩Ё"],["@@࡟O੒ƾȱƭ"],["@@̹ŽЊìďĹ"],["@@ƇȞđLjըƦǂАC׌ɯٮϸŞ;˾࣬ʟƬĎÔ̪ɀĢΨդʲࢰӮΎƽʶČȘ̹Ķۙɵ˗RνƃșțౝKȓʺÒ˔ɃɖBɒ̛€דкη]̣ȎסϗȞ’΂ɅŠ}̜͏ͤө੘׉ֲӗƊəÍৡΌᔹɗݡйuŻӴÇĀЃֵеݹ৏ƶŃïDZڷȇӟ˥৅ʼōĆǙ¶ő€éDǩ·ŋŸÝsʼnLƅTÃ`÷ŒɫDŽɕĄϏ”؉ɣŅÅŃÉŻÝÓĕ‹Ûş¡ĝ›ĝaǟtΑĝճçý\\ō©̓řıoɿÞęGŝ֝ČÙvǻŽԻWùfĭ°χɐ£ʚʇˆʅHĩF÷˜đ®ċĢȕĮŗ`ǥUų[ۭƜયˏϏ_ŗvÙnį\\࡟͔zŐďĤiȄ—¶SĞdœG¬™ŏ|ƃȿžǃ]܁ɖÉZȩHǏNħfǝĮۛȸɅˇҋˉɷнńʼnÞǭ¤“ȇÚWºo{șȷʍէɭŵUȇŸ֝dȽĈҗñΉpƳĞijJýI—_»G¥ÄǭŒēˬ९¢ƋƤëXÝU“˵w¯J¡ŒŷàѼ¹[ēű͙M̛Ɵ­×D‘MÇUDZ‹ƷûßcŸ¹‹ԍŇ·DžTƻ×cĕá£ŷ`“mÁÏ}ďyVqp‚‰WáǕŒυ…µÏgĿñ‰“ƒ«mķC©Fȷ—ċÿRבВ¤ǶгɷߕĮȱϐ֕ƬͅҊӳȂԃďɣƑࡷXßǼˇX²ȈͣĒʋġqȥοƝᅁᐴିوÁňȞMƶʠ୳̑ǻǏ٥ȹċƅбŎϝƟčɔ΀ˮЛíԛƪƧljɕ͒ƳĵމNþ͘ϕצұţৣȐ٩ȓ§Ʒᖭ̓͛ʃՃšᒁοוÔɃͭҲĉʱÝ}ƃϰ¹΢ȇࢇƒɯʟȄ˵߷͹κʁࣺ˛ƓϵϓƑѣa̭ƞȷɥʏõÏņӍØѱ̴ѧxͭǝαƨѧڱν࢙ήñЍΑъکψ٣@̏ȒܿȟƱƠ̵èҟσػǥƥșוȩŒֹΣÏՉѪɵiґ։ñˣȖǻˡ́•ͣͼƯȒЯDŽÂּăږ޷͵caŵ׆ɥҡɁžǃȱŽܓ̍ƛĄÈųƭʿե׵ԌͳžҡƺˢƷ܋ठ৅ځէЇêӋѾˍàǽĊӗǺG|þȬkpţŒȁKƵŪõfҊÓviSáʼnáþ¡tř\\Ʃ›ȏñĉkŸyōJÅnknV”žœYšƅ¾ÅŠϿŨõ¼Q–șàয¦ĵ´đ¶ɱ”ššş¾Ź®Ӂh»ËųWॿۆ҉Ōˣɼ̗GʓɸӝƮ˂ŜȃèŪ²̈ŽθʅǀːξæžÆĥĔƈʺIӡˈŭȖؠx½ŲܖʘćƎƟFăą́sǮĤҡƛżѦҀȶ݈‚Ʈ͎ĹɰDž¤ŮǼǰ\\ˉƾ΢Ȳy˚ʥIԗʆɍևȒDZōԽЮګǝхǘѳ‘ɻ֦Ȼƈ܋ªýΤɶĐ֍ӄથʿɍ̟¨IrÉӖ¡nqxPȄiȐ}ûÂ÷Òµ´‹xĚĺpž|Vζ÷ʖ]˞ƮĞ–Èb¼Pɇˈȿņǩ`ƟIÇfÒŀXÆW~…tƍ°ȋîĕĄĩƊġäĴE^}př ƻôOn\\°t®ŰŖ@Œg¦åðÁ²GzVpäÈLƢɿĆ͡ƮLJQėR±Yµ‹ãsħeůÉ͔¹ºlżࣷİŗò®İS²mÒ·ļOˆǯǐUê|—\\ƕkLǰP¬SžpɏĨwà“`ıH¢ŜŤŐȤÒɵ̎Ëӈ׼ӲśĠžʢɶõƸƀΰiǘƞࠎ٦ìϛȦշEΧƸʼnʪ׹şཤࡔ఺޺̆ͼ̑˖ৃѶњʊTƮЇȲ€˔ϿǠȈƪǿĔĞ͂͘Đࢋঔޠٶեͦօņǵʤʪ̝̐ÂҪIJΠɶטŔþǠֲćRȶ֬ñϚĨYŦ࡮șýĵإÔǚǏԺQiđЎ¼ˁ̟ҘȮᆤı༼пט˯ड़ʅɊ[]þӒˍӰıͤчƛ͏࣯ѵௗșᥟ˞ׁǸ˻»Ď઩njȁȰࢇÚ๖׿ʛħلĕӢɯîƷ̵̹Ոߥ٢ĕӀ˩ࣞǃѶŖĀŤĝȔ٧öҹ˼÷ǂ̈Ȟᝂԃʦǎ͘PիӒfȼආѴؠͬ࡮ĕΜƑģŃʪfɖő˚ްիˈΠ࠾ܷΜ׸ĿༀËڤՋঋûՃ˿ֈȑ˖ʛԜù঎ƨȀԞ߬ĆáǸͶsᛶ֘͸ƽ˚Ŏͅľ௪͚ׄE׍íŒЇ֝Ɨ৺x͖ýҴ̮Հæ࣪āࢠ˰ݒĮ˂ɣɫʛՄûƜ̖ӾnώɐٙԖبɌ᪂ʿפʋᄚ̽଴ҹ٦՘ԇbҋњ͋ĖҹĠƗŝ͚঺šĊυeÁɚൊԐ૾તłą๚zાȇȧ֭ץү۲гŅဵ࡞УϝʧÓΏਁٓЙƤɹۃƏ˽êʸŦ΁¹ͿƆևaǡ‘Ʋǭ४ȣࡦdҸħ;ðĄȔୀκʂΚ׎̐ͅռǂ˦౺Ȍ̐DټёÃׅԈǫॴh૫ƌÜςˤÎ˿զ൳˨ӣHԗůࠓ¬ɑֈ٠ٴ੍ܮӮʹૐʦǣ֖̮”ӶҳϽ˳¸ԯആǵֈ’ؚȥԸHŢÌзQ̿ɮ๻ʊͳ̞۶ĺހǑϤĮǻŞѯikĶوƼ৔F૸ʓݲ̻आ¢Ўăމ΃ƅ֋¶ǝծҸƊ̧̽̇ͰĽMƸ֌ɨӭҶ͒Ӥ˫džұ¨ҩ˸੡Ȉ^ϰΕʂƆ˴┰Ÿ්Ɣऍϗݔ˥ا̌঴ƄϚǒ࠿ζӍÔͨŒфĽ˨Ž௃ʀΊƞϚő͞ĆΨȠѹ°ÊĐ֒‘ᑜϲ὞˒হE̴DŽዎŽк±ΟǃܖĨWĩᆒ̐ञǵȕȗʼŎsǦࡧ̂ႌšيï֛IJ¾θശѤ୼Ȇႜ˷༙ʍᘪÉШĝࡡΏસTϮǺ᧮§מǧŵċ֪FŠˣ԰ǖʔ̟ʘ|ʏ̑फɘцɑʌ’ОƉڧλᣭ׋}ŷഡЍޭÕӻʑЫm࢛ѿӄº٨ʬ੮†೤˄Ѳ_࡚ɒউZҰɰڜßÚĪΚq˓»ƢşظijհŒ”Ǽǒ£͒ɟɓǁˬħ̧џҌǑϗƠ֞Ғ́ƆໞǔᲄƑΏÕuǽૐɣᑔĉаvřĸҞÕϲȨōЊࢨîࢴʭրĎʢǵЖǴ׬Åଢ̳уǽΘmȞƕۧƛܨćňɫЍñ्̖ŽŁ࣐ҫʤƊɀƩԯÛޚҙٴȑȂÐɞǻ࡜мԲֶ࢈Я࡜ŸܚȈҀT༌УăĀЂĊͩ¸ˆDzҞ„ΰƹٲ ɕ̩ͦÈۢȪࡗw‡ƔϮƔఔúɫʰ੆ƛ⇈ɻcû௫‚ԙĻŀÇᒌĒ׽̍ĮNJЅöCʇ׉]ŀȗݒĦৄѨሪƍѠɥ߿čãĕൎƝхʙܶżԬÿєɛˣ‘غů↨ɒଐ­ૄȽվЗɷσ঴ɝŀяɲĭϡϋ׮̮{ЌՈȜࢊĒᴴǷࢊȔϒϥࡐljʤʙެ’ϪȂ΍ҎϘ˜КᚔʅƊļᐜ©ᬐՕؐɳ@ᾕకϵ٫Īܱ̪ҏ…ג¡ƼřŻÙࡏƤ౗ɵ౎ȄʜǗǭĵઊƬLˋɈŝ̜ïƺŪŸē̎ӿʓ½ʬǯ¤ŪԄͥŇśʾˑϙ̭ໟɺ ƶ˅IŖǹᕩإݟěЯʹɱÀ¨ƁїŧEėງՃɍЁ̱ĐًѼࣷmއƕߡҧŗļǺь੣͗ŋɉέǾΉƍlð͡š͇ȷûЕ्ܕƱ̷β̟ɚȚӔƃϑεXЛŌŷˬ‡âϣʍǁǧlDZƔΈʒ̯ťȕϋƝ̡ӽ͎سЙȣ܏tו̑șͽƴջρĞ۹ˡɯľŘƅĭЫ͛ӕ੍ڭċ‹ȏΊſैɇ̚ЫှÅОάଆܮԄņƨŭ˂ԸhǺȄԞU޼є՘Ԟྀࡲ˄˄ൢϚſĠϞˌǛİͺۦ͠ƬԢąǬÖ࠽ɐࣱŹˁևȪLJƟŇȕŒϳ—ൃރӽīǦ͚ӵÍѦ߀ٍƥ̧ǮळƧԍž͓Ľ଱࠱صʱ֫җťʯےáDŽɓםvϓşˇŲ˫UҗʍлĖțĵٕ‡ǣǨड़Šދ˴ܩÇƸ¾ࡳǶӝŝŞţ΁œ­ƅȄIȥġЁƀرūࠏǂЧʉеȲጥ™ԣʼnຑ޽˿Щ຅܉ࠃۛᎯ৑IǯԀůߒŒßۇξd]̢ѴĐ˝ƷжŹӥͳה¶Ӟ̘”şˍʛǜZȾ˪—ή֎ė͚ìֱּ࠘ʭljɷ˻ÔΔȹĻͻ̒ɏıɏηʧ΋ۍĔ׽ƋƝ°˅࣓̅೫௻Ƚћշ؋ಗૣɣīر܇षӟ܍ɁϙƮͽPJβωǿÔǨٽ֧ϗ~ŀőŭȃ"],["@@ǵÕࣇè੾Q"],["@@ЅΙ୚˂նɥ׎½ƖˍӑƇ࿏ŵ೽Hෟǹჸା֊ÿźƪЖƭ"],["@@ૺű߃O͵Ƃ"],["@@ળŴŭǐᓘŁवȁ"],["@@ોŒ܂ĨЊų"],["@@٧|ՀŒŨƍ"],["@@mͯߎʖ௸ɳ͉ϟ՝}ݚ˧ౣƣᝋʼѕک̌७ĀྔԐʜÇ፤ņ"],["@@зì˞ÒƚŽ"],["@@ûɻথ`ǴɈࢮT"],["@@ফzіDŽ࠼œ˥é"],["@@Խ†ɏ˰ᆲųܛqχǏ"],["@@ԓFÆňҎō"],["@@ࡈ¡ȨơࠓŎೃˋƟļࣃ”ᒌȲ"],["@@ûǽࡱǕٯÜՅÁµ͖ᓚd"],["@@நȩᝣ˫ƖLJਭåƀƂݷ±̅İ੄ȔৈYƂʲࢄĘ"],["@@ޭ‰ĴŰࣀUɅď"],["@@ࢿ¤ୈˎŹ"],["@@ๆįञȱීŃ৷ĢԻŐ֤ȴ"],["@@ʶǭէÇࣙɄ۶ĐӖÝ"],["@@ٿźᇮ̀ՔɟჁș"],["@@˿Ý૓Ěඔ{"],["@@૾ʿ܁ȑɰəᵥɛᅋ̌ศζ֛UIJüᏘͰՠTؐǣ"],["@@وŅף§õǕႭfȿļጀȢ"],["@@ಛÐഔP·ß"],["@@ƉĦॆvĂāࢽ™"]],encodeOffsets:[[[150236,44794]],[[149717,45566]],[[152166,46406]],[[153281,46738]],[[155651,48023]],[[158526,50496]],[[159664,51510]],[[160159,51874]],[[146188,55700]],[[140471,56423]],[[141252,56415]],[[21746,56591]],[[170650,56156]],[[154205,60436]],[[167563,60010]],[[36676,66747]],[[71702,68099]],[[-184113,70595]],[[51472,70847]],[[165343,70555]],[[173262,71251]],[[61902,71614]],[[54174,73078]],[[183155,72527]],[[141271,73224]],[[-183169,73295]],[[79496,74027]],[[81410,74468]],[[76453,74623]],[[123148,74844]],[[56648,75068]],[[72371,74850]],[[145598,75670]],[[85555,75850]],[[144395,75776]],[[116109,76187]],[[88733,76781]],[[84145,77230]],[[150319,77180]],[[139212,77220]],[[143410,77649]],[[98850,78109]],[[115178,78460]],[[152730,78500]],[[69392,78068]],[[98597,78876]],[[91663,79042]],[[133824,43318]],[[110281,80007]],[[105354,81157]],[[78079,81563]],[[94908,81598]],[[52644,81863]],[[61122,81875]],[[100019,82083]],[[51254,81997]],[[58449,82280]],[[54806,82110]],[[59348,82047]],[[55722,82405]],[[48581,82795]],[[63660,82775]],[[51485,82870]],[[81948,82789]],[[62609,82894]],[[56033,83063]],[[60030,82987]],[[64895,82637]],[[93765,83089]],[[98844,83022]],[[59198,83504]],[[65179,83568]],[[59695,83677]]]},properties:{name:"Russia",childNum:73}},{geometry:{type:"Polygon",coordinates:["@@ƒaM¡ŽÝľƅà{ª½¨ĕÂӣkĹuÕǃ¡PµSÁo‘EŧòʓēƿÞ¿̓ƛßʵ]ʍǴóĽĵîcȢɊǤÆЌ͊˨Ⱦ¬Ėœΰͪ¬X¶E’A"],encodeOffsets:[[31243,-1092]]},properties:{name:"Rwanda",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ÔôĈț̙ǪºȊńʋ"],["@@ݶęȨϧ٬T̮իWƟφș¿¯Ȗɍضѥš`Ǧ̵·ǩĽVѶࡱĞϏÿâãľǍŽk´QÐ@îløjЗÖNďȗɒ­pǩߴ३ᒤʽèèϤם֏။ᠽ࠽ុΑܵΥӽשř˱ʣƑƕNȻʾ৉Œ͙ŀਙđлLjȑƁu֛̫ˉыࣂҙϚѧژЃ֭ࣞі̑ľϝӬƵ˰®Ǭƅ̦ØװԇऴқЊ́Ě̥ѺîŠį˦࿿ᘲϩĄćŘ઎लŷǶżnjŞĮƠĤƒª†׶ňlbÀŒäƘbdhdnjĂİ´сѐ̽̈ūŘɎÄɺÎԲžɜÈӲنZŰİȊƒ˰£˖¡˼±ĠഄڿෘਙߊսൠʼnƦ‚"]],encodeOffsets:[[[42996,17117]],[[47649,29795]]]},properties:{name:"Saudi Arabia",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@²·˦БAÍęÄSĹªܣɺધड़ۃƿƳs›WwW…u…µmi[ЃŃȡő‹‡µƯ•ŸƋIá_ĝh©C[gŻFÇùƧt˟̇޹ŝȕlljpǟ¬ЗͯఽϣőҷڳƱߝƇıǗŒȑȅƒϽȝؕǥœü̘³ˎٵӄ³ܢłԤБL^ǵ֑EɢʝèԷ৏ઑЁËكҠͯdzōʝбƥŕɥڛFƙɰڳXΑʼnةּ½ȦիÝŧ‰ɿѥɇݙ͓ȅԟŴÍʤżȎpМډआÀΨ˥ȠUΈĝàĵӾΣdđĦ͸ҐĹЂζ̦Ɓ͜ʐƠɘτD̸ƞƜܮfRṴ@о࠾NBဲᢴ@ᢲAƘPŞǚð¯©ŷ⯀B"],encodeOffsets:[[37757,22525]]},properties:{name:"Sudan",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@Iޓijď֡Mʁҋݼ͟ƊʃլӅɰګʆ̫ƷƱǥǝȧȟɓɉǟǛǛǗȟȡơơá³Яŀ֋ƣǗƽ˳ʂɁĿͩĞˁʛåŒƝ@ßǰˁŬѣԖǩtȳȁлĨʥƳȡvͻʜ͓϶ɑԪՉ̄ǥ͘®ưࣩږćŊhɂ̇ˢҽżŧ͔̾ȆɈݚʀѦŨŠլÞ¾ȥتֻΒŊڴWƚɯڜEŖɦвƦŎʞͰǴلҟЂÌ৐઒çԸɡʞ֒F]ǶВKŁԣ´ܡٶӃ´ˍû̗Ǧ›"],encodeOffsets:[[34896,9689]]},properties:{name:"S. Sudan",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@¬̍ǬɃ¸˥ÿȯȈˉǒ®ȶΫBҋࡓÃҁNJʼn—kŦի”˯BʅB܅HƵùǑĉɝ«ʯhć]ƥÙĕgŕb¯S£ƞˊìŽĘũʼngДĪøۄFjƘѸÒŖƈݼˏΜƠųŖέ‘םʸˍíçşࢫBǣˊŲŖƣ‰̓ՖƫöĉÝùĔ͜Ɩʮ̺ɮφˆĔ„ânưĜǞ˞ЄŸٸNJ׆ąδεĦr̆ħʰХ̶υ˜ȯņã"],encodeOffsets:[[-12575,15165]]},properties:{name:"Senegal",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ˍKƘĸŶī"],encodeOffsets:[[106465,1364]]},properties:{name:"Singapore",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@Ͳ•´ŻːVѺїʋēڧѸصƠZŀͯ†ސµ"],encodeOffsets:[[-37993,-55363]]},properties:{name:"S. Geo. and S. Sandw. Is.",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ùMÚĊ`û"],encodeOffsets:[[-5828,-16381]]},properties:{name:"Saint Helena",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@őaϧːӺʭ"],["@@ȕÿĥÈȜļĠă"],["@@͞Çɦ̳ӱĘȽŶ§ǢljˆVĺΈƵ"],["@@NŧŧôˢƸɭ"],["@@ȂƇ͔X϶χƛÅ܅ƒDžʘ\\ƆŀŽ"],["@@ȪŧʫºÂî"],["@@ŷ¤þèĊ‹ÿ"],["@@ƛ«yƞǐ|Fŭ"],["@@ƩŰƖŨTʗ"],["@@ȼʡ«ƿǶƋǬձԃծµΤĽƖƆ¸"],["@@ŔɝßėșƔ}ƨɋÁíÐɰʢɮɵ"],["@@dzĀÆŬƌÕ]ƕ"],["@@ƩǺ¦ŒȼűķǙ"],["@@޻дУиɶ¹הΥΌʡŠǩ"],["@@ƋP¾ĮĎĽ"],["@@ā˷ĐկּӠɇƌɥʚƛ"]],encodeOffsets:[[[164431,-12081]],[[170121,-11015]],[[165597,-10636]],[[165425,-9856]],[[163585,-9495]],[[164013,-9211]],[[163010,-9342]],[[161903,-8892]],[[161167,-8922]],[[164608,-8513]],[[161550,-8439]],[[160944,-8302]],[[160449,-8113]],[[163717,-8739]],[[159580,-7267]],[[161267,-7506]]]},properties:{name:"Solomon Is.",childNum:16}},{geometry:{type:"MultiPolygon",coordinates:[["@@ΧŔ˲Èǝ[ū"],["@@ÚăIy½śFwh[ĤmĬ̷Ʃʋ‡Åt[†R¤UžG¾žĒĴ†^ÞUE{ţ›ĻǯįÝʽȗȃ͝ʱȩ˛ࠓЖL̰ǽ‹ŹĒė˜ljÎĽǺǀKLjǤʍ«qɢَȝƘǸjĴnjǠĢǔ˦ŊnjʊmȚİ՘HÌer«Œśʐ͵"]],encodeOffsets:[[[-12826,7615]],[[-11016,9611]]]},properties:{name:"Sierra Leone",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@Ȱ›Ԟ͡P]N¹^§†E’rŐÊŀœƈĝĊ`øIУbyÇʕű˹ىĐƤćક͂ʓƪ Ɩт˴uŰǰt"],encodeOffsets:[[-91507,14762]]},properties:{name:"El Salvador",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@įehɼĈɕ"],encodeOffsets:[[-57617,47963]]},properties:{name:"St. Pierre and Miquelon",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŝ¯©ƊȀƬÀƉ÷Ļ"],["@@ýˆìĄRŋ"]],encodeOffsets:[[[6820,124]],[[7602,1606]]]},properties:{name:"São Tomé and Principe",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@tƱ­ăĿƣ_“„ŧcijO³»ĕũɃőıƒA‰MWQ›B‰‚qèŻR¥ •¨U¤uGś—Q×Pć¡·U“¡̃‡ȏΉmuĕsy•o••Q‘Äm®á¶¿ ±K¿O÷ù›ϳČȅĂбۈėѲ˿b΁תǪӈÑŸǦƜ͌|ĸƨğŞľǴȌώؠě˴ƻWnjɘþۄFټƱuʱͱ֓ňځˈΥ"],encodeOffsets:[[-55331,3717]]},properties:{name:"Suriname",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@]“œƃÿƿŷįWƍ̩É˅Ƕ߱sſș͏ů˙Ü۫ȇÉdz߱cԫȤɿ͌òDzƶȰԼ ˞ƪÚNJ֠Ɉˈģʘǖ˨ȍcƗʨoʲǢьÏǰĔҺM͌ǝϠŅÆQ"],encodeOffsets:[[23080,50251]]},properties:{name:"Slovakia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@õręVǷŷйǭaJàĿoĹ̿ŇÞÕÏãPˆZ‡ćuŋTſ¤ƉkťĀ·âmLiy“ãíµqЭ«ʧöɢÜYòƗĤÁǂùKkZOnN~¾¦ÌšfrEhǯˆkĘƎĈ؄–\\j¶܌ĵ̀ǦࣄÒŖƼdžKȜ̛"],encodeOffsets:[[16913,47616]]},properties:{name:"Slovenia",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ćŸe˚Ԧٶзࢯ"],["@@əŇĀʷٗБŞƎűЊͶɰ̨îƨã"],["@@ϵ¤Įǒeƥ‘"],["@@ࢭÍכłūɝׁǃ˜ūǕ´Ǝljλˇٍ͎̃ԃᅿ׃ʙƳŴčʗęɛĈŌʋǟćΣLȈɳɑ̭úƵɥ’ÇůĸܿΆƑʜ®ݮӁİɥࡋͯԄˆɱʇવϣٛc׬ťɫ·@޷ʫړѭӭ࢛ŒwŇ̑±ƽŧłʯƗŋઋ^ô˲хҖˤuŧƪǜXtƒϱʐࠅ৲eȆƵzďԶ¤øNJ•êŃƠbž̨įʬڰўḔʙҪΌ¶Ƥʖ؋̴Ůӄʭࡌƨʰ԰ͺΊÚَ»ƲƆÁʔΫİۤ؂Â۠߆ƪ»Ƹ࠘ӆɵ̸րЀҔǬӼś͘ӸඖǗ͆вșƠь`ୀџܚŹڈ΍ƹгɼ‹ýʙ̈ˋʍҷϤϓ"]],encodeOffsets:[[[16926,57642]],[[19535,59224]],[[19617,59313]],[[24736,67385]]]},properties:{name:"Sweden",childNum:4}},{geometry:{type:"Polygon",coordinates:["@@Ħ»eɛÄȧNˍóz}MwţkdzZŏǹGɯ^Ǐ´ǯłĿǔ¯ļÛNYlR̎ʈζĴŚņô Z„GьȇvX"],encodeOffsets:[[32715,-26580]]},properties:{name:"Swaziland",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@DýƅƪÔ¦îő"],encodeOffsets:[[56874,-4805]]},properties:{name:"Seychelles",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ӏї̹éĵŋ¶رƅܷǩ˷ᇳࢳ࿥ࢱϑÐӫ̈łǸ›МƔź£Ɩ͈òñðʴʞãǰƥʰƄ΃yÕڔśŶÚɸ®ÊØMƈßvDnjƜzƘɖÀJ|ēǎR¤¨ǐ€Ü~rIJSƒ…˜±æ¥̶SôˆǒÆƾ¨ʈĜӘǫŠDǜ]ȾBŨlƺŠˤòׄɮ঴¸Ƣ¤ĜêˆRœ_jIœŸžķ"],encodeOffsets:[[43376,38e3]]},properties:{name:"Syria",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ǂ·LJ…Fþ"],encodeOffsets:[[-74068,22376]]},properties:{name:"Turks and Caicos Is.",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@QṳܭeƝƛC̷ɗσʏƟƂ͛ε̥ĺЁͷҏĒĥΤcĶӽĞßV·˦ȟ¿Χ̭Þ؇̓ó̓އݑαɹ୕ǁÏđȈƱқԡޑ½ܩεȩ˄ƕƵΝƧБbÎɜη٨ڃլ̗Шɢʎஊx͇̌ťʖđϸªؚȟւ͕Ѩǻ²ƱBōư˛ϒčΰµȸޜଶच঄ɖᠶȔΐ͘hȆΥӌǟఊࡊϖ←ႱỨལ"],encodeOffsets:[[24556,19965]]},properties:{name:"Chad",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@řԛӈ͝²ՓǸʽrႫÿIȺוŽßλŃϙ̨ǯͰĞцœNJƾڸˁͼĮüŒҢʗÄĠŠß”Įլϻ͎Ą̈ßĂҾƉ΄"],encodeOffsets:[[923,11258]]},properties:{name:"Togo",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ĥŁt͠ĨåuƷ"],["@@ĝƑmŜŌv"],["@@ĿOqƞŲƍ"],["@@O¹tWƬŠǞǩĹΟĬǟזIT½oƅö̍ȩ҇F‡òĵNťȡҹ •Ų½ÀfȸȂŢĀRRļÌôŨš€´eԈòôȔ MǢƁĚ½ĀgÄōš_hL̸Ǥ’Ġ¶ì¨ŒÂhbv†F†Œˆà^ĸIމƎÅĚk¨pĊđŮȑńơĘįʾȥÜƉ³ȉ_ljNȣÎƳȒʱĐÉƴ±Ú¥MƃȊʼnf—CÏoćĿț@ҘïZğoõsɅk»­·ã¯ĉ£»k[S—±«­ʛǜೡăʑǏ̧ҩǭsƎݝɌȳe˱ǔ͏˷и­ÿףҀ޿\\Äٺ̟Ŗ̯éȵȭČǕŁ̗rѧە།öࢯӦpżחŞƉ†äĮȫɠ࢓ę®·ɖąTwȊăƧɚΉԂ˝ЖJԔԻȑΕǏŸĹňωɩōŒÒІƯFijǸ΅øëŐţȭΡκrȖƕĨšŘȧbăȸƻČuƜəƠíǒĽôƃƓĭ¢ÁҖϰ஠°ЄζώΦ֨ǭ٤ɿМ\\ּӉզ̱ԮUȒ̮ƐˆֶȎŌÐƞ«Æƥñȅժ؛ے×вɑȒ̺ÐÒܺǖʐ̚»ҜìƄ˜Ί¨wǴɘ‹ƜĊÄQ¤‰Ĵ¿"]],encodeOffsets:[[[100771,8092]],[[102473,9817]],[[104886,12277]],[[102526,20805]]]},properties:{name:"Thailand",childNum:4}},{geometry:{type:"MultiPolygon",coordinates:[["@@ĕÃÏÔMh^@Î_ĈW"],["@@̟ɝՏȔлƳF}ånj·ly§…ù¬ʩৢÀʢlj֞Ǭ„k\\yW‹CȔ± ũɜؖ“À§ê«ΈƮЀqłZЎ¨~êdƊWJ©{ƗǖɕğĩĘȹȌÉɄĶ҆ǗèܟȌǹȑŹ_T›šċÒьʻr÷E±—‰—ΗćăPuløÌbž[˜ÁX©`ĽtćQƟ­˅šȧȧ࠯˧œŰćʂŲڂ}pÃAćsÏI“b®ɄÝŘѧĬˋ̅ǟŵ]²ķGč¿ç͏œnƏšǏ_ő“ÑÇkó~ĝ]黵¥ƒQí¨ȁƔ£RuK}Ua[]•Y·T­Sʁķó£]©oo£RŧÓġnĻüÙАÔ`ȰҊ،əɘœϢοʟŘʑîÌȾʘƀشíƨʪȖÎÁŤƖ’˻Þը~Ë̴Ŵǚ̚ġׂ͆̌ʿ͉˳ʀƷʲŽ"]],encodeOffsets:[[[72361,40812]],[[72662,41205]]]},properties:{name:"Tajikistan",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@¥GקȌǭˉɃIǵQř™ŕ½ƒÕƯщ‹Ń¯ñ˝LJˑŗ؛ƓƗĥțÝ‰Ĺ¹ƛā͉íǿǬϿ¬ɵǔçSSȼċĠºǶýϞٹKɹ˚ԝʒŹɐСƢүcށʶƇȲم„ƙƙݟ{ЙɯǙʵڇѝചƏɔ̱ŎƯÛầ̰½ŋĸ^Ȯнà¢ǵșɾÏ̂Ǯ՞ǜǵЄKɈƛѐšµŢ̬ŽfǖԝϖʓԊ՝oǍıŽɝˆѕ̙ӤӀ̰ࣄǀ؞̵Ӥ֙Ҙt࢔·ĎòŻю˜ɢѰÈǸʢϐǁ˓ˢ˚†ĦĮٞϣՌĥ—ȧɒƛĿ™\\̟̬ƭڎɈò΀ƵӤय઀ۅҞƷબا̞LՔɏãǛ]ƽAşXġ"],encodeOffsets:[[68119,38245]]},properties:{name:"Turkmenistan",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@΄ŶƋȧȷò"],["@@ěʤŞp¤ŮDZU]ĢɌʜǠÔਨĮ̆Ŧˤĝ͋ʓ౏һ˷ȣ"],["@@ÇƟӌŜŔ"]],encodeOffsets:[[[127014,-9565]],[[128070,-9740]],[[128662,-8335]]]},properties:{name:"Timor-Leste",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ê’ßőǥƀǜ¿"],["@@īAĎÚ^×"]],encodeOffsets:[[[-179365,-21677]],[[-178128,-19086]]]},properties:{name:"Tonga",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ݥÅ΀ǘlˮơĬ؞ĺĭƝl҇"],encodeOffsets:[[-62476,10378]]},properties:{name:"Trinidad and Tobago",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ȡbpŴɮÅ»ď"],["@@ŻÑŎŜnÉ"],["@@ƇȅĐ֯ſǟŅŽ‹́ƃʛ२ÁȼĭϜׯЄȃјȡİ˽Ҟiؚ̦պ€ȶˆĘèĴÛϜ€״šŶͦ˄qĔतͺŴOƣœĴ˒£ĆΣĴ¥բ˺ÔǕձחĪʍΎɅĮͥίҿӓͯÍȉɌ˟΄TƥȢĦʤˉ¯¹ʪÉCu‡DžOËKɇäıD©}¹ŭËǃõƍëƭû¯¹ƍûŏNjǛ§"]],encodeOffsets:[[[11221,34532]],[[11549,35588]],[[10522,32446]]]},properties:{name:"Tunisia",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ʩ@ɀĐªď"],["@@N£ʂ͙ŷȥĆ̗ԼïД˱¤«ȕIJṶ̈̄̅›ȾғvϙŶ©ȧΩ͈ǓaɳȄŧ{ů…p½PÁFǡıÛ¡™‰J™ÎNŴa ‰„“hďXƩùƇHӫŠŽ—Ƌ …SėĥƯķągĸ› iL›^‡Qěéơ£঳·ɉõιƷˣñƹ‰ŧkȽAǛ^şCӗǬʇěƽ§ǑÅó‡ğHŝRķE㦙²Ƒ†ıT}qÛ§ǏQ£Ċȉɕ¿yƗũÅ¡ĕuCƇà×Nçͦ͆̊ŝɄտ˯׃ȰࡑՓݳūΕŰ̗֛̐ɠשÄǕԃٍħϹƘɇ֑͠ĆʇƫÆİՋҪĴȦǔࠕ©ŒŲȠŒϻдƀÊRɈ߉ʢŴ̪ȞʱЂĮȥ~ťȒɂƬǗؐżƟƪǼɎډçWĐäΞҴΈҠ²džŕɆRͬĭĎŤ€Ĭowĵ࢜jȁŦƞĆݠŊءƬ†ʄᄚħǠDz܊Έࣚʎ଴½ɌĚۇŗƦƋɖāв¢̖΁̺öʎƯ૆ɓ࢜ƶ۶ũیʦ˦ƌĄĀLjà}šQĒÂҒ±ĎĴpXbPÚNÔM„]†ÑîsŴĩüng}mXy¬Ȓ—"],["@@ҐnƸΑܠ˗čȅڅÔ֡ěȭʉУǃӍΟ¨ȪҐʾֽ_ÉĮʘȒAʆʚƎ—ǘɕĬîŶtŽÐ~¨Šdɨvꈘ‚ƶd¨b¨[ưŏ"]],encodeOffsets:[[[26594,41100]],[[44476,42144]],[[28135,42954]]]},properties:{name:"Turkey",childNum:3}},{geometry:{type:"MultiPolygon",coordinates:[["@@ĝ”ʮʌǏ˟"],["@@ÜdzûÇʣʀńϚǀϝ"],["@@īҍđÚvψLjl"],["@@Ḯ႗‰ϝപ৏ΕୃÎɗ֠׉ɏгCɧŢsZǕŗεŮнDŽȿìڵبϵЋ̙ƟûۡɉзȷӑĴǏʉƷāƙ‡ͥŦ֡ŝīŠ_¾ýÒƝêŁDŻʼnÉgũfȡRȉGmĬŸÎĭ¬ƓɖºʎćҪȽђ˙Ȥęƥ߿ɚƏîہɦqĦhËjŧMįĔěŶć ɱIĝ¼ÛÞ½öğʀ˃զÿɎčƔęĺŧĦƍĤõÚijȈ¥ä…ŢuŮVºĘDŽV¬YÔ©ŶǙѢeìDÂà˶A ˆKȔŰϠպ͈͠jƄ}ŎÑPė–õd¹rmfQ¨¤ň£¬dzüǀhv’FÂp¸T OȄvÖlĺWĊÞKͼ§Ė©¾ß|ĽƆÞN¢„bTHŸXΚÊZ^GlG౶@ಀ@"]],encodeOffsets:[[[40665,-8168]],[[40445,-6322]],[[40822,-5023]],[[34717,-1026]]]},properties:{name:"Tanzania",childNum:4}},{geometry:{type:"Polygon",coordinates:["@@‘BµF«WίͩĕŔȽ«ŠతǼʹRː઺਎ÛȎϓƼİ͢ûǎŸ̰Ëè˂ʜͪĝɂŀ˴ʁǘƾ֌ƤаĿâ´ƢƢȠȢƀ˥®gk³Ēãł“œ“H›—NjP¯”ǍϪַm¿æ̗ZǙAţƫЋˇǝÑƥȿəǽγ‘ধ౿@౷@iF]JÉY͙ÕeáNSG"],encodeOffsets:[[31243,-1092]]},properties:{name:"Uganda",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Ś£ӯǝĮцƛ"],["@@֝aؽ̡ȡ¤؛śڿѥɠƤ¥Ɗ͉ɁƢЩκ͓״Řͼ¹Ƴ˟ѭ¹ͯþ͓ʝԯåһ˫ϫƔĖҜ࢟ʲঀҘÏŲƏȑİ؍ûթǖƪŰϟľڲáǼŠ҃vʇӐĨҿ˹^€ĦƇůԙÛӝֻӹŧÞϱřĢƏ¤Ʊaˡħĥj]ol˱ªő°ėĔ¬„œ^DŽh^°mþÐÐʶ¾¸TîĢ–ĊÒrކ¤¿Ħ[ÖEÀ€†ǀ̒E^eHŁhEȠÞ͈ē”Tǔd²žǧĬVðPČq¸“žʱŖĭˠˏǔSЌםƶéEړˬˏę˟@­`ǧýk…Ʃ}ɻȥɇsȁ‡ȋkСƽͳǨߙÄȁKǥĂÁFəŝěƌƽrˡɰķCVƎŸİĀǀŔƄ^”ʸRšø³̰¶Êˤʘ֦Дɖ‚IJĸHðćNJČÂγπ§ǸþĮîGÖ[ðxLŰÖźĢèþத²ࠨŷƮaĸNÌQżŽͦqTāƆĪ֢}Êg¤ï–c”KIJĜàl¨Tˆx¢v”DȴȵۄĄʐǡƶæiªSē¼yĨþìŀôæú¶ŔĀȦHņ°ȒFDŽM̠§ˀɎદŽ֎ӃɵďþΣ܌©ȼƇɼ֥Ѵ’цǗڬǞԾЭDzŎֈȑɎ€ԘʅʦJz˙Ρȱˊƽǯ[ŭǻdž£ĺɯƭ͍݇ѿȵŻѥ"]],encodeOffsets:[[[32781,47313]],[[39132,48222]]]},properties:{name:"Ukraine",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@½ɤ”ĄĴĤ¾öJ̌´Õ˴mxfÈĸʎŒΦ˹Ά͝gŻ\\óŌTȸDzrNžs͒͹腲ˆϖǥ̵̰Ϫǝƈ̃А˫õëăęíéó·{‘g¿@ПƊñ£‰«Ï¿Ɨǩț—ŋ͏ʑ؝ə٫ƂӛĿޝϖօqӏӄŠؘʀʎŸŘƒdžĂàŴH֛ÂYÈjÊGÄyÀlªŀĔˆìŸdžjàŠȄrücƖÚà"],encodeOffsets:[[-59198,-31599]]},properties:{name:"Uruguay",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@ʥ¸ƕ֮ȔɞWɘՐɿͨЁٷљ"],["@@Ľ_ÝžƜO€ō"],["@@ǬhʎǍΙŷÑǒǽŮĦðĊđ"],["@@т»ŭĉα´ÞĒ"],["@@ƐűЋXƍɢʼĮƎȵ"],["@@ȣmƱŎǮƴȒGiʋ"],["@@ýMǨ¤ĩ•"],["@@Ǖƿ˖ͤĿǣ"],["@@ș֊`͂Ǻࢋ"],["@@b×ɡժɀӑ"],["@@dzĠŌ€èş"],["@@ǫU͊ČƝõ"],["@@ıkƂʏë"],["@@¨ÕůJĽŮȆá"],["@@ǩĄưZzĝ"],["@@˪©ɓ»ÕĦ"],["@@ũeź¶„Ьˏãǫ"],["@@įŵŦǼuÅ"],["@@ÏÃ֬Şઓ΁ۑÓŖǮʲņߖÔ̐Ɗȣƕ"],["@@ɉlLjĢÂō"],["@@ˍcǶĊĘå"],["@@ĕmĪƺSƋ"],["@@ȋĦƌĦĽ"],["@@ĭ‹pŌþÿ"],["@@DŽȝ̝ʪĨƆð÷ŻÅľÓ"],["@@úśüķ٦ŕŨåˤúĴXΠ»˰ŏðƃÈ@˾tԲȳ̀ŖǠN˜ÍૼœࣞʴՔȯҊdz҈DZࡪΓӨȫǎãǮ̙Ȍ›ˊHŪΗ̦‚ŬĹĻƫ֢ʣ̲ƝÈɛ̆ౙ©ą̗܋Ӄ̽ɱϞʧɂ@ϸǶϼǶЖŨپIJࣘ͐ɐƈÅԛŠ‘öę̢Ɯ¼Ƃ´ŀ”ɘNܦEٶ@ՒԪ̰ȎΘʮͼǖȠ|ĊJᥬFDŽʄϴgӌՔʐڬٞيNJ‹ĨǷלŔήɛJଗ̴ĽÈίȰGŚ˻ǡŷկĉǽljāIJʣJçȽɻæ¦Țϵӫʛ÷‰ðÇđ{ĨŽȅƁêǵõҭבăȳǺǝηʕʶđˀЅΦÎȩɞŎYŌį|ʅשţ™ưϽȋhɌĹÃijĪŏΓ୵ÿࢿ҅Ĭʮĉǎ˜˭˱͕ʖŇěԣ^Ǣؕ࠭Ƈ©¶ǐՃ̂Đʦ̊ǎ˝ŷƽDžǐҡʮ˅ĉƽŰƑݩੱ“ȸˆҲLJdO͠ljçǵƀBƐȺtǑŐŅ£ƢŦƉČǎŊčĠêļɸ¼ŅˆŌĎïØˋə­æ÷ƭųšŦţŋ½ƐבʃȲR×˞ϙѵʬmćģŸș‹ǞКȕʏYȻȐJڂϵãǽůNԱОҾзȴć–Ƿř|«ĥʭȚЊϟį»ȗȘԳĜӠſƺɵШ`Ϻࣿ΍۸ƹƢ̣˟ƔCŏ횚×˧čƥǶPɫրZ[ɻȖɨĂį]Ǒͱʗˇ˜óŖƏďʡĆѶɏɟɻʓƐĂʼnȘëʎ¤Ă­ßýܙȫĭņ„ǡ̷ȯƫ́sȖ¹ɏͣLλNj̑Еƈ¥ɧѻ̇ŅnOţΟƕɫXƈ÷ėœȇƈĞțΙ˱ ùNjȽìMǥƭþõŹÃ×ͭɢࡑ؎વ½ǵň̷ŹɶF̄ñƫJȞűƮǿזೕÛࠋ̝ԓՁûsƠǐơĔɁ϶̍ŶȱюŊǔǯœvΆȕĥǕǰɯτʸ̨ɧĎÄƽōÉčŘLj࢔ࢗ࢐̋ƬɟÕƁ޻ȑāò@ÚĊëİ˓ȸÔƒŵĵחȜ˦NőòߍŹǺüWŜơġǗǏ›xČƣŇ͑…Ǻ¼ȃ͸Ľ˝٧¤ΓÏɣƯҋǠǥùåřȦģπŦÖ±ųğƸēȘŤ ȏ̯ǙפΕŝƻãÄşčÇǴ׹̀ĘǛƅșƕdž̹ƏҏƂŞ|ćȸɟQ͇ʀȯŗ¨ęƩ‰ޏȆյ­]Ɋ£ʓܳʯȞƐɃAŠǞɿŸŔ˧͕Ϳ߯ЍȊŦοLJĪȀɁɉĭćäÅȏˉ§`é̄ĝ̝ůŤƕų˻ˡňÚƛǪ¥ÍɩĴЙʐѱȕ÷ปӚ̉Ԣ£ЮړټϩܖֻԂۡẴijɷ҉ɵǽ߉͚ͥʔЋࠀঙڰʡˊ๟XEϙᛟIẗসĢǨ፹Ƴ˵٘ԧΪˣlăɰՙĂϱʴܿ¬ƏĞ[ҘǕò—Ǻ͑ɂӿռÐѪӳ̚ĕˮ®Ɍ̀ˏ˃МÒ ڐ¤ܱöŅˋΉȔÇÇúǪڗװōܲѱԂʈࣶϽଔ݈͠Ȃཔ»դ٨ÅȵİԛRz˚Ċơ´ȒȉǠɨĎɥÔwåȥעʉˆ¡΀ؠDZࡄāǐÂĺɋĹţ—°ˉ΁ǼlŧOfâѠφţʳĈˍDžÙ»IJǗǓ˜ÿɖ¡ΎƈȐɳŰĞŒɕƠƢ’aƐ£ĞĽb‰¸ÇŞ୎@෤@Ϊ@Ψ@ܒ@੼@。@。@ @੼@ܒ@Ϊ@ܒ@ȤAN͆ʨÅM¶ɋ"],["@@Á¹ÁĜń¡"],["@@ƯnÔüƳŜѲÛȡƩ"],["@@ѭ_ҼȔdz"],["@@Šŋёōɚ͎Ęij"],["@@ȉØļ¨ĎĿ"],["@@ƑjΚǚɇȃ"],["@@Ѿ³ڿƁÚτZ"],["@@ŽBŲĬƀ·ųµ"],["@@ԱYࠪǎŇĎɢĔļ«Ùțҳč"],["@@ˏœ̼ú«ŕ"],["@@ԾƉсċυƼˊÚ"],["@@िћͲͪʺ´þǼϮPŗƍ"],["@@ȲĈŢÅ˃ǧdž«зȃޯŷըȐĶƠǨ«ÊÊ̩ČÌň̪Ķė"],["@@ǹa}ĬǎŒǚęů{"],["@@VŰŤóŹ»"],["@@ŕìƜ¬…ŗ"],["@@ĆƑʞūɱÈ௹ˇÁǂ΄ʤ֠Ť˦Ë"],["@@đāÔƚ~×"],["@@TLJəŚvȨȐƹ"],["@@̕ǥ°ǚʈŴ^ŧ"],["@@ȴCóǩ؉Զ˨ùȢˍ"],["@@[ßƣØǀH"],["@@ŎÆÆǏʵ‘Òɔ÷"],["@@́ɱñȒδ "],["@@ƟRŦĂzē"],["@@ǫʁɓǞ˃ȱëɂȆΒ̘ľɬȑfȩ"],["@@̨gĚȕоǏΦΏ˵ĨĵķǶTǰɑȘ_õеࢭԪƈÌÙnjիǐςŖʼnĬ̷ÑDzƴ‡nj"],["@@ɉĀŐĦɮ•ųƏ"],["@@iƓŻ[̹ŲɾΜˀɇŕ"],["@@ħ²ǰ‚ćó"],["@@ʀ“ƃ£Ļø"],["@@Ǜ”ĘȒɲǿƭ¥"],["@@ɂǍǯѯȫ§Ę͊ʏ͎ȘĀźñ"],["@@̶ՌɅÙ³ʙǬƞ˫˛™еҶԦK"],["@@̯ÓöŐ̈́ĉy"],["@@̌Տ½уʣʬĈƈϓŤŌǤɉȈ̛ȫUɬ̾ɈДƷ"],["@@ЀD­ĹɢŃǑĹѹšɘŹԁijϫƣøû͓ƵȠDzϙźăȇ˫ѴҶǤά̃ŹҶ̔ōɪÄ´ƪʼÙ¡Õ"],["@@İɅɢŐ͢ğ_Ǖ̱¡̠›¢ȱՏƼŅȷǿvփѴȺȺƬķ¦Č̪ "],["@@φcΖџЁΔ͌׉ԕʹ|τνܼȲNj"],["@@ϊ¥āōǗ֓įʏzˣƙϟĀ;ǮǢeÍŚΦ³"],["@@ų´Ȭà÷œ"],["@@DZüΔńǡǿ"],["@@ȿWNJĊ¶ñ"],["@@ŌӲΐƊs׹ѧ"],["@@;ÍŚͳҳűࠫȴʟǖԌV̢ƒ˺B"],["@@ʖѡřëŔʸ”"],["@@ŇɭēĸȜŶ"],["@@іƃͻ|ΉȪʰġ"],["@@ή¯آĂضʳ۴¿›ćԓ•ʽǷţƔࡻ˔ڃÿī̐ʄ¿"],["@@@݁@௯@݃@௯@݃@௯@݃@ӫȪ“Ȧ“ÖæЖĭʠŪψVžH@Áµě¡õˈřҨ˭،͓ÔʻèYƊîŶ¬˂ĠȠDĦʶǂj™ŀԴľˮ^ˈƑĜʑɢõʆDžÂÍĤ÷֠̅ɬɽɰɱϜϗĜýŢŋÎÝ¡­·ÅƴŀkՓąȨÔǝ̒ƒۖʗƠƒÂĝˆ[ìƃǙޥ̣ɋɱŽǓ̌ʤƈ͇դĂņفDZǗ˻ơÄ©ż̨΀ʘ ˱ˆʙƮգՖաĮƵЂ҂ÛΙɢ˺œ̩ ƍãʷȒżϒ˧ʇӉȄӳߺśǻΌߧЙƔ˛WũΠǼÜDžqŏƦÛʃٙɨÏƉϐÃŊLJɒ_Ɛűҟǫ޽˴ࠃӬ੏̤ɔƞBɌȎ˽ÆǬȞ`ϋƪࠧʩࠩNJ@Ǹɗŭੳń৛åŔ׹ƺǮˬҵʏճĈȊƢݩàƮèȷðƀ˄ºങȇĩàɈɂӹƅCǥDZwʦŵ͑ƻѪîž÷ϻзۯTŅĜǟ˯ĭŲñƳǡ ljǽ΅G˝ˁȽ¨үģDZÜÆĸРŊ̔Ɍ͹Ĺ͹ŎϨв’ϖޒʨମŭࠓʜԶˢҗȃՕl࠙ˑߓ׷П~̬ʡҩŽIJŏҹ¿ѳЭٔǑgǣ܍ϙ–ŧٕť٩ϕփǩNj̋ງӗřĻɶįȓőñĺǕǓ؝ƩŗƹģǺؓʭݏƓ½ŢȰ~˅ÚҳЕʿñȳǎ™ȿDž•ɉĢWůǡÝ´ʂ̺Ø৬װМĪˈwęęǞŏĆĮΒÅȻǜȦʶ୒ӌȲó^ȶ˸ɒЌȖ͒kȟƢð̺ΖŤʛº‡ƘҤ˄ƔͰ˩ɍࢣɛʿȤàŲ̂m˻ĦɋƇŋœj҃Ƌ‰؁ьȿùωȚݑɃĩʼnڅsΞŴäˆ˱ŠŸϊӽאϬΌ؇ΩĪɻटǁϳĄݑԔ˝”Ҥ̎Фķ­ƭ̼ƤɨƧʸƖСĆː¤ƍÈȵĕवÌȸƮΉ¶LĘʕơʡȞfǜʵT_Ė̠œɧĜϺÈāȘњ̼ξpƚǴǟïMʜΒĦqƺϺ‚˜ĹķğȞøǼ¹֔Ȃ˶ɚʸÛܾĘ˒ɖǫζхƶҸŨÜƪɱƜՇğࢡχͫɸºȓӍƒ੟œএň˳ŪÆǖљȘ٬ňਹŘֹȢහФ٦Yũǀ૆ɨ۔[ɋBŝ̡˴ō๘“ДȪΞýïŪڝÞՃͦƴŤ٪ЧଠŇNJх¶҅ıϫŰŘːຽèӿшᖉن΀ÆƞϮঔEনżဤજljƛࣞŤ݊ʌɂʿ¨Ȁάx׍ĢʹŶ̮üÂʼnૼĤ௄Ң@ĭݠƝӉljƤïڴɎࠆʡ߲Ōذ§ɐÑƓǃՊ»Ƨĝᖨ¤ೂʃཐµՀŵဖĞіéદ͉;E@݃"]],encodeOffsets:[[[-159315,19469]],[[-160613,21272]],[[-160242,21435]],[[-160986,21725]],[[-161586,21972]],[[-163197,22459]],[[-82989,25311]],[[-82311,25746]],[[-99502,26788]],[[-82111,27934]],[[-93996,30209]],[[-86945,30355]],[[-91365,30807]],[[-121188,34187]],[[-122924,34733]],[[-122759,34898]],[[-77357,36086]],[[-75912,40634]],[[-74250,41970]],[[-71657,42256]],[[-72202,42370]],[[-72951,42488]],[[-69823,45397]],[[-125331,48533]],[[-125514,49313]],[[-97078,50179]],[[-180517,53036]],[[-182148,52890]],[[-181399,52958]],[[-180831,53112]],[[184042,53152]],[[181674,53128]],[[-177718,53388]],[[-176603,53527]],[[-178869,53284]],[[177893,53617]],[[176960,54286]],[[-171995,54626]],[[-170614,55195]],[[-169821,55369]],[[-169534,55436]],[[-166193,56164]],[[-167399,56301]],[[-163343,56476]],[[-134491,56402]],[[-163709,56452]],[[-136050,56212]],[[-164177,56666]],[[-164541,56643]],[[-136504,56877]],[[-159299,57161]],[[-134122,56821]],[[-136771,57692]],[[-135966,57598]],[[-135283,57456]],[[-157909,57872]],[[-173829,57995]],[[-135932,57883]],[[-137205,58210]],[[-136567,58372]],[[-156679,58496]],[[-138209,58728]],[[-156567,59212]],[[-138987,59643]],[[-137912,59558]],[[-156074,59761]],[[-156145,59889]],[[-164781,59983]],[[-151574,61507]],[[-151281,61249]],[[-170122,61833]],[[-149907,61901]],[[-151202,61902]],[[-176888,61909]],[[-175578,65168]],[[-144386,70425]]]},properties:{name:"United States",childNum:76}},{geometry:{type:"MultiPolygon",coordinates:[["@@§QûD«T‚æBb로ÂfE´ÍŰmſ"],["@@‚d´fÇè—hiGo࢟ӹҬƝńƧɀÓǂ@Ā{`ZZǦƺt¸ƤŠó´sˆ]ÆđjĭäOĀmÂn¤[b¯LývWŴ|ʜƣЊ“ѹʫǝªYųɏXρʋ͛Ŕˁ_ʱɿƸ͊˴̋ˀׁ̙ͅĢųǙÌ̳է}˼Ýƕ‘ÂţȕÍƧʩسîʗſËȽʒí ŗπɛϡɚɗ҉؋_ȯÓMx«xýI÷œÙQĹ£ĽtŃČȭŒʱoWĢBŠ^ƾäǜՓɐ̝KફبҝƸ੿ۆӣरͿƶɇñڍ‚̫Ʈ[̠ŀšɑƜ˜ȨՋĦٝϤĥĭ˙…˔ˡϏǂǷʡѯDzɡżэčñ࢓¸AᶢᓢҼᏠউࠜݷৼŘਢÝϴƎӺͻʴεʠĨùࠡЪUǰۅਐdƪƗÅȁȴŹʀƒXɈӎҤຘۖ"]],encodeOffsets:[[[72916,40850]],[[72650,43263]]]},properties:{name:"Uzbekistan",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ÿŊň҇Ǜ"],encodeOffsets:[[-62642,13474]]},properties:{name:"St. Vin. and Gren.",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@Ñäźļ®ķŕç"],["@@ķǦĈíÅ"],["@@ËȳСĂDŽĖƺíưŊ"],["@@|S’wÌǷͯΏɷeғˏ˧ĉɏ¸ʩśŧΥЙַ̎]Ɲǔ͑\\DZŖĴɛϖΥƦ࣭ւù—ɋӛȋǑ͵ݱΟ̳ΕéE„žƃŠ͇ǕʋeѻϦ˫খ΃ͺȫ@ҢԺ̍ϖNjզ~ٚ̎ֈOɀ̓ĠԧŏߣƒםۤԛŘ͡ē݅žǛ˴ɝźèٚɳ˺ŋКɗŴʵÅ̠ԄŘמừψ̤ʒЂ՜ǐ՗ʕĸ͉njƩõeŘ˱ѥۻв٣͆Ħƀǀ„̜ω۞tδਤ΄ŖŮʖWǖ́¡ÿɘìDzǖä̼וڮ¡ήɫĒЅƀǑཤŞͪ̿؈ƿɼz֌̠Ϧžџ§þ᎚ĘсǍ҃]Ȓȯ¯ȝdžŨȖΗČČÊ»CƂâG˺˿}ƶƬäڞ҃ȗǥȋү̷E˄ƽцƴՒrŴÉƼȱcµĭ³s}•ĝЗȫǣɷĤǷu𦱼W¶nÖC ]h_H•}÷—³˕ƫΫÕµęnÙ~ÇA½pƝ‘Å›ßãóġ^ǬțǶȥDzȡ"]],encodeOffsets:[[[-62461,9081]],[[-62280,9358]],[[-65381,11399]],[[-62199,5327]]]},properties:{name:"Venezuela",childNum:4}},{geometry:{type:"Polygon",coordinates:["@@Ƽ™ʷ£ļþ"],encodeOffsets:[[-66320,18222]]},properties:{name:"U.S. Virgin Is.",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@̥ƙ˼Ǹj"],["@@ĹmŸŊ}ě"],["@@ǗĽÔƨń©"],["@@ҿȉ±ȕǃęЙªÐɟǟǩnœӵϟ̥ࠇɢϵԢұgȑĝx௴ணǒRڔߟМ౫ӝŸ˗j̗ğŶĭėðɉĉrOׅƅŏ«ɋݡσÿƩث˓ɉɚ·ɕȃŖķÏŖi`űʗF˒ƳDžɍϫ̦άэãſչψˠͿTǓ֗ʭ͕ϵ́łŲݲvڮȪ͞ʁǨśȥȮΤļǒƖAǮɨÇúĚ̌ŽĈŁʼÍEȲʯɎI˺žļͤÑ^ɘʊ~њ˚Ʋ™ĨĖ֔Ŋ΂ɯׂǀӠIĨV®išqÄÚކ¾šÒhưµæĕØķĂ·¸ĩƸpŠƠê€~HüϹʺ‹š•IJeV“‡©é’ġƄYƜO²oÞțɜɛǖ˃˔ēȸϹÜ˿Ʉwú¶ĶD†੉ռHˆŠtĄ°ˆÀWæêfz€FǔNʊזPžŖ¶è\\ÊĨĪBđò“„űFkh_ÂI’žĹĕVqb’œÒš®t¨üȟƤŻþÿ‚ϹȽƟêɅ¼ęªȁʼƒÂĊΒĕ®{ÔcQwõÝCáȔϣЌ¤ˆ¼ªƜȮĘіʫ̂˔ƔƳņnj˒ȭǜɔȔąˆIJƬ˄ΊǬӊΡʰ¢Ōĥɚ¨ȨʼnȕɷĨѭʶ¯͊˅΄žǴū"]],encodeOffsets:[[[106562,10641]],[[110102,21429]],[[110186,21727]],[[110564,22025]]]},properties:{name:"Vietnam",childNum:4}},{geometry:{type:"MultiPolygon",coordinates:[["@@ŧéʼnŮ~ŌȴǏ"],["@@̇Ì|ȒņZdžʷ"],["@@ŞŹ»đ̭ôĪƄƢT"],["@@ɟsƖʾš"],["@@̯ĜȠŮŐɉ"],["@@Τ̓͗ėčʹǓØ¢ǐŖÞƯ"],["@@ȥ_ˠƚùŹ"],["@@Ä˥ɠȆŀэęř˯§ŃȎÁٜƬƹ"],["@@Ż…gĈĄ²àij"],["@@ąIJöâPǓ"]],encodeOffsets:[[[173560,-20009]],[[173399,-19394]],[[172489,-17963]],[[172490,-17181]],[[172336,-16728]],[[171431,-16482]],[[171942,-15806]],[[170748,-15182]],[[171607,-14603]],[[171509,-14240]]]},properties:{name:"Vanuatu",childNum:10}},{geometry:{type:"MultiPolygon",coordinates:[["@@ϧœœŨϊmŲƕ"],["@@ƀȁ¡ijʻZȱɲϐª"]],encodeOffsets:[[[-175569,-14383]],[[-176469,-13788]]]},properties:{name:"Samoa",childNum:2}},{geometry:{type:"MultiPolygon",coordinates:[["@@Τv˘ġ͍lj·•͹ǶȀƶȔß"],["@@ÇĖþ½"],["@@ÿŒÌºtą"],["@@ُ̕Ź˱˜ʧݧίဇӳֳӳ֭Cӧ͗ԳǑोŃԳѭΝBԥǫ̷Řūɋӌ¨ΨNjˌŹެãǎǕČŢĀçˠĺ̈́‘˸̬ˊv֜ȒƂмLJਚĒ͚Ŀ৊‹ȼʽƖMʤƒŚ˲ӾתܶΦូΒजጉ"]],encodeOffsets:[[[55054,12941]],[[43783,14034]],[[43815,14307]],[[54360,17048]]]},properties:{name:"Yemen",childNum:4}},{geometry:{type:"MultiPolygon",coordinates:[["@@ɡŠǘÐÊę"],["@@ƾӋÃ౑ӯǶŅóijřʇεH̹ÜM°ĻŀǓǰŁǐ³ɰ]ǺHYŐlǴxŤ~NôyòLźyΤVĠD̏଍ȽΟߙٍ଩࿋౫ફହݫկȧԻnșʣӑ¾ƩǏșIݭƴίõ׵Òʷ·ϧʭੑùё˓؇ƞ‚ĺțŤɡ[áʀɃuȧğƄæІӧݞĪĴƆ“ǜȴīٚܧઢͭ࢔ǭͨʕ͢ʶƒ‚¶nŌ€œ†ü¶¶ļŎďƞŗöέܨǁ܎«ìŒÊƚȐƄφļ@Ţ@ᲄϜ̵̦٥ŷ۝ĊęߤP˜†¨ĆȈØä²łLjɈƜޔ¦žɾ֦ɪƚȬEъʹÚsȊMŚğݐ[ʰĀͦޒĶœČ€ɠ¶°€͒˼ɀ֎ֶޜ”ͮΐՊǴĘðÊĮİÆȠhZBʈ Ȭʎěɨ‹ɂ€̦Uļ‹ú³ɐࣣɈ·","@@Ɯ˳͞ˑʮÒĚɜ̈́ɊlϜǨšȀŶŒ²ŀŒĺíȖ֧ђ•YģkȩïůßĿÿȉÇχӡȥęŘ˅"]],encodeOffsets:[[[38766,-48070]],[[32563,-24465],[27847,-30659]]]},properties:{name:"South Africa",childNum:2}},{geometry:{type:"Polygon",coordinates:["@@ĐŽĐđ[ûuëǾǓRį`ĞƋ̳ʣòʱģȷ‡[Mįàſ©ΟôǏƠ‘ҋ̓Oѯʟ̫ńĉƸˏƖÌ®Ó᠁ࠑƐշޅ­ӗʓŷҙ̩۟މࢿȭéϑĦ˳“إƪɍȌɥ¨ϩŒݧƇঽ࡚ǵ֢A౞@˒@˒@ڠȘ@൒@ĶZåDŽH²pĜØފcܔͲɑXʋފǤ¼Ή֪ɡڢÙˮ͖Βխ۶ʓŜˋƮõʆϋǀ{̒ŲȄǃjંʋÓmDžΟÎӥҌċȶɘࡢ“ܸǟϢЀτzʦ༔ʖâLJ¾õÜÝĞ»ɰJĊŸð¹lûİēȶƒFÝl‡ۂɥƎíÜǷŸf"],encodeOffsets:[[33944,-9834]]},properties:{name:"Zambia",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ǵḀ̄TɁ}ɩŒʍĜȩŽʇŸYA¥ŠßàǍ¾aȄࡗȲ́ЬTҼͯrđ͆ࡓӀȕԌבࠂ`ƨئƩ˴”ϒĥȮêފࣀ̪۠ŸҚӘʔކ®–̑ڢyעͽࡐʃÑƝĮఏʗӥŴƍÓʇǸԃп֥śЏÜƉࡁࡃšđ"],encodeOffsets:[[32039,-22939]]},properties:{name:"Zimbabwe",childNum:1}},{geometry:{type:"Polygon",coordinates:["@@ڽը¿ުەߖ٬֖NΦxHޠ—цǒŴ\\ǔéº`Ęfú[ǜ¹~}¢ũŠYĨ†ĀcĖŸÌ›œ£¢áfÁnÛ½˩ƄÇÞŻ~eÖBŒvİ”¤RXĩ̙Ą§’až÷Îŕœ÷ĸȣ¡ıǽûsmQ}«»ď§řjʅõōDđ³Û«ŷ³அɘŅ™ĭ“āuƕɳ`«Ī¢§NÙéžõʠ{ɩɥƤǵšɇ"],encodeOffsets:[[75785,34052]]},properties:{name:"",childNum:1}},{geometry:{type:"MultiPolygon",coordinates:[["@@͙̄͟ƹիԠύfʛϋӻýģлʫ@˭ƪǕIđŠmɜ\\™cȝ`¥”CƴˁȖƈʊƣǶɪɦʟ|öÜêOž¡¨ĩŽ_¬ƖɴĂxĮ’ņšஆɗŸ´Ü¬Ĕ´ŌCʆöŚiШ®¼P~tnǾü~Ðd¢̀NJŰÜŀÄǬȲ_„́êǁƘ˹Ҏǹҍ†ĽȱǷ´ǡæͅìíƐĵn­ĵ˜§rчɃŝƑŢa¸ȵw"]],encodeOffsets:[[[80376,33312]]]},properties:{name:"",childNum:1}}],UTF8Encoding:!0}):t("ECharts Map is not loaded"):t("ECharts is not Loaded")}); \ No newline at end of file diff --git a/admin-ui/public/world/world.json b/admin-ui/public/world/world.json new file mode 100644 index 0000000..bb37889 --- /dev/null +++ b/admin-ui/public/world/world.json @@ -0,0 +1,947 @@ +{ + "status": true, + "namemap": { + "Afghanistan": "阿富汗", + "Angola": "安哥拉", + "Albania": "阿尔巴尼亚", + "Algeria": "阿尔及利亚", + "Argentina": "阿根廷", + "Armenia": "亚美尼亚", + "Australia": "澳大利亚", + "Austria": "奥地利", + "Azerbaijan": "阿塞拜疆", + "Bahamas": "巴哈马", + "Bangladesh": "孟加拉国", + "Belgium": "比利时", + "Benin": "贝宁", + "Burkina Faso": "布基纳法索", + "Burundi": "布隆迪", + "Bulgaria": "保加利亚", + "Bosnia and Herz.": "波斯尼亚和黑塞哥维那", + "Belarus": "白俄罗斯", + "Belize": "伯利兹", + "Bermuda": "百慕大群岛", + "Bolivia": "玻利维亚", + "Brazil": "巴西", + "Brunei": "文莱", + "Bhutan": "不丹", + "Botswana": "博茨瓦纳", + "Cambodia": "柬埔寨", + "Cameroon": "喀麦隆", + "Canada": "加拿大", + "Central African Rep.": "中非共和国", + "Chad": "乍得", + "Chile": "智利", + "China": "中国", + "Colombia": "哥伦比亚", + "Congo": "刚果", + "Costa Rica": "哥斯达黎加", + "Côte d'Ivoire": "科特迪瓦", + "Croatia": "克罗地亚", + "Cuba": "古巴", + "Cyprus": "塞浦路斯", + "Czech Rep.": "捷克共和国", + "Dem. Rep. Korea": "韩国", + "Dem. Rep. Congo": "民主刚果", + "Denmark": "丹麦", + "Djibouti": "吉布提", + "Dominican Rep.": "多米尼加共和国", + "Ecuador": "厄瓜多尔", + "Egypt": "埃及", + "El Salvador": "萨尔瓦多", + "Eq. Guinea": "赤道几内亚", + "Eritrea": "厄立特里亚", + "Estonia": "爱沙尼亚", + "Ethiopia": "埃塞俄比亚", + "Falkland Is.": "福克兰群岛", + "Fiji": "斐济", + "Finland": "芬兰", + "France": "法国", + "French Guiana": "法属圭亚那", + "Fr. S. Antarctic Lands": "法属南部领地", + "Gabon": "加蓬", + "Gambia": "冈比亚", + "Germany": "德国", + "Georgia": "佐治亚州", + "Ghana": "加纳", + "Greece": "希腊", + "Greenland": "格陵兰", + "Guatemala": "危地马拉", + "Guinea": "几内亚", + "Guinea-Bissau": "几内亚比绍", + "Guyana": "圭亚那", + "Haiti": "海地", + "Heard I. and McDonald Is.": "赫德岛和麦克唐纳群岛", + "Honduras": "洪都拉斯", + "Hungary": "匈牙利", + "Iceland": "冰岛", + "India": "印度", + "Indonesia": "印度尼西亚", + "Iran": "伊朗", + "Iraq": "伊拉克", + "Ireland": "爱尔兰", + "Israel": "以色列", + "Italy": "意大利", + "Ivory Coast": "象牙海岸", + "Jamaica": "牙买加", + "Japan": "日本", + "Jordan": "乔丹", + "Kashmir": "克什米尔", + "Kazakhstan": "哈萨克斯坦", + "Kenya": "肯尼亚", + "Kosovo": "科索沃", + "Kuwait": "科威特", + "Kyrgyzstan": "吉尔吉斯斯坦", + "Laos": "老挝", + "Lao PDR": "老挝人民民主共和国", + "Latvia": "拉脱维亚", + "Lebanon": "黎巴嫩", + "Lesotho": "莱索托", + "Liberia": "利比里亚", + "Libya": "利比亚", + "Lithuania": "立陶宛", + "Luxembourg": "卢森堡", + "Madagascar": "马达加斯加", + "Macedonia": "马其顿", + "Malawi": "马拉维", + "Malaysia": "马来西亚", + "Mali": "马里", + "Mauritania": "毛里塔尼亚", + "Mexico": "墨西哥", + "Moldova": "摩尔多瓦", + "Mongolia": "蒙古", + "Montenegro": "黑山", + "Morocco": "摩洛哥", + "Mozambique": "莫桑比克", + "Myanmar": "缅甸", + "Namibia": "纳米比亚", + "Netherlands": "荷兰", + "New Caledonia": "新喀里多尼亚", + "New Zealand": "新西兰", + "Nepal": "尼泊尔", + "Nicaragua": "尼加拉瓜", + "Niger": "尼日尔", + "Nigeria": "尼日利亚", + "Korea": "朝鲜", + "Northern Cyprus": "北塞浦路斯", + "Norway": "挪威", + "Oman": "阿曼", + "Pakistan": "巴基斯坦", + "Panama": "巴拿马", + "Papua New Guinea": "巴布亚新几内亚", + "Paraguay": "巴拉圭", + "Peru": "秘鲁", + "Republic of the Congo": "刚果共和国", + "Philippines": "菲律宾", + "Poland": "波兰", + "Portugal": "葡萄牙", + "Puerto Rico": "波多黎各", + "Qatar": "卡塔尔", + "Republic of Seychelles": "塞舌尔共和国", + "Romania": "罗马尼亚", + "Russia": "俄罗斯", + "Rwanda": "卢旺达", + "Samoa": "萨摩亚", + "Saudi Arabia": "沙特阿拉伯", + "Senegal": "塞内加尔", + "Serbia": "塞尔维亚", + "Sierra Leone": "塞拉利昂", + "Slovakia": "斯洛伐克", + "Slovenia": "斯洛文尼亚", + "Solomon Is.": "所罗门群岛", + "Somaliland": "索马里兰", + "Somalia": "索马里", + "South Africa": "南非", + "S. Geo. and S. Sandw. Is.": "南乔治亚和南桑德威奇群岛", + "S. Sudan": "南苏丹", + "Spain": "西班牙", + "Sri Lanka": "斯里兰卡", + "Sudan": "苏丹", + "Suriname": "苏里南", + "Swaziland": "斯威士兰", + "Sweden": "瑞典", + "Switzerland": "瑞士", + "Syria": "叙利亚", + "Tajikistan": "塔吉克斯坦", + "Tanzania": "坦桑尼亚", + "Thailand": "泰国", + "The Kingdom of Tonga": "汤加王国", + "Timor-Leste": "东帝汶", + "Togo": "多哥", + "Trinidad and Tobago": "特立尼达和多巴哥", + "Tunisia": "突尼斯", + "Turkey": "土耳其", + "Turkmenistan": "土库曼斯坦", + "Uganda": "乌干达", + "Ukraine": "乌克兰", + "United Arab Emirates": "阿拉伯联合酋长国", + "United Kingdom": "大不列颠联合王国", + "United Republic of Tanzania": "坦桑尼亚联合共和国", + "United States": "美国", + "United States of America": "美利坚合众国", + "Uruguay": "乌拉圭", + "Uzbekistan": "乌兹别克斯坦", + "Vanuatu": "瓦努阿图", + "Venezuela": "委内瑞拉", + "Vietnam": "越南", + "West Bank": "西岸", + "W. Sahara": "西撒哈拉", + "Yemen": "也门", + "Zambia": "赞比亚", + "Zimbabwe": "津巴布韦" + }, + "dataArr": [ + { + "name": "阿富汗", + "value": 10000 + }, + { + "name": "安哥拉", + "value": 0 + }, + { + "name": "阿尔巴尼亚", + "value": 0 + }, + { + "name": "阿尔及利亚", + "value": 0 + }, + { + "name": "阿根廷", + "value": 0 + }, + { + "name": "亚美尼亚", + "value": 0 + }, + { + "name": "澳大利亚", + "value": 0 + }, + { + "name": "奥地利", + "value": 0 + }, + { + "name": "阿塞拜疆", + "value": 0 + }, + { + "name": "布隆迪", + "value": 0 + }, + { + "name": "比利时", + "value": 0 + }, + { + "name": "贝宁", + "value": 0 + }, + { + "name": "布基纳法索", + "value": 0 + }, + { + "name": "孟加拉国", + "value": 0 + }, + { + "name": "保加利亚", + "value": 0 + }, + { + "name": "波斯尼亚和黑塞哥维那", + "value": 0 + }, + { + "name": "白俄罗斯", + "value": 0 + }, + { + "name": "伯利兹", + "value": 0 + }, + { + "name": "百慕大群岛", + "value": 0 + }, + { + "name": "玻利维亚", + "value": 0 + }, + { + "name": "巴西", + "value": 0 + }, + { + "name": "文莱", + "value": 0 + }, + { + "name": "不丹", + "value": 0 + }, + { + "name": "博茨瓦纳", + "value": 0 + }, + { + "name": "柬埔寨", + "value": 0 + }, + { + "name": "喀麦隆", + "value": 0 + }, + { + "name": "加拿大", + "value": 0 + }, + { + "name": "中非共和国", + "value": 0 + }, + { + "name": "乍得", + "value": 0 + }, + { + "name": "智利", + "value": 0 + }, + { + "name": "中国", + "value": 60 + }, + { + "name": "哥伦比亚", + "value": 0 + }, + { + "name": "刚果", + "value": 0 + }, + { + "name": "科特迪瓦", + "value": 0 + }, + { + "name": "哥斯达黎加", + "value": 0 + }, + { + "name": "克罗地亚", + "value": 0 + }, + { + "name": "古巴", + "value": 0 + }, + { + "name": "塞浦路斯", + "value": 0 + }, + { + "name": "捷克共和国", + "value": 0 + }, + { + "name": "民主刚果", + "value": 0 + }, + { + "name": "丹麦", + "value": 0 + }, + { + "name": "吉布提", + "value": 0 + }, + { + "name": "多米尼加共和国", + "value": 0 + }, + { + "name": "东帝汶", + "value": 0 + }, + { + "name": "厄瓜多尔", + "value": 0 + }, + { + "name": "埃及", + "value": 0 + }, + { + "name": "萨尔瓦多", + "value": 0 + }, + { + "name": "赤道几内亚", + "value": 0 + }, + { + "name": "厄立特里亚", + "value": 0 + }, + { + "name": "爱沙尼亚", + "value": 0 + }, + { + "name": "埃塞俄比亚", + "value": 0 + }, + { + "name": "福克兰群岛", + "value": 0 + }, + { + "name": "斐济", + "value": 0 + }, + { + "name": "芬兰", + "value": 0 + }, + { + "name": "法国", + "value": 0 + }, + { + "name": "法属圭亚那", + "value": 0 + }, + { + "name": "法属南部领地", + "value": 0 + }, + { + "name": "加蓬", + "value": 0 + }, + { + "name": "冈比亚", + "value": 0 + }, + { + "name": "德国", + "value": 0 + }, + { + "name": "佐治亚州", + "value": 0 + }, + { + "name": "加纳", + "value": 0 + }, + { + "name": "希腊", + "value": 0 + }, + { + "name": "格陵兰", + "value": 0 + }, + { + "name": "危地马拉", + "value": 0 + }, + { + "name": "几内亚", + "value": 0 + }, + { + "name": "几内亚比绍", + "value": 0 + }, + { + "name": "圭亚那", + "value": 0 + }, + { + "name": "海地", + "value": 0 + }, + { + "name": "赫德岛和麦克唐纳群岛", + "value": 0 + }, + { + "name": "洪都拉斯", + "value": 0 + }, + { + "name": "匈牙利", + "value": 0 + }, + { + "name": "冰岛", + "value": 0 + }, + { + "name": "印度", + "value": 0 + }, + { + "name": "印度尼西亚", + "value": 0 + }, + { + "name": "伊朗", + "value": 0 + }, + { + "name": "伊拉克", + "value": 0 + }, + { + "name": "爱尔兰", + "value": 0 + }, + { + "name": "以色列", + "value": 0 + }, + { + "name": "意大利", + "value": 0 + }, + { + "name": "象牙海岸", + "value": 0 + }, + { + "name": "牙买加", + "value": 0 + }, + { + "name": "日本", + "value": 0 + }, + { + "name": "乔丹", + "value": 0 + }, + { + "name": "克什米尔", + "value": 0 + }, + { + "name": "哈萨克斯坦", + "value": 0 + }, + { + "name": "肯尼亚", + "value": 0 + }, + { + "name": "科索沃", + "value": 0 + }, + { + "name": "科威特", + "value": 0 + }, + { + "name": "吉尔吉斯斯坦", + "value": 0 + }, + { + "name": "老挝", + "value": 0 + }, + { + "name": "老挝人民民主共和国", + "value": 0 + }, + { + "name": "拉脱维亚", + "value": 0 + }, + { + "name": "黎巴嫩", + "value": 0 + }, + { + "name": "莱索托", + "value": 0 + }, + { + "name": "利比里亚", + "value": 0 + }, + { + "name": "利比亚", + "value": 0 + }, + { + "name": "立陶宛", + "value": 0 + }, + { + "name": "卢森堡", + "value": 0 + }, + { + "name": "马达加斯加", + "value": 0 + }, + { + "name": "马其顿", + "value": 0 + }, + { + "name": "马拉维", + "value": 0 + }, + { + "name": "马来西亚", + "value": 0 + }, + { + "name": "马里", + "value": 0 + }, + { + "name": "毛里塔尼亚", + "value": 0 + }, + { + "name": "墨西哥", + "value": 0 + }, + { + "name": "摩尔多瓦", + "value": 0 + }, + { + "name": "蒙古", + "value": 0 + }, + { + "name": "黑山", + "value": 0 + }, + { + "name": "摩洛哥", + "value": 0 + }, + { + "name": "莫桑比克", + "value": 0 + }, + { + "name": "缅甸", + "value": 0 + }, + { + "name": "纳米比亚", + "value": 0 + }, + { + "name": "荷兰", + "value": 0 + }, + { + "name": "新喀里多尼亚", + "value": 0 + }, + { + "name": "新西兰", + "value": 0 + }, + { + "name": "尼泊尔", + "value": 0 + }, + { + "name": "尼加拉瓜", + "value": 0 + }, + { + "name": "尼日尔", + "value": 0 + }, + { + "name": "尼日利亚", + "value": 0 + }, + { + "name": "朝鲜", + "value": 0 + }, + { + "name": "北塞浦路斯", + "value": 0 + }, + { + "name": "挪威", + "value": 0 + }, + { + "name": "阿曼", + "value": 0 + }, + { + "name": "巴基斯坦", + "value": 0 + }, + { + "name": "巴拿马", + "value": 0 + }, + { + "name": "巴布亚新几内亚", + "value": 0 + }, + { + "name": "巴拉圭", + "value": 0 + }, + { + "name": "秘鲁", + "value": 0 + }, + { + "name": "刚果共和国", + "value": 0 + }, + { + "name": "菲律宾", + "value": 0 + }, + { + "name": "波兰", + "value": 0 + }, + { + "name": "葡萄牙", + "value": 0 + }, + { + "name": "波多黎各", + "value": 0 + }, + { + "name": "卡塔尔", + "value": 0 + }, + { + "name": "塞舌尔共和国", + "value": 0 + }, + { + "name": "罗马尼亚", + "value": 0 + }, + { + "name": "俄罗斯", + "value": 0 + }, + { + "name": "卢旺达", + "value": 0 + }, + { + "name": "萨摩亚", + "value": 0 + }, + { + "name": "沙特阿拉伯", + "value": 0 + }, + { + "name": "塞内加尔", + "value": 0 + }, + { + "name": "塞尔维亚", + "value": 0 + }, + { + "name": "塞拉利昂", + "value": 0 + }, + { + "name": "斯洛伐克", + "value": 0 + }, + { + "name": "斯洛文尼亚", + "value": 0 + }, + { + "name": "所罗门群岛", + "value": 0 + }, + { + "name": "索马里兰", + "value": 0 + }, + { + "name": "索马里", + "value": 0 + }, + { + "name": "南非", + "value": 0 + }, + { + "name": "南乔治亚和南桑德威奇群岛", + "value": 0 + }, + { + "name": "韩国", + "value": 0 + }, + { + "name": "南苏丹", + "value": 0 + }, + { + "name": "西班牙", + "value": 0 + }, + { + "name": "斯里兰卡", + "value": 0 + }, + { + "name": "苏丹", + "value": 0 + }, + { + "name": "苏里南", + "value": 0 + }, + { + "name": "斯威士兰", + "value": 0 + }, + { + "name": "瑞典", + "value": 0 + }, + { + "name": "瑞士", + "value": 0 + }, + { + "name": "叙利亚", + "value": 0 + }, + { + "name": "塔吉克斯坦", + "value": 0 + }, + { + "name": "坦桑尼亚", + "value": 0 + }, + { + "name": "泰国", + "value": 0 + }, + { + "name": "汤加王国", + "value": 0 + }, + { + "name": "巴哈马", + "value": 0 + }, + { + "name": "多哥", + "value": 0 + }, + { + "name": "特立尼达和多巴哥", + "value": 0 + }, + { + "name": "突尼斯", + "value": 0 + }, + { + "name": "土耳其", + "value": 0 + }, + { + "name": "土库曼斯坦", + "value": 0 + }, + { + "name": "乌干达", + "value": 0 + }, + { + "name": "乌克兰", + "value": 0 + }, + { + "name": "阿拉伯联合酋长国", + "value": 0 + }, + { + "name": "大不列颠联合王国", + "value": 0 + }, + { + "name": "坦桑尼亚联合共和国", + "value": 0 + }, + { + "name": "美国", + "value": 0 + }, + { + "name": "美利坚合众国", + "value": 0 + }, + { + "name": "乌拉圭", + "value": 0 + }, + { + "name": "乌兹别克斯坦", + "value": 0 + }, + { + "name": "瓦努阿图", + "value": 0 + }, + { + "name": "委内瑞拉", + "value": 0 + }, + { + "name": "越南", + "value": 0 + }, + { + "name": "西岸", + "value": 0 + }, + { + "name": "西撒哈拉", + "value": 0 + }, + { + "name": "也门", + "value": 0 + }, + { + "name": "赞比亚", + "value": 0 + }, + { + "name": "津巴布韦", + "value": 0 + } + ] +} diff --git a/admin-ui/src/App.vue b/admin-ui/src/App.vue new file mode 100644 index 0000000..12df51d --- /dev/null +++ b/admin-ui/src/App.vue @@ -0,0 +1,20 @@ + + + + diff --git a/admin-ui/src/api/ai/balanceChangeRecord.js b/admin-ui/src/api/ai/balanceChangeRecord.js new file mode 100644 index 0000000..d650e0d --- /dev/null +++ b/admin-ui/src/api/ai/balanceChangeRecord.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询余额使用记录列表 +export function listRecord(query) { + return request({ + url: '/ai/balance-change-record/list', + method: 'get', + params: query + }) +} + +// 查询余额使用记录详细 +export function getRecord(id) { + return request({ + url: '/ai/balance-change-record/' + id, + method: 'get' + }) +} + +// 新增余额使用记录 +export function addRecord(data) { + return request({ + url: '/ai/balance-change-record', + method: 'post', + data: data + }) +} + +// 修改余额使用记录 +export function updateRecord(data) { + return request({ + url: '/ai/balance-change-record', + method: 'put', + data: data + }) +} + +// 删除余额使用记录 +export function delRecord(id) { + return request({ + url: '/ai/balance-change-record/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/banner.js b/admin-ui/src/api/ai/banner.js new file mode 100644 index 0000000..9957976 --- /dev/null +++ b/admin-ui/src/api/ai/banner.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +// 查询banner管理列表 +export function listBanner(query) { + return request({ + url: '/ai/banner/list', + method: 'get', + params: query + }) +} + +// 查询banner管理详细 +export function getBanner(id) { + return request({ + url: '/ai/banner/' + id, + method: 'get' + }) +} + +// 新增banner管理 +export function addBanner(data) { + return request({ + url: '/ai/banner', + method: 'post', + data: data + }) +} + +// 修改banner管理 +export function updateBanner(data) { + return request({ + url: '/ai/banner', + method: 'put', + data: data + }) +} + +// 删除banner管理 +export function delBanner(id) { + return request({ + url: '/ai/banner/' + id, + method: 'delete' + }) +} + +export function changeStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/banner', + method: 'put', + data: data + }) +} diff --git a/admin-ui/src/api/ai/customer.js b/admin-ui/src/api/ai/customer.js new file mode 100644 index 0000000..51bc497 --- /dev/null +++ b/admin-ui/src/api/ai/customer.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +// 查询AI-客户配置列表 +export function listCustomer(query) { + return request({ + url: '/ai/customer/list', + method: 'get', + params: query + }) +} + +// 查询AI-客户配置详细 +export function getCustomer(id) { + return request({ + url: '/ai/customer/' + id, + method: 'get' + }) +} + +// 新增AI-客户配置 +export function addCustomer(data) { + return request({ + url: '/ai/customer', + method: 'post', + data: data + }) +} + +// 修改AI-客户配置 +export function updateCustomer(data) { + return request({ + url: '/ai/customer', + method: 'put', + data: data + }) +} + +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/customer', + method: 'put', + data: data + }) +} + +// 删除AI-客户配置 +export function delCustomer(id) { + return request({ + url: '/ai/customer/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/gear.js b/admin-ui/src/api/ai/gear.js new file mode 100644 index 0000000..773bc91 --- /dev/null +++ b/admin-ui/src/api/ai/gear.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询充值赠送活动档位配置列表 +export function listGear(query) { + return request({ + url: '/ai/gear/list', + method: 'get', + params: query + }) +} + +// 查询充值赠送活动档位配置详细 +export function getGear(id) { + return request({ + url: '/ai/gear/' + id, + method: 'get' + }) +} + +// 新增充值赠送活动档位配置 +export function addGear(data) { + return request({ + url: '/ai/gear', + method: 'post', + data: data + }) +} + +// 修改充值赠送活动档位配置 +export function updateGear(data) { + return request({ + url: '/ai/gear', + method: 'put', + data: data + }) +} + +// 删除充值赠送活动档位配置 +export function delGear(id) { + return request({ + url: '/ai/gear/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/gift.js b/admin-ui/src/api/ai/gift.js new file mode 100644 index 0000000..e5a087c --- /dev/null +++ b/admin-ui/src/api/ai/gift.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 查询充值赠送活动列表 +export function listGift(query) { + return request({ + url: '/ai/gift/list', + method: 'get', + params: query + }) +} + +// 查询充值赠送活动详细 +export function getGift(id) { + return request({ + url: '/ai/gift/' + id, + method: 'get' + }) +} + +// 新增充值赠送活动 +export function addGift(data) { + return request({ + url: '/ai/gift', + method: 'post', + data: data + }) +} + +// 修改充值赠送活动 +export function updateGift(data) { + return request({ + url: '/ai/gift', + method: 'put', + data: data + }) +} + +// 修改充值赠送活动 +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/gift/changeUserStatus', + method: 'put', + data: data + }) +} + +// 删除充值赠送活动 +export function delGift(id) { + return request({ + url: '/ai/gift/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/help.js b/admin-ui/src/api/ai/help.js new file mode 100644 index 0000000..36e5261 --- /dev/null +++ b/admin-ui/src/api/ai/help.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +// 查询帮助管理列表 +export function listHelp(query) { + return request({ + url: '/ai/help/list', + method: 'get', + params: query + }) +} + +// 查询帮助管理详细 +export function getHelp(id) { + return request({ + url: '/ai/help/' + id, + method: 'get' + }) +} + +// 新增帮助管理 +export function addHelp(data) { + return request({ + url: '/ai/help', + method: 'post', + data: data + }) +} + +// 修改帮助管理 +export function updateHelp(data) { + return request({ + url: '/ai/help', + method: 'put', + data: data + }) +} + +// 删除帮助管理 +export function delHelp(id) { + return request({ + url: '/ai/help/' + id, + method: 'delete' + }) +} + +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/help', + method: 'put', + data: data + }) +} diff --git a/admin-ui/src/api/ai/manager.js b/admin-ui/src/api/ai/manager.js new file mode 100644 index 0000000..2327d8e --- /dev/null +++ b/admin-ui/src/api/ai/manager.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 查询AI管理列表 +export function listManager(query) { + return request({ + url: '/ai/manager/list', + method: 'get', + params: query + }) +} + +// 查询AI管理详细 +export function getManager(id) { + return request({ + url: '/ai/manager/' + id, + method: 'get' + }) +} + +// 新增AI管理 +export function addManager(data) { + return request({ + url: '/ai/manager', + method: 'post', + data: data + }) +} + +// 修改AI管理 +export function updateManager(data) { + return request({ + url: '/ai/manager', + method: 'put', + data: data + }) +} + +// 删除AI管理 +export function delManager(id) { + return request({ + url: '/ai/manager/' + id, + method: 'delete' + }) +} + +// 用户状态修改 +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/manager/changeStatus', + method: 'put', + data: data + }) +} diff --git a/admin-ui/src/api/ai/message.js b/admin-ui/src/api/ai/message.js new file mode 100644 index 0000000..f157280 --- /dev/null +++ b/admin-ui/src/api/ai/message.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询站内信管理列表 +export function listMessage(query) { + return request({ + url: '/ai/message/list', + method: 'get', + params: query + }) +} + +// 查询站内信管理详细 +export function getMessage(id) { + return request({ + url: '/ai/message/' + id, + method: 'get' + }) +} + +// 新增站内信管理 +export function addMessage(data) { + return request({ + url: '/ai/message', + method: 'post', + data: data + }) +} + +// 修改站内信管理 +export function updateMessage(data) { + return request({ + url: '/ai/message', + method: 'put', + data: data + }) +} + +// 删除站内信管理 +export function delMessage(id) { + return request({ + url: '/ai/message/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/order.js b/admin-ui/src/api/ai/order.js new file mode 100644 index 0000000..d54a66b --- /dev/null +++ b/admin-ui/src/api/ai/order.js @@ -0,0 +1,63 @@ +import request from '@/utils/request' + +// 查询订单管理列表 +export function listOrder(query) { + return request({ + url: '/ai/order/list', + method: 'get', + params: query + }) +} + +// 查询订单管理详细 +export function getOrder(id) { + return request({ + url: '/ai/order/' + id, + method: 'get' + }) +} + +// 新增订单管理 +export function addOrder(data) { + return request({ + url: '/ai/order', + method: 'post', + data: data + }) +} + +// 修改订单管理 +export function updateOrder(data) { + return request({ + url: '/ai/order', + method: 'put', + data: data + }) +} + +export function changeIsTop(id, isTop) { + const data = { + id, + isTop + } + return request({ + url: '/ai/order', + method: 'put', + data: data + }) +} + +// 删除订单管理 +export function delOrder(id) { + return request({ + url: '/ai/order/' + id, + method: 'delete' + }) +} + +export function downloadVideo(id) { + return request({ + url: '/api/ai/' + id, + method: 'get' + }) +} diff --git a/admin-ui/src/api/ai/rebateRecord.js b/admin-ui/src/api/ai/rebateRecord.js new file mode 100644 index 0000000..eec35c2 --- /dev/null +++ b/admin-ui/src/api/ai/rebateRecord.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询体验金领取记录列表 +export function listRecord(query) { + return request({ + url: '/ai/rebate-record/list', + method: 'get', + params: query + }) +} + +// 查询体验金领取记录详细 +export function getRecord(id) { + return request({ + url: '/ai/rebate-record/' + id, + method: 'get' + }) +} + +// 新增体验金领取记录 +export function addRecord(data) { + return request({ + url: '/ai/rebate-record', + method: 'post', + data: data + }) +} + +// 修改体验金领取记录 +export function updateRecord(data) { + return request({ + url: '/ai/rebate-record', + method: 'put', + data: data + }) +} + +// 删除体验金领取记录 +export function delRecord(id) { + return request({ + url: '/ai/rebate-record/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/recharge.js b/admin-ui/src/api/ai/recharge.js new file mode 100644 index 0000000..6d4e8d3 --- /dev/null +++ b/admin-ui/src/api/ai/recharge.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询充值管理列表 +export function listRecharge(query) { + return request({ + url: '/ai/recharge/list', + method: 'get', + params: query + }) +} + +// 查询充值管理详细 +export function getRecharge(id) { + return request({ + url: '/ai/recharge/' + id, + method: 'get' + }) +} + +// 新增充值管理 +export function addRecharge(data) { + return request({ + url: '/ai/recharge', + method: 'post', + data: data + }) +} + +// 修改充值管理 +export function updateRecharge(data) { + return request({ + url: '/ai/recharge', + method: 'put', + data: data + }) +} + +// 删除充值管理 +export function delRecharge(id) { + return request({ + url: '/ai/recharge/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/rechargeGiftRecord.js b/admin-ui/src/api/ai/rechargeGiftRecord.js new file mode 100644 index 0000000..af46c8e --- /dev/null +++ b/admin-ui/src/api/ai/rechargeGiftRecord.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询充值赠送记录列表 +export function listRecord(query) { + return request({ + url: '/ai/recharge-gift-record/list', + method: 'get', + params: query + }) +} + +// 查询充值赠送记录详细 +export function getRecord(id) { + return request({ + url: '/ai/recharge-gift-record/' + id, + method: 'get' + }) +} + +// 新增充值赠送记录 +export function addRecord(data) { + return request({ + url: '/ai/recharge-gift-record', + method: 'post', + data: data + }) +} + +// 修改充值赠送记录 +export function updateRecord(data) { + return request({ + url: '/ai/recharge-gift-record', + method: 'put', + data: data + }) +} + +// 删除充值赠送记录 +export function delRecord(id) { + return request({ + url: '/ai/recharge-gift-record/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/sampleAmount.js b/admin-ui/src/api/ai/sampleAmount.js new file mode 100644 index 0000000..849ed0a --- /dev/null +++ b/admin-ui/src/api/ai/sampleAmount.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +// 查询体验金活动管理列表 +export function listAmount(query) { + return request({ + url: '/ai/amount/list', + method: 'get', + params: query + }) +} + +// 查询体验金活动管理详细 +export function getAmount(id) { + return request({ + url: '/ai/amount/' + id, + method: 'get' + }) +} + +// 新增体验金活动管理 +export function addAmount(data) { + return request({ + url: '/ai/amount', + method: 'post', + data: data + }) +} + +// 修改体验金活动管理 +export function updateAmount(data) { + return request({ + url: '/ai/amount', + method: 'put', + data: data + }) +} + +// 删除体验金活动管理 +export function delAmount(id) { + return request({ + url: '/ai/amount/' + id, + method: 'delete' + }) +} + +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/amount/changeUserStatus', + method: 'put', + data: data + }) +} diff --git a/admin-ui/src/api/ai/sampleAmountRecord.js b/admin-ui/src/api/ai/sampleAmountRecord.js new file mode 100644 index 0000000..7a3d519 --- /dev/null +++ b/admin-ui/src/api/ai/sampleAmountRecord.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询体验金领取记录列表 +export function listRecord(query) { + return request({ + url: '/ai/sample-amount-record/list', + method: 'get', + params: query + }) +} + +// 查询体验金领取记录详细 +export function getRecord(id) { + return request({ + url: '/ai/sample-amount-record/' + id, + method: 'get' + }) +} + +// 新增体验金领取记录 +export function addRecord(data) { + return request({ + url: '/ai/sample-amount-record', + method: 'post', + data: data + }) +} + +// 修改体验金领取记录 +export function updateRecord(data) { + return request({ + url: '/ai/sample-amount-record', + method: 'put', + data: data + }) +} + +// 删除体验金领取记录 +export function delRecord(id) { + return request({ + url: '/ai/sample-amount-record/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/service.js b/admin-ui/src/api/ai/service.js new file mode 100644 index 0000000..1ea49fa --- /dev/null +++ b/admin-ui/src/api/ai/service.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +// 查询客服管理列表 +export function listService(query) { + return request({ + url: '/ai/service/list', + method: 'get', + params: query + }) +} + +// 查询客服管理详细 +export function getService(id) { + return request({ + url: '/ai/service/' + id, + method: 'get' + }) +} + +// 新增客服管理 +export function addService(data) { + return request({ + url: '/ai/service', + method: 'post', + data: data + }) +} + +// 修改客服管理 +export function updateService(data) { + return request({ + url: '/ai/service', + method: 'put', + data: data + }) +} + +// 删除客服管理 +export function delService(id) { + return request({ + url: '/ai/service/' + id, + method: 'delete' + }) +} + +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/service', + method: 'put', + data: data + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/ai/statistics.js b/admin-ui/src/api/ai/statistics.js new file mode 100644 index 0000000..dfe479b --- /dev/null +++ b/admin-ui/src/api/ai/statistics.js @@ -0,0 +1,198 @@ +import request from '@/utils/request' + +// 查询ai-统计列表 +export function listStatistics(query) { + return request({ + url: '/ai/statistics/list', + method: 'get', + params: query + }) +} + +// 查询首页头部统计 +export function getTitleTotal() { + return request({ + url: '/ai/statistics/getTitleTotal', + method: 'get' + }) +} +export function getTodayHourlyAddUserWithZero(query) { + return request({ + url: '/ai/statistics/getTodayHourlyAddUserWithZero', + method: 'get', + params: query + }) +} + +export function getWeeklyAddUserCount(query) { + return request({ + url: '/ai/statistics/getWeeklyAddUserCount', + method: 'get', + params: query + }) +} + +export function getMonthlyAddUserCount(query) { + return request({ + url: '/ai/statistics/getMonthlyAddUserCount', + method: 'get', + params: query + }) +} + +export function getMonthlyAddUserCountByRange(query) { + return request({ + url: '/ai/statistics/getMonthlyAddUserCountByRange', + method: 'get', + params: query + }) +} + +// ========================================================================================= + +export function getTodayHourlyRechargeWithZero(query) { + return request({ + url: '/ai/statistics/getTodayHourlyRechargeWithZero', + method: 'get', + params: query + }) +} + +export function getWeeklyRecharge(query) { + return request({ + url: '/ai/statistics/getWeeklyRecharge', + method: 'get', + params: query + }) +} + +export function getMonthlyRecharge(query) { + return request({ + url: '/ai/statistics/getMonthlyRecharge', + method: 'get', + params: query + }) +} + +export function getMonthlyRechargeByRange(query) { + return request({ + url: '/ai/statistics/getMonthlyRechargeByRange', + method: 'get', + params: query + }) +} +// ========================================================================================= + +export function getTodayHourlyVisitorWithZero(query) { + return request({ + url: '/ai/statistics/getTodayHourlyVisitorWithZero', + method: 'get', + params: query + }) +} + +export function getWeeklyVisitor(query) { + return request({ + url: '/ai/statistics/getWeeklyVisitor', + method: 'get', + params: query + }) +} + +export function getMonthlyVisitor(query) { + return request({ + url: '/ai/statistics/getMonthlyVisitor', + method: 'get', + params: query + }) +} + +export function getMonthlyVisitorByRange(query) { + return request({ + url: '/ai/statistics/getMonthlyVisitorByRange', + method: 'get', + params: query + }) +} +// ========================================================================================= + +export function getTodayHourlyGenerateWithZero(query) { + return request({ + url: '/ai/statistics/getTodayHourlyGenerateWithZero', + method: 'get', + params: query + }) +} + +export function getWeeklyGenerate(query) { + return request({ + url: '/ai/statistics/getWeeklyGenerate', + method: 'get', + params: query + }) +} + +export function getMonthlyGenerate(query) { + return request({ + url: '/ai/statistics/getMonthlyGenerate', + method: 'get', + params: query + }) +} + +export function getMonthlyVisitorGenerate(query) { + return request({ + url: '/ai/statistics/getMonthlyVisitorGenerate', + method: 'get', + params: query + }) +} + +export function getMapStatistics(query) { + return request({ + url: '/ai/statistics/getMapStatistics', + method: 'get', + params: query + }) +} + +// 查询ai-统计详细 +export function getStatistics(dateKey) { + return request({ + url: '/ai/statistics/' + dateKey, + method: 'get' + }) +} + +export function getAllSource() { + return request({ + url: '/ai/statistics/getAllSource', + method: 'get' + }) +} + +// 新增ai-统计 +export function addStatistics(data) { + return request({ + url: '/ai/statistics', + method: 'post', + data: data + }) +} + +// 修改ai-统计 +export function updateStatistics(data) { + return request({ + url: '/ai/statistics', + method: 'put', + data: data + }) +} + +// 删除ai-统计 +export function delStatistics(dateKey) { + return request({ + url: '/ai/statistics/' + dateKey, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/tag.js b/admin-ui/src/api/ai/tag.js new file mode 100644 index 0000000..56e6249 --- /dev/null +++ b/admin-ui/src/api/ai/tag.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 查询ai-标签管理列表 +export function listTag(query) { + return request({ + url: '/ai/tag/list', + method: 'get', + params: query + }) +} + +// 查询ai-标签管理详细 +export function getTag(id) { + return request({ + url: '/ai/tag/' + id, + method: 'get' + }) +} + +// 新增ai-标签管理 +export function addTag(data) { + return request({ + url: '/ai/tag', + method: 'post', + data: data + }) +} + +// 修改ai-标签管理 +export function updateTag(data) { + return request({ + url: '/ai/tag', + method: 'put', + data: data + }) +} + + +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/tag', + method: 'put', + data: data + }) +} + +// 删除ai-标签管理 +export function delTag(id) { + return request({ + url: '/ai/tag/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/template.js b/admin-ui/src/api/ai/template.js new file mode 100644 index 0000000..fc66363 --- /dev/null +++ b/admin-ui/src/api/ai/template.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询AI模版列表 +export function listTemplate(query) { + return request({ + url: '/ai/template/list', + method: 'get', + params: query + }) +} + +// 查询AI模版详细 +export function getTemplate(id) { + return request({ + url: '/ai/template/' + id, + method: 'get' + }) +} + +// 新增AI模版 +export function addTemplate(data) { + return request({ + url: '/ai/template', + method: 'post', + data: data + }) +} + +// 修改AI模版 +export function updateTemplate(data) { + return request({ + url: '/ai/template', + method: 'put', + data: data + }) +} + +// 删除AI模版 +export function delTemplate(id) { + return request({ + url: '/ai/template/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/ai/user.js b/admin-ui/src/api/ai/user.js new file mode 100644 index 0000000..93c6cca --- /dev/null +++ b/admin-ui/src/api/ai/user.js @@ -0,0 +1,83 @@ +import request from '@/utils/request' + +// 查询ai-用户信息列表 +export function listUser(query) { + return request({ + url: '/ai/user/list', + method: 'get', + params: query + }) +} + +// 查询ai-用户信息详细 +export function getUser(id) { + return request({ + url: '/ai/user/' + id, + method: 'get' + }) +} + +// 新增ai-用户信息 +export function addUser(data) { + return request({ + url: '/ai/user', + method: 'post', + data: data + }) +} + +// 修改ai-用户信息 +export function updateUser(data) { + return request({ + url: '/ai/user', + method: 'put', + data: data + }) +} + +// 删除ai-用户信息 +export function delUser(id) { + return request({ + url: '/ai/user/' + id, + method: 'delete' + }) +} + +// 用户状态修改 +export function changeUserStatus(id, status) { + const data = { + id, + status + } + return request({ + url: '/ai/user/changeStatus', + method: 'put', + data: data + }) +} + +export function changeBalance(id, balance) { + const data = { + id, + balance + } + return request({ + url: '/ai/user/changeBalance', + method: 'put', + data: data + }) +} + + +// 用户状态修改 +export function updatePassword(id, newPassword) { + const data = { + id, + newPassword + } + return request({ + url: '/ai/user/updatePassword', + method: 'put', + data: data + }) +} diff --git a/admin-ui/src/api/ai/work.js b/admin-ui/src/api/ai/work.js new file mode 100644 index 0000000..3e940c4 --- /dev/null +++ b/admin-ui/src/api/ai/work.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +// 查询ai作品列表 +export function listWork(query) { + return request({ + url: '/ai/work/list', + method: 'get', + params: query + }) +} + +// 查询ai作品详细 +export function getWork(id) { + return request({ + url: '/ai/work/' + id, + method: 'get' + }) +} + +// 新增ai作品 +export function addWork(data) { + return request({ + url: '/ai/work', + method: 'post', + data: data + }) +} + +// 修改ai作品 +export function updateWork(data) { + return request({ + url: '/ai/work', + method: 'put', + data: data + }) +} + +export function changeIsTop(id, isTop) { + const data = { + id, + isTop + } + return request({ + url: '/ai/work', + method: 'put', + data: data + }) +} + +// 删除ai作品 +export function delWork(id) { + return request({ + url: '/ai/work/' + id, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/file/file.js b/admin-ui/src/api/file/file.js new file mode 100644 index 0000000..dc19a71 --- /dev/null +++ b/admin-ui/src/api/file/file.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +export function uploadFile(data) { + return request({ + url: '/common/aws/upload', + method: 'post', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + data: data + }) + } \ No newline at end of file diff --git a/admin-ui/src/api/login.js b/admin-ui/src/api/login.js new file mode 100644 index 0000000..7b7388f --- /dev/null +++ b/admin-ui/src/api/login.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 登录方法 +export function login(username, password, code, uuid) { + const data = { + username, + password, + code, + uuid + } + return request({ + url: '/login', + headers: { + isToken: false, + repeatSubmit: false + }, + method: 'post', + data: data + }) +} + +// 注册方法 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 获取用户详细信息 +export function getInfo() { + return request({ + url: '/getInfo', + method: 'get' + }) +} + +// 退出方法 +export function logout() { + return request({ + url: '/logout', + method: 'post' + }) +} + +// 获取验证码 +export function getCodeImg() { + return request({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/menu.js b/admin-ui/src/api/menu.js new file mode 100644 index 0000000..faef101 --- /dev/null +++ b/admin-ui/src/api/menu.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取路由 +export const getRouters = () => { + return request({ + url: '/getRouters', + method: 'get' + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/monitor/cache.js b/admin-ui/src/api/monitor/cache.js new file mode 100644 index 0000000..72c5f6a --- /dev/null +++ b/admin-ui/src/api/monitor/cache.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 查询缓存详细 +export function getCache() { + return request({ + url: '/monitor/cache', + method: 'get' + }) +} + +// 查询缓存名称列表 +export function listCacheName() { + return request({ + url: '/monitor/cache/getNames', + method: 'get' + }) +} + +// 查询缓存键名列表 +export function listCacheKey(cacheName) { + return request({ + url: '/monitor/cache/getKeys/' + cacheName, + method: 'get' + }) +} + +// 查询缓存内容 +export function getCacheValue(cacheName, cacheKey) { + return request({ + url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, + method: 'get' + }) +} + +// 清理指定名称缓存 +export function clearCacheName(cacheName) { + return request({ + url: '/monitor/cache/clearCacheName/' + cacheName, + method: 'delete' + }) +} + +// 清理指定键名缓存 +export function clearCacheKey(cacheKey) { + return request({ + url: '/monitor/cache/clearCacheKey/' + cacheKey, + method: 'delete' + }) +} + +// 清理全部缓存 +export function clearCacheAll() { + return request({ + url: '/monitor/cache/clearCacheAll', + method: 'delete' + }) +} diff --git a/admin-ui/src/api/monitor/job.js b/admin-ui/src/api/monitor/job.js new file mode 100644 index 0000000..3815569 --- /dev/null +++ b/admin-ui/src/api/monitor/job.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 查询定时任务调度列表 +export function listJob(query) { + return request({ + url: '/monitor/job/list', + method: 'get', + params: query + }) +} + +// 查询定时任务调度详细 +export function getJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'get' + }) +} + +// 新增定时任务调度 +export function addJob(data) { + return request({ + url: '/monitor/job', + method: 'post', + data: data + }) +} + +// 修改定时任务调度 +export function updateJob(data) { + return request({ + url: '/monitor/job', + method: 'put', + data: data + }) +} + +// 删除定时任务调度 +export function delJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'delete' + }) +} + +// 任务状态修改 +export function changeJobStatus(jobId, status) { + const data = { + jobId, + status + } + return request({ + url: '/monitor/job/changeStatus', + method: 'put', + data: data + }) +} + + +// 定时任务立即执行一次 +export function runJob(jobId, jobGroup) { + const data = { + jobId, + jobGroup + } + return request({ + url: '/monitor/job/run', + method: 'put', + data: data + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/monitor/jobLog.js b/admin-ui/src/api/monitor/jobLog.js new file mode 100644 index 0000000..6e0be61 --- /dev/null +++ b/admin-ui/src/api/monitor/jobLog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询调度日志列表 +export function listJobLog(query) { + return request({ + url: '/monitor/jobLog/list', + method: 'get', + params: query + }) +} + +// 删除调度日志 +export function delJobLog(jobLogId) { + return request({ + url: '/monitor/jobLog/' + jobLogId, + method: 'delete' + }) +} + +// 清空调度日志 +export function cleanJobLog() { + return request({ + url: '/monitor/jobLog/clean', + method: 'delete' + }) +} diff --git a/admin-ui/src/api/monitor/logininfor.js b/admin-ui/src/api/monitor/logininfor.js new file mode 100644 index 0000000..4d112b7 --- /dev/null +++ b/admin-ui/src/api/monitor/logininfor.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +// 查询登录日志列表 +export function list(query) { + return request({ + url: '/monitor/logininfor/list', + method: 'get', + params: query + }) +} + +// 删除登录日志 +export function delLogininfor(infoId) { + return request({ + url: '/monitor/logininfor/' + infoId, + method: 'delete' + }) +} + +// 解锁用户登录状态 +export function unlockLogininfor(userName) { + return request({ + url: '/monitor/logininfor/unlock/' + userName, + method: 'get' + }) +} + +// 清空登录日志 +export function cleanLogininfor() { + return request({ + url: '/monitor/logininfor/clean', + method: 'delete' + }) +} diff --git a/admin-ui/src/api/monitor/online.js b/admin-ui/src/api/monitor/online.js new file mode 100644 index 0000000..bd22137 --- /dev/null +++ b/admin-ui/src/api/monitor/online.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 查询在线用户列表 +export function list(query) { + return request({ + url: '/monitor/online/list', + method: 'get', + params: query + }) +} + +// 强退用户 +export function forceLogout(tokenId) { + return request({ + url: '/monitor/online/' + tokenId, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/monitor/operlog.js b/admin-ui/src/api/monitor/operlog.js new file mode 100644 index 0000000..a04bca8 --- /dev/null +++ b/admin-ui/src/api/monitor/operlog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询操作日志列表 +export function list(query) { + return request({ + url: '/monitor/operlog/list', + method: 'get', + params: query + }) +} + +// 删除操作日志 +export function delOperlog(operId) { + return request({ + url: '/monitor/operlog/' + operId, + method: 'delete' + }) +} + +// 清空操作日志 +export function cleanOperlog() { + return request({ + url: '/monitor/operlog/clean', + method: 'delete' + }) +} diff --git a/admin-ui/src/api/monitor/server.js b/admin-ui/src/api/monitor/server.js new file mode 100644 index 0000000..e1f9ca2 --- /dev/null +++ b/admin-ui/src/api/monitor/server.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取服务信息 +export function getServer() { + return request({ + url: '/monitor/server', + method: 'get' + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/system/config.js b/admin-ui/src/api/system/config.js new file mode 100644 index 0000000..a404d82 --- /dev/null +++ b/admin-ui/src/api/system/config.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询参数列表 +export function listConfig(query) { + return request({ + url: '/system/config/list', + method: 'get', + params: query + }) +} + +// 查询参数详细 +export function getConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'get' + }) +} + +// 根据参数键名查询参数值 +export function getConfigKey(configKey) { + return request({ + url: '/system/config/configKey/' + configKey, + method: 'get' + }) +} + +// 新增参数配置 +export function addConfig(data) { + return request({ + url: '/system/config', + method: 'post', + data: data + }) +} + +// 修改参数配置 +export function updateConfig(data) { + return request({ + url: '/system/config', + method: 'put', + data: data + }) +} + +// 删除参数配置 +export function delConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'delete' + }) +} + +// 刷新参数缓存 +export function refreshCache() { + return request({ + url: '/system/config/refreshCache', + method: 'delete' + }) +} diff --git a/admin-ui/src/api/system/dept.js b/admin-ui/src/api/system/dept.js new file mode 100644 index 0000000..fc943cd --- /dev/null +++ b/admin-ui/src/api/system/dept.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 查询部门列表 +export function listDept(query) { + return request({ + url: '/system/dept/list', + method: 'get', + params: query + }) +} + +// 查询部门列表(排除节点) +export function listDeptExcludeChild(deptId) { + return request({ + url: '/system/dept/list/exclude/' + deptId, + method: 'get' + }) +} + +// 查询部门详细 +export function getDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'get' + }) +} + +// 新增部门 +export function addDept(data) { + return request({ + url: '/system/dept', + method: 'post', + data: data + }) +} + +// 修改部门 +export function updateDept(data) { + return request({ + url: '/system/dept', + method: 'put', + data: data + }) +} + +// 删除部门 +export function delDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/system/dict/data.js b/admin-ui/src/api/system/dict/data.js new file mode 100644 index 0000000..26f71db --- /dev/null +++ b/admin-ui/src/api/system/dict/data.js @@ -0,0 +1,61 @@ +import request from '@/utils/request' + +// 查询字典数据列表 +export function listData(query) { + return request({ + url: '/system/dict/data/list', + method: 'get', + params: query + }) +} + +// 查询字典数据详细 +export function getData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'get' + }) +} + +// 根据字典类型查询字典数据信息 +export function getDicts(dictType) { + return request({ + url: '/system/dict/data/type/' + dictType, + method: 'get' + }) +} + +// 新增字典数据 +export function addData(data) { + return request({ + url: '/system/dict/data', + method: 'post', + data: data + }) +} + +// 修改字典数据 +export function updateData(data) { + return request({ + url: '/system/dict/data', + method: 'put', + data: data + }) +} + +// 修改字典数据 +export function updateDictDatas(data) { + return request({ + url: '/system/dict/data/updateDictDatas', + method: 'put', + data: data + }) +} + +// 删除字典数据 +export function delData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/system/dict/type.js b/admin-ui/src/api/system/dict/type.js new file mode 100644 index 0000000..a7a6e01 --- /dev/null +++ b/admin-ui/src/api/system/dict/type.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询字典类型列表 +export function listType(query) { + return request({ + url: '/system/dict/type/list', + method: 'get', + params: query + }) +} + +// 查询字典类型详细 +export function getType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'get' + }) +} + +// 新增字典类型 +export function addType(data) { + return request({ + url: '/system/dict/type', + method: 'post', + data: data + }) +} + +// 修改字典类型 +export function updateType(data) { + return request({ + url: '/system/dict/type', + method: 'put', + data: data + }) +} + +// 删除字典类型 +export function delType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'delete' + }) +} + +// 刷新字典缓存 +export function refreshCache() { + return request({ + url: '/system/dict/type/refreshCache', + method: 'delete' + }) +} + +// 获取字典选择框列表 +export function optionselect() { + return request({ + url: '/system/dict/type/optionselect', + method: 'get' + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/system/menu.js b/admin-ui/src/api/system/menu.js new file mode 100644 index 0000000..f6415c6 --- /dev/null +++ b/admin-ui/src/api/system/menu.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询菜单列表 +export function listMenu(query) { + return request({ + url: '/system/menu/list', + method: 'get', + params: query + }) +} + +// 查询菜单详细 +export function getMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'get' + }) +} + +// 查询菜单下拉树结构 +export function treeselect() { + return request({ + url: '/system/menu/treeselect', + method: 'get' + }) +} + +// 根据角色ID查询菜单下拉树结构 +export function roleMenuTreeselect(roleId) { + return request({ + url: '/system/menu/roleMenuTreeselect/' + roleId, + method: 'get' + }) +} + +// 新增菜单 +export function addMenu(data) { + return request({ + url: '/system/menu', + method: 'post', + data: data + }) +} + +// 修改菜单 +export function updateMenu(data) { + return request({ + url: '/system/menu', + method: 'put', + data: data + }) +} + +// 删除菜单 +export function delMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/system/notice.js b/admin-ui/src/api/system/notice.js new file mode 100644 index 0000000..c274ea5 --- /dev/null +++ b/admin-ui/src/api/system/notice.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询公告列表 +export function listNotice(query) { + return request({ + url: '/system/notice/list', + method: 'get', + params: query + }) +} + +// 查询公告详细 +export function getNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'get' + }) +} + +// 新增公告 +export function addNotice(data) { + return request({ + url: '/system/notice', + method: 'post', + data: data + }) +} + +// 修改公告 +export function updateNotice(data) { + return request({ + url: '/system/notice', + method: 'put', + data: data + }) +} + +// 删除公告 +export function delNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/admin-ui/src/api/system/post.js b/admin-ui/src/api/system/post.js new file mode 100644 index 0000000..1a8e9ca --- /dev/null +++ b/admin-ui/src/api/system/post.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询岗位列表 +export function listPost(query) { + return request({ + url: '/system/post/list', + method: 'get', + params: query + }) +} + +// 查询岗位详细 +export function getPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'get' + }) +} + +// 新增岗位 +export function addPost(data) { + return request({ + url: '/system/post', + method: 'post', + data: data + }) +} + +// 修改岗位 +export function updatePost(data) { + return request({ + url: '/system/post', + method: 'put', + data: data + }) +} + +// 删除岗位 +export function delPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'delete' + }) +} diff --git a/admin-ui/src/api/system/role.js b/admin-ui/src/api/system/role.js new file mode 100644 index 0000000..f13e6f4 --- /dev/null +++ b/admin-ui/src/api/system/role.js @@ -0,0 +1,119 @@ +import request from '@/utils/request' + +// 查询角色列表 +export function listRole(query) { + return request({ + url: '/system/role/list', + method: 'get', + params: query + }) +} + +// 查询角色详细 +export function getRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'get' + }) +} + +// 新增角色 +export function addRole(data) { + return request({ + url: '/system/role', + method: 'post', + data: data + }) +} + +// 修改角色 +export function updateRole(data) { + return request({ + url: '/system/role', + method: 'put', + data: data + }) +} + +// 角色数据权限 +export function dataScope(data) { + return request({ + url: '/system/role/dataScope', + method: 'put', + data: data + }) +} + +// 角色状态修改 +export function changeRoleStatus(roleId, status) { + const data = { + roleId, + status + } + return request({ + url: '/system/role/changeStatus', + method: 'put', + data: data + }) +} + +// 删除角色 +export function delRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'delete' + }) +} + +// 查询角色已授权用户列表 +export function allocatedUserList(query) { + return request({ + url: '/system/role/authUser/allocatedList', + method: 'get', + params: query + }) +} + +// 查询角色未授权用户列表 +export function unallocatedUserList(query) { + return request({ + url: '/system/role/authUser/unallocatedList', + method: 'get', + params: query + }) +} + +// 取消用户授权角色 +export function authUserCancel(data) { + return request({ + url: '/system/role/authUser/cancel', + method: 'put', + data: data + }) +} + +// 批量取消用户授权角色 +export function authUserCancelAll(data) { + return request({ + url: '/system/role/authUser/cancelAll', + method: 'put', + params: data + }) +} + +// 授权用户选择 +export function authUserSelectAll(data) { + return request({ + url: '/system/role/authUser/selectAll', + method: 'put', + params: data + }) +} + +// 根据角色ID查询部门树结构 +export function deptTreeSelect(roleId) { + return request({ + url: '/system/role/deptTree/' + roleId, + method: 'get' + }) +} diff --git a/admin-ui/src/api/system/user.js b/admin-ui/src/api/system/user.js new file mode 100644 index 0000000..b5e3edd --- /dev/null +++ b/admin-ui/src/api/system/user.js @@ -0,0 +1,136 @@ +import request from '@/utils/request' +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 查询用户列表 +export function listUser(query) { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }) +} + +// 查询用户详细 +export function getUser(userId) { + return request({ + url: '/system/user/' + parseStrEmpty(userId), + method: 'get' + }) +} + +// 新增用户 +export function addUser(data) { + return request({ + url: '/system/user', + method: 'post', + data: data + }) +} + +// 修改用户 +export function updateUser(data) { + return request({ + url: '/system/user', + method: 'put', + data: data + }) +} + +// 删除用户 +export function delUser(userId) { + return request({ + url: '/system/user/' + userId, + method: 'delete' + }) +} + +// 用户密码重置 +export function resetUserPwd(userId, password) { + const data = { + userId, + password + } + return request({ + url: '/system/user/resetPwd', + method: 'put', + data: data + }) +} + +// 用户状态修改 +export function changeUserStatus(userId, status) { + const data = { + userId, + status + } + return request({ + url: '/system/user/changeStatus', + method: 'put', + data: data + }) +} + +// 查询用户个人信息 +export function getUserProfile() { + return request({ + url: '/system/user/profile', + method: 'get' + }) +} + +// 修改用户个人信息 +export function updateUserProfile(data) { + return request({ + url: '/system/user/profile', + method: 'put', + data: data + }) +} + +// 用户密码重置 +export function updateUserPwd(oldPassword, newPassword) { + const data = { + oldPassword, + newPassword + } + return request({ + url: '/system/user/profile/updatePwd', + method: 'put', + data: data + }) +} + +// 用户头像上传 +export function uploadAvatar(data) { + return request({ + url: '/system/user/profile/avatar', + method: 'post', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + data: data + }) +} + +// 查询授权角色 +export function getAuthRole(userId) { + return request({ + url: '/system/user/authRole/' + userId, + method: 'get' + }) +} + +// 保存授权角色 +export function updateAuthRole(data) { + return request({ + url: '/system/user/authRole', + method: 'put', + params: data + }) +} + +// 查询部门下拉树结构 +export function deptTreeSelect() { + return request({ + url: '/system/user/deptTree', + method: 'get' + }) +} diff --git a/admin-ui/src/api/tool/gen.js b/admin-ui/src/api/tool/gen.js new file mode 100644 index 0000000..2075677 --- /dev/null +++ b/admin-ui/src/api/tool/gen.js @@ -0,0 +1,85 @@ +import request from '@/utils/request' + +// 查询生成表数据 +export function listTable(query) { + return request({ + url: '/tool/gen/list', + method: 'get', + params: query + }) +} +// 查询db数据库列表 +export function listDbTable(query) { + return request({ + url: '/tool/gen/db/list', + method: 'get', + params: query + }) +} + +// 查询表详细信息 +export function getGenTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'get' + }) +} + +// 修改代码生成信息 +export function updateGenTable(data) { + return request({ + url: '/tool/gen', + method: 'put', + data: data + }) +} + +// 导入表 +export function importTable(data) { + return request({ + url: '/tool/gen/importTable', + method: 'post', + params: data + }) +} + +// 创建表 +export function createTable(data) { + return request({ + url: '/tool/gen/createTable', + method: 'post', + params: data + }) +} + +// 预览生成代码 +export function previewTable(tableId) { + return request({ + url: '/tool/gen/preview/' + tableId, + method: 'get' + }) +} + +// 删除表数据 +export function delTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'delete' + }) +} + +// 生成代码(自定义路径) +export function genCode(tableName) { + return request({ + url: '/tool/gen/genCode/' + tableName, + method: 'get' + }) +} + +// 同步数据库 +export function synchDb(tableName) { + return request({ + url: '/tool/gen/synchDb/' + tableName, + method: 'get' + }) +} diff --git a/admin-ui/src/assets/401_images/401.gif b/admin-ui/src/assets/401_images/401.gif new file mode 100644 index 0000000..cd6e0d9 Binary files /dev/null and b/admin-ui/src/assets/401_images/401.gif differ diff --git a/admin-ui/src/assets/404_images/404.png b/admin-ui/src/assets/404_images/404.png new file mode 100644 index 0000000..3d8e230 Binary files /dev/null and b/admin-ui/src/assets/404_images/404.png differ diff --git a/admin-ui/src/assets/404_images/404_cloud.png b/admin-ui/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000..c6281d0 Binary files /dev/null and b/admin-ui/src/assets/404_images/404_cloud.png differ diff --git a/admin-ui/src/assets/icons/index.js b/admin-ui/src/assets/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/admin-ui/src/assets/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/admin-ui/src/assets/icons/svg/404.svg b/admin-ui/src/assets/icons/svg/404.svg new file mode 100644 index 0000000..6df5019 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/bug.svg b/admin-ui/src/assets/icons/svg/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/admin-ui/src/assets/icons/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/build.svg b/admin-ui/src/assets/icons/svg/build.svg new file mode 100644 index 0000000..df50fa0 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/build.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/button.svg b/admin-ui/src/assets/icons/svg/button.svg new file mode 100644 index 0000000..b6c7cc0 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/button.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/cascader.svg b/admin-ui/src/assets/icons/svg/cascader.svg new file mode 100644 index 0000000..bd68954 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/cascader.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/chart.svg b/admin-ui/src/assets/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/admin-ui/src/assets/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/checkbox.svg b/admin-ui/src/assets/icons/svg/checkbox.svg new file mode 100644 index 0000000..aed629d --- /dev/null +++ b/admin-ui/src/assets/icons/svg/checkbox.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/clipboard.svg b/admin-ui/src/assets/icons/svg/clipboard.svg new file mode 100644 index 0000000..90923ff --- /dev/null +++ b/admin-ui/src/assets/icons/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/code.svg b/admin-ui/src/assets/icons/svg/code.svg new file mode 100644 index 0000000..a951b3b --- /dev/null +++ b/admin-ui/src/assets/icons/svg/code.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/color.svg b/admin-ui/src/assets/icons/svg/color.svg new file mode 100644 index 0000000..8b3f86a --- /dev/null +++ b/admin-ui/src/assets/icons/svg/color.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/component.svg b/admin-ui/src/assets/icons/svg/component.svg new file mode 100644 index 0000000..6db5b80 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/component.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/dashboard.svg b/admin-ui/src/assets/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/date-range.svg b/admin-ui/src/assets/icons/svg/date-range.svg new file mode 100644 index 0000000..d3080ee --- /dev/null +++ b/admin-ui/src/assets/icons/svg/date-range.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/date.svg b/admin-ui/src/assets/icons/svg/date.svg new file mode 100644 index 0000000..9ff2dea --- /dev/null +++ b/admin-ui/src/assets/icons/svg/date.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/dict.svg b/admin-ui/src/assets/icons/svg/dict.svg new file mode 100644 index 0000000..7e40a53 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/dict.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/documentation.svg b/admin-ui/src/assets/icons/svg/documentation.svg new file mode 100644 index 0000000..7043122 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/download.svg b/admin-ui/src/assets/icons/svg/download.svg new file mode 100644 index 0000000..f40ad45 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/download.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/drag.svg b/admin-ui/src/assets/icons/svg/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/admin-ui/src/assets/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/druid.svg b/admin-ui/src/assets/icons/svg/druid.svg new file mode 100644 index 0000000..ea95efd --- /dev/null +++ b/admin-ui/src/assets/icons/svg/druid.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/edit.svg b/admin-ui/src/assets/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/admin-ui/src/assets/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/education.svg b/admin-ui/src/assets/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/admin-ui/src/assets/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/email.svg b/admin-ui/src/assets/icons/svg/email.svg new file mode 100644 index 0000000..74d25e2 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/enter.svg b/admin-ui/src/assets/icons/svg/enter.svg new file mode 100644 index 0000000..c9c4eaa --- /dev/null +++ b/admin-ui/src/assets/icons/svg/enter.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/example.svg b/admin-ui/src/assets/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/excel.svg b/admin-ui/src/assets/icons/svg/excel.svg new file mode 100644 index 0000000..74d97b8 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/exit-fullscreen.svg b/admin-ui/src/assets/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/eye-open.svg b/admin-ui/src/assets/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/eye.svg b/admin-ui/src/assets/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/form.svg b/admin-ui/src/assets/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/fullscreen.svg b/admin-ui/src/assets/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/admin-ui/src/assets/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/github.svg b/admin-ui/src/assets/icons/svg/github.svg new file mode 100644 index 0000000..ed7b6ae --- /dev/null +++ b/admin-ui/src/assets/icons/svg/github.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/guide.svg b/admin-ui/src/assets/icons/svg/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/icon.svg b/admin-ui/src/assets/icons/svg/icon.svg new file mode 100644 index 0000000..82be8ee --- /dev/null +++ b/admin-ui/src/assets/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/input.svg b/admin-ui/src/assets/icons/svg/input.svg new file mode 100644 index 0000000..01fcfab --- /dev/null +++ b/admin-ui/src/assets/icons/svg/input.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/international.svg b/admin-ui/src/assets/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/admin-ui/src/assets/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/job.svg b/admin-ui/src/assets/icons/svg/job.svg new file mode 100644 index 0000000..96caee8 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/job.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/language.svg b/admin-ui/src/assets/icons/svg/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/link.svg b/admin-ui/src/assets/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/admin-ui/src/assets/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/list.svg b/admin-ui/src/assets/icons/svg/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/admin-ui/src/assets/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/lock.svg b/admin-ui/src/assets/icons/svg/lock.svg new file mode 100644 index 0000000..74fee54 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/log.svg b/admin-ui/src/assets/icons/svg/log.svg new file mode 100644 index 0000000..0bc3742 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/log.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/logininfor.svg b/admin-ui/src/assets/icons/svg/logininfor.svg new file mode 100644 index 0000000..53076d1 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/logininfor.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/message.svg b/admin-ui/src/assets/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/money.svg b/admin-ui/src/assets/icons/svg/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/admin-ui/src/assets/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/monitor.svg b/admin-ui/src/assets/icons/svg/monitor.svg new file mode 100644 index 0000000..c688f4f --- /dev/null +++ b/admin-ui/src/assets/icons/svg/monitor.svg @@ -0,0 +1,2 @@ + diff --git a/admin-ui/src/assets/icons/svg/more-up.svg b/admin-ui/src/assets/icons/svg/more-up.svg new file mode 100644 index 0000000..6b6b88f --- /dev/null +++ b/admin-ui/src/assets/icons/svg/more-up.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/nested.svg b/admin-ui/src/assets/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/number.svg b/admin-ui/src/assets/icons/svg/number.svg new file mode 100644 index 0000000..9b9bbdf --- /dev/null +++ b/admin-ui/src/assets/icons/svg/number.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/online.svg b/admin-ui/src/assets/icons/svg/online.svg new file mode 100644 index 0000000..9e3e124 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/online.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/password.svg b/admin-ui/src/assets/icons/svg/password.svg new file mode 100644 index 0000000..9df95c8 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/password.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/pdf.svg b/admin-ui/src/assets/icons/svg/pdf.svg new file mode 100644 index 0000000..957aa0c --- /dev/null +++ b/admin-ui/src/assets/icons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/people.svg b/admin-ui/src/assets/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/admin-ui/src/assets/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/peoples.svg b/admin-ui/src/assets/icons/svg/peoples.svg new file mode 100644 index 0000000..aab852e --- /dev/null +++ b/admin-ui/src/assets/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/phone.svg b/admin-ui/src/assets/icons/svg/phone.svg new file mode 100644 index 0000000..55c9ada --- /dev/null +++ b/admin-ui/src/assets/icons/svg/phone.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/post.svg b/admin-ui/src/assets/icons/svg/post.svg new file mode 100644 index 0000000..068c286 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/post.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/qq.svg b/admin-ui/src/assets/icons/svg/qq.svg new file mode 100644 index 0000000..ee13d4e --- /dev/null +++ b/admin-ui/src/assets/icons/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/question.svg b/admin-ui/src/assets/icons/svg/question.svg new file mode 100644 index 0000000..64b4501 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/question.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/radio.svg b/admin-ui/src/assets/icons/svg/radio.svg new file mode 100644 index 0000000..4d8a3fc --- /dev/null +++ b/admin-ui/src/assets/icons/svg/radio.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/rate.svg b/admin-ui/src/assets/icons/svg/rate.svg new file mode 100644 index 0000000..2ff2587 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/rate.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/redis-list.svg b/admin-ui/src/assets/icons/svg/redis-list.svg new file mode 100644 index 0000000..11ea340 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/redis-list.svg @@ -0,0 +1,2 @@ + diff --git a/admin-ui/src/assets/icons/svg/redis.svg b/admin-ui/src/assets/icons/svg/redis.svg new file mode 100644 index 0000000..d321520 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/redis.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/row.svg b/admin-ui/src/assets/icons/svg/row.svg new file mode 100644 index 0000000..1aee520 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/row.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/search.svg b/admin-ui/src/assets/icons/svg/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/admin-ui/src/assets/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/select.svg b/admin-ui/src/assets/icons/svg/select.svg new file mode 100644 index 0000000..1138495 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/select.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/server.svg b/admin-ui/src/assets/icons/svg/server.svg new file mode 100644 index 0000000..774dc40 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/server.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/shopping.svg b/admin-ui/src/assets/icons/svg/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/size.svg b/admin-ui/src/assets/icons/svg/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/skill.svg b/admin-ui/src/assets/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/slider.svg b/admin-ui/src/assets/icons/svg/slider.svg new file mode 100644 index 0000000..a7df892 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/slider.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/star.svg b/admin-ui/src/assets/icons/svg/star.svg new file mode 100644 index 0000000..6cf86e6 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/swagger.svg b/admin-ui/src/assets/icons/svg/swagger.svg new file mode 100644 index 0000000..367d4d1 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/swagger.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/switch.svg b/admin-ui/src/assets/icons/svg/switch.svg new file mode 100644 index 0000000..232713a --- /dev/null +++ b/admin-ui/src/assets/icons/svg/switch.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/system.svg b/admin-ui/src/assets/icons/svg/system.svg new file mode 100644 index 0000000..4be6094 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/system.svg @@ -0,0 +1,2 @@ + diff --git a/admin-ui/src/assets/icons/svg/tab.svg b/admin-ui/src/assets/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/table.svg b/admin-ui/src/assets/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/admin-ui/src/assets/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/textarea.svg b/admin-ui/src/assets/icons/svg/textarea.svg new file mode 100644 index 0000000..6b1ffc0 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/textarea.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/theme.svg b/admin-ui/src/assets/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/admin-ui/src/assets/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/time-range.svg b/admin-ui/src/assets/icons/svg/time-range.svg new file mode 100644 index 0000000..333437b --- /dev/null +++ b/admin-ui/src/assets/icons/svg/time-range.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/time.svg b/admin-ui/src/assets/icons/svg/time.svg new file mode 100644 index 0000000..355c82a --- /dev/null +++ b/admin-ui/src/assets/icons/svg/time.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/tool.svg b/admin-ui/src/assets/icons/svg/tool.svg new file mode 100644 index 0000000..a5fa552 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/tool.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/tree-table.svg b/admin-ui/src/assets/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/tree.svg b/admin-ui/src/assets/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/admin-ui/src/assets/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/upload.svg b/admin-ui/src/assets/icons/svg/upload.svg new file mode 100644 index 0000000..80fef66 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/upload.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/user.svg b/admin-ui/src/assets/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/validCode.svg b/admin-ui/src/assets/icons/svg/validCode.svg new file mode 100644 index 0000000..6136ca5 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/validCode.svg @@ -0,0 +1 @@ + diff --git a/admin-ui/src/assets/icons/svg/wechat.svg b/admin-ui/src/assets/icons/svg/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svg/zip.svg b/admin-ui/src/assets/icons/svg/zip.svg new file mode 100644 index 0000000..f806fc4 --- /dev/null +++ b/admin-ui/src/assets/icons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin-ui/src/assets/icons/svgo.yml b/admin-ui/src/assets/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/admin-ui/src/assets/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/admin-ui/src/assets/images/dark.svg b/admin-ui/src/assets/images/dark.svg new file mode 100644 index 0000000..f646bd7 --- /dev/null +++ b/admin-ui/src/assets/images/dark.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin-ui/src/assets/images/light.svg b/admin-ui/src/assets/images/light.svg new file mode 100644 index 0000000..ab7cc08 --- /dev/null +++ b/admin-ui/src/assets/images/light.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin-ui/src/assets/images/login-background.jpg b/admin-ui/src/assets/images/login-background.jpg new file mode 100644 index 0000000..8a89eb8 Binary files /dev/null and b/admin-ui/src/assets/images/login-background.jpg differ diff --git a/admin-ui/src/assets/images/pay.png b/admin-ui/src/assets/images/pay.png new file mode 100644 index 0000000..bb8b967 Binary files /dev/null and b/admin-ui/src/assets/images/pay.png differ diff --git a/admin-ui/src/assets/images/profile.jpg b/admin-ui/src/assets/images/profile.jpg new file mode 100644 index 0000000..b3a940b Binary files /dev/null and b/admin-ui/src/assets/images/profile.jpg differ diff --git a/admin-ui/src/assets/logo/logo.png b/admin-ui/src/assets/logo/logo.png new file mode 100644 index 0000000..e263760 Binary files /dev/null and b/admin-ui/src/assets/logo/logo.png differ diff --git a/admin-ui/src/assets/styles/btn.scss b/admin-ui/src/assets/styles/btn.scss new file mode 100644 index 0000000..e6ba1a8 --- /dev/null +++ b/admin-ui/src/assets/styles/btn.scss @@ -0,0 +1,99 @@ +@import './variables.scss'; + +@mixin colorBtn($color) { + background: $color; + + &:hover { + color: $color; + + &:before, + &:after { + background: $color; + } + } +} + +.blue-btn { + @include colorBtn($blue) +} + +.light-blue-btn { + @include colorBtn($light-blue) +} + +.red-btn { + @include colorBtn($red) +} + +.pink-btn { + @include colorBtn($pink) +} + +.green-btn { + @include colorBtn($green) +} + +.tiffany-btn { + @include colorBtn($tiffany) +} + +.yellow-btn { + @include colorBtn($yellow) +} + +.pan-btn { + font-size: 14px; + color: #fff; + padding: 14px 36px; + border-radius: 8px; + border: none; + outline: none; + transition: 600ms ease all; + position: relative; + display: inline-block; + + &:hover { + background: #fff; + + &:before, + &:after { + width: 100%; + transition: 600ms ease all; + } + } + + &:before, + &:after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 2px; + width: 0; + transition: 400ms ease all; + } + + &::after { + right: inherit; + top: inherit; + left: 0; + bottom: 0; + } +} + +.custom-button { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + color: #fff; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: 0; + margin: 0; + padding: 10px 15px; + font-size: 14px; + border-radius: 4px; +} diff --git a/admin-ui/src/assets/styles/element-ui.scss b/admin-ui/src/assets/styles/element-ui.scss new file mode 100644 index 0000000..363092a --- /dev/null +++ b/admin-ui/src/assets/styles/element-ui.scss @@ -0,0 +1,92 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + +.cell { + .el-tag { + margin-right: 0px; + } +} + +.small-padding { + .cell { + padding-left: 5px; + padding-right: 5px; + } +} + +.fixed-width { + .el-button--mini { + padding: 7px 10px; + width: 60px; + } +} + +.status-col { + .cell { + padding: 0 10px; + text-align: center; + + .el-tag { + margin-right: 0px; + } + } +} + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// fix date-picker ui bug in filter-item +.el-range-editor.el-input__inner { + display: inline-flex !important; +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} + +.el-menu--collapse + > div + > .el-submenu + > .el-submenu__title + .el-submenu__icon-arrow { + display: none; +} \ No newline at end of file diff --git a/admin-ui/src/assets/styles/element-variables.scss b/admin-ui/src/assets/styles/element-variables.scss new file mode 100644 index 0000000..1615ff2 --- /dev/null +++ b/admin-ui/src/assets/styles/element-variables.scss @@ -0,0 +1,31 @@ +/** +* I think element-ui's default theme color is too light for long-term use. +* So I modified the default color and you can modify it to your liking. +**/ + +/* theme color */ +$--color-primary: #1890ff; +$--color-success: #13ce66; +$--color-warning: #ffba00; +$--color-danger: #ff4949; +// $--color-info: #1E1E1E; + +$--button-font-weight: 400; + +// $--color-text-regular: #1f2d3d; + +$--border-color-light: #dfe4ed; +$--border-color-lighter: #e6ebf5; + +$--table-border: 1px solid #dfe6ec; + +/* icon font path, required */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + theme: $--color-primary; +} diff --git a/admin-ui/src/assets/styles/index.scss b/admin-ui/src/assets/styles/index.scss new file mode 100644 index 0000000..bb87292 --- /dev/null +++ b/admin-ui/src/assets/styles/index.scss @@ -0,0 +1,178 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; +@import './btn.scss'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0px !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } + } +} + +//main-container全局样式 +.app-container { + padding: 20px; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.text-center { + text-align: center +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } +} + +.filter-container { + padding-bottom: 10px; + + .filter-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + } +} diff --git a/admin-ui/src/assets/styles/mixin.scss b/admin-ui/src/assets/styles/mixin.scss new file mode 100644 index 0000000..06fa061 --- /dev/null +++ b/admin-ui/src/assets/styles/mixin.scss @@ -0,0 +1,66 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } + + @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/admin-ui/src/assets/styles/ruoyi.scss b/admin-ui/src/assets/styles/ruoyi.scss new file mode 100644 index 0000000..ab4a1d2 --- /dev/null +++ b/admin-ui/src/assets/styles/ruoyi.scss @@ -0,0 +1,287 @@ +/** +* 通用css样式布局处理 +* Copyright (c) 2019 ruoyi +*/ + +/** 基础通用 **/ +.pt5 { + padding-top: 5px; +} + +.pr5 { + padding-right: 5px; +} + +.pb5 { + padding-bottom: 5px; +} + +.mt5 { + margin-top: 5px; +} + +.mr5 { + margin-right: 5px; +} + +.mb5 { + margin-bottom: 5px; +} + +.mb8 { + margin-bottom: 8px; +} + +.ml5 { + margin-left: 5px; +} + +.mt10 { + margin-top: 10px; +} + +.mr10 { + margin-right: 10px; +} + +.mb10 { + margin-bottom: 10px; +} +.ml10 { + margin-left: 10px; +} + +.mt20 { + margin-top: 20px; +} + +.mr20 { + margin-right: 20px; +} + +.mb20 { + margin-bottom: 20px; +} +.ml20 { + margin-left: 20px; +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +.el-message-box__status + .el-message-box__message{ + word-break: break-word; +} + +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; +} + +.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; +} + +.el-table { + .el-table__header-wrapper, .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9; + color: #515a6e; + height: 40px; + font-size: 13px; + } + } + + .el-table__body-wrapper { + .el-button [class*="el-icon-"] + span { + margin-left: 1px; + } + } +} + +/** 表单布局 **/ +.form-header { + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 8px 10px 25px 10px; + padding-bottom: 5px +} + +/** 表格布局 **/ +.pagination-container { + display: flex; + justify-content: flex-end; + margin-top: 20px; +} + +/* tree border */ +.tree-border { + margin-top: 5px; + border: 1px solid #e5e6e7; + background: #FFFFFF none; + border-radius: 4px; +} + +@media (max-width: 768px) { + .pagination-container .el-pagination > .el-pagination__jump { + display: none !important; + } + .pagination-container .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-table .fixed-width .el-button--mini { + padding-left: 0; + padding-right: 0; + width: inherit; +} + +/** 表格更多操作下拉样式 */ +.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine { + cursor: pointer; + margin-left: 5px; +} + +.el-table .el-dropdown, .el-icon-arrow-down { + font-size: 12px; +} + +.el-tree-node__content > .el-checkbox { + margin-right: 8px; +} + +.list-group-striped > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} + +.list-group { + padding-left: 0px; + list-style: none; +} + +.list-group-item { + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; +} + +.pull-right { + float: right !important; +} + +.el-card__header { + padding: 14px 15px 7px; + min-height: 40px; +} + +.el-card__body { + padding: 15px 20px 20px 20px; +} + +.card-box { + margin-bottom: 10px; +} + +/* button color */ +.el-button--cyan.is-active, +.el-button--cyan:active { + background: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +.el-button--cyan:focus, +.el-button--cyan:hover { + background: #48D1CC; + border-color: #48D1CC; + color: #FFFFFF; +} + +.el-button--cyan { + background-color: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +/* text color */ +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +/* image */ +.img-circle { + border-radius: 50%; +} + +.img-lg { + width: 120px; + height: 120px; +} + +.avatar-upload-preview { + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; +} + +/* 拖拽列样式 */ +.sortable-ghost { + opacity: .8; + color: #fff !important; + background: #42b983 !important; +} + +.top-right-btn { + position: relative; + float: right; +} + +/* 分割面板样式 */ +.splitpanes.default-theme .splitpanes__pane { + background-color: #fff!important; +} diff --git a/admin-ui/src/assets/styles/sidebar.scss b/admin-ui/src/assets/styles/sidebar.scss new file mode 100644 index 0000000..7858af3 --- /dev/null +++ b/admin-ui/src/assets/styles/sidebar.scss @@ -0,0 +1,228 @@ +#app { + + .main-container { + height: 100%; + transition: margin-left .28s; + margin-left: $base-sidebar-width; + position: relative; + } + + .sidebarHide { + margin-left: 0!important; + } + + .sidebar-container { + -webkit-transition: width .28s; + transition: width 0.28s; + width: $base-sidebar-width !important; + background-color: $base-menu-background; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); + box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1); + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + height: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + .el-menu-item, .el-submenu__title { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .is-active > .el-submenu__title { + color: $base-menu-color-active !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $base-sidebar-width !important; + + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .nest-menu .el-submenu>.el-submenu__title, + & .theme-dark .el-submenu .el-menu-item { + background-color: $base-sub-menu-background !important; + + &:hover { + background-color: $base-sub-menu-hover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $base-sidebar-width !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $base-sidebar-width !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$base-sidebar-width, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/admin-ui/src/assets/styles/transition.scss b/admin-ui/src/assets/styles/transition.scss new file mode 100644 index 0000000..073f8c6 --- /dev/null +++ b/admin-ui/src/assets/styles/transition.scss @@ -0,0 +1,49 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform--move, +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/admin-ui/src/assets/styles/variables.scss b/admin-ui/src/assets/styles/variables.scss new file mode 100644 index 0000000..34484d4 --- /dev/null +++ b/admin-ui/src/assets/styles/variables.scss @@ -0,0 +1,54 @@ +// base color +$blue:#324157; +$light-blue:#3A71A8; +$red:#C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow:#FEC171; +$panGreen: #30B08F; + +// 默认菜单主题风格 +$base-menu-color:#bfcbd9; +$base-menu-color-active:#f4f4f5; +$base-menu-background:#304156; +$base-logo-title-color: #ffffff; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#1f2d3d; +$base-sub-menu-hover:#001528; + +// 自定义暗色菜单风格 +/** +$base-menu-color:hsla(0,0%,100%,.65); +$base-menu-color-active:#fff; +$base-menu-background:#001529; +$base-logo-title-color: #ffffff; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#000c17; +$base-sub-menu-hover:#001528; +*/ + +$base-sidebar-width: 200px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuColor: $base-menu-color; + menuLightColor: $base-menu-light-color; + menuColorActive: $base-menu-color-active; + menuBackground: $base-menu-background; + menuLightBackground: $base-menu-light-background; + subMenuBackground: $base-sub-menu-background; + subMenuHover: $base-sub-menu-hover; + sideBarWidth: $base-sidebar-width; + logoTitleColor: $base-logo-title-color; + logoLightTitleColor: $base-logo-light-title-color +} diff --git a/admin-ui/src/components/Breadcrumb/index.vue b/admin-ui/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..080595a --- /dev/null +++ b/admin-ui/src/components/Breadcrumb/index.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/admin-ui/src/components/Charts/generateStatistics.vue b/admin-ui/src/components/Charts/generateStatistics.vue new file mode 100644 index 0000000..eb72df1 --- /dev/null +++ b/admin-ui/src/components/Charts/generateStatistics.vue @@ -0,0 +1,413 @@ + + + + + \ No newline at end of file diff --git a/admin-ui/src/components/Charts/rechargeStatistics.vue b/admin-ui/src/components/Charts/rechargeStatistics.vue new file mode 100644 index 0000000..c27b9af --- /dev/null +++ b/admin-ui/src/components/Charts/rechargeStatistics.vue @@ -0,0 +1,413 @@ + + + + + diff --git a/admin-ui/src/components/Charts/topRightChart.vue b/admin-ui/src/components/Charts/topRightChart.vue new file mode 100644 index 0000000..258e8af --- /dev/null +++ b/admin-ui/src/components/Charts/topRightChart.vue @@ -0,0 +1,413 @@ + + + + + diff --git a/admin-ui/src/components/Charts/visitorStatistics.vue b/admin-ui/src/components/Charts/visitorStatistics.vue new file mode 100644 index 0000000..568d1c3 --- /dev/null +++ b/admin-ui/src/components/Charts/visitorStatistics.vue @@ -0,0 +1,413 @@ + + + + + \ No newline at end of file diff --git a/admin-ui/src/components/Crontab/day.vue b/admin-ui/src/components/Crontab/day.vue new file mode 100644 index 0000000..d3faed7 --- /dev/null +++ b/admin-ui/src/components/Crontab/day.vue @@ -0,0 +1,161 @@ + + + diff --git a/admin-ui/src/components/Crontab/hour.vue b/admin-ui/src/components/Crontab/hour.vue new file mode 100644 index 0000000..5659bfb --- /dev/null +++ b/admin-ui/src/components/Crontab/hour.vue @@ -0,0 +1,120 @@ + + + diff --git a/admin-ui/src/components/Crontab/index.vue b/admin-ui/src/components/Crontab/index.vue new file mode 100644 index 0000000..395f615 --- /dev/null +++ b/admin-ui/src/components/Crontab/index.vue @@ -0,0 +1,430 @@ + + + + diff --git a/admin-ui/src/components/Crontab/min.vue b/admin-ui/src/components/Crontab/min.vue new file mode 100644 index 0000000..ec56a44 --- /dev/null +++ b/admin-ui/src/components/Crontab/min.vue @@ -0,0 +1,116 @@ + + + \ No newline at end of file diff --git a/admin-ui/src/components/Crontab/month.vue b/admin-ui/src/components/Crontab/month.vue new file mode 100644 index 0000000..da60132 --- /dev/null +++ b/admin-ui/src/components/Crontab/month.vue @@ -0,0 +1,114 @@ + + + diff --git a/admin-ui/src/components/Crontab/result.vue b/admin-ui/src/components/Crontab/result.vue new file mode 100644 index 0000000..4e2952d --- /dev/null +++ b/admin-ui/src/components/Crontab/result.vue @@ -0,0 +1,558 @@ + + + diff --git a/admin-ui/src/components/Crontab/second.vue b/admin-ui/src/components/Crontab/second.vue new file mode 100644 index 0000000..9201e06 --- /dev/null +++ b/admin-ui/src/components/Crontab/second.vue @@ -0,0 +1,117 @@ + + + diff --git a/admin-ui/src/components/Crontab/week.vue b/admin-ui/src/components/Crontab/week.vue new file mode 100644 index 0000000..75c42ed --- /dev/null +++ b/admin-ui/src/components/Crontab/week.vue @@ -0,0 +1,202 @@ + + + diff --git a/admin-ui/src/components/Crontab/year.vue b/admin-ui/src/components/Crontab/year.vue new file mode 100644 index 0000000..8c18c78 --- /dev/null +++ b/admin-ui/src/components/Crontab/year.vue @@ -0,0 +1,131 @@ + + + diff --git a/admin-ui/src/components/DictData/index.js b/admin-ui/src/components/DictData/index.js new file mode 100644 index 0000000..7b85d4a --- /dev/null +++ b/admin-ui/src/components/DictData/index.js @@ -0,0 +1,49 @@ +import Vue from 'vue' +import store from '@/store' +import DataDict from '@/utils/dict' +import { getDicts as getDicts } from '@/api/system/dict/data' + +function searchDictByKey(dict, key) { + if (key == null && key == "") { + return null + } + try { + for (let i = 0; i < dict.length; i++) { + if (dict[i].key == key) { + return dict[i].value + } + } + } catch (e) { + return null + } +} + +function install() { + Vue.use(DataDict, { + metas: { + '*': { + labelField: 'dictLabel', + valueField: 'dictValue', + request(dictMeta) { + const storeDict = searchDictByKey(store.getters.dict, dictMeta.type) + if (storeDict) { + return new Promise(resolve => { resolve(storeDict) }) + } else { + return new Promise((resolve, reject) => { + getDicts(dictMeta.type).then(res => { + store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data }) + resolve(res.data) + }).catch(error => { + reject(error) + }) + }) + } + }, + }, + }, + }) +} + +export default { + install, +} \ No newline at end of file diff --git a/admin-ui/src/components/DictTag/index.vue b/admin-ui/src/components/DictTag/index.vue new file mode 100644 index 0000000..73dcf91 --- /dev/null +++ b/admin-ui/src/components/DictTag/index.vue @@ -0,0 +1,89 @@ + + + + diff --git a/admin-ui/src/components/Editor/index.vue b/admin-ui/src/components/Editor/index.vue new file mode 100644 index 0000000..2ade468 --- /dev/null +++ b/admin-ui/src/components/Editor/index.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/admin-ui/src/components/FileUpload/index.vue b/admin-ui/src/components/FileUpload/index.vue new file mode 100644 index 0000000..19585a1 --- /dev/null +++ b/admin-ui/src/components/FileUpload/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/admin-ui/src/components/Hamburger/index.vue b/admin-ui/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/admin-ui/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/admin-ui/src/components/HeaderSearch/index.vue b/admin-ui/src/components/HeaderSearch/index.vue new file mode 100644 index 0000000..a936bdf --- /dev/null +++ b/admin-ui/src/components/HeaderSearch/index.vue @@ -0,0 +1,264 @@ + + + + + + diff --git a/admin-ui/src/components/IconSelect/index.vue b/admin-ui/src/components/IconSelect/index.vue new file mode 100644 index 0000000..8dadc02 --- /dev/null +++ b/admin-ui/src/components/IconSelect/index.vue @@ -0,0 +1,104 @@ + + + + + + diff --git a/admin-ui/src/components/IconSelect/requireIcons.js b/admin-ui/src/components/IconSelect/requireIcons.js new file mode 100644 index 0000000..99e5c54 --- /dev/null +++ b/admin-ui/src/components/IconSelect/requireIcons.js @@ -0,0 +1,11 @@ + +const req = require.context('../../assets/icons/svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys() + +const re = /\.\/(.*)\.svg/ + +const icons = requireAll(req).map(i => { + return i.match(re)[1] +}) + +export default icons diff --git a/admin-ui/src/components/ImagePreview/index.vue b/admin-ui/src/components/ImagePreview/index.vue new file mode 100644 index 0000000..8b4738b --- /dev/null +++ b/admin-ui/src/components/ImagePreview/index.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/admin-ui/src/components/ImageUpload/index.vue b/admin-ui/src/components/ImageUpload/index.vue new file mode 100644 index 0000000..f502d92 --- /dev/null +++ b/admin-ui/src/components/ImageUpload/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/admin-ui/src/components/Pagination/index.vue b/admin-ui/src/components/Pagination/index.vue new file mode 100644 index 0000000..08ac487 --- /dev/null +++ b/admin-ui/src/components/Pagination/index.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/admin-ui/src/components/PanThumb/index.vue b/admin-ui/src/components/PanThumb/index.vue new file mode 100644 index 0000000..b24e026 --- /dev/null +++ b/admin-ui/src/components/PanThumb/index.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/admin-ui/src/components/ParentView/index.vue b/admin-ui/src/components/ParentView/index.vue new file mode 100644 index 0000000..7bf6148 --- /dev/null +++ b/admin-ui/src/components/ParentView/index.vue @@ -0,0 +1,3 @@ + diff --git a/admin-ui/src/components/RightToolbar/index.vue b/admin-ui/src/components/RightToolbar/index.vue new file mode 100644 index 0000000..7865214 --- /dev/null +++ b/admin-ui/src/components/RightToolbar/index.vue @@ -0,0 +1,154 @@ + + + diff --git a/admin-ui/src/components/RuoYi/Doc/index.vue b/admin-ui/src/components/RuoYi/Doc/index.vue new file mode 100644 index 0000000..75fa864 --- /dev/null +++ b/admin-ui/src/components/RuoYi/Doc/index.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/admin-ui/src/components/RuoYi/Git/index.vue b/admin-ui/src/components/RuoYi/Git/index.vue new file mode 100644 index 0000000..bdafbae --- /dev/null +++ b/admin-ui/src/components/RuoYi/Git/index.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/admin-ui/src/components/Screenfull/index.vue b/admin-ui/src/components/Screenfull/index.vue new file mode 100644 index 0000000..d4e539c --- /dev/null +++ b/admin-ui/src/components/Screenfull/index.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/admin-ui/src/components/SizeSelect/index.vue b/admin-ui/src/components/SizeSelect/index.vue new file mode 100644 index 0000000..e513948 --- /dev/null +++ b/admin-ui/src/components/SizeSelect/index.vue @@ -0,0 +1,55 @@ + + + diff --git a/admin-ui/src/components/SvgIcon/index.vue b/admin-ui/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..e4bf5ad --- /dev/null +++ b/admin-ui/src/components/SvgIcon/index.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/admin-ui/src/components/ThemePicker/index.vue b/admin-ui/src/components/ThemePicker/index.vue new file mode 100644 index 0000000..a69ee45 --- /dev/null +++ b/admin-ui/src/components/ThemePicker/index.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/admin-ui/src/components/TopNav/index.vue b/admin-ui/src/components/TopNav/index.vue new file mode 100644 index 0000000..b3f3331 --- /dev/null +++ b/admin-ui/src/components/TopNav/index.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/admin-ui/src/components/iFrame/index.vue b/admin-ui/src/components/iFrame/index.vue new file mode 100644 index 0000000..f4334f3 --- /dev/null +++ b/admin-ui/src/components/iFrame/index.vue @@ -0,0 +1,36 @@ + + + diff --git a/admin-ui/src/layout/components/Navbar.vue b/admin-ui/src/layout/components/Navbar.vue new file mode 100644 index 0000000..00e7430 --- /dev/null +++ b/admin-ui/src/layout/components/Navbar.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/admin-ui/src/layout/components/Settings/index.vue b/admin-ui/src/layout/components/Settings/index.vue new file mode 100644 index 0000000..1023f7f --- /dev/null +++ b/admin-ui/src/layout/components/Settings/index.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/admin-ui/src/layout/components/Sidebar/FixiOSBug.js b/admin-ui/src/layout/components/Sidebar/FixiOSBug.js new file mode 100644 index 0000000..6823726 --- /dev/null +++ b/admin-ui/src/layout/components/Sidebar/FixiOSBug.js @@ -0,0 +1,25 @@ +export default { + computed: { + device() { + return this.$store.state.app.device + } + }, + mounted() { + // In order to fix the click on menu on the ios device will trigger the mouseleave bug + this.fixBugIniOS() + }, + methods: { + fixBugIniOS() { + const $subMenu = this.$refs.subMenu + if ($subMenu) { + const handleMouseleave = $subMenu.handleMouseleave + $subMenu.handleMouseleave = (e) => { + if (this.device === 'mobile') { + return + } + handleMouseleave(e) + } + } + } + } +} diff --git a/admin-ui/src/layout/components/Sidebar/Item.vue b/admin-ui/src/layout/components/Sidebar/Item.vue new file mode 100644 index 0000000..be3285d --- /dev/null +++ b/admin-ui/src/layout/components/Sidebar/Item.vue @@ -0,0 +1,33 @@ + diff --git a/admin-ui/src/layout/components/Sidebar/Link.vue b/admin-ui/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..8b0bc93 --- /dev/null +++ b/admin-ui/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,43 @@ + + + diff --git a/admin-ui/src/layout/components/Sidebar/Logo.vue b/admin-ui/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..4ec53eb --- /dev/null +++ b/admin-ui/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/admin-ui/src/layout/components/Sidebar/SidebarItem.vue b/admin-ui/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..bddb65f --- /dev/null +++ b/admin-ui/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,99 @@ + + + diff --git a/admin-ui/src/layout/components/Sidebar/index.vue b/admin-ui/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..cd86ea6 --- /dev/null +++ b/admin-ui/src/layout/components/Sidebar/index.vue @@ -0,0 +1,57 @@ + + + diff --git a/admin-ui/src/layout/components/TagsView/ScrollPane.vue b/admin-ui/src/layout/components/TagsView/ScrollPane.vue new file mode 100644 index 0000000..bb753a1 --- /dev/null +++ b/admin-ui/src/layout/components/TagsView/ScrollPane.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/admin-ui/src/layout/components/TagsView/index.vue b/admin-ui/src/layout/components/TagsView/index.vue new file mode 100644 index 0000000..f0b0837 --- /dev/null +++ b/admin-ui/src/layout/components/TagsView/index.vue @@ -0,0 +1,337 @@ + + + + + + + diff --git a/admin-ui/src/layout/components/index.js b/admin-ui/src/layout/components/index.js new file mode 100644 index 0000000..104bd3a --- /dev/null +++ b/admin-ui/src/layout/components/index.js @@ -0,0 +1,5 @@ +export { default as AppMain } from './AppMain' +export { default as Navbar } from './Navbar' +export { default as Settings } from './Settings' +export { default as Sidebar } from './Sidebar/index.vue' +export { default as TagsView } from './TagsView/index.vue' diff --git a/admin-ui/src/layout/index.vue b/admin-ui/src/layout/index.vue new file mode 100644 index 0000000..05e2fa9 --- /dev/null +++ b/admin-ui/src/layout/index.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/admin-ui/src/layout/mixin/ResizeHandler.js b/admin-ui/src/layout/mixin/ResizeHandler.js new file mode 100644 index 0000000..e8d0df8 --- /dev/null +++ b/admin-ui/src/layout/mixin/ResizeHandler.js @@ -0,0 +1,45 @@ +import store from '@/store' + +const { body } = document +const WIDTH = 992 // refer to Bootstrap's responsive design + +export default { + watch: { + $route(route) { + if (this.device === 'mobile' && this.sidebar.opened) { + store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } + } + }, + beforeMount() { + window.addEventListener('resize', this.$_resizeHandler) + }, + beforeDestroy() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + mounted() { + const isMobile = this.$_isMobile() + if (isMobile) { + store.dispatch('app/toggleDevice', 'mobile') + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_isMobile() { + const rect = body.getBoundingClientRect() + return rect.width - 1 < WIDTH + }, + $_resizeHandler() { + if (!document.hidden) { + const isMobile = this.$_isMobile() + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') + + if (isMobile) { + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + } + } + } +} diff --git a/admin-ui/src/main.js b/admin-ui/src/main.js new file mode 100644 index 0000000..da01750 --- /dev/null +++ b/admin-ui/src/main.js @@ -0,0 +1,83 @@ +import Vue from 'vue' + +import Cookies from 'js-cookie' + +import Element from 'element-ui' +import './assets/styles/element-variables.scss' + +import '@/assets/styles/index.scss' // global css +import '@/assets/styles/ruoyi.scss' // ruoyi css +import App from './App' +import store from './store' +import router from './router' +import directive from './directive' // directive +import plugins from './plugins' // plugins +import { download } from '@/utils/request' + +import './assets/icons' // icon +import './permission' // permission control +import { getDicts } from "@/api/system/dict/data" +import { getConfigKey } from "@/api/system/config" +import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi" +// 分页组件 +import Pagination from "@/components/Pagination" +// 自定义表格工具组件 +import RightToolbar from "@/components/RightToolbar" +// 富文本组件 +import Editor from "@/components/Editor" +// 文件上传组件 +import FileUpload from "@/components/FileUpload" +// 图片上传组件 +import ImageUpload from "@/components/ImageUpload" +// 图片预览组件 +import ImagePreview from "@/components/ImagePreview" +// 字典标签组件 +import DictTag from '@/components/DictTag' +// 字典数据组件 +import DictData from '@/components/DictData' + +// 全局方法挂载 +Vue.prototype.getDicts = getDicts +Vue.prototype.getConfigKey = getConfigKey +Vue.prototype.parseTime = parseTime +Vue.prototype.resetForm = resetForm +Vue.prototype.addDateRange = addDateRange +Vue.prototype.selectDictLabel = selectDictLabel +Vue.prototype.selectDictLabels = selectDictLabels +Vue.prototype.download = download +Vue.prototype.handleTree = handleTree + +// 全局组件挂载 +Vue.component('DictTag', DictTag) +Vue.component('Pagination', Pagination) +Vue.component('RightToolbar', RightToolbar) +Vue.component('Editor', Editor) +Vue.component('FileUpload', FileUpload) +Vue.component('ImageUpload', ImageUpload) +Vue.component('ImagePreview', ImagePreview) + +Vue.use(directive) +Vue.use(plugins) +DictData.install() + +/** + * If you don't want to use mock-server + * you want to use MockJs for mock api + * you can execute: mockXHR() + * + * Currently MockJs will be used in the production environment, + * please remove it before going online! ! ! + */ + +Vue.use(Element, { + size: Cookies.get('size') || 'medium' // set element-ui default size +}) + +Vue.config.productionTip = false + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/admin-ui/src/permission.js b/admin-ui/src/permission.js new file mode 100644 index 0000000..b66190b --- /dev/null +++ b/admin-ui/src/permission.js @@ -0,0 +1,63 @@ +import router from './router' +import store from './store' +import { Message } from 'element-ui' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import { getToken } from '@/utils/auth' +import { isPathMatch } from '@/utils/validate' +import { isRelogin } from '@/utils/request' + +NProgress.configure({ showSpinner: false }) + +const whiteList = ['/login', '/register'] + +const isWhiteList = (path) => { + return whiteList.some(pattern => isPathMatch(pattern, path)) +} + +router.beforeEach((to, from, next) => { + NProgress.start() + if (getToken()) { + to.meta.title && store.dispatch('settings/setTitle', to.meta.title) + /* has token*/ + if (to.path === '/login') { + next({ path: '/' }) + NProgress.done() + } else if (isWhiteList(to.path)) { + next() + } else { + if (store.getters.roles.length === 0) { + isRelogin.show = true + // 判断当前用户是否已拉取完user_info信息 + store.dispatch('GetInfo').then(() => { + isRelogin.show = false + store.dispatch('GenerateRoutes').then(accessRoutes => { + // 根据roles权限生成可访问的路由表 + router.addRoutes(accessRoutes) // 动态添加可访问路由表 + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + }) + }).catch(err => { + store.dispatch('LogOut').then(() => { + Message.error(err) + next({ path: '/' }) + }) + }) + } else { + next() + } + } + } else { + // 没有token + if (isWhiteList(to.path)) { + // 在免登录白名单,直接进入 + next() + } else { + next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页 + NProgress.done() + } + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/admin-ui/src/plugins/auth.js b/admin-ui/src/plugins/auth.js new file mode 100644 index 0000000..3b91c14 --- /dev/null +++ b/admin-ui/src/plugins/auth.js @@ -0,0 +1,60 @@ +import store from '@/store' + +function authPermission(permission) { + const all_permission = "*:*:*" + const permissions = store.getters && store.getters.permissions + if (permission && permission.length > 0) { + return permissions.some(v => { + return all_permission === v || v === permission + }) + } else { + return false + } +} + +function authRole(role) { + const super_admin = "admin" + const roles = store.getters && store.getters.roles + if (role && role.length > 0) { + return roles.some(v => { + return super_admin === v || v === role + }) + } else { + return false + } +} + +export default { + // 验证用户是否具备某权限 + hasPermi(permission) { + return authPermission(permission) + }, + // 验证用户是否含有指定权限,只需包含其中一个 + hasPermiOr(permissions) { + return permissions.some(item => { + return authPermission(item) + }) + }, + // 验证用户是否含有指定权限,必须全部拥有 + hasPermiAnd(permissions) { + return permissions.every(item => { + return authPermission(item) + }) + }, + // 验证用户是否具备某角色 + hasRole(role) { + return authRole(role) + }, + // 验证用户是否含有指定角色,只需包含其中一个 + hasRoleOr(roles) { + return roles.some(item => { + return authRole(item) + }) + }, + // 验证用户是否含有指定角色,必须全部拥有 + hasRoleAnd(roles) { + return roles.every(item => { + return authRole(item) + }) + } +} diff --git a/admin-ui/src/plugins/cache.js b/admin-ui/src/plugins/cache.js new file mode 100644 index 0000000..ea8a53f --- /dev/null +++ b/admin-ui/src/plugins/cache.js @@ -0,0 +1,79 @@ +const sessionCache = { + set (key, value) { + if (!sessionStorage) { + return + } + if (key != null && value != null) { + sessionStorage.setItem(key, value) + } + }, + get (key) { + if (!sessionStorage) { + return null + } + if (key == null) { + return null + } + return sessionStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + return null + }, + remove (key) { + sessionStorage.removeItem(key) + } +} +const localCache = { + set (key, value) { + if (!localStorage) { + return + } + if (key != null && value != null) { + localStorage.setItem(key, value) + } + }, + get (key) { + if (!localStorage) { + return null + } + if (key == null) { + return null + } + return localStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + return null + }, + remove (key) { + localStorage.removeItem(key) + } +} + +export default { + /** + * 会话级缓存 + */ + session: sessionCache, + /** + * 本地缓存 + */ + local: localCache +} diff --git a/admin-ui/src/plugins/download.js b/admin-ui/src/plugins/download.js new file mode 100644 index 0000000..8dc83ea --- /dev/null +++ b/admin-ui/src/plugins/download.js @@ -0,0 +1,79 @@ +import axios from 'axios' +import {Loading, Message} from 'element-ui' +import { saveAs } from 'file-saver' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { blobValidate } from "@/utils/ruoyi" + +const baseURL = process.env.VUE_APP_BASE_API +let downloadLoadingInstance + +export default { + name(name, isDelete = true) { + var url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + resource(resource) { + var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource) + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + zip(url, name) { + var url = baseURL + url + downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data], { type: 'application/zip' }) + this.saveAs(blob, name) + } else { + this.printErrMsg(res.data) + } + downloadLoadingInstance.close() + }).catch((r) => { + console.error(r) + Message.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) + }, + saveAs(text, name, opts) { + saveAs(text, name, opts) + }, + async printErrMsg(data) { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + Message.error(errMsg) + } +} + diff --git a/admin-ui/src/plugins/index.js b/admin-ui/src/plugins/index.js new file mode 100644 index 0000000..d000f2d --- /dev/null +++ b/admin-ui/src/plugins/index.js @@ -0,0 +1,20 @@ +import tab from './tab' +import auth from './auth' +import cache from './cache' +import modal from './modal' +import download from './download' + +export default { + install(Vue) { + // 页签操作 + Vue.prototype.$tab = tab + // 认证对象 + Vue.prototype.$auth = auth + // 缓存对象 + Vue.prototype.$cache = cache + // 模态框对象 + Vue.prototype.$modal = modal + // 下载文件 + Vue.prototype.$download = download + } +} diff --git a/admin-ui/src/plugins/modal.js b/admin-ui/src/plugins/modal.js new file mode 100644 index 0000000..92bc1ef --- /dev/null +++ b/admin-ui/src/plugins/modal.js @@ -0,0 +1,83 @@ +import { Message, MessageBox, Notification, Loading } from 'element-ui' + +let loadingInstance + +export default { + // 消息提示 + msg(content) { + Message.info(content) + }, + // 错误消息 + msgError(content) { + Message.error(content) + }, + // 成功消息 + msgSuccess(content) { + Message.success(content) + }, + // 警告消息 + msgWarning(content) { + Message.warning(content) + }, + // 弹出提示 + alert(content) { + MessageBox.alert(content, "系统提示") + }, + // 错误提示 + alertError(content) { + MessageBox.alert(content, "系统提示", { type: 'error' }) + }, + // 成功提示 + alertSuccess(content) { + MessageBox.alert(content, "系统提示", { type: 'success' }) + }, + // 警告提示 + alertWarning(content) { + MessageBox.alert(content, "系统提示", { type: 'warning' }) + }, + // 通知提示 + notify(content) { + Notification.info(content) + }, + // 错误通知 + notifyError(content) { + Notification.error(content) + }, + // 成功通知 + notifySuccess(content) { + Notification.success(content) + }, + // 警告通知 + notifyWarning(content) { + Notification.warning(content) + }, + // 确认窗体 + confirm(content) { + return MessageBox.confirm(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 提交内容 + prompt(content) { + return MessageBox.prompt(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 打开遮罩层 + loading(content) { + loadingInstance = Loading.service({ + lock: true, + text: content, + spinner: "el-icon-loading", + background: "rgba(0, 0, 0, 0.7)", + }) + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close() + } +} diff --git a/admin-ui/src/plugins/tab.js b/admin-ui/src/plugins/tab.js new file mode 100644 index 0000000..f21467d --- /dev/null +++ b/admin-ui/src/plugins/tab.js @@ -0,0 +1,71 @@ +import store from '@/store' +import router from '@/router' + +export default { + // 刷新当前tab页签 + refreshPage(obj) { + const { path, query, matched } = router.currentRoute + if (obj === undefined) { + matched.forEach((m) => { + if (m.components && m.components.default && m.components.default.name) { + if (!['Layout', 'ParentView'].includes(m.components.default.name)) { + obj = { name: m.components.default.name, path: path, query: query } + } + } + }) + } + return store.dispatch('tagsView/delCachedView', obj).then(() => { + const { path, query } = obj + router.replace({ + path: '/redirect' + path, + query: query + }) + }) + }, + // 关闭当前tab页签,打开新页签 + closeOpenPage(obj) { + store.dispatch("tagsView/delView", router.currentRoute) + if (obj !== undefined) { + return router.push(obj) + } + }, + // 关闭指定tab页签 + closePage(obj) { + if (obj === undefined) { + return store.dispatch('tagsView/delView', router.currentRoute).then(({ visitedViews }) => { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + return router.push(latestView.fullPath) + } + return router.push('/') + }) + } + return store.dispatch('tagsView/delView', obj) + }, + // 关闭所有tab页签 + closeAllPage() { + return store.dispatch('tagsView/delAllViews') + }, + // 关闭左侧tab页签 + closeLeftPage(obj) { + return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute) + }, + // 关闭右侧tab页签 + closeRightPage(obj) { + return store.dispatch('tagsView/delRightTags', obj || router.currentRoute) + }, + // 关闭其他tab页签 + closeOtherPage(obj) { + return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute) + }, + // 添加tab页签 + openPage(title, url, params) { + const obj = { path: url, meta: { title: title } } + store.dispatch('tagsView/addView', obj) + return router.push({ path: url, query: params }) + }, + // 修改tab页签 + updatePage(obj) { + return store.dispatch('tagsView/updateVisitedView', obj) + } +} diff --git a/admin-ui/src/router/index.js b/admin-ui/src/router/index.js new file mode 100644 index 0000000..93bda76 --- /dev/null +++ b/admin-ui/src/router/index.js @@ -0,0 +1,197 @@ +import Vue from 'vue' +import Router from 'vue-router' + +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' + +/** + * Note: 路由配置项 + * + * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 + * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 + * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 + * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 + * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 + * roles: ['admin', 'common'] // 访问路由的角色权限 + * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 + * meta : { + noCache: true // 如果设置为true,则不会被 缓存(默认 false) + title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 + icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg + breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 + activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 + } + */ + +// 公共路由 +export const constantRoutes = [ + { + path: '/redirect', + component: Layout, + hidden: true, + children: [ + { + path: '/redirect/:path(.*)', + component: () => import('@/views/redirect') + } + ] + }, + { + path: '/login', + component: () => import('@/views/login'), + hidden: true + }, + { + path: '/register', + component: () => import('@/views/register'), + hidden: true + }, + { + path: '/404', + component: () => import('@/views/error/404'), + hidden: true + }, + { + path: '/401', + component: () => import('@/views/error/401'), + hidden: true + }, + { + path: '', + component: Layout, + redirect: 'index', + children: [ + { + path: 'index', + component: () => import('@/views/index'), + name: 'Index', + meta: { title: '首页', icon: 'dashboard', affix: true } + } + ] + }, + { + path: '/user', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'profile', + component: () => import('@/views/system/user/profile/index'), + name: 'Profile', + meta: { title: '个人中心', icon: 'user' } + } + ] + } +] + +// 动态路由,基于用户权限动态去加载 +export const dynamicRoutes = [ + { + path: '/system/user-auth', + component: Layout, + hidden: true, + permissions: ['system:user:edit'], + children: [ + { + path: 'role/:userId(\\d+)', + component: () => import('@/views/system/user/authRole'), + name: 'AuthRole', + meta: { title: '分配角色', activeMenu: '/system/user' } + } + ] + }, + { + path: '/system/role-auth', + component: Layout, + hidden: true, + permissions: ['system:role:edit'], + children: [ + { + path: 'user/:roleId(\\d+)', + component: () => import('@/views/system/role/authUser'), + name: 'AuthUser', + meta: { title: '分配用户', activeMenu: '/system/role' } + } + ] + }, + { + path: '/ai-manager/ai-tag', + component: Layout, + hidden: true, + permissions: ['ai:manager:edit'], + children: [ + { + path: 'ai/:aiId(\\d+)', + component: () => import('@/views/ai/manager/tag/index'), + name: 'AiTag', + meta: { title: '标签管理', activeMenu: '/ai-manager/aiManager' } + } + ] + }, + { + path: '/system/dict-data', + component: Layout, + hidden: true, + permissions: ['system:dict:list'], + children: [ + { + path: 'index/:dictId(\\d+)', + component: () => import('@/views/system/dict/data'), + name: 'Data', + meta: { title: '字典数据', activeMenu: '/system/dict' } + } + ] + }, + { + path: '/monitor/job-log', + component: Layout, + hidden: true, + permissions: ['monitor:job:list'], + children: [ + { + path: 'index/:jobId(\\d+)', + component: () => import('@/views/monitor/job/log'), + name: 'JobLog', + meta: { title: '调度日志', activeMenu: '/monitor/job' } + } + ] + }, + { + path: '/tool/gen-edit', + component: Layout, + hidden: true, + permissions: ['tool:gen:edit'], + children: [ + { + path: 'index/:tableId(\\d+)', + component: () => import('@/views/tool/gen/editTable'), + name: 'GenEdit', + meta: { title: '修改生成配置', activeMenu: '/tool/gen' } + } + ] + } +] + +// 防止连续点击多次路由报错 +let routerPush = Router.prototype.push +let routerReplace = Router.prototype.replace +// push +Router.prototype.push = function push(location) { + return routerPush.call(this, location).catch(err => err) +} +// replace +Router.prototype.replace = function push(location) { + return routerReplace.call(this, location).catch(err => err) +} + +export default new Router({ + mode: 'history', // 去掉url中的# + scrollBehavior: () => ({ y: 0 }), + routes: constantRoutes +}) diff --git a/admin-ui/src/settings.js b/admin-ui/src/settings.js new file mode 100644 index 0000000..b655774 --- /dev/null +++ b/admin-ui/src/settings.js @@ -0,0 +1,56 @@ +module.exports = { + /** + * 网页标题 + */ + title: process.env.VUE_APP_TITLE, + + /** + * 侧边栏主题 深色主题theme-dark,浅色主题theme-light + */ + sideTheme: 'theme-light', + + /** + * 系统布局配置 + */ + showSettings: true, + + /** + * 是否显示顶部导航 + */ + topNav: true, + + /** + * 是否显示 tagsView + */ + tagsView: true, + + /** + * 显示页签图标 + */ + tagsIcon: false, + + /** + * 是否固定头部 + */ + fixedHeader: false, + + /** + * 是否显示logo + */ + sidebarLogo: true, + + /** + * 是否显示动态标题 + */ + dynamicTitle: false, + + /** + * 是否显示底部版权 + */ + footerVisible: false, + + /** + * 底部版权文本内容 + */ + footerContent: 'Copyright © 2018-2025 xxx. All Rights Reserved.' +} diff --git a/admin-ui/src/store/getters.js b/admin-ui/src/store/getters.js new file mode 100644 index 0000000..3680f95 --- /dev/null +++ b/admin-ui/src/store/getters.js @@ -0,0 +1,21 @@ +const getters = { + sidebar: state => state.app.sidebar, + size: state => state.app.size, + device: state => state.app.device, + dict: state => state.dict.dict, + visitedViews: state => state.tagsView.visitedViews, + cachedViews: state => state.tagsView.cachedViews, + token: state => state.user.token, + avatar: state => state.user.avatar, + id: state => state.user.id, + name: state => state.user.name, + nickName: state => state.user.nickName, + introduction: state => state.user.introduction, + roles: state => state.user.roles, + permissions: state => state.user.permissions, + permission_routes: state => state.permission.routes, + topbarRouters: state => state.permission.topbarRouters, + defaultRoutes: state => state.permission.defaultRoutes, + sidebarRouters: state => state.permission.sidebarRouters +} +export default getters diff --git a/admin-ui/src/store/index.js b/admin-ui/src/store/index.js new file mode 100644 index 0000000..97aaef8 --- /dev/null +++ b/admin-ui/src/store/index.js @@ -0,0 +1,25 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import app from './modules/app' +import dict from './modules/dict' +import user from './modules/user' +import tagsView from './modules/tagsView' +import permission from './modules/permission' +import settings from './modules/settings' +import getters from './getters' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app, + dict, + user, + tagsView, + permission, + settings + }, + getters +}) + +export default store diff --git a/admin-ui/src/store/modules/app.js b/admin-ui/src/store/modules/app.js new file mode 100644 index 0000000..9f99f39 --- /dev/null +++ b/admin-ui/src/store/modules/app.js @@ -0,0 +1,66 @@ +import Cookies from 'js-cookie' + +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false, + hide: false + }, + device: 'desktop', + size: Cookies.get('size') || 'medium' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + if (state.sidebar.hide) { + return false + } + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { + Cookies.set('sidebarStatus', 0) + } + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + }, + SET_SIZE: (state, size) => { + state.size = size + Cookies.set('size', size) + }, + SET_SIDEBAR_HIDE: (state, status) => { + state.sidebar.hide = status + } +} + +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + }, + setSize({ commit }, size) { + commit('SET_SIZE', size) + }, + toggleSideBarHide({ commit }, status) { + commit('SET_SIDEBAR_HIDE', status) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/admin-ui/src/store/modules/dict.js b/admin-ui/src/store/modules/dict.js new file mode 100644 index 0000000..7a1b2f0 --- /dev/null +++ b/admin-ui/src/store/modules/dict.js @@ -0,0 +1,50 @@ +const state = { + dict: new Array() +} +const mutations = { + SET_DICT: (state, { key, value }) => { + if (key !== null && key !== "") { + state.dict.push({ + key: key, + value: value + }) + } + }, + REMOVE_DICT: (state, key) => { + try { + for (let i = 0; i < state.dict.length; i++) { + if (state.dict[i].key == key) { + state.dict.splice(i, 1) + return true + } + } + } catch (e) { + } + }, + CLEAN_DICT: (state) => { + state.dict = new Array() + } +} + +const actions = { + // 设置字典 + setDict({ commit }, data) { + commit('SET_DICT', data) + }, + // 删除字典 + removeDict({ commit }, key) { + commit('REMOVE_DICT', key) + }, + // 清空字典 + cleanDict({ commit }) { + commit('CLEAN_DICT') + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/admin-ui/src/store/modules/permission.js b/admin-ui/src/store/modules/permission.js new file mode 100644 index 0000000..b549ef0 --- /dev/null +++ b/admin-ui/src/store/modules/permission.js @@ -0,0 +1,122 @@ +import auth from '@/plugins/auth' +import router, { constantRoutes, dynamicRoutes } from '@/router' +import { getRouters } from '@/api/menu' +import Layout from '@/layout/index' +import ParentView from '@/components/ParentView' +import InnerLink from '@/layout/components/InnerLink' + +const permission = { + state: { + routes: [], + addRoutes: [], + defaultRoutes: [], + topbarRouters: [], + sidebarRouters: [] + }, + mutations: { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) + }, + SET_DEFAULT_ROUTES: (state, routes) => { + state.defaultRoutes = constantRoutes.concat(routes) + }, + SET_TOPBAR_ROUTES: (state, routes) => { + state.topbarRouters = routes + }, + SET_SIDEBAR_ROUTERS: (state, routes) => { + state.sidebarRouters = routes + }, + }, + actions: { + // 生成路由 + GenerateRoutes({ commit }) { + return new Promise(resolve => { + // 向后端请求路由数据 + getRouters().then(res => { + const sdata = JSON.parse(JSON.stringify(res.data)) + const rdata = JSON.parse(JSON.stringify(res.data)) + const sidebarRoutes = filterAsyncRouter(sdata) + const rewriteRoutes = filterAsyncRouter(rdata, false, true) + const asyncRoutes = filterDynamicRoutes(dynamicRoutes) + rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true }) + router.addRoutes(asyncRoutes) + commit('SET_ROUTES', rewriteRoutes) + commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes)) + commit('SET_DEFAULT_ROUTES', sidebarRoutes) + commit('SET_TOPBAR_ROUTES', sidebarRoutes) + resolve(rewriteRoutes) + }) + }) + } + } +} + +// 遍历后台传来的路由字符串,转换为组件对象 +function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { + return asyncRouterMap.filter(route => { + if (type && route.children) { + route.children = filterChildren(route.children) + } + if (route.component) { + // Layout ParentView 组件特殊处理 + if (route.component === 'Layout') { + route.component = Layout + } else if (route.component === 'ParentView') { + route.component = ParentView + } else if (route.component === 'InnerLink') { + route.component = InnerLink + } else { + route.component = loadView(route.component) + } + } + if (route.children != null && route.children && route.children.length) { + route.children = filterAsyncRouter(route.children, route, type) + } else { + delete route['children'] + delete route['redirect'] + } + return true + }) +} + +function filterChildren(childrenMap, lastRouter = false) { + var children = [] + childrenMap.forEach(el => { + el.path = lastRouter ? lastRouter.path + '/' + el.path : el.path + if (el.children && el.children.length && el.component === 'ParentView') { + children = children.concat(filterChildren(el.children, el)) + } else { + children.push(el) + } + }) + return children +} + +// 动态路由遍历,验证是否具备权限 +export function filterDynamicRoutes(routes) { + const res = [] + routes.forEach(route => { + if (route.permissions) { + if (auth.hasPermiOr(route.permissions)) { + res.push(route) + } + } else if (route.roles) { + if (auth.hasRoleOr(route.roles)) { + res.push(route) + } + } + }) + return res +} + +export const loadView = (view) => { + if (process.env.NODE_ENV === 'development') { + return (resolve) => require([`@/views/${view}`], resolve) + } else { + // 使用 import 实现生产环境的路由懒加载 + return () => import(`@/views/${view}`) + } +} + +export default permission diff --git a/admin-ui/src/store/modules/settings.js b/admin-ui/src/store/modules/settings.js new file mode 100644 index 0000000..22bfccb --- /dev/null +++ b/admin-ui/src/store/modules/settings.js @@ -0,0 +1,47 @@ +import defaultSettings from '@/settings' +import { useDynamicTitle } from '@/utils/dynamicTitle' + +const { sideTheme, showSettings, topNav, tagsView, tagsIcon, fixedHeader, sidebarLogo, dynamicTitle, footerVisible, footerContent } = defaultSettings + +const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' +const state = { + title: '', + theme: storageSetting.theme || '#409EFF', + sideTheme: storageSetting.sideTheme || sideTheme, + showSettings: showSettings, + topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, + tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, + tagsIcon: storageSetting.tagsIcon === undefined ? tagsIcon : storageSetting.tagsIcon, + fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, + sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, + dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle, + footerVisible: storageSetting.footerVisible === undefined ? footerVisible : storageSetting.footerVisible, + footerContent: footerContent +} +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + if (state.hasOwnProperty(key)) { + state[key] = value + } + } +} + +const actions = { + // 修改布局设置 + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + }, + // 设置网页标题 + setTitle({ commit }, title) { + state.title = title + useDynamicTitle() + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/admin-ui/src/store/modules/tagsView.js b/admin-ui/src/store/modules/tagsView.js new file mode 100644 index 0000000..5fc011c --- /dev/null +++ b/admin-ui/src/store/modules/tagsView.js @@ -0,0 +1,228 @@ +const state = { + visitedViews: [], + cachedViews: [], + iframeViews: [] +} + +const mutations = { + ADD_IFRAME_VIEW: (state, view) => { + if (state.iframeViews.some(v => v.path === view.path)) return + state.iframeViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + }, + ADD_VISITED_VIEW: (state, view) => { + if (state.visitedViews.some(v => v.path === view.path)) return + state.visitedViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + }, + ADD_CACHED_VIEW: (state, view) => { + if (state.cachedViews.includes(view.name)) return + if (view.meta && !view.meta.noCache) { + state.cachedViews.push(view.name) + } + }, + DEL_VISITED_VIEW: (state, view) => { + for (const [i, v] of state.visitedViews.entries()) { + if (v.path === view.path) { + state.visitedViews.splice(i, 1) + break + } + } + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) + }, + DEL_IFRAME_VIEW: (state, view) => { + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) + }, + DEL_CACHED_VIEW: (state, view) => { + const index = state.cachedViews.indexOf(view.name) + index > -1 && state.cachedViews.splice(index, 1) + }, + + DEL_OTHERS_VISITED_VIEWS: (state, view) => { + state.visitedViews = state.visitedViews.filter(v => { + return v.meta.affix || v.path === view.path + }) + state.iframeViews = state.iframeViews.filter(item => item.path === view.path) + }, + DEL_OTHERS_CACHED_VIEWS: (state, view) => { + const index = state.cachedViews.indexOf(view.name) + if (index > -1) { + state.cachedViews = state.cachedViews.slice(index, index + 1) + } else { + state.cachedViews = [] + } + }, + DEL_ALL_VISITED_VIEWS: state => { + // keep affix tags + const affixTags = state.visitedViews.filter(tag => tag.meta.affix) + state.visitedViews = affixTags + state.iframeViews = [] + }, + DEL_ALL_CACHED_VIEWS: state => { + state.cachedViews = [] + }, + UPDATE_VISITED_VIEW: (state, view) => { + for (let v of state.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } + } + }, + DEL_RIGHT_VIEWS: (state, view) => { + const index = state.visitedViews.findIndex(v => v.path === view.path) + if (index === -1) { + return + } + state.visitedViews = state.visitedViews.filter((item, idx) => { + if (idx <= index || (item.meta && item.meta.affix)) { + return true + } + const i = state.cachedViews.indexOf(item.name) + if (i > -1) { + state.cachedViews.splice(i, 1) + } + if(item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } + return false + }) + }, + DEL_LEFT_VIEWS: (state, view) => { + const index = state.visitedViews.findIndex(v => v.path === view.path) + if (index === -1) { + return + } + state.visitedViews = state.visitedViews.filter((item, idx) => { + if (idx >= index || (item.meta && item.meta.affix)) { + return true + } + const i = state.cachedViews.indexOf(item.name) + if (i > -1) { + state.cachedViews.splice(i, 1) + } + if(item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } + return false + }) + } +} + +const actions = { + addView({ dispatch }, view) { + dispatch('addVisitedView', view) + dispatch('addCachedView', view) + }, + addIframeView({ commit }, view) { + commit('ADD_IFRAME_VIEW', view) + }, + addVisitedView({ commit }, view) { + commit('ADD_VISITED_VIEW', view) + }, + addCachedView({ commit }, view) { + commit('ADD_CACHED_VIEW', view) + }, + delView({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delVisitedView', view) + dispatch('delCachedView', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delVisitedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_VISITED_VIEW', view) + resolve([...state.visitedViews]) + }) + }, + delIframeView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_IFRAME_VIEW', view) + resolve([...state.iframeViews]) + }) + }, + delCachedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_CACHED_VIEW', view) + resolve([...state.cachedViews]) + }) + }, + delOthersViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delOthersVisitedViews', view) + dispatch('delOthersCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delOthersVisitedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_VISITED_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + delOthersCachedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_CACHED_VIEWS', view) + resolve([...state.cachedViews]) + }) + }, + delAllViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delAllVisitedViews', view) + dispatch('delAllCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delAllVisitedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_VISITED_VIEWS') + resolve([...state.visitedViews]) + }) + }, + delAllCachedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_CACHED_VIEWS') + resolve([...state.cachedViews]) + }) + }, + updateVisitedView({ commit }, view) { + commit('UPDATE_VISITED_VIEW', view) + }, + delRightTags({ commit }, view) { + return new Promise(resolve => { + commit('DEL_RIGHT_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + delLeftTags({ commit }, view) { + return new Promise(resolve => { + commit('DEL_LEFT_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/admin-ui/src/store/modules/user.js b/admin-ui/src/store/modules/user.js new file mode 100644 index 0000000..6a7b710 --- /dev/null +++ b/admin-ui/src/store/modules/user.js @@ -0,0 +1,125 @@ +import router from '@/router' +import { MessageBox, } from 'element-ui' +import { login, logout, getInfo } from '@/api/login' +import { getToken, setToken, removeToken } from '@/utils/auth' +import { isHttp, isEmpty } from "@/utils/validate" +import defAva from '@/assets/images/profile.jpg' + +const user = { + state: { + token: getToken(), + id: '', + name: '', + nickName: '', + avatar: '', + roles: [], + permissions: [] + }, + + mutations: { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_ID: (state, id) => { + state.id = id + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_NICK_NAME: (state, nickName) => { + state.nickName = nickName + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_ROLES: (state, roles) => { + state.roles = roles + }, + SET_PERMISSIONS: (state, permissions) => { + state.permissions = permissions + } + }, + + actions: { + // 登录 + Login({ commit }, userInfo) { + const username = userInfo.username.trim() + const password = userInfo.password + const code = userInfo.code + const uuid = userInfo.uuid + return new Promise((resolve, reject) => { + login(username, password, code, uuid).then(res => { + setToken(res.token) + commit('SET_TOKEN', res.token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 获取用户信息 + GetInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo().then(res => { + const user = res.user + let avatar = user.avatar || "" + if (!isHttp(avatar)) { + avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar + } + if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 + commit('SET_ROLES', res.roles) + commit('SET_PERMISSIONS', res.permissions) + } else { + commit('SET_ROLES', ['ROLE_DEFAULT']) + } + commit('SET_ID', user.userId) + commit('SET_NAME', user.userName) + commit('SET_NICK_NAME', user.nickName) + commit('SET_AVATAR', avatar) + /* 初始密码提示 */ + if(res.isDefaultModifyPwd) { + MessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }).catch(() => {}) + } + /* 过期密码提示 */ + if(!res.isDefaultModifyPwd && res.isPasswordExpired) { + MessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }).catch(() => {}) + } + resolve(res) + }).catch(error => { + reject(error) + }) + }) + }, + + // 退出系统 + LogOut({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + commit('SET_PERMISSIONS', []) + removeToken() + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 前端 登出 + FedLogOut({ commit }) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + removeToken() + resolve() + }) + } + } +} + +export default user diff --git a/admin-ui/src/utils/auth.js b/admin-ui/src/utils/auth.js new file mode 100644 index 0000000..08a43d6 --- /dev/null +++ b/admin-ui/src/utils/auth.js @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'Admin-Token' + +export function getToken() { + return Cookies.get(TokenKey) +} + +export function setToken(token) { + return Cookies.set(TokenKey, token) +} + +export function removeToken() { + return Cookies.remove(TokenKey) +} diff --git a/admin-ui/src/utils/dict/Dict.js b/admin-ui/src/utils/dict/Dict.js new file mode 100644 index 0000000..994f6f7 --- /dev/null +++ b/admin-ui/src/utils/dict/Dict.js @@ -0,0 +1,82 @@ +import Vue from 'vue' +import { mergeRecursive } from "@/utils/ruoyi" +import DictMeta from './DictMeta' +import DictData from './DictData' + +const DEFAULT_DICT_OPTIONS = { + types: [], +} + +/** + * @classdesc 字典 + * @property {Object} label 标签对象,内部属性名为字典类型名称 + * @property {Object} dict 字段数组,内部属性名为字典类型名称 + * @property {Array.} _dictMetas 字典元数据数组 + */ +export default class Dict { + constructor() { + this.owner = null + this.label = {} + this.type = {} + } + + init(options) { + if (options instanceof Array) { + options = { types: options } + } + const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options) + if (opts.types === undefined) { + throw new Error('need dict types') + } + const ps = [] + this._dictMetas = opts.types.map(t => DictMeta.parse(t)) + this._dictMetas.forEach(dictMeta => { + const type = dictMeta.type + Vue.set(this.label, type, {}) + Vue.set(this.type, type, []) + if (dictMeta.lazy) { + return + } + ps.push(loadDict(this, dictMeta)) + }) + return Promise.all(ps) + } + + /** + * 重新加载字典 + * @param {String} type 字典类型 + */ + reloadDict(type) { + const dictMeta = this._dictMetas.find(e => e.type === type) + if (dictMeta === undefined) { + return Promise.reject(`the dict meta of ${type} was not found`) + } + return loadDict(this, dictMeta) + } +} + +/** + * 加载字典 + * @param {Dict} dict 字典 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {Promise} + */ +function loadDict(dict, dictMeta) { + return dictMeta.request(dictMeta) + .then(response => { + const type = dictMeta.type + let dicts = dictMeta.responseConverter(response, dictMeta) + if (!(dicts instanceof Array)) { + console.error('the return of responseConverter must be Array.') + dicts = [] + } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) { + console.error('the type of elements in dicts must be DictData') + dicts = [] + } + dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts) + dicts.forEach(d => { + Vue.set(dict.label[type], d.value, d.label) + }) + return dicts + }) +} diff --git a/admin-ui/src/utils/dict/DictConverter.js b/admin-ui/src/utils/dict/DictConverter.js new file mode 100644 index 0000000..0cf5df8 --- /dev/null +++ b/admin-ui/src/utils/dict/DictConverter.js @@ -0,0 +1,17 @@ +import DictOptions from './DictOptions' +import DictData from './DictData' + +export default function(dict, dictMeta) { + const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS) + const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS) + return new DictData(dict[label], dict[value], dict) +} + +/** + * 确定字典字段 + * @param {DictData} dict + * @param {...String} fields + */ +function determineDictField(dict, ...fields) { + return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f)) +} diff --git a/admin-ui/src/utils/dict/DictData.js b/admin-ui/src/utils/dict/DictData.js new file mode 100644 index 0000000..afc763e --- /dev/null +++ b/admin-ui/src/utils/dict/DictData.js @@ -0,0 +1,13 @@ +/** + * @classdesc 字典数据 + * @property {String} label 标签 + * @property {*} value 标签 + * @property {Object} raw 原始数据 + */ +export default class DictData { + constructor(label, value, raw) { + this.label = label + this.value = value + this.raw = raw + } +} diff --git a/admin-ui/src/utils/dict/DictMeta.js b/admin-ui/src/utils/dict/DictMeta.js new file mode 100644 index 0000000..617cc00 --- /dev/null +++ b/admin-ui/src/utils/dict/DictMeta.js @@ -0,0 +1,38 @@ +import { mergeRecursive } from "@/utils/ruoyi" +import DictOptions from './DictOptions' + +/** + * @classdesc 字典元数据 + * @property {String} type 类型 + * @property {Function} request 请求 + * @property {String} label 标签字段 + * @property {String} value 值字段 + */ +export default class DictMeta { + constructor(options) { + this.type = options.type + this.request = options.request + this.responseConverter = options.responseConverter + this.labelField = options.labelField + this.valueField = options.valueField + this.lazy = options.lazy === true + } +} + + +/** + * 解析字典元数据 + * @param {Object} options + * @returns {DictMeta} + */ +DictMeta.parse= function(options) { + let opts = null + if (typeof options === 'string') { + opts = DictOptions.metas[options] || {} + opts.type = options + } else if (typeof options === 'object') { + opts = options + } + opts = mergeRecursive(DictOptions.metas['*'], opts) + return new DictMeta(opts) +} diff --git a/admin-ui/src/utils/dict/DictOptions.js b/admin-ui/src/utils/dict/DictOptions.js new file mode 100644 index 0000000..5fd1425 --- /dev/null +++ b/admin-ui/src/utils/dict/DictOptions.js @@ -0,0 +1,51 @@ +import { mergeRecursive } from "@/utils/ruoyi" +import dictConverter from './DictConverter' + +export const options = { + metas: { + '*': { + /** + * 字典请求,方法签名为function(dictMeta: DictMeta): Promise + */ + request: (dictMeta) => { + console.log(`load dict ${dictMeta.type}`) + return Promise.resolve([]) + }, + /** + * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData + */ + responseConverter, + labelField: 'label', + valueField: 'value', + }, + }, + /** + * 默认标签字段 + */ + DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'], + /** + * 默认值字段 + */ + DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'], +} + +/** + * 映射字典 + * @param {Object} response 字典数据 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {DictData} + */ +function responseConverter(response, dictMeta) { + const dicts = response.content instanceof Array ? response.content : response + if (dicts === undefined) { + console.warn(`no dict data of "${dictMeta.type}" found in the response`) + return [] + } + return dicts.map(d => dictConverter(d, dictMeta)) +} + +export function mergeOptions(src) { + mergeRecursive(options, src) +} + +export default options diff --git a/admin-ui/src/utils/dict/index.js b/admin-ui/src/utils/dict/index.js new file mode 100644 index 0000000..215eb9e --- /dev/null +++ b/admin-ui/src/utils/dict/index.js @@ -0,0 +1,33 @@ +import Dict from './Dict' +import { mergeOptions } from './DictOptions' + +export default function(Vue, options) { + mergeOptions(options) + Vue.mixin({ + data() { + if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) { + return {} + } + const dict = new Dict() + dict.owner = this + return { + dict + } + }, + created() { + if (!(this.dict instanceof Dict)) { + return + } + options.onCreated && options.onCreated(this.dict) + this.dict.init(this.$options.dicts).then(() => { + options.onReady && options.onReady(this.dict) + this.$nextTick(() => { + this.$emit('dictReady', this.dict) + if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) { + this.$options.methods.onDictReady.call(this, this.dict) + } + }) + }) + }, + }) +} diff --git a/admin-ui/src/utils/dynamicTitle.js b/admin-ui/src/utils/dynamicTitle.js new file mode 100644 index 0000000..1b57efb --- /dev/null +++ b/admin-ui/src/utils/dynamicTitle.js @@ -0,0 +1,13 @@ +import store from '@/store' +import defaultSettings from '@/settings' + +/** + * 动态修改标题 + */ +export function useDynamicTitle() { + if (store.state.settings.dynamicTitle) { + document.title = store.state.settings.title + ' - ' + defaultSettings.title + } else { + document.title = defaultSettings.title + } +} \ No newline at end of file diff --git a/admin-ui/src/utils/errorCode.js b/admin-ui/src/utils/errorCode.js new file mode 100644 index 0000000..d2111ee --- /dev/null +++ b/admin-ui/src/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} diff --git a/admin-ui/src/utils/generator/config.js b/admin-ui/src/utils/generator/config.js new file mode 100644 index 0000000..7abf227 --- /dev/null +++ b/admin-ui/src/utils/generator/config.js @@ -0,0 +1,438 @@ +export const formConf = { + formRef: 'elForm', + formModel: 'formData', + size: 'medium', + labelPosition: 'right', + labelWidth: 100, + formRules: 'rules', + gutter: 15, + disabled: false, + span: 24, + formBtns: true +} + +export const inputComponents = [ + { + label: '单行文本', + tag: 'el-input', + tagIcon: 'input', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '多行文本', + tag: 'el-input', + tagIcon: 'textarea', + type: 'textarea', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + autosize: { + minRows: 4, + maxRows: 4 + }, + style: { width: '100%' }, + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '密码', + tag: 'el-input', + tagIcon: 'password', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + 'show-password': true, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '计数器', + tag: 'el-input-number', + tagIcon: 'number', + placeholder: '', + defaultValue: undefined, + span: 24, + labelWidth: null, + min: undefined, + max: undefined, + step: undefined, + 'step-strictly': false, + precision: undefined, + 'controls-position': '', + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input-number' + } +] + +export const selectComponents = [ + { + label: '下拉选择', + tag: 'el-select', + tagIcon: 'select', + placeholder: '请选择', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + disabled: false, + required: true, + filterable: false, + multiple: false, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/select' + }, + { + label: '级联选择', + tag: 'el-cascader', + tagIcon: 'cascader', + placeholder: '请选择', + defaultValue: [], + span: 24, + labelWidth: null, + style: { width: '100%' }, + props: { + props: { + multiple: false + } + }, + 'show-all-levels': true, + disabled: false, + clearable: true, + filterable: false, + required: true, + options: [{ + id: 1, + value: 1, + label: '选项1', + children: [{ + id: 2, + value: 2, + label: '选项1-1' + }] + }], + dataType: 'dynamic', + labelKey: 'label', + valueKey: 'value', + childrenKey: 'children', + separator: '/', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/cascader' + }, + { + label: '单选框组', + tag: 'el-radio-group', + tagIcon: 'radio', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'medium', + disabled: false, + required: true, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/radio' + }, + { + label: '多选框组', + tag: 'el-checkbox-group', + tagIcon: 'checkbox', + defaultValue: [], + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'medium', + disabled: false, + required: true, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/checkbox' + }, + { + label: '开关', + tag: 'el-switch', + tagIcon: 'switch', + defaultValue: false, + span: 24, + labelWidth: null, + style: {}, + disabled: false, + required: true, + 'active-text': '', + 'inactive-text': '', + 'active-color': null, + 'inactive-color': null, + 'active-value': true, + 'inactive-value': false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/switch' + }, + { + label: '滑块', + tag: 'el-slider', + tagIcon: 'slider', + defaultValue: null, + span: 24, + labelWidth: null, + disabled: false, + required: true, + min: 0, + max: 100, + step: 1, + 'show-stops': false, + range: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/slider' + }, + { + label: '时间选择', + tag: 'el-time-picker', + tagIcon: 'time', + placeholder: '请选择', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + 'picker-options': { + selectableRange: '00:00:00-23:59:59' + }, + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' + }, + { + label: '时间范围', + tag: 'el-time-picker', + tagIcon: 'time-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + 'is-range': true, + 'range-separator': '至', + 'start-placeholder': '开始时间', + 'end-placeholder': '结束时间', + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' + }, + { + label: '日期选择', + tag: 'el-date-picker', + tagIcon: 'date', + placeholder: '请选择', + defaultValue: null, + type: 'date', + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + format: 'yyyy-MM-dd', + 'value-format': 'yyyy-MM-dd', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' + }, + { + label: '日期范围', + tag: 'el-date-picker', + tagIcon: 'date-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + type: 'daterange', + 'range-separator': '至', + 'start-placeholder': '开始日期', + 'end-placeholder': '结束日期', + disabled: false, + clearable: true, + required: true, + format: 'yyyy-MM-dd', + 'value-format': 'yyyy-MM-dd', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' + }, + { + label: '评分', + tag: 'el-rate', + tagIcon: 'rate', + defaultValue: 0, + span: 24, + labelWidth: null, + style: {}, + max: 5, + 'allow-half': false, + 'show-text': false, + 'show-score': false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/rate' + }, + { + label: '颜色选择', + tag: 'el-color-picker', + tagIcon: 'color', + defaultValue: null, + labelWidth: null, + 'show-alpha': false, + 'color-format': '', + disabled: false, + required: true, + size: 'medium', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/color-picker' + }, + { + label: '上传', + tag: 'el-upload', + tagIcon: 'upload', + action: 'https://jsonplaceholder.typicode.com/posts/', + defaultValue: null, + labelWidth: null, + disabled: false, + required: true, + accept: '', + name: 'file', + 'auto-upload': true, + showTip: false, + buttonText: '点击上传', + fileSize: 2, + sizeUnit: 'MB', + 'list-type': 'text', + multiple: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/upload' + } +] + +export const layoutComponents = [ + { + layout: 'rowFormItem', + tagIcon: 'row', + type: 'default', + justify: 'start', + align: 'top', + label: '行容器', + layoutTree: true, + children: [], + document: 'https://element.eleme.cn/#/zh-CN/component/layout' + }, + { + layout: 'colFormItem', + label: '按钮', + changeTag: true, + labelWidth: null, + tag: 'el-button', + tagIcon: 'button', + span: 24, + default: '主要按钮', + type: 'primary', + icon: 'el-icon-search', + size: 'medium', + disabled: false, + document: 'https://element.eleme.cn/#/zh-CN/component/button' + } +] + +// 组件rule的触发方式,无触发方式的组件不生成rule +export const trigger = { + 'el-input': 'blur', + 'el-input-number': 'blur', + 'el-select': 'change', + 'el-radio-group': 'change', + 'el-checkbox-group': 'change', + 'el-cascader': 'change', + 'el-time-picker': 'change', + 'el-date-picker': 'change', + 'el-rate': 'change' +} diff --git a/admin-ui/src/utils/generator/css.js b/admin-ui/src/utils/generator/css.js new file mode 100644 index 0000000..c1c62e6 --- /dev/null +++ b/admin-ui/src/utils/generator/css.js @@ -0,0 +1,18 @@ +const styles = { + 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', + 'el-upload': '.el-upload__tip{line-height: 1.2;}' +} + +function addCss(cssList, el) { + const css = styles[el.tag] + css && cssList.indexOf(css) === -1 && cssList.push(css) + if (el.children) { + el.children.forEach(el2 => addCss(cssList, el2)) + } +} + +export function makeUpCss(conf) { + const cssList = [] + conf.fields.forEach(el => addCss(cssList, el)) + return cssList.join('\n') +} diff --git a/admin-ui/src/utils/generator/drawingDefault.js b/admin-ui/src/utils/generator/drawingDefault.js new file mode 100644 index 0000000..09f133c --- /dev/null +++ b/admin-ui/src/utils/generator/drawingDefault.js @@ -0,0 +1,29 @@ +export default [ + { + layout: 'colFormItem', + tagIcon: 'input', + label: '手机号', + vModel: 'mobile', + formId: 6, + tag: 'el-input', + placeholder: '请输入手机号', + defaultValue: '', + span: 24, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': 'el-icon-mobile', + 'suffix-icon': '', + maxlength: 11, + 'show-word-limit': true, + readonly: false, + disabled: false, + required: true, + changeTag: true, + regList: [{ + pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', + message: '手机号格式错误' + }] + } +] diff --git a/admin-ui/src/utils/generator/html.js b/admin-ui/src/utils/generator/html.js new file mode 100644 index 0000000..3b3388d --- /dev/null +++ b/admin-ui/src/utils/generator/html.js @@ -0,0 +1,358 @@ +import { trigger } from './config' + +let confGlobal +let someSpanIsNot24 + +export function dialogWrapper(str) { + return ` + ${str} +
+ 取消 + 确定 +
+
` +} + +export function vueTemplate(str) { + return `` +} + +export function vueScript(str) { + return `` +} + +export function cssStyle(cssStr) { + return `` +} + +function buildFormTemplate(conf, child, type) { + let labelPosition = '' + if (conf.labelPosition !== 'right') { + labelPosition = `label-position="${conf.labelPosition}"` + } + const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : '' + let str = ` + ${child} + ${buildFromBtns(conf, type)} + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + return str +} + +function buildFromBtns(conf, type) { + let str = '' + if (conf.formBtns && type === 'file') { + str = ` + 提交 + 重置 + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + } + return str +} + +// span不为24的用el-col包裹 +function colWrapper(element, str) { + if (someSpanIsNot24 || element.span !== 24) { + return ` + ${str} + ` + } + return str +} + +const layouts = { + colFormItem(element) { + let labelWidth = '' + if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) { + labelWidth = `label-width="${element.labelWidth}px"` + } + const required = !trigger[element.tag] && element.required ? 'required' : '' + const tagDom = tags[element.tag] ? tags[element.tag](element) : null + let str = ` + ${tagDom} + ` + str = colWrapper(element, str) + return str + }, + rowFormItem(element) { + const type = element.type === 'default' ? '' : `type="${element.type}"` + const justify = element.type === 'default' ? '' : `justify="${element.justify}"` + const align = element.type === 'default' ? '' : `align="${element.align}"` + const gutter = element.gutter ? `gutter="${element.gutter}"` : '' + const children = element.children.map(el => layouts[el.layout](el)) + let str = ` + ${children.join('\n')} + ` + str = colWrapper(element, str) + return str + } +} + +const tags = { + 'el-button': el => { + const { + tag, disabled + } = attrBuilder(el) + const type = el.type ? `type="${el.type}"` : '' + const icon = el.icon ? `icon="${el.icon}"` : '' + const size = el.size ? `size="${el.size}"` : '' + let child = buildElButtonChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}` + }, + 'el-input': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' + const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' + const readonly = el.readonly ? 'readonly' : '' + const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' + const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' + const showPassword = el['show-password'] ? 'show-password' : '' + const type = el.type ? `type="${el.type}"` : '' + const autosize = el.autosize && el.autosize.minRows + ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` + : '' + let child = buildElInputChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}` + }, + 'el-input-number': el => { + const { disabled, vModel, placeholder } = attrBuilder(el) + const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' + const precision = el.precision ? `:precision='${el.precision}'` : '' + + return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>` + }, + 'el-select': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const filterable = el.filterable ? 'filterable' : '' + const multiple = el.multiple ? 'multiple' : '' + let child = buildElSelectChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}` + }, + 'el-radio-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + let child = buildElRadioGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${size} ${disabled}>${child}` + }, + 'el-checkbox-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const min = el.min ? `:min="${el.min}"` : '' + const max = el.max ? `:max="${el.max}"` : '' + let child = buildElCheckboxGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}` + }, + 'el-switch': el => { + const { disabled, vModel } = attrBuilder(el) + const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' + const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' + const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' + const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' + const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' + const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' + + return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>` + }, + 'el-cascader': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const options = el.options ? `:options="${el.vModel}Options"` : '' + const props = el.props ? `:props="${el.vModel}Props"` : '' + const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' + const filterable = el.filterable ? 'filterable' : '' + const separator = el.separator === '/' ? '' : `separator="${el.separator}"` + + return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>` + }, + 'el-slider': el => { + const { disabled, vModel } = attrBuilder(el) + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const range = el.range ? 'range' : '' + const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' + + return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>` + }, + 'el-time-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const isRange = el['is-range'] ? 'is-range' : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' + + return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>` + }, + 'el-date-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const type = el.type === 'date' ? '' : `type="${el.type}"` + const readonly = el.readonly ? 'readonly' : '' + + return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>` + }, + 'el-rate': el => { + const { disabled, vModel } = attrBuilder(el) + const max = el.max ? `:max='${el.max}'` : '' + const allowHalf = el['allow-half'] ? 'allow-half' : '' + const showText = el['show-text'] ? 'show-text' : '' + const showScore = el['show-score'] ? 'show-score' : '' + + return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}>` + }, + 'el-color-picker': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const showAlpha = el['show-alpha'] ? 'show-alpha' : '' + const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' + + return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>` + }, + 'el-upload': el => { + const disabled = el.disabled ? ':disabled=\'true\'' : '' + const action = el.action ? `:action="${el.vModel}Action"` : '' + const multiple = el.multiple ? 'multiple' : '' + const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' + const accept = el.accept ? `accept="${el.accept}"` : '' + const name = el.name !== 'file' ? `name="${el.name}"` : '' + const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' + const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"` + const fileList = `:file-list="${el.vModel}fileList"` + const ref = `ref="${el.vModel}"` + let child = buildElUploadChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}` + } +} + +function attrBuilder(el) { + return { + vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`, + clearable: el.clearable ? 'clearable' : '', + placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', + width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', + disabled: el.disabled ? ':disabled=\'true\'' : '' + } +} + +// el-buttin 子级 +function buildElButtonChild(conf) { + const children = [] + if (conf.default) { + children.push(conf.default) + } + return children.join('\n') +} + +// el-input innerHTML +function buildElInputChild(conf) { + const children = [] + if (conf.prepend) { + children.push(``) + } + if (conf.append) { + children.push(``) + } + return children.join('\n') +} + +function buildElSelectChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + children.push(``) + } + return children.join('\n') +} + +function buildElRadioGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) + } + return children.join('\n') +} + +function buildElCheckboxGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) + } + return children.join('\n') +} + +function buildElUploadChild(conf) { + const list = [] + if (conf['list-type'] === 'picture-card') list.push('') + else list.push(`${conf.buttonText}`) + if (conf.showTip) list.push(`
只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件
`) + return list.join('\n') +} + +export function makeUpHtml(conf, type) { + const htmlList = [] + confGlobal = conf + someSpanIsNot24 = conf.fields.some(item => item.span !== 24) + conf.fields.forEach(el => { + htmlList.push(layouts[el.layout](el)) + }) + const htmlStr = htmlList.join('\n') + + let temp = buildFormTemplate(conf, htmlStr, type) + if (type === 'dialog') { + temp = dialogWrapper(temp) + } + confGlobal = null + return temp +} diff --git a/admin-ui/src/utils/generator/icon.json b/admin-ui/src/utils/generator/icon.json new file mode 100644 index 0000000..2d9999a --- /dev/null +++ b/admin-ui/src/utils/generator/icon.json @@ -0,0 +1 @@ +["platform-eleme","eleme","delete-solid","delete","s-tools","setting","user-solid","user","phone","phone-outline","more","more-outline","star-on","star-off","s-goods","goods","warning","warning-outline","question","info","remove","circle-plus","success","error","zoom-in","zoom-out","remove-outline","circle-plus-outline","circle-check","circle-close","s-help","help","minus","plus","check","close","picture","picture-outline","picture-outline-round","upload","upload2","download","camera-solid","camera","video-camera-solid","video-camera","message-solid","bell","s-cooperation","s-order","s-platform","s-fold","s-unfold","s-operation","s-promotion","s-home","s-release","s-ticket","s-management","s-open","s-shop","s-marketing","s-flag","s-comment","s-finance","s-claim","s-custom","s-opportunity","s-data","s-check","s-grid","menu","share","d-caret","caret-left","caret-right","caret-bottom","caret-top","bottom-left","bottom-right","back","right","bottom","top","top-left","top-right","arrow-left","arrow-right","arrow-down","arrow-up","d-arrow-left","d-arrow-right","video-pause","video-play","refresh","refresh-right","refresh-left","finished","sort","sort-up","sort-down","rank","loading","view","c-scale-to-original","date","edit","edit-outline","folder","folder-opened","folder-add","folder-remove","folder-delete","folder-checked","tickets","document-remove","document-delete","document-copy","document-checked","document","document-add","printer","paperclip","takeaway-box","search","monitor","attract","mobile","scissors","umbrella","headset","brush","mouse","coordinate","magic-stick","reading","data-line","data-board","pie-chart","data-analysis","collection-tag","film","suitcase","suitcase-1","receiving","collection","files","notebook-1","notebook-2","toilet-paper","office-building","school","table-lamp","house","no-smoking","smoking","shopping-cart-full","shopping-cart-1","shopping-cart-2","shopping-bag-1","shopping-bag-2","sold-out","sell","present","box","bank-card","money","coin","wallet","discount","price-tag","news","guide","male","female","thumb","cpu","link","connection","open","turn-off","set-up","chat-round","chat-line-round","chat-square","chat-dot-round","chat-dot-square","chat-line-square","message","postcard","position","turn-off-microphone","microphone","close-notification","bangzhu","time","odometer","crop","aim","switch-button","full-screen","copy-document","mic","stopwatch","medal-1","medal","trophy","trophy-1","first-aid-kit","discover","place","location","location-outline","location-information","add-location","delete-location","map-location","alarm-clock","timer","watch-1","watch","lock","unlock","key","service","mobile-phone","bicycle","truck","ship","basketball","football","soccer","baseball","wind-power","light-rain","lightning","heavy-rain","sunrise","sunrise-1","sunset","sunny","cloudy","partly-cloudy","cloudy-and-sunny","moon","moon-night","dish","dish-1","food","chicken","fork-spoon","knife-fork","burger","tableware","sugar","dessert","ice-cream","hot-water","water-cup","coffee-cup","cold-drink","goblet","goblet-full","goblet-square","goblet-square-full","refrigerator","grape","watermelon","cherry","apple","pear","orange","coffee","ice-tea","ice-drink","milk-tea","potato-strips","lollipop","ice-cream-square","ice-cream-round"] \ No newline at end of file diff --git a/admin-ui/src/utils/generator/js.js b/admin-ui/src/utils/generator/js.js new file mode 100644 index 0000000..ee8668d --- /dev/null +++ b/admin-ui/src/utils/generator/js.js @@ -0,0 +1,235 @@ +import { exportDefault, titleCase } from '@/utils/index' +import { trigger } from './config' + +const units = { + KB: '1024', + MB: '1024 / 1024', + GB: '1024 / 1024 / 1024' +} +let confGlobal +const inheritAttrs = { + file: '', + dialog: 'inheritAttrs: false,' +} + + +export function makeUpJs(conf, type) { + confGlobal = conf = JSON.parse(JSON.stringify(conf)) + const dataList = [] + const ruleList = [] + const optionsList = [] + const propsList = [] + const methodList = mixinMethod(type) + const uploadVarList = [] + + conf.fields.forEach(el => { + buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) + }) + + const script = buildexport( + conf, + type, + dataList.join('\n'), + ruleList.join('\n'), + optionsList.join('\n'), + uploadVarList.join('\n'), + propsList.join('\n'), + methodList.join('\n') + ) + confGlobal = null + return script +} + +function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) { + buildData(el, dataList) + buildRules(el, ruleList) + + if (el.options && el.options.length) { + buildOptions(el, optionsList) + if (el.dataType === 'dynamic') { + const model = `${el.vModel}Options` + const options = titleCase(model) + buildOptionMethod(`get${options}`, model, methodList) + } + } + + if (el.props && el.props.props) { + buildProps(el, propsList) + } + + if (el.action && el.tag === 'el-upload') { + uploadVarList.push( + `${el.vModel}Action: '${el.action}', + ${el.vModel}fileList: [],` + ) + methodList.push(buildBeforeUpload(el)) + if (!el['auto-upload']) { + methodList.push(buildSubmitUpload(el)) + } + } + + if (el.children) { + el.children.forEach(el2 => { + buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) + }) + } +} + +function mixinMethod(type) { + const list = []; const + minxins = { + file: confGlobal.formBtns ? { + submitForm: `submitForm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + // TODO 提交表单 + }) + },`, + resetForm: `resetForm() { + this.$refs['${confGlobal.formRef}'].resetFields() + },` + } : null, + dialog: { + onOpen: 'onOpen() {},', + onClose: `onClose() { + this.$refs['${confGlobal.formRef}'].resetFields() + },`, + close: `close() { + this.$emit('update:visible', false) + },`, + handleConfirm: `handleConfirm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + this.close() + }) + },` + } + } + + const methods = minxins[type] + if (methods) { + Object.keys(methods).forEach(key => { + list.push(methods[key]) + }) + } + + return list +} + +function buildData(conf, dataList) { + if (conf.vModel === undefined) return + let defaultValue + if (typeof (conf.defaultValue) === 'string' && !conf.multiple) { + defaultValue = `'${conf.defaultValue}'` + } else { + defaultValue = `${JSON.stringify(conf.defaultValue)}` + } + dataList.push(`${conf.vModel}: ${defaultValue},`) +} + +function buildRules(conf, ruleList) { + if (conf.vModel === undefined) return + const rules = [] + if (trigger[conf.tag]) { + if (conf.required) { + const type = Array.isArray(conf.defaultValue) ? 'type: \'array\',' : '' + let message = Array.isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder + if (message === undefined) message = `${conf.label}不能为空` + rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`) + } + if (conf.regList && Array.isArray(conf.regList)) { + conf.regList.forEach(item => { + if (item.pattern) { + rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`) + } + }) + } + ruleList.push(`${conf.vModel}: [${rules.join(',')}],`) + } +} + +function buildOptions(conf, optionsList) { + if (conf.vModel === undefined) return + if (conf.dataType === 'dynamic') { conf.options = [] } + const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},` + optionsList.push(str) +} + +function buildProps(conf, propsList) { + if (conf.dataType === 'dynamic') { + conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey) + conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey) + conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey) + } + const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},` + propsList.push(str) +} + +function buildBeforeUpload(conf) { + const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const + returnList = [] + if (conf.fileSize) { + rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize} + if(!isRightSize){ + this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}') + }` + returnList.push('isRightSize') + } + if (conf.accept) { + acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type) + if(!isAccept){ + this.$message.error('应该选择${conf.accept}类型的文件') + }` + returnList.push('isAccept') + } + const str = `${conf.vModel}BeforeUpload(file) { + ${rightSizeCode} + ${acceptCode} + return ${returnList.join('&&')} + },` + return returnList.length ? str : '' +} + +function buildSubmitUpload(conf) { + const str = `submitUpload() { + this.$refs['${conf.vModel}'].submit() + },` + return str +} + +function buildOptionMethod(methodName, model, methodList) { + const str = `${methodName}() { + // TODO 发起请求获取数据 + this.${model} + },` + methodList.push(str) +} + +function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) { + const str = `${exportDefault}{ + ${inheritAttrs[type]} + components: {}, + props: [], + data () { + return { + ${conf.formModel}: { + ${data} + }, + ${conf.formRules}: { + ${rules} + }, + ${uploadVar} + ${selectOptions} + ${props} + } + }, + computed: {}, + watch: {}, + created () {}, + mounted () {}, + methods: { + ${methods} + } +}` + return str +} diff --git a/admin-ui/src/utils/generator/render.js b/admin-ui/src/utils/generator/render.js new file mode 100644 index 0000000..e8640f0 --- /dev/null +++ b/admin-ui/src/utils/generator/render.js @@ -0,0 +1,126 @@ +import { makeMap } from '@/utils/index' + +// 参考https://github.com/vuejs/vue/blob/v2.6.10/src/platforms/web/server/util.js +const isAttr = makeMap( + 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' + + 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' + + 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' + + 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' + + 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' + + 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' + + 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' + + 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' + + 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' + + 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' + + 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' + + 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' + + 'target,title,type,usemap,value,width,wrap' +) + +function vModel(self, dataObject, defaultValue) { + dataObject.props.value = defaultValue + + dataObject.on.input = val => { + self.$emit('input', val) + } +} + +const componentChild = { + 'el-button': { + default(h, conf, key) { + return conf[key] + }, + }, + 'el-input': { + prepend(h, conf, key) { + return + }, + append(h, conf, key) { + return + } + }, + 'el-select': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + list.push() + }) + return list + } + }, + 'el-radio-group': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + if (conf.optionType === 'button') list.push({item.label}) + else list.push({item.label}) + }) + return list + } + }, + 'el-checkbox-group': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + if (conf.optionType === 'button') { + list.push({item.label}) + } else { + list.push({item.label}) + } + }) + return list + } + }, + 'el-upload': { + 'list-type': (h, conf, key) => { + const list = [] + if (conf['list-type'] === 'picture-card') { + list.push() + } else { + list.push({conf.buttonText}) + } + if (conf.showTip) { + list.push(
只能上传不超过 {conf.fileSize}{conf.sizeUnit} 的{conf.accept}文件
) + } + return list + } + } +} + +export default { + render(h) { + const dataObject = { + attrs: {}, + props: {}, + on: {}, + style: {} + } + const confClone = JSON.parse(JSON.stringify(this.conf)) + const children = [] + + const childObjs = componentChild[confClone.tag] + if (childObjs) { + Object.keys(childObjs).forEach(key => { + const childFunc = childObjs[key] + if (confClone[key]) { + children.push(childFunc(h, confClone, key)) + } + }) + } + + Object.keys(confClone).forEach(key => { + const val = confClone[key] + if (key === 'vModel') { + vModel(this, dataObject, confClone.defaultValue) + } else if (dataObject[key]) { + dataObject[key] = val + } else if (!isAttr(key)) { + dataObject.props[key] = val + } else { + dataObject.attrs[key] = val + } + }) + return h(this.conf.tag, dataObject, children) + }, + props: ['conf'] +} diff --git a/admin-ui/src/utils/index.js b/admin-ui/src/utils/index.js new file mode 100644 index 0000000..9375db7 --- /dev/null +++ b/admin-ui/src/utils/index.js @@ -0,0 +1,390 @@ +import { parseTime } from './ruoyi' + +/** + * 表格时间格式化 + */ +export function formatDate(cellValue) { + if (cellValue == null || cellValue == "") return "" + var date = new Date(cellValue) + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function getQueryObject(url) { + url = url == null ? window.location.href : url + const search = url.substring(url.lastIndexOf('?') + 1) + const obj = {} + const reg = /([^?&=]+)=([^?&=]*)/g + search.replace(reg, (rs, $1, $2) => { + const name = decodeURIComponent($1) + let val = decodeURIComponent($2) + val = String(val) + obj[name] = val + return rs + }) + return obj +} + +/** + * @param {string} input value + * @returns {number} output value + */ +export function byteLength(str) { + // returns the byte length of an utf8 string + let s = str.length + for (var i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i) + if (code > 0x7f && code <= 0x7ff) s++ + else if (code > 0x7ff && code <= 0xffff) s += 2 + if (code >= 0xDC00 && code <= 0xDFFF) i-- + } + return s +} + +/** + * @param {Array} actual + * @returns {Array} + */ +export function cleanArray(actual) { + const newArray = [] + for (let i = 0; i < actual.length; i++) { + if (actual[i]) { + newArray.push(actual[i]) + } + } + return newArray +} + +/** + * @param {Object} json + * @returns {Array} + */ +export function param(json) { + if (!json) return '' + return cleanArray( + Object.keys(json).map(key => { + if (json[key] === undefined) return '' + return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + }) + ).join('&') +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +/** + * @param {string} val + * @returns {string} + */ +export function html2Text(val) { + const div = document.createElement('div') + div.innerHTML = val + return div.textContent || div.innerText +} + +/** + * Merges two objects, giving the last one precedence + * @param {Object} target + * @param {(Object|Array)} source + * @returns {Object} + */ +export function objectMerge(target, source) { + if (typeof target !== 'object') { + target = {} + } + if (Array.isArray(source)) { + return source.slice() + } + Object.keys(source).forEach(property => { + const sourceProperty = source[property] + if (typeof sourceProperty === 'object') { + target[property] = objectMerge(target[property], sourceProperty) + } else { + target[property] = sourceProperty + } + }) + return target +} + +/** + * @param {HTMLElement} element + * @param {string} className + */ +export function toggleClass(element, className) { + if (!element || !className) { + return + } + let classString = element.className + const nameIndex = classString.indexOf(className) + if (nameIndex === -1) { + classString += '' + className + } else { + classString = + classString.substr(0, nameIndex) + + classString.substr(nameIndex + className.length) + } + element.className = classString +} + +/** + * @param {string} type + * @returns {Date} + */ +export function getTime(type) { + if (type === 'start') { + return new Date().getTime() - 3600 * 1000 * 24 * 90 + } else { + return new Date(new Date().toDateString()) + } +} + +/** + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + * @return {*} + */ +export function debounce(func, wait, immediate) { + let timeout, args, context, timestamp, result + + const later = function() { + // 据上一次触发时间间隔 + const last = +new Date() - timestamp + + // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait + if (last < wait && last > 0) { + timeout = setTimeout(later, wait - last) + } else { + timeout = null + // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 + if (!immediate) { + result = func.apply(context, args) + if (!timeout) context = args = null + } + } + } + + return function(...args) { + context = this + timestamp = +new Date() + const callNow = immediate && !timeout + // 如果延时不存在,重新设定延时 + if (!timeout) timeout = setTimeout(later, wait) + if (callNow) { + result = func.apply(context, args) + context = args = null + } + + return result + } +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} + */ +export function deepClone(source) { + if (!source && typeof source !== 'object') { + throw new Error('error arguments', 'deepClone') + } + const targetObj = source.constructor === Array ? [] : {} + Object.keys(source).forEach(keys => { + if (source[keys] && typeof source[keys] === 'object') { + targetObj[keys] = deepClone(source[keys]) + } else { + targetObj[keys] = source[keys] + } + }) + return targetObj +} + +/** + * @param {Array} arr + * @returns {Array} + */ +export function uniqueArr(arr) { + return Array.from(new Set(arr)) +} + +/** + * @returns {string} + */ +export function createUniqueString() { + const timestamp = +new Date() + '' + const randomNum = parseInt((1 + Math.random()) * 65536) + '' + return (+(randomNum + timestamp)).toString(32) +} + +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele, cls) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele, cls) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele, cls) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + ele.className = ele.className.replace(reg, ' ') + } +} + +export function makeMap(str, expectsLowerCase) { + const map = Object.create(null) + const list = str.split(',') + for (let i = 0; i < list.length; i++) { + map[list[i]] = true + } + return expectsLowerCase + ? val => map[val.toLowerCase()] + : val => map[val] +} + +export const exportDefault = 'export default ' + +export const beautifierConf = { + html: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'separate', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: false, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + }, + js: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'normal', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: true, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + } +} + +// 首字母大小 +export function titleCase(str) { + return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) +} + +// 下划转驼峰 +export function camelCase(str) { + return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) +} + +export function isNumberStr(str) { + return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) +} + diff --git a/admin-ui/src/utils/jsencrypt.js b/admin-ui/src/utils/jsencrypt.js new file mode 100644 index 0000000..78d9523 --- /dev/null +++ b/admin-ui/src/utils/jsencrypt.js @@ -0,0 +1,30 @@ +import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' + +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' + +const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + + 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + + 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + + 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + + 'UP8iWi1Qw0Y=' + +// 加密 +export function encrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对数据进行加密 +} + +// 解密 +export function decrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) // 设置私钥 + return encryptor.decrypt(txt) // 对数据进行解密 +} + diff --git a/admin-ui/src/utils/permission.js b/admin-ui/src/utils/permission.js new file mode 100644 index 0000000..0263bbc --- /dev/null +++ b/admin-ui/src/utils/permission.js @@ -0,0 +1,47 @@ +import store from '@/store' + +/** + * 字符权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkPermi(value) { + if (value && value instanceof Array && value.length > 0) { + const permissions = store.getters && store.getters.permissions + const permissionDatas = value + const all_permission = "*:*:*" + + const hasPermission = permissions.some(permission => { + return all_permission === permission || permissionDatas.includes(permission) + }) + + return hasPermission + + } else { + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) + return false + } +} + +/** + * 角色权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkRole(value) { + if (value && value instanceof Array && value.length > 0) { + const roles = store.getters && store.getters.roles + const permissionRoles = value + const super_admin = "admin" + + const hasRole = roles.some(role => { + return super_admin === role || permissionRoles.includes(role) + }) + + return hasRole + + } else { + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false + } +} \ No newline at end of file diff --git a/admin-ui/src/utils/request.js b/admin-ui/src/utils/request.js new file mode 100644 index 0000000..7150ecb --- /dev/null +++ b/admin-ui/src/utils/request.js @@ -0,0 +1,152 @@ +import axios from 'axios' +import { Notification, MessageBox, Message, Loading } from 'element-ui' +import store from '@/store' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { tansParams, blobValidate } from "@/utils/ruoyi" +import cache from '@/plugins/cache' +import { saveAs } from 'file-saver' + +let downloadLoadingInstance +// 是否显示重新登录 +export let isRelogin = { show: false } + +axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: process.env.VUE_APP_BASE_API, + // 超时 + timeout: 10000 +}) + +// request拦截器 +service.interceptors.request.use(config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false + if (getToken() && !isToken) { + config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 + if (config.method === 'get' && config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.params = {} + config.url = url + } + if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { + const requestObj = { + url: config.url, + data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, + time: new Date().getTime() + } + const requestSize = Object.keys(JSON.stringify(requestObj)).length // 请求数据大小 + const limitSize = 5 * 1024 * 1024 // 限制存放数据5M + if (requestSize >= limitSize) { + console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') + return config + } + const sessionObj = cache.session.getJSON('sessionObj') + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + cache.session.setJSON('sessionObj', requestObj) + } else { + const s_url = sessionObj.url // 请求地址 + const s_data = sessionObj.data // 请求数据 + const s_time = sessionObj.time // 请求时间 + const interval = 1000 // 间隔时间(ms),小于此时间视为重复提交 + if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { + const message = '数据正在处理,请勿重复提交' + console.warn(`[${s_url}]: ` + message) + return Promise.reject(new Error(message)) + } else { + cache.session.setJSON('sessionObj', requestObj) + } + } + } + return config +}, error => { + console.log(error) + Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(res => { + // 未设置状态码则默认成功状态 + const code = res.data.code || 200 + // 获取错误信息 + const msg = errorCode[code] || res.data.msg || errorCode['default'] + // 二进制数据则直接返回 + if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { + return res.data + } + if (code === 401) { + if (!isRelogin.show) { + isRelogin.show = true + MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { + isRelogin.show = false + store.dispatch('LogOut').then(() => { + location.href = '/index' + }) + }).catch(() => { + isRelogin.show = false + }) + } + return Promise.reject('无效的会话,或者会话已过期,请重新登录。') + } else if (code === 500) { + Message({ message: msg, type: 'error' }) + return Promise.reject(new Error(msg)) + } else if (code === 601) { + Message({ message: msg, type: 'warning' }) + return Promise.reject('error') + } else if (code !== 200) { + Notification.error({ title: msg }) + return Promise.reject('error') + } else { + return res.data + } + }, + error => { + console.log('err' + error) + let { message } = error + if (message == "Network Error") { + message = "后端接口连接异常" + } else if (message.includes("timeout")) { + message = "系统接口请求超时" + } else if (message.includes("Request failed with status code")) { + message = "系统接口" + message.substr(message.length - 3) + "异常" + } + Message({ message: message, type: 'error', duration: 5 * 1000 }) + return Promise.reject(error) + } +) + +// 通用下载方法 +export function download(url, params, filename, config) { + downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) + return service.post(url, params, { + transformRequest: [(params) => { return tansParams(params) }], + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + responseType: 'blob', + ...config + }).then(async (data) => { + const isBlob = blobValidate(data) + if (isBlob) { + const blob = new Blob([data]) + saveAs(blob, filename) + } else { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + Message.error(errMsg) + } + downloadLoadingInstance.close() + }).catch((r) => { + console.error(r) + Message.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) +} + +export default service diff --git a/admin-ui/src/utils/ruoyi.js b/admin-ui/src/utils/ruoyi.js new file mode 100644 index 0000000..3de2d98 --- /dev/null +++ b/admin-ui/src/utils/ruoyi.js @@ -0,0 +1,228 @@ +/** + * 通用js方法封装处理 + * Copyright (c) 2019 ruoyi + */ + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '') + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +// 表单重置 +export function resetForm(refName) { + if (this.$refs[refName]) { + this.$refs[refName].resetFields() + } +} + +// 添加日期范围 +export function addDateRange(params, dateRange, propName) { + let search = params + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} + dateRange = Array.isArray(dateRange) ? dateRange : [] + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0] + search.params['endTime'] = dateRange[1] + } else { + search.params['begin' + propName] = dateRange[0] + search.params['end' + propName] = dateRange[1] + } + return search +} + +// 回显数据字典 +export function selectDictLabel(datas, value) { + if (value === undefined) { + return "" + } + var actions = [] + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + value)) { + actions.push(datas[key].label) + return true + } + }) + if (actions.length === 0) { + actions.push(value) + } + return actions.join('') +} + +// 回显数据字典(字符串、数组) +export function selectDictLabels(datas, value, separator) { + if (value === undefined || value.length ===0) { + return "" + } + if (Array.isArray(value)) { + value = value.join(",") + } + var actions = [] + var currentSeparator = undefined === separator ? "," : separator + var temp = value.split(currentSeparator) + Object.keys(value.split(currentSeparator)).some((val) => { + var match = false + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + temp[val])) { + actions.push(datas[key].label + currentSeparator) + match = true + } + }) + if (!match) { + actions.push(temp[val] + currentSeparator) + } + }) + return actions.join('').substring(0, actions.join('').length - 1) +} + +// 字符串格式化(%s ) +export function sprintf(str) { + var args = arguments, flag = true, i = 1 + str = str.replace(/%s/g, function () { + var arg = args[i++] + if (typeof arg === 'undefined') { + flag = false + return '' + } + return arg + }) + return flag ? str : '' +} + +// 转换字符串,undefined,null等转化为"" +export function parseStrEmpty(str) { + if (!str || str == "undefined" || str == "null") { + return "" + } + return str +} + +// 数据合并 +export function mergeRecursive(source, target) { + for (var p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]) + } else { + source[p] = target[p] + } + } catch (e) { + source[p] = target[p] + } + } + return source +} + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export function handleTree(data, id, parentId, children) { + let config = { + id: id || 'id', + parentId: parentId || 'parentId', + childrenList: children || 'children' + } + + var childrenListMap = {} + var tree = [] + for (let d of data) { + let id = d[config.id] + childrenListMap[id] = d + if (!d[config.childrenList]) { + d[config.childrenList] = [] + } + } + + for (let d of data) { + let parentId = d[config.parentId] + let parentObj = childrenListMap[parentId] + if (!parentObj) { + tree.push(d) + } else { + parentObj[config.childrenList].push(d) + } + } + return tree +} + +/** +* 参数处理 +* @param {*} params 参数 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName] + var part = encodeURIComponent(propName) + "=" + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']' + var subPart = encodeURIComponent(params) + "=" + result += subPart + encodeURIComponent(value[key]) + "&" + } + } + } else { + result += part + encodeURIComponent(value) + "&" + } + } + } + return result +} + +// 返回项目路径 +export function getNormalPath(p) { + if (p.length === 0 || !p || p == 'undefined') { + return p + } + let res = p.replace('//', '/') + if (res[res.length - 1] === '/') { + return res.slice(0, res.length - 1) + } + return res +} + +// 验证是否为blob格式 +export function blobValidate(data) { + return data.type !== 'application/json' +} diff --git a/admin-ui/src/utils/scroll-to.js b/admin-ui/src/utils/scroll-to.js new file mode 100644 index 0000000..c5d8e04 --- /dev/null +++ b/admin-ui/src/utils/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b +} + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } +})() + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount +} + +function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop +} + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() +} diff --git a/admin-ui/src/utils/validate.js b/admin-ui/src/utils/validate.js new file mode 100644 index 0000000..6a4c0c5 --- /dev/null +++ b/admin-ui/src/utils/validate.js @@ -0,0 +1,114 @@ +/** + * 路径匹配器 + * @param {string} pattern + * @param {string} path + * @returns {Boolean} + */ +export function isPathMatch(pattern, path) { + const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*') + const regex = new RegExp(`^${regexPattern}$`) + return regex.test(path) +} + +/** + * 判断value字符串是否为空 + * @param {string} value + * @returns {Boolean} + */ +export function isEmpty(value) { + if (value == null || value == "" || value == undefined || value == "undefined") { + return true + } + return false +} + +/** + * 判断url是否是http或https + * @param {string} url + * @returns {Boolean} + */ +export function isHttp(url) { + return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 +} + +/** + * 判断path是否为外链 + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} + +/** + * @param {string} url + * @returns {Boolean} + */ +export function validURL(url) { + const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return reg.test(url) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validLowerCase(str) { + const reg = /^[a-z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUpperCase(str) { + const reg = /^[A-Z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validAlphabets(str) { + const reg = /^[A-Za-z]+$/ + return reg.test(str) +} + +/** + * @param {string} email + * @returns {Boolean} + */ +export function validEmail(email) { + const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function isString(str) { + return typeof str === 'string' || str instanceof String +} + +/** + * @param {Array} arg + * @returns {Boolean} + */ +export function isArray(arg) { + if (typeof Array.isArray === 'undefined') { + return Object.prototype.toString.call(arg) === '[object Array]' + } + return Array.isArray(arg) +} diff --git a/admin-ui/src/views/ai/balanceChangeRecord/index.vue b/admin-ui/src/views/ai/balanceChangeRecord/index.vue new file mode 100644 index 0000000..4a4b7c5 --- /dev/null +++ b/admin-ui/src/views/ai/balanceChangeRecord/index.vue @@ -0,0 +1,329 @@ + + + diff --git a/admin-ui/src/views/ai/banner/index.vue b/admin-ui/src/views/ai/banner/index.vue new file mode 100644 index 0000000..f167707 --- /dev/null +++ b/admin-ui/src/views/ai/banner/index.vue @@ -0,0 +1,532 @@ + + + + + \ No newline at end of file diff --git a/admin-ui/src/views/ai/customer/index.vue b/admin-ui/src/views/ai/customer/index.vue new file mode 100644 index 0000000..5e08c38 --- /dev/null +++ b/admin-ui/src/views/ai/customer/index.vue @@ -0,0 +1,766 @@ + + + + + diff --git a/admin-ui/src/views/ai/help/index.vue b/admin-ui/src/views/ai/help/index.vue new file mode 100644 index 0000000..f0f4d8b --- /dev/null +++ b/admin-ui/src/views/ai/help/index.vue @@ -0,0 +1,359 @@ + + + diff --git a/admin-ui/src/views/ai/manager/index.vue b/admin-ui/src/views/ai/manager/index.vue new file mode 100644 index 0000000..db14bfe --- /dev/null +++ b/admin-ui/src/views/ai/manager/index.vue @@ -0,0 +1,792 @@ + + + + + diff --git a/admin-ui/src/views/ai/manager/tag/index.vue b/admin-ui/src/views/ai/manager/tag/index.vue new file mode 100644 index 0000000..6babd4a --- /dev/null +++ b/admin-ui/src/views/ai/manager/tag/index.vue @@ -0,0 +1,560 @@ + + + + diff --git a/admin-ui/src/views/ai/message/index.vue b/admin-ui/src/views/ai/message/index.vue new file mode 100644 index 0000000..7cc3b99 --- /dev/null +++ b/admin-ui/src/views/ai/message/index.vue @@ -0,0 +1,471 @@ + + + + + \ No newline at end of file diff --git a/admin-ui/src/views/ai/order/index.vue b/admin-ui/src/views/ai/order/index.vue new file mode 100644 index 0000000..55ebeae --- /dev/null +++ b/admin-ui/src/views/ai/order/index.vue @@ -0,0 +1,533 @@ + + + + + diff --git a/admin-ui/src/views/ai/rebateRecord/index.vue b/admin-ui/src/views/ai/rebateRecord/index.vue new file mode 100644 index 0000000..b9e94ee --- /dev/null +++ b/admin-ui/src/views/ai/rebateRecord/index.vue @@ -0,0 +1,243 @@ + + + diff --git a/admin-ui/src/views/ai/recharge/index.vue b/admin-ui/src/views/ai/recharge/index.vue new file mode 100644 index 0000000..cc44b49 --- /dev/null +++ b/admin-ui/src/views/ai/recharge/index.vue @@ -0,0 +1,308 @@ + + + diff --git a/admin-ui/src/views/ai/rechargeGift/index.vue b/admin-ui/src/views/ai/rechargeGift/index.vue new file mode 100644 index 0000000..8b6d596 --- /dev/null +++ b/admin-ui/src/views/ai/rechargeGift/index.vue @@ -0,0 +1,470 @@ + + + + diff --git a/admin-ui/src/views/ai/rechargeGiftRecord/index.vue b/admin-ui/src/views/ai/rechargeGiftRecord/index.vue new file mode 100644 index 0000000..8022629 --- /dev/null +++ b/admin-ui/src/views/ai/rechargeGiftRecord/index.vue @@ -0,0 +1,278 @@ + + + diff --git a/admin-ui/src/views/ai/sampleAmount/index.vue b/admin-ui/src/views/ai/sampleAmount/index.vue new file mode 100644 index 0000000..ebd63e1 --- /dev/null +++ b/admin-ui/src/views/ai/sampleAmount/index.vue @@ -0,0 +1,402 @@ + + + diff --git a/admin-ui/src/views/ai/sampleAmountRecord/index.vue b/admin-ui/src/views/ai/sampleAmountRecord/index.vue new file mode 100644 index 0000000..fa526e2 --- /dev/null +++ b/admin-ui/src/views/ai/sampleAmountRecord/index.vue @@ -0,0 +1,289 @@ + + + diff --git a/admin-ui/src/views/ai/service/index.vue b/admin-ui/src/views/ai/service/index.vue new file mode 100644 index 0000000..7aa8acb --- /dev/null +++ b/admin-ui/src/views/ai/service/index.vue @@ -0,0 +1,283 @@ + + + diff --git a/admin-ui/src/views/ai/template/index.vue b/admin-ui/src/views/ai/template/index.vue new file mode 100644 index 0000000..72f1e01 --- /dev/null +++ b/admin-ui/src/views/ai/template/index.vue @@ -0,0 +1,386 @@ + + + diff --git a/admin-ui/src/views/ai/user/index.vue b/admin-ui/src/views/ai/user/index.vue new file mode 100644 index 0000000..c9ad232 --- /dev/null +++ b/admin-ui/src/views/ai/user/index.vue @@ -0,0 +1,461 @@ + + + diff --git a/admin-ui/src/views/ai/user/manager/index.vue b/admin-ui/src/views/ai/user/manager/index.vue new file mode 100644 index 0000000..8cf9770 --- /dev/null +++ b/admin-ui/src/views/ai/user/manager/index.vue @@ -0,0 +1,278 @@ + + + diff --git a/admin-ui/src/views/ai/work/index.vue b/admin-ui/src/views/ai/work/index.vue new file mode 100644 index 0000000..ecf8a27 --- /dev/null +++ b/admin-ui/src/views/ai/work/index.vue @@ -0,0 +1,353 @@ + + + diff --git a/admin-ui/src/views/dashboard/BarChart.vue b/admin-ui/src/views/dashboard/BarChart.vue new file mode 100644 index 0000000..88e7ef6 --- /dev/null +++ b/admin-ui/src/views/dashboard/BarChart.vue @@ -0,0 +1,102 @@ + + + diff --git a/admin-ui/src/views/dashboard/LineChart.vue b/admin-ui/src/views/dashboard/LineChart.vue new file mode 100644 index 0000000..702ff73 --- /dev/null +++ b/admin-ui/src/views/dashboard/LineChart.vue @@ -0,0 +1,135 @@ + + + diff --git a/admin-ui/src/views/dashboard/PanelGroup.vue b/admin-ui/src/views/dashboard/PanelGroup.vue new file mode 100644 index 0000000..1a1081f --- /dev/null +++ b/admin-ui/src/views/dashboard/PanelGroup.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/admin-ui/src/views/dashboard/PieChart.vue b/admin-ui/src/views/dashboard/PieChart.vue new file mode 100644 index 0000000..63f0d84 --- /dev/null +++ b/admin-ui/src/views/dashboard/PieChart.vue @@ -0,0 +1,79 @@ + + + diff --git a/admin-ui/src/views/dashboard/RaddarChart.vue b/admin-ui/src/views/dashboard/RaddarChart.vue new file mode 100644 index 0000000..312e018 --- /dev/null +++ b/admin-ui/src/views/dashboard/RaddarChart.vue @@ -0,0 +1,116 @@ + + + diff --git a/admin-ui/src/views/dashboard/mixins/resize.js b/admin-ui/src/views/dashboard/mixins/resize.js new file mode 100644 index 0000000..b1e76e9 --- /dev/null +++ b/admin-ui/src/views/dashboard/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.initListener() + }, + activated() { + if (!this.$_resizeHandler) { + // avoid duplication init + this.initListener() + } + + // when keep-alive chart activated, auto resize + this.resize() + }, + beforeDestroy() { + this.destroyListener() + }, + deactivated() { + this.destroyListener() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + initListener() { + this.$_resizeHandler = debounce(() => { + this.resize() + }, 100) + window.addEventListener('resize', this.$_resizeHandler) + + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + destroyListener() { + window.removeEventListener('resize', this.$_resizeHandler) + this.$_resizeHandler = null + + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + }, + resize() { + const { chart } = this + chart && chart.resize() + } + } +} diff --git a/admin-ui/src/views/error/401.vue b/admin-ui/src/views/error/401.vue new file mode 100644 index 0000000..448b6ec --- /dev/null +++ b/admin-ui/src/views/error/401.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/admin-ui/src/views/error/404.vue b/admin-ui/src/views/error/404.vue new file mode 100644 index 0000000..96f075c --- /dev/null +++ b/admin-ui/src/views/error/404.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/admin-ui/src/views/index copy.vue b/admin-ui/src/views/index copy.vue new file mode 100644 index 0000000..42c7a76 --- /dev/null +++ b/admin-ui/src/views/index copy.vue @@ -0,0 +1,1136 @@ + + + + + + diff --git a/admin-ui/src/views/index.vue b/admin-ui/src/views/index.vue new file mode 100644 index 0000000..c7a400b --- /dev/null +++ b/admin-ui/src/views/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/admin-ui/src/views/index_v1.vue b/admin-ui/src/views/index_v1.vue new file mode 100644 index 0000000..d2d2ec6 --- /dev/null +++ b/admin-ui/src/views/index_v1.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/admin-ui/src/views/login.vue b/admin-ui/src/views/login.vue new file mode 100644 index 0000000..5bdda11 --- /dev/null +++ b/admin-ui/src/views/login.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/admin-ui/src/views/monitor/cache/index.vue b/admin-ui/src/views/monitor/cache/index.vue new file mode 100644 index 0000000..f8b6648 --- /dev/null +++ b/admin-ui/src/views/monitor/cache/index.vue @@ -0,0 +1,148 @@ + + + diff --git a/admin-ui/src/views/monitor/cache/list.vue b/admin-ui/src/views/monitor/cache/list.vue new file mode 100644 index 0000000..9e0523e --- /dev/null +++ b/admin-ui/src/views/monitor/cache/list.vue @@ -0,0 +1,241 @@ + + + diff --git a/admin-ui/src/views/monitor/druid/index.vue b/admin-ui/src/views/monitor/druid/index.vue new file mode 100644 index 0000000..8c3a257 --- /dev/null +++ b/admin-ui/src/views/monitor/druid/index.vue @@ -0,0 +1,15 @@ + + diff --git a/admin-ui/src/views/monitor/job/index.vue b/admin-ui/src/views/monitor/job/index.vue new file mode 100644 index 0000000..783873f --- /dev/null +++ b/admin-ui/src/views/monitor/job/index.vue @@ -0,0 +1,513 @@ + + + diff --git a/admin-ui/src/views/monitor/job/log.vue b/admin-ui/src/views/monitor/job/log.vue new file mode 100644 index 0000000..22d4e31 --- /dev/null +++ b/admin-ui/src/views/monitor/job/log.vue @@ -0,0 +1,295 @@ + + + diff --git a/admin-ui/src/views/monitor/logininfor/index.vue b/admin-ui/src/views/monitor/logininfor/index.vue new file mode 100644 index 0000000..f16a3dc --- /dev/null +++ b/admin-ui/src/views/monitor/logininfor/index.vue @@ -0,0 +1,246 @@ + + + + diff --git a/admin-ui/src/views/monitor/online/index.vue b/admin-ui/src/views/monitor/online/index.vue new file mode 100644 index 0000000..048e51d --- /dev/null +++ b/admin-ui/src/views/monitor/online/index.vue @@ -0,0 +1,122 @@ + + + + diff --git a/admin-ui/src/views/monitor/operlog/index.vue b/admin-ui/src/views/monitor/operlog/index.vue new file mode 100644 index 0000000..6f80177 --- /dev/null +++ b/admin-ui/src/views/monitor/operlog/index.vue @@ -0,0 +1,323 @@ + + + + diff --git a/admin-ui/src/views/monitor/server/index.vue b/admin-ui/src/views/monitor/server/index.vue new file mode 100644 index 0000000..36b20f8 --- /dev/null +++ b/admin-ui/src/views/monitor/server/index.vue @@ -0,0 +1,207 @@ + + + diff --git a/admin-ui/src/views/redirect.vue b/admin-ui/src/views/redirect.vue new file mode 100644 index 0000000..db4c1d6 --- /dev/null +++ b/admin-ui/src/views/redirect.vue @@ -0,0 +1,12 @@ + diff --git a/admin-ui/src/views/register.vue b/admin-ui/src/views/register.vue new file mode 100644 index 0000000..d624fc6 --- /dev/null +++ b/admin-ui/src/views/register.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/admin-ui/src/views/system/config/index.vue b/admin-ui/src/views/system/config/index.vue new file mode 100644 index 0000000..c70d2c3 --- /dev/null +++ b/admin-ui/src/views/system/config/index.vue @@ -0,0 +1,395 @@ + + + + + \ No newline at end of file diff --git a/admin-ui/src/views/system/dept/index.vue b/admin-ui/src/views/system/dept/index.vue new file mode 100644 index 0000000..088f09d --- /dev/null +++ b/admin-ui/src/views/system/dept/index.vue @@ -0,0 +1,340 @@ + + + diff --git a/admin-ui/src/views/system/dict/data.vue b/admin-ui/src/views/system/dict/data.vue new file mode 100644 index 0000000..eeee478 --- /dev/null +++ b/admin-ui/src/views/system/dict/data.vue @@ -0,0 +1,414 @@ + + + diff --git a/admin-ui/src/views/system/dict/index.vue b/admin-ui/src/views/system/dict/index.vue new file mode 100644 index 0000000..ada7e07 --- /dev/null +++ b/admin-ui/src/views/system/dict/index.vue @@ -0,0 +1,347 @@ + + + \ No newline at end of file diff --git a/admin-ui/src/views/system/menu/index.vue b/admin-ui/src/views/system/menu/index.vue new file mode 100644 index 0000000..b61cf6f --- /dev/null +++ b/admin-ui/src/views/system/menu/index.vue @@ -0,0 +1,477 @@ + + + diff --git a/admin-ui/src/views/system/notice/index.vue b/admin-ui/src/views/system/notice/index.vue new file mode 100644 index 0000000..148b856 --- /dev/null +++ b/admin-ui/src/views/system/notice/index.vue @@ -0,0 +1,312 @@ + + + diff --git a/admin-ui/src/views/system/post/index.vue b/admin-ui/src/views/system/post/index.vue new file mode 100644 index 0000000..60a1859 --- /dev/null +++ b/admin-ui/src/views/system/post/index.vue @@ -0,0 +1,309 @@ + + + diff --git a/admin-ui/src/views/system/role/authUser.vue b/admin-ui/src/views/system/role/authUser.vue new file mode 100644 index 0000000..4859d59 --- /dev/null +++ b/admin-ui/src/views/system/role/authUser.vue @@ -0,0 +1,199 @@ + + + \ No newline at end of file diff --git a/admin-ui/src/views/system/role/index.vue b/admin-ui/src/views/system/role/index.vue new file mode 100644 index 0000000..ab01a4a --- /dev/null +++ b/admin-ui/src/views/system/role/index.vue @@ -0,0 +1,605 @@ + + + \ No newline at end of file diff --git a/admin-ui/src/views/system/role/selectUser.vue b/admin-ui/src/views/system/role/selectUser.vue new file mode 100644 index 0000000..d2b21bf --- /dev/null +++ b/admin-ui/src/views/system/role/selectUser.vue @@ -0,0 +1,136 @@ + + + diff --git a/admin-ui/src/views/system/user/authRole.vue b/admin-ui/src/views/system/user/authRole.vue new file mode 100644 index 0000000..90bc715 --- /dev/null +++ b/admin-ui/src/views/system/user/authRole.vue @@ -0,0 +1,123 @@ + + + \ No newline at end of file diff --git a/admin-ui/src/views/system/user/index.vue b/admin-ui/src/views/system/user/index.vue new file mode 100644 index 0000000..6ed32d6 --- /dev/null +++ b/admin-ui/src/views/system/user/index.vue @@ -0,0 +1,553 @@ + + + diff --git a/admin-ui/src/views/system/user/profile/index.vue b/admin-ui/src/views/system/user/profile/index.vue new file mode 100644 index 0000000..c070cd1 --- /dev/null +++ b/admin-ui/src/views/system/user/profile/index.vue @@ -0,0 +1,95 @@ + + + diff --git a/admin-ui/src/views/system/user/profile/resetPwd.vue b/admin-ui/src/views/system/user/profile/resetPwd.vue new file mode 100644 index 0000000..954d341 --- /dev/null +++ b/admin-ui/src/views/system/user/profile/resetPwd.vue @@ -0,0 +1,69 @@ + + + diff --git a/admin-ui/src/views/system/user/profile/userAvatar.vue b/admin-ui/src/views/system/user/profile/userAvatar.vue new file mode 100644 index 0000000..59afb35 --- /dev/null +++ b/admin-ui/src/views/system/user/profile/userAvatar.vue @@ -0,0 +1,184 @@ + + + + diff --git a/admin-ui/src/views/system/user/profile/userInfo.vue b/admin-ui/src/views/system/user/profile/userInfo.vue new file mode 100644 index 0000000..486adfc --- /dev/null +++ b/admin-ui/src/views/system/user/profile/userInfo.vue @@ -0,0 +1,88 @@ + + + diff --git a/admin-ui/src/views/tool/build/CodeTypeDialog.vue b/admin-ui/src/views/tool/build/CodeTypeDialog.vue new file mode 100644 index 0000000..b5c2e2e --- /dev/null +++ b/admin-ui/src/views/tool/build/CodeTypeDialog.vue @@ -0,0 +1,106 @@ + + diff --git a/admin-ui/src/views/tool/build/DraggableItem.vue b/admin-ui/src/views/tool/build/DraggableItem.vue new file mode 100644 index 0000000..e881778 --- /dev/null +++ b/admin-ui/src/views/tool/build/DraggableItem.vue @@ -0,0 +1,100 @@ + diff --git a/admin-ui/src/views/tool/build/IconsDialog.vue b/admin-ui/src/views/tool/build/IconsDialog.vue new file mode 100644 index 0000000..958be50 --- /dev/null +++ b/admin-ui/src/views/tool/build/IconsDialog.vue @@ -0,0 +1,123 @@ + + + diff --git a/admin-ui/src/views/tool/build/RightPanel.vue b/admin-ui/src/views/tool/build/RightPanel.vue new file mode 100644 index 0000000..c2760eb --- /dev/null +++ b/admin-ui/src/views/tool/build/RightPanel.vue @@ -0,0 +1,946 @@ + + + + + diff --git a/admin-ui/src/views/tool/build/TreeNodeDialog.vue b/admin-ui/src/views/tool/build/TreeNodeDialog.vue new file mode 100644 index 0000000..e913d0f --- /dev/null +++ b/admin-ui/src/views/tool/build/TreeNodeDialog.vue @@ -0,0 +1,148 @@ + + diff --git a/admin-ui/src/views/tool/build/index.vue b/admin-ui/src/views/tool/build/index.vue new file mode 100644 index 0000000..5849b34 --- /dev/null +++ b/admin-ui/src/views/tool/build/index.vue @@ -0,0 +1,767 @@ + + + + + diff --git a/admin-ui/src/views/tool/gen/basicInfoForm.vue b/admin-ui/src/views/tool/gen/basicInfoForm.vue new file mode 100644 index 0000000..3a6e2ed --- /dev/null +++ b/admin-ui/src/views/tool/gen/basicInfoForm.vue @@ -0,0 +1,60 @@ + + + diff --git a/admin-ui/src/views/tool/gen/createTable.vue b/admin-ui/src/views/tool/gen/createTable.vue new file mode 100644 index 0000000..e71996c --- /dev/null +++ b/admin-ui/src/views/tool/gen/createTable.vue @@ -0,0 +1,45 @@ + + + diff --git a/admin-ui/src/views/tool/gen/editTable.vue b/admin-ui/src/views/tool/gen/editTable.vue new file mode 100644 index 0000000..512f66e --- /dev/null +++ b/admin-ui/src/views/tool/gen/editTable.vue @@ -0,0 +1,229 @@ + + + diff --git a/admin-ui/src/views/tool/gen/genInfoForm.vue b/admin-ui/src/views/tool/gen/genInfoForm.vue new file mode 100644 index 0000000..60d9e87 --- /dev/null +++ b/admin-ui/src/views/tool/gen/genInfoForm.vue @@ -0,0 +1,312 @@ + + + diff --git a/admin-ui/src/views/tool/gen/importTable.vue b/admin-ui/src/views/tool/gen/importTable.vue new file mode 100644 index 0000000..cb080ce --- /dev/null +++ b/admin-ui/src/views/tool/gen/importTable.vue @@ -0,0 +1,120 @@ + + + diff --git a/admin-ui/src/views/tool/gen/index.vue b/admin-ui/src/views/tool/gen/index.vue new file mode 100644 index 0000000..83c026f --- /dev/null +++ b/admin-ui/src/views/tool/gen/index.vue @@ -0,0 +1,347 @@ + + + diff --git a/admin-ui/src/views/tool/swagger/index.vue b/admin-ui/src/views/tool/swagger/index.vue new file mode 100644 index 0000000..dd6b4a2 --- /dev/null +++ b/admin-ui/src/views/tool/swagger/index.vue @@ -0,0 +1,15 @@ + + diff --git a/admin-ui/src/views/user/user/index.vue b/admin-ui/src/views/user/user/index.vue new file mode 100644 index 0000000..43ce5bb --- /dev/null +++ b/admin-ui/src/views/user/user/index.vue @@ -0,0 +1,338 @@ + + + diff --git a/admin-ui/vue.config.js b/admin-ui/vue.config.js new file mode 100644 index 0000000..75b83c6 --- /dev/null +++ b/admin-ui/vue.config.js @@ -0,0 +1,136 @@ +'use strict' +const path = require('path') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +const CompressionPlugin = require('compression-webpack-plugin') + +const name = process.env.VUE_APP_TITLE || '管理系统' // 网页标题 + +const baseUrl = 'http://localhost:8110' // 后端接口 + +const port = process.env.port || process.env.npm_config_port || 80 // 端口 + +// vue.config.js 配置说明 +//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions +// 这里只列一部分,具体配置参考文档 +module.exports = { + // 部署生产环境和开发环境下的URL。 + // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 + // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 + publicPath: process.env.NODE_ENV === "production" ? "/" : "/", + // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) + outputDir: 'dist', + // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) + assetsDir: 'static', + // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 + productionSourceMap: false, + transpileDependencies: ['quill'], + // webpack-dev-server 相关配置 + devServer: { + host: '0.0.0.0', + port: port, + open: true, + proxy: { + // detail: https://cli.vuejs.org/config/#devserver-proxy + [process.env.VUE_APP_BASE_API]: { + target: baseUrl, + changeOrigin: true, + pathRewrite: { + ['^' + process.env.VUE_APP_BASE_API]: '' + } + }, + // springdoc proxy + '^/v3/api-docs/(.*)': { + target: baseUrl, + changeOrigin: true + } + }, + disableHostCheck: true + }, + css: { + loaderOptions: { + sass: { + sassOptions: { outputStyle: "expanded" } + } + } + }, + configureWebpack: { + name: name, + resolve: { + alias: { + '@': resolve('src') + } + }, + plugins: [ + // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件 + new CompressionPlugin({ + cache: false, // 不启用文件缓存 + test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式 + filename: '[path][base].gz[query]', // 压缩后的文件名 + algorithm: 'gzip', // 使用gzip压缩 + minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩 + deleteOriginalAssets: false // 压缩后删除原文件 + }) + ], + }, + chainWebpack(config) { + config.plugins.delete('preload') // TODO: need test + config.plugins.delete('prefetch') // TODO: need test + + // set svg-sprite-loader + config.module + .rule('svg') + .exclude.add(resolve('src/assets/icons')) + .end() + config.module + .rule('icons') + .test(/\.svg$/) + .include.add(resolve('src/assets/icons')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'icon-[name]' + }) + .end() + + config.when(process.env.NODE_ENV !== 'development', config => { + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use('script-ext-html-webpack-plugin', [{ + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + }]) + .end() + + config.optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' // only package third parties that are initially dependent + }, + elementUI: { + name: 'chunk-elementUI', // split elementUI into a single package + test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm + priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }) + config.optimization.runtimeChunk('single') + }) + } +} diff --git a/portal-ui/.env b/portal-ui/.env new file mode 100644 index 0000000..41d060e --- /dev/null +++ b/portal-ui/.env @@ -0,0 +1,6 @@ +# 接口地址 +VITE_AMAP_KEY = 6888d721d30981b479ecdabd85f286fe +VITE_AMAP_SAFE_KEY = 23d3fdbc6b4eaf65d4a82a16510938c9 +VITE_REGISTER_SOURCE = ALL +#VITE_REGISTER_SOURCE = XM001 +VITE_SHOW_PAY = SUCCESS \ No newline at end of file diff --git a/portal-ui/.env.development b/portal-ui/.env.development new file mode 100644 index 0000000..e6688d4 --- /dev/null +++ b/portal-ui/.env.development @@ -0,0 +1,3 @@ +# 端口 +VITE_PORT = 8887 +VITE_API_URL = https://api.undressing.name/api \ No newline at end of file diff --git a/portal-ui/.env.development.local b/portal-ui/.env.development.local new file mode 100644 index 0000000..1cb79ed --- /dev/null +++ b/portal-ui/.env.development.local @@ -0,0 +1,3 @@ +# 是否生成打包分析图表 +VITE_VISUALIZER = false +VITE_API_URL = https://api.undressing.name/api \ No newline at end of file diff --git a/portal-ui/.gitattributes b/portal-ui/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/portal-ui/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/portal-ui/.gitignore b/portal-ui/.gitignore new file mode 100644 index 0000000..6fec0bb --- /dev/null +++ b/portal-ui/.gitignore @@ -0,0 +1,27 @@ +.DS_Store +node_modules/ +unpackage +/dist/ +/manager/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test/unit/coverage/ +/test/e2e/reports/ +selenium-debug.log +nodejs/public/uploads + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +package-lock.json +.history +/unpackage/resources/ +/unpackage/dist/dev +/unpackage/dist/build/.automator +/unpackage/dist/build/app-plus +*.lock diff --git a/portal-ui/.prettierrc b/portal-ui/.prettierrc new file mode 100644 index 0000000..460243a --- /dev/null +++ b/portal-ui/.prettierrc @@ -0,0 +1,8 @@ +{ + "tabWidth": 4, + "semi": false, + "singleQuote": true, + "bracketSameLine": true, + "singleAttributePerLine": true, + "trailingComma": "none" +} diff --git a/portal-ui/README.md b/portal-ui/README.md new file mode 100644 index 0000000..012b98f --- /dev/null +++ b/portal-ui/README.md @@ -0,0 +1,29 @@ +## 开发 + +```bash + +# 进入项目目录 +cd xxx-ui + +# 安装依赖 +cnpm i + +# 安装速度慢的情况,可以通过如下操作解决 npm install --registry=https://registry.npmmirror.com + +# 启动服务 +npm run dev + +``` +浏览器访问 http://localhost:8887 + +## 发布 + +```bash + +# 构建开发环境 +npm run builddev + +# 构建生产环境 +npm run build + +``` \ No newline at end of file diff --git a/portal-ui/index.html b/portal-ui/index.html new file mode 100644 index 0000000..2d63180 --- /dev/null +++ b/portal-ui/index.html @@ -0,0 +1,30 @@ + + + + + + + asio + + +
+ + + + + + diff --git a/portal-ui/jsconfig.json b/portal-ui/jsconfig.json new file mode 100644 index 0000000..4b192c6 --- /dev/null +++ b/portal-ui/jsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Node", + "target": "ES2020", + "jsx": "preserve", + "allowImportingTsExtensions": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "**/node_modules/*"] +} diff --git a/portal-ui/package.json b/portal-ui/package.json new file mode 100644 index 0000000..8252c9f --- /dev/null +++ b/portal-ui/package.json @@ -0,0 +1,85 @@ +{ + "name": "his-build", + "version": "1.0.0", + "description": "his-build", + "author": "his-build", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vite --config vite.dev.config.js", + "build": "vite build --config vite.config.js", + "builddev": "NODE_ENV=development vite build --config vite.dev.config.js", + "preview": "vite preview", + "version": "date '+%Y-%m-%d %H:%M:%S' > static/version.txt" + }, + "dependencies": { + "@amap/amap-jsapi-loader": "^1.0.1", + "@antv/g2": "^5.1.20", + "@arco-design/web-vue": "^2.51.0", + "@tinymce/tinymce-vue": "5.1.1", + "axios": "^1.6.7", + "classnames": "^2.2.6", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.7", + "echarts": "^6.0.0", + "element-resize-detector": "^1.2.2", + "good-storage": "^1.1.1", + "highlight.js": "^11.11.1", + "js-base64": "^3.7.5", + "js-cookie": "^3.0.5", + "lodash-es": "^4.17.21", + "marked": "^16.2.0", + "mathjs": "^12.4.2", + "md5": "^2.3.0", + "pdfobject": "^2.2.11", + "qrcode.vue": "^3.6.0", + "qs": "^6.11.2", + "resize-detector": "^0.3.0", + "sortablejs": "^1.15.1", + "three": "^0.179.1", + "tinymce": "5.10.9", + "uuid": "^9.0.1", + "v-clipboard": "^3.0.0-next.1", + "v-viewer": "next", + "video.js": "^8.23.4", + "viewerjs": "^1.11.5", + "vue": "^3.3.4", + "vue-axios": "^3.2.4", + "vue-cropper": "^0.5.11", + "vue-i18n": "^9.2.2", + "vue-pdf-embed": "^2.1.3", + "vue-router": "^4.3.0", + "vuex": "^4.1.0", + "vxe-table": "4.4.2", + "xe-utils": "^3.5.11" + }, + "devDependencies": { + "@arco-plugins/vite-vue": "^1.4.5", + "@types/three": "^0.179.0", + "@vitejs/plugin-vue": "^5.0.4", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vueuse/core": "^10.4.1", + "css-loader": "^6.8.1", + "less": "^4.1.3", + "path": "^0.12.7", + "prettier": "3.3.2", + "rimraf": "^5.0.5", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "^1.64.1", + "sass-loader": "^14.1.1", + "unplugin-vue-components": "^0.25.1", + "vite": "^5.1.6", + "vite-svg-loader": "^5.1.0", + "vue-loader": "^17.0.1" + }, + "engines": { + "node": ">= 18.12.0", + "npm": ">= 8.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/portal-ui/src/App.vue b/portal-ui/src/App.vue new file mode 100644 index 0000000..4d121e8 --- /dev/null +++ b/portal-ui/src/App.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/portal-ui/src/api/user.js b/portal-ui/src/api/user.js new file mode 100644 index 0000000..2e83b41 --- /dev/null +++ b/portal-ui/src/api/user.js @@ -0,0 +1,230 @@ +/** + * 用户接口 + * @author john + * @date 2022/06/24 + */ + +import request from '@/utils/request' +import store from '@/store' +import { + v4 +} from 'uuid' +import qs from 'qs' + +/** + * 验证码 + */ +export function validateCode() { + return new Promise((resolve, reject) => { + let response = request({ + url: 'auth/code', + method: 'get' + }) + resolve(response) + }) +} + +/** + * 发送手机短信验证码 + */ +export function sendMsg(mobile) { + return new Promise((resolve, reject) => { + let response = request({ + url: `admin/mobile/${mobile}`, + method: 'get' + }) + resolve(response) + }) +} + +/** + * 用户登录 + * @param {Object} data + */ +export function loginMobile(data, Authorization) { + return new Promise((resolve) => { + let response = request({ + url: `auth/oauth2/token?grant_type=mobile&scope=server&code=${data.code}&mobile=${data.mobile}`, + method: 'post', + headers: { + Authorization + // 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + resolve(response) + }) +} + +/** + * 手机登录 + * @param {Object} data + */ +export function login(data) { + return new Promise((resolve) => { + let response = request({ + url: `auth/login`, + method: 'post', + data + }) + resolve(response) + }) +} + +/** + * 重置密码 + * @param {Object} data + */ +export function resetPassword(data) { + return new Promise((resolve, reject) => { + let response = request({ + url: 'admin/user/smsPassword', + method: 'put', + data: data + }) + resolve(response) + }) +} + +/** + * 用户注册 + * @param {Object} data + */ +export function register(data) { + return new Promise((resolve, reject) => { + let response = request({ + url: 'user/register', + method: 'post', + data: data + }) + resolve(response) + }) +} + +// 获取用户信息 +export function getInfo() { + return new Promise((resolve, reject) => { + request({ + url: 'api/user/getUserInfo', + method: 'get' + }) + .then((res) => { + if (res) { + resolve(res) + } else { + resolve(null) + } + }) + .catch((err) => { + reject(err) + }) + }) +} + +// 登出 +export function logout() { + return new Promise((resolve, reject) => { + let response = request({ + url: 'auth/logout', + method: 'delete' + }) + resolve(response) + }) +} + +// 添加用户 +export function addUser(data) { + return new Promise((resolve) => { + let response = request({ + url: 'user/add', + method: 'post', + data: data + }) + resolve(response) + }) +} + +// 删除用户 +export function deleteUser(id) { + return new Promise((resolve) => { + let response = request({ + url: `user/delete/${id}`, + method: 'get' + }) + resolve(response) + }) +} +// 重置密码 +export function rsetPassword(id) { + return new Promise((resolve) => { + let response = request({ + url: `user/rsetPassword/${id}`, + method: 'get' + }) + resolve(response) + }) +} + +// 设置密码 +export function changePassword(data) { + return new Promise((resolve) => { + let response = request({ + url: `admin/user/changePassword`, + method: 'put', + data: data + }) + resolve(response) + }) +} + +// 获取路由 +export const getRouters = () => { + return new Promise((resolve, reject) => { + request({ + url: 'admin/point/user/menu', + method: 'get' + }) + .then((res) => { + if (res) { + resolve(res) + } else { + resolve([]) + } + }) + .catch((_) => { + reject([]) + }) + }) +} + +// 切换端 +export const switchPoint = (pointType) => { + return new Promise((resolve) => { + let response = request({ + url: `admin/huser/change/${pointType}`, + method: 'get' + }) + resolve(response) + }) +} + +// 切换账号 +export const switchAccount = (id) => { + return new Promise((resolve) => { + let response = request({ + url: `admin/huser/change/user/${id}`, + method: 'get' + }) + resolve(response) + }) +} + +// 获取未读消息数量 +export const getUnreadMessageCount = () => { + return new Promise((resolve) => { + let response = request({ + url: `ssp/notification/unread`, + method: 'get' + }) + resolve(response) + }) +} \ No newline at end of file diff --git a/portal-ui/src/assets/images/arrow-left.svg b/portal-ui/src/assets/images/arrow-left.svg new file mode 100644 index 0000000..45bc278 --- /dev/null +++ b/portal-ui/src/assets/images/arrow-left.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/portal-ui/src/assets/images/arrow-right.svg b/portal-ui/src/assets/images/arrow-right.svg new file mode 100644 index 0000000..84a7917 --- /dev/null +++ b/portal-ui/src/assets/images/arrow-right.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/portal-ui/src/assets/images/none.png b/portal-ui/src/assets/images/none.png new file mode 100644 index 0000000..3a4ef61 Binary files /dev/null and b/portal-ui/src/assets/images/none.png differ diff --git a/portal-ui/src/assets/images/pdf-placeholder.png b/portal-ui/src/assets/images/pdf-placeholder.png new file mode 100644 index 0000000..7a34e16 Binary files /dev/null and b/portal-ui/src/assets/images/pdf-placeholder.png differ diff --git a/portal-ui/src/assets/styles/base.less b/portal-ui/src/assets/styles/base.less new file mode 100644 index 0000000..88e72d7 --- /dev/null +++ b/portal-ui/src/assets/styles/base.less @@ -0,0 +1,274 @@ +html, +body { + width: 100%; + height: 100%; + padding: 0; + margin: 0; +} +@font-face { + font-family: 'NotoSerifSC-Regular'; + src: url('https://oss-his-build.oss-cn-hangzhou.aliyuncs.com/fonts/NotoSerifSC-Regular.otf'); +} +@font-face { + font-family: 'SourceHanSansOLD-Normal'; + src: url('https://oss-his-build.oss-cn-hangzhou.aliyuncs.com/fonts/SourceHanSansOLD-Normal-2.otf'); +} + +body { + font-size: 14px; + -webkit-font-smoothing: antialiased; + color: #1f2329; + font-family: 'PingFang SC', 'Microsoft YaHei', Arial, sans-serif; + overflow: hidden; + position: relative; +} + +// firefox 滚动条样式 +* { + scrollbar-color: rgba(144, 147, 153, 0.5) #0f0f12; +} + +/*滚动条整体样式*/ +::-webkit-scrollbar { + background-color: #0f0f12; +} + +/*滚动条里面小方块*/ +::-webkit-scrollbar-thumb { + background-color: red; + border: 3px solid #0f0f12; +} + +/*滚动条里面轨道*/ +::-webkit-scrollbar-track { + background: #0f0f12; +} + +:focus { + outline: none; + + &-visible { + outline: none; + } +} + +.router-redirect { + width: 100%; + height: 100%; +} + +.fade-in-enter-active { + animation: fade-in 0.3s; +} + +.fade-in-leave-active { + animation: page-in 0.3s reverse; +} + +// 正常页面切换动画 +.page-enter-active { + animation: page-in 0.3s; +} + +.page-leave-active { + animation: page-in 0.3s reverse; +} + +@keyframes page-in { + 0% { + //transform: scale(0.2); + opacity: 0; + } + + 100% { + //transform: scale(1); + opacity: 1; + } +} + +@keyframes ant-line { + to { + stroke-dashoffset: -1000; + } +} + +// 左右切换页面动画 +.slide-left-enter-active { + animation: slide-left-in 0.3s; +} + +.slide-left-leave-active { + animation: slide-right-in 0.3s reverse; +} + +.slide-right-enter-active { + animation: slide-right-in 0.3s; +} + +.slide-right-leave-active { + animation: slide-left-in 0.3s reverse; +} + +@keyframes slide-left-in { + 0% { + transform: translateX(-50%); + opacity: 0.3; + } + + 100% { + transform: translateX(0); + opacity: 1; + } +} + +@keyframes slide-right-in { + 0% { + transform: translateX(50%); + opacity: 0.3; + } + + 100% { + transform: translateX(0); + opacity: 1; + } +} + +ul, +li { + // list-style: none; + margin: 0; + padding: 0; + box-sizing: border-box; +} + +em { + font-style: normal; +} + +h1, +h3, +h5, +p { + margin: 0; +} + +a { + text-decoration: none; +} + +div { + box-sizing: border-box; +} + +fieldset { + border: 1px solid #e6e6e6; + + > legend { + } +} + +.fl { + display: flex; + + &.fc { + align-items: center; + } + + &.jc { + justify-content: center; + } + + &.jb { + justify-content: space-between; + } + + &.jr { + justify-content: space-around; + } + + &.je { + justify-content: flex-end; + } +} + +.empty-data { + padding: 20px 10px; + font-size: 14px; + font-weight: bold; + color: #fd8000; +} + +.page-error { + color: red; + font-size: 20px; + padding: 30px; +} + +html { + * { + box-sizing: border-box; + scrollbar-width: thin; + } +} + +@keyframes rotating { + 0% { + transform: rotateZ(0); + } + + 100% { + transform: rotateZ(360deg); + } +} + +input:-webkit-autofill { + -webkit-text-fill-color: var(--color-text-1) !important; + -webkit-box-shadow: 0 0 0px 1000px transparent inset !important; + background-color: transparent !important; + background-image: none; + transition: background-color 50000s ease-in-out 0s; +} + +.arco-page-header-wrapper { + padding-left: 0; +} + +.mf-fullscreen { + position: fixed !important; + top: 0 !important; + left: 0 !important; + width: 100vw !important; + height: 100vh !important; + z-index: 100 !important; + background: #fff; + padding: 12px !important; +} + +.arco-modal-simple { + background: #0f0f12; + border-radius: 10px; + border: 2px solid #e6217a; + .arco-modal-title { + color: #fff; + } + .arco-modal-body { + color: #fff; + } + + .arco-modal-footer { + .arco-btn-secondary { + color: #ffffff; + background-color: #1a1a1a; + border: 1px solid #1a1a1a; + &:hover { + background-color: #262626; + } + } + } +} + +@media (max-width: 576px) { + .arco-modal-simple { + width: calc(100% - 20px); + } +} \ No newline at end of file diff --git a/portal-ui/src/assets/styles/quill.bubble.css b/portal-ui/src/assets/styles/quill.bubble.css new file mode 100644 index 0000000..7445b66 --- /dev/null +++ b/portal-ui/src/assets/styles/quill.bubble.css @@ -0,0 +1,10 @@ +/*! + * Quill Editor v2.0.2 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-bubble.ql-toolbar:after,.ql-bubble .ql-toolbar:after{clear:both;content:'';display:table}.ql-bubble.ql-toolbar button,.ql-bubble .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-bubble.ql-toolbar button svg,.ql-bubble .ql-toolbar button svg{float:left;height:100%}.ql-bubble.ql-toolbar button:active:hover,.ql-bubble .ql-toolbar button:active:hover{outline:none}.ql-bubble.ql-toolbar input.ql-image[type=file],.ql-bubble .ql-toolbar input.ql-image[type=file]{display:none}.ql-bubble.ql-toolbar button:hover,.ql-bubble .ql-toolbar button:hover,.ql-bubble.ql-toolbar button:focus,.ql-bubble .ql-toolbar button:focus,.ql-bubble.ql-toolbar button.ql-active,.ql-bubble .ql-toolbar button.ql-active,.ql-bubble.ql-toolbar .ql-picker-label:hover,.ql-bubble .ql-toolbar .ql-picker-label:hover,.ql-bubble.ql-toolbar .ql-picker-label.ql-active,.ql-bubble .ql-toolbar .ql-picker-label.ql-active,.ql-bubble.ql-toolbar .ql-picker-item:hover,.ql-bubble .ql-toolbar .ql-picker-item:hover,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected{color:#fff}.ql-bubble.ql-toolbar button:hover .ql-fill,.ql-bubble .ql-toolbar button:hover .ql-fill,.ql-bubble.ql-toolbar button:focus .ql-fill,.ql-bubble .ql-toolbar button:focus .ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#fff}.ql-bubble.ql-toolbar button:hover .ql-stroke,.ql-bubble .ql-toolbar button:hover .ql-stroke,.ql-bubble.ql-toolbar button:focus .ql-stroke,.ql-bubble .ql-toolbar button:focus .ql-stroke,.ql-bubble.ql-toolbar button.ql-active .ql-stroke,.ql-bubble .ql-toolbar button.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble.ql-toolbar button:hover .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover .ql-stroke-miter,.ql-bubble.ql-toolbar button:focus .ql-stroke-miter,.ql-bubble .ql-toolbar button:focus .ql-stroke-miter,.ql-bubble.ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#fff}@media (pointer:coarse){.ql-bubble.ql-toolbar button:hover:not(.ql-active),.ql-bubble .ql-toolbar button:hover:not(.ql-active){color:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#ccc}}.ql-bubble{box-sizing:border-box}.ql-bubble *{box-sizing:border-box}.ql-bubble .ql-hidden{display:none}.ql-bubble .ql-out-bottom,.ql-bubble .ql-out-top{visibility:hidden}.ql-bubble .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-bubble .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-bubble .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-bubble .ql-formats{display:inline-block;vertical-align:middle}.ql-bubble .ql-formats:after{clear:both;content:'';display:table}.ql-bubble .ql-stroke{fill:none;stroke:#ccc;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-bubble .ql-stroke-miter{fill:none;stroke:#ccc;stroke-miterlimit:10;stroke-width:2}.ql-bubble .ql-fill,.ql-bubble .ql-stroke.ql-fill{fill:#ccc}.ql-bubble .ql-empty{fill:none}.ql-bubble .ql-even{fill-rule:evenodd}.ql-bubble .ql-thin,.ql-bubble .ql-stroke.ql-thin{stroke-width:1}.ql-bubble .ql-transparent{opacity:.4}.ql-bubble .ql-direction svg:last-child{display:none}.ql-bubble .ql-direction.ql-active svg:last-child{display:inline}.ql-bubble .ql-direction.ql-active svg:first-child{display:none}.ql-bubble .ql-editor h1{font-size:2em}.ql-bubble .ql-editor h2{font-size:1.5em}.ql-bubble .ql-editor h3{font-size:1.17em}.ql-bubble .ql-editor h4{font-size:1em}.ql-bubble .ql-editor h5{font-size:.83em}.ql-bubble .ql-editor h6{font-size:.67em}.ql-bubble .ql-editor a{text-decoration:underline}.ql-bubble .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-bubble .ql-editor code,.ql-bubble .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-bubble .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-bubble .ql-editor code{font-size:85%;padding:2px 4px}.ql-bubble .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-bubble .ql-editor img{max-width:100%}.ql-bubble .ql-picker{color:#ccc;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-bubble .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-bubble .ql-picker-label::before{display:inline-block;line-height:22px}.ql-bubble .ql-picker-options{background-color:#444;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-bubble .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-bubble .ql-picker.ql-expanded .ql-picker-label{color:#777;z-index:2}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-bubble .ql-color-picker,.ql-bubble .ql-icon-picker{width:28px}.ql-bubble .ql-color-picker .ql-picker-label,.ql-bubble .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-label svg,.ql-bubble .ql-icon-picker .ql-picker-label svg{right:4px}.ql-bubble .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-bubble .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-bubble .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-bubble .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-bubble .ql-picker.ql-header{width:98px}.ql-bubble .ql-picker.ql-header .ql-picker-label::before,.ql-bubble .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-bubble .ql-picker.ql-font{width:108px}.ql-bubble .ql-picker.ql-font .ql-picker-label::before,.ql-bubble .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-bubble .ql-picker.ql-size{width:98px}.ql-bubble .ql-picker.ql-size .ql-picker-label::before,.ql-bubble .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-bubble .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-bubble .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-bubble .ql-toolbar .ql-formats{margin:8px 12px 8px 0}.ql-bubble .ql-toolbar .ql-formats:first-child{margin-left:12px}.ql-bubble .ql-color-picker svg{margin:1px}.ql-bubble .ql-color-picker .ql-picker-item.ql-selected,.ql-bubble .ql-color-picker .ql-picker-item:hover{border-color:#fff}.ql-bubble .ql-tooltip{background-color:#444;border-radius:25px;color:#fff}.ql-bubble .ql-tooltip-arrow{border-left:6px solid transparent;border-right:6px solid transparent;content:" ";display:block;left:50%;margin-left:-6px;position:absolute}.ql-bubble .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow{border-bottom:6px solid #444;top:-6px}.ql-bubble .ql-tooltip.ql-flip .ql-tooltip-arrow{border-top:6px solid #444;bottom:-6px}.ql-bubble .ql-tooltip.ql-editing .ql-tooltip-editor{display:block}.ql-bubble .ql-tooltip.ql-editing .ql-formats{visibility:hidden}.ql-bubble .ql-tooltip-editor{display:none}.ql-bubble .ql-tooltip-editor input[type=text]{background:transparent;border:none;color:#fff;font-size:13px;height:100%;outline:none;padding:10px 20px;position:absolute;width:100%}.ql-bubble .ql-tooltip-editor a{top:10px;position:absolute;right:20px}.ql-bubble .ql-tooltip-editor a:before{color:#ccc;content:"\00D7";font-size:16px;font-weight:bold}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close){position:relative;white-space:nowrap}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before{background-color:#444;border-radius:15px;top:-5px;font-size:12px;color:#fff;content:attr(href);font-weight:normal;overflow:hidden;padding:5px 15px;text-decoration:none;z-index:1}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{border-top:6px solid #444;border-left:6px solid transparent;border-right:6px solid transparent;top:0;content:" ";height:0;width:0}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{left:0;margin-left:50%;position:absolute;transform:translate(-50%,-100%);transition:visibility 0s ease 200ms;visibility:hidden}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::after{visibility:visible} + +/*# sourceMappingURL=quill.bubble.css.map*/ \ No newline at end of file diff --git a/portal-ui/src/assets/styles/quill.core.css b/portal-ui/src/assets/styles/quill.core.css new file mode 100644 index 0000000..8541b2b --- /dev/null +++ b/portal-ui/src/assets/styles/quill.core.css @@ -0,0 +1,618 @@ +/*! + * Quill Editor v2.0.2 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0; + position: relative +} + +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden +} + +.ql-container:not(.ql-disabled) li[data-list=checked]>.ql-ui, +.ql-container:not(.ql-disabled) li[data-list=unchecked]>.ql-ui { + cursor: pointer +} + +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50% +} + +.ql-clipboard p { + margin: 0; + padding: 0 +} + +.ql-editor { + box-sizing: border-box; + counter-reset: list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word +} + +.ql-editor>* { + cursor: text +} + +.ql-editor p, +.ql-editor ol, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0 +} + +@supports (counter-set:none) { + + .ql-editor p, + .ql-editor h1, + .ql-editor h2, + .ql-editor h3, + .ql-editor h4, + .ql-editor h5, + .ql-editor h6 { + counter-set: list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + + .ql-editor p, + .ql-editor h1, + .ql-editor h2, + .ql-editor h3, + .ql-editor h4, + .ql-editor h5, + .ql-editor h6 { + counter-reset: list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor table { + border-collapse: collapse +} + +.ql-editor td { + border: 1px solid #000; + padding: 2px 5px +} + +.ql-editor ol { + padding-left: 1.5em +} + +.ql-editor li { + list-style-type: none; + padding-left: 1.5em; + position: relative +} + +.ql-editor li>.ql-ui:before { + display: inline-block; + margin-left: -1.5em; + margin-right: .3em; + text-align: right; + white-space: nowrap; + width: 1.2em +} + +.ql-editor li[data-list=checked]>.ql-ui, +.ql-editor li[data-list=unchecked]>.ql-ui { + color: #777 +} + +.ql-editor li[data-list=bullet]>.ql-ui:before { + content: '\2022' +} + +.ql-editor li[data-list=checked]>.ql-ui:before { + content: '\2611' +} + +.ql-editor li[data-list=unchecked]>.ql-ui:before { + content: '\2610' +} + +@supports (counter-set:none) { + .ql-editor li[data-list] { + counter-set: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list] { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered] { + counter-increment: list-0 +} + +.ql-editor li[data-list=ordered]>.ql-ui:before { + content: counter(list-0, decimal) '. ' +} + +.ql-editor li[data-list=ordered].ql-indent-1 { + counter-increment: list-1 +} + +.ql-editor li[data-list=ordered].ql-indent-1>.ql-ui:before { + content: counter(list-1, lower-alpha) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-1 { + counter-set: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-2 { + counter-increment: list-2 +} + +.ql-editor li[data-list=ordered].ql-indent-2>.ql-ui:before { + content: counter(list-2, lower-roman) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-2 { + counter-set: list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-3 { + counter-increment: list-3 +} + +.ql-editor li[data-list=ordered].ql-indent-3>.ql-ui:before { + content: counter(list-3, decimal) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-3 { + counter-set: list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-4 { + counter-increment: list-4 +} + +.ql-editor li[data-list=ordered].ql-indent-4>.ql-ui:before { + content: counter(list-4, lower-alpha) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-4 { + counter-set: list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-5 { + counter-increment: list-5 +} + +.ql-editor li[data-list=ordered].ql-indent-5>.ql-ui:before { + content: counter(list-5, lower-roman) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-5 { + counter-set: list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-6 { + counter-increment: list-6 +} + +.ql-editor li[data-list=ordered].ql-indent-6>.ql-ui:before { + content: counter(list-6, decimal) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-6 { + counter-set: list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-6 { + counter-reset: list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-7 { + counter-increment: list-7 +} + +.ql-editor li[data-list=ordered].ql-indent-7>.ql-ui:before { + content: counter(list-7, lower-alpha) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-7 { + counter-set: list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-7 { + counter-reset: list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-8 { + counter-increment: list-8 +} + +.ql-editor li[data-list=ordered].ql-indent-8>.ql-ui:before { + content: counter(list-8, lower-roman) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-8 { + counter-set: list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-8 { + counter-reset: list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-9 { + counter-increment: list-9 +} + +.ql-editor li[data-list=ordered].ql-indent-9>.ql-ui:before { + content: counter(list-9, decimal) '. ' +} + +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em +} + +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em +} + +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em +} + +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em +} + +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em +} + +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em +} + +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em +} + +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em +} + +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em +} + +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em +} + +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em +} + +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em +} + +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em +} + +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em +} + +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em +} + +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em +} + +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em +} + +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em +} + +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em +} + +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em +} + +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em +} + +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em +} + +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em +} + +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em +} + +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em +} + +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em +} + +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em +} + +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em +} + +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em +} + +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em +} + +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em +} + +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em +} + +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em +} + +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em +} + +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em +} + +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em +} + +.ql-editor li.ql-direction-rtl { + padding-right: 1.5em +} + +.ql-editor li.ql-direction-rtl>.ql-ui:before { + margin-left: .3em; + margin-right: -1.5em; + text-align: left +} + +.ql-editor table { + table-layout: fixed; + width: 100% +} + +.ql-editor table td { + outline: none +} + +.ql-editor .ql-code-block-container { + font-family: monospace +} + +.ql-editor .ql-video { + display: block; + max-width: 100% +} + +.ql-editor .ql-video.ql-align-center { + margin: 0 auto +} + +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto +} + +.ql-editor .ql-bg-black { + background-color: #000 +} + +.ql-editor .ql-bg-red { + background-color: #e60000 +} + +.ql-editor .ql-bg-orange { + background-color: #f90 +} + +.ql-editor .ql-bg-yellow { + background-color: #ff0 +} + +.ql-editor .ql-bg-green { + background-color: #008a00 +} + +.ql-editor .ql-bg-blue { + background-color: #06c +} + +.ql-editor .ql-bg-purple { + background-color: #93f +} + +.ql-editor .ql-color-white { + color: #fff +} + +.ql-editor .ql-color-red { + color: #e60000 +} + +.ql-editor .ql-color-orange { + color: #f90 +} + +.ql-editor .ql-color-yellow { + color: #ff0 +} + +.ql-editor .ql-color-green { + color: #008a00 +} + +.ql-editor .ql-color-blue { + color: #06c +} + +.ql-editor .ql-color-purple { + color: #93f +} + +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif +} + +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace +} + +.ql-editor .ql-size-small { + font-size: .75em +} + +.ql-editor .ql-size-large { + font-size: 1.5em +} + +.ql-editor .ql-size-huge { + font-size: 2.5em +} + +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit +} + +.ql-editor .ql-align-center { + text-align: center +} + +.ql-editor .ql-align-justify { + text-align: justify +} + +.ql-editor .ql-align-right { + text-align: right +} + +.ql-editor .ql-ui { + position: absolute +} + +.ql-editor.ql-blank::before { + color: rgba(0, 0, 0, 0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px +} + +/*# sourceMappingURL=quill.core.css.map*/ \ No newline at end of file diff --git a/portal-ui/src/assets/styles/quill.snow.css b/portal-ui/src/assets/styles/quill.snow.css new file mode 100644 index 0000000..650a402 --- /dev/null +++ b/portal-ui/src/assets/styles/quill.snow.css @@ -0,0 +1,1289 @@ +/*! + * Quill Editor v2.0.2 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0; + position: relative +} + +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden +} + +.ql-container:not(.ql-disabled) li[data-list=checked]>.ql-ui, +.ql-container:not(.ql-disabled) li[data-list=unchecked]>.ql-ui { + cursor: pointer +} + +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50% +} + +.ql-clipboard p { + margin: 0; + padding: 0 +} + +.ql-editor { + box-sizing: border-box; + counter-reset: list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word +} + +.ql-editor>* { + cursor: text +} + +.ql-editor p, +.ql-editor ol, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0 +} + +@supports (counter-set:none) { + + .ql-editor p, + .ql-editor h1, + .ql-editor h2, + .ql-editor h3, + .ql-editor h4, + .ql-editor h5, + .ql-editor h6 { + counter-set: list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + + .ql-editor p, + .ql-editor h1, + .ql-editor h2, + .ql-editor h3, + .ql-editor h4, + .ql-editor h5, + .ql-editor h6 { + counter-reset: list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor table { + border-collapse: collapse +} + +.ql-editor td { + border: 1px solid #000; + padding: 2px 5px +} + +.ql-editor ol { + padding-left: 1.5em +} + +.ql-editor li { + list-style-type: none; + padding-left: 1.5em; + position: relative +} + +.ql-editor li>.ql-ui:before { + display: inline-block; + margin-left: -1.5em; + margin-right: .3em; + text-align: right; + white-space: nowrap; + width: 1.2em +} + +.ql-editor li[data-list=checked]>.ql-ui, +.ql-editor li[data-list=unchecked]>.ql-ui { + color: #777 +} + +.ql-editor li[data-list=bullet]>.ql-ui:before { + content: '\2022' +} + +.ql-editor li[data-list=checked]>.ql-ui:before { + content: '\2611' +} + +.ql-editor li[data-list=unchecked]>.ql-ui:before { + content: '\2610' +} + +@supports (counter-set:none) { + .ql-editor li[data-list] { + counter-set: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list] { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered] { + counter-increment: list-0 +} + +.ql-editor li[data-list=ordered]>.ql-ui:before { + content: counter(list-0, decimal) '. ' +} + +.ql-editor li[data-list=ordered].ql-indent-1 { + counter-increment: list-1 +} + +.ql-editor li[data-list=ordered].ql-indent-1>.ql-ui:before { + content: counter(list-1, lower-alpha) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-1 { + counter-set: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-2 { + counter-increment: list-2 +} + +.ql-editor li[data-list=ordered].ql-indent-2>.ql-ui:before { + content: counter(list-2, lower-roman) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-2 { + counter-set: list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-3 { + counter-increment: list-3 +} + +.ql-editor li[data-list=ordered].ql-indent-3>.ql-ui:before { + content: counter(list-3, decimal) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-3 { + counter-set: list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-4 { + counter-increment: list-4 +} + +.ql-editor li[data-list=ordered].ql-indent-4>.ql-ui:before { + content: counter(list-4, lower-alpha) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-4 { + counter-set: list-5 list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-5 { + counter-increment: list-5 +} + +.ql-editor li[data-list=ordered].ql-indent-5>.ql-ui:before { + content: counter(list-5, lower-roman) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-5 { + counter-set: list-6 list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-6 { + counter-increment: list-6 +} + +.ql-editor li[data-list=ordered].ql-indent-6>.ql-ui:before { + content: counter(list-6, decimal) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-6 { + counter-set: list-7 list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-6 { + counter-reset: list-7 list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-7 { + counter-increment: list-7 +} + +.ql-editor li[data-list=ordered].ql-indent-7>.ql-ui:before { + content: counter(list-7, lower-alpha) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-7 { + counter-set: list-8 list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-7 { + counter-reset: list-8 list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-8 { + counter-increment: list-8 +} + +.ql-editor li[data-list=ordered].ql-indent-8>.ql-ui:before { + content: counter(list-8, lower-roman) '. ' +} + +@supports (counter-set:none) { + .ql-editor li[data-list].ql-indent-8 { + counter-set: list-9 + } +} + +@supports not (counter-set:none) { + .ql-editor li[data-list].ql-indent-8 { + counter-reset: list-9 + } +} + +.ql-editor li[data-list=ordered].ql-indent-9 { + counter-increment: list-9 +} + +.ql-editor li[data-list=ordered].ql-indent-9>.ql-ui:before { + content: counter(list-9, decimal) '. ' +} + +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em +} + +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em +} + +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em +} + +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em +} + +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em +} + +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em +} + +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em +} + +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em +} + +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em +} + +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em +} + +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em +} + +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em +} + +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em +} + +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em +} + +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em +} + +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em +} + +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em +} + +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em +} + +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em +} + +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em +} + +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em +} + +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em +} + +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em +} + +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em +} + +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em +} + +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em +} + +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em +} + +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em +} + +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em +} + +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em +} + +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em +} + +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em +} + +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em +} + +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em +} + +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em +} + +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em +} + +.ql-editor li.ql-direction-rtl { + padding-right: 1.5em +} + +.ql-editor li.ql-direction-rtl>.ql-ui:before { + margin-left: .3em; + margin-right: -1.5em; + text-align: left +} + +.ql-editor table { + table-layout: fixed; + width: 100% +} + +.ql-editor table td { + outline: none +} + +.ql-editor .ql-code-block-container { + font-family: monospace +} + +.ql-editor .ql-video { + display: block; + max-width: 100% +} + +.ql-editor .ql-video.ql-align-center { + margin: 0 auto +} + +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto +} + +.ql-editor .ql-bg-black { + background-color: #000 +} + +.ql-editor .ql-bg-red { + background-color: #e60000 +} + +.ql-editor .ql-bg-orange { + background-color: #f90 +} + +.ql-editor .ql-bg-yellow { + background-color: #ff0 +} + +.ql-editor .ql-bg-green { + background-color: #008a00 +} + +.ql-editor .ql-bg-blue { + background-color: #06c +} + +.ql-editor .ql-bg-purple { + background-color: #93f +} + +.ql-editor .ql-color-white { + color: #fff +} + +.ql-editor .ql-color-red { + color: #e60000 +} + +.ql-editor .ql-color-orange { + color: #f90 +} + +.ql-editor .ql-color-yellow { + color: #ff0 +} + +.ql-editor .ql-color-green { + color: #008a00 +} + +.ql-editor .ql-color-blue { + color: #06c +} + +.ql-editor .ql-color-purple { + color: #93f +} + +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif +} + +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace +} + +.ql-editor .ql-size-small { + font-size: .75em +} + +.ql-editor .ql-size-large { + font-size: 1.5em +} + +.ql-editor .ql-size-huge { + font-size: 2.5em +} + +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit +} + +.ql-editor .ql-align-center { + text-align: center +} + +.ql-editor .ql-align-justify { + text-align: justify +} + +.ql-editor .ql-align-right { + text-align: right +} + +.ql-editor .ql-ui { + position: absolute +} + +.ql-editor.ql-blank::before { + color: rgba(0, 0, 0, 0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px +} + +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table +} + +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px +} + +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100% +} + +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none +} + +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none +} + +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c +} + +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c +} + +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c +} + +@media (pointer:coarse) { + + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444 + } + + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444 + } + + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444 + } +} + +.ql-snow { + box-sizing: border-box +} + +.ql-snow * { + box-sizing: border-box +} + +.ql-snow .ql-hidden { + display: none +} + +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden +} + +.ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px) +} + +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none +} + +.ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px) +} + +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle +} + +.ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table +} + +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2 +} + +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2 +} + +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444 +} + +.ql-snow .ql-empty { + fill: none +} + +.ql-snow .ql-even { + fill-rule: evenodd +} + +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1 +} + +.ql-snow .ql-transparent { + opacity: .4 +} + +.ql-snow .ql-direction svg:last-child { + display: none +} + +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline +} + +.ql-snow .ql-direction.ql-active svg:first-child { + display: none +} + +.ql-snow .ql-editor h1 { + font-size: 2em +} + +.ql-snow .ql-editor h2 { + font-size: 1.5em +} + +.ql-snow .ql-editor h3 { + font-size: 1.17em +} + +.ql-snow .ql-editor h4 { + font-size: 1em +} + +.ql-snow .ql-editor h5 { + font-size: .83em +} + +.ql-snow .ql-editor h6 { + font-size: .67em +} + +.ql-snow .ql-editor a { + text-decoration: underline +} + +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px +} + +.ql-snow .ql-editor code, +.ql-snow .ql-editor .ql-code-block-container { + background-color: #f0f0f0; + border-radius: 3px +} + +.ql-snow .ql-editor .ql-code-block-container { + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px +} + +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px +} + +.ql-snow .ql-editor .ql-code-block-container { + background-color: #23241f; + color: #f8f8f2; + overflow: visible +} + +.ql-snow .ql-editor img { + max-width: 100% +} + +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle +} + +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100% +} + +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px +} + +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap +} + +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px +} + +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2 +} + +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc +} + +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc +} + +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1 +} + +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px +} + +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px +} + +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px +} + +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0 +} + +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px +} + +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px +} + +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0; + width: 16px +} + +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px +} + +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label) +} + +.ql-snow .ql-picker.ql-header { + width: 98px +} + +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal' +} + +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1' +} + +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2' +} + +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3' +} + +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4' +} + +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5' +} + +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6' +} + +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em +} + +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em +} + +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em +} + +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em +} + +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: .83em +} + +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: .67em +} + +.ql-snow .ql-picker.ql-font { + width: 108px +} + +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif' +} + +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif' +} + +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace' +} + +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif +} + +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace +} + +.ql-snow .ql-picker.ql-size { + width: 98px +} + +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal' +} + +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small' +} + +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large' +} + +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge' +} + +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px +} + +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px +} + +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px +} + +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff +} + +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000 +} + +.ql-code-block-container { + position: relative +} + +.ql-code-block-container .ql-ui { + right: 5px; + top: 5px +} + +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px +} + +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px +} + +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent +} + +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px +} + +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc +} + +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc +} + +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000 +} + +.ql-toolbar.ql-snow+.ql-container.ql-snow { + border-top: 0 +} + +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0 0 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap +} + +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px +} + +.ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0; + padding: 3px 5px; + width: 170px +} + +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top +} + +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px +} + +.ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px +} + +.ql-snow .ql-tooltip a { + line-height: 26px +} + +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none +} + +.ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block +} + +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0; + content: 'Save'; + padding-right: 0 +} + +.ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:" +} + +.ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:" +} + +.ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:" +} + +.ql-snow a { + color: #06c +} + +.ql-container.ql-snow { + border: 1px solid #ccc +} + +/*# sourceMappingURL=quill.snow.css.map*/ \ No newline at end of file diff --git a/portal-ui/src/assets/styles/var.less b/portal-ui/src/assets/styles/var.less new file mode 100644 index 0000000..d4a8e20 --- /dev/null +++ b/portal-ui/src/assets/styles/var.less @@ -0,0 +1,10 @@ +body { + // 背景色 - 浅 + --mf-color-bg-3: #f8f8fa; + --his-border-color: rgb(166, 124, 82, 0.3); +} + +body[arco-theme='dark'] { + // 背景色 - 浅 + --mf-color-bg-3: #17171a; +} \ No newline at end of file diff --git a/portal-ui/src/components/Card.vue b/portal-ui/src/components/Card.vue new file mode 100644 index 0000000..a4cc658 --- /dev/null +++ b/portal-ui/src/components/Card.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/portal-ui/src/components/Forbidden.vue b/portal-ui/src/components/Forbidden.vue new file mode 100644 index 0000000..5b4e8e6 --- /dev/null +++ b/portal-ui/src/components/Forbidden.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/portal-ui/src/components/List.vue b/portal-ui/src/components/List.vue new file mode 100644 index 0000000..46d4470 --- /dev/null +++ b/portal-ui/src/components/List.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/portal-ui/src/components/NumberGroup.vue b/portal-ui/src/components/NumberGroup.vue new file mode 100644 index 0000000..8e7e0c0 --- /dev/null +++ b/portal-ui/src/components/NumberGroup.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/portal-ui/src/components/Preview.vue b/portal-ui/src/components/Preview.vue new file mode 100644 index 0000000..2026e48 --- /dev/null +++ b/portal-ui/src/components/Preview.vue @@ -0,0 +1,101 @@ + + + diff --git a/portal-ui/src/components/RechargePc.vue b/portal-ui/src/components/RechargePc.vue new file mode 100644 index 0000000..9cdd3f4 --- /dev/null +++ b/portal-ui/src/components/RechargePc.vue @@ -0,0 +1,380 @@ + + + + + diff --git a/portal-ui/src/components/RechargeSelect.vue b/portal-ui/src/components/RechargeSelect.vue new file mode 100644 index 0000000..9f53178 --- /dev/null +++ b/portal-ui/src/components/RechargeSelect.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/portal-ui/src/components/index.js b/portal-ui/src/components/index.js new file mode 100644 index 0000000..2ff4575 --- /dev/null +++ b/portal-ui/src/components/index.js @@ -0,0 +1,7 @@ +export { default as List } from './List.vue'; +export { default as Card } from './Card.vue'; +export { default as NumberGroup } from './NumberGroup.vue'; +export { default as Forbidden } from './Forbidden.vue'; +export { default as RechargeSelect } from './RechargeSelect.vue'; +export { default as RechargePc } from './RechargePc.vue'; +export { default as Preview } from './Preview.vue'; diff --git a/portal-ui/src/comps/_utils/BaseMixin.js b/portal-ui/src/comps/_utils/BaseMixin.js new file mode 100644 index 0000000..522cf4c --- /dev/null +++ b/portal-ui/src/comps/_utils/BaseMixin.js @@ -0,0 +1,267 @@ +/** + * @module + * @author john.gao + * @date 2020/07/22 + * @desc 基础框架 + */ +import { + isEmpty +} from '../_utils/data_util' +import langList from '../_utils/lang' +import { + getLang +} from '@/utils/auth' +import request from '@/utils/request' +import { + mapGetters +} from 'vuex' + +const BaseMixin = { + name: 'mf-base-mixin', + emits: ['loaded'], + props: { + // 只读 + readonly: Boolean, + // 禁用 + disabled: Boolean, + width: String, // 宽度 + height: String, // 高度 + __index: Number // 当前所处数据循环的下标(组件在List内时) + }, + data() { + return { + valueVal: this.initValue(), // 值 + widthVal: this.width, // 宽度 + heightVal: this.height // 高度 + } + }, + computed: { + // 组件全局尺寸 + ...mapGetters(['dimension', 'lang']), + // 缓存的options 数据配置项 + options_computed() { + return this.$datas.deepClone(this.options) + }, + dataList_computed() { + return this.$datas.deepClone(this.dataList) + } + }, + watch: { + modelValue(val) { + this.valueVal = val + }, + src(val) { + this.valueVal = val + } + }, + methods: { + /** + * 获取值 + */ + initValue() { + let key = this.$props.hasOwnProperty('modelValue') ? + 'modelValue' : + 'src' + return this[key] + }, + // 处理本地分页 + dealLocalDataList() { + if (this.pagination) { + this.paging.total = this.oriDataList.length + let start = (this.paging.pageNum - 1) * this.paging.pageSize + let end = start + this.paging.pageSize + this.dataList = this.oriDataList.slice(start, end) + } else { + this.dataList = this.oriDataList + } + }, + /** + * 处理options监听 + * @param {Any} data 数据配置属性 + * @param {Boolean} isInit 是否初始化 + */ + dealOptions(data, isInit) { + if (data) { + if (Array.isArray(data)) { + this.oriDataList = data + if(!this.paginationOptions) { + this.dealLocalDataList() + }else { + this.dataList = this.oriDataList + } + + if (this.defaultPopupVisible) { + this.popupVisible = true + } + this.$nextTick((_) => { + this.$emit('loaded', this.dataList) + }) + } else { + let { + defaultLoad = true + } = data || {} + let initLoadless = isInit && !defaultLoad // 初始化时,默认不加载数据 + if (initLoadless) return + this.getData(undefined, true) + } + } + }, + /** + * 获取列表数据 + * @param {Object} opts 参数 pageNum 当前页 pageSize 每页条数 + */ + async getDatas(opts = {}) { + let { + options = {}, + paging = {}, + paginationVal, + sortVal = [] + } = this + let { + url, + params, + queryProperty, + method = 'POST' + } = options + if (isEmpty(url)) { + return Promise.reject('BaseMixin: 请提供参数URL') + } + let { + pageSize, + pageNum + } = paging + if (!this.loading) this.loading = true + let mParams = { + ...params + } + // 分页参数 + if (paginationVal) { + mParams.pageSize = opts.pageSize || pageSize + mParams.page = opts.pageNum || pageNum + } + // 判断当前已经输入关键字并且关键字的字段已经申明 [用于RemoteSelect组件] + if (opts.query && queryProperty) { + mParams[queryProperty] = opts.query + } + // 后台排序 + // if (sortVal.length > 0) { + // mParams.orders = sortVal.map(item => { + // return { + // column: item.prop, + // asc: item.sort.toUpperCase() == 'ASC' + // } + // }) + // } + return request({ + url, + method, + data: mParams + }).then((res) => { + return res.data + }) + }, + /** + * 获取数据(分页模式) + * @param {Object} opts 参数 pageNum 当前页 pageSize 每页条数 + */ + getData(opts = {}) { + this.getDatas(opts) + .then(({ + total = 0, + records = [] + }) => { + this.loading = false + let mTotal = Number(total) + let pageSize = opts.pageSize || this.paging.pageSize + let pages = Math.ceil(mTotal / pageSize) + let pageNum = opts.pageNum || this.paging.pageNum + if (pageNum > 1 && pageNum > pages) { + this.paging.pageNum = pages + this.getData() + } else { + // 数据请求结束后再赋值当前页和每页条数,避免数据请求前重复渲染组件 + if (opts) { + if (opts.pageNum) this.paging.pageNum = opts.pageNum + if (opts.pageSize) + this.paging.pageSize = opts.pageSize + } + this.paging.total = mTotal + this.dataList = records || [] + this.$emit('loaded', this.dataList) + } + }) + .catch((_) => { + this.loading = false + this.paging.pageNum = 1 + this.paging.total = 0 + this.dataList = [] + this.$emit('loaded') + }) + }, + // 获取样式 + getStyle() { + let { + widthVal, + heightVal + } = this + let style = {} + if (widthVal) style.width = widthVal + if (heightVal) style.height = heightVal + return style + }, + // 多语言 + langs(name, options) { + let lang = getLang() + let langs = langList[lang] + let value = langs[name] + if (!isEmpty(options)) { + value = value.replace(/\{(.*?)\}/g, (w) => { + return options[w.substring(1, w.length - 1)] + }) + } + return value + }, + // 获取布局组件内部的行数据 + getColsIndexMap(children) { + let { + colsVal + } = this + let colsMap = {} + let colsTotal = 0 + children.map((node, index) => { + let { + componentOptions = {}, data = {} + } = node || {} + let { + propsData = {} + } = componentOptions || {} + let { + attrs = {} + } = data + // 当前组件所占列 + let cols = + propsData.cols || + attrs.cols || + propsData.formCols || + colsVal + let rowIndex = Math.floor(colsTotal / colsVal) + if (isEmpty(colsMap[rowIndex])) { + colsMap[rowIndex] = [index] + } else { + colsMap[rowIndex].push(index) + } + colsTotal += colsVal / cols + }) + let result = {} + Object.keys(colsMap).map((key) => { + colsMap[key].map((idx) => { + result[idx] = + colsMap[key].indexOf(idx) === colsMap[key].length - 1 + }) + }) + return result + } + } +} + +export default BaseMixin \ No newline at end of file diff --git a/portal-ui/src/comps/_utils/data_util.js b/portal-ui/src/comps/_utils/data_util.js new file mode 100644 index 0000000..d12c4b1 --- /dev/null +++ b/portal-ui/src/comps/_utils/data_util.js @@ -0,0 +1,157 @@ +/** + * 地址栏参数 + * @param {string} name 参数名称 + */ +export const getQueryString = (name, url) => { + var result = null + if (!url) { + url = location.hash + ? location.hash.indexOf('?') !== -1 + ? '?' + location.hash.split('?')[1] + : location.hash + : location.search + } else { + let idx = url.indexOf('?') + if (idx > -1) url = url.substr(idx) + } + url = decodeURIComponent(url) + if (url.indexOf('?') != -1) { + var str = url.substr(1) + var strArr = str.split('&') + for (var i = 0; i < strArr.length; i++) { + if (strArr[i].split('=')[0] == name) { + result = unescape(strArr[i].split('=')[1]) + break + } + } + } + return result +} + +/** + * 判断是否为空 + * @param {Any} value 值 + */ +export const isEmpty = (value) => { + let isNull = value === undefined || value === null || value === '' + if (isNull) { + return true + } else { + let isObject = typeof value === 'object' + return Object.keys(isObject ? value : String(value)).length === 0 + } +} + +/** + * 递归获取值 + * @param {Object} data 数据 + * @param {*} keys 键的数组 + */ +export const getDeptVal = (data, keys = []) => { + if (!keys.length || data === undefined || data === null) return data + return getDeptVal(data[keys.slice(0, 1)], keys.slice(1)) +} + +/** + * 获取集合 + * @param {Array} list 数据 + * @param {String} key 键 + */ +export function getSet(list = [], key) { + let set = {} + list.map((item) => { + if (set[item[key]]) { + set[item[key]].push(item) + } else { + set[item[key]] = [item] + } + }) + return set +} + +/** + * 数组去重 + * @param {Array} list 数组 + */ +export function unique(list = [], func) { + const res = new Map() + if (func) { + return list.filter((v) => !res.has(func(v)) && res.set(func(v), 1)) + } else { + return list.filter((v) => !res.has(v) && res.set(v, 1)) + } +} + +/** + * 深拷贝 + * @param {Any} data + */ +export const deepClone = (data) => { + let result = Array.isArray(data) ? [] : {} + for (let key in data) { + if (data.hasOwnProperty(key)) { + if (typeof data[key] === 'object' && data[key] !== null) { + result[key] = deepClone(data[key]) + } else { + result[key] = data[key] + } + } + } + return result +} + +/** + * 递归查找 + * @param {Object} data 数据源 + * @param {Function} func 函数 + * @param {Object} opts 自定义参数 + */ +export const deepFind = (data, func, opts = {}) => { + if (!data) return + if (func(data)) { + return data + } + let childrenKey = opts.childrenKey || 'childList' + let result = null + let __deepFind = (list = []) => { + for (var idx = 0; idx < list.length; idx++) { + var item = list[idx] + if (func(item, idx)) { + result = item + break + } else if (item[childrenKey] && item[childrenKey].length > 0) { + __deepFind(item[childrenKey]) + } + } + return result + } + return __deepFind(Array.isArray(data) ? data : data[childrenKey]) +} + +/** + * 获取父组件 + * @param {Object} instance 组件实例 + * @param {Function} func 函数 + */ +export const getParentNode = (instance, func) => { + if (!instance) return null + let name = instance.$options.name + if (name) { + if (name === 'mf-dialog') return null + if (func(name)) { + return instance + } else { + return getParentNode(instance.$parent, func) + } + } else { + return getParentNode(instance.$parent, func) + } +} + +/** + * 获取组件名称 + * @param {Object} componentOptions 组件options + */ +export const getComponentName = ({ type }) => { + return type && type.name +} diff --git a/portal-ui/src/comps/_utils/lang.js b/portal-ui/src/comps/_utils/lang.js new file mode 100644 index 0000000..ead1ca8 --- /dev/null +++ b/portal-ui/src/comps/_utils/lang.js @@ -0,0 +1,76 @@ +export default { + zh: { + notice: '提示', + emptyText: '暂无数据', + deleteSuccessMsg: '删除成功', + submittedSuccessfully: '提交成功', + refresh: '刷新', + asc: '升序', + desc: '降序', + ok: '确定', + cancel: '取消', + clear: '清空', + clearMsg: '是否确认清空?', + delete: '删除', + deleteMsg: '是否确认删除?', + sortMsg: '排序条件的总数不得超过表格的字段总数', + addCondition: '添加条件', + sortTitle: '高级排序', + sortEmpty: '暂无排序条件,请点击添加按钮新增排序条件', + sortTypePlaceholder: '请选择排序方式', + sortFieldPlacehoder: '请选择字段', + sortFieldWarnMsg: '请选择第{index}行的字段', + sortTypeWarnMsg: `请选择字段 '{field}' 的排序方式`, + filterFieldSelect: '字段选择', + checkAll: '全选', + reset: '重置', + search: '查询', + operator: '操作', + edit: '编辑', + save: '保存', + placeholderPrefix: '请输入', + addItem: '新增一项', + hint: '提示', + hints: '是否确认删除该文件?', + expand: '展开', + fold: '收起' + }, + en: { + notice: 'Notice', + emptyText: 'No data', + deleteSuccessMsg: 'Successfully deleted', + submittedSuccessfully: 'Submitted successfully', + refresh: 'Refresh', + asc: 'ASC', + desc: 'DESC', + ok: 'Ok', + cancel: 'Cancel', + clear: 'Clear', + clearMsg: 'Do you clear?', + delete: 'Delete', + deleteMsg: 'Do you delete?', + sortMsg: + 'The total number of sorting criteria cannot exceed the total number of fields in the table', + addCondition: 'Add Condition', + sortTitle: 'Advanced sorting', + sortEmpty: + 'There is no sorting condition, please click the Add button to add a sorting condition', + sortTypePlaceholder: 'Please select a sorting method', + sortFieldPlacehoder: 'Please select a field', + sortFieldWarnMsg: `Please select the {index} line's field`, + sortTypeWarnMsg: `Please select the field {field}'s sort type`, + filterFieldSelect: 'Select Field', + checkAll: 'Check all', + reset: 'Reset', + search: 'Search', + operator: 'Operator', + edit: 'Edit', + save: 'Save', + placeholderPrefix: 'Please input', + addItem: 'Add one', + hint: 'Hint', + hints: 'Do you want to delete the file?', + expand: 'Expand', + fold: 'Fold' + } +} diff --git a/portal-ui/src/comps/_utils/validator_util.js b/portal-ui/src/comps/_utils/validator_util.js new file mode 100644 index 0000000..4477ab4 --- /dev/null +++ b/portal-ui/src/comps/_utils/validator_util.js @@ -0,0 +1,294 @@ +/** + * 邮箱校验 + * @param {string} email + */ +function isEmail(email) { + const reg = + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) +} + +/** + * 是否手机号 + * @param {String} value + */ +function isMobile(value) { + var reg = /^\d{11}$/ + return new RegExp(reg).test(value) +} + +/** + * 是否邮编 + * @param {String} value + */ +function isPostcode(value) { + var reg = /^\d{1,20}$/ + return new RegExp(reg).test(value) +} + +/** + * 昵称校验 + * 1) 昵称名不可输入特殊字符, 长度为1-16位 + * @param {String} nickName 用户名 + **/ +function isNickname(nickName) { + let reg = /^[\u4e00-\u9fa5A-Za-z0-9_-]{1,16}$/ + return reg.test(nickName) +} + +/** + * 编码校验 + * 1) 编码不可输入特殊字符, 长度为1-60位 + * @param {String} encoding 字典编码 + **/ +function isEncoding(encoding) { + let reg = /^[A-Za-z0-9]{1,}$/ + return reg.test(encoding) +} + +/** + * 描述校验 + * 1) 编码不可输入特殊字符, 长度为0-200位 + * @param {String} describe 备注 + **/ +function isDescribe(describe) { + let reg = /^[\u4e00-\u9fa5A-Za-z0-9_-\s]{0,200}$/ + return reg.test(describe) +} + +/** + * 密码强度校验 + * 1) 密码8-16位,至少包含字母/数字/符号2种组合 + * 2) 符号:~!@#$%^&*()_+-={}:";'<>?,.`\ + * @param {String} password 密码 + **/ +function isPassword(password) { + let reg = /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8,20}$/ + return reg.test(password) +} + +/** + * text 数字验证 + **/ +function isTwonumber(twonumber) { + let reg = new RegExp('^[0-9]+[.]?[0-9]{0,2}$') + return reg.test(twonumber) +} +/** + * text 数字验证 + **/ +function isNumber(number) { + let reg = new RegExp('^[0-9]+$') + return reg.test(number) +} + +/** + * 是否身份证 + * @param {身份证号} value + */ +function isIdCard(value) { + var cityCodes = [ + 11, 12, 13, 14, 15, 21, 22, 23, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, + 44, 45, 46, 50, 51, 52, 53, 54, 61, 62, 63, 64, 65, 71, 81, 82, 91 + ] + var reg = + /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i + let r = new RegExp(reg).test(value) + if (!r) { + return false + } else if (cityCodes.indexOf(parseInt(value.substr(0, 2))) == -1) { + return false + } else if (value.length == 18) { + // 18位身份证需要验证最后一位校验位 + // 加权因子,∑(ai×Wi)(mod 11) + var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] + var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2] //校验位 + var sum = factor.reduce((total, curr, idx) => { + return total + curr * value.charAt(idx) + }, 0) + return parity[sum % 11] == value.charAt(17) + } + return true +} + +/** + * 是否为空 + * @param {Any} value 值 + */ +export const isEmpty = (value) => { + return value === undefined || value === null || value === '' +} + +/** + * 最小长度校验 + * @param {Object} _ + * @param {String} value + */ +export const minLengthValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && String(value).length < rule.minLength) { + callback(rule.message) + } + callback() +} + +/** + * 最大长度校验 + * @param {Object} _ + * @param {String} value + */ +export const maxLengthValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && String(value).length > rule.maxLength) { + callback(rule.message) + } + callback() +} + +/** + * 最小值(不包含最小值) + * @param {Object} _ + * @param {String} value + */ +export const minValueValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && value < rule.minValue) { + callback(rule.message) + } + callback() +} + +/** + * 最小值(包含最小值) + * @param {Object} _ + * @param {String} value + */ +export const minValueEqualValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && value <= rule.minValueEqual) { + callback(rule.message) + } + callback() +} + +/** + * 最大值 + * @param {Object} _ + * @param {String} value + */ +export const maxValueValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && value > rule.maxValue) { + callback(rule.message) + } + callback() +} + +/** + * 邮箱 + * @param {Object} _ + * @param {String} value + */ +export const emailValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isEmail(value)) { + callback(rule.message) + } + callback() +} + +/** + * 手机号码 + * @param {Object} _ + * @param {String} value + */ +export const mobileValidator = (rule) => (value, callback) => { + if (!isEmpty(value) && !isMobile(value)) { + callback(rule.message) + } + callback() +} + +/** + * 邮编 + * @param {Object} _ + * @param {String} value + */ +export const postcodeValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isPostcode(value)) { + callback(rule.message) + } + callback() +} + +/** + * 密码 + * @param {Object} _ + * @param {String} value + */ +export const nickNameValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isNickname(value)) { + callback(rule.message) + } + callback() +} + +/** + * 手机号码 + * @param {Object} _ + * @param {String} value + */ +export const passwordValidator = (rule) => (value, callback) => { + if (!isEmpty(value) && !isPassword(value)) { + callback(rule.message) + } + callback() +} + +/** + * 编码 + * @param {Object} _ + * @param {String} value + */ +export const encodingValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isEncoding(value)) { + callback(rule.message) + } + callback() +} + +/** + * 描述 + * @param {Object} _ + * @param {String} value + */ +export const describeValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isDescribe(value)) { + callback(rule.message) + } + callback() +} + +/** + * 数字 + */ +export const numberValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isNumber(value)) { + callback(rule.message) + } + callback() +} + +/** + * 保留俩位 数字 + */ +export const twonumberValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isTwonumber(value)) { + callback(rule.message) + } + callback() +} + +/** + * 身份证 + */ +export const idCardValidator = (rule) => (_, value, callback) => { + if (!isEmpty(value) && !isIdCard(value)) { + callback(rule.message) + } + callback() +} diff --git a/portal-ui/src/comps/avatar/Avatar.js b/portal-ui/src/comps/avatar/Avatar.js new file mode 100644 index 0000000..1073317 --- /dev/null +++ b/portal-ui/src/comps/avatar/Avatar.js @@ -0,0 +1,55 @@ +import BaseMixin from '../_utils/BaseMixin' + +/** + * 头像 + * @author john + * @date 2023/09/12 + */ +export default { + name: 'mf-avatar', + mixins: [BaseMixin], + data() { + return { + prefixCls: 'mf-avatar' + } + }, + props: { + modelValue: String, + name: String, + shape: { + type: String, + default: 'circle' + }, + size: Number + }, + methods: { + getImageUrl(val) { + if (!val) return null + if (val.startsWith('/admin')) { + return '/api' + val + } else { + return val + } + } + }, + render() { + let { prefixCls, size, shape, valueVal, name } = this + let imageUrl = this.getImageUrl(valueVal) + let avatarProps = { + size, + shape, + imageUrl + } + let mName = null + if (name && !imageUrl) { + mName = name.substring(0, 1) + } + return ( + + {mName} + + ) + } +} diff --git a/portal-ui/src/comps/button/Button.js b/portal-ui/src/comps/button/Button.js new file mode 100644 index 0000000..accea7f --- /dev/null +++ b/portal-ui/src/comps/button/Button.js @@ -0,0 +1,141 @@ +import classnames from 'classnames' +import BaseMixin from '../_utils/BaseMixin' +import Icon from '../icon/Icon' + +export default { + name: 'mf-button', + mixins: [BaseMixin], + emits: ['click'], + props: { + prefixCls: { + type: String, + default: 'mf-button' + }, + /** + * 按钮类型 + * text 文字按钮 + * primary 主要按钮 + * secondary 次要按钮 + * outline 线性按钮 + * dashed 虚框按钮 + */ + type: String, + width: String, + minWidth: String, + // plain 空 方形 round 圆角 circle 圆形 + shape: String, + icon: String, + // 按钮尺寸 mini small medium large + size: { + type: String, + default: 'medium' + }, + disabled: Boolean, + margin: String, + padding: String, + loading: { + type: Boolean, + default: false + }, + direction: { + type: String, + default: 'row' + }, + // 'default', 'normal' | 'warning' | 'success' | 'danger' + status: String + }, + data() { + return { + loadingVal: this.loading + } + }, + watch: { + loading(val) { + this.loadingVal = val + } + }, + render() { + let { + prefixCls, + width, + minWidth, + height, + shape, + icon, + $slots, + loadingVal, + margin, + padding, + disabled, + size, + direction, + dimension, + status, + type + } = this + const style = { ...this.getStyle() } + if (margin) style.margin = margin + if (padding) style.padding = padding + if (width) { + style.width = width + } + if (minWidth) style.minWidth = minWidth + if (height) style.height = height + + let wrapCls = classnames(prefixCls, { + [`${prefixCls}-${direction}`]: direction, + [`${prefixCls}-${dimension}`]: dimension + }) + + let iconStyle = {} + let content = $slots.default?.() + if (content && content.length === 1) { + let isSymbol = typeof content[0].type === 'symbol' + if (isSymbol) content = content[0].children + } + if (!content) { + iconStyle.marginRight = '0px' + } + let buttonProps = { + size, + shape, + loading: loadingVal, + disabled + } + if (status) buttonProps.status = status + if (type) buttonProps.type = type + let buttonSlots = {} + if (icon) { + buttonSlots.icon = (_) => { + return ( + + ) + } + } + return content ? ( + { + this.$emit('click', e) + }} + v-slots={buttonSlots}> + {content} + + ) : ( + { + this.$emit('click', e) + }} + v-slots={buttonSlots} + /> + ) + } +} diff --git a/portal-ui/src/comps/button/style/index.less b/portal-ui/src/comps/button/style/index.less new file mode 100644 index 0000000..3eb35ea --- /dev/null +++ b/portal-ui/src/comps/button/style/index.less @@ -0,0 +1,50 @@ +.mf-button { + // .mf-icon { + // margin-right: 3px; + // } + &.arco-btn-size-huge { + height: 40px; + padding: 0 19px; + font-size: 14px; + border-radius: var(--border-radius-small); + } + + &.arco-btn-size-small { + .mf-icon { + font-size: 14px; + } + } + + &.arco-btn-text { + // padding: 0 10px 0 0; + &.arco-btn-status-default { + color: var(--color-text-3); + &:hover { + color: rgb(var(--primary-5)); + } + &:active { + color: rgb(var(--primary-7)); + background-color: transparent; + } + &.arco-btn-disabled { + color: var(--color-text-5); + } + } + + .arco-btn-icon { + margin-right: 4px; + } + } + + &.arco-btn-primary { + color: #FFF; + &.arco-btn-loading, + &:hover { + color: #FFF; + } + + &.arco-btn-disabled { + color: var(--color-text-5); + } + } +} diff --git a/portal-ui/src/comps/chart/Chart.js b/portal-ui/src/comps/chart/Chart.js new file mode 100644 index 0000000..049a3e2 --- /dev/null +++ b/portal-ui/src/comps/chart/Chart.js @@ -0,0 +1,123 @@ +/** + * 柱状图 + * @author john.gao + * @date 2020/01/27 + */ + +import { + Chart +} from '@antv/g2' +import { + addListener, + removeListener +} from 'resize-detector' + +export default { + name: 'mf-chart', + data() { + return {} + }, + props: { + data: Array, + options: { + type: Object, + default: (_) => {} + } + }, + watch: { + data: { + deep: true, + handler(value) { + if (this.chart) { + this.chart.changeData(value) + } + } + }, + options: { + deep: true, + handler(value) { + let mOptions = this.dealOptions() + this.chart.options(mOptions) + this.chart.render() + } + } + }, + methods: { + dealOptions() { + // 初始化图表实例 + let defOpts = { + type: 'interval', + autoFit: true, + encode: { + x: 'label', + y: 'value', + color: 'type' + }, + axis: { + x: { + title: false + }, + y: { + title: false + } + }, + scale: { + color: { + range: ['#00fff0', 'rgb(255,125,0)'] + } + }, + data: this.data + } + + let result = this.$datas.deepClone(this.options) + if ( + result.encode && + result.encode.size && + result.scale && + result.scale.x && + !this.$datas.isEmpty(result.scale.x.padding) + ) { + let size = result.encode.size + let ref = this.$refs.container + let containerWidth = ref.clientWidth - 168 + let itemWidth = containerWidth / (this.data.length / 2) + result.scale.x.padding = (itemWidth - size * 2) / itemWidth + } + return { + ...defOpts, + ...result + } + } + }, + beforeUnmount() { + if (this.chart) this.chart.destroy() + }, + mounted() { + this.chart = new Chart({ + container: this.$refs.container + }) + + let mOptions = this.dealOptions() + this.chart.options(mOptions) + this.chart.render() + + let self = this + document.addEventListener('visibilitychange', function() { + if (document.visibilityState == 'visible') { + self.chart.render() + } + }) + + this.chart.on('plot:mouseenter', () => { + this.$emit('mouseenter') + }); + + this.chart.on('plot:mouseleave', () => { + this.$emit('mouseleave') + }); + }, + + render() { + return < div ref = "container" > < /div> + } +} \ No newline at end of file diff --git a/portal-ui/src/comps/checkbox/Checkbox.js b/portal-ui/src/comps/checkbox/Checkbox.js new file mode 100644 index 0000000..4dd0c2a --- /dev/null +++ b/portal-ui/src/comps/checkbox/Checkbox.js @@ -0,0 +1,175 @@ +/** + * @module + * @author john.gao + * @date 2020/02/03 + * @desc 复选框 + */ +import BaseMixin from '../_utils/BaseMixin' +import HongText from '../text/Text' +import classnames from 'classnames' +import isEqual from 'lodash-es/isEqual' + +export default { + name: 'mf-checkbox', + mixins: [BaseMixin], + emits: ['change', 'update:modelValue'], + props: { + // 绑定值 + modelValue: { + type: [Array, String, Number], + default: () => [] + }, + prefixCls: { + type: String, + default: 'mf-checkbox' + }, + // 绑定checkbox + options: [Object, Array], + // 尺寸 large small default + size: { + type: String, + default: 'large' + }, + // 是否禁用 + disabled: Boolean, + // 排列方向 + direction: { + type: String, + default: 'horizontal' + }, + display: String + }, + data() { + return { + sizeVal: this.size, + dataList: [] + } + }, + computed: { + label() { + let value = this.getValue() + let dataList = this.dataList || [] + if (dataList.length > 0) { + let list = dataList.filter((d) => value.indexOf(d.value) >= 0) + return list ? list.map((l) => l.label).join(',') : null + } else { + return null + } + } + }, + watch: { + options_computed: { + handler(value, oldValue) { + if (isEqual(value, oldValue)) return + this.dealOptions(value) + }, + deep: true + } + }, + methods: { + // 获取值 + getValue() { + let value = this.modelValue || [] + if (Array.isArray(value)) { + return value + } else if (typeof value === 'string') { + return value.split(',').map((val) => { + if (this.dataList.length > 0) { + let item = this.dataList[0] + if (typeof item.value === 'string') { + return String(val) + } else { + return parseInt(val) + } + } else { + return val + } + }) + } else { + return [value] + } + }, + // 获取数据 + getData() { + let { valueProperty = 'value', labelProperty = 'label' } = + this.options || {} + this.getDatas().then((data = []) => { + this.dataList = data.map((item) => { + return { + value: item[valueProperty], + label: item[labelProperty] + } + }) + this.$emit('loaded', this.dataList) + }) + } + }, + created() { + this.dealOptions(this.options, true) + }, + render() { + const { + prefixCls, + sizeVal, + readonly, + disabled, + direction, + display, + dataList = [] + } = this + + const textCls = classnames(`${prefixCls}-readonly`, { + [`${prefixCls}-readonly-${sizeVal}`]: sizeVal + }) + + const wrapCls = classnames(prefixCls, { + [`${prefixCls}-${display}`]: display + }) + + let checkboxProps = { + size: sizeVal, + disabled, + direction, + modelValue: this.getValue(), + 'onUpdate:modelValue': (val) => { + this.$emit('update:modelValue', val) + }, + onChange: (val) => { + this.$emit('change', val) + } + } + + return readonly ? ( + + ) : ( + + {dataList.map((d) => { + if (d.tooltip) { + return ( + + + {d.label} + + + ) + } else { + return ( + + {d.label} + + ) + } + })} + + ) + } +} diff --git a/portal-ui/src/comps/checkbox/style/index.less b/portal-ui/src/comps/checkbox/style/index.less new file mode 100644 index 0000000..04ab678 --- /dev/null +++ b/portal-ui/src/comps/checkbox/style/index.less @@ -0,0 +1,29 @@ +.mf-checkbox { + display: flex; + align-items: center; + flex-flow: wrap; + overflow: hidden; + border-radius: 4px; + + &-button { + display: inline-block; + padding: 0; + } + + &-inline-block { + display: inline-block; + } + + // 只读模式 + &-readonly { + background-color: #f4f6f8; + border-radius: 3px; + padding: 0 10px; + word-break: break-all; + color: #3a4166; + + &-small { + min-height: 32px; + } + } +} diff --git a/portal-ui/src/comps/col/Col.js b/portal-ui/src/comps/col/Col.js new file mode 100644 index 0000000..04c713f --- /dev/null +++ b/portal-ui/src/comps/col/Col.js @@ -0,0 +1,28 @@ +/** + * 列 + * @author john.gao + * @date 2020/07/06 + */ +import classnames from 'classnames' + +export default { + name: 'mf-col', + props: { + cols: { + type: Number, + default: 1 + }, + prefixCls: { + type: String, + default: 'mf-col' + } + }, + data() { + return {} + }, + render() { + let { $slots, cols, prefixCls } = this + const wrapCls = classnames(prefixCls, `${prefixCls}-${cols}`) + return
{$slots.default?.()}
+ } +} diff --git a/portal-ui/src/comps/col/style/index.less b/portal-ui/src/comps/col/style/index.less new file mode 100644 index 0000000..b6f7bba --- /dev/null +++ b/portal-ui/src/comps/col/style/index.less @@ -0,0 +1,41 @@ +.mf-col { + &-1 { + width: 100%; + } + + &-2 { + width: 50%; + } + + &-3 { + width: 33.33%; + } + + &-4 { + width: 25%; + } + + &-5 { + width: 20%; + } + + &-6 { + width: 16.66%; + } + + &-7 { + width: 14.28%; + } + + &-8 { + width: 12.5%; + } + + &-9 { + width: 11.11%; + } + + &-10 { + width: 10%; + } +} diff --git a/portal-ui/src/comps/date-picker/DatePicker.js b/portal-ui/src/comps/date-picker/DatePicker.js new file mode 100644 index 0000000..6521b25 --- /dev/null +++ b/portal-ui/src/comps/date-picker/DatePicker.js @@ -0,0 +1,161 @@ +/** + * 日期框 + * @author john + * @date 2020/02/03 + */ +import MfText from '../text/Text' +import classnames from 'classnames' +import BaseMixin from '../_utils/BaseMixin' +import dayjs from 'dayjs' +import utc from 'dayjs/plugin/utc' +import timezone from 'dayjs/plugin/timezone' +dayjs.extend(utc) +dayjs.extend(timezone) +const tz = dayjs.tz.guess() + +export default { + name: 'mf-date-picker', + mixins: [BaseMixin], + emits: ['update:modelValue', 'change'], + props: { + modelValue: [String, Array], + // yyyy-MM-dd HH:mm:ss + dateFormat: { + type: String, + default: 'yyyy-MM-dd' + }, + autofocus: Boolean, // 自动获取焦点 + placeholder: String, + disabled: Boolean, + clearable: Boolean, + size: { + // 尺寸 + type: String, + default: 'large' + }, + prefixCls: { + type: String, + default: 'mf-date-picker' + }, + // Datepicker 下拉框类名 + popperClass: String, + // 默认弹出框是打开或者关闭 + defaultPopupVisible: { + type: Boolean, + default: false + } + }, + data() { + return { + popupVisible: false + } + }, + mounted() { + if (this.autofocus) { + this.$nextTick((_) => { + let ref = this.$refs.mfDatePicker + if (ref) ref.focus() + }) + } + }, + methods: { + getValue() { + let { modelValue, dateFormat } = this + return modelValue && dateFormat + ? dayjs.tz(modelValue, tz).toDate() + : modelValue + }, + getType() { + let { dateFormat } = this + let result = '' + switch (dateFormat) { + case 'yyyy': + result = 'year' + break + case 'yyyy-MM': + result = 'month' + break + case 'yyyy-MM-dd': + result = 'date' + break + case 'yyyy-MM-dd HH:mm': + case 'yyyy-MM-dd HH:mm:ss': + result = 'datetime' + break + default: + result = 'date' + break + } + return result + } + }, + render() { + let { + dateFormat, + prefixCls, + size, + placeholder, + popperClass, + clearable, + readonly, + disabled, + defaultPopupVisible + } = this + const textCls = classnames(`${prefixCls}-readonly`, { + [`${prefixCls}-readonly-${size}`]: size + }) + + const wrapCls = classnames(prefixCls) + + if (readonly) { + return ( + + ) + } else { + let datePickerProps = { + modelValue: this.getValue(), + type: this.getType(), + placeholder, + size, + popperClass, + allowClear: clearable, + disabled, + defaultPopupVisible, + 'onUpdate:modelValue': (v) => { + let d = v + ? dayjs + .tz(v, tz) + .format( + dateFormat + .replace('yyyy', 'YYYY') + .replace('dd', 'DD') + ) + : null + this.$emit('update:modelValue', d) + }, + onChange: (v) => { + let d = v + ? dayjs + .tz(v, tz) + .format( + dateFormat + .replace('yyyy', 'YYYY') + .replace('dd', 'DD') + ) + : null + this.$emit('change', d) + } + } + return ( + + ) + } + } +} diff --git a/portal-ui/src/comps/date-picker/style/index.less b/portal-ui/src/comps/date-picker/style/index.less new file mode 100644 index 0000000..f7ac2a8 --- /dev/null +++ b/portal-ui/src/comps/date-picker/style/index.less @@ -0,0 +1,28 @@ +.mf-date-picker { + background-color: #fff; + border: 1px solid var(--his-border-color); + + &:hover { + background-color: #fff; + border: 1px solid rgb(var(--primary-6)); + } + &-medium { + font-size: 16px; + } + + &-large { + font-size: 18px; + } + + &-readonly { + word-break: break-all; + + &-small { + min-height: 32px; + } + } + + &-hidden { + display: none; + } +} diff --git a/portal-ui/src/comps/date-range-picker/DateRangePicker.js b/portal-ui/src/comps/date-range-picker/DateRangePicker.js new file mode 100644 index 0000000..422d68a --- /dev/null +++ b/portal-ui/src/comps/date-range-picker/DateRangePicker.js @@ -0,0 +1,125 @@ +/** + * 日期范围框 + * @author john + * @date 2020/02/03 + */ +import MfText from '../text/Text' +import classnames from 'classnames' +import BaseMixin from '../_utils/BaseMixin' +import dayjs from 'dayjs' +import utc from 'dayjs/plugin/utc' +import timezone from 'dayjs/plugin/timezone' +dayjs.extend(utc) +dayjs.extend(timezone) +const tz = dayjs.tz.guess() + +export default { + name: 'mf-date-range-picker', + mixins: [BaseMixin], + emits: ['update:modelValue', 'change'], + props: { + mode: String, + modelValue: [String, Array], + // 日期格式 YYYY-MM-DD 年月日 + format: { + type: String, + default: 'YYYY-MM-DD' + }, + disabled: Boolean, + startPlaceholder: { + type: String, + default: '开始日期' + }, + endPlaceholder: { + type: String, + default: '结束日期' + }, + clearable: { + type: Boolean, + default: true + }, + prefixCls: { + type: String, + default: 'mf-date-range-picker' + }, + size: { + // 尺寸 + type: String, + default: 'medium' + }, + separator: String, + // 只读 + readonly: Boolean + }, + data() { + return { + typeVal: this.type + } + }, + computed: { + label() { + let value = this.getValue() + return value.join(' ~ ') + } + }, + methods: { + getValue() { + let value = this.modelValue || [] + if (Array.isArray(value)) { + return value + } else if (typeof value === 'string') { + return value.split(',') + } else { + return [value] + } + } + }, + render() { + let { + startPlaceholder, + endPlaceholder, + clearable, + disabled, + format, + prefixCls, + size, + separator, + mode, + readonly + } = this + + const textCls = classnames(`${prefixCls}-readonly`, { + [`${prefixCls}-readonly-${size}`]: size + }) + + let datePickerProps = { + size, + disabled, + startPlaceholder, + endPlaceholder, + clearable, + format, + mode, + separator, + modelValue: this.getValue() + } + return readonly ? ( + + ) : ( + { + let dateList = v + ? v.map((d) => dayjs(d).format(format)) + : null + this.$emit('update:modelValue', dateList) + this.$emit('change', dateList) + }} + /> + ) + } +} diff --git a/portal-ui/src/comps/date-range-picker/style/index.less b/portal-ui/src/comps/date-range-picker/style/index.less new file mode 100644 index 0000000..2ef22cc --- /dev/null +++ b/portal-ui/src/comps/date-range-picker/style/index.less @@ -0,0 +1,25 @@ +.mf-date-range-picker { + &-medium { + font-size: 16px; + } + + &-large { + font-size: 18px; + } + + &-readonly { + background-color: #f4f6f8; + border-radius: 3px; + padding: 0 10px; + word-break: break-all; + color: #3a4166; + + &-small { + min-height: 32px; + } + } + + &-hidden { + display: none; + } +} diff --git a/portal-ui/src/comps/dialog/Dialog.js b/portal-ui/src/comps/dialog/Dialog.js new file mode 100644 index 0000000..e1fc2c3 --- /dev/null +++ b/portal-ui/src/comps/dialog/Dialog.js @@ -0,0 +1,201 @@ +/** + * @module + * @author john.gao + * @date 2020/01/28 + * @desc 弹窗 + */ +import classnames from 'classnames' +import BaseMixin from '../_utils/BaseMixin.js' + +export default { + name: 'mf-dialog', + mixins: [BaseMixin], + emits: ['cancel', 'ok'], + props: { + prefixCls: { + type: String, + default: 'mf-dialog' + }, + visible: Boolean, + title: String, + width: String, + height: String, + // 简单模式 + simple: { + type: Boolean, + default: false + }, + // 是否需要遮罩 + mask: { + type: Boolean, + default: true + }, + draggable: { + type: Boolean, + default: false + }, + // 是否显示关闭按钮 + closable: { + type: Boolean, + default: true + }, + scroller: String, // 内部滚动 + // 关闭时是否卸载节点 + unmountOnClose: { + type: Boolean, + default: false + }, + // 是否可以通过点击 mask 关闭 Dialog + maskClosable: { + type: Boolean, + default: true + }, + // 是否全屏 + fullscreen: Boolean, + // 对话框是否挂载在 body 元素下 + renderToBody: { + type: Boolean, + default: true + }, + // 是否隐藏标题 + hideTitle: { + type: Boolean, + default: false + }, + // 对话框是否居中显示 + alignCenter: { + type: Boolean, + default: false + }, + // 是否隐藏取消按钮 + hideCancel: { + type: Boolean, + default: false + }, + // 确定按钮文案 + okText: String, + okLoading: Boolean, + okButtonProps: { + type: Object, + default: (_) => {} + }, + // 取消按钮文案 + cancelText: String, + // 加载状态 + loading: Boolean, + loadingText: String, + // 是否显示底部按钮操作栏 + footer: { + type: Boolean, + default: true + }, + bodyStyle: Object, + modalClass: String + }, + data() { + return {} + }, + methods: { + // 渲染对话框 + renderDialog() { + let { $slots, prefixCls } = this + let wrapStyle = {} + return ( +
+ {$slots.default?.()} +
+ ) + } + }, + render() { + const { + prefixCls, + visible, + $slots, + width, + height, + okButtonProps, + loading, + loadingText, + scroller, + footer, + title, + mask, + closable, + unmountOnClose, + maskClosable, + okText, + cancelText, + fullscreen, + renderToBody, + bodyStyle, + hideTitle, + hideCancel, + alignCenter, + okLoading, + simple, + modalClass, + draggable + } = this + const wrapCls = classnames(prefixCls, { + [`${prefixCls}-scroller-${scroller}`]: scroller + }) + let style = {} + if (width) { + style.width = width + } + if (height) { + style.height = height + } + let slots = {} + if ($slots.title) { + slots.title = (_) => { + return $slots.title?.() + } + } + if ($slots.footer) { + slots.footer = (_) => { + return $slots.footer?.() + } + } + let dialogProps = { + visible, + width, + title, + mask, + closable, + unmountOnClose, + maskClosable, + okText, + okButtonProps, + cancelText, + fullscreen, + renderToBody, + hideTitle, + footer, + hideCancel, + alignCenter, + simple, + modalClass, + draggable, + bodyStyle + } + if (okLoading) dialogProps.okLoading = okLoading + return ( + { + this.$emit('ok') + }} + onCancel={(_) => { + this.$emit('cancel') + }} + v-slots={slots}> + {this.renderDialog()} + + ) + } +} diff --git a/portal-ui/src/comps/dialog/style/index.less b/portal-ui/src/comps/dialog/style/index.less new file mode 100644 index 0000000..f0d18a5 --- /dev/null +++ b/portal-ui/src/comps/dialog/style/index.less @@ -0,0 +1,26 @@ +.mf-dialog { + .arco-spin { + width: 100%; + } + + &-scroller { + &-vertical { + height: 100%; + .arco-modal { + top: 20px; + height: calc(100% - 40px); + &-wrap { + height: 100%; + overflow: hidden; + } + &-body { + height: calc(100% - 48px); + } + } + } + } +} + +.arco-modal-simple .arco-modal-body { + text-align: center; +} diff --git a/portal-ui/src/comps/divider/Divider.js b/portal-ui/src/comps/divider/Divider.js new file mode 100644 index 0000000..f84ec55 --- /dev/null +++ b/portal-ui/src/comps/divider/Divider.js @@ -0,0 +1,37 @@ +export default { + name: 'mf-divider', + props: { + prefixCls: { + type: String, + default: 'mf-divider' + }, + // 方向 horizontal 横向 vertical 纵向 + direction: { + type: String, + default: 'horizontal' + }, + // 外间距 + margin: String, + // 分割线宽度/高度 + size: Number + }, + data() { + return {} + }, + render() { + const { prefixCls, direction, margin, size } = this + + let dividerProps = { + direction, + margin + } + if (size) dividerProps.size = size + + return ( + + ) + } +} diff --git a/portal-ui/src/comps/divider/style/index.less b/portal-ui/src/comps/divider/style/index.less new file mode 100644 index 0000000..28e695d --- /dev/null +++ b/portal-ui/src/comps/divider/style/index.less @@ -0,0 +1,2 @@ +.mf-divider { +} diff --git a/portal-ui/src/comps/drawer/Drawer.js b/portal-ui/src/comps/drawer/Drawer.js new file mode 100644 index 0000000..45704f2 --- /dev/null +++ b/portal-ui/src/comps/drawer/Drawer.js @@ -0,0 +1,135 @@ +export default { + name: 'mf-drawer', + emits: ['ok', 'cancel'], + props: { + prefixCls: { + type: String, + default: 'mf-drawer' + }, + // 标题 + title: String, + // 是否展开 + visible: { + type: Boolean, + default: false + }, + // 展开方向 'top' | 'right' | 'bottom' | 'left' + placement: { + type: String, + default: 'right' + }, + // 宽 + width: { + type: [String, Number], + default: '350px' + }, + // 高 + height: String, + // 是否需要遮罩层 + mask: { + type: Boolean, + default: true + }, + // 是否可以通过点击 mask 关闭 Drawer + maskClosable: { + type: Boolean, + default: true + }, + // 关闭时是否卸载节点 + unmountOnClose: { + type: Boolean, + default: true + }, + // 确认按钮是否为加载中状态 + okLoading: { + type: Boolean, + default: false + }, + // 确认按钮的内容 + okText: String, + // 取消按钮的内容 + cancelText: String, + footer: { + type: Boolean, + default: true + }, + hideCancel: Boolean + }, + data() { + return { + visibleVal: this.visible, + widthVal: this.width, + heightVal: this.height + } + }, + watch: { + visible(v) { + this.visibleVal = v + }, + width(w) { + this.widthVal = w + }, + height(h) { + this.heightVal = h + } + }, + computed: {}, + methods: { + open() { + this.$emit('open') + }, + close() { + this.$emit('close') + } + }, + render() { + const { + prefixCls, + mask, + maskClosable, + okLoading, + okText, + cancelText, + $slots, + placement, + visibleVal, + width, + title, + footer, + hideCancel + } = this + + let drawerProps = { + width, + title, + placement, + visible: visibleVal, + mask, + maskClosable, + okLoading, + okText, + cancelText, + onOk: (_) => { + this.$emit('ok') + }, + onCancel: (_) => { + this.$emit('cancel') + } + } + if (hideCancel) drawerProps.hideCancel = hideCancel + if (footer == false) { + drawerProps.footer = false + } + let slots = {} + if ($slots.title) slots.title = $slots.title + if ($slots.footer) slots.footer = $slots.footer + return ( + + {$slots.default?.()} + + ) + } +} diff --git a/portal-ui/src/comps/drawer/style/index.less b/portal-ui/src/comps/drawer/style/index.less new file mode 100644 index 0000000..fbbe9b7 --- /dev/null +++ b/portal-ui/src/comps/drawer/style/index.less @@ -0,0 +1,10 @@ +.mf-drawer { + .arco-scrollbar { + height: 100%; + &-container { + height: 100%; + overflow-x: hidden; + overflow-y: auto; + } + } +} diff --git a/portal-ui/src/comps/empty/Empty.js b/portal-ui/src/comps/empty/Empty.js new file mode 100644 index 0000000..8d19781 --- /dev/null +++ b/portal-ui/src/comps/empty/Empty.js @@ -0,0 +1,31 @@ +import BaseMixin from '../_utils/BaseMixin' +import noneImage from '../../assets/images/none.png' + +export default { + name: 'mf-empty', + mixins: [BaseMixin], + props: { + prefixCls: { + type: String, + default: 'mf-empty' + }, + title: { type: String, default: '暂无数据' }, + description: String, + }, + data() { + return {} + }, + methods: {}, + render() { + const { prefixCls, title, description } = this; + return
+ +
+ {title} +
+
+ {description} +
+
+ } +} \ No newline at end of file diff --git a/portal-ui/src/comps/empty/style/index.less b/portal-ui/src/comps/empty/style/index.less new file mode 100644 index 0000000..d43162f --- /dev/null +++ b/portal-ui/src/comps/empty/style/index.less @@ -0,0 +1,20 @@ +.mf-empty { + display: flex; + flex-direction: column; + align-items: center; + img { + width: 120px; + } + + &-title { + color: var(--color-text-2); + margin-top: 30px; + } + + &-description { + color: var(--color-text-4); + margin-top: 12px; + font-size: 12px; + text-align: center; + } +} diff --git a/portal-ui/src/comps/file-preview/FilePreview.js b/portal-ui/src/comps/file-preview/FilePreview.js new file mode 100644 index 0000000..0537385 --- /dev/null +++ b/portal-ui/src/comps/file-preview/FilePreview.js @@ -0,0 +1,69 @@ +/** + * 文件预览 + * @author john + * @date 2022/03/23 + */ + +import BaseMixin from '../_utils/BaseMixin' +import axios from 'axios'; + +export default { + name: 'mf-file-preview', + mixins: [BaseMixin], + components: {}, + props: { + modelValue: String, + height: { + type:String, + default: '500px' + } + }, + data() { + return { + filePreviewId: `filePreview-${this.$uuid.v4()}`, + content: null + } + }, + mounted() { + axios.get(this.modelValue, { + responseType: 'text' + }).then(res => { + this.content = res.data + }) + }, + methods: { + renderView() { + let { modelValue, filePreviewId, content } = this + + if (!modelValue){ + return ( +
+ +

暂无文件

+
+ ) + } + let suffix = this.$file.getSuffix(modelValue) + if(suffix == 'pdf') { + return + }else if(['mp4', 'mov'].indexOf(suffix) > -1) { + return