├── .gitignore ├── .idea ├── .gitignore ├── git_toolbox_prj.xml ├── inspectionProfiles │ └── Project_Default.xml ├── jsLibraryMappings.xml ├── modules.xml ├── sven_ninja.iml └── vcs.xml ├── LICENSE ├── README.md ├── backend ├── .env.example ├── .gitignore ├── app.js ├── ecosystem.config.js ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── src │ ├── service │ │ ├── Content.js │ │ ├── ql.js │ │ └── user.js │ └── util │ │ ├── DbUtil.js │ │ ├── cache.js │ │ ├── encryptUtil.js │ │ ├── jsonResult.js │ │ └── ninjaConfig.js └── static │ ├── activity.json │ ├── activity.json.gz │ ├── assets │ ├── element-icons.9c88a535.woff │ ├── element-icons.de5eb258.ttf │ ├── index.87af8f6f.js │ ├── index.afd402f3.css │ └── logo.03d6d6da.png │ ├── favicon.ico │ └── index.html ├── frontend ├── .editorconfig ├── .env.development ├── .gitignore ├── .prettierrc ├── index.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public │ └── favicon.ico ├── src │ ├── App.vue │ ├── api │ │ └── index.js │ ├── assets │ │ └── logo.png │ ├── components │ │ ├── Header.vue │ │ ├── Logo.vue │ │ └── updateLog.vue │ ├── index.css │ ├── main.js │ ├── manageStore.js │ ├── router.js │ └── views │ │ ├── index.vue │ │ ├── login.vue │ │ └── manage.vue ├── tailwind.config.js └── vite.config.js └── img ├── img.png ├── img_1.png ├── img_2.png ├── img_3.png └── img_5.png /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux 4 | 5 | ### Linux ### 6 | *~ 7 | 8 | # temporary files which can be created if a process still has a handle open of a deleted file 9 | .fuse_hidden* 10 | 11 | # KDE directory preferences 12 | .directory 13 | 14 | # Linux trash folder which might appear on any partition or disk 15 | .Trash-* 16 | 17 | # .nfs files are created when an open file is removed but is still being accessed 18 | .nfs* 19 | 20 | ### macOS ### 21 | # General 22 | .DS_Store 23 | .AppleDouble 24 | .LSOverride 25 | 26 | # Icon must end with two \r 27 | Icon 28 | 29 | 30 | # Thumbnails 31 | ._* 32 | 33 | # Files that might appear in the root of a volume 34 | .DocumentRevisions-V100 35 | .fseventsd 36 | .Spotlight-V100 37 | .TemporaryItems 38 | .Trashes 39 | .VolumeIcon.icns 40 | .com.apple.timemachine.donotpresent 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | 49 | ### Node ### 50 | # Logs 51 | logs 52 | *.log 53 | npm-debug.log* 54 | yarn-debug.log* 55 | yarn-error.log* 56 | lerna-debug.log* 57 | .pnpm-debug.log* 58 | 59 | # Diagnostic reports (https://nodejs.org/api/report.html) 60 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 61 | 62 | # Runtime data 63 | pids 64 | *.pid 65 | *.seed 66 | *.pid.lock 67 | 68 | # Directory for instrumented libs generated by jscoverage/JSCover 69 | lib-cov 70 | 71 | # Coverage directory used by tools like istanbul 72 | coverage 73 | *.lcov 74 | 75 | # nyc test coverage 76 | .nyc_output 77 | 78 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 79 | .grunt 80 | 81 | # Bower dependency directory (https://bower.io/) 82 | bower_components 83 | 84 | # node-waf configuration 85 | .lock-wscript 86 | 87 | # Compiled binary addons (https://nodejs.org/api/addons.html) 88 | build/Release 89 | 90 | # Dependency directories 91 | node_modules/ 92 | jspm_packages/ 93 | 94 | # Snowpack dependency directory (https://snowpack.dev/) 95 | web_modules/ 96 | 97 | # TypeScript cache 98 | *.tsbuildinfo 99 | 100 | # Optional npm cache directory 101 | .npm 102 | 103 | # Optional eslint cache 104 | .eslintcache 105 | 106 | # Microbundle cache 107 | .rpt2_cache/ 108 | .rts2_cache_cjs/ 109 | .rts2_cache_es/ 110 | .rts2_cache_umd/ 111 | 112 | # Optional REPL history 113 | .node_repl_history 114 | 115 | # Output of 'npm pack' 116 | *.tgz 117 | 118 | # Yarn Integrity file 119 | .yarn-integrity 120 | 121 | # dotenv environment variables file 122 | .env 123 | .env.test 124 | .env.production 125 | 126 | # parcel-bundler cache (https://parceljs.org/) 127 | .cache 128 | .parcel-cache 129 | 130 | # Next.js build output 131 | .next 132 | out 133 | 134 | # Nuxt.js build / generate output 135 | .nuxt 136 | dist 137 | 138 | # Gatsby files 139 | .cache/ 140 | # Comment in the public line in if your project uses Gatsby and not Next.js 141 | # https://nextjs.org/blog/next-9-1#public-directory-support 142 | # public 143 | 144 | # vuepress build output 145 | .vuepress/dist 146 | 147 | # Serverless directories 148 | .serverless/ 149 | 150 | # FuseBox cache 151 | .fusebox/ 152 | 153 | # DynamoDB Local files 154 | .dynamodb/ 155 | 156 | # TernJS port file 157 | .tern-port 158 | 159 | # Stores VSCode versions used for testing VSCode extensions 160 | .vscode-test 161 | 162 | # yarn v2 163 | .yarn/cache 164 | .yarn/unplugged 165 | .yarn/build-state.yml 166 | .yarn/install-state.gz 167 | .pnp.* 168 | 169 | ### Windows ### 170 | # Windows thumbnail cache files 171 | Thumbs.db 172 | Thumbs.db:encryptable 173 | ehthumbs.db 174 | ehthumbs_vista.db 175 | 176 | # Dump file 177 | *.stackdump 178 | 179 | # Folder config file 180 | [Dd]esktop.ini 181 | 182 | # Recycle Bin used on file shares 183 | $RECYCLE.BIN/ 184 | 185 | # Windows Installer files 186 | *.cab 187 | *.msi 188 | *.msix 189 | *.msm 190 | *.msp 191 | 192 | # Windows shortcuts 193 | *.lnk 194 | 195 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 196 | 197 | ql 198 | 199 | node_modules 200 | .DS_Store 201 | dist 202 | dist-ssr 203 | *.local 204 | /backend/src/db/* 205 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.idea/git_toolbox_prj.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 21 | -------------------------------------------------------------------------------- /.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/sven_ninja.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) [year] [fullname] 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Ninja 3 | 4 |   Ninja是一个青龙面板的环境变量添加工具,通过调用青龙面板开放的OpenApi即可实现无需登录青龙面板对环境变量进行控制。本版本Ninja由作者从Waikiki版本修改而来,主要修改的内容如下: 5 | 6 | * 抛弃原先的使用读取青龙`auth.json`获取调用权限,改用OpenApi方式获取远程调用权限(适配高版本,并且解决以往需要固定时间登陆一次青龙容器问题,否则获取不到容量) 7 | * 移除WSKEY添加功能 8 | * 修改添加CK的逻辑,改为先注册后登录,再去添加CK; 9 | 10 | ### 由于本版本无需密码只需要用户名就可以登录,他人在知晓用户名的情况下可以肆意删除或禁用CK(并不会泄露CK,无法看见变量内容),所以并不推荐大面积的使用,仅推荐个人的小范围使用。 11 | ### 仅用于向青龙面板添加固定格式的变量,切勿用于其他用途。一旦使用并复制了本仓库的项目,则视为您已接受下方特别声明。 12 | 13 | ### 本版本功能列表 14 | 15 | - [x] **支持管理员自定义提示信息功能** 16 | - [x] **支持系统管理功能,控制可用数量,功能的开启与关闭等各项设置** 17 | - [x] **支持用户禁用和启用变量** 18 | - [x] **自动登录验证加密后的用户名,保证账号安全** 19 | - [x] 支持用户注册并登录 20 | - [x] 支持用户查看CK的禁用和启用状态 21 | - [x] 支持用户删除账号 22 | - [x] 支持Cookie添加功能 23 | 24 | 25 | ## 致谢 26 | 27 | 感谢Ninja原作者:@MoonBegonia 28 | 29 | 仓库地址:https://github.com/MoonBegonia/ninja 30 | 31 | 基于@Waikiki版本修改: 32 | 33 | 仓库地址:https://github.com/Waikkii/Waikiki_ninja 34 | 35 | 36 | ## 文档 37 | 38 | ### Ninja 环境变量 39 | 40 | 目前支持的环境变量有: 41 | 42 | - `CLIENT_ID`:青龙授权id(必填) 43 | - `CLIENT_SECRET`:青龙授权密码(必填) 44 | - `ALLOW_ADD`: 是否允许添加账号 不允许添加时则只允许已有账号登录(默认 开启为`true`) 45 | - `ALLOW_NUM`: 允许添加账号的最大数量(默认 `20`) 46 | - `NINJA_PORT`: Ninja 运行端口(默认 `5701`) 47 | - `ALLOW_ADMIN`: 是否开启管理员账号(默认 开启为`true`,`false`关闭) 48 | - `ADMIN_USERNAME`: 管理员账号(默认 `admin`) 49 | - `ADMIN_PASSWORD`: 管理员密码(默认 `123456`) 50 | - `USERNAME_SALT`: 用户名加密密钥(默认`ninja123`) 51 | 52 | 变量特别说明
53 | - `USERNAME_SALT`: 强烈建议修改此项,内容可以随意填写,但是长度必须为8的倍数 8,16,24,32... 系统将根据该值来对用户名进行加密 54 | - `ALLOW_ADMIN`: 默认关闭,建议开启,开启后通过环境变量中配置的管理员账号密码登录后可以进入到管理页面对Ninja系统进行管理,自定义提示信息,开启后注意要修改环境变量中的管理员账号密码,以防被别人利用。 55 | - `CLIENT_ID`,`CLIENT_SECRET`: 在青龙控制面板的 `系统设置-应用设置-新建应用` 添加用于Ninja的授权信息,给予Ninja环境变量的访问权限。 56 | 57 | 配置方式: 58 | 59 | ```bash 60 | cd /ql/ninja/backend 61 | cp .env.example .env 62 | vi .env 63 | pm2 start 64 | ``` 65 | 66 | **修改完成后需要 `pm2 start` 重启生效 !!!** 67 | 68 | ### Ninja部署到Docker 69 | 70 | 1. 容器映射 5701 端口,ninja 目录至宿主机 71 | 72 | 例(docker-compose): 73 | 74 | ```diff 75 | version: "3" 76 | services: 77 | qinglong: 78 | image: whyour/qinglong:latest 79 | container_name: qinglong 80 | restart: unless-stopped 81 | tty: true 82 | ports: 83 | - 5700:5700 84 | + - 5701:5701 85 | environment: 86 | - ENABLE_HANGUP=true 87 | - ENABLE_WEB_PANEL=true 88 | volumes: 89 | - ./config:/ql/config 90 | - ./log:/ql/log 91 | - ./db:/ql/db 92 | - ./repo:/ql/repo 93 | - ./raw:/ql/raw 94 | - ./scripts:/ql/scripts 95 | - ./jbot:/ql/jbot 96 | + - ./ninja:/ql/ninja 97 | ``` 98 | 99 | 例(docker-run): 100 | 101 | ```diff 102 | docker run -dit \ 103 | -v $PWD/ql/config:/ql/config \ 104 | -v $PWD/ql/log:/ql/log \ 105 | -v $PWD/ql/db:/ql/db \ 106 | -v $PWD/ql/repo:/ql/repo \ 107 | -v $PWD/ql/raw:/ql/raw \ 108 | -v $PWD/ql/scripts:/ql/scripts \ 109 | -v $PWD/ql/jbot:/ql/jbot \ 110 | + -v $PWD/ql/ninja:/ql/ninja \ 111 | -p 5700:5700 \ 112 | + -p 5701:5701 \ 113 | --name qinglong \ 114 | --hostname qinglong \ 115 | --restart unless-stopped \ 116 | whyour/qinglong:latest 117 | ``` 118 | 119 | 2. 进入青龙容器内执行以下命令 120 | 121 | 进入容器命令 `docker exec -it qinglong bash` 需要对应容器名 122 | 123 | ```bash 124 | git clone https://github.com/SvenShi/sven_ninja.git /ql/ninja 125 | cd /ql/ninja/backend 126 | pnpm install 127 | cp .env.example .env 128 | ``` 129 | 3. 修改环境变量(可以跳过,启动之后进入页面中设置) 130 | 131 | 打开环境变量配置文件 132 | ```bash 133 | vi .env 134 | ``` 135 | 136 | 在 `.env` 文件中添加以下内容: 137 | 138 | ```bash 139 | QL_URL=http://localhost:5700 #青龙端口如果为5700 则无需添加此变量 140 | ``` 141 | 在 `.env` 文件中修改以下内容: 142 | ```bash 143 | #青龙授权令牌 在青龙容器设置中获取 144 | CLIENT_ID=*********** 145 | CLIENT_SECRET=******** 146 | #用户名加密密钥,强烈建议修改 可以随意填写任何内容但是长度必须为8的倍数 8 16 24 32 系统将根据该值来对用户名进行加密 147 | USERNAME_SALT:ninja123 148 | ``` 149 | 150 | 4. 启动Ninja 151 | ```bash 152 | pm2 start 153 | ``` 154 | 155 | 5. 将以下内容粘贴到 `extra.sh`(重启后自动更新并启动 Ninja) 156 | 157 | 可在青龙面板的配置文件菜单中找到`extra.sh` 158 | 159 | ```bash 160 | cd /ql/ninja/backend 161 | git checkout . 162 | git pull 163 | pnpm install 164 | pm2 start 165 | ``` 166 | 167 | ## 注意事项 168 | 169 | - 重启后务必执行一次 `ql extra` 保证 Ninja 配置成功。 170 | 171 | - 更新 Ninja 只需要在**容器**中 `ninja/backend` 目录执行 `git pull` 然后 `pm2 start` 172 | 173 | ## 如何更新Ninja 174 | 175 | ```bash 176 | cd /ql/ninja 177 | git checkout . 178 | git pull 179 | cd backend 180 | pnpm install 181 | pm2 start 182 | ``` 183 | 184 | ## 如何删除Ninja 185 | 186 | ```bash 187 | cd /ql/ninja 188 | pm2 delete ninja 189 | rm -rf * 190 | rm -r ./.* 191 | ``` 192 | 193 | 194 | ## 特别声明 195 | 196 | * 本项目仅为作者空闲时间开发的个人学习研究vue3的青龙变量添加工具。 197 | 198 | * 本仓库涉仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 199 | 200 | * 本项目内所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。 201 | 202 | * 作者对任何代码问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害。 203 | 204 | * 间接使用本仓库搭建的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 作者对于由此引起的任何隐私泄漏或其他后果概不负责。 205 | 206 | * 请勿将本项目的任何内容用于商业或非法目的,否则后果自负。 207 | 208 | * 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关代码。 209 | 210 | * 任何以任何方式查看此项目的人或直接或间接使用本仓库项目的使用者都应仔细阅读此声明。作者保留随时更改或补充此免责声明的权利。**一旦使用并复制了本仓库的项目,则视为您已接受此免责声明。** 211 | 212 | **您必须在下载后的24小时内从计算机或手机中完全删除以上内容。** 213 |
214 | > ***您使用或者复制了本仓库且本人制作的项目,则视为`已接受`此声明,请仔细阅读*** 215 | -------------------------------------------------------------------------------- /backend/.env.example: -------------------------------------------------------------------------------- 1 | # 是否允许添加账号 不允许添加时则只允许已有账号登录 2 | ALLOW_ADD=true 3 | 4 | # 允许添加账号的最大数量 5 | ALLOW_NUM=20 6 | 7 | # 青龙权限密码 8 | CLIENT_ID=******** 9 | CLIENT_SECRET=****** 10 | 11 | # 是否开启管理员账号 true 开启 false 关闭 12 | ALLOW_ADMIN=true 13 | 14 | # 用户名加密密钥 强烈建议修改此项配置 可以随意填写任何内容但是长度必须为8的倍数 8 16 24 32 系统将根据该值来对用户名进行加密 15 | USERNAME_SALT=ninja123 16 | 17 | # 管理员账号 18 | ADMIN_USERNAME=admin 19 | # 管理员密码 20 | ADMIN_PASSWORD=123456 21 | 22 | # Ninja 运行端口 23 | NINJA_PORT=5701 24 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux 4 | 5 | ### Linux ### 6 | *~ 7 | 8 | # temporary files which can be created if a process still has a handle open of a deleted file 9 | .fuse_hidden* 10 | 11 | # KDE directory preferences 12 | .directory 13 | 14 | # Linux trash folder which might appear on any partition or disk 15 | .Trash-* 16 | 17 | # .nfs files are created when an open file is removed but is still being accessed 18 | .nfs* 19 | 20 | ### macOS ### 21 | # General 22 | .DS_Store 23 | .AppleDouble 24 | .LSOverride 25 | 26 | # Icon must end with two \r 27 | Icon 28 | 29 | 30 | # Thumbnails 31 | ._* 32 | 33 | # Files that might appear in the root of a volume 34 | .DocumentRevisions-V100 35 | .fseventsd 36 | .Spotlight-V100 37 | .TemporaryItems 38 | .Trashes 39 | .VolumeIcon.icns 40 | .com.apple.timemachine.donotpresent 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | 49 | ### Node ### 50 | # Logs 51 | logs 52 | *.log 53 | npm-debug.log* 54 | yarn-debug.log* 55 | yarn-error.log* 56 | lerna-debug.log* 57 | .pnpm-debug.log* 58 | 59 | # Diagnostic reports (https://nodejs.org/api/report.html) 60 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 61 | 62 | # Runtime data 63 | pids 64 | *.pid 65 | *.seed 66 | *.pid.lock 67 | 68 | # Directory for instrumented libs generated by jscoverage/JSCover 69 | lib-cov 70 | 71 | # Coverage directory used by tools like istanbul 72 | coverage 73 | *.lcov 74 | 75 | # nyc test coverage 76 | .nyc_output 77 | 78 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 79 | .grunt 80 | 81 | # Bower dependency directory (https://bower.io/) 82 | bower_components 83 | 84 | # node-waf configuration 85 | .lock-wscript 86 | 87 | # Compiled binary addons (https://nodejs.org/api/addons.html) 88 | build/Release 89 | 90 | # Dependency directories 91 | node_modules/ 92 | jspm_packages/ 93 | 94 | # Snowpack dependency directory (https://snowpack.dev/) 95 | web_modules/ 96 | 97 | # TypeScript cache 98 | *.tsbuildinfo 99 | 100 | # Optional npm cache directory 101 | .npm 102 | 103 | # Optional eslint cache 104 | .eslintcache 105 | 106 | # Microbundle cache 107 | .rpt2_cache/ 108 | .rts2_cache_cjs/ 109 | .rts2_cache_es/ 110 | .rts2_cache_umd/ 111 | 112 | # Optional REPL history 113 | .node_repl_history 114 | 115 | # Output of 'npm pack' 116 | *.tgz 117 | 118 | # Yarn Integrity file 119 | .yarn-integrity 120 | 121 | # dotenv environment variables file 122 | .env 123 | .env.test 124 | .env.production 125 | 126 | # parcel-bundler cache (https://parceljs.org/) 127 | .cache 128 | .parcel-cache 129 | 130 | # Next.js build output 131 | .next 132 | out 133 | 134 | # Nuxt.js build / generate output 135 | .nuxt 136 | dist 137 | 138 | # Gatsby files 139 | .cache/ 140 | # Comment in the public line in if your project uses Gatsby and not Next.js 141 | # https://nextjs.org/blog/next-9-1#public-directory-support 142 | # public 143 | 144 | # vuepress build output 145 | .vuepress/dist 146 | 147 | # Serverless directories 148 | .serverless/ 149 | 150 | # FuseBox cache 151 | .fusebox/ 152 | 153 | # DynamoDB Local files 154 | .dynamodb/ 155 | 156 | # TernJS port file 157 | .tern-port 158 | 159 | # Stores VSCode versions used for testing VSCode extensions 160 | .vscode-test 161 | 162 | # yarn v2 163 | .yarn/cache 164 | .yarn/unplugged 165 | .yarn/build-state.yml 166 | .yarn/install-state.gz 167 | .pnp.* 168 | 169 | ### Windows ### 170 | # Windows thumbnail cache files 171 | Thumbs.db 172 | Thumbs.db:encryptable 173 | ehthumbs.db 174 | ehthumbs_vista.db 175 | 176 | # Dump file 177 | *.stackdump 178 | 179 | # Folder config file 180 | [Dd]esktop.ini 181 | 182 | # Recycle Bin used on file shares 183 | $RECYCLE.BIN/ 184 | 185 | # Windows Installer files 186 | *.cab 187 | *.msi 188 | *.msix 189 | *.msm 190 | *.msp 191 | 192 | # Windows shortcuts 193 | *.lnk 194 | 195 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 196 | 197 | ql 198 | -------------------------------------------------------------------------------- /backend/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Koa = require('koa'); 4 | const cors = require('@koa/cors'); 5 | const Router = require('@koa/router'); 6 | const body = require('koa-body'); 7 | const serve = require('koa-static'); 8 | const User = require('./src/service/user'); 9 | const Content = require('./src/service/Content') 10 | const packageJson = require('./package.json'); 11 | 12 | // Create express instance 13 | const app = new Koa(); 14 | const router = new Router(); 15 | 16 | const handler = async (ctx, next) => { 17 | try { 18 | await next(); 19 | } catch (err) { 20 | console.log(err); 21 | ctx.status = 200; 22 | ctx.body = { 23 | code: err.status || err.statusCode || 500, msg: err.message, 24 | }; 25 | } 26 | }; 27 | 28 | app.use(serve('static')); 29 | app.use(cors()); 30 | app.use(handler); 31 | app.use(router.routes()).use(router.allowedMethods()); 32 | 33 | router.get('/api/status', (ctx) => { 34 | ctx.body = { 35 | code: 200, data: { 36 | version: packageJson.version, 37 | }, msg: 'Ninja is already.', 38 | }; 39 | }); 40 | 41 | router.get('/api/info', async (ctx) => { 42 | ctx.body = await User.getPoolInfo(); 43 | }); 44 | 45 | router.post('/api/login', body(), async (ctx) => { 46 | ctx.body = await new User(ctx.request.body).login() 47 | }); 48 | 49 | router.post('/api/register', body(), async (ctx) => { 50 | ctx.body = await new User(ctx.request.body).register(); 51 | }); 52 | 53 | router.get('/api/userinfo', async (ctx) => { 54 | ctx.body = await new User({eid: ctx.query.eid, encryptUsername: ctx.query.encryptUsername}).getUserInfoByEid(); 55 | }); 56 | 57 | 58 | router.post('/api/delete', body(), async (ctx) => { 59 | ctx.body = await new User({eid: ctx.request.body.eid}).delUserByEid(); 60 | }); 61 | 62 | router.post('/api/update', body(), async (ctx) => { 63 | const body = ctx.request.body; 64 | const eid = body.eid; 65 | const username = body.username; 66 | const ck = body.ck; 67 | ctx.body = await new User({eid, ck, username}).update(); 68 | }); 69 | 70 | router.post('/api/disable', body(), async (ctx) => { 71 | const body = ctx.request.body; 72 | const eid = body.eid; 73 | ctx.body = await new User({eid}).disableEnv(); 74 | }); 75 | 76 | 77 | router.post('/api/enable', body(), async (ctx) => { 78 | const body = ctx.request.body; 79 | const eid = body.eid; 80 | ctx.body = await new User({eid}).enableEnv(); 81 | }); 82 | 83 | router.post('/api/verifyToken', body(), async (ctx) => { 84 | const body = ctx.request.body; 85 | const token = body.token; 86 | ctx.body = await new User({token}).verifyToken(); 87 | }); 88 | 89 | 90 | router.get('/api/getContent', async (ctx) => { 91 | ctx.body = await Content.getAllContent() 92 | }); 93 | 94 | 95 | router.post('/api/setContent', body(), async (ctx) => { 96 | const body = ctx.request.body; 97 | ctx.body = Content.updateContent(body) 98 | }); 99 | 100 | router.get('/api/getAllConfig', async (ctx) => { 101 | const query = ctx.query; 102 | const token = query.token; 103 | ctx.body = await new User({token}).getAllConfig(); 104 | }); 105 | 106 | 107 | 108 | router.post('/api/saveConfig', body(), async (ctx) => { 109 | const body = ctx.request.body; 110 | ctx.body = await new User({token: body.token}).saveConfig(body); 111 | }); 112 | 113 | 114 | const port = process.env.NINJA_PORT || 5701; 115 | console.log('Start Ninja success! listening port: ' + port); 116 | app.listen(port); 117 | -------------------------------------------------------------------------------- /backend/ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [ 3 | { 4 | name: 'ninja', 5 | script: './app.js', 6 | }, 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "22.06.26", 3 | "scripts": { 4 | "dev": "nodemon --ignore db/ app.js" 5 | }, 6 | "engines": { 7 | "node": ">=14" 8 | }, 9 | "dependencies": { 10 | "@koa/cors": "^3.1.0", 11 | "@koa/router": "^10.1.0", 12 | "axios": "^0.21.1", 13 | "crypto-js": "^4.1.1", 14 | "dotenv": "^10.0.0", 15 | "got": "^11.8.2", 16 | "koa": "^2.13.1", 17 | "koa-body": "^4.2.0", 18 | "koa-log4": "^2.3.2", 19 | "koa-static": "^5.0.0", 20 | "nodemon": "^2.0.18", 21 | "uuid": "^8.3.2" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /backend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@koa/cors': ^3.1.0 5 | '@koa/router': ^10.1.0 6 | axios: ^0.21.1 7 | dotenv: ^10.0.0 8 | got: ^11.8.2 9 | koa: ^2.13.1 10 | koa-body: ^4.2.0 11 | koa-log4: ^2.3.2 12 | koa-static: ^5.0.0 13 | nodemon: ^2.0.12 14 | qrcode: ^1.4.4 15 | 16 | dependencies: 17 | '@koa/cors': 3.1.0 18 | '@koa/router': 10.1.0 19 | axios: 0.21.1 20 | dotenv: 10.0.0 21 | got: 11.8.2 22 | koa: 2.13.1 23 | koa-body: 4.2.0 24 | koa-log4: 2.3.2 25 | koa-static: 5.0.0 26 | nodemon: 2.0.12 27 | qrcode: 1.4.4 28 | 29 | packages: 30 | 31 | /@koa/cors/3.1.0: 32 | resolution: {integrity: sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q==} 33 | engines: {node: '>= 8.0.0'} 34 | dependencies: 35 | vary: 1.1.2 36 | dev: false 37 | 38 | /@koa/router/10.1.0: 39 | resolution: {integrity: sha512-QZiCDn8Fd9vVN0qCWw81fToF5GMdtyPD04fIOHXiCCmXB6sznhjHMd3xbVS2ZxrgLWrcN8s6tIItEv0wuXt2Ow==} 40 | engines: {node: '>= 8.0.0'} 41 | dependencies: 42 | debug: 4.3.2 43 | http-errors: 1.8.0 44 | koa-compose: 4.1.0 45 | methods: 1.1.2 46 | path-to-regexp: 6.2.0 47 | transitivePeerDependencies: 48 | - supports-color 49 | dev: false 50 | 51 | /@sindresorhus/is/0.14.0: 52 | resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} 53 | engines: {node: '>=6'} 54 | dev: false 55 | 56 | /@sindresorhus/is/4.0.1: 57 | resolution: {integrity: sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==} 58 | engines: {node: '>=10'} 59 | dev: false 60 | 61 | /@szmarczak/http-timer/1.1.2: 62 | resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} 63 | engines: {node: '>=6'} 64 | dependencies: 65 | defer-to-connect: 1.1.3 66 | dev: false 67 | 68 | /@szmarczak/http-timer/4.0.6: 69 | resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} 70 | engines: {node: '>=10'} 71 | dependencies: 72 | defer-to-connect: 2.0.1 73 | dev: false 74 | 75 | /@types/cacheable-request/6.0.2: 76 | resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} 77 | dependencies: 78 | '@types/http-cache-semantics': 4.0.1 79 | '@types/keyv': 3.1.2 80 | '@types/node': 16.4.3 81 | '@types/responselike': 1.0.0 82 | dev: false 83 | 84 | /@types/formidable/1.2.3: 85 | resolution: {integrity: sha512-Ibu3TyzldPvzTK1yus5+uPDwN5m6pXCcO0c0rPKA1uce5ERjqP5AX9reKEqQFVlCScqjbQgitIQEOLlb6qd7Sw==} 86 | dependencies: 87 | '@types/node': 16.4.3 88 | dev: false 89 | 90 | /@types/http-cache-semantics/4.0.1: 91 | resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} 92 | dev: false 93 | 94 | /@types/keyv/3.1.2: 95 | resolution: {integrity: sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==} 96 | dependencies: 97 | '@types/node': 16.4.3 98 | dev: false 99 | 100 | /@types/node/16.4.3: 101 | resolution: {integrity: sha512-GKM4FLMkWDc0sfx7tXqPWkM6NBow1kge0fgQh0bOnlqo4iT1kvTvMEKE0c1RtUGnbLlGRXiAA8SumE//90uKAg==} 102 | dev: false 103 | 104 | /@types/responselike/1.0.0: 105 | resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} 106 | dependencies: 107 | '@types/node': 16.4.3 108 | dev: false 109 | 110 | /abbrev/1.1.1: 111 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 112 | dev: false 113 | 114 | /accepts/1.3.7: 115 | resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==} 116 | engines: {node: '>= 0.6'} 117 | dependencies: 118 | mime-types: 2.1.31 119 | negotiator: 0.6.2 120 | dev: false 121 | 122 | /ansi-align/3.0.0: 123 | resolution: {integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==} 124 | dependencies: 125 | string-width: 3.1.0 126 | dev: false 127 | 128 | /ansi-regex/4.1.0: 129 | resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} 130 | engines: {node: '>=6'} 131 | dev: false 132 | 133 | /ansi-regex/5.0.0: 134 | resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} 135 | engines: {node: '>=8'} 136 | dev: false 137 | 138 | /ansi-styles/3.2.1: 139 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 140 | engines: {node: '>=4'} 141 | dependencies: 142 | color-convert: 1.9.3 143 | dev: false 144 | 145 | /ansi-styles/4.3.0: 146 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 147 | engines: {node: '>=8'} 148 | dependencies: 149 | color-convert: 2.0.1 150 | dev: false 151 | 152 | /any-promise/1.3.0: 153 | resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} 154 | dev: false 155 | 156 | /anymatch/3.1.2: 157 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 158 | engines: {node: '>= 8'} 159 | dependencies: 160 | normalize-path: 3.0.0 161 | picomatch: 2.3.0 162 | dev: false 163 | 164 | /axios/0.21.1: 165 | resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==} 166 | dependencies: 167 | follow-redirects: 1.14.1 168 | transitivePeerDependencies: 169 | - debug 170 | dev: false 171 | 172 | /balanced-match/1.0.2: 173 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 174 | dev: false 175 | 176 | /base64-js/1.5.1: 177 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 178 | dev: false 179 | 180 | /binary-extensions/2.2.0: 181 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 182 | engines: {node: '>=8'} 183 | dev: false 184 | 185 | /boxen/4.2.0: 186 | resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} 187 | engines: {node: '>=8'} 188 | dependencies: 189 | ansi-align: 3.0.0 190 | camelcase: 5.3.1 191 | chalk: 3.0.0 192 | cli-boxes: 2.2.1 193 | string-width: 4.2.2 194 | term-size: 2.2.1 195 | type-fest: 0.8.1 196 | widest-line: 3.1.0 197 | dev: false 198 | 199 | /brace-expansion/1.1.11: 200 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 201 | dependencies: 202 | balanced-match: 1.0.2 203 | concat-map: 0.0.1 204 | dev: false 205 | 206 | /braces/3.0.2: 207 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 208 | engines: {node: '>=8'} 209 | dependencies: 210 | fill-range: 7.0.1 211 | dev: false 212 | 213 | /buffer-alloc-unsafe/1.1.0: 214 | resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} 215 | dev: false 216 | 217 | /buffer-alloc/1.2.0: 218 | resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} 219 | dependencies: 220 | buffer-alloc-unsafe: 1.1.0 221 | buffer-fill: 1.0.0 222 | dev: false 223 | 224 | /buffer-fill/1.0.0: 225 | resolution: {integrity: sha1-+PeLdniYiO858gXNY39o5wISKyw=} 226 | dev: false 227 | 228 | /buffer-from/1.1.1: 229 | resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==} 230 | dev: false 231 | 232 | /buffer/5.7.1: 233 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 234 | dependencies: 235 | base64-js: 1.5.1 236 | ieee754: 1.2.1 237 | dev: false 238 | 239 | /bytes/3.1.0: 240 | resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} 241 | engines: {node: '>= 0.8'} 242 | dev: false 243 | 244 | /cache-content-type/1.0.1: 245 | resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} 246 | engines: {node: '>= 6.0.0'} 247 | dependencies: 248 | mime-types: 2.1.31 249 | ylru: 1.2.1 250 | dev: false 251 | 252 | /cacheable-lookup/5.0.4: 253 | resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} 254 | engines: {node: '>=10.6.0'} 255 | dev: false 256 | 257 | /cacheable-request/6.1.0: 258 | resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} 259 | engines: {node: '>=8'} 260 | dependencies: 261 | clone-response: 1.0.2 262 | get-stream: 5.2.0 263 | http-cache-semantics: 4.1.0 264 | keyv: 3.1.0 265 | lowercase-keys: 2.0.0 266 | normalize-url: 4.5.1 267 | responselike: 1.0.2 268 | dev: false 269 | 270 | /cacheable-request/7.0.2: 271 | resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} 272 | engines: {node: '>=8'} 273 | dependencies: 274 | clone-response: 1.0.2 275 | get-stream: 5.2.0 276 | http-cache-semantics: 4.1.0 277 | keyv: 4.0.3 278 | lowercase-keys: 2.0.0 279 | normalize-url: 6.1.0 280 | responselike: 2.0.0 281 | dev: false 282 | 283 | /call-bind/1.0.2: 284 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 285 | dependencies: 286 | function-bind: 1.1.1 287 | get-intrinsic: 1.1.1 288 | dev: false 289 | 290 | /camelcase/5.3.1: 291 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 292 | engines: {node: '>=6'} 293 | dev: false 294 | 295 | /chalk/3.0.0: 296 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 297 | engines: {node: '>=8'} 298 | dependencies: 299 | ansi-styles: 4.3.0 300 | supports-color: 7.2.0 301 | dev: false 302 | 303 | /chokidar/3.5.2: 304 | resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} 305 | engines: {node: '>= 8.10.0'} 306 | dependencies: 307 | anymatch: 3.1.2 308 | braces: 3.0.2 309 | glob-parent: 5.1.2 310 | is-binary-path: 2.1.0 311 | is-glob: 4.0.1 312 | normalize-path: 3.0.0 313 | readdirp: 3.6.0 314 | optionalDependencies: 315 | fsevents: registry.npmmirror.com/fsevents/2.3.2 316 | dev: false 317 | 318 | /ci-info/2.0.0: 319 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} 320 | dev: false 321 | 322 | /circular-json/0.5.9: 323 | resolution: {integrity: sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==} 324 | deprecated: CircularJSON is in maintenance only, flatted is its successor. 325 | dev: false 326 | 327 | /cli-boxes/2.2.1: 328 | resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} 329 | engines: {node: '>=6'} 330 | dev: false 331 | 332 | /cliui/5.0.0: 333 | resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} 334 | dependencies: 335 | string-width: 3.1.0 336 | strip-ansi: 5.2.0 337 | wrap-ansi: 5.1.0 338 | dev: false 339 | 340 | /clone-response/1.0.2: 341 | resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} 342 | dependencies: 343 | mimic-response: 1.0.1 344 | dev: false 345 | 346 | /co-body/5.2.0: 347 | resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==} 348 | dependencies: 349 | inflation: 2.0.0 350 | qs: 6.10.1 351 | raw-body: 2.4.1 352 | type-is: 1.6.18 353 | dev: false 354 | 355 | /co/4.6.0: 356 | resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} 357 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 358 | dev: false 359 | 360 | /color-convert/1.9.3: 361 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 362 | dependencies: 363 | color-name: 1.1.3 364 | dev: false 365 | 366 | /color-convert/2.0.1: 367 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 368 | engines: {node: '>=7.0.0'} 369 | dependencies: 370 | color-name: 1.1.4 371 | dev: false 372 | 373 | /color-name/1.1.3: 374 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 375 | dev: false 376 | 377 | /color-name/1.1.4: 378 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 379 | dev: false 380 | 381 | /concat-map/0.0.1: 382 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 383 | dev: false 384 | 385 | /configstore/5.0.1: 386 | resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} 387 | engines: {node: '>=8'} 388 | dependencies: 389 | dot-prop: 5.3.0 390 | graceful-fs: 4.2.6 391 | make-dir: 3.1.0 392 | unique-string: 2.0.0 393 | write-file-atomic: 3.0.3 394 | xdg-basedir: 4.0.0 395 | dev: false 396 | 397 | /content-disposition/0.5.3: 398 | resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==} 399 | engines: {node: '>= 0.6'} 400 | dependencies: 401 | safe-buffer: 5.1.2 402 | dev: false 403 | 404 | /content-type/1.0.4: 405 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 406 | engines: {node: '>= 0.6'} 407 | dev: false 408 | 409 | /cookies/0.8.0: 410 | resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} 411 | engines: {node: '>= 0.8'} 412 | dependencies: 413 | depd: 2.0.0 414 | keygrip: 1.1.0 415 | dev: false 416 | 417 | /core-util-is/1.0.2: 418 | resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} 419 | dev: false 420 | 421 | /crypto-random-string/2.0.0: 422 | resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} 423 | engines: {node: '>=8'} 424 | dev: false 425 | 426 | /date-format/1.2.0: 427 | resolution: {integrity: sha1-YV6CjiM90aubua4JUODOzPpuytg=} 428 | engines: {node: '>=4.0'} 429 | dev: false 430 | 431 | /debug/2.6.9: 432 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 433 | dependencies: 434 | ms: 2.0.0 435 | dev: false 436 | 437 | /debug/3.1.0: 438 | resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} 439 | dependencies: 440 | ms: 2.0.0 441 | dev: false 442 | 443 | /debug/3.2.7: 444 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 445 | dependencies: 446 | ms: 2.1.3 447 | dev: false 448 | 449 | /debug/4.3.2: 450 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} 451 | engines: {node: '>=6.0'} 452 | peerDependencies: 453 | supports-color: '*' 454 | peerDependenciesMeta: 455 | supports-color: 456 | optional: true 457 | dependencies: 458 | ms: 2.1.2 459 | dev: false 460 | 461 | /decamelize/1.2.0: 462 | resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} 463 | engines: {node: '>=0.10.0'} 464 | dev: false 465 | 466 | /decompress-response/3.3.0: 467 | resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=} 468 | engines: {node: '>=4'} 469 | dependencies: 470 | mimic-response: 1.0.1 471 | dev: false 472 | 473 | /decompress-response/6.0.0: 474 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 475 | engines: {node: '>=10'} 476 | dependencies: 477 | mimic-response: 3.1.0 478 | dev: false 479 | 480 | /deep-equal/1.0.1: 481 | resolution: {integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=} 482 | dev: false 483 | 484 | /deep-extend/0.6.0: 485 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 486 | engines: {node: '>=4.0.0'} 487 | dev: false 488 | 489 | /defer-to-connect/1.1.3: 490 | resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} 491 | dev: false 492 | 493 | /defer-to-connect/2.0.1: 494 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 495 | engines: {node: '>=10'} 496 | dev: false 497 | 498 | /delegates/1.0.0: 499 | resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} 500 | dev: false 501 | 502 | /depd/1.1.2: 503 | resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} 504 | engines: {node: '>= 0.6'} 505 | dev: false 506 | 507 | /depd/2.0.0: 508 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 509 | engines: {node: '>= 0.8'} 510 | dev: false 511 | 512 | /destroy/1.0.4: 513 | resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} 514 | dev: false 515 | 516 | /dijkstrajs/1.0.2: 517 | resolution: {integrity: sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==} 518 | dev: false 519 | 520 | /dot-prop/5.3.0: 521 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 522 | engines: {node: '>=8'} 523 | dependencies: 524 | is-obj: 2.0.0 525 | dev: false 526 | 527 | /dotenv/10.0.0: 528 | resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} 529 | engines: {node: '>=10'} 530 | dev: false 531 | 532 | /duplexer3/0.1.4: 533 | resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=} 534 | dev: false 535 | 536 | /ee-first/1.1.1: 537 | resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} 538 | dev: false 539 | 540 | /emoji-regex/7.0.3: 541 | resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} 542 | dev: false 543 | 544 | /emoji-regex/8.0.0: 545 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 546 | dev: false 547 | 548 | /encodeurl/1.0.2: 549 | resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} 550 | engines: {node: '>= 0.8'} 551 | dev: false 552 | 553 | /end-of-stream/1.4.4: 554 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 555 | dependencies: 556 | once: 1.4.0 557 | dev: false 558 | 559 | /escape-goat/2.1.1: 560 | resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} 561 | engines: {node: '>=8'} 562 | dev: false 563 | 564 | /escape-html/1.0.3: 565 | resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} 566 | dev: false 567 | 568 | /fill-range/7.0.1: 569 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 570 | engines: {node: '>=8'} 571 | dependencies: 572 | to-regex-range: 5.0.1 573 | dev: false 574 | 575 | /find-up/3.0.0: 576 | resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} 577 | engines: {node: '>=6'} 578 | dependencies: 579 | locate-path: 3.0.0 580 | dev: false 581 | 582 | /follow-redirects/1.14.1: 583 | resolution: {integrity: sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==} 584 | engines: {node: '>=4.0'} 585 | peerDependencies: 586 | debug: '*' 587 | peerDependenciesMeta: 588 | debug: 589 | optional: true 590 | dev: false 591 | 592 | /formidable/1.2.2: 593 | resolution: {integrity: sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==} 594 | dev: false 595 | 596 | /fresh/0.5.2: 597 | resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} 598 | engines: {node: '>= 0.6'} 599 | dev: false 600 | 601 | /function-bind/1.1.1: 602 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 603 | dev: false 604 | 605 | /get-caller-file/2.0.5: 606 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 607 | engines: {node: 6.* || 8.* || >= 10.*} 608 | dev: false 609 | 610 | /get-intrinsic/1.1.1: 611 | resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} 612 | dependencies: 613 | function-bind: 1.1.1 614 | has: 1.0.3 615 | has-symbols: 1.0.2 616 | dev: false 617 | 618 | /get-stream/4.1.0: 619 | resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} 620 | engines: {node: '>=6'} 621 | dependencies: 622 | pump: 3.0.0 623 | dev: false 624 | 625 | /get-stream/5.2.0: 626 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 627 | engines: {node: '>=8'} 628 | dependencies: 629 | pump: 3.0.0 630 | dev: false 631 | 632 | /glob-parent/5.1.2: 633 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 634 | engines: {node: '>= 6'} 635 | dependencies: 636 | is-glob: 4.0.1 637 | dev: false 638 | 639 | /global-dirs/2.1.0: 640 | resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} 641 | engines: {node: '>=8'} 642 | dependencies: 643 | ini: 1.3.7 644 | dev: false 645 | 646 | /got/11.8.2: 647 | resolution: {integrity: sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==} 648 | engines: {node: '>=10.19.0'} 649 | dependencies: 650 | '@sindresorhus/is': 4.0.1 651 | '@szmarczak/http-timer': 4.0.6 652 | '@types/cacheable-request': 6.0.2 653 | '@types/responselike': 1.0.0 654 | cacheable-lookup: 5.0.4 655 | cacheable-request: 7.0.2 656 | decompress-response: 6.0.0 657 | http2-wrapper: 1.0.3 658 | lowercase-keys: 2.0.0 659 | p-cancelable: 2.1.1 660 | responselike: 2.0.0 661 | dev: false 662 | 663 | /got/9.6.0: 664 | resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} 665 | engines: {node: '>=8.6'} 666 | dependencies: 667 | '@sindresorhus/is': 0.14.0 668 | '@szmarczak/http-timer': 1.1.2 669 | cacheable-request: 6.1.0 670 | decompress-response: 3.3.0 671 | duplexer3: 0.1.4 672 | get-stream: 4.1.0 673 | lowercase-keys: 1.0.1 674 | mimic-response: 1.0.1 675 | p-cancelable: 1.1.0 676 | to-readable-stream: 1.0.0 677 | url-parse-lax: 3.0.0 678 | dev: false 679 | 680 | /graceful-fs/4.2.6: 681 | resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} 682 | dev: false 683 | 684 | /has-flag/3.0.0: 685 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 686 | engines: {node: '>=4'} 687 | dev: false 688 | 689 | /has-flag/4.0.0: 690 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 691 | engines: {node: '>=8'} 692 | dev: false 693 | 694 | /has-symbols/1.0.2: 695 | resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} 696 | engines: {node: '>= 0.4'} 697 | dev: false 698 | 699 | /has-yarn/2.1.0: 700 | resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} 701 | engines: {node: '>=8'} 702 | dev: false 703 | 704 | /has/1.0.3: 705 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 706 | engines: {node: '>= 0.4.0'} 707 | dependencies: 708 | function-bind: 1.1.1 709 | dev: false 710 | 711 | /http-assert/1.4.1: 712 | resolution: {integrity: sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==} 713 | engines: {node: '>= 0.8'} 714 | dependencies: 715 | deep-equal: 1.0.1 716 | http-errors: 1.7.3 717 | dev: false 718 | 719 | /http-cache-semantics/4.1.0: 720 | resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} 721 | dev: false 722 | 723 | /http-errors/1.6.3: 724 | resolution: {integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=} 725 | engines: {node: '>= 0.6'} 726 | dependencies: 727 | depd: 1.1.2 728 | inherits: 2.0.3 729 | setprototypeof: 1.1.0 730 | statuses: 1.5.0 731 | dev: false 732 | 733 | /http-errors/1.7.3: 734 | resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} 735 | engines: {node: '>= 0.6'} 736 | dependencies: 737 | depd: 1.1.2 738 | inherits: 2.0.4 739 | setprototypeof: 1.1.1 740 | statuses: 1.5.0 741 | toidentifier: 1.0.0 742 | dev: false 743 | 744 | /http-errors/1.8.0: 745 | resolution: {integrity: sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==} 746 | engines: {node: '>= 0.6'} 747 | dependencies: 748 | depd: 1.1.2 749 | inherits: 2.0.4 750 | setprototypeof: 1.2.0 751 | statuses: 1.5.0 752 | toidentifier: 1.0.0 753 | dev: false 754 | 755 | /http2-wrapper/1.0.3: 756 | resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} 757 | engines: {node: '>=10.19.0'} 758 | dependencies: 759 | quick-lru: 5.1.1 760 | resolve-alpn: 1.2.0 761 | dev: false 762 | 763 | /iconv-lite/0.4.24: 764 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 765 | engines: {node: '>=0.10.0'} 766 | dependencies: 767 | safer-buffer: 2.1.2 768 | dev: false 769 | 770 | /ieee754/1.2.1: 771 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 772 | dev: false 773 | 774 | /ignore-by-default/1.0.1: 775 | resolution: {integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk=} 776 | dev: false 777 | 778 | /import-lazy/2.1.0: 779 | resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=} 780 | engines: {node: '>=4'} 781 | dev: false 782 | 783 | /imurmurhash/0.1.4: 784 | resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} 785 | engines: {node: '>=0.8.19'} 786 | dev: false 787 | 788 | /inflation/2.0.0: 789 | resolution: {integrity: sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=} 790 | engines: {node: '>= 0.8.0'} 791 | dev: false 792 | 793 | /inherits/2.0.3: 794 | resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=} 795 | dev: false 796 | 797 | /inherits/2.0.4: 798 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 799 | dev: false 800 | 801 | /ini/1.3.7: 802 | resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==} 803 | dev: false 804 | 805 | /ini/1.3.8: 806 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 807 | dev: false 808 | 809 | /is-binary-path/2.1.0: 810 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 811 | engines: {node: '>=8'} 812 | dependencies: 813 | binary-extensions: 2.2.0 814 | dev: false 815 | 816 | /is-ci/2.0.0: 817 | resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} 818 | hasBin: true 819 | dependencies: 820 | ci-info: 2.0.0 821 | dev: false 822 | 823 | /is-extglob/2.1.1: 824 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 825 | engines: {node: '>=0.10.0'} 826 | dev: false 827 | 828 | /is-fullwidth-code-point/2.0.0: 829 | resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} 830 | engines: {node: '>=4'} 831 | dev: false 832 | 833 | /is-fullwidth-code-point/3.0.0: 834 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 835 | engines: {node: '>=8'} 836 | dev: false 837 | 838 | /is-generator-function/1.0.9: 839 | resolution: {integrity: sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==} 840 | engines: {node: '>= 0.4'} 841 | dev: false 842 | 843 | /is-glob/4.0.1: 844 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} 845 | engines: {node: '>=0.10.0'} 846 | dependencies: 847 | is-extglob: 2.1.1 848 | dev: false 849 | 850 | /is-installed-globally/0.3.2: 851 | resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==} 852 | engines: {node: '>=8'} 853 | dependencies: 854 | global-dirs: 2.1.0 855 | is-path-inside: 3.0.3 856 | dev: false 857 | 858 | /is-npm/4.0.0: 859 | resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==} 860 | engines: {node: '>=8'} 861 | dev: false 862 | 863 | /is-number/7.0.0: 864 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 865 | engines: {node: '>=0.12.0'} 866 | dev: false 867 | 868 | /is-obj/2.0.0: 869 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 870 | engines: {node: '>=8'} 871 | dev: false 872 | 873 | /is-path-inside/3.0.3: 874 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 875 | engines: {node: '>=8'} 876 | dev: false 877 | 878 | /is-typedarray/1.0.0: 879 | resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} 880 | dev: false 881 | 882 | /is-yarn-global/0.3.0: 883 | resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} 884 | dev: false 885 | 886 | /isarray/1.0.0: 887 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 888 | dev: false 889 | 890 | /isarray/2.0.5: 891 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 892 | dev: false 893 | 894 | /json-buffer/3.0.0: 895 | resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} 896 | dev: false 897 | 898 | /json-buffer/3.0.1: 899 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 900 | dev: false 901 | 902 | /keygrip/1.1.0: 903 | resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} 904 | engines: {node: '>= 0.6'} 905 | dependencies: 906 | tsscmp: 1.0.6 907 | dev: false 908 | 909 | /keyv/3.1.0: 910 | resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} 911 | dependencies: 912 | json-buffer: 3.0.0 913 | dev: false 914 | 915 | /keyv/4.0.3: 916 | resolution: {integrity: sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==} 917 | dependencies: 918 | json-buffer: 3.0.1 919 | dev: false 920 | 921 | /koa-body/4.2.0: 922 | resolution: {integrity: sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==} 923 | dependencies: 924 | '@types/formidable': 1.2.3 925 | co-body: 5.2.0 926 | formidable: 1.2.2 927 | dev: false 928 | 929 | /koa-compose/3.2.1: 930 | resolution: {integrity: sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=} 931 | dependencies: 932 | any-promise: 1.3.0 933 | dev: false 934 | 935 | /koa-compose/4.1.0: 936 | resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} 937 | dev: false 938 | 939 | /koa-convert/1.2.0: 940 | resolution: {integrity: sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=} 941 | engines: {node: '>= 4'} 942 | dependencies: 943 | co: 4.6.0 944 | koa-compose: 3.2.1 945 | dev: false 946 | 947 | /koa-log4/2.3.2: 948 | resolution: {integrity: sha512-1RXEvN+DlMgdEsVWW2MH8vZly9KGWdqryo6jmTWuVZWSmZEH/Hfp3lZ1SCtpD9Lmvkke5i6FzQrFucYUnmwFEQ==} 949 | dependencies: 950 | log4js: 3.0.6 951 | dev: false 952 | 953 | /koa-send/5.0.1: 954 | resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} 955 | engines: {node: '>= 8'} 956 | dependencies: 957 | debug: 4.3.2 958 | http-errors: 1.8.0 959 | resolve-path: 1.4.0 960 | transitivePeerDependencies: 961 | - supports-color 962 | dev: false 963 | 964 | /koa-static/5.0.0: 965 | resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} 966 | engines: {node: '>= 7.6.0'} 967 | dependencies: 968 | debug: 3.2.7 969 | koa-send: 5.0.1 970 | transitivePeerDependencies: 971 | - supports-color 972 | dev: false 973 | 974 | /koa/2.13.1: 975 | resolution: {integrity: sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==} 976 | engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} 977 | dependencies: 978 | accepts: 1.3.7 979 | cache-content-type: 1.0.1 980 | content-disposition: 0.5.3 981 | content-type: 1.0.4 982 | cookies: 0.8.0 983 | debug: 3.1.0 984 | delegates: 1.0.0 985 | depd: 2.0.0 986 | destroy: 1.0.4 987 | encodeurl: 1.0.2 988 | escape-html: 1.0.3 989 | fresh: 0.5.2 990 | http-assert: 1.4.1 991 | http-errors: 1.8.0 992 | is-generator-function: 1.0.9 993 | koa-compose: 4.1.0 994 | koa-convert: 1.2.0 995 | on-finished: 2.3.0 996 | only: 0.0.2 997 | parseurl: 1.3.3 998 | statuses: 1.5.0 999 | type-is: 1.6.18 1000 | vary: 1.1.2 1001 | dev: false 1002 | 1003 | /latest-version/5.1.0: 1004 | resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} 1005 | engines: {node: '>=8'} 1006 | dependencies: 1007 | package-json: 6.5.0 1008 | dev: false 1009 | 1010 | /locate-path/3.0.0: 1011 | resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} 1012 | engines: {node: '>=6'} 1013 | dependencies: 1014 | p-locate: 3.0.0 1015 | path-exists: 3.0.0 1016 | dev: false 1017 | 1018 | /log4js/3.0.6: 1019 | resolution: {integrity: sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==} 1020 | engines: {node: '>=6.0'} 1021 | dependencies: 1022 | circular-json: 0.5.9 1023 | date-format: 1.2.0 1024 | debug: 3.2.7 1025 | rfdc: 1.3.0 1026 | streamroller: 0.7.0 1027 | dev: false 1028 | 1029 | /lowercase-keys/1.0.1: 1030 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} 1031 | engines: {node: '>=0.10.0'} 1032 | dev: false 1033 | 1034 | /lowercase-keys/2.0.0: 1035 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 1036 | engines: {node: '>=8'} 1037 | dev: false 1038 | 1039 | /make-dir/3.1.0: 1040 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 1041 | engines: {node: '>=8'} 1042 | dependencies: 1043 | semver: 6.3.0 1044 | dev: false 1045 | 1046 | /media-typer/0.3.0: 1047 | resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} 1048 | engines: {node: '>= 0.6'} 1049 | dev: false 1050 | 1051 | /methods/1.1.2: 1052 | resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} 1053 | engines: {node: '>= 0.6'} 1054 | dev: false 1055 | 1056 | /mime-db/1.48.0: 1057 | resolution: {integrity: sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==} 1058 | engines: {node: '>= 0.6'} 1059 | dev: false 1060 | 1061 | /mime-types/2.1.31: 1062 | resolution: {integrity: sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==} 1063 | engines: {node: '>= 0.6'} 1064 | dependencies: 1065 | mime-db: 1.48.0 1066 | dev: false 1067 | 1068 | /mimic-response/1.0.1: 1069 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 1070 | engines: {node: '>=4'} 1071 | dev: false 1072 | 1073 | /mimic-response/3.1.0: 1074 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1075 | engines: {node: '>=10'} 1076 | dev: false 1077 | 1078 | /minimatch/3.0.4: 1079 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 1080 | dependencies: 1081 | brace-expansion: 1.1.11 1082 | dev: false 1083 | 1084 | /minimist/1.2.5: 1085 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1086 | dev: false 1087 | 1088 | /mkdirp/0.5.5: 1089 | resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} 1090 | hasBin: true 1091 | dependencies: 1092 | minimist: 1.2.5 1093 | dev: false 1094 | 1095 | /ms/2.0.0: 1096 | resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} 1097 | dev: false 1098 | 1099 | /ms/2.1.2: 1100 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1101 | dev: false 1102 | 1103 | /ms/2.1.3: 1104 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1105 | dev: false 1106 | 1107 | /negotiator/0.6.2: 1108 | resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==} 1109 | engines: {node: '>= 0.6'} 1110 | dev: false 1111 | 1112 | /nodemon/2.0.12: 1113 | resolution: {integrity: sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==} 1114 | engines: {node: '>=8.10.0'} 1115 | hasBin: true 1116 | requiresBuild: true 1117 | dependencies: 1118 | chokidar: 3.5.2 1119 | debug: 3.2.7 1120 | ignore-by-default: 1.0.1 1121 | minimatch: 3.0.4 1122 | pstree.remy: 1.1.8 1123 | semver: 5.7.1 1124 | supports-color: 5.5.0 1125 | touch: 3.1.0 1126 | undefsafe: 2.0.3 1127 | update-notifier: 4.1.3 1128 | dev: false 1129 | 1130 | /nopt/1.0.10: 1131 | resolution: {integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=} 1132 | hasBin: true 1133 | dependencies: 1134 | abbrev: 1.1.1 1135 | dev: false 1136 | 1137 | /normalize-path/3.0.0: 1138 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1139 | engines: {node: '>=0.10.0'} 1140 | dev: false 1141 | 1142 | /normalize-url/4.5.1: 1143 | resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} 1144 | engines: {node: '>=8'} 1145 | dev: false 1146 | 1147 | /normalize-url/6.1.0: 1148 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} 1149 | engines: {node: '>=10'} 1150 | dev: false 1151 | 1152 | /object-inspect/1.11.0: 1153 | resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} 1154 | dev: false 1155 | 1156 | /on-finished/2.3.0: 1157 | resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=} 1158 | engines: {node: '>= 0.8'} 1159 | dependencies: 1160 | ee-first: 1.1.1 1161 | dev: false 1162 | 1163 | /once/1.4.0: 1164 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1165 | dependencies: 1166 | wrappy: 1.0.2 1167 | dev: false 1168 | 1169 | /only/0.0.2: 1170 | resolution: {integrity: sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=} 1171 | dev: false 1172 | 1173 | /p-cancelable/1.1.0: 1174 | resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} 1175 | engines: {node: '>=6'} 1176 | dev: false 1177 | 1178 | /p-cancelable/2.1.1: 1179 | resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} 1180 | engines: {node: '>=8'} 1181 | dev: false 1182 | 1183 | /p-limit/2.3.0: 1184 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1185 | engines: {node: '>=6'} 1186 | dependencies: 1187 | p-try: 2.2.0 1188 | dev: false 1189 | 1190 | /p-locate/3.0.0: 1191 | resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} 1192 | engines: {node: '>=6'} 1193 | dependencies: 1194 | p-limit: 2.3.0 1195 | dev: false 1196 | 1197 | /p-try/2.2.0: 1198 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1199 | engines: {node: '>=6'} 1200 | dev: false 1201 | 1202 | /package-json/6.5.0: 1203 | resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} 1204 | engines: {node: '>=8'} 1205 | dependencies: 1206 | got: 9.6.0 1207 | registry-auth-token: 4.2.1 1208 | registry-url: 5.1.0 1209 | semver: 6.3.0 1210 | dev: false 1211 | 1212 | /parseurl/1.3.3: 1213 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1214 | engines: {node: '>= 0.8'} 1215 | dev: false 1216 | 1217 | /path-exists/3.0.0: 1218 | resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} 1219 | engines: {node: '>=4'} 1220 | dev: false 1221 | 1222 | /path-is-absolute/1.0.1: 1223 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 1224 | engines: {node: '>=0.10.0'} 1225 | dev: false 1226 | 1227 | /path-to-regexp/6.2.0: 1228 | resolution: {integrity: sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==} 1229 | dev: false 1230 | 1231 | /picomatch/2.3.0: 1232 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 1233 | engines: {node: '>=8.6'} 1234 | dev: false 1235 | 1236 | /pngjs/3.4.0: 1237 | resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} 1238 | engines: {node: '>=4.0.0'} 1239 | dev: false 1240 | 1241 | /prepend-http/2.0.0: 1242 | resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=} 1243 | engines: {node: '>=4'} 1244 | dev: false 1245 | 1246 | /process-nextick-args/2.0.1: 1247 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1248 | dev: false 1249 | 1250 | /pstree.remy/1.1.8: 1251 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 1252 | dev: false 1253 | 1254 | /pump/3.0.0: 1255 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1256 | dependencies: 1257 | end-of-stream: 1.4.4 1258 | once: 1.4.0 1259 | dev: false 1260 | 1261 | /pupa/2.1.1: 1262 | resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} 1263 | engines: {node: '>=8'} 1264 | dependencies: 1265 | escape-goat: 2.1.1 1266 | dev: false 1267 | 1268 | /qrcode/1.4.4: 1269 | resolution: {integrity: sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==} 1270 | engines: {node: '>=4'} 1271 | hasBin: true 1272 | dependencies: 1273 | buffer: 5.7.1 1274 | buffer-alloc: 1.2.0 1275 | buffer-from: 1.1.1 1276 | dijkstrajs: 1.0.2 1277 | isarray: 2.0.5 1278 | pngjs: 3.4.0 1279 | yargs: 13.3.2 1280 | dev: false 1281 | 1282 | /qs/6.10.1: 1283 | resolution: {integrity: sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==} 1284 | engines: {node: '>=0.6'} 1285 | dependencies: 1286 | side-channel: 1.0.4 1287 | dev: false 1288 | 1289 | /quick-lru/5.1.1: 1290 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1291 | engines: {node: '>=10'} 1292 | dev: false 1293 | 1294 | /raw-body/2.4.1: 1295 | resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} 1296 | engines: {node: '>= 0.8'} 1297 | dependencies: 1298 | bytes: 3.1.0 1299 | http-errors: 1.7.3 1300 | iconv-lite: 0.4.24 1301 | unpipe: 1.0.0 1302 | dev: false 1303 | 1304 | /rc/1.2.8: 1305 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1306 | hasBin: true 1307 | dependencies: 1308 | deep-extend: 0.6.0 1309 | ini: 1.3.8 1310 | minimist: 1.2.5 1311 | strip-json-comments: 2.0.1 1312 | dev: false 1313 | 1314 | /readable-stream/2.3.7: 1315 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1316 | dependencies: 1317 | core-util-is: 1.0.2 1318 | inherits: 2.0.4 1319 | isarray: 1.0.0 1320 | process-nextick-args: 2.0.1 1321 | safe-buffer: 5.1.2 1322 | string_decoder: 1.1.1 1323 | util-deprecate: 1.0.2 1324 | dev: false 1325 | 1326 | /readdirp/3.6.0: 1327 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1328 | engines: {node: '>=8.10.0'} 1329 | dependencies: 1330 | picomatch: 2.3.0 1331 | dev: false 1332 | 1333 | /registry-auth-token/4.2.1: 1334 | resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} 1335 | engines: {node: '>=6.0.0'} 1336 | dependencies: 1337 | rc: 1.2.8 1338 | dev: false 1339 | 1340 | /registry-url/5.1.0: 1341 | resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} 1342 | engines: {node: '>=8'} 1343 | dependencies: 1344 | rc: 1.2.8 1345 | dev: false 1346 | 1347 | /require-directory/2.1.1: 1348 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} 1349 | engines: {node: '>=0.10.0'} 1350 | dev: false 1351 | 1352 | /require-main-filename/2.0.0: 1353 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 1354 | dev: false 1355 | 1356 | /resolve-alpn/1.2.0: 1357 | resolution: {integrity: sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA==} 1358 | dev: false 1359 | 1360 | /resolve-path/1.4.0: 1361 | resolution: {integrity: sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=} 1362 | engines: {node: '>= 0.8'} 1363 | dependencies: 1364 | http-errors: 1.6.3 1365 | path-is-absolute: 1.0.1 1366 | dev: false 1367 | 1368 | /responselike/1.0.2: 1369 | resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} 1370 | dependencies: 1371 | lowercase-keys: 1.0.1 1372 | dev: false 1373 | 1374 | /responselike/2.0.0: 1375 | resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==} 1376 | dependencies: 1377 | lowercase-keys: 2.0.0 1378 | dev: false 1379 | 1380 | /rfdc/1.3.0: 1381 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 1382 | dev: false 1383 | 1384 | /safe-buffer/5.1.2: 1385 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1386 | dev: false 1387 | 1388 | /safer-buffer/2.1.2: 1389 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1390 | dev: false 1391 | 1392 | /semver-diff/3.1.1: 1393 | resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} 1394 | engines: {node: '>=8'} 1395 | dependencies: 1396 | semver: 6.3.0 1397 | dev: false 1398 | 1399 | /semver/5.7.1: 1400 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1401 | hasBin: true 1402 | dev: false 1403 | 1404 | /semver/6.3.0: 1405 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1406 | hasBin: true 1407 | dev: false 1408 | 1409 | /set-blocking/2.0.0: 1410 | resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} 1411 | dev: false 1412 | 1413 | /setprototypeof/1.1.0: 1414 | resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} 1415 | dev: false 1416 | 1417 | /setprototypeof/1.1.1: 1418 | resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} 1419 | dev: false 1420 | 1421 | /setprototypeof/1.2.0: 1422 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1423 | dev: false 1424 | 1425 | /side-channel/1.0.4: 1426 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1427 | dependencies: 1428 | call-bind: 1.0.2 1429 | get-intrinsic: 1.1.1 1430 | object-inspect: 1.11.0 1431 | dev: false 1432 | 1433 | /signal-exit/3.0.3: 1434 | resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} 1435 | dev: false 1436 | 1437 | /statuses/1.5.0: 1438 | resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} 1439 | engines: {node: '>= 0.6'} 1440 | dev: false 1441 | 1442 | /streamroller/0.7.0: 1443 | resolution: {integrity: sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==} 1444 | engines: {node: '>=0.12.0'} 1445 | dependencies: 1446 | date-format: 1.2.0 1447 | debug: 3.2.7 1448 | mkdirp: 0.5.5 1449 | readable-stream: 2.3.7 1450 | dev: false 1451 | 1452 | /string-width/3.1.0: 1453 | resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} 1454 | engines: {node: '>=6'} 1455 | dependencies: 1456 | emoji-regex: 7.0.3 1457 | is-fullwidth-code-point: 2.0.0 1458 | strip-ansi: 5.2.0 1459 | dev: false 1460 | 1461 | /string-width/4.2.2: 1462 | resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==} 1463 | engines: {node: '>=8'} 1464 | dependencies: 1465 | emoji-regex: 8.0.0 1466 | is-fullwidth-code-point: 3.0.0 1467 | strip-ansi: 6.0.0 1468 | dev: false 1469 | 1470 | /string_decoder/1.1.1: 1471 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1472 | dependencies: 1473 | safe-buffer: 5.1.2 1474 | dev: false 1475 | 1476 | /strip-ansi/5.2.0: 1477 | resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} 1478 | engines: {node: '>=6'} 1479 | dependencies: 1480 | ansi-regex: 4.1.0 1481 | dev: false 1482 | 1483 | /strip-ansi/6.0.0: 1484 | resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} 1485 | engines: {node: '>=8'} 1486 | dependencies: 1487 | ansi-regex: 5.0.0 1488 | dev: false 1489 | 1490 | /strip-json-comments/2.0.1: 1491 | resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} 1492 | engines: {node: '>=0.10.0'} 1493 | dev: false 1494 | 1495 | /supports-color/5.5.0: 1496 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1497 | engines: {node: '>=4'} 1498 | dependencies: 1499 | has-flag: 3.0.0 1500 | dev: false 1501 | 1502 | /supports-color/7.2.0: 1503 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1504 | engines: {node: '>=8'} 1505 | dependencies: 1506 | has-flag: 4.0.0 1507 | dev: false 1508 | 1509 | /term-size/2.2.1: 1510 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 1511 | engines: {node: '>=8'} 1512 | dev: false 1513 | 1514 | /to-readable-stream/1.0.0: 1515 | resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} 1516 | engines: {node: '>=6'} 1517 | dev: false 1518 | 1519 | /to-regex-range/5.0.1: 1520 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1521 | engines: {node: '>=8.0'} 1522 | dependencies: 1523 | is-number: 7.0.0 1524 | dev: false 1525 | 1526 | /toidentifier/1.0.0: 1527 | resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} 1528 | engines: {node: '>=0.6'} 1529 | dev: false 1530 | 1531 | /touch/3.1.0: 1532 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1533 | hasBin: true 1534 | dependencies: 1535 | nopt: 1.0.10 1536 | dev: false 1537 | 1538 | /tsscmp/1.0.6: 1539 | resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} 1540 | engines: {node: '>=0.6.x'} 1541 | dev: false 1542 | 1543 | /type-fest/0.8.1: 1544 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 1545 | engines: {node: '>=8'} 1546 | dev: false 1547 | 1548 | /type-is/1.6.18: 1549 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1550 | engines: {node: '>= 0.6'} 1551 | dependencies: 1552 | media-typer: 0.3.0 1553 | mime-types: 2.1.31 1554 | dev: false 1555 | 1556 | /typedarray-to-buffer/3.1.5: 1557 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1558 | dependencies: 1559 | is-typedarray: 1.0.0 1560 | dev: false 1561 | 1562 | /undefsafe/2.0.3: 1563 | resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} 1564 | dependencies: 1565 | debug: 2.6.9 1566 | dev: false 1567 | 1568 | /unique-string/2.0.0: 1569 | resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} 1570 | engines: {node: '>=8'} 1571 | dependencies: 1572 | crypto-random-string: 2.0.0 1573 | dev: false 1574 | 1575 | /unpipe/1.0.0: 1576 | resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} 1577 | engines: {node: '>= 0.8'} 1578 | dev: false 1579 | 1580 | /update-notifier/4.1.3: 1581 | resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==} 1582 | engines: {node: '>=8'} 1583 | dependencies: 1584 | boxen: 4.2.0 1585 | chalk: 3.0.0 1586 | configstore: 5.0.1 1587 | has-yarn: 2.1.0 1588 | import-lazy: 2.1.0 1589 | is-ci: 2.0.0 1590 | is-installed-globally: 0.3.2 1591 | is-npm: 4.0.0 1592 | is-yarn-global: 0.3.0 1593 | latest-version: 5.1.0 1594 | pupa: 2.1.1 1595 | semver-diff: 3.1.1 1596 | xdg-basedir: 4.0.0 1597 | dev: false 1598 | 1599 | /url-parse-lax/3.0.0: 1600 | resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=} 1601 | engines: {node: '>=4'} 1602 | dependencies: 1603 | prepend-http: 2.0.0 1604 | dev: false 1605 | 1606 | /util-deprecate/1.0.2: 1607 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 1608 | dev: false 1609 | 1610 | /vary/1.1.2: 1611 | resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} 1612 | engines: {node: '>= 0.8'} 1613 | dev: false 1614 | 1615 | /which-module/2.0.0: 1616 | resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} 1617 | dev: false 1618 | 1619 | /widest-line/3.1.0: 1620 | resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} 1621 | engines: {node: '>=8'} 1622 | dependencies: 1623 | string-width: 4.2.2 1624 | dev: false 1625 | 1626 | /wrap-ansi/5.1.0: 1627 | resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} 1628 | engines: {node: '>=6'} 1629 | dependencies: 1630 | ansi-styles: 3.2.1 1631 | string-width: 3.1.0 1632 | strip-ansi: 5.2.0 1633 | dev: false 1634 | 1635 | /wrappy/1.0.2: 1636 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1637 | dev: false 1638 | 1639 | /write-file-atomic/3.0.3: 1640 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1641 | dependencies: 1642 | imurmurhash: 0.1.4 1643 | is-typedarray: 1.0.0 1644 | signal-exit: 3.0.3 1645 | typedarray-to-buffer: 3.1.5 1646 | dev: false 1647 | 1648 | /xdg-basedir/4.0.0: 1649 | resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} 1650 | engines: {node: '>=8'} 1651 | dev: false 1652 | 1653 | /y18n/4.0.3: 1654 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 1655 | dev: false 1656 | 1657 | /yargs-parser/13.1.2: 1658 | resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} 1659 | dependencies: 1660 | camelcase: 5.3.1 1661 | decamelize: 1.2.0 1662 | dev: false 1663 | 1664 | /yargs/13.3.2: 1665 | resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} 1666 | dependencies: 1667 | cliui: 5.0.0 1668 | find-up: 3.0.0 1669 | get-caller-file: 2.0.5 1670 | require-directory: 2.1.1 1671 | require-main-filename: 2.0.0 1672 | set-blocking: 2.0.0 1673 | string-width: 3.1.0 1674 | which-module: 2.0.0 1675 | y18n: 4.0.3 1676 | yargs-parser: 13.1.2 1677 | dev: false 1678 | 1679 | /ylru/1.2.1: 1680 | resolution: {integrity: sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==} 1681 | engines: {node: '>= 4.0.0'} 1682 | dev: false 1683 | 1684 | registry.npmmirror.com/fsevents/2.3.2: 1685 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz} 1686 | name: fsevents 1687 | version: 2.3.2 1688 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1689 | os: [darwin] 1690 | requiresBuild: true 1691 | dev: false 1692 | optional: true 1693 | -------------------------------------------------------------------------------- /backend/src/service/Content.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable camelcase */ 2 | 'use strict'; 3 | const JsonResult = require('../util/jsonResult'); 4 | const DbUtil = require('../util/DbUtil'); 5 | 6 | 7 | const DEF_CONTENT = { 8 | tip: { 9 | content: "

撸豆有可能造成的任何损失本人概不负责!!!!!!!!!

\n" + "

为了您的财产安全请关闭免密支付以及打开支付验密(京东-设置-支付设置-支付验密设置)。

\n" + "

建议京东账户绑定微信以保证提现能到账。

\n" + "

安全起见,切勿泄露您的cookie!

\n" + "

如果本项目对你有帮助,请到github中star

\n", 10 | name: "登录以及注册上方提示" 11 | }, login: { 12 | content: '', name: "登录上方提示" 13 | }, profile: { 14 | content: '', name: "个人中心上方提示" 15 | }, register: { 16 | content: "

安卓手机傻瓜式获取CK(强烈推荐,非常方便)点此访问下载连接

\n" + "

电脑用户浏览器登录JD官网,点击我的出现登录页面后点击F12,通过开发者工具获取cookie。

\n" + "

手机用户可以使用Alook浏览器登录JD官网,并在菜单-工具箱-开发者工具-Cookies中获取(Android和iPhone通用)。

\n" + "

另外也可以使用抓包工具(iPhone:Stream,Android:HttpCanary)抓取京东app的ck

\n" + "

注册成功后使用用户名即可登录

\n" + " 可以直接填写整个cookie。
\n" + " 注意格式(pt_key=xxxxxxxxxxxxxxx;pt_pin=xxxxxxxxxxxxxx;)注意分号不能少!
\n" + " 请在下方输入您的 cookie 注册。
\n", 17 | name: "注册上方提示" 18 | }, cookie: { 19 | content: '', name: "自定义修改Cookie上方提示" 20 | }, username: { 21 | content: '', name: "修改用户名上方提示" 22 | } 23 | } 24 | 25 | 26 | module.exports = class Content { 27 | 28 | static getDb() { 29 | let dbUtil = DbUtil.getInstance("content") 30 | if (dbUtil.init || dbUtil.length === 0) { 31 | for (let key in DEF_CONTENT) { 32 | dbUtil.insert({location: key, ...DEF_CONTENT[key]}) 33 | } 34 | } 35 | return dbUtil; 36 | } 37 | 38 | static getAllContent() { 39 | let dbUtil = this.getDb() 40 | let data = {} 41 | dbUtil.selectAll().forEach(item => { 42 | data[item.location] = item 43 | }) 44 | return JsonResult.success(data) 45 | } 46 | 47 | static addContent(content) { 48 | let dbUtil = this.getDb() 49 | return JsonResult.success(dbUtil.insert(content)) 50 | } 51 | 52 | static updateContent(content) { 53 | let dbUtil = this.getDb() 54 | return JsonResult.success(dbUtil.update(content)) 55 | } 56 | 57 | static deleteContent(id) { 58 | let dbUtil = this.getDb() 59 | return JsonResult.success(dbUtil.delete(id)) 60 | } 61 | }; 62 | -------------------------------------------------------------------------------- /backend/src/service/ql.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const got = require('got'); 3 | require('dotenv').config(); 4 | 5 | const api = got.extend({ 6 | prefixUrl: process.env.QL_URL || 'http://localhost:5700/', 7 | retry: {limit: 0}, 8 | }); 9 | 10 | const NinjaConfig = require('../util/ninjaConfig'); 11 | 12 | 13 | async function getToken() { 14 | let config = NinjaConfig.getConfig() 15 | const body = await api({ 16 | url: 'open/auth/token', searchParams: { 17 | client_id: config.clientId, client_secret: config.clientSecret, 18 | } 19 | }).json(); 20 | if (body.code !== 200) { 21 | throw new QLError("青龙令牌配置错误,请前往管理页面配置!", 500) 22 | } 23 | return body.data.token; 24 | } 25 | 26 | module.exports.getToken = async () => { 27 | let config = NinjaConfig.getConfig() 28 | const body = await api({ 29 | url: 'open/auth/token', searchParams: { 30 | client_id: config.clientId, client_secret: config.clientSecret, 31 | } 32 | }).json(); 33 | if (body.code !== 200) { 34 | throw new QLError("青龙令牌配置错误,请前往管理页面配置!", 500) 35 | } 36 | return body.data.token; 37 | } 38 | 39 | module.exports.getEnvs = async () => { 40 | const token = await getToken(); 41 | const body = await api({ 42 | url: 'open/envs', searchParams: { 43 | searchValue: 'JD_COOKIE', t: Date.now(), 44 | }, headers: { 45 | Accept: 'application/json', authorization: `Bearer ${token}`, 46 | }, 47 | }).json(); 48 | if (body.code !== 200) { 49 | throw new QLError(body.message, body.code) 50 | } 51 | return body.data; 52 | }; 53 | 54 | module.exports.addEnv = async (cookie, remarks) => { 55 | const token = await getToken(); 56 | let body = await api({ 57 | method: 'post', url: 'open/envs', params: {t: Date.now()}, json: [{ 58 | name: 'JD_COOKIE', value: cookie, remarks, 59 | }], headers: { 60 | Accept: 'application/json', 61 | authorization: `Bearer ${token}`, 62 | 'Content-Type': 'application/json;charset=UTF-8', 63 | }, 64 | }).json() 65 | if (body.code !== 200) { 66 | throw new QLError(body.message, body.code) 67 | } 68 | return body 69 | }; 70 | 71 | module.exports.updateEnv = async (cookie, eid, remarks) => { 72 | const token = await getToken(); 73 | const body = await api({ 74 | method: 'put', url: 'open/envs', params: {t: Date.now()}, json: { 75 | name: 'JD_COOKIE', value: cookie, id: eid, remarks, 76 | }, headers: { 77 | Accept: 'application/json', 78 | authorization: `Bearer ${token}`, 79 | 'Content-Type': 'application/json;charset=UTF-8', 80 | }, 81 | }).json(); 82 | if (body.code !== 200) { 83 | throw new QLError(body.message, body.code) 84 | } 85 | return body; 86 | }; 87 | 88 | module.exports.delEnv = async (eid) => { 89 | const token = await getToken(); 90 | const body = await api({ 91 | method: 'delete', url: 'open/envs', params: {t: Date.now()}, body: JSON.stringify([eid]), headers: { 92 | Accept: 'application/json', 93 | authorization: `Bearer ${token}`, 94 | 'Content-Type': 'application/json;charset=UTF-8', 95 | }, 96 | }).json(); 97 | if (body.code !== 200) { 98 | throw new QLError(body.message, body.code) 99 | } 100 | return body; 101 | }; 102 | 103 | module.exports.disable = async (eid) => { 104 | const token = await getToken(); 105 | const body = await api({ 106 | method: 'put', url: 'open/envs/disable', params: {t: Date.now()}, body: JSON.stringify([eid]), headers: { 107 | Accept: 'application/json', 108 | authorization: `Bearer ${token}`, 109 | 'Content-Type': 'application/json;charset=UTF-8', 110 | }, 111 | }).json(); 112 | if (body.code !== 200) { 113 | throw new QLError(body.message, body.code) 114 | } 115 | return body; 116 | }; 117 | 118 | module.exports.enable = async (eid) => { 119 | const token = await getToken(); 120 | const body = await api({ 121 | method: 'put', url: 'open/envs/enable', params: {t: Date.now()}, body: JSON.stringify([eid]), headers: { 122 | Accept: 'application/json', 123 | authorization: `Bearer ${token}`, 124 | 'Content-Type': 'application/json;charset=UTF-8', 125 | }, 126 | }).json(); 127 | if (body.code !== 200) { 128 | throw new QLError(body.message, body.code) 129 | } 130 | return body; 131 | }; 132 | 133 | class QLError extends Error { 134 | constructor(message, status, statusCode) { 135 | super(message); 136 | this.name = 'QLError'; 137 | this.status = status; 138 | this.statusCode = statusCode || 500; 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /backend/src/service/user.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable camelcase */ 2 | 'use strict'; 3 | require('dotenv').config(); 4 | 5 | const { 6 | addEnv, delEnv, getEnvs, updateEnv, disable, enable 7 | } = require('./ql'); 8 | const { 9 | encrypt, decrypt 10 | } = require('../util/encryptUtil') 11 | const {v4: uuidv4} = require('uuid'); 12 | const NinjaConfig = require('../util/ninjaConfig'); 13 | const JsonResult = require('../util/jsonResult'); 14 | const cache = require("../util/cache"); 15 | 16 | module.exports = class User { 17 | ptKey; 18 | ptPin; 19 | eid; 20 | username; 21 | password; 22 | token; 23 | ck; 24 | encryptUsername 25 | 26 | /** 27 | * 构造方法 28 | * @param ptKey ck ptKey 29 | * @param ptPin ck ptPin 30 | * @param eid 青龙容器中的id 容器中为id 31 | * @param username 用户名 容器中改为remarks 32 | * @param ck cookie 33 | * @param password 密码 仅用于管理员登录 34 | * @param token token 仅用于管理员操作验证 35 | * @param encryptUsername 加密的用户名 自动登录时验证 36 | */ 37 | constructor({ 38 | ptKey, ptPin, eid, username, ck, password, token, encryptUsername 39 | }) { 40 | this.ptKey = ptKey 41 | this.ptPin = ptPin 42 | this.password = password 43 | if (ptKey && ptPin) { 44 | this.cookie = 'pt_key=' + this.ptKey + ';pt_pin=' + this.ptPin + ';'; 45 | } 46 | this.eid = Number(eid) 47 | this.username = username 48 | this.token = token 49 | this.ck = ck 50 | this.encryptUsername = encryptUsername 51 | } 52 | 53 | /** 54 | * 登录 55 | */ 56 | async login() { 57 | let config = NinjaConfig.getConfig() 58 | if (this.username === config.adminUsername) { 59 | if (config.allowAdmin) { 60 | //管理员登录 61 | if (this.password) { 62 | if (this.password === config.adminPassword) { 63 | let uuid = uuidv4(); 64 | cache.setExpire(uuid, this.username, 1000 * 60 * 60 * 12) 65 | return JsonResult.success({username: config.adminUsername, eid: 0, token: uuid}); 66 | } else { 67 | return JsonResult.error('用户名或密码不匹配', {username: config.adminUsername}) 68 | } 69 | } else { 70 | return JsonResult.success({isAdmin: true}) 71 | } 72 | } else { 73 | return JsonResult.error('该账号未启用,禁止登录', {username: config.adminUsername}) 74 | } 75 | } 76 | 77 | const envs = await getEnvs(); 78 | const env = await envs.find(item => item.remarks === this.username); 79 | if (env) { 80 | let encryptUsername = encrypt(this.username) 81 | return JsonResult.success({username: env.remarks, eid: env.id, timestamp: env.timestamp, encryptUsername}); 82 | } else { 83 | return JsonResult.error('未注册的用户', {username: config.adminUsername}) 84 | } 85 | } 86 | 87 | /** 88 | * 验证token是否匹配 用于管理页面的token验证 89 | */ 90 | async verifyToken() { 91 | if (cache.hasKey(this.token)) { 92 | return JsonResult.success() 93 | } else { 94 | return JsonResult.error() 95 | } 96 | } 97 | 98 | /** 99 | * 注册 100 | */ 101 | async register() { 102 | let config = NinjaConfig.getConfig() 103 | if (this.username === config.adminUsername) { 104 | return JsonResult.error('用户已存在') 105 | } 106 | 107 | const envs = await getEnvs(); 108 | const poolInfo = await User.getPoolInfo(); 109 | const env = await envs.find(item => item.remarks === this.username); 110 | if (!env) { 111 | // 新用户 112 | if (!config.allowAdd) { 113 | return JsonResult.error('注册功能已关闭,禁止注册') 114 | } else if (poolInfo.marginCount === 0) { 115 | return JsonResult.error('容量已达上限!') 116 | } else { 117 | const remarks = this.username 118 | const body = await addEnv(this.cookie, remarks); 119 | this.eid = body.data[0].id; 120 | this.timestamp = body.data[0].timestamp; 121 | return JsonResult.success(`注册成功,欢迎你${this.username}`, { 122 | username: this.username, eid: this.eid, timestamp: this.timestamp 123 | }) 124 | } 125 | } else { 126 | return JsonResult.error('用户已存在') 127 | } 128 | } 129 | 130 | /** 131 | * 根据青龙容器中的ID获取用户信息 132 | */ 133 | async getUserInfoByEid() { 134 | 135 | const envs = await getEnvs(); 136 | const env = await envs.find((item) => item.id * 1 === this.eid * 1); 137 | if (!env) { 138 | return JsonResult.error('登录信息验证失败,请重新登录') 139 | } 140 | this.cookie = env.value; 141 | this.timestamp = env.timestamp; 142 | this.username = env.remarks 143 | let decryptUsername = decrypt(this.encryptUsername) 144 | if (decryptUsername !== this.username) { 145 | return JsonResult.error('登录信息验证失败,请重新登录') 146 | } 147 | this.cookie = env.value; 148 | this.timestamp = env.timestamp; 149 | this.username = env.remarks 150 | return JsonResult.success({ 151 | username: this.username, eid: this.eid, timestamp: this.timestamp, status: env.status 152 | }) 153 | } 154 | 155 | /** 156 | * 更新青龙容器中的环境变量 ,通过id来进行更新 157 | */ 158 | async update() { 159 | if (!this.eid) { 160 | return JsonResult.error('登录信息验证失败,请重新登录') 161 | } 162 | const envs = await getEnvs(); 163 | const env = await envs.find((item) => item.id === this.eid); 164 | if (!env) { 165 | return JsonResult.error('登录信息验证失败,请重新登录') 166 | } 167 | let cookie; 168 | if (this.ck) { 169 | cookie = this.ck 170 | } else { 171 | cookie = env.value 172 | } 173 | let remarks; 174 | if (this.username) { 175 | remarks = this.username; 176 | let user = envs.find(item => item.remarks === this.username) 177 | if (user) { 178 | return JsonResult.error('用户名已被占用') 179 | } 180 | } else { 181 | remarks = env.remarks 182 | } 183 | await updateEnv(cookie, this.eid, remarks); 184 | return JsonResult.success('修改成功') 185 | } 186 | 187 | /** 188 | * 根据青龙容器id删除环境变量 189 | */ 190 | async delUserByEid() { 191 | await this.getUserInfoByEid(); 192 | await delEnv(this.eid); 193 | return JsonResult.success('账号删除成功') 194 | } 195 | 196 | /** 197 | * 根据青龙容器id禁用环境变量 198 | */ 199 | async disableEnv() { 200 | await this.getUserInfoByEid(); 201 | await disable(this.eid); 202 | return JsonResult.success("禁用成功") 203 | } 204 | 205 | /** 206 | * 根据青龙容器id启用环境变量 207 | */ 208 | async enableEnv() { 209 | await this.getUserInfoByEid(); 210 | await enable(this.eid); 211 | return JsonResult.success("启用成功") 212 | } 213 | 214 | /** 215 | * 获取当前系统容量以及可公开的配置信息 216 | */ 217 | static async getPoolInfo() { 218 | const envs = await getEnvs(); 219 | let userNames = new Set() 220 | envs.map(item => { 221 | userNames.add(item.remarks); 222 | }) 223 | let config = NinjaConfig.getConfig() 224 | 225 | return JsonResult.success({ 226 | marginCount: config.allowNum - userNames.size, 227 | allowAdd: config.allowAdd, 228 | allowSetStatus: config.allowSetStatus 229 | }) 230 | } 231 | 232 | /** 233 | * 获取所有的配置信息 需要验证token 234 | */ 235 | async getAllConfig() { 236 | if (cache.hasKey(this.token)) { 237 | return JsonResult.success(NinjaConfig.getConfig()) 238 | } else { 239 | return JsonResult.error('登录过期,请重新登录!') 240 | } 241 | } 242 | 243 | /** 244 | * 保存配置信息 需要验证token 245 | */ 246 | async saveConfig(config) { 247 | if (cache.hasKey(this.token)) { 248 | NinjaConfig.saveConfig(config) 249 | return JsonResult.success('修改成功') 250 | } else { 251 | return JsonResult.error('登录过期,请重新登录!') 252 | } 253 | } 254 | }; 255 | -------------------------------------------------------------------------------- /backend/src/util/DbUtil.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable camelcase */ 2 | 'use strict'; 3 | const {v4: uuidv4} = require('uuid'); 4 | let fs = require("fs") 5 | const filePrefixPath = './src/db/' 6 | const fileSuffixPath = '.json' 7 | 8 | const dbMap = new Map() 9 | 10 | module.exports = class DbUtil { 11 | dbName; 12 | dbPath; 13 | db; 14 | init; 15 | 16 | constructor(dbName) { 17 | this.dbName = dbName 18 | this.dbPath = filePrefixPath + dbName + fileSuffixPath 19 | this.init = false 20 | this.initDbData() 21 | } 22 | 23 | /** 24 | * 获取实例 25 | */ 26 | static getInstance(dbName) { 27 | let dbUtil = dbMap.get(dbName) 28 | if (!dbUtil) { 29 | dbUtil = new DbUtil(dbName) 30 | dbMap.set(dbName, dbUtil); 31 | }else { 32 | dbUtil.init = false 33 | } 34 | return dbUtil; 35 | } 36 | 37 | 38 | /** 39 | * 初始化dbUtil 40 | */ 41 | initDbData() { 42 | if (!fs.existsSync(this.dbPath)) { 43 | fs.writeFileSync(this.dbPath, '') 44 | } 45 | if (!fs.existsSync(filePrefixPath)) { 46 | fs.mkdirSync(filePrefixPath) 47 | } 48 | if (!fs.existsSync(this.dbPath)) { 49 | fs.writeFileSync(this.dbPath, '') 50 | } 51 | let buffer = fs.readFileSync(this.dbPath) 52 | let dataStr = buffer.toString() 53 | let db = {}; 54 | if (dataStr) { 55 | db = JSON.parse(dataStr) 56 | let data = new Map() 57 | for (let dataKey in db.data) { 58 | data.set(dataKey, db.data[dataKey]) 59 | } 60 | db.data = data 61 | } else { 62 | db.data = new Map() 63 | db.name = this.dbName 64 | db.length = 0 65 | db.index = 0; 66 | db.updateDate = new Date(); 67 | this.init = true 68 | let dbStr = JSON.stringify(db) 69 | fs.writeFileSync(this.dbPath, dbStr); 70 | } 71 | this.db = db; 72 | } 73 | 74 | saveToFile() { 75 | this.db.updateDate = new Date() 76 | this.db.length = this.db.data.size 77 | let dataMap = this.db.data; 78 | let data = {} 79 | dataMap.forEach((value, key) => { 80 | data[key] = value; 81 | }) 82 | this.db.data = data 83 | fs.writeFileSync(this.dbPath, JSON.stringify(this.db)) 84 | this.db.data = dataMap 85 | } 86 | 87 | 88 | insert(data) { 89 | this.db.index++ 90 | data._id = uuidv4(); 91 | data._index = this.db.index 92 | if (this.db.data.size > 0 || Object.keys(this.db.data).length !== 0) { 93 | this.db.data.set(data._id, data); 94 | } else { 95 | this.db.data = new Map() 96 | this.db.data.set(data._id, data); 97 | } 98 | this.saveToFile() 99 | return data._id 100 | } 101 | 102 | get(id) { 103 | return this.db.data.get(id) 104 | } 105 | 106 | update(data) { 107 | let oldValue = this.db.data.get(data._id) 108 | for (let dataKey in data) { 109 | oldValue[dataKey] = data[dataKey] 110 | } 111 | this.saveToFile() 112 | } 113 | 114 | delete(id) { 115 | this.db.data.delete(id) 116 | this.saveToFile() 117 | } 118 | 119 | selectAll() { 120 | if (this.db.data.size > 0){ 121 | return Array.from(this.db.data.values()) 122 | }else { 123 | return [] 124 | } 125 | } 126 | 127 | }; 128 | -------------------------------------------------------------------------------- /backend/src/util/cache.js: -------------------------------------------------------------------------------- 1 | const __cache = new Map(); 2 | 3 | const cache = { 4 | set(key, value) { 5 | __cache.set(key, value) 6 | }, 7 | delete(key) { 8 | if (this.hasKey(key)){ 9 | __cache.delete(key) 10 | } 11 | }, 12 | setExpire(key, value, time) { 13 | let that = this 14 | this.set(key, value) 15 | setTimeout(() => { 16 | that.delete(key) 17 | }, time) 18 | }, 19 | hasKey(key) { 20 | return __cache.has(key) 21 | }, 22 | get(key) { 23 | return __cache.get(key) 24 | } 25 | } 26 | 27 | module.exports = cache 28 | -------------------------------------------------------------------------------- /backend/src/util/encryptUtil.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const CryptoJS = require("crypto-js") 3 | const NinjaConfig = require('./ninjaConfig'); 4 | 5 | //秘钥 6 | const iv = CryptoJS.enc.Utf8.parse('thisprojectisshit'); 7 | const option = { 8 | iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 9 | } 10 | 11 | function saltProcess(salt) { 12 | return salt || 'ninja'; 13 | } 14 | 15 | /** 16 | * 加密 17 | * {param} plaintText 加密明文 18 | * return str 加密结果 19 | */ 20 | module.exports.encrypt = (plaintText) => { 21 | return CryptoJS.AES.encrypt(plaintText, saltProcess(NinjaConfig.getConfig().usernameSalt), option).toString(); 22 | 23 | } 24 | 25 | /** 26 | * 解密 27 | * {param} plaintText 解密密文 28 | * return str 解密结果 29 | */ 30 | module.exports.decrypt = (encryptedBase64Str) => { 31 | let content = String(encryptedBase64Str);//把object转化为string 32 | let bytes = CryptoJS.AES.decrypt(content.toString(), saltProcess(NinjaConfig.getConfig().usernameSalt), option); 33 | 34 | return bytes.toString(CryptoJS.enc.Utf8); 35 | } 36 | 37 | 38 | -------------------------------------------------------------------------------- /backend/src/util/jsonResult.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable camelcase */ 2 | 'use strict'; 3 | 4 | /** 5 | * 操作成功 6 | */ 7 | const SUCCESS = 200; 8 | /** 9 | * 系统内部错误 10 | */ 11 | const ERROR = 500; 12 | 13 | 14 | module.exports = class JsonResult { 15 | 16 | data; 17 | code; 18 | msg; 19 | 20 | constructor({data, code, msg}) { 21 | this.data = data 22 | this.code = code 23 | this.msg = msg 24 | } 25 | 26 | /** 27 | * 响应错误 res data 可以随意组合传入 自动判断那个是对象那个是消息 28 | */ 29 | static error(res, data) { 30 | if (res) { 31 | if (data) { 32 | if (typeof res === 'object') { 33 | return new JsonResult({data: res, code: ERROR, msg: data}) 34 | } else { 35 | return new JsonResult({data: data, code: ERROR, msg: res}) 36 | } 37 | } else { 38 | if (typeof res === 'object') { 39 | return new JsonResult({data: res, code: ERROR, msg: '操作失败'}) 40 | } else { 41 | return new JsonResult({code: ERROR, msg: res}) 42 | } 43 | } 44 | }else { 45 | if (data){ 46 | return new JsonResult({data: data, code: ERROR, msg: '操作失败'}) 47 | }else { 48 | return new JsonResult({code: ERROR, msg: '操作失败'}) 49 | } 50 | } 51 | } 52 | 53 | /** 54 | * 响应成功 55 | */ 56 | static success(res, data) { 57 | if (res) { 58 | if (data) { 59 | if (typeof res === 'object') { 60 | return new JsonResult({data: res, code: SUCCESS, msg: data}) 61 | } else { 62 | return new JsonResult({data: data, code: SUCCESS, msg: res}) 63 | } 64 | } else { 65 | if (typeof res === 'object') { 66 | return new JsonResult({data: res, code: SUCCESS, msg: '操作成功'}) 67 | } else { 68 | return new JsonResult({code: SUCCESS, msg: res}) 69 | } 70 | } 71 | }else { 72 | if (data){ 73 | return new JsonResult({data: data, code: SUCCESS, msg: '操作成功'}) 74 | }else { 75 | return new JsonResult({code: SUCCESS, msg: '操作成功'}) 76 | } 77 | } 78 | } 79 | 80 | }; 81 | -------------------------------------------------------------------------------- /backend/src/util/ninjaConfig.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable camelcase */ 2 | 'use strict'; 3 | let fs = require("fs") 4 | const FILE_PATH = './src/db/' 5 | const FILE_NAME = 'config.json' 6 | 7 | const DEF_CONFIG = { 8 | allowAdd: Boolean(process.env.ALLOW_ADD) || true, 9 | allowNum: Number(process.env.ALLOW_NUM) || 20, 10 | clientId: process.env.CLIENT_ID, 11 | clientSecret: process.env.CLIENT_SECRET, 12 | allowAdmin: Boolean(process.env.ALLOW_ADMIN) || true, 13 | usernameSalt: process.env.USERNAME_SALT || 'ninja123', 14 | adminUsername: process.env.ADMIN_USERNAME || 'admin', 15 | adminPassword: process.env.ADMIN_PASSWORD || '123456', 16 | allowSetStatus: true, 17 | }; 18 | 19 | module.exports = class NinjaConfig { 20 | static configData; 21 | 22 | static getConfig() { 23 | if (!this.configData) { 24 | if (!fs.existsSync(FILE_PATH)) { 25 | fs.mkdirSync(FILE_PATH) 26 | } 27 | if (!fs.existsSync(FILE_PATH + FILE_NAME)) { 28 | fs.writeFileSync(FILE_PATH + FILE_NAME, '') 29 | } 30 | let buffer = fs.readFileSync(FILE_PATH + FILE_NAME) 31 | let configStr = buffer.toString() 32 | if (configStr) { 33 | this.configData = JSON.parse(configStr) 34 | } else { 35 | fs.writeFile(FILE_PATH + FILE_NAME, JSON.stringify(DEF_CONFIG), (err) => { 36 | if (err) { 37 | throw err; 38 | } 39 | }) 40 | this.configData = DEF_CONFIG 41 | } 42 | } 43 | return this.configData 44 | } 45 | 46 | static saveConfig(config) { 47 | this.configData = config; 48 | fs.writeFile(FILE_PATH + FILE_NAME, JSON.stringify(config), (err) => { 49 | if (err) { 50 | throw err; 51 | } 52 | }) 53 | } 54 | 55 | }; 56 | -------------------------------------------------------------------------------- /backend/static/activity.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "玩一玩(可找到大多数活动)", 4 | "address": "京东 APP 首页-频道-边玩边赚", 5 | "href": "https://funearth.m.jd.com/babelDiy/Zeus/3BB1rymVZUo4XmicATEUSDUgHZND/index.html" 6 | }, 7 | { 8 | "name": "宠汪汪", 9 | "address": "京东APP-首页/玩一玩/我的-宠汪汪" 10 | }, 11 | { 12 | "name": "东东萌宠", 13 | "address": "京东APP-首页/玩一玩/我的-东东萌宠" 14 | }, 15 | { 16 | "name": "东东农场", 17 | "address": "京东APP-首页/玩一玩/我的-东东农场" 18 | }, 19 | { 20 | "name": "东东工厂", 21 | "address": "京东APP-首页/玩一玩/我的-东东工厂" 22 | }, 23 | { 24 | "name": "东东超市", 25 | "address": "京东APP-首页/玩一玩/我的-东东超市" 26 | }, 27 | { 28 | "name": "领现金", 29 | "address": "京东APP-首页/玩一玩/我的-领现金" 30 | }, 31 | { 32 | "name": "东东健康社区", 33 | "address": "京东APP-首页/玩一玩/我的-东东健康社区" 34 | }, 35 | { 36 | "name": "京喜农场", 37 | "address": "京喜APP-我的-京喜农场" 38 | }, 39 | { 40 | "name": "京喜牧场", 41 | "address": "京喜APP-我的-京喜牧场" 42 | }, 43 | { 44 | "name": "京喜工厂", 45 | "address": "京喜APP-我的-京喜工厂" 46 | }, 47 | { 48 | "name": "京喜财富岛", 49 | "address": "京喜APP-我的-京喜财富岛" 50 | }, 51 | { 52 | "name": "京东极速版红包", 53 | "address": "京东极速版APP-我的-红包" 54 | } 55 | ] 56 | -------------------------------------------------------------------------------- /backend/static/activity.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/backend/static/activity.json.gz -------------------------------------------------------------------------------- /backend/static/assets/element-icons.9c88a535.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/backend/static/assets/element-icons.9c88a535.woff -------------------------------------------------------------------------------- /backend/static/assets/element-icons.de5eb258.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/backend/static/assets/element-icons.de5eb258.ttf -------------------------------------------------------------------------------- /backend/static/assets/logo.03d6d6da.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/backend/static/assets/logo.03d6d6da.png -------------------------------------------------------------------------------- /backend/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/backend/static/favicon.ico -------------------------------------------------------------------------------- /backend/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Ninja 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /frontend/.env.development: -------------------------------------------------------------------------------- 1 | VITE_API_BASE_URL=http://localhost:5701/api 2 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Ninja 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | }, 8 | "exclude": ["node_modules", "dist"] 9 | } 10 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "22.06.26", 3 | "scripts": { 4 | "dev": "vite", 5 | "build": "vite build", 6 | "serve": "vite preview" 7 | }, 8 | "dependencies": { 9 | "@element-plus/icons-vue": "^2.0.6", 10 | "element-plus": "^2.2.6", 11 | "ky": "^0.28.5", 12 | "pinia": "^2.0.32", 13 | "unplugin-element-plus": "^0.4.0", 14 | "vue": "^3.1.5", 15 | "vue-router": "^4.0.10" 16 | }, 17 | "devDependencies": { 18 | "@vitejs/plugin-vue": "^1.2.5", 19 | "@vue/compiler-sfc": "^3.1.5", 20 | "autoprefixer": "^10.3.1", 21 | "postcss": "^8.3.6", 22 | "tailwindcss": "^2.2.7", 23 | "vite": "^2.4.3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /frontend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@vitejs/plugin-vue': ^1.2.5 5 | '@vue/compiler-sfc': ^3.1.5 6 | autoprefixer: ^10.3.1 7 | element-plus: ^1.0.2-beta.62 8 | ky: ^0.28.5 9 | postcss: ^8.3.6 10 | tailwindcss: ^2.2.7 11 | vite: ^2.4.3 12 | vite-plugin-async-catch: ^0.1.7 13 | vite-plugin-style-import: ^1.0.1 14 | vue: ^3.1.5 15 | vue-router: ^4.0.10 16 | 17 | dependencies: 18 | element-plus: 1.0.2-beta.62_vue@3.1.5 19 | ky: 0.28.5 20 | vue: 3.1.5 21 | vue-router: 4.0.10_vue@3.1.5 22 | 23 | devDependencies: 24 | '@vitejs/plugin-vue': 1.2.5_@vue+compiler-sfc@3.1.5 25 | '@vue/compiler-sfc': 3.1.5_vue@3.1.5 26 | autoprefixer: 10.3.1_postcss@8.3.6 27 | postcss: 8.3.6 28 | tailwindcss: 2.2.7_pnu2ipwencp2oscn5y27pgtyay 29 | vite: 2.4.3 30 | vite-plugin-async-catch: 0.1.7 31 | vite-plugin-style-import: 1.0.1_vite@2.4.3 32 | 33 | packages: 34 | 35 | /@babel/code-frame/7.14.5: 36 | resolution: {integrity: sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==} 37 | engines: {node: '>=6.9.0'} 38 | dependencies: 39 | '@babel/highlight': 7.14.5 40 | dev: true 41 | 42 | /@babel/compat-data/7.14.7: 43 | resolution: {integrity: sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==} 44 | engines: {node: '>=6.9.0'} 45 | dev: true 46 | 47 | /@babel/core/7.14.8: 48 | resolution: {integrity: sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==} 49 | engines: {node: '>=6.9.0'} 50 | dependencies: 51 | '@babel/code-frame': 7.14.5 52 | '@babel/generator': 7.14.8 53 | '@babel/helper-compilation-targets': 7.14.5_@babel+core@7.14.8 54 | '@babel/helper-module-transforms': 7.14.8 55 | '@babel/helpers': 7.14.8 56 | '@babel/parser': 7.14.8 57 | '@babel/template': 7.14.5 58 | '@babel/traverse': 7.14.8 59 | '@babel/types': 7.14.8 60 | convert-source-map: 1.8.0 61 | debug: 4.3.2 62 | gensync: 1.0.0-beta.2 63 | json5: 2.2.0 64 | semver: 6.3.0 65 | source-map: 0.5.7 66 | transitivePeerDependencies: 67 | - supports-color 68 | dev: true 69 | 70 | /@babel/generator/7.14.8: 71 | resolution: {integrity: sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==} 72 | engines: {node: '>=6.9.0'} 73 | dependencies: 74 | '@babel/types': 7.14.8 75 | jsesc: 2.5.2 76 | source-map: 0.5.7 77 | dev: true 78 | 79 | /@babel/helper-compilation-targets/7.14.5_@babel+core@7.14.8: 80 | resolution: {integrity: sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==} 81 | engines: {node: '>=6.9.0'} 82 | peerDependencies: 83 | '@babel/core': ^7.0.0 84 | dependencies: 85 | '@babel/compat-data': 7.14.7 86 | '@babel/core': 7.14.8 87 | '@babel/helper-validator-option': 7.14.5 88 | browserslist: 4.16.6 89 | semver: 6.3.0 90 | dev: true 91 | 92 | /@babel/helper-function-name/7.14.5: 93 | resolution: {integrity: sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==} 94 | engines: {node: '>=6.9.0'} 95 | dependencies: 96 | '@babel/helper-get-function-arity': 7.14.5 97 | '@babel/template': 7.14.5 98 | '@babel/types': 7.14.8 99 | dev: true 100 | 101 | /@babel/helper-get-function-arity/7.14.5: 102 | resolution: {integrity: sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==} 103 | engines: {node: '>=6.9.0'} 104 | dependencies: 105 | '@babel/types': 7.14.8 106 | dev: true 107 | 108 | /@babel/helper-hoist-variables/7.14.5: 109 | resolution: {integrity: sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==} 110 | engines: {node: '>=6.9.0'} 111 | dependencies: 112 | '@babel/types': 7.14.8 113 | dev: true 114 | 115 | /@babel/helper-member-expression-to-functions/7.14.7: 116 | resolution: {integrity: sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==} 117 | engines: {node: '>=6.9.0'} 118 | dependencies: 119 | '@babel/types': 7.14.8 120 | dev: true 121 | 122 | /@babel/helper-module-imports/7.14.5: 123 | resolution: {integrity: sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==} 124 | engines: {node: '>=6.9.0'} 125 | dependencies: 126 | '@babel/types': 7.14.8 127 | dev: true 128 | 129 | /@babel/helper-module-transforms/7.14.8: 130 | resolution: {integrity: sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==} 131 | engines: {node: '>=6.9.0'} 132 | dependencies: 133 | '@babel/helper-module-imports': 7.14.5 134 | '@babel/helper-replace-supers': 7.14.5 135 | '@babel/helper-simple-access': 7.14.8 136 | '@babel/helper-split-export-declaration': 7.14.5 137 | '@babel/helper-validator-identifier': 7.14.8 138 | '@babel/template': 7.14.5 139 | '@babel/traverse': 7.14.8 140 | '@babel/types': 7.14.8 141 | transitivePeerDependencies: 142 | - supports-color 143 | dev: true 144 | 145 | /@babel/helper-optimise-call-expression/7.14.5: 146 | resolution: {integrity: sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==} 147 | engines: {node: '>=6.9.0'} 148 | dependencies: 149 | '@babel/types': 7.14.8 150 | dev: true 151 | 152 | /@babel/helper-replace-supers/7.14.5: 153 | resolution: {integrity: sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==} 154 | engines: {node: '>=6.9.0'} 155 | dependencies: 156 | '@babel/helper-member-expression-to-functions': 7.14.7 157 | '@babel/helper-optimise-call-expression': 7.14.5 158 | '@babel/traverse': 7.14.8 159 | '@babel/types': 7.14.8 160 | transitivePeerDependencies: 161 | - supports-color 162 | dev: true 163 | 164 | /@babel/helper-simple-access/7.14.8: 165 | resolution: {integrity: sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==} 166 | engines: {node: '>=6.9.0'} 167 | dependencies: 168 | '@babel/types': 7.14.8 169 | dev: true 170 | 171 | /@babel/helper-split-export-declaration/7.14.5: 172 | resolution: {integrity: sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==} 173 | engines: {node: '>=6.9.0'} 174 | dependencies: 175 | '@babel/types': 7.14.8 176 | dev: true 177 | 178 | /@babel/helper-validator-identifier/7.14.8: 179 | resolution: {integrity: sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==} 180 | engines: {node: '>=6.9.0'} 181 | 182 | /@babel/helper-validator-option/7.14.5: 183 | resolution: {integrity: sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==} 184 | engines: {node: '>=6.9.0'} 185 | dev: true 186 | 187 | /@babel/helpers/7.14.8: 188 | resolution: {integrity: sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==} 189 | engines: {node: '>=6.9.0'} 190 | dependencies: 191 | '@babel/template': 7.14.5 192 | '@babel/traverse': 7.14.8 193 | '@babel/types': 7.14.8 194 | transitivePeerDependencies: 195 | - supports-color 196 | dev: true 197 | 198 | /@babel/highlight/7.14.5: 199 | resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} 200 | engines: {node: '>=6.9.0'} 201 | dependencies: 202 | '@babel/helper-validator-identifier': 7.14.8 203 | chalk: 2.4.2 204 | js-tokens: 4.0.0 205 | dev: true 206 | 207 | /@babel/parser/7.14.8: 208 | resolution: {integrity: sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==} 209 | engines: {node: '>=6.0.0'} 210 | hasBin: true 211 | 212 | /@babel/template/7.14.5: 213 | resolution: {integrity: sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==} 214 | engines: {node: '>=6.9.0'} 215 | dependencies: 216 | '@babel/code-frame': 7.14.5 217 | '@babel/parser': 7.14.8 218 | '@babel/types': 7.14.8 219 | dev: true 220 | 221 | /@babel/traverse/7.14.8: 222 | resolution: {integrity: sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==} 223 | engines: {node: '>=6.9.0'} 224 | dependencies: 225 | '@babel/code-frame': 7.14.5 226 | '@babel/generator': 7.14.8 227 | '@babel/helper-function-name': 7.14.5 228 | '@babel/helper-hoist-variables': 7.14.5 229 | '@babel/helper-split-export-declaration': 7.14.5 230 | '@babel/parser': 7.14.8 231 | '@babel/types': 7.14.8 232 | debug: 4.3.2 233 | globals: 11.12.0 234 | transitivePeerDependencies: 235 | - supports-color 236 | dev: true 237 | 238 | /@babel/types/7.14.8: 239 | resolution: {integrity: sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==} 240 | engines: {node: '>=6.9.0'} 241 | dependencies: 242 | '@babel/helper-validator-identifier': 7.14.8 243 | to-fast-properties: 2.0.0 244 | 245 | /@nodelib/fs.scandir/2.1.5: 246 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 247 | engines: {node: '>= 8'} 248 | dependencies: 249 | '@nodelib/fs.stat': 2.0.5 250 | run-parallel: 1.2.0 251 | dev: true 252 | 253 | /@nodelib/fs.stat/2.0.5: 254 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 255 | engines: {node: '>= 8'} 256 | dev: true 257 | 258 | /@nodelib/fs.walk/1.2.8: 259 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 260 | engines: {node: '>= 8'} 261 | dependencies: 262 | '@nodelib/fs.scandir': 2.1.5 263 | fastq: 1.11.1 264 | dev: true 265 | 266 | /@popperjs/core/2.9.2: 267 | resolution: {integrity: sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==} 268 | dev: false 269 | 270 | /@rollup/pluginutils/4.1.1: 271 | resolution: {integrity: sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==} 272 | engines: {node: '>= 8.0.0'} 273 | dependencies: 274 | estree-walker: 2.0.2 275 | picomatch: 2.3.0 276 | dev: true 277 | 278 | /@types/babel__core/7.1.15: 279 | resolution: {integrity: sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==} 280 | dependencies: 281 | '@babel/parser': 7.14.8 282 | '@babel/types': 7.14.8 283 | '@types/babel__generator': 7.6.3 284 | '@types/babel__template': 7.4.1 285 | '@types/babel__traverse': 7.14.2 286 | dev: true 287 | 288 | /@types/babel__generator/7.6.3: 289 | resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} 290 | dependencies: 291 | '@babel/types': 7.14.8 292 | dev: true 293 | 294 | /@types/babel__template/7.4.1: 295 | resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} 296 | dependencies: 297 | '@babel/parser': 7.14.8 298 | '@babel/types': 7.14.8 299 | dev: true 300 | 301 | /@types/babel__traverse/7.14.2: 302 | resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} 303 | dependencies: 304 | '@babel/types': 7.14.8 305 | dev: true 306 | 307 | /@types/estree/0.0.48: 308 | resolution: {integrity: sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==} 309 | dev: true 310 | 311 | /@types/parse-json/4.0.0: 312 | resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} 313 | dev: true 314 | 315 | /@vitejs/plugin-vue/1.2.5_@vue+compiler-sfc@3.1.5: 316 | resolution: {integrity: sha512-GIR31mdXTEfvElmBUaRhDc5v7lfdkEdawWQqJRiaRL/5qKsH+xusukglkvJz5y7+c6dEpxgmvcATv2BbB7+fzQ==} 317 | engines: {node: '>=12.0.0'} 318 | peerDependencies: 319 | '@vue/compiler-sfc': ^3.0.8 320 | dependencies: 321 | '@vue/compiler-sfc': 3.1.5_vue@3.1.5 322 | dev: true 323 | 324 | /@vue/compiler-core/3.1.5: 325 | resolution: {integrity: sha512-TXBhFinoBaXKDykJzY26UEuQU1K07FOp/0Ie+OXySqqk0bS0ZO7Xvl7UmiTUPYcLrWbxWBR7Bs/y55AI0MNc2Q==} 326 | dependencies: 327 | '@babel/parser': 7.14.8 328 | '@babel/types': 7.14.8 329 | '@vue/shared': 3.1.5 330 | estree-walker: 2.0.2 331 | source-map: 0.6.1 332 | 333 | /@vue/compiler-dom/3.1.5: 334 | resolution: {integrity: sha512-ZsL3jqJ52OjGU/YiT/9XiuZAmWClKInZM2aFJh9gnsAPqOrj2JIELMbkIFpVKR/CrVO/f2VxfPiiQdQTr65jcQ==} 335 | dependencies: 336 | '@vue/compiler-core': 3.1.5 337 | '@vue/shared': 3.1.5 338 | 339 | /@vue/compiler-sfc/3.1.5_vue@3.1.5: 340 | resolution: {integrity: sha512-mtMY6xMvZeSRx9MTa1+NgJWndrkzVTdJ1pQAmAKQuxyb5LsHVvrgP7kcQFvxPHVpLVTORbTJWHaiqoKrJvi1iA==} 341 | peerDependencies: 342 | vue: 3.1.5 343 | dependencies: 344 | '@babel/parser': 7.14.8 345 | '@babel/types': 7.14.8 346 | '@types/estree': 0.0.48 347 | '@vue/compiler-core': 3.1.5 348 | '@vue/compiler-dom': 3.1.5 349 | '@vue/compiler-ssr': 3.1.5 350 | '@vue/shared': 3.1.5 351 | consolidate: 0.16.0 352 | estree-walker: 2.0.2 353 | hash-sum: 2.0.0 354 | lru-cache: 5.1.1 355 | magic-string: 0.25.7 356 | merge-source-map: 1.1.0 357 | postcss: 8.3.6 358 | postcss-modules: 4.2.2_postcss@8.3.6 359 | postcss-selector-parser: 6.0.6 360 | source-map: 0.6.1 361 | vue: 3.1.5 362 | dev: true 363 | 364 | /@vue/compiler-ssr/3.1.5: 365 | resolution: {integrity: sha512-CU5N7Di/a4lyJ18LGJxJYZS2a8PlLdWpWHX9p/XcsjT2TngMpj3QvHVRkuik2u8QrIDZ8OpYmTyj1WDNsOV+Dg==} 366 | dependencies: 367 | '@vue/compiler-dom': 3.1.5 368 | '@vue/shared': 3.1.5 369 | dev: true 370 | 371 | /@vue/devtools-api/6.0.0-beta.15: 372 | resolution: {integrity: sha512-quBx4Jjpexo6KDiNUGFr/zF/2A4srKM9S9v2uHgMXSU//hjgq1eGzqkIFql8T9gfX5ZaVOUzYBP3jIdIR3PKIA==} 373 | dev: false 374 | 375 | /@vue/reactivity/3.1.5: 376 | resolution: {integrity: sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==} 377 | dependencies: 378 | '@vue/shared': 3.1.5 379 | dev: false 380 | 381 | /@vue/runtime-core/3.1.5: 382 | resolution: {integrity: sha512-YQbG5cBktN1RowQDKA22itmvQ+b40f0WgQ6CXK4VYoYICAiAfu6Cc14777ve8zp1rJRGtk5oIeS149TOculrTg==} 383 | dependencies: 384 | '@vue/reactivity': 3.1.5 385 | '@vue/shared': 3.1.5 386 | dev: false 387 | 388 | /@vue/runtime-dom/3.1.5: 389 | resolution: {integrity: sha512-tNcf3JhVR0RfW0kw1p8xZgv30nvX8Y9rsz7eiQ0dHe273sfoCngAG0y4GvMaY4Xd8FsjUwFedd4suQ8Lu8meXg==} 390 | dependencies: 391 | '@vue/runtime-core': 3.1.5 392 | '@vue/shared': 3.1.5 393 | csstype: 2.6.17 394 | dev: false 395 | 396 | /@vue/shared/3.1.5: 397 | resolution: {integrity: sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==} 398 | 399 | /acorn-node/1.8.2: 400 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 401 | dependencies: 402 | acorn: 7.4.1 403 | acorn-walk: 7.2.0 404 | xtend: 4.0.2 405 | dev: true 406 | 407 | /acorn-walk/7.2.0: 408 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 409 | engines: {node: '>=0.4.0'} 410 | dev: true 411 | 412 | /acorn/7.4.1: 413 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 414 | engines: {node: '>=0.4.0'} 415 | hasBin: true 416 | dev: true 417 | 418 | /ansi-styles/3.2.1: 419 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 420 | engines: {node: '>=4'} 421 | dependencies: 422 | color-convert: 1.9.3 423 | dev: true 424 | 425 | /ansi-styles/4.3.0: 426 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 427 | engines: {node: '>=8'} 428 | dependencies: 429 | color-convert: 2.0.1 430 | dev: true 431 | 432 | /anymatch/3.1.2: 433 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 434 | engines: {node: '>= 8'} 435 | dependencies: 436 | normalize-path: 3.0.0 437 | picomatch: 2.3.0 438 | dev: true 439 | 440 | /arg/5.0.0: 441 | resolution: {integrity: sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==} 442 | dev: true 443 | 444 | /async-validator/3.5.2: 445 | resolution: {integrity: sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==} 446 | dev: false 447 | 448 | /autoprefixer/10.3.1_postcss@8.3.6: 449 | resolution: {integrity: sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==} 450 | engines: {node: ^10 || ^12 || >=14} 451 | hasBin: true 452 | peerDependencies: 453 | postcss: ^8.1.0 454 | dependencies: 455 | browserslist: 4.16.6 456 | caniuse-lite: 1.0.30001247 457 | colorette: 1.2.2 458 | fraction.js: 4.1.1 459 | normalize-range: 0.1.2 460 | postcss: 8.3.6 461 | postcss-value-parser: 4.1.0 462 | dev: true 463 | 464 | /balanced-match/1.0.2: 465 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 466 | dev: true 467 | 468 | /big.js/5.2.2: 469 | resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} 470 | dev: true 471 | 472 | /binary-extensions/2.2.0: 473 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 474 | engines: {node: '>=8'} 475 | dev: true 476 | 477 | /bluebird/3.7.2: 478 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 479 | dev: true 480 | 481 | /brace-expansion/1.1.11: 482 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 483 | dependencies: 484 | balanced-match: 1.0.2 485 | concat-map: 0.0.1 486 | dev: true 487 | 488 | /braces/3.0.2: 489 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 490 | engines: {node: '>=8'} 491 | dependencies: 492 | fill-range: 7.0.1 493 | dev: true 494 | 495 | /browserslist/4.16.6: 496 | resolution: {integrity: sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==} 497 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 498 | hasBin: true 499 | dependencies: 500 | caniuse-lite: 1.0.30001247 501 | colorette: 1.2.2 502 | electron-to-chromium: 1.3.786 503 | escalade: 3.1.1 504 | node-releases: 1.1.73 505 | dev: true 506 | 507 | /bytes/3.1.0: 508 | resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} 509 | engines: {node: '>= 0.8'} 510 | dev: true 511 | 512 | /callsites/3.1.0: 513 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 514 | engines: {node: '>=6'} 515 | dev: true 516 | 517 | /camel-case/4.1.2: 518 | resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} 519 | dependencies: 520 | pascal-case: 3.1.2 521 | tslib: 2.3.0 522 | dev: true 523 | 524 | /camelcase-css/2.0.1: 525 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 526 | engines: {node: '>= 6'} 527 | dev: true 528 | 529 | /caniuse-lite/1.0.30001247: 530 | resolution: {integrity: sha512-4rS7co+7+AoOSPRPOPUt5/GdaqZc0EsUpWk66ofE3HJTAajUK2Ss2VwoNzVN69ghg8lYYlh0an0Iy4LIHHo9UQ==} 531 | dev: true 532 | 533 | /capital-case/1.0.4: 534 | resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} 535 | dependencies: 536 | no-case: 3.0.4 537 | tslib: 2.3.0 538 | upper-case-first: 2.0.2 539 | dev: true 540 | 541 | /chalk/2.4.2: 542 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 543 | engines: {node: '>=4'} 544 | dependencies: 545 | ansi-styles: 3.2.1 546 | escape-string-regexp: 1.0.5 547 | supports-color: 5.5.0 548 | dev: true 549 | 550 | /chalk/4.1.1: 551 | resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} 552 | engines: {node: '>=10'} 553 | dependencies: 554 | ansi-styles: 4.3.0 555 | supports-color: 7.2.0 556 | dev: true 557 | 558 | /change-case/4.1.2: 559 | resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} 560 | dependencies: 561 | camel-case: 4.1.2 562 | capital-case: 1.0.4 563 | constant-case: 3.0.4 564 | dot-case: 3.0.4 565 | header-case: 2.0.4 566 | no-case: 3.0.4 567 | param-case: 3.0.4 568 | pascal-case: 3.1.2 569 | path-case: 3.0.4 570 | sentence-case: 3.0.4 571 | snake-case: 3.0.4 572 | tslib: 2.3.0 573 | dev: true 574 | 575 | /chokidar/3.5.2: 576 | resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} 577 | engines: {node: '>= 8.10.0'} 578 | dependencies: 579 | anymatch: 3.1.2 580 | braces: 3.0.2 581 | glob-parent: 5.1.2 582 | is-binary-path: 2.1.0 583 | is-glob: 4.0.1 584 | normalize-path: 3.0.0 585 | readdirp: 3.6.0 586 | optionalDependencies: 587 | fsevents: registry.npmmirror.com/fsevents/2.3.2 588 | dev: true 589 | 590 | /color-convert/1.9.3: 591 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 592 | dependencies: 593 | color-name: 1.1.3 594 | dev: true 595 | 596 | /color-convert/2.0.1: 597 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 598 | engines: {node: '>=7.0.0'} 599 | dependencies: 600 | color-name: 1.1.4 601 | dev: true 602 | 603 | /color-name/1.1.3: 604 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 605 | dev: true 606 | 607 | /color-name/1.1.4: 608 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 609 | dev: true 610 | 611 | /color-string/1.6.0: 612 | resolution: {integrity: sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==} 613 | dependencies: 614 | color-name: 1.1.4 615 | simple-swizzle: 0.2.2 616 | dev: true 617 | 618 | /color/3.2.1: 619 | resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} 620 | dependencies: 621 | color-convert: 1.9.3 622 | color-string: 1.6.0 623 | dev: true 624 | 625 | /colorette/1.2.2: 626 | resolution: {integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==} 627 | dev: true 628 | 629 | /commander/6.2.1: 630 | resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} 631 | engines: {node: '>= 6'} 632 | dev: true 633 | 634 | /concat-map/0.0.1: 635 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 636 | dev: true 637 | 638 | /consolidate/0.16.0: 639 | resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==} 640 | engines: {node: '>= 0.10.0'} 641 | dependencies: 642 | bluebird: 3.7.2 643 | dev: true 644 | 645 | /constant-case/3.0.4: 646 | resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} 647 | dependencies: 648 | no-case: 3.0.4 649 | tslib: 2.3.0 650 | upper-case: 2.0.2 651 | dev: true 652 | 653 | /convert-source-map/1.8.0: 654 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} 655 | dependencies: 656 | safe-buffer: 5.1.2 657 | dev: true 658 | 659 | /cosmiconfig/7.0.0: 660 | resolution: {integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==} 661 | engines: {node: '>=10'} 662 | dependencies: 663 | '@types/parse-json': 4.0.0 664 | import-fresh: 3.3.0 665 | parse-json: 5.2.0 666 | path-type: 4.0.0 667 | yaml: 1.10.2 668 | dev: true 669 | 670 | /css-unit-converter/1.1.2: 671 | resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} 672 | dev: true 673 | 674 | /cssesc/3.0.0: 675 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 676 | engines: {node: '>=4'} 677 | hasBin: true 678 | dev: true 679 | 680 | /csstype/2.6.17: 681 | resolution: {integrity: sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==} 682 | dev: false 683 | 684 | /dayjs/1.10.6: 685 | resolution: {integrity: sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==} 686 | dev: false 687 | 688 | /debug/4.3.2: 689 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} 690 | engines: {node: '>=6.0'} 691 | peerDependencies: 692 | supports-color: '*' 693 | peerDependenciesMeta: 694 | supports-color: 695 | optional: true 696 | dependencies: 697 | ms: 2.1.2 698 | dev: true 699 | 700 | /defined/1.0.0: 701 | resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} 702 | dev: true 703 | 704 | /detective/5.2.0: 705 | resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} 706 | engines: {node: '>=0.8.0'} 707 | hasBin: true 708 | dependencies: 709 | acorn-node: 1.8.2 710 | defined: 1.0.0 711 | minimist: 1.2.5 712 | dev: true 713 | 714 | /didyoumean/1.2.2: 715 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 716 | dev: true 717 | 718 | /dlv/1.1.3: 719 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 720 | dev: true 721 | 722 | /dot-case/3.0.4: 723 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 724 | dependencies: 725 | no-case: 3.0.4 726 | tslib: 2.3.0 727 | dev: true 728 | 729 | /electron-to-chromium/1.3.786: 730 | resolution: {integrity: sha512-AmvbLBj3hepRk8v/DHrFF8gINxOFfDbrn6Ts3PcK46/FBdQb5OMmpamSpZQXSkfi77FfBzYtQtAk+00LCLYMVw==} 731 | dev: true 732 | 733 | /element-plus/1.0.2-beta.62_vue@3.1.5: 734 | resolution: {integrity: sha512-v4rMbL6p4z8PgsoYt8KtYf8Buw1exMeyVNpioouxH28dt/Cb9xVYbIUcJYWuKG+6IDkS+55RIsaNtUTLK7PZHg==} 735 | peerDependencies: 736 | vue: 3.1.x 737 | dependencies: 738 | '@popperjs/core': 2.9.2 739 | async-validator: 3.5.2 740 | dayjs: 1.10.6 741 | lodash: 4.17.21 742 | mitt: 2.1.0 743 | normalize-wheel: 1.0.1 744 | resize-observer-polyfill: 1.5.1 745 | vue: 3.1.5 746 | dev: false 747 | 748 | /emojis-list/3.0.0: 749 | resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} 750 | engines: {node: '>= 4'} 751 | dev: true 752 | 753 | /error-ex/1.3.2: 754 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 755 | dependencies: 756 | is-arrayish: 0.2.1 757 | dev: true 758 | 759 | /es-module-lexer/0.6.0: 760 | resolution: {integrity: sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==} 761 | dev: true 762 | 763 | /esbuild/0.12.16: 764 | resolution: {integrity: sha512-XqI9cXP2bmQ6MREIqrYBb13KfYFSERsV1+e5jSVWps8dNlLZK+hln7d0mznzDIpfISsg/AgQW0DW3kSInXWhrg==} 765 | hasBin: true 766 | requiresBuild: true 767 | dev: true 768 | 769 | /escalade/3.1.1: 770 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 771 | engines: {node: '>=6'} 772 | dev: true 773 | 774 | /escape-string-regexp/1.0.5: 775 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 776 | engines: {node: '>=0.8.0'} 777 | dev: true 778 | 779 | /estree-walker/2.0.2: 780 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 781 | 782 | /fast-glob/3.2.7: 783 | resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} 784 | engines: {node: '>=8'} 785 | dependencies: 786 | '@nodelib/fs.stat': 2.0.5 787 | '@nodelib/fs.walk': 1.2.8 788 | glob-parent: 5.1.2 789 | merge2: 1.4.1 790 | micromatch: 4.0.4 791 | dev: true 792 | 793 | /fastq/1.11.1: 794 | resolution: {integrity: sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==} 795 | dependencies: 796 | reusify: 1.0.4 797 | dev: true 798 | 799 | /fill-range/7.0.1: 800 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 801 | engines: {node: '>=8'} 802 | dependencies: 803 | to-regex-range: 5.0.1 804 | dev: true 805 | 806 | /fraction.js/4.1.1: 807 | resolution: {integrity: sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==} 808 | dev: true 809 | 810 | /fs-extra/10.0.0: 811 | resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} 812 | engines: {node: '>=12'} 813 | dependencies: 814 | graceful-fs: 4.2.6 815 | jsonfile: 6.1.0 816 | universalify: 2.0.0 817 | dev: true 818 | 819 | /fs.realpath/1.0.0: 820 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 821 | dev: true 822 | 823 | /function-bind/1.1.1: 824 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 825 | dev: true 826 | 827 | /generic-names/2.0.1: 828 | resolution: {integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==} 829 | dependencies: 830 | loader-utils: 1.4.0 831 | dev: true 832 | 833 | /gensync/1.0.0-beta.2: 834 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 835 | engines: {node: '>=6.9.0'} 836 | dev: true 837 | 838 | /glob-parent/5.1.2: 839 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 840 | engines: {node: '>= 6'} 841 | dependencies: 842 | is-glob: 4.0.1 843 | dev: true 844 | 845 | /glob-parent/6.0.1: 846 | resolution: {integrity: sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==} 847 | engines: {node: '>=10.13.0'} 848 | dependencies: 849 | is-glob: 4.0.1 850 | dev: true 851 | 852 | /glob/7.1.7: 853 | resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 854 | dependencies: 855 | fs.realpath: 1.0.0 856 | inflight: 1.0.6 857 | inherits: 2.0.4 858 | minimatch: 3.0.4 859 | once: 1.4.0 860 | path-is-absolute: 1.0.1 861 | dev: true 862 | 863 | /globals/11.12.0: 864 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 865 | engines: {node: '>=4'} 866 | dev: true 867 | 868 | /graceful-fs/4.2.6: 869 | resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} 870 | dev: true 871 | 872 | /has-flag/3.0.0: 873 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 874 | engines: {node: '>=4'} 875 | dev: true 876 | 877 | /has-flag/4.0.0: 878 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 879 | engines: {node: '>=8'} 880 | dev: true 881 | 882 | /has/1.0.3: 883 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 884 | engines: {node: '>= 0.4.0'} 885 | dependencies: 886 | function-bind: 1.1.1 887 | dev: true 888 | 889 | /hash-sum/2.0.0: 890 | resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} 891 | dev: true 892 | 893 | /header-case/2.0.4: 894 | resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} 895 | dependencies: 896 | capital-case: 1.0.4 897 | tslib: 2.3.0 898 | dev: true 899 | 900 | /html-tags/3.1.0: 901 | resolution: {integrity: sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==} 902 | engines: {node: '>=8'} 903 | dev: true 904 | 905 | /icss-replace-symbols/1.1.0: 906 | resolution: {integrity: sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=} 907 | dev: true 908 | 909 | /icss-utils/5.1.0_postcss@8.3.6: 910 | resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} 911 | engines: {node: ^10 || ^12 || >= 14} 912 | peerDependencies: 913 | postcss: ^8.1.0 914 | dependencies: 915 | postcss: 8.3.6 916 | dev: true 917 | 918 | /import-cwd/3.0.0: 919 | resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} 920 | engines: {node: '>=8'} 921 | dependencies: 922 | import-from: 3.0.0 923 | dev: true 924 | 925 | /import-fresh/3.3.0: 926 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 927 | engines: {node: '>=6'} 928 | dependencies: 929 | parent-module: 1.0.1 930 | resolve-from: 4.0.0 931 | dev: true 932 | 933 | /import-from/3.0.0: 934 | resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} 935 | engines: {node: '>=8'} 936 | dependencies: 937 | resolve-from: 5.0.0 938 | dev: true 939 | 940 | /inflight/1.0.6: 941 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 942 | dependencies: 943 | once: 1.4.0 944 | wrappy: 1.0.2 945 | dev: true 946 | 947 | /inherits/2.0.4: 948 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 949 | dev: true 950 | 951 | /is-arrayish/0.2.1: 952 | resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} 953 | dev: true 954 | 955 | /is-arrayish/0.3.2: 956 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 957 | dev: true 958 | 959 | /is-binary-path/2.1.0: 960 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 961 | engines: {node: '>=8'} 962 | dependencies: 963 | binary-extensions: 2.2.0 964 | dev: true 965 | 966 | /is-core-module/2.5.0: 967 | resolution: {integrity: sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==} 968 | dependencies: 969 | has: 1.0.3 970 | dev: true 971 | 972 | /is-extglob/2.1.1: 973 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 974 | engines: {node: '>=0.10.0'} 975 | dev: true 976 | 977 | /is-glob/4.0.1: 978 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} 979 | engines: {node: '>=0.10.0'} 980 | dependencies: 981 | is-extglob: 2.1.1 982 | dev: true 983 | 984 | /is-number/7.0.0: 985 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 986 | engines: {node: '>=0.12.0'} 987 | dev: true 988 | 989 | /js-tokens/4.0.0: 990 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 991 | dev: true 992 | 993 | /jsesc/2.5.2: 994 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 995 | engines: {node: '>=4'} 996 | hasBin: true 997 | dev: true 998 | 999 | /json-parse-even-better-errors/2.3.1: 1000 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1001 | dev: true 1002 | 1003 | /json5/1.0.1: 1004 | resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} 1005 | hasBin: true 1006 | dependencies: 1007 | minimist: 1.2.5 1008 | dev: true 1009 | 1010 | /json5/2.2.0: 1011 | resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} 1012 | engines: {node: '>=6'} 1013 | hasBin: true 1014 | dependencies: 1015 | minimist: 1.2.5 1016 | dev: true 1017 | 1018 | /jsonfile/6.1.0: 1019 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1020 | dependencies: 1021 | universalify: 2.0.0 1022 | optionalDependencies: 1023 | graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6 1024 | dev: true 1025 | 1026 | /ky/0.28.5: 1027 | resolution: {integrity: sha512-O5gg9kF4MeyfSw+YkgPAafOPwEUU6xcdGEJKUJmKpIPbLzk3oxUtY4OdBNekG7mawofzkyZ/ZHuR9ev5uZZdAA==} 1028 | engines: {node: '>=12'} 1029 | dev: false 1030 | 1031 | /lilconfig/2.0.3: 1032 | resolution: {integrity: sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==} 1033 | engines: {node: '>=10'} 1034 | dev: true 1035 | 1036 | /lines-and-columns/1.1.6: 1037 | resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} 1038 | dev: true 1039 | 1040 | /loader-utils/1.4.0: 1041 | resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} 1042 | engines: {node: '>=4.0.0'} 1043 | dependencies: 1044 | big.js: 5.2.2 1045 | emojis-list: 3.0.0 1046 | json5: 1.0.1 1047 | dev: true 1048 | 1049 | /lodash.camelcase/4.3.0: 1050 | resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=} 1051 | dev: true 1052 | 1053 | /lodash.toarray/4.4.0: 1054 | resolution: {integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE=} 1055 | dev: true 1056 | 1057 | /lodash.topath/4.5.2: 1058 | resolution: {integrity: sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=} 1059 | dev: true 1060 | 1061 | /lodash/4.17.21: 1062 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1063 | 1064 | /lower-case/2.0.2: 1065 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1066 | dependencies: 1067 | tslib: 2.3.0 1068 | dev: true 1069 | 1070 | /lru-cache/5.1.1: 1071 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1072 | dependencies: 1073 | yallist: 3.1.1 1074 | dev: true 1075 | 1076 | /magic-string/0.25.7: 1077 | resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} 1078 | dependencies: 1079 | sourcemap-codec: 1.4.8 1080 | dev: true 1081 | 1082 | /merge-source-map/1.1.0: 1083 | resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} 1084 | dependencies: 1085 | source-map: 0.6.1 1086 | dev: true 1087 | 1088 | /merge2/1.4.1: 1089 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1090 | engines: {node: '>= 8'} 1091 | dev: true 1092 | 1093 | /micromatch/4.0.4: 1094 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 1095 | engines: {node: '>=8.6'} 1096 | dependencies: 1097 | braces: 3.0.2 1098 | picomatch: 2.3.0 1099 | dev: true 1100 | 1101 | /minimatch/3.0.4: 1102 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 1103 | dependencies: 1104 | brace-expansion: 1.1.11 1105 | dev: true 1106 | 1107 | /minimist/1.2.5: 1108 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1109 | dev: true 1110 | 1111 | /mitt/2.1.0: 1112 | resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==} 1113 | dev: false 1114 | 1115 | /modern-normalize/1.1.0: 1116 | resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==} 1117 | engines: {node: '>=6'} 1118 | dev: true 1119 | 1120 | /ms/2.1.2: 1121 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1122 | dev: true 1123 | 1124 | /nanoid/3.1.23: 1125 | resolution: {integrity: sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==} 1126 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1127 | hasBin: true 1128 | dev: true 1129 | 1130 | /no-case/3.0.4: 1131 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1132 | dependencies: 1133 | lower-case: 2.0.2 1134 | tslib: 2.3.0 1135 | dev: true 1136 | 1137 | /node-emoji/1.10.0: 1138 | resolution: {integrity: sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==} 1139 | dependencies: 1140 | lodash.toarray: 4.4.0 1141 | dev: true 1142 | 1143 | /node-releases/1.1.73: 1144 | resolution: {integrity: sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==} 1145 | dev: true 1146 | 1147 | /normalize-path/3.0.0: 1148 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1149 | engines: {node: '>=0.10.0'} 1150 | dev: true 1151 | 1152 | /normalize-range/0.1.2: 1153 | resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} 1154 | engines: {node: '>=0.10.0'} 1155 | dev: true 1156 | 1157 | /normalize-wheel/1.0.1: 1158 | resolution: {integrity: sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=} 1159 | dev: false 1160 | 1161 | /object-hash/2.2.0: 1162 | resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} 1163 | engines: {node: '>= 6'} 1164 | dev: true 1165 | 1166 | /once/1.4.0: 1167 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1168 | dependencies: 1169 | wrappy: 1.0.2 1170 | dev: true 1171 | 1172 | /param-case/3.0.4: 1173 | resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} 1174 | dependencies: 1175 | dot-case: 3.0.4 1176 | tslib: 2.3.0 1177 | dev: true 1178 | 1179 | /parent-module/1.0.1: 1180 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1181 | engines: {node: '>=6'} 1182 | dependencies: 1183 | callsites: 3.1.0 1184 | dev: true 1185 | 1186 | /parse-json/5.2.0: 1187 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1188 | engines: {node: '>=8'} 1189 | dependencies: 1190 | '@babel/code-frame': 7.14.5 1191 | error-ex: 1.3.2 1192 | json-parse-even-better-errors: 2.3.1 1193 | lines-and-columns: 1.1.6 1194 | dev: true 1195 | 1196 | /pascal-case/3.1.2: 1197 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 1198 | dependencies: 1199 | no-case: 3.0.4 1200 | tslib: 2.3.0 1201 | dev: true 1202 | 1203 | /path-case/3.0.4: 1204 | resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} 1205 | dependencies: 1206 | dot-case: 3.0.4 1207 | tslib: 2.3.0 1208 | dev: true 1209 | 1210 | /path-is-absolute/1.0.1: 1211 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 1212 | engines: {node: '>=0.10.0'} 1213 | dev: true 1214 | 1215 | /path-parse/1.0.7: 1216 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1217 | dev: true 1218 | 1219 | /path-type/4.0.0: 1220 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1221 | engines: {node: '>=8'} 1222 | dev: true 1223 | 1224 | /picomatch/2.3.0: 1225 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 1226 | engines: {node: '>=8.6'} 1227 | dev: true 1228 | 1229 | /postcss-js/3.0.3: 1230 | resolution: {integrity: sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==} 1231 | engines: {node: '>=10.0'} 1232 | dependencies: 1233 | camelcase-css: 2.0.1 1234 | postcss: 8.3.6 1235 | dev: true 1236 | 1237 | /postcss-load-config/3.1.0: 1238 | resolution: {integrity: sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==} 1239 | engines: {node: '>= 10'} 1240 | peerDependencies: 1241 | ts-node: '>=9.0.0' 1242 | peerDependenciesMeta: 1243 | ts-node: 1244 | optional: true 1245 | dependencies: 1246 | import-cwd: 3.0.0 1247 | lilconfig: 2.0.3 1248 | yaml: 1.10.2 1249 | dev: true 1250 | 1251 | /postcss-modules-extract-imports/3.0.0_postcss@8.3.6: 1252 | resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} 1253 | engines: {node: ^10 || ^12 || >= 14} 1254 | peerDependencies: 1255 | postcss: ^8.1.0 1256 | dependencies: 1257 | postcss: 8.3.6 1258 | dev: true 1259 | 1260 | /postcss-modules-local-by-default/4.0.0_postcss@8.3.6: 1261 | resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} 1262 | engines: {node: ^10 || ^12 || >= 14} 1263 | peerDependencies: 1264 | postcss: ^8.1.0 1265 | dependencies: 1266 | icss-utils: 5.1.0_postcss@8.3.6 1267 | postcss: 8.3.6 1268 | postcss-selector-parser: 6.0.6 1269 | postcss-value-parser: 4.1.0 1270 | dev: true 1271 | 1272 | /postcss-modules-scope/3.0.0_postcss@8.3.6: 1273 | resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} 1274 | engines: {node: ^10 || ^12 || >= 14} 1275 | peerDependencies: 1276 | postcss: ^8.1.0 1277 | dependencies: 1278 | postcss: 8.3.6 1279 | postcss-selector-parser: 6.0.6 1280 | dev: true 1281 | 1282 | /postcss-modules-values/4.0.0_postcss@8.3.6: 1283 | resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} 1284 | engines: {node: ^10 || ^12 || >= 14} 1285 | peerDependencies: 1286 | postcss: ^8.1.0 1287 | dependencies: 1288 | icss-utils: 5.1.0_postcss@8.3.6 1289 | postcss: 8.3.6 1290 | dev: true 1291 | 1292 | /postcss-modules/4.2.2_postcss@8.3.6: 1293 | resolution: {integrity: sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==} 1294 | peerDependencies: 1295 | postcss: ^8.0.0 1296 | dependencies: 1297 | generic-names: 2.0.1 1298 | icss-replace-symbols: 1.1.0 1299 | lodash.camelcase: 4.3.0 1300 | postcss: 8.3.6 1301 | postcss-modules-extract-imports: 3.0.0_postcss@8.3.6 1302 | postcss-modules-local-by-default: 4.0.0_postcss@8.3.6 1303 | postcss-modules-scope: 3.0.0_postcss@8.3.6 1304 | postcss-modules-values: 4.0.0_postcss@8.3.6 1305 | string-hash: 1.1.3 1306 | dev: true 1307 | 1308 | /postcss-nested/5.0.5_postcss@8.3.6: 1309 | resolution: {integrity: sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==} 1310 | engines: {node: '>=10.0'} 1311 | peerDependencies: 1312 | postcss: ^8.1.13 1313 | dependencies: 1314 | postcss: 8.3.6 1315 | postcss-selector-parser: 6.0.6 1316 | dev: true 1317 | 1318 | /postcss-selector-parser/6.0.6: 1319 | resolution: {integrity: sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==} 1320 | engines: {node: '>=4'} 1321 | dependencies: 1322 | cssesc: 3.0.0 1323 | util-deprecate: 1.0.2 1324 | dev: true 1325 | 1326 | /postcss-value-parser/3.3.1: 1327 | resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} 1328 | dev: true 1329 | 1330 | /postcss-value-parser/4.1.0: 1331 | resolution: {integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==} 1332 | dev: true 1333 | 1334 | /postcss/8.3.6: 1335 | resolution: {integrity: sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==} 1336 | engines: {node: ^10 || ^12 || >=14} 1337 | dependencies: 1338 | colorette: 1.2.2 1339 | nanoid: 3.1.23 1340 | source-map-js: 0.6.2 1341 | dev: true 1342 | 1343 | /pretty-hrtime/1.0.3: 1344 | resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} 1345 | engines: {node: '>= 0.8'} 1346 | dev: true 1347 | 1348 | /purgecss/4.0.3: 1349 | resolution: {integrity: sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==} 1350 | hasBin: true 1351 | dependencies: 1352 | commander: 6.2.1 1353 | glob: 7.1.7 1354 | postcss: 8.3.6 1355 | postcss-selector-parser: 6.0.6 1356 | dev: true 1357 | 1358 | /queue-microtask/1.2.3: 1359 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1360 | dev: true 1361 | 1362 | /quick-lru/5.1.1: 1363 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1364 | engines: {node: '>=10'} 1365 | dev: true 1366 | 1367 | /readdirp/3.6.0: 1368 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1369 | engines: {node: '>=8.10.0'} 1370 | dependencies: 1371 | picomatch: 2.3.0 1372 | dev: true 1373 | 1374 | /reduce-css-calc/2.1.8: 1375 | resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} 1376 | dependencies: 1377 | css-unit-converter: 1.1.2 1378 | postcss-value-parser: 3.3.1 1379 | dev: true 1380 | 1381 | /resize-observer-polyfill/1.5.1: 1382 | resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} 1383 | dev: false 1384 | 1385 | /resolve-from/4.0.0: 1386 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1387 | engines: {node: '>=4'} 1388 | dev: true 1389 | 1390 | /resolve-from/5.0.0: 1391 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1392 | engines: {node: '>=8'} 1393 | dev: true 1394 | 1395 | /resolve/1.20.0: 1396 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 1397 | dependencies: 1398 | is-core-module: 2.5.0 1399 | path-parse: 1.0.7 1400 | dev: true 1401 | 1402 | /reusify/1.0.4: 1403 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1404 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1405 | dev: true 1406 | 1407 | /rimraf/3.0.2: 1408 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1409 | hasBin: true 1410 | dependencies: 1411 | glob: 7.1.7 1412 | dev: true 1413 | 1414 | /rollup/2.54.0: 1415 | resolution: {integrity: sha512-RHzvstAVwm9A751NxWIbGPFXs3zL4qe/eYg+N7WwGtIXVLy1cK64MiU37+hXeFm1jqipK6DGgMi6Z2hhPuCC3A==} 1416 | engines: {node: '>=10.0.0'} 1417 | hasBin: true 1418 | optionalDependencies: 1419 | fsevents: registry.npmmirror.com/fsevents/2.3.2 1420 | dev: true 1421 | 1422 | /run-parallel/1.2.0: 1423 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1424 | dependencies: 1425 | queue-microtask: 1.2.3 1426 | dev: true 1427 | 1428 | /safe-buffer/5.1.2: 1429 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1430 | dev: true 1431 | 1432 | /semver/6.3.0: 1433 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1434 | hasBin: true 1435 | dev: true 1436 | 1437 | /sentence-case/3.0.4: 1438 | resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} 1439 | dependencies: 1440 | no-case: 3.0.4 1441 | tslib: 2.3.0 1442 | upper-case-first: 2.0.2 1443 | dev: true 1444 | 1445 | /simple-swizzle/0.2.2: 1446 | resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} 1447 | dependencies: 1448 | is-arrayish: 0.3.2 1449 | dev: true 1450 | 1451 | /snake-case/3.0.4: 1452 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} 1453 | dependencies: 1454 | dot-case: 3.0.4 1455 | tslib: 2.3.0 1456 | dev: true 1457 | 1458 | /source-map-js/0.6.2: 1459 | resolution: {integrity: sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==} 1460 | engines: {node: '>=0.10.0'} 1461 | dev: true 1462 | 1463 | /source-map/0.5.7: 1464 | resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} 1465 | engines: {node: '>=0.10.0'} 1466 | dev: true 1467 | 1468 | /source-map/0.6.1: 1469 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1470 | engines: {node: '>=0.10.0'} 1471 | 1472 | /sourcemap-codec/1.4.8: 1473 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1474 | dev: true 1475 | 1476 | /string-hash/1.1.3: 1477 | resolution: {integrity: sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=} 1478 | dev: true 1479 | 1480 | /supports-color/5.5.0: 1481 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1482 | engines: {node: '>=4'} 1483 | dependencies: 1484 | has-flag: 3.0.0 1485 | dev: true 1486 | 1487 | /supports-color/7.2.0: 1488 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1489 | engines: {node: '>=8'} 1490 | dependencies: 1491 | has-flag: 4.0.0 1492 | dev: true 1493 | 1494 | /tailwindcss/2.2.7_pnu2ipwencp2oscn5y27pgtyay: 1495 | resolution: {integrity: sha512-jv35rugP5j8PpzbXnsria7ZAry7Evh0KtQ4MZqNd+PhF+oIKPwJTVwe/rmfRx9cZw3W7iPZyzBmeoAoNwfJ1yg==} 1496 | engines: {node: '>=12.13.0'} 1497 | hasBin: true 1498 | peerDependencies: 1499 | autoprefixer: ^10.0.2 1500 | postcss: ^8.0.9 1501 | dependencies: 1502 | arg: 5.0.0 1503 | autoprefixer: 10.3.1_postcss@8.3.6 1504 | bytes: 3.1.0 1505 | chalk: 4.1.1 1506 | chokidar: 3.5.2 1507 | color: 3.2.1 1508 | cosmiconfig: 7.0.0 1509 | detective: 5.2.0 1510 | didyoumean: 1.2.2 1511 | dlv: 1.1.3 1512 | fast-glob: 3.2.7 1513 | fs-extra: 10.0.0 1514 | glob-parent: 6.0.1 1515 | html-tags: 3.1.0 1516 | is-glob: 4.0.1 1517 | lodash: 4.17.21 1518 | lodash.topath: 4.5.2 1519 | modern-normalize: 1.1.0 1520 | node-emoji: 1.10.0 1521 | normalize-path: 3.0.0 1522 | object-hash: 2.2.0 1523 | postcss: 8.3.6 1524 | postcss-js: 3.0.3 1525 | postcss-load-config: 3.1.0 1526 | postcss-nested: 5.0.5_postcss@8.3.6 1527 | postcss-selector-parser: 6.0.6 1528 | postcss-value-parser: 4.1.0 1529 | pretty-hrtime: 1.0.3 1530 | purgecss: 4.0.3 1531 | quick-lru: 5.1.1 1532 | reduce-css-calc: 2.1.8 1533 | resolve: 1.20.0 1534 | tmp: 0.2.1 1535 | transitivePeerDependencies: 1536 | - ts-node 1537 | dev: true 1538 | 1539 | /tmp/0.2.1: 1540 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} 1541 | engines: {node: '>=8.17.0'} 1542 | dependencies: 1543 | rimraf: 3.0.2 1544 | dev: true 1545 | 1546 | /to-fast-properties/2.0.0: 1547 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 1548 | engines: {node: '>=4'} 1549 | 1550 | /to-regex-range/5.0.1: 1551 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1552 | engines: {node: '>=8.0'} 1553 | dependencies: 1554 | is-number: 7.0.0 1555 | dev: true 1556 | 1557 | /tslib/2.3.0: 1558 | resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} 1559 | dev: true 1560 | 1561 | /universalify/2.0.0: 1562 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 1563 | engines: {node: '>= 10.0.0'} 1564 | dev: true 1565 | 1566 | /upper-case-first/2.0.2: 1567 | resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} 1568 | dependencies: 1569 | tslib: 2.3.0 1570 | dev: true 1571 | 1572 | /upper-case/2.0.2: 1573 | resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} 1574 | dependencies: 1575 | tslib: 2.3.0 1576 | dev: true 1577 | 1578 | /util-deprecate/1.0.2: 1579 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 1580 | dev: true 1581 | 1582 | /vite-plugin-async-catch/0.1.7: 1583 | resolution: {integrity: sha512-EsVnrKHkPewMJFC/oz+49X41Pc5VNVHhlkmrx2ONCxci5iqwh8yyrsYKkF3D2pXdgpjnhqtUQhqqBQ4ZUcGrLg==} 1584 | dependencies: 1585 | '@babel/core': 7.14.8 1586 | '@babel/parser': 7.14.8 1587 | '@babel/traverse': 7.14.8 1588 | '@babel/types': 7.14.8 1589 | '@types/babel__core': 7.1.15 1590 | '@types/babel__traverse': 7.14.2 1591 | transitivePeerDependencies: 1592 | - supports-color 1593 | dev: true 1594 | 1595 | /vite-plugin-style-import/1.0.1_vite@2.4.3: 1596 | resolution: {integrity: sha512-qinzdBxqkmX4fEyLZJVIBQTrgKivbROgcKJfBRz66knbghYAoe9cQeRptWKh35hE7obiidItWSCrHWkeu+JMVw==} 1597 | peerDependencies: 1598 | vite: '>=2.0.0' 1599 | dependencies: 1600 | '@rollup/pluginutils': 4.1.1 1601 | change-case: 4.1.2 1602 | debug: 4.3.2 1603 | es-module-lexer: 0.6.0 1604 | magic-string: 0.25.7 1605 | vite: 2.4.3 1606 | transitivePeerDependencies: 1607 | - supports-color 1608 | dev: true 1609 | 1610 | /vite/2.4.3: 1611 | resolution: {integrity: sha512-iT6NPeiUUZ2FkzC3eazytOEMRaM4J+xgRQcNcpRcbmfYjakCFP4WKPJpeEz1U5JEKHAtwv3ZBQketQUFhFU3ng==} 1612 | engines: {node: '>=12.0.0'} 1613 | hasBin: true 1614 | dependencies: 1615 | esbuild: 0.12.16 1616 | postcss: 8.3.6 1617 | resolve: 1.20.0 1618 | rollup: 2.54.0 1619 | optionalDependencies: 1620 | fsevents: registry.npmmirror.com/fsevents/2.3.2 1621 | dev: true 1622 | 1623 | /vue-router/4.0.10_vue@3.1.5: 1624 | resolution: {integrity: sha512-YbPf6QnZpyyWfnk7CUt2Bme+vo7TLfg1nGZNkvYqKYh4vLaFw6Gn8bPGdmt5m4qrGnKoXLqc4htAsd3dIukICA==} 1625 | peerDependencies: 1626 | vue: ^3.0.0 1627 | dependencies: 1628 | '@vue/devtools-api': 6.0.0-beta.15 1629 | vue: 3.1.5 1630 | dev: false 1631 | 1632 | /vue/3.1.5: 1633 | resolution: {integrity: sha512-Ho7HNb1nfDoO+HVb6qYZgeaobt1XbY6KXFe4HGs1b9X6RhkWG/113n4/SrtM1LUclM6OrP/Se5aPHHvAPG1iVQ==} 1634 | dependencies: 1635 | '@vue/compiler-dom': 3.1.5 1636 | '@vue/runtime-dom': 3.1.5 1637 | '@vue/shared': 3.1.5 1638 | dev: false 1639 | 1640 | /wrappy/1.0.2: 1641 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1642 | dev: true 1643 | 1644 | /xtend/4.0.2: 1645 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1646 | engines: {node: '>=0.4'} 1647 | dev: true 1648 | 1649 | /yallist/3.1.1: 1650 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1651 | dev: true 1652 | 1653 | /yaml/1.10.2: 1654 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1655 | engines: {node: '>= 6'} 1656 | dev: true 1657 | 1658 | registry.npmmirror.com/fsevents/2.3.2: 1659 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz} 1660 | name: fsevents 1661 | version: 2.3.2 1662 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1663 | os: [darwin] 1664 | requiresBuild: true 1665 | dev: true 1666 | optional: true 1667 | 1668 | registry.npmmirror.com/graceful-fs/4.2.6: 1669 | resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.6.tgz} 1670 | name: graceful-fs 1671 | version: 4.2.6 1672 | requiresBuild: true 1673 | dev: true 1674 | optional: true 1675 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | 17 | 63 | -------------------------------------------------------------------------------- /frontend/src/api/index.js: -------------------------------------------------------------------------------- 1 | import ky from 'ky' 2 | 3 | const VITE_API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api' 4 | 5 | const api = ky.create({prefixUrl: VITE_API_BASE_URL, retry: {limit: 0}}) 6 | 7 | export function getInfoAPI() { 8 | return api.get('info').json() 9 | } 10 | 11 | export function login(body) { 12 | return api.post('login', {json: body}).json() 13 | } 14 | 15 | export function registerUser(body) { 16 | return api.post('register', {json: body}).json() 17 | } 18 | 19 | export function verifyToken(token) { 20 | return api.post('verifyToken', {json: {token}}).json() 21 | } 22 | 23 | export function getAllConfig(token){ 24 | const searchParams = new URLSearchParams() 25 | searchParams.set('token', token) 26 | return api.get('getAllConfig', {searchParams: searchParams}).json() 27 | } 28 | 29 | export function saveConfig(body) { 30 | return api.post('saveConfig', {json: body}).json() 31 | } 32 | 33 | 34 | export function getUserInfoAPI() { 35 | const searchParams = new URLSearchParams() 36 | searchParams.set('eid', localStorage.getItem('eid')) 37 | searchParams.set('encryptUsername', localStorage.getItem('encryptUsername')) 38 | return api.get('userinfo', {searchParams}).json() 39 | } 40 | 41 | export function delAccountAPI(body) { 42 | return api.post('delete', {json: body}).json() 43 | } 44 | 45 | export function updateAPI(body) { 46 | return api.post('update', {json: body}).json() 47 | } 48 | 49 | export function disableAPI(body) { 50 | return api.post('disable', {json: body}).json() 51 | } 52 | 53 | export function enableAPI(body) { 54 | return api.post('enable', {json: body}).json() 55 | } 56 | 57 | export function getContent() { 58 | return api.get('getContent').json() 59 | } 60 | 61 | export function setContent(body) { 62 | return api.post('setContent', {json: body}).json() 63 | } 64 | 65 | -------------------------------------------------------------------------------- /frontend/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/frontend/src/assets/logo.png -------------------------------------------------------------------------------- /frontend/src/components/Header.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | 26 | 34 | -------------------------------------------------------------------------------- /frontend/src/components/Logo.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | -------------------------------------------------------------------------------- /frontend/src/components/updateLog.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | 121 | 122 | 135 | -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /frontend/src/main.js: -------------------------------------------------------------------------------- 1 | import { 2 | ElButton, 3 | ElInput, 4 | ElMessage, 5 | ElForm, 6 | ElFormItem, 7 | ElMessageBox, 8 | ElTabs, 9 | ElTabPane, 10 | ElDialog, 11 | ElLink, 12 | ElLoading, 13 | ElSwitch, 14 | ElIcon 15 | } from 'element-plus' 16 | import 'element-plus/es/components/message/style/css' 17 | import 'element-plus/es/components/message-box/style/css' 18 | import 'element-plus/dist/index.css' 19 | import {createApp} from 'vue' 20 | import { createPinia } from 'pinia' 21 | import App from './App.vue' 22 | import './index.css' 23 | import router from './router' 24 | import * as ElementPlusIconsVue from '@element-plus/icons-vue' 25 | 26 | const components = [ElButton, ElInput, ElMessageBox, ElSwitch, ElMessage, ElForm, ElFormItem, ElTabs, ElTabPane, ElDialog, ElLink, ElIcon] 27 | const plugins = [ElMessage, ElMessageBox, ElLoading] 28 | 29 | const pinia = createPinia(); 30 | const app = createApp(App) 31 | 32 | for (const [key, component] of Object.entries(ElementPlusIconsVue)) { 33 | app.component(key, component) 34 | } 35 | 36 | components.forEach((component) => { 37 | app.component(component.name, component) 38 | }) 39 | 40 | plugins.forEach((plugin) => { 41 | app.use(plugin) 42 | }) 43 | 44 | app.use(pinia) 45 | app.use(router) 46 | app.mount('#app') 47 | -------------------------------------------------------------------------------- /frontend/src/manageStore.js: -------------------------------------------------------------------------------- 1 | import {defineStore} from "pinia"; 2 | import {ref} from "vue"; 3 | import {ElMessage} from "element-plus"; 4 | 5 | export const useManageStore = defineStore('manage', { 6 | // 为了完整类型推理,推荐使用箭头函数 7 | state: () => { 8 | return { 9 | token: '' 10 | } 11 | }, 12 | actions: { 13 | alertMsg(type, msg) { 14 | if (type === 'success') { 15 | ElMessage.success(msg) 16 | } else { 17 | ElMessage.error(msg) 18 | } 19 | } 20 | } 21 | }) 22 | -------------------------------------------------------------------------------- /frontend/src/router.js: -------------------------------------------------------------------------------- 1 | import Index from '@/views/index.vue' 2 | import manage from '@/views/manage.vue' 3 | import Login from '@/views/login.vue' 4 | import { createRouter, createWebHashHistory } from 'vue-router' 5 | 6 | const routes = [ 7 | { path: '/',name:'index', component: Index }, 8 | { path: '/manage',name:'manage', component: manage }, 9 | { path: '/login',name:'login', component: Login }, 10 | ] 11 | 12 | const router = createRouter({ 13 | history: createWebHashHistory(), 14 | routes, 15 | }) 16 | 17 | export default router 18 | -------------------------------------------------------------------------------- /frontend/src/views/index.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | 266 | 267 | 283 | -------------------------------------------------------------------------------- /frontend/src/views/login.vue: -------------------------------------------------------------------------------- 1 | 75 | 76 | 242 | 243 | 263 | -------------------------------------------------------------------------------- /frontend/src/views/manage.vue: -------------------------------------------------------------------------------- 1 | 77 | 78 | 295 | 296 | 312 | -------------------------------------------------------------------------------- /frontend/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], 3 | important: '#app', 4 | darkMode: false, // or 'media' or 'class' 5 | theme: { 6 | extend: {}, 7 | }, 8 | variants: { 9 | extend: {}, 10 | }, 11 | plugins: [], 12 | } 13 | -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import vue from '@vitejs/plugin-vue' 2 | import path from 'path' 3 | import { defineConfig } from 'vite' 4 | import ElementPlus from 'unplugin-element-plus/vite' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [ 9 | vue(), 10 | ElementPlus() 11 | ], 12 | resolve: { 13 | alias: { 14 | '@': path.resolve(__dirname, 'src'), 15 | }, 16 | }, 17 | build: { 18 | outDir: '../backend/static', 19 | } 20 | }) 21 | -------------------------------------------------------------------------------- /img/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/img/img.png -------------------------------------------------------------------------------- /img/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/img/img_1.png -------------------------------------------------------------------------------- /img/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/img/img_2.png -------------------------------------------------------------------------------- /img/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/img/img_3.png -------------------------------------------------------------------------------- /img/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SvenShi/sven_ninja/7da01632e579a31f79e4c7289e541e2fcab45943/img/img_5.png --------------------------------------------------------------------------------