├── .eslintrc.json ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── .yarnrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── assets ├── icon │ ├── logo.png │ └── nssctf.png └── scripts │ ├── paste.applescript │ ├── paste.ps1 │ └── paste.sh ├── package.json ├── src ├── controller │ ├── BaseController.ts │ ├── MainController.ts │ └── UserController.ts ├── event.ts ├── extension.ts ├── i18n │ ├── index.ts │ └── locale.ts ├── lib │ └── balderich │ │ ├── client.ts │ │ ├── index.ts │ │ ├── models │ │ ├── contest.ts │ │ ├── problem.ts │ │ ├── resource.ts │ │ ├── team.ts │ │ └── user.ts │ │ └── utils │ │ ├── code.ts │ │ └── exceptions.ts ├── model │ ├── CodeModel.ts │ └── ProblemNodeModel.ts ├── provider │ └── ProblemProvider.ts ├── service │ └── UserService.ts ├── store │ ├── MainStore.ts │ └── UserStore.ts ├── test │ ├── runTest.ts │ └── suite │ │ ├── extension.test.ts │ │ └── index.ts └── util │ ├── CacheUtil.ts │ ├── CodeUtil.ts │ ├── ConfigUtil.ts │ ├── DecoratorUtil.ts │ └── SystemUtil.ts ├── tsconfig.json └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | "@typescript-eslint/naming-convention": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "curly": "warn", 15 | "eqeqeq": "warn", 16 | "no-throw-literal": "warn", 17 | "semi": "off" 18 | }, 19 | "ignorePatterns": [ 20 | "out", 21 | "dist", 22 | "**/*.d.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | node_modules 4 | .vscode-test/ 5 | *.vsix 6 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "dbaeumer.vscode-eslint" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "args": [ 13 | "--extensionDevelopmentPath=${workspaceFolder}" 14 | ], 15 | "outFiles": [ 16 | "${workspaceFolder}/out/**/*.js" 17 | ], 18 | "preLaunchTask": "${defaultBuildTask}" 19 | }, 20 | { 21 | "name": "Extension Tests", 22 | "type": "extensionHost", 23 | "request": "launch", 24 | "args": [ 25 | "--extensionDevelopmentPath=${workspaceFolder}", 26 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 27 | ], 28 | "outFiles": [ 29 | "${workspaceFolder}/out/test/**/*.js" 30 | ], 31 | "preLaunchTask": "${defaultBuildTask}" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off" 11 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | src/** 4 | .gitignore 5 | .yarnrc 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/.eslintrc.json 9 | **/*.map 10 | **/*.ts 11 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | --ignore-engines true -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "nssctf" extension will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | ## [Unreleased] 8 | 9 | - Initial release -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NSSCTF官方VSCode扩展 2 | 3 |

4 | 5 | 6 | 7 | 8 |

9 | 10 | * 地址:https://github.com/NSSCTF/nssctf-vscode-extension 11 | 12 | ## 功能 13 | 14 | |功能|完成情况| 15 | |-|-| 16 | |粘贴图片上传到图床|✅| 17 | |题目查看及分类|❌| 18 | |文章查看及分类|❌| 19 | 20 | * 欢迎提交Issues或者PR。 21 | -------------------------------------------------------------------------------- /assets/icon/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NSSCTF/nssctf-vscode-extension/9f0f935af87bb488036720b7af1b42a64f495911/assets/icon/logo.png -------------------------------------------------------------------------------- /assets/icon/nssctf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NSSCTF/nssctf-vscode-extension/9f0f935af87bb488036720b7af1b42a64f495911/assets/icon/nssctf.png -------------------------------------------------------------------------------- /assets/scripts/paste.applescript: -------------------------------------------------------------------------------- 1 | property fileTypes : {{«class PNGf», ".png"}} 2 | property pathTypes : {{«class furl»}} 3 | 4 | on run argv 5 | if argv is {} then 6 | return "" 7 | end if 8 | 9 | try 10 | (item 1 of (clipboard info for «class furl»)) 11 | return POSIX path of (the clipboard as «class furl») 12 | on error 13 | set imagePath to (item 1 of argv) 14 | set theType to getType() 15 | 16 | if theType is not missing value then 17 | try 18 | set myFile to (open for access imagePath with write permission) 19 | set eof myFile to 0 20 | write (the clipboard as (first item of theType)) to myFile 21 | close access myFile 22 | return (POSIX path of imagePath) 23 | on error 24 | try 25 | close access myFile 26 | end try 27 | return "" 28 | end try 29 | else 30 | return "no image" 31 | end if 32 | end try 33 | 34 | end run 35 | 36 | on getType() 37 | repeat with aType in fileTypes 38 | repeat with theInfo in (clipboard info) 39 | if (first item of theInfo) is equal to (first item of aType) then return aType 40 | end repeat 41 | end repeat 42 | return missing value 43 | end getType 44 | -------------------------------------------------------------------------------- /assets/scripts/paste.ps1: -------------------------------------------------------------------------------- 1 | param($imagePath) 2 | 3 | # Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1 4 | chcp 65001 5 | 6 | Add-Type -Assembly PresentationCore 7 | $img = [Windows.Clipboard]::GetImage() 8 | 9 | if ($null -eq $img) { 10 | $img = [Windows.Clipboard]::GetFileDropList() 11 | if ($null -eq $img) { 12 | "no image" 13 | Exit 1 14 | } 15 | $img 16 | Exit 0 17 | } 18 | 19 | if (-not $imagePath) { 20 | "no image" 21 | Exit 1 22 | } 23 | 24 | $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0) 25 | $stream = [IO.File]::Open($imagePath, "OpenOrCreate") 26 | $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder 27 | $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null 28 | $encoder.Save($stream) | out-null 29 | $stream.Dispose() | out-null 30 | 31 | $imagePath -------------------------------------------------------------------------------- /assets/scripts/paste.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212) 4 | command -v xclip >/dev/null 2>&1 || { 5 | echo >&1 "no xclip" 6 | exit 1 7 | } 8 | 9 | # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file) 10 | xclip -selection clipboard -target image/png -o >$1 11 | if [ $? -eq 0 ]; then 12 | echo $1 13 | else 14 | content=$(xclip -selection c -o) 15 | echo $content 16 | fi -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nssctf", 3 | "displayName": "NSSCTF(Beta)", 4 | "description": "NSSCTF VSCode插件", 5 | "version": "0.0.1", 6 | "icon": "assets/icon/logo.png", 7 | "publisher": "nssctf", 8 | "engines": { 9 | "vscode": "^1.78.0" 10 | }, 11 | "keywords": [ 12 | "nssctf", 13 | "ctf" 14 | ], 15 | "categories": [ 16 | "Other" 17 | ], 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/NSSCTF/nssctf-vscode-extension" 21 | }, 22 | "activationEvents": [ 23 | ], 24 | "main": "./out/extension.js", 25 | "contributes": { 26 | "viewsContainers": { 27 | "activitybar": [ 28 | { 29 | "id": "nssctf_bar", 30 | "title": "NSSCTF", 31 | "icon": "assets/icon/nssctf.png" 32 | } 33 | ] 34 | }, 35 | "views": { 36 | "nssctf_bar": [ 37 | { 38 | "id": "ProblemExplorer", 39 | "name": "题目" 40 | } 41 | ] 42 | }, 43 | "commands": [ 44 | { 45 | "command": "nssctf.pastePicture", 46 | "category": "NSSCTF", 47 | "title": "粘贴图片" 48 | }, 49 | { 50 | "command": "nssctf.signIn", 51 | "category": "NSSCTF", 52 | "title": "signIn" 53 | } 54 | ], 55 | "keybindings": [ 56 | { 57 | "command": "nssctf.pastePicture", 58 | "key": "alt+shift+v", 59 | "mac": "alt+shift+v", 60 | "when": "editorLangId == markdown || editorLangId == mdx || resourceExtname == .ipynb" 61 | } 62 | ], 63 | "menus": { 64 | "view/title": [ 65 | { 66 | "command": "nssctf.signIn", 67 | "when": "view == ProblemExplorer", 68 | "group": "navigation@0" 69 | } 70 | ], 71 | "editor/context": [ 72 | { 73 | "command": "nssctf.pastePicture", 74 | "when": "editorLangId == markdown || editorLangId == mdx || resourceExtname == .ipynb", 75 | "group": "NSSCTF@1" 76 | } 77 | ] 78 | }, 79 | "configuration": [ 80 | { 81 | "title": "NSSCTF", 82 | "properties": { 83 | "nssctf.api.key": { 84 | "type": "string", 85 | "default": "", 86 | "scope": "application", 87 | "description": "NSSCTF平台API Key" 88 | }, 89 | "nssctf.api.secret": { 90 | "type": "string", 91 | "default": "", 92 | "description": "NSSCTF平台API Secret", 93 | "scope": "application" 94 | } 95 | } 96 | } 97 | ] 98 | }, 99 | "scripts": { 100 | "vscode:prepublish": "yarn run compile", 101 | "compile": "tsc -p ./", 102 | "watch": "tsc -watch -p ./", 103 | "pretest": "yarn run compile && yarn run lint", 104 | "lint": "eslint src --ext ts", 105 | "test": "node ./out/test/runTest.js" 106 | }, 107 | "devDependencies": { 108 | "@types/glob": "^8.1.0", 109 | "@types/mocha": "^10.0.1", 110 | "@types/node": "16.x", 111 | "@types/vscode": "^1.78.0", 112 | "@typescript-eslint/eslint-plugin": "^5.59.1", 113 | "@typescript-eslint/parser": "^5.59.1", 114 | "@vscode/test-electron": "^2.3.0", 115 | "eslint": "^8.39.0", 116 | "glob": "^8.1.0", 117 | "mocha": "^10.2.0", 118 | "typescript": "^5.0.4" 119 | }, 120 | "dependencies": { 121 | "axios": "^1.4.0", 122 | "form-data": "^4.0.0" 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/controller/BaseController.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NSSCTF/nssctf-vscode-extension/9f0f935af87bb488036720b7af1b42a64f495911/src/controller/BaseController.ts -------------------------------------------------------------------------------- /src/controller/MainController.ts: -------------------------------------------------------------------------------- 1 | import { ExtensionContext, window } from "vscode"; 2 | import { mainStore } from "../store/MainStore"; 3 | import { NSSClient } from "../lib/balderich"; 4 | import { getBalderichAPI } from "../util/ConfigUtil"; 5 | import { output } from "../util/CodeUtil"; 6 | import locale from "../i18n/locale"; 7 | 8 | class MainController { 9 | public async initialize(context: ExtensionContext) { 10 | mainStore.context = context; 11 | mainStore.cachePath = context.globalStorageUri; 12 | const api = getBalderichAPI(); 13 | if (api.key.length !== 0) { 14 | mainStore.client = new NSSClient(null, api.key, api.secret); 15 | try { 16 | await mainStore.client.user.getSelfInfo() 17 | } catch (Error: any) { 18 | output.appendLine(Error.toString()); 19 | mainStore.client = null; 20 | await window.showErrorMessage(locale['apiError']); 21 | } 22 | 23 | } 24 | } 25 | } 26 | 27 | export const mainController: MainController = new MainController(); -------------------------------------------------------------------------------- /src/controller/UserController.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import { mainStore } from "../store/MainStore"; 3 | import * as cutils from '../util/CodeUtil' ; 4 | import * as sutils from '../util/SystemUtil' ; 5 | import * as path from 'path'; 6 | import { userStore } from '../store/UserStore'; 7 | import { locale } from '../i18n'; 8 | import { exceptionCatch, requireLogin } from '../util/DecoratorUtil'; 9 | 10 | class UserController { 11 | @exceptionCatch() 12 | @requireLogin() 13 | public async pastePicture(): Promise { 14 | let stop = cutils.showProgress(); 15 | 16 | let editor = vscode.window.activeTextEditor; 17 | let selections = cutils.getSelections(); 18 | let urls = []; 19 | 20 | let savePath = sutils.getTempDir(); 21 | savePath = path.resolve(savePath, `pic_${new Date().getTime()}.png`); 22 | let images = await cutils.getPasteImage(savePath); 23 | 24 | images = images.filter(img => ['.jpg', '.jpeg', '.gif', '.bmp', '.png', '.webp', '.svg'].find(ext => img.endsWith(ext))); 25 | for (let i = 0; i < images.length; i++) { 26 | let name = path.basename(images[i]); 27 | let res = await mainStore.client?.user.postUserPicturebedUpload(name, images[i]); 28 | if (res) { 29 | urls.push(`https://www.nssctf.cn/${res.url}`); 30 | } 31 | } 32 | 33 | console.log(urls); 34 | 35 | let insertMsg = ''; 36 | for (let i = 0; i < urls.length; i++) { 37 | let selection = locale['imageAlt']; 38 | if (selections?.length === 1 && editor?.document.getText(selections[0])) { 39 | selection = `${editor?.document.getText(selections[0])} ${i+1}`; 40 | } else if (selections?.[i] && editor?.document.getText(selections[i])) { 41 | selection = selections?.[i] && editor?.document.getText(selections[i]); 42 | } 43 | 44 | 45 | let text = `![${selection}](${urls[i]}) \n`; 46 | 47 | insertMsg += text; 48 | } 49 | if (insertMsg) { 50 | let pos = editor?.selection.active; 51 | await cutils.editorEdit(pos, insertMsg); 52 | } 53 | 54 | stop(); 55 | } 56 | 57 | public async signIn(): Promise { 58 | const key: string | undefined = await vscode.window.showInputBox({ 59 | prompt: locale['siginInputKeyPropmt'], 60 | ignoreFocusOut: true, 61 | validateInput: (s: string): string | undefined => { 62 | return s && s.trim() ? undefined : locale['siginInputKeyInvalidMessage'] 63 | } 64 | }); 65 | 66 | if (!key) { 67 | return; 68 | } 69 | const secret: string | undefined = await vscode.window.showInputBox({ 70 | prompt: locale['siginInputSecretPropmt'], 71 | password: true, 72 | ignoreFocusOut: true, 73 | validateInput: (s: string): string | undefined => { 74 | return s && s.trim() ? undefined : locale['siginInputSecretInvalidMessage'] 75 | } 76 | }) 77 | 78 | if (!secret) { 79 | return; 80 | } 81 | 82 | if (await userStore.signIn(key, secret)) { 83 | vscode.window.showInformationMessage(locale['signinSuccessMessage']); 84 | } else { 85 | await vscode.window.showErrorMessage(locale['signinFailedMessage']); 86 | } 87 | } 88 | } 89 | 90 | export const userController: UserController = new UserController(); -------------------------------------------------------------------------------- /src/event.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | import { problemProvider } from "./provider/ProblemProvider"; 3 | 4 | class Event extends EventEmitter { 5 | public initialize() { 6 | this.on("userInfoUpdate", () => { 7 | problemProvider.refresh(); 8 | }) 9 | } 10 | } 11 | 12 | export const event: Event = new Event(); -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import { userController } from './controller/UserController'; 2 | import * as vscode from 'vscode'; 3 | import { mainController } from './controller/MainController'; 4 | import { userStore } from './store/UserStore'; 5 | import { output } from './util/CodeUtil'; 6 | import { problemProvider } from './provider/ProblemProvider'; 7 | import { event } from './event'; 8 | 9 | export async function activate(context: vscode.ExtensionContext) { 10 | try { 11 | // 初始化 12 | await mainController.initialize(context); 13 | event.initialize(); 14 | 15 | context.subscriptions.push( 16 | // vscode.window.createTreeView('ProblemExplorer', { treeDataProvider: problemProvider, showCollapseAll: true }), 17 | vscode.commands.registerCommand('nssctf.pastePicture', async () => userController.pastePicture()), 18 | vscode.commands.registerCommand('nssctf.signIn', () => userController.signIn()), 19 | ); 20 | 21 | await userStore.updateLoginStatus(); 22 | } catch (error: any) { 23 | output.appendLine(error.toString()); 24 | await vscode.window.showErrorMessage('扩展初始化失败,请在输出中查看详情。'); 25 | } 26 | } 27 | 28 | // This method is called when your extension is deactivated 29 | export function deactivate() {} 30 | -------------------------------------------------------------------------------- /src/i18n/index.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import * as i18n from './locale'; 3 | 4 | 5 | export const locale = (() => { 6 | let locale = i18n.default; 7 | let lang = vscode.env.language; 8 | let langLocale = null; 9 | 10 | try { 11 | langLocale = i18n.$[lang]; 12 | } catch { 13 | try { 14 | langLocale = i18n.$[lang.split('-')[0]]; 15 | } catch {} 16 | } 17 | 18 | if (langLocale) { 19 | locale = Object.assign(locale, langLocale); 20 | } 21 | return locale; 22 | })(); -------------------------------------------------------------------------------- /src/i18n/locale.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | NSSCTF_URL: 'https://www.nssctf.cn/', 3 | apiError: ' 登录失败,请检查API配置。', 4 | imageAlt: 'NSS图片', 5 | notLoginNodeName: '未登录', 6 | siginInputKeyPropmt: '请输入API Key。', 7 | siginInputSecretPropmt: '请输入API Secret。', 8 | siginInputKeyInvalidMessage: 'Key不能为空', 9 | siginInputSecretInvalidMessage: 'Secret不能为空', 10 | signinSuccessMessage: '登录成功。', 11 | signinFailedMessage: '登录失败,请查看控制台输出信息。', 12 | imagePasteUploadProgressTitle: '图片上传中...', 13 | problemNodeModelCommandTitle: '查看题目详情', 14 | no_api: '请先配置NSSCTF API参数。', 15 | install_xclip: '您需要先安装 xclip 命令。', 16 | powershell_not_found: '找不到Powershell。', 17 | }; 18 | 19 | let $: any = { }; 20 | export { $ }; -------------------------------------------------------------------------------- /src/lib/balderich/client.ts: -------------------------------------------------------------------------------- 1 | import { createHash } from 'crypto' 2 | import * as fs from 'fs' 3 | import Axios from 'axios' 4 | import { ContestCollection } from './models/contest' 5 | import { ProblemCollection } from './models/problem' 6 | import { UserCollection } from './models/user' 7 | import { TeamCollection } from './models/team' 8 | 9 | class AuthConfig { 10 | key: string 11 | secret: string 12 | 13 | constructor(key: string, secret: string) { 14 | this.key = key 15 | this.secret = secret 16 | } 17 | 18 | static load_config_file(filepath: string) { 19 | const content = fs.readFileSync(filepath).toString() 20 | 21 | const data = JSON.parse(content) 22 | 23 | const authConfig = new AuthConfig(data['key'], data['secret']) 24 | return authConfig 25 | } 26 | 27 | sign(path: string, timestamp: number | null = null, prefix: string = '/v2/api/'): [string, number] { 28 | if (timestamp === null) { 29 | timestamp = Math.floor(new Date().getTime() / 1000) 30 | } 31 | const sha256 = (t: string) => createHash('sha256').update(t).digest('hex') 32 | const res = sha256(`${prefix}${path}#${this.key}#${timestamp}#${this.secret}`) 33 | 34 | return [res, timestamp] 35 | } 36 | } 37 | 38 | class NSSClient { 39 | auth_config: AuthConfig 40 | url: string 41 | 42 | constructor( 43 | auth_config: AuthConfig | null = null, 44 | key: string | null = null, 45 | secret: string | null = null, 46 | url: string | null = null, 47 | ) { 48 | if (url === null) { 49 | url = 'https://www.nssctf.cn/v2/api/' 50 | } 51 | if (auth_config === null) { 52 | if (key && secret) { 53 | auth_config = new AuthConfig(key, secret) 54 | } else { 55 | throw Error('key or secret is null.') 56 | } 57 | } 58 | 59 | this.url = url 60 | this.auth_config = auth_config 61 | } 62 | 63 | get user() { 64 | return new UserCollection(this) 65 | } 66 | 67 | get problem() { 68 | return new ProblemCollection(this) 69 | } 70 | 71 | get contest() { 72 | return new ContestCollection(this) 73 | } 74 | 75 | get team() { 76 | return new TeamCollection(this) 77 | } 78 | 79 | get key() { 80 | return this.auth_config.key 81 | } 82 | 83 | async _get(path: string): Promise<[number, any]> { 84 | const [sign, timestamp] = this.auth_config.sign(path) 85 | const res = await Axios.get(`${this.url}${path}`, { 86 | params: { 87 | key: this.key, 88 | time: timestamp, 89 | sign: sign, 90 | }, 91 | }) 92 | 93 | const resJson = res.data 94 | const code = resJson['code'] 95 | const data = resJson['data'] 96 | 97 | return [code, data] 98 | } 99 | 100 | async _post(path: string, data: object | null = null, blob: boolean = false): Promise<[number, any]> { 101 | if (data === null) { 102 | data = {} 103 | } 104 | const [sign, timestamp] = this.auth_config.sign(path) 105 | let res 106 | 107 | if (!blob) { 108 | res = await Axios.post(`${this.url}${path}`, data, { 109 | params: { 110 | key: this.key, 111 | time: timestamp, 112 | sign: sign, 113 | }, 114 | }) 115 | } else { 116 | return await Axios.post(`${this.url}${path}`, data, { 117 | params: { 118 | key: this.key, 119 | time: timestamp, 120 | sign: sign, 121 | }, 122 | responseType: 'blob', 123 | }) 124 | } 125 | const resJson = res.data 126 | 127 | return [resJson['code'], resJson['data']] 128 | } 129 | 130 | async _put(path: string, data: object | null = null): Promise<[number, any]> { 131 | if (data === null) { 132 | data = {} 133 | } 134 | 135 | const [sign, timestamp] = this.auth_config.sign(path) 136 | const res = await Axios.put(`${this.url}${path}`, data, { 137 | params: { 138 | key: this.key, 139 | time: timestamp, 140 | sign: sign, 141 | }, 142 | }) 143 | const resJson = res.data 144 | 145 | return [resJson['code'], resJson['data']] 146 | } 147 | } 148 | 149 | export { NSSClient } 150 | -------------------------------------------------------------------------------- /src/lib/balderich/index.ts: -------------------------------------------------------------------------------- 1 | const __version__ = '1.3' 2 | 3 | import { NSSClient } from './client' 4 | 5 | export { NSSClient } 6 | -------------------------------------------------------------------------------- /src/lib/balderich/models/contest.ts: -------------------------------------------------------------------------------- 1 | import { SUCCESS } from '../utils/code' 2 | import { getException } from '../utils/exceptions' 3 | import { Collection } from './resource' 4 | 5 | export class ContestCollection extends Collection { 6 | async get_contest_list(type: number, page: number): Promise> { 7 | /** 8 | * 获取比赛列表。数据缓存10分钟。 9 | * 10 | * @param type - 比赛类型 11 | * 0 -> 公开赛事 12 | * 1 -> 私密赛事 13 | * @param page - 页面参数 14 | * @returns { 15 | * contests: [{ 16 | * id: number, 17 | * cover: string, 18 | * title: string, 19 | * level: number, 20 | * mode: number, 21 | * start_date: number, 22 | * ends_date: number, 23 | * desc: number, 24 | * state: number, 25 | * count: number 26 | * }], 27 | * total: number 28 | * } 29 | */ 30 | const [code, data] = await this.client._get(`contest/${type}/list/${page}/`) 31 | if (code !== SUCCESS) { 32 | throw getException(code) 33 | } 34 | 35 | return data 36 | } 37 | 38 | async get_contest_info(cid: number): Promise> { 39 | /** 40 | * 获取比赛详细信息。数据缓存10分钟。 41 | * 42 | * @param cid - 比赛ID 43 | * @returns { 44 | * id: number, 45 | * title: string, 46 | * level: number, 47 | * type: number, 48 | * mode: number, 49 | * desc: number, 50 | * cover: string, 51 | * top_score: number, 52 | * decrease_score: number, 53 | * start_date: number, 54 | * ends_date: number, 55 | * is_team: boolean 56 | * } 57 | */ 58 | const [code, data] = await this.client._get(`contest/${cid}/info/`) 59 | if (code !== SUCCESS) { 60 | throw getException(code) 61 | } 62 | 63 | return data 64 | } 65 | 66 | async get_contest_rank_list(cid: number, page: number): Promise> { 67 | /** 68 | * 获取比赛榜单信息。相同路径数据缓存60秒。 69 | * 70 | * @param cid - 比赛ID 71 | * @param page - 页面参数 72 | * @returns { 73 | * category: string[], 74 | * point: Dictionary, 75 | * problems: [number, number, string][], 76 | * top3: Dictionary, 77 | * solves: { 78 | * uid: number, 79 | * username: string, 80 | * rating: number, 81 | * solved: string, 82 | * solved_time: string, 83 | * score: number, 84 | * }[], 85 | * team: boolean, 86 | * total: number 87 | * } 88 | */ 89 | const [code, data] = await this.client._get(`contest/${cid}/rank/list/${page}/`) 90 | if (code !== SUCCESS) { 91 | throw getException(code) 92 | } 93 | 94 | return data 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/lib/balderich/models/problem.ts: -------------------------------------------------------------------------------- 1 | import { SUCCESS } from '../utils/code' 2 | import { getException } from '../utils/exceptions' 3 | import { Collection } from './resource' 4 | 5 | interface ProblemListData { 6 | problems: Problem[] 7 | total: number 8 | } 9 | 10 | interface Problem { 11 | id: number 12 | title: string 13 | point: number 14 | tags: string[] 15 | level: number 16 | author: { 17 | uid: number 18 | name: string 19 | rating: number 20 | } 21 | } 22 | 23 | interface ProblemInfo { 24 | id: number 25 | title: string 26 | desc: string 27 | point: number 28 | tags: string[] 29 | hint: boolean 30 | level: number 31 | annex: boolean 32 | docker: boolean 33 | price: number 34 | likes: number 35 | date: number 36 | info: { 37 | solved: number 38 | wa: number 39 | } 40 | author: { 41 | uid: number 42 | name: string 43 | rating: number 44 | } 45 | } 46 | 47 | interface ProblemSheetListData { 48 | sheets: ProblemSheet[] 49 | total: number 50 | } 51 | 52 | interface ProblemSheet { 53 | id: number 54 | title: string 55 | stars: number 56 | count: number 57 | author: { 58 | uid: number 59 | name: string 60 | rating: number 61 | } 62 | } 63 | 64 | interface ProblemSheetInfo { 65 | id: number 66 | title: string 67 | stars: number 68 | count: number 69 | type: number 70 | content: string 71 | author: { 72 | uid: number 73 | name: string 74 | rating: number 75 | } 76 | } 77 | 78 | interface ProblemSheetProblemListData { 79 | problems: ProblemSheetProblem[] 80 | total: number 81 | } 82 | 83 | interface ProblemSheetProblem { 84 | id: number 85 | title: string 86 | point: number 87 | solved: number 88 | level: number 89 | tags: string[] 90 | index: number 91 | } 92 | 93 | export class ProblemCollection extends Collection { 94 | async get_problem_list_by_page(page: number, size: number = 10): Promise { 95 | const endpoint = `problem/list/${page}/${size}/` 96 | const [code, data] = await this.client._get(endpoint) 97 | 98 | if (code !== SUCCESS) { 99 | throw getException(code) 100 | } 101 | 102 | return data as ProblemListData 103 | } 104 | 105 | async get_problem_info(pid: number): Promise { 106 | const endpoint = `problem/${pid}/info/` 107 | const [code, data] = await this.client._get(endpoint) 108 | 109 | if (code !== SUCCESS) { 110 | throw getException(code) 111 | } 112 | 113 | return data as ProblemInfo 114 | } 115 | 116 | async get_problem_sheet_list_by_page(page: number, size: number = 10): Promise { 117 | const endpoint = `problem/sheet/list/${page}/${size}/` 118 | const [code, data] = await this.client._get(endpoint) 119 | 120 | if (code !== SUCCESS) { 121 | throw getException(code) 122 | } 123 | 124 | return data as ProblemSheetListData 125 | } 126 | 127 | async get_problem_sheet_info(psid: number): Promise { 128 | const endpoint = `problem/sheet/${psid}/info/` 129 | const [code, data] = await this.client._get(endpoint) 130 | 131 | if (code !== SUCCESS) { 132 | throw getException(code) 133 | } 134 | 135 | return data as ProblemSheetInfo 136 | } 137 | 138 | async get_problem_sheet_problem_list_by_page( 139 | psid: number, 140 | page: number, 141 | size: number = 10, 142 | ): Promise { 143 | const endpoint = `problem/sheet/${psid}/list/${page}/${size}/` 144 | const [code, data] = await this.client._get(endpoint) 145 | 146 | if (code !== SUCCESS) { 147 | throw getException(code) 148 | } 149 | 150 | return data as ProblemSheetProblemListData 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /src/lib/balderich/models/resource.ts: -------------------------------------------------------------------------------- 1 | export class Collection { 2 | client: any 3 | 4 | constructor(client: any = null) { 5 | this.client = client 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/lib/balderich/models/team.ts: -------------------------------------------------------------------------------- 1 | import { SUCCESS } from '../utils/code' 2 | import { getException } from '../utils/exceptions' 3 | import { Collection } from './resource' 4 | 5 | interface User { 6 | uid: number 7 | rating: number 8 | username: string 9 | } 10 | 11 | interface Team { 12 | id: number 13 | name: string 14 | bio: number 15 | date: number 16 | user: User 17 | nums: number 18 | } 19 | 20 | interface TeamListResponse { 21 | teams: Team[] 22 | total: number 23 | } 24 | 25 | interface TeamInfo { 26 | id: number 27 | name: string 28 | bio: number 29 | date: number 30 | avatar: string 31 | user: User 32 | nums: number 33 | } 34 | 35 | interface TeamNotice { 36 | notice: string 37 | } 38 | 39 | interface TeamClockinResponse { 40 | state: boolean 41 | nums: number 42 | } 43 | 44 | interface Problem { 45 | id: number 46 | title: string 47 | point: number 48 | tags: string[] 49 | level: number 50 | solves: number 51 | } 52 | 53 | interface TeamProblemListResponse { 54 | problems: Problem[] 55 | total: number 56 | } 57 | 58 | interface TeamProblemInfo { 59 | id: number 60 | title: string 61 | desc: string 62 | point: number 63 | tags: string[] 64 | hint: boolean 65 | level: number 66 | annex: boolean 67 | docker: boolean 68 | price: number 69 | likes: number 70 | date: number 71 | info: { 72 | solved: number 73 | wa: number 74 | } 75 | author: { 76 | uid: number 77 | name: string 78 | rating: number 79 | } 80 | } 81 | 82 | interface Contest { 83 | id: number 84 | cover: string 85 | title: string 86 | start_date: number 87 | ends_date: number 88 | is_team: boolean 89 | desc: string 90 | state: number 91 | } 92 | 93 | interface TeamContestListResponse { 94 | contests: Contest[] 95 | total: number 96 | } 97 | 98 | interface TeamContestInfo { 99 | title: string 100 | level: number 101 | type: number 102 | mode: number 103 | desc: string 104 | cover: string 105 | top_score: number 106 | decrease_score: number 107 | start_date: number 108 | ends_date: number 109 | } 110 | 111 | interface TeamContestRankListResponse { 112 | category: string[] 113 | point: { 114 | [key: number]: number 115 | } 116 | problems: [number, number, string][] 117 | top3: { 118 | [key: number]: string[] 119 | } 120 | solves: { 121 | uid: number 122 | username: string 123 | rating: number 124 | solved: string 125 | solved_time: string 126 | score: number 127 | }[] 128 | team: boolean 129 | total: number 130 | } 131 | 132 | interface TeamUser { 133 | id: number 134 | uid: number 135 | username: string 136 | rating: number 137 | alias: string 138 | date: number 139 | role: number 140 | } 141 | 142 | interface TeamUserListResponse { 143 | users: TeamUser[] 144 | total: number 145 | } 146 | 147 | interface TeamApplyUser { 148 | id: number 149 | uid: number 150 | username: string 151 | rating: number 152 | msg: string 153 | date: number 154 | } 155 | 156 | interface TeamApplyListResponse { 157 | users: TeamApplyUser[] 158 | total: number 159 | } 160 | 161 | interface TeamAnalysisUse { 162 | problem: { 163 | now: number 164 | max: number 165 | } 166 | contest: { 167 | now: number 168 | max: number 169 | } 170 | memory: { 171 | now: number 172 | max: number 173 | } 174 | person: { 175 | now: number 176 | max: number 177 | } 178 | level: number 179 | state: boolean 180 | } 181 | 182 | export class TeamCollection extends Collection { 183 | async getTeamListByPage(page: number, size: number = 10): Promise { 184 | const endpoint = `team/list/${page}/${size}/` 185 | const [code, data] = await this.client._get(endpoint) 186 | 187 | if (code !== SUCCESS) { 188 | throw getException(code) 189 | } 190 | 191 | return data as TeamListResponse 192 | } 193 | 194 | async getTeamInfo(tid: number): Promise { 195 | const endpoint = `team/${tid}/info/` 196 | const [code, data] = await this.client._get(endpoint) 197 | 198 | if (code !== SUCCESS) { 199 | throw getException(code) 200 | } 201 | 202 | return data as TeamInfo 203 | } 204 | 205 | async getTeamNotice(): Promise { 206 | const endpoint = `team/notice/` 207 | const [code, data] = await this.client._get(endpoint) 208 | 209 | if (code !== SUCCESS) { 210 | throw getException(code) 211 | } 212 | 213 | return data as TeamNotice 214 | } 215 | 216 | async putTeamClockin(): Promise { 217 | const endpoint = `team/clockin/` 218 | const [code, data] = await this.client._put(endpoint) 219 | 220 | if (code !== SUCCESS) { 221 | throw getException(code) 222 | } 223 | 224 | return data as TeamClockinResponse 225 | } 226 | 227 | async getTeamProblemListByPage(page: number, size: number = 10): Promise { 228 | const endpoint = `team/problem/list/${page}/${size}/` 229 | const [code, data] = await this.client._get(endpoint) 230 | 231 | if (code !== SUCCESS) { 232 | throw getException(code) 233 | } 234 | 235 | return data as TeamProblemListResponse 236 | } 237 | 238 | async getTeamProblemInfo(pid: number): Promise { 239 | const endpoint = `team/problem/${pid}/info/` 240 | const [code, data] = await this.client._get(endpoint) 241 | 242 | if (code !== SUCCESS) { 243 | throw getException(code) 244 | } 245 | 246 | return data as TeamProblemInfo 247 | } 248 | 249 | async getTeamContestListByPage(page: number, size: number = 10): Promise { 250 | const endpoint = `team/contest/list/${page}/${size}/` 251 | const [code, data] = await this.client._get(endpoint) 252 | 253 | if (code !== SUCCESS) { 254 | throw getException(code) 255 | } 256 | 257 | return data as TeamContestListResponse 258 | } 259 | 260 | async getTeamContestInfo(cid: number): Promise { 261 | const endpoint = `team/contest/${cid}/info/` 262 | const [code, data] = await this.client._get(endpoint) 263 | 264 | if (code !== SUCCESS) { 265 | throw getException(code) 266 | } 267 | 268 | return data as TeamContestInfo 269 | } 270 | 271 | async getTeamContestRankListByPage( 272 | cid: number, 273 | page: number, 274 | size: number = 15, 275 | ): Promise { 276 | const endpoint = `team/contest/${cid}/rank/list/${page}/${size}/` 277 | const [code, data] = await this.client._get(endpoint) 278 | 279 | if (code !== SUCCESS) { 280 | throw getException(code) 281 | } 282 | 283 | return data as TeamContestRankListResponse 284 | } 285 | 286 | async getTeamUserListByPage(page: number, size: number = 10): Promise { 287 | const endpoint = `team/user/list/${page}/${size}/` 288 | const [code, data] = await this.client._get(endpoint) 289 | 290 | if (code !== SUCCESS) { 291 | throw getException(code) 292 | } 293 | 294 | return data as TeamUserListResponse 295 | } 296 | 297 | async getTeamApplyListByPage(page: number, size: number = 10): Promise { 298 | const endpoint = `team/user/apply/list/${page}/${size}/` 299 | const [code, data] = await this.client._get(endpoint) 300 | 301 | if (code !== SUCCESS) { 302 | throw getException(code) 303 | } 304 | 305 | return data as TeamApplyListResponse 306 | } 307 | 308 | async getTeamAnalysisUse(): Promise { 309 | const endpoint = `team/analysis/use/` 310 | const [code, data] = await this.client._get(endpoint) 311 | 312 | if (code !== SUCCESS) { 313 | throw getException(code) 314 | } 315 | 316 | return data as TeamAnalysisUse 317 | } 318 | 319 | async postTeamAnalysisSolvesCurve(uids: number[]): Promise { 320 | const endpoint = `team/analysis/solves/curve/` 321 | const [code, data] = await this.client._post(endpoint, { 322 | uids: uids, 323 | }) 324 | 325 | if (code !== SUCCESS) { 326 | throw getException(code) 327 | } 328 | 329 | return data 330 | } 331 | 332 | async getTeamStatisticsDay(uids: number[]): Promise { 333 | const endpoint = `team/statistics/day/` 334 | const [code, data] = await this.client._get(endpoint, { uids: uids }) 335 | 336 | if (code !== SUCCESS) { 337 | throw getException(code) 338 | } 339 | 340 | return data 341 | } 342 | } 343 | -------------------------------------------------------------------------------- /src/lib/balderich/models/user.ts: -------------------------------------------------------------------------------- 1 | import { Blob } from 'buffer' 2 | import { SUCCESS } from '../utils/code' 3 | import { getException } from '../utils/exceptions' 4 | import { Collection } from './resource' 5 | import * as fs from 'fs' 6 | import FormData = require('form-data') 7 | 8 | interface UserInfo { 9 | uid: number 10 | bio: string 11 | intro: string 12 | username: string 13 | solves: number 14 | rating: number 15 | avatar: string 16 | cover: string 17 | register_date: number 18 | last_login_date: number 19 | email: string 20 | followers: number 21 | following: number 22 | tid: number 23 | team: string 24 | is_vip: boolean 25 | } 26 | 27 | interface UserActiveStatistics { 28 | start_date: number 29 | ends_date: number 30 | count: [string, number][] 31 | } 32 | 33 | interface UserSolvesStatistics { 34 | type: number 35 | name: string 36 | data: number[] 37 | } 38 | 39 | interface UserRatingStatistics { 40 | date: number 41 | rating: number 42 | title: string 43 | rank: number 44 | unrated: boolean 45 | nums: number 46 | } 47 | 48 | interface UserRadarStatistics { 49 | date: number 50 | rating: number 51 | title: string 52 | rank: number 53 | unrated: boolean 54 | nums: number 55 | } 56 | 57 | interface Article { 58 | id: number 59 | title: string 60 | date: number 61 | type: number 62 | } 63 | 64 | interface UserFollowing { 65 | uid: number 66 | username: string 67 | bio: string 68 | avatar: string 69 | } 70 | 71 | interface UserPicturebedUsed { 72 | used_mem: number 73 | max_mem: number 74 | total: number 75 | } 76 | 77 | interface UserPicture { 78 | id: number 79 | name: string 80 | date: number 81 | size: number 82 | url: string 83 | } 84 | 85 | export class UserCollection extends Collection { 86 | async getSelfInfo(): Promise { 87 | const endpoint = `user/info/` 88 | const [code, data] = await this.client._get(endpoint) 89 | 90 | if (code !== SUCCESS) { 91 | throw getException(code) 92 | } 93 | 94 | return data as UserInfo 95 | } 96 | 97 | async getUserInfo(name: string): Promise { 98 | const endpoint = `user/${name}/info/` 99 | const [code, data] = await this.client._get(endpoint) 100 | 101 | if (code !== SUCCESS) { 102 | throw getException(code) 103 | } 104 | 105 | return data as UserInfo 106 | } 107 | 108 | async getUserStatisticsActive(uid: number): Promise { 109 | const endpoint = `user/${uid}/statistics/active/` 110 | const [code, data] = await this.client._get(endpoint) 111 | 112 | if (code !== SUCCESS) { 113 | throw getException(code) 114 | } 115 | 116 | return data as UserActiveStatistics 117 | } 118 | 119 | async getUserStatisticsSolves(uid: number): Promise { 120 | const endpoint = `user/${uid}/statistics/solves/` 121 | const [code, data] = await this.client._get(endpoint) 122 | 123 | if (code !== SUCCESS) { 124 | throw getException(code) 125 | } 126 | 127 | return data as UserSolvesStatistics[] 128 | } 129 | 130 | async getUserStatisticsRating(uid: number): Promise { 131 | const endpoint = `user/${uid}/statistics/rating/` 132 | const [code, data] = await this.client._get(endpoint) 133 | 134 | if (code !== SUCCESS) { 135 | throw getException(code) 136 | } 137 | 138 | return data as UserRatingStatistics[] 139 | } 140 | 141 | async getUserStatisticsRadar(uid: number): Promise { 142 | const endpoint = `user/${uid}/statistics/radar/` 143 | const [code, data] = await this.client._get(endpoint) 144 | 145 | if (code !== SUCCESS) { 146 | throw getException(code) 147 | } 148 | 149 | return data as UserRadarStatistics[] 150 | } 151 | 152 | async getUserArticleList(uid: number, page: number, size: number): Promise<{ articles: Article[]; total: number }> { 153 | const endpoint = `user/${uid}/article/list/${page}/${size}/` 154 | const [code, data] = await this.client._get(endpoint) 155 | 156 | if (code !== SUCCESS) { 157 | throw getException(code) 158 | } 159 | 160 | return data as { articles: Article[]; total: number } 161 | } 162 | 163 | async getUserFollowingList(uid: number, page: number, size: number): Promise { 164 | const endpoint = `user/${uid}/following/list/${page}/${size}/` 165 | const [code, data] = await this.client._get(endpoint) 166 | 167 | if (code !== SUCCESS) { 168 | throw getException(code) 169 | } 170 | 171 | return data as UserFollowing[] 172 | } 173 | 174 | async getUserFollowerList(uid: number, page: number, size: number): Promise { 175 | const endpoint = `user/${uid}/follower/list/${page}/${size}/` 176 | const [code, data] = await this.client._get(endpoint) 177 | 178 | if (code !== SUCCESS) { 179 | throw getException(code) 180 | } 181 | 182 | return data as UserFollowing[] 183 | } 184 | 185 | async getUserPicturebedUsed(): Promise { 186 | const endpoint = `user/picturebed/used/` 187 | const [code, data] = await this.client._get(endpoint) 188 | 189 | if (code !== SUCCESS) { 190 | throw getException(code) 191 | } 192 | 193 | return data as UserPicturebedUsed 194 | } 195 | 196 | async getUserPicturebedList(page: number, size: number): Promise<{ pictures: UserPicture[]; total: number }> { 197 | const endpoint = `user/picturebed/list/${page}/${size}/` 198 | const [code, data] = await this.client._get(endpoint) 199 | 200 | if (code !== SUCCESS) { 201 | throw getException(code) 202 | } 203 | 204 | return data as { pictures: UserPicture[]; total: number } 205 | } 206 | 207 | async postUserPicturebedUpload(filename: string, filepath: string): Promise { 208 | const form = new FormData() 209 | form.append('image', fs.createReadStream(filepath) as any, filename) 210 | 211 | const [code, data] = await this.client._post('user/picturebed/upload/', form) 212 | 213 | if (code !== SUCCESS) { 214 | throw getException(code) 215 | } 216 | 217 | return data as UserPicture 218 | } 219 | 220 | async postUserPicturebedDownload(pid: number): Promise { 221 | const endpoint = `user/picturebed/${pid}/download/` 222 | const res = await this.client._post(endpoint, null, false) 223 | 224 | if (res.headers['Content-Type'] !== 'application/octet-stream') { 225 | throw getException(JSON.parse(res.data).code) 226 | } 227 | return new Blob([res.data]) 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /src/lib/balderich/utils/code.ts: -------------------------------------------------------------------------------- 1 | export const SUCCESS = 10000 2 | export const AUTH_NONE = 10001 3 | export const AUTH_NOT_EXIST = 10002 4 | export const AUTH_ERROR_SIGN = 10003 5 | export const AUTH_TIMEOUT = 10004 6 | export const AUTH_CALC_ERROR = 10005 7 | export const AUTH_REQUEST_FAST = 10006 8 | export const REQUEST_PARAM_INVALID = 10007 9 | 10 | export const USER_NOT_EXIST = 11001 11 | export const USER_CLOSE_FOLLOW = 11002 12 | export const USER_IMAGE_NONE = 11003 13 | export const USER_IMAGE_FORMAT_ERROR = 11004 14 | export const USER_IMAGE_OPEN_ERROR = 11005 15 | export const USER_MEMORY_NOT_ENOUGH = 11006 16 | export const USER_IMAGE_NOT_EXIST = 11007 17 | 18 | export const PROBLEM_NOT_EXIST = 12001 19 | export const PROBLEM_PERMISSION_DENIED = 12002 20 | export const PROBLEM_SHEET_NOT_EXIST = 12101 21 | export const PROBLEM_SHEET_PERMISSION_DENIED = 12102 22 | 23 | export const CONTEST_NOT_EXIST = 13001 24 | export const CONTEST_PERMISSION_DENIED = 13002 25 | 26 | export const TEAM_NOT_EXIST = 14001 27 | export const TEAM_PERMISSION_DENIED = 14002 28 | export const TEAM_NO_MEMBER = 14003 29 | export const TEAM_METHOD_PERMISSION_DENIED = 14003 30 | export const TEAM_PROBLEM_NOT_EXIST = 14101 31 | export const TEAM_PROBLEM_PERMISSION_DENIED = 14102 32 | export const TEAM_CONTEST_NOT_EXIST = 14201 33 | export const TEAM_CONTEST_PERMISSION_DENIED = 14202 34 | -------------------------------------------------------------------------------- /src/lib/balderich/utils/exceptions.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AUTH_CALC_ERROR, 3 | AUTH_ERROR_SIGN, 4 | AUTH_NONE, 5 | AUTH_NOT_EXIST, 6 | AUTH_REQUEST_FAST, 7 | AUTH_TIMEOUT, 8 | CONTEST_NOT_EXIST, 9 | CONTEST_PERMISSION_DENIED, 10 | PROBLEM_NOT_EXIST, 11 | PROBLEM_PERMISSION_DENIED, 12 | PROBLEM_SHEET_NOT_EXIST, 13 | PROBLEM_SHEET_PERMISSION_DENIED, 14 | REQUEST_PARAM_INVALID, 15 | TEAM_CONTEST_NOT_EXIST, 16 | TEAM_CONTEST_PERMISSION_DENIED, 17 | TEAM_METHOD_PERMISSION_DENIED, 18 | TEAM_NOT_EXIST, 19 | TEAM_NO_MEMBER, 20 | TEAM_PERMISSION_DENIED, 21 | TEAM_PROBLEM_NOT_EXIST, 22 | TEAM_PROBLEM_PERMISSION_DENIED, 23 | USER_CLOSE_FOLLOW, 24 | USER_IMAGE_FORMAT_ERROR, 25 | USER_IMAGE_NONE, 26 | USER_IMAGE_NOT_EXIST, 27 | USER_IMAGE_OPEN_ERROR, 28 | USER_MEMORY_NOT_ENOUGH, 29 | USER_NOT_EXIST, 30 | } from './code' 31 | 32 | class AuthNoneException extends Error {} 33 | class AuthNotExistException extends Error {} 34 | class AuthErrorSignException extends Error {} 35 | class AuthTimeoutException extends Error {} 36 | class AuthCalcErrorException extends Error {} 37 | class AuthRequestFastException extends Error {} 38 | class RequestParamInvalidException extends Error {} 39 | 40 | class UserNotExistException extends Error {} 41 | class UserCloseFollowException extends Error {} 42 | class UserImageNoneException extends Error {} 43 | class UserImageFormatErrorException extends Error {} 44 | class UserImageOpenErrorException extends Error {} 45 | class UserMemoryNotEnoughException extends Error {} 46 | class UserImageNotExistException extends Error {} 47 | 48 | class ProblemNotExistException extends Error {} 49 | class ProblemPermissionDeniedException extends Error {} 50 | class ProblemSheetNotExistException extends Error {} 51 | class ProblemSheetPermissionDeniedException extends Error {} 52 | 53 | class ContestNotExistException extends Error {} 54 | class ContestPermissionDeniedException extends Error {} 55 | 56 | class TeamNotExistException extends Error {} 57 | class TeamPermissionDeniedException extends Error {} 58 | class TeamNoMemberException extends Error {} 59 | class TeamMethodPermissionDeniedException extends Error {} 60 | class TeamProblemNotExistException extends Error {} 61 | class TeamProblemPermissionDeniedException extends Error {} 62 | class TeamContestNotExistException extends Error {} 63 | class TeamContestPermissionDeniedException extends Error {} 64 | 65 | export const getException = (code: number, msg: string = '') => { 66 | if (code === AUTH_NONE) { 67 | return new AuthNoneException(msg) 68 | } else if (code === AUTH_NOT_EXIST) { 69 | return new AuthNotExistException(msg) 70 | } else if (code === AUTH_ERROR_SIGN) { 71 | return new AuthErrorSignException(msg) 72 | } else if (code === AUTH_TIMEOUT) { 73 | return new AuthTimeoutException(msg) 74 | } else if (code === AUTH_CALC_ERROR) { 75 | return new AuthCalcErrorException(msg) 76 | } else if (code === AUTH_REQUEST_FAST) { 77 | return new AuthRequestFastException(msg) 78 | } else if (code === REQUEST_PARAM_INVALID) { 79 | return new RequestParamInvalidException(msg) 80 | } else if (code === USER_NOT_EXIST) { 81 | return new UserNotExistException(msg) 82 | } else if (code === USER_CLOSE_FOLLOW) { 83 | return new UserCloseFollowException(msg) 84 | } else if (code === USER_IMAGE_NONE) { 85 | return new UserImageNoneException(msg) 86 | } else if (code === USER_IMAGE_FORMAT_ERROR) { 87 | return new UserImageFormatErrorException(msg) 88 | } else if (code === USER_IMAGE_OPEN_ERROR) { 89 | return new UserImageOpenErrorException(msg) 90 | } else if (code === USER_MEMORY_NOT_ENOUGH) { 91 | return new UserMemoryNotEnoughException(msg) 92 | } else if (code === USER_IMAGE_NOT_EXIST) { 93 | return new UserImageNotExistException(msg) 94 | } else if (code === PROBLEM_NOT_EXIST) { 95 | return new ProblemNotExistException(msg) 96 | } else if (code === PROBLEM_PERMISSION_DENIED) { 97 | return new ProblemPermissionDeniedException(msg) 98 | } else if (code === PROBLEM_SHEET_NOT_EXIST) { 99 | return new ProblemSheetNotExistException(msg) 100 | } else if (code === PROBLEM_SHEET_PERMISSION_DENIED) { 101 | return new ProblemSheetPermissionDeniedException(msg) 102 | } else if (code === CONTEST_NOT_EXIST) { 103 | return new ContestNotExistException(msg) 104 | } else if (code === CONTEST_PERMISSION_DENIED) { 105 | return new ContestPermissionDeniedException(msg) 106 | } else if (code === TEAM_NOT_EXIST) { 107 | return new TeamNotExistException(msg) 108 | } else if (code === TEAM_PERMISSION_DENIED) { 109 | return new TeamPermissionDeniedException(msg) 110 | } else if (code === TEAM_NO_MEMBER) { 111 | return new TeamNoMemberException(msg) 112 | } else if (code === TEAM_METHOD_PERMISSION_DENIED) { 113 | return new TeamMethodPermissionDeniedException(msg) 114 | } else if (code === TEAM_PROBLEM_NOT_EXIST) { 115 | return new TeamProblemNotExistException(msg) 116 | } else if (code === TEAM_PROBLEM_PERMISSION_DENIED) { 117 | return new TeamProblemPermissionDeniedException(msg) 118 | } else if (code === TEAM_CONTEST_NOT_EXIST) { 119 | return new TeamContestNotExistException(msg) 120 | } else if (code === TEAM_CONTEST_PERMISSION_DENIED) { 121 | return new TeamContestPermissionDeniedException(msg) 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /src/model/CodeModel.ts: -------------------------------------------------------------------------------- 1 | import { MessageItem } from "vscode"; 2 | 3 | export const MessageItemObj: MessageItem = { 4 | title: "", 5 | isCloseAffordance: false, 6 | }; 7 | 8 | export const DialogOptions = { 9 | open: Object.assign({}, MessageItemObj, { title: '打开' }), 10 | yes: Object.assign({}, MessageItemObj, { title: "是" }), 11 | cancel: Object.assign({}, MessageItemObj, { title: "取消", isCloseAffordance: true,}), 12 | never: Object.assign({}, MessageItemObj, { title: "从不" }), 13 | singUp: Object.assign({}, MessageItemObj, { title: "注册" }), 14 | } -------------------------------------------------------------------------------- /src/model/ProblemNodeModel.ts: -------------------------------------------------------------------------------- 1 | import { Command } from "vscode"; 2 | import locale from "../i18n/locale"; 3 | 4 | export interface Problem { 5 | id: number|string, 6 | title: string, 7 | point: number, 8 | solved: number, 9 | level: number, 10 | tags: string[], 11 | isLike: boolean, 12 | isOpen: boolean 13 | } 14 | 15 | export enum ProblemCategory { 16 | ALL = '0', 17 | 类型 = '1', 18 | 难度 = '2', 19 | 比赛 = '3', 20 | 收藏 = '4', 21 | } 22 | 23 | export enum ProblemDifficulty { 24 | 入门 = '0', 25 | 简单 = '1', 26 | 中等 = '2', 27 | 困难 = '3', 28 | } 29 | 30 | export enum ProblemSource { 31 | ALL = '0', 32 | NSS = '1', 33 | PRIZE = '2', 34 | CISCN = '3', 35 | 公开赛 = '4', 36 | SWPU = '5', 37 | 线下赛 = '6' 38 | } 39 | 40 | export enum ProblemType { 41 | ALL = '0', 42 | WEB = '1', 43 | PWN = '2', 44 | REVERSE = '3', 45 | CRYPTO = '4', 46 | MISC = '5', 47 | MOBILE = '6', 48 | ETH = '7', 49 | IOT = '8', 50 | AI = '9', 51 | REAL = '10', 52 | } 53 | 54 | export class ProblemNodeModel { 55 | constructor(public data: Problem, public isLeafNode: boolean = true) {} 56 | 57 | public get id(): number|string { return this.data.id; } 58 | public get title(): string { return this.data.title; } 59 | public get point(): number { return this.data.point; } 60 | public get difficulty(): string { 61 | if (this.data.point == 1) { 62 | return 'E'; 63 | } 64 | if (this.data.solved > 100 || this.data.level < 1.5) { return 'E'; } 65 | return ['E', 'M', 'H'][Math.round(this.data.level / 2)]; 66 | } 67 | public get tags(): string[] { return this.data.tags;} 68 | public get isLeaf(): boolean { return this.isLeafNode; } 69 | public get isLike(): boolean { return this.data.isLike; } 70 | 71 | public get command(): Command { 72 | return { 73 | title: locale['problemNodeModelCommandTitle'], 74 | command: 'nssctf.previewProblem', 75 | arguments: [this] 76 | } 77 | } 78 | } 79 | 80 | export const defaultProblem: Problem = { 81 | id: 0, 82 | title: '', 83 | point: 0, 84 | solved: 0, 85 | level: .0, 86 | tags: [], 87 | isLike: false, 88 | isOpen: false 89 | } -------------------------------------------------------------------------------- /src/provider/ProblemProvider.ts: -------------------------------------------------------------------------------- 1 | import { CancellationToken, Event, EventEmitter, ProviderResult, TreeDataProvider, TreeItem, TreeItemCollapsibleState } from "vscode"; 2 | import { userStore } from "../store/UserStore"; 3 | import { ProblemNodeModel, defaultProblem,Problem, ProblemCategory, ProblemSource, ProblemType, ProblemDifficulty } from "../model/ProblemNodeModel"; 4 | import locale from "../i18n/locale"; 5 | 6 | class ProblemProvider implements TreeDataProvider { 7 | private onDidChangeTreeDataEvent: EventEmitter = new EventEmitter(); 8 | readonly onDidChangeTreeData = this.onDidChangeTreeDataEvent.event; 9 | // public initialize() { 10 | 11 | // } 12 | 13 | getTreeItem(element: any): TreeItem | Thenable { 14 | if (element.id === 'notLogin') { 15 | return { 16 | label: element.title, 17 | collapsibleState: TreeItemCollapsibleState.None, 18 | command: { 19 | command: 'nssctf.signIn', 20 | title: '未登录' 21 | } 22 | } 23 | } 24 | return { 25 | label: element.isLeaf 26 | ? `PID:${element.id}. ${element.title}` 27 | : element.title, 28 | collapsibleState: element.isLeaf 29 | ? TreeItemCollapsibleState.None 30 | : TreeItemCollapsibleState.Collapsed, 31 | // iconPath: 32 | command: element.command, 33 | resourceUri: element.uri, 34 | contextValue: element.isLeaf 35 | ? `problem${['', '-like'][element.isLike+0]}` 36 | : undefined 37 | } 38 | } 39 | getChildren(element?: ProblemNodeModel | undefined): ProviderResult { 40 | if (!userStore.isLogin()) { 41 | return [ 42 | new ProblemNodeModel( 43 | Object.assign({}, defaultProblem, { 44 | id: 'notLogin', 45 | title: locale['notLoginNodeName'] 46 | }) 47 | ) 48 | ] 49 | } 50 | 51 | let res = []; 52 | 53 | if (!element) { // 根节点 54 | for (let type in ProblemCategory) { 55 | res.push(new ProblemNodeModel( 56 | Object.assign({}, defaultProblem, { 57 | id: `${type}`, 58 | title: type 59 | }), 60 | false, 61 | )) 62 | } 63 | } else if (element.isLeaf) { 64 | return []; 65 | } else { 66 | switch (element.id) { 67 | case ProblemCategory.ALL: 68 | return this.getAllNodes(); 69 | case ProblemCategory.类型: 70 | for (let type in ProblemType) { 71 | res.push(new ProblemNodeModel( 72 | Object.assign({}, defaultProblem, { 73 | id: `${element.id}.${type}`, 74 | title: type 75 | }), 76 | false, 77 | )) 78 | } 79 | break; 80 | case ProblemCategory.难度: 81 | for (let type in ProblemDifficulty) { 82 | res.push(new ProblemNodeModel( 83 | Object.assign({}, defaultProblem, { 84 | id: `${element.id}.${type}`, 85 | title: type 86 | }), 87 | false, 88 | )) 89 | } 90 | break; 91 | case ProblemCategory.比赛: 92 | return this.getContestNodes(); 93 | case ProblemCategory.收藏: 94 | return this.getLikeNodes(); 95 | default: 96 | return this.getChildrenNodes(element); 97 | } 98 | } 99 | 100 | return res; 101 | } 102 | getAllNodes(): ProviderResult { 103 | throw new Error("Method not implemented."); 104 | } 105 | getContestNodes(): ProviderResult { 106 | throw new Error("Method not implemented."); 107 | } 108 | getLikeNodes(): ProviderResult { 109 | throw new Error("Method not implemented."); 110 | } 111 | 112 | public async refresh(): Promise { 113 | this.onDidChangeTreeDataEvent.fire(null); 114 | } 115 | 116 | getRootNodes():Problem[] { 117 | throw new Error("Method not implemented."); 118 | } 119 | 120 | getChildrenNodes(element: ProblemNodeModel): ProviderResult { 121 | throw Error() 122 | } 123 | } 124 | 125 | export const problemProvider: ProblemProvider = new ProblemProvider(); -------------------------------------------------------------------------------- /src/service/UserService.ts: -------------------------------------------------------------------------------- 1 | import { ConfigurationTarget } from "vscode"; 2 | import { NSSClient } from "../lib/balderich"; 3 | import { mainStore } from "../store/MainStore"; 4 | import { output } from "../util/CodeUtil"; 5 | import { getVsCodeConfig } from "../util/ConfigUtil"; 6 | 7 | class UserService { 8 | public async getUserInfo() { 9 | if (!mainStore.client) return null; 10 | 11 | return mainStore.client.user.getSelfInfo(); 12 | } 13 | 14 | public async signIn(key: string, secret: string) { 15 | const _client = new NSSClient(null, key, secret); 16 | try { 17 | _client.user.getSelfInfo(); 18 | } catch (error: any) { 19 | output.appendLine(error.toString()); 20 | return false; 21 | } 22 | 23 | getVsCodeConfig().update('api.key', key, ConfigurationTarget.Global); 24 | getVsCodeConfig().update('api.secret', secret, ConfigurationTarget.Global); 25 | mainStore.client = _client; 26 | return true; 27 | } 28 | } 29 | 30 | export const userService: UserService = new UserService(); -------------------------------------------------------------------------------- /src/store/MainStore.ts: -------------------------------------------------------------------------------- 1 | import { ExtensionContext, Uri } from "vscode"; 2 | import { NSSClient } from "../lib/balderich"; 3 | import * as sutils from '../util/SystemUtil'; 4 | 5 | class MainStore { 6 | context = null as null|ExtensionContext 7 | cachePath = null as null|Uri 8 | client = null as null|NSSClient 9 | 10 | constructor() { 11 | sutils.init(); 12 | } 13 | } 14 | 15 | export const mainStore: MainStore = new MainStore(); -------------------------------------------------------------------------------- /src/store/UserStore.ts: -------------------------------------------------------------------------------- 1 | import { event } from "../event"; 2 | import { userService } from "../service/UserService"; 3 | 4 | class UserStore { 5 | private uid: number | undefined 6 | private username: string | undefined; 7 | private email: string | undefined; 8 | private status: boolean = false // 登录状态 9 | 10 | public async updateLoginStatus() { 11 | try { 12 | const res = await userService.getUserInfo(); 13 | 14 | if (res) { 15 | this.parseUserInfo(res); 16 | } 17 | } finally { 18 | event.emit("userInfoUpdate"); 19 | } 20 | } 21 | 22 | public parseUserInfo(info: Record) { 23 | this.uid = info.uid || this.uid; 24 | this.username = info.username || this.username; 25 | this.email = info.email || this.email; 26 | 27 | if (this.uid) { 28 | this.status = true; 29 | } 30 | } 31 | 32 | public isLogin() { 33 | return this.status; 34 | } 35 | 36 | public async signIn(key: string, secret: string) { 37 | const flag = await userService.signIn(key, secret); 38 | if (flag) { 39 | this.updateLoginStatus(); 40 | } 41 | return flag; 42 | } 43 | } 44 | 45 | export const userStore: UserStore = new UserStore(); -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | import { runTests } from '@vscode/test-electron'; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 10 | 11 | // The path to test runner 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 17 | } catch (err) { 18 | console.error('Failed to run tests', err); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | main(); 24 | -------------------------------------------------------------------------------- /src/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | 3 | // You can import and use all API from the 'vscode' module 4 | // as well as import your extension to test it 5 | import * as vscode from 'vscode'; 6 | // import * as myExtension from '../../extension'; 7 | 8 | suite('Extension Test Suite', () => { 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | test('Sample test', () => { 12 | assert.strictEqual(-1, [1, 2, 3].indexOf(5)); 13 | assert.strictEqual(-1, [1, 2, 3].indexOf(0)); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as Mocha from 'mocha'; 3 | import * as glob from 'glob'; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | ui: 'tdd', 9 | color: true 10 | }); 11 | 12 | const testsRoot = path.resolve(__dirname, '..'); 13 | 14 | return new Promise((c, e) => { 15 | glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { 16 | if (err) { 17 | return e(err); 18 | } 19 | 20 | // Add files to the test suite 21 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 22 | 23 | try { 24 | // Run the mocha test 25 | mocha.run(failures => { 26 | if (failures > 0) { 27 | e(new Error(`${failures} tests failed.`)); 28 | } else { 29 | c(); 30 | } 31 | }); 32 | } catch (err) { 33 | console.error(err); 34 | e(err); 35 | } 36 | }); 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /src/util/CacheUtil.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as fs from 'fs'; 3 | import { getCacheDir } from "./SystemUtil"; 4 | 5 | export const getCacheFilePath = (name: string) => { 6 | return path.join(getCacheDir(), `${name}.json`); 7 | } 8 | 9 | export const getCache = (name: string) => { 10 | const filepath = getCacheFilePath(name); 11 | if (!fs.existsSync(filepath)) return null; 12 | 13 | return JSON.parse(fs.readFileSync(filepath).toString()); 14 | } 15 | 16 | export const setCache = (name: string, value: Object) => { 17 | const filepath = getCacheFilePath(name); 18 | 19 | fs.writeFileSync(filepath, JSON.stringify(value)); 20 | } 21 | 22 | export const delCache = (name: string) => { 23 | const filepath = getCacheFilePath(name); 24 | if (fs.existsSync(filepath)) { 25 | fs.unlinkSync(filepath); 26 | } 27 | } -------------------------------------------------------------------------------- /src/util/CodeUtil.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscode from 'vscode'; 3 | import * as fs from 'fs'; 4 | import { spawn } from 'child_process'; 5 | import { locale } from '../i18n'; 6 | import { DialogOptions } from '../model/CodeModel'; 7 | 8 | // 获取目前选中 9 | export const getSelections = (): readonly vscode.Selection[] | null => { 10 | let editor = vscode.window.activeTextEditor; 11 | return editor ? editor.selections : null; 12 | } 13 | 14 | // from https://github.com/imlinhanchao/vsc-markdown-image/blob/master/src/lib/utils.ts#L249 15 | export const getPasteImage = (savePath: string): Promise => { 16 | return new Promise((resolve, reject) => { 17 | let platform = process.platform; 18 | 19 | if (platform === 'win32') { // Windows 20 | const scriptPath = path.join(__dirname, '..', '..', 'assets', 'scripts', 'paste.ps1'); 21 | 22 | let command = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"; 23 | let powershellExisted = fs.existsSync(command); 24 | 25 | if (!powershellExisted) { 26 | command = "powershell"; 27 | }; 28 | 29 | let output = ''; 30 | 31 | const powershell = spawn(command, [ 32 | '-noprofile', 33 | '-noninteractive', 34 | '-nologo', 35 | '-sta', 36 | '-executionpolicy', 'unrestricted', 37 | '-windowstyle', 'hidden', 38 | '-file', scriptPath, 39 | savePath 40 | ]); 41 | 42 | // the powershell can't auto exit in windows 7 . 43 | let timer = setTimeout(() => powershell.kill(), 2000); 44 | 45 | powershell.on('error', (e: any) => { 46 | if (e.code === 'ENOENT') { 47 | vscode.window.showErrorMessage(locale['powershell_not_found']); 48 | } else { 49 | vscode.window.showErrorMessage(e); 50 | } 51 | }); 52 | 53 | powershell.stdout.on('data', (data) => { 54 | data.toString().split('\n').forEach((d: string | string[]) => output += (d.indexOf('Active code page:') < 0 ? d + '\n' : '')); 55 | clearTimeout(timer); 56 | console.log(data.toString()) 57 | timer = setTimeout(() => powershell.kill(), 2000); 58 | }); 59 | powershell.on('close', (code) => { 60 | resolve(output.trim().split('\n').map(i => i.trim())); 61 | }); 62 | } else if (platform === 'darwin') { // Mac 63 | let scriptPath = path.join(__dirname, '..', '..', 'assets', 'script', 'paste.applescript'); 64 | 65 | let ascript = spawn('osascript', [scriptPath, savePath]); 66 | ascript.on('error', (e: any) => { 67 | vscode.window.showErrorMessage(e); 68 | }); 69 | ascript.stdout.on('data', (data) => { 70 | resolve(data.toString().trim().split('\n')); 71 | }); 72 | } else { 73 | // Linux 74 | 75 | let scriptPath = path.join(__dirname, '..', '..', 'assets', 'script', 'paste.sh'); 76 | 77 | let ascript = spawn('sh', [scriptPath, savePath]); 78 | ascript.on('error', (e: any) => { 79 | vscode.window.showErrorMessage(e); 80 | }); 81 | ascript.stdout.on('data', (data) => { 82 | let result = data.toString().trim(); 83 | if (result === "no xclip") { 84 | vscode.window.showInformationMessage(locale['install_xclip']); 85 | return; 86 | } 87 | let match = decodeURI(result).trim().match(/((\/[^\/]+)+\/[^\/]*?\.(jpg|jpeg|gif|bmp|png))/g); 88 | resolve(match || []); 89 | }); 90 | } 91 | }) 92 | } 93 | 94 | export const editorEdit = async (selection: vscode.Selection | vscode.Position | undefined | null, text: string): Promise => { 95 | return new Promise((resolve, reject) => { 96 | vscode.window.activeTextEditor?.edit(e => { 97 | if (selection) { 98 | e.replace(selection, text); 99 | } 100 | }).then(resolve); 101 | }); 102 | } 103 | 104 | export const openUrl = async (url: string): Promise => { 105 | vscode.commands.executeCommand("vscode.open", vscode.Uri.parse(url)); 106 | } 107 | 108 | export const showProgress = () => { 109 | let show = true; 110 | vscode.window.withProgress({ 111 | location: vscode.ProgressLocation.Window, 112 | title: locale['imagePasteUploadProgressTitle'], 113 | cancellable: false, 114 | }, (progress, token) => { 115 | return new Promise(resolve => { 116 | let timer = setInterval(() => { 117 | if (show) { return; } 118 | clearInterval(timer); 119 | resolve(show); 120 | }, 200) 121 | }); 122 | }); 123 | 124 | return () => show = false; 125 | } 126 | 127 | export const signInNotify = async () => { 128 | const choice: vscode.MessageItem | undefined = await vscode.window.showInformationMessage( 129 | locale['no_api'], 130 | DialogOptions.yes, 131 | DialogOptions.cancel, 132 | DialogOptions.singUp 133 | ); 134 | 135 | switch (choice) { 136 | case DialogOptions.yes: 137 | await vscode.commands.executeCommand('nssctf.signIn');break; 138 | case DialogOptions.singUp: 139 | openUrl(locale['NSSCTF_URL']);break; 140 | default: 141 | break 142 | } 143 | } 144 | 145 | class Output implements vscode.Disposable { 146 | private readonly channel: vscode.OutputChannel = vscode.window.createOutputChannel("NSSCTF"); 147 | 148 | public appendLine(message: string) { 149 | this.channel.appendLine(message); 150 | } 151 | 152 | public append(message: string): void { 153 | this.channel.append(message); 154 | } 155 | 156 | public show(): void { 157 | this.channel.show(); 158 | } 159 | public dispose(): void { 160 | this.channel.dispose(); 161 | } 162 | } 163 | 164 | export const output: Output = new Output(); -------------------------------------------------------------------------------- /src/util/ConfigUtil.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceConfiguration, workspace } from "vscode"; 2 | 3 | export const getVsCodeConfig = (): WorkspaceConfiguration => { 4 | return workspace.getConfiguration("nssctf"); 5 | } 6 | 7 | export const getTempFolderName = (): string => { 8 | return getVsCodeConfig().get("tempFolderName", "tmp"); 9 | } 10 | 11 | export const getBalderichAPI = (): Record<'key'|'secret',string> => { 12 | const key = getVsCodeConfig().get('api.key', ''); 13 | const secret = getVsCodeConfig().get('api.secret', ''); 14 | 15 | return { 16 | key: key, 17 | secret: secret 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /src/util/DecoratorUtil.ts: -------------------------------------------------------------------------------- 1 | import { userStore } from "../store/UserStore" 2 | import * as cutils from '../util/CodeUtil' ; 3 | 4 | export const requireLogin = () => { 5 | return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) { 6 | const org = descriptor.value; 7 | 8 | descriptor.value = function (...args: any[]) { 9 | if (!userStore.isLogin()) { 10 | cutils.signInNotify(); 11 | } else { 12 | org.call(this, ...args); 13 | } 14 | } 15 | } 16 | } 17 | 18 | export const exceptionCatch = () => { 19 | return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) { 20 | const org = descriptor.value; 21 | 22 | descriptor.value = function (...args: any[]) { 23 | let results; 24 | try { 25 | results = org.call(this, ...args); 26 | } catch (error: any) { 27 | cutils.output.appendLine(error.toString()); 28 | } 29 | return results; 30 | }; 31 | return descriptor; 32 | } 33 | } -------------------------------------------------------------------------------- /src/util/SystemUtil.ts: -------------------------------------------------------------------------------- 1 | import { homedir, tmpdir } from 'os'; 2 | import * as fs from 'fs'; 3 | import { getTempFolderName } from './ConfigUtil'; 4 | import * as path from 'path'; 5 | 6 | 7 | export const getUserHomeDir = () => { 8 | return homedir(); 9 | } 10 | 11 | export const getHomeDir = () => { 12 | return path.join(getUserHomeDir(), '.nssctf'); 13 | } 14 | 15 | export const init = () => { 16 | if (!fs.existsSync(getHomeDir())) { fs.mkdirSync(getHomeDir()); } 17 | } 18 | 19 | export const getTempDir = () => { 20 | let tmpPath = path.join(getHomeDir(), getTempFolderName()); 21 | if (!fs.existsSync(tmpPath)) { fs.mkdirSync(tmpPath); } 22 | return tmpPath; 23 | } 24 | 25 | export const getCacheDir = () => { 26 | return path.join(getHomeDir(), "cache"); 27 | } 28 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2020", 5 | "outDir": "out", 6 | "lib": [ 7 | "ES2020", 8 | ], 9 | "sourceMap": true, 10 | "experimentalDecorators": true, 11 | "rootDir": "src", 12 | "strict": true /* enable all strict type-checking options */ 13 | /* Additional Checks */ 14 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 15 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 16 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@eslint-community/eslint-utils@^4.2.0": 6 | version "4.4.0" 7 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 8 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 9 | dependencies: 10 | eslint-visitor-keys "^3.3.0" 11 | 12 | "@eslint-community/regexpp@^4.4.0": 13 | version "4.5.1" 14 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" 15 | integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== 16 | 17 | "@eslint/eslintrc@^2.0.3": 18 | version "2.0.3" 19 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" 20 | integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== 21 | dependencies: 22 | ajv "^6.12.4" 23 | debug "^4.3.2" 24 | espree "^9.5.2" 25 | globals "^13.19.0" 26 | ignore "^5.2.0" 27 | import-fresh "^3.2.1" 28 | js-yaml "^4.1.0" 29 | minimatch "^3.1.2" 30 | strip-json-comments "^3.1.1" 31 | 32 | "@eslint/js@8.40.0": 33 | version "8.40.0" 34 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec" 35 | integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA== 36 | 37 | "@humanwhocodes/config-array@^0.11.8": 38 | version "0.11.8" 39 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" 40 | integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== 41 | dependencies: 42 | "@humanwhocodes/object-schema" "^1.2.1" 43 | debug "^4.1.1" 44 | minimatch "^3.0.5" 45 | 46 | "@humanwhocodes/module-importer@^1.0.1": 47 | version "1.0.1" 48 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 49 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 50 | 51 | "@humanwhocodes/object-schema@^1.2.1": 52 | version "1.2.1" 53 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 54 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 55 | 56 | "@nodelib/fs.scandir@2.1.5": 57 | version "2.1.5" 58 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 59 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 60 | dependencies: 61 | "@nodelib/fs.stat" "2.0.5" 62 | run-parallel "^1.1.9" 63 | 64 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 65 | version "2.0.5" 66 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 67 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 68 | 69 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 70 | version "1.2.8" 71 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 72 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 73 | dependencies: 74 | "@nodelib/fs.scandir" "2.1.5" 75 | fastq "^1.6.0" 76 | 77 | "@tootallnate/once@1": 78 | version "1.1.2" 79 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" 80 | integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== 81 | 82 | "@types/glob@^8.1.0": 83 | version "8.1.0" 84 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" 85 | integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== 86 | dependencies: 87 | "@types/minimatch" "^5.1.2" 88 | "@types/node" "*" 89 | 90 | "@types/json-schema@^7.0.9": 91 | version "7.0.11" 92 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 93 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 94 | 95 | "@types/minimatch@^5.1.2": 96 | version "5.1.2" 97 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" 98 | integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== 99 | 100 | "@types/mocha@^10.0.1": 101 | version "10.0.1" 102 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" 103 | integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== 104 | 105 | "@types/node@*": 106 | version "20.1.5" 107 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.1.5.tgz#e94b604c67fc408f215fcbf3bd84d4743bf7f710" 108 | integrity sha512-IvGD1CD/nego63ySR7vrAKEX3AJTcmrAN2kn+/sDNLi1Ff5kBzDeEdqWDplK+0HAEoLYej137Sk0cUU8OLOlMg== 109 | 110 | "@types/node@16.x": 111 | version "16.18.30" 112 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.30.tgz#4a2c426370712a10c630a55ba086c55c17ca54e0" 113 | integrity sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ== 114 | 115 | "@types/semver@^7.3.12": 116 | version "7.5.0" 117 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" 118 | integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== 119 | 120 | "@types/vscode@^1.78.0": 121 | version "1.78.0" 122 | resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.78.0.tgz#b5600abce8855cf21fb32d0857bcd084b1f83069" 123 | integrity sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA== 124 | 125 | "@typescript-eslint/eslint-plugin@^5.59.1": 126 | version "5.59.6" 127 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz#a350faef1baa1e961698240f922d8de1761a9e2b" 128 | integrity sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw== 129 | dependencies: 130 | "@eslint-community/regexpp" "^4.4.0" 131 | "@typescript-eslint/scope-manager" "5.59.6" 132 | "@typescript-eslint/type-utils" "5.59.6" 133 | "@typescript-eslint/utils" "5.59.6" 134 | debug "^4.3.4" 135 | grapheme-splitter "^1.0.4" 136 | ignore "^5.2.0" 137 | natural-compare-lite "^1.4.0" 138 | semver "^7.3.7" 139 | tsutils "^3.21.0" 140 | 141 | "@typescript-eslint/parser@^5.59.1": 142 | version "5.59.6" 143 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.6.tgz#bd36f71f5a529f828e20b627078d3ed6738dbb40" 144 | integrity sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA== 145 | dependencies: 146 | "@typescript-eslint/scope-manager" "5.59.6" 147 | "@typescript-eslint/types" "5.59.6" 148 | "@typescript-eslint/typescript-estree" "5.59.6" 149 | debug "^4.3.4" 150 | 151 | "@typescript-eslint/scope-manager@5.59.6": 152 | version "5.59.6" 153 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz#d43a3687aa4433868527cfe797eb267c6be35f19" 154 | integrity sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ== 155 | dependencies: 156 | "@typescript-eslint/types" "5.59.6" 157 | "@typescript-eslint/visitor-keys" "5.59.6" 158 | 159 | "@typescript-eslint/type-utils@5.59.6": 160 | version "5.59.6" 161 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz#37c51d2ae36127d8b81f32a0a4d2efae19277c48" 162 | integrity sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ== 163 | dependencies: 164 | "@typescript-eslint/typescript-estree" "5.59.6" 165 | "@typescript-eslint/utils" "5.59.6" 166 | debug "^4.3.4" 167 | tsutils "^3.21.0" 168 | 169 | "@typescript-eslint/types@5.59.6": 170 | version "5.59.6" 171 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.6.tgz#5a6557a772af044afe890d77c6a07e8c23c2460b" 172 | integrity sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA== 173 | 174 | "@typescript-eslint/typescript-estree@5.59.6": 175 | version "5.59.6" 176 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz#2fb80522687bd3825504925ea7e1b8de7bb6251b" 177 | integrity sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA== 178 | dependencies: 179 | "@typescript-eslint/types" "5.59.6" 180 | "@typescript-eslint/visitor-keys" "5.59.6" 181 | debug "^4.3.4" 182 | globby "^11.1.0" 183 | is-glob "^4.0.3" 184 | semver "^7.3.7" 185 | tsutils "^3.21.0" 186 | 187 | "@typescript-eslint/utils@5.59.6": 188 | version "5.59.6" 189 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.6.tgz#82960fe23788113fc3b1f9d4663d6773b7907839" 190 | integrity sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg== 191 | dependencies: 192 | "@eslint-community/eslint-utils" "^4.2.0" 193 | "@types/json-schema" "^7.0.9" 194 | "@types/semver" "^7.3.12" 195 | "@typescript-eslint/scope-manager" "5.59.6" 196 | "@typescript-eslint/types" "5.59.6" 197 | "@typescript-eslint/typescript-estree" "5.59.6" 198 | eslint-scope "^5.1.1" 199 | semver "^7.3.7" 200 | 201 | "@typescript-eslint/visitor-keys@5.59.6": 202 | version "5.59.6" 203 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz#673fccabf28943847d0c8e9e8d008e3ada7be6bb" 204 | integrity sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q== 205 | dependencies: 206 | "@typescript-eslint/types" "5.59.6" 207 | eslint-visitor-keys "^3.3.0" 208 | 209 | "@vscode/test-electron@^2.3.0": 210 | version "2.3.2" 211 | resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.3.2.tgz#25db8d1a94e8274c27015cf806ae8b180c83545b" 212 | integrity sha512-CRfQIs5Wi5Ok5SUCC3PTvRRXa74LD43cSXHC8EuNlmHHEPaJa/AGrv76brcA1hVSxrdja9tiYwp95Lq8kwY0tw== 213 | dependencies: 214 | http-proxy-agent "^4.0.1" 215 | https-proxy-agent "^5.0.0" 216 | jszip "^3.10.1" 217 | semver "^7.3.8" 218 | 219 | acorn-jsx@^5.3.2: 220 | version "5.3.2" 221 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 222 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 223 | 224 | acorn@^8.8.0: 225 | version "8.8.2" 226 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" 227 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 228 | 229 | agent-base@6: 230 | version "6.0.2" 231 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 232 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 233 | dependencies: 234 | debug "4" 235 | 236 | ajv@^6.10.0, ajv@^6.12.4: 237 | version "6.12.6" 238 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 239 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 240 | dependencies: 241 | fast-deep-equal "^3.1.1" 242 | fast-json-stable-stringify "^2.0.0" 243 | json-schema-traverse "^0.4.1" 244 | uri-js "^4.2.2" 245 | 246 | ansi-colors@4.1.1: 247 | version "4.1.1" 248 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 249 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 250 | 251 | ansi-regex@^5.0.1: 252 | version "5.0.1" 253 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 254 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 255 | 256 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 257 | version "4.3.0" 258 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 259 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 260 | dependencies: 261 | color-convert "^2.0.1" 262 | 263 | anymatch@~3.1.2: 264 | version "3.1.3" 265 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 266 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 267 | dependencies: 268 | normalize-path "^3.0.0" 269 | picomatch "^2.0.4" 270 | 271 | argparse@^2.0.1: 272 | version "2.0.1" 273 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 274 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 275 | 276 | array-union@^2.1.0: 277 | version "2.1.0" 278 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 279 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 280 | 281 | asynckit@^0.4.0: 282 | version "0.4.0" 283 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 284 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 285 | 286 | axios@^1.4.0: 287 | version "1.4.0" 288 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" 289 | integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== 290 | dependencies: 291 | follow-redirects "^1.15.0" 292 | form-data "^4.0.0" 293 | proxy-from-env "^1.1.0" 294 | 295 | balanced-match@^1.0.0: 296 | version "1.0.2" 297 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 298 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 299 | 300 | binary-extensions@^2.0.0: 301 | version "2.2.0" 302 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 303 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 304 | 305 | brace-expansion@^1.1.7: 306 | version "1.1.11" 307 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 308 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 309 | dependencies: 310 | balanced-match "^1.0.0" 311 | concat-map "0.0.1" 312 | 313 | brace-expansion@^2.0.1: 314 | version "2.0.1" 315 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 316 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 317 | dependencies: 318 | balanced-match "^1.0.0" 319 | 320 | braces@^3.0.2, braces@~3.0.2: 321 | version "3.0.2" 322 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 323 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 324 | dependencies: 325 | fill-range "^7.0.1" 326 | 327 | browser-stdout@1.3.1: 328 | version "1.3.1" 329 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 330 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 331 | 332 | callsites@^3.0.0: 333 | version "3.1.0" 334 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 335 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 336 | 337 | camelcase@^6.0.0: 338 | version "6.3.0" 339 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 340 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 341 | 342 | chalk@^4.0.0, chalk@^4.1.0: 343 | version "4.1.2" 344 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 345 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 346 | dependencies: 347 | ansi-styles "^4.1.0" 348 | supports-color "^7.1.0" 349 | 350 | chokidar@3.5.3: 351 | version "3.5.3" 352 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 353 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 354 | dependencies: 355 | anymatch "~3.1.2" 356 | braces "~3.0.2" 357 | glob-parent "~5.1.2" 358 | is-binary-path "~2.1.0" 359 | is-glob "~4.0.1" 360 | normalize-path "~3.0.0" 361 | readdirp "~3.6.0" 362 | optionalDependencies: 363 | fsevents "~2.3.2" 364 | 365 | cliui@^7.0.2: 366 | version "7.0.4" 367 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 368 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 369 | dependencies: 370 | string-width "^4.2.0" 371 | strip-ansi "^6.0.0" 372 | wrap-ansi "^7.0.0" 373 | 374 | color-convert@^2.0.1: 375 | version "2.0.1" 376 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 377 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 378 | dependencies: 379 | color-name "~1.1.4" 380 | 381 | color-name@~1.1.4: 382 | version "1.1.4" 383 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 384 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 385 | 386 | combined-stream@^1.0.8: 387 | version "1.0.8" 388 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 389 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 390 | dependencies: 391 | delayed-stream "~1.0.0" 392 | 393 | concat-map@0.0.1: 394 | version "0.0.1" 395 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 396 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 397 | 398 | core-util-is@~1.0.0: 399 | version "1.0.3" 400 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 401 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 402 | 403 | cross-spawn@^7.0.2: 404 | version "7.0.3" 405 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 406 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 407 | dependencies: 408 | path-key "^3.1.0" 409 | shebang-command "^2.0.0" 410 | which "^2.0.1" 411 | 412 | debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: 413 | version "4.3.4" 414 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 415 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 416 | dependencies: 417 | ms "2.1.2" 418 | 419 | decamelize@^4.0.0: 420 | version "4.0.0" 421 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 422 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 423 | 424 | deep-is@^0.1.3: 425 | version "0.1.4" 426 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 427 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 428 | 429 | delayed-stream@~1.0.0: 430 | version "1.0.0" 431 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 432 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 433 | 434 | diff@5.0.0: 435 | version "5.0.0" 436 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 437 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 438 | 439 | dir-glob@^3.0.1: 440 | version "3.0.1" 441 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 442 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 443 | dependencies: 444 | path-type "^4.0.0" 445 | 446 | doctrine@^3.0.0: 447 | version "3.0.0" 448 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 449 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 450 | dependencies: 451 | esutils "^2.0.2" 452 | 453 | emoji-regex@^8.0.0: 454 | version "8.0.0" 455 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 456 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 457 | 458 | escalade@^3.1.1: 459 | version "3.1.1" 460 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 461 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 462 | 463 | escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: 464 | version "4.0.0" 465 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 466 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 467 | 468 | eslint-scope@^5.1.1: 469 | version "5.1.1" 470 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 471 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 472 | dependencies: 473 | esrecurse "^4.3.0" 474 | estraverse "^4.1.1" 475 | 476 | eslint-scope@^7.2.0: 477 | version "7.2.0" 478 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" 479 | integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== 480 | dependencies: 481 | esrecurse "^4.3.0" 482 | estraverse "^5.2.0" 483 | 484 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: 485 | version "3.4.1" 486 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" 487 | integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== 488 | 489 | eslint@^8.39.0: 490 | version "8.40.0" 491 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4" 492 | integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ== 493 | dependencies: 494 | "@eslint-community/eslint-utils" "^4.2.0" 495 | "@eslint-community/regexpp" "^4.4.0" 496 | "@eslint/eslintrc" "^2.0.3" 497 | "@eslint/js" "8.40.0" 498 | "@humanwhocodes/config-array" "^0.11.8" 499 | "@humanwhocodes/module-importer" "^1.0.1" 500 | "@nodelib/fs.walk" "^1.2.8" 501 | ajv "^6.10.0" 502 | chalk "^4.0.0" 503 | cross-spawn "^7.0.2" 504 | debug "^4.3.2" 505 | doctrine "^3.0.0" 506 | escape-string-regexp "^4.0.0" 507 | eslint-scope "^7.2.0" 508 | eslint-visitor-keys "^3.4.1" 509 | espree "^9.5.2" 510 | esquery "^1.4.2" 511 | esutils "^2.0.2" 512 | fast-deep-equal "^3.1.3" 513 | file-entry-cache "^6.0.1" 514 | find-up "^5.0.0" 515 | glob-parent "^6.0.2" 516 | globals "^13.19.0" 517 | grapheme-splitter "^1.0.4" 518 | ignore "^5.2.0" 519 | import-fresh "^3.0.0" 520 | imurmurhash "^0.1.4" 521 | is-glob "^4.0.0" 522 | is-path-inside "^3.0.3" 523 | js-sdsl "^4.1.4" 524 | js-yaml "^4.1.0" 525 | json-stable-stringify-without-jsonify "^1.0.1" 526 | levn "^0.4.1" 527 | lodash.merge "^4.6.2" 528 | minimatch "^3.1.2" 529 | natural-compare "^1.4.0" 530 | optionator "^0.9.1" 531 | strip-ansi "^6.0.1" 532 | strip-json-comments "^3.1.0" 533 | text-table "^0.2.0" 534 | 535 | espree@^9.5.2: 536 | version "9.5.2" 537 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" 538 | integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== 539 | dependencies: 540 | acorn "^8.8.0" 541 | acorn-jsx "^5.3.2" 542 | eslint-visitor-keys "^3.4.1" 543 | 544 | esquery@^1.4.2: 545 | version "1.5.0" 546 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 547 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 548 | dependencies: 549 | estraverse "^5.1.0" 550 | 551 | esrecurse@^4.3.0: 552 | version "4.3.0" 553 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 554 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 555 | dependencies: 556 | estraverse "^5.2.0" 557 | 558 | estraverse@^4.1.1: 559 | version "4.3.0" 560 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 561 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 562 | 563 | estraverse@^5.1.0, estraverse@^5.2.0: 564 | version "5.3.0" 565 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 566 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 567 | 568 | esutils@^2.0.2: 569 | version "2.0.3" 570 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 571 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 572 | 573 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 574 | version "3.1.3" 575 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 576 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 577 | 578 | fast-glob@^3.2.9: 579 | version "3.2.12" 580 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" 581 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== 582 | dependencies: 583 | "@nodelib/fs.stat" "^2.0.2" 584 | "@nodelib/fs.walk" "^1.2.3" 585 | glob-parent "^5.1.2" 586 | merge2 "^1.3.0" 587 | micromatch "^4.0.4" 588 | 589 | fast-json-stable-stringify@^2.0.0: 590 | version "2.1.0" 591 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 592 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 593 | 594 | fast-levenshtein@^2.0.6: 595 | version "2.0.6" 596 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 597 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 598 | 599 | fastq@^1.6.0: 600 | version "1.15.0" 601 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 602 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 603 | dependencies: 604 | reusify "^1.0.4" 605 | 606 | file-entry-cache@^6.0.1: 607 | version "6.0.1" 608 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 609 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 610 | dependencies: 611 | flat-cache "^3.0.4" 612 | 613 | fill-range@^7.0.1: 614 | version "7.0.1" 615 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 616 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 617 | dependencies: 618 | to-regex-range "^5.0.1" 619 | 620 | find-up@5.0.0, find-up@^5.0.0: 621 | version "5.0.0" 622 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 623 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 624 | dependencies: 625 | locate-path "^6.0.0" 626 | path-exists "^4.0.0" 627 | 628 | flat-cache@^3.0.4: 629 | version "3.0.4" 630 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 631 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 632 | dependencies: 633 | flatted "^3.1.0" 634 | rimraf "^3.0.2" 635 | 636 | flat@^5.0.2: 637 | version "5.0.2" 638 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 639 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 640 | 641 | flatted@^3.1.0: 642 | version "3.2.7" 643 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 644 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 645 | 646 | follow-redirects@^1.15.0: 647 | version "1.15.2" 648 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 649 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 650 | 651 | form-data@^4.0.0: 652 | version "4.0.0" 653 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 654 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 655 | dependencies: 656 | asynckit "^0.4.0" 657 | combined-stream "^1.0.8" 658 | mime-types "^2.1.12" 659 | 660 | fs.realpath@^1.0.0: 661 | version "1.0.0" 662 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 663 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 664 | 665 | fsevents@~2.3.2: 666 | version "2.3.2" 667 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 668 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 669 | 670 | get-caller-file@^2.0.5: 671 | version "2.0.5" 672 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 673 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 674 | 675 | glob-parent@^5.1.2, glob-parent@~5.1.2: 676 | version "5.1.2" 677 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 678 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 679 | dependencies: 680 | is-glob "^4.0.1" 681 | 682 | glob-parent@^6.0.2: 683 | version "6.0.2" 684 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 685 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 686 | dependencies: 687 | is-glob "^4.0.3" 688 | 689 | glob@7.2.0: 690 | version "7.2.0" 691 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 692 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 693 | dependencies: 694 | fs.realpath "^1.0.0" 695 | inflight "^1.0.4" 696 | inherits "2" 697 | minimatch "^3.0.4" 698 | once "^1.3.0" 699 | path-is-absolute "^1.0.0" 700 | 701 | glob@^7.1.3: 702 | version "7.2.3" 703 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 704 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 705 | dependencies: 706 | fs.realpath "^1.0.0" 707 | inflight "^1.0.4" 708 | inherits "2" 709 | minimatch "^3.1.1" 710 | once "^1.3.0" 711 | path-is-absolute "^1.0.0" 712 | 713 | glob@^8.1.0: 714 | version "8.1.0" 715 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 716 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 717 | dependencies: 718 | fs.realpath "^1.0.0" 719 | inflight "^1.0.4" 720 | inherits "2" 721 | minimatch "^5.0.1" 722 | once "^1.3.0" 723 | 724 | globals@^13.19.0: 725 | version "13.20.0" 726 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" 727 | integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== 728 | dependencies: 729 | type-fest "^0.20.2" 730 | 731 | globby@^11.1.0: 732 | version "11.1.0" 733 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 734 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 735 | dependencies: 736 | array-union "^2.1.0" 737 | dir-glob "^3.0.1" 738 | fast-glob "^3.2.9" 739 | ignore "^5.2.0" 740 | merge2 "^1.4.1" 741 | slash "^3.0.0" 742 | 743 | grapheme-splitter@^1.0.4: 744 | version "1.0.4" 745 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 746 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 747 | 748 | has-flag@^4.0.0: 749 | version "4.0.0" 750 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 751 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 752 | 753 | he@1.2.0: 754 | version "1.2.0" 755 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 756 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 757 | 758 | http-proxy-agent@^4.0.1: 759 | version "4.0.1" 760 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" 761 | integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== 762 | dependencies: 763 | "@tootallnate/once" "1" 764 | agent-base "6" 765 | debug "4" 766 | 767 | https-proxy-agent@^5.0.0: 768 | version "5.0.1" 769 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" 770 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 771 | dependencies: 772 | agent-base "6" 773 | debug "4" 774 | 775 | ignore@^5.2.0: 776 | version "5.2.4" 777 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" 778 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== 779 | 780 | immediate@~3.0.5: 781 | version "3.0.6" 782 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 783 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 784 | 785 | import-fresh@^3.0.0, import-fresh@^3.2.1: 786 | version "3.3.0" 787 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 788 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 789 | dependencies: 790 | parent-module "^1.0.0" 791 | resolve-from "^4.0.0" 792 | 793 | imurmurhash@^0.1.4: 794 | version "0.1.4" 795 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 796 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 797 | 798 | inflight@^1.0.4: 799 | version "1.0.6" 800 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 801 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 802 | dependencies: 803 | once "^1.3.0" 804 | wrappy "1" 805 | 806 | inherits@2, inherits@~2.0.3: 807 | version "2.0.4" 808 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 809 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 810 | 811 | is-binary-path@~2.1.0: 812 | version "2.1.0" 813 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 814 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 815 | dependencies: 816 | binary-extensions "^2.0.0" 817 | 818 | is-extglob@^2.1.1: 819 | version "2.1.1" 820 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 821 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 822 | 823 | is-fullwidth-code-point@^3.0.0: 824 | version "3.0.0" 825 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 826 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 827 | 828 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 829 | version "4.0.3" 830 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 831 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 832 | dependencies: 833 | is-extglob "^2.1.1" 834 | 835 | is-number@^7.0.0: 836 | version "7.0.0" 837 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 838 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 839 | 840 | is-path-inside@^3.0.3: 841 | version "3.0.3" 842 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 843 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 844 | 845 | is-plain-obj@^2.1.0: 846 | version "2.1.0" 847 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 848 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 849 | 850 | is-unicode-supported@^0.1.0: 851 | version "0.1.0" 852 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 853 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 854 | 855 | isarray@~1.0.0: 856 | version "1.0.0" 857 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 858 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 859 | 860 | isexe@^2.0.0: 861 | version "2.0.0" 862 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 863 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 864 | 865 | js-sdsl@^4.1.4: 866 | version "4.4.0" 867 | resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" 868 | integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== 869 | 870 | js-yaml@4.1.0, js-yaml@^4.1.0: 871 | version "4.1.0" 872 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 873 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 874 | dependencies: 875 | argparse "^2.0.1" 876 | 877 | json-schema-traverse@^0.4.1: 878 | version "0.4.1" 879 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 880 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 881 | 882 | json-stable-stringify-without-jsonify@^1.0.1: 883 | version "1.0.1" 884 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 885 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 886 | 887 | jszip@^3.10.1: 888 | version "3.10.1" 889 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 890 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 891 | dependencies: 892 | lie "~3.3.0" 893 | pako "~1.0.2" 894 | readable-stream "~2.3.6" 895 | setimmediate "^1.0.5" 896 | 897 | levn@^0.4.1: 898 | version "0.4.1" 899 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 900 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 901 | dependencies: 902 | prelude-ls "^1.2.1" 903 | type-check "~0.4.0" 904 | 905 | lie@~3.3.0: 906 | version "3.3.0" 907 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 908 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 909 | dependencies: 910 | immediate "~3.0.5" 911 | 912 | locate-path@^6.0.0: 913 | version "6.0.0" 914 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 915 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 916 | dependencies: 917 | p-locate "^5.0.0" 918 | 919 | lodash.merge@^4.6.2: 920 | version "4.6.2" 921 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 922 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 923 | 924 | log-symbols@4.1.0: 925 | version "4.1.0" 926 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 927 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 928 | dependencies: 929 | chalk "^4.1.0" 930 | is-unicode-supported "^0.1.0" 931 | 932 | lru-cache@^6.0.0: 933 | version "6.0.0" 934 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 935 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 936 | dependencies: 937 | yallist "^4.0.0" 938 | 939 | merge2@^1.3.0, merge2@^1.4.1: 940 | version "1.4.1" 941 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 942 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 943 | 944 | micromatch@^4.0.4: 945 | version "4.0.5" 946 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 947 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 948 | dependencies: 949 | braces "^3.0.2" 950 | picomatch "^2.3.1" 951 | 952 | mime-db@1.52.0: 953 | version "1.52.0" 954 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 955 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 956 | 957 | mime-types@^2.1.12: 958 | version "2.1.35" 959 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 960 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 961 | dependencies: 962 | mime-db "1.52.0" 963 | 964 | minimatch@5.0.1: 965 | version "5.0.1" 966 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 967 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 968 | dependencies: 969 | brace-expansion "^2.0.1" 970 | 971 | minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 972 | version "3.1.2" 973 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 974 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 975 | dependencies: 976 | brace-expansion "^1.1.7" 977 | 978 | minimatch@^5.0.1: 979 | version "5.1.6" 980 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 981 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 982 | dependencies: 983 | brace-expansion "^2.0.1" 984 | 985 | mocha@^10.2.0: 986 | version "10.2.0" 987 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" 988 | integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== 989 | dependencies: 990 | ansi-colors "4.1.1" 991 | browser-stdout "1.3.1" 992 | chokidar "3.5.3" 993 | debug "4.3.4" 994 | diff "5.0.0" 995 | escape-string-regexp "4.0.0" 996 | find-up "5.0.0" 997 | glob "7.2.0" 998 | he "1.2.0" 999 | js-yaml "4.1.0" 1000 | log-symbols "4.1.0" 1001 | minimatch "5.0.1" 1002 | ms "2.1.3" 1003 | nanoid "3.3.3" 1004 | serialize-javascript "6.0.0" 1005 | strip-json-comments "3.1.1" 1006 | supports-color "8.1.1" 1007 | workerpool "6.2.1" 1008 | yargs "16.2.0" 1009 | yargs-parser "20.2.4" 1010 | yargs-unparser "2.0.0" 1011 | 1012 | ms@2.1.2: 1013 | version "2.1.2" 1014 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1015 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1016 | 1017 | ms@2.1.3: 1018 | version "2.1.3" 1019 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1020 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1021 | 1022 | nanoid@3.3.3: 1023 | version "3.3.3" 1024 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 1025 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 1026 | 1027 | natural-compare-lite@^1.4.0: 1028 | version "1.4.0" 1029 | resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" 1030 | integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== 1031 | 1032 | natural-compare@^1.4.0: 1033 | version "1.4.0" 1034 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1035 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1036 | 1037 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1038 | version "3.0.0" 1039 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1040 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1041 | 1042 | once@^1.3.0: 1043 | version "1.4.0" 1044 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1045 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1046 | dependencies: 1047 | wrappy "1" 1048 | 1049 | optionator@^0.9.1: 1050 | version "0.9.1" 1051 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1052 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1053 | dependencies: 1054 | deep-is "^0.1.3" 1055 | fast-levenshtein "^2.0.6" 1056 | levn "^0.4.1" 1057 | prelude-ls "^1.2.1" 1058 | type-check "^0.4.0" 1059 | word-wrap "^1.2.3" 1060 | 1061 | p-limit@^3.0.2: 1062 | version "3.1.0" 1063 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1064 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1065 | dependencies: 1066 | yocto-queue "^0.1.0" 1067 | 1068 | p-locate@^5.0.0: 1069 | version "5.0.0" 1070 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1071 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1072 | dependencies: 1073 | p-limit "^3.0.2" 1074 | 1075 | pako@~1.0.2: 1076 | version "1.0.11" 1077 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1078 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1079 | 1080 | parent-module@^1.0.0: 1081 | version "1.0.1" 1082 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1083 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1084 | dependencies: 1085 | callsites "^3.0.0" 1086 | 1087 | path-exists@^4.0.0: 1088 | version "4.0.0" 1089 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1090 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1091 | 1092 | path-is-absolute@^1.0.0: 1093 | version "1.0.1" 1094 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1095 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1096 | 1097 | path-key@^3.1.0: 1098 | version "3.1.1" 1099 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1100 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1101 | 1102 | path-type@^4.0.0: 1103 | version "4.0.0" 1104 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1105 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1106 | 1107 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1108 | version "2.3.1" 1109 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1110 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1111 | 1112 | prelude-ls@^1.2.1: 1113 | version "1.2.1" 1114 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1115 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1116 | 1117 | process-nextick-args@~2.0.0: 1118 | version "2.0.1" 1119 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1120 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1121 | 1122 | proxy-from-env@^1.1.0: 1123 | version "1.1.0" 1124 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1125 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1126 | 1127 | punycode@^2.1.0: 1128 | version "2.3.0" 1129 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" 1130 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== 1131 | 1132 | queue-microtask@^1.2.2: 1133 | version "1.2.3" 1134 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1135 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1136 | 1137 | randombytes@^2.1.0: 1138 | version "2.1.0" 1139 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1140 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1141 | dependencies: 1142 | safe-buffer "^5.1.0" 1143 | 1144 | readable-stream@~2.3.6: 1145 | version "2.3.8" 1146 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 1147 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 1148 | dependencies: 1149 | core-util-is "~1.0.0" 1150 | inherits "~2.0.3" 1151 | isarray "~1.0.0" 1152 | process-nextick-args "~2.0.0" 1153 | safe-buffer "~5.1.1" 1154 | string_decoder "~1.1.1" 1155 | util-deprecate "~1.0.1" 1156 | 1157 | readdirp@~3.6.0: 1158 | version "3.6.0" 1159 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1160 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1161 | dependencies: 1162 | picomatch "^2.2.1" 1163 | 1164 | require-directory@^2.1.1: 1165 | version "2.1.1" 1166 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1167 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1168 | 1169 | resolve-from@^4.0.0: 1170 | version "4.0.0" 1171 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1172 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1173 | 1174 | reusify@^1.0.4: 1175 | version "1.0.4" 1176 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1177 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1178 | 1179 | rimraf@^3.0.2: 1180 | version "3.0.2" 1181 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1182 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1183 | dependencies: 1184 | glob "^7.1.3" 1185 | 1186 | run-parallel@^1.1.9: 1187 | version "1.2.0" 1188 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1189 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1190 | dependencies: 1191 | queue-microtask "^1.2.2" 1192 | 1193 | safe-buffer@^5.1.0: 1194 | version "5.2.1" 1195 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1196 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1197 | 1198 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1199 | version "5.1.2" 1200 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1201 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1202 | 1203 | semver@^7.3.7, semver@^7.3.8: 1204 | version "7.5.1" 1205 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" 1206 | integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== 1207 | dependencies: 1208 | lru-cache "^6.0.0" 1209 | 1210 | serialize-javascript@6.0.0: 1211 | version "6.0.0" 1212 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1213 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1214 | dependencies: 1215 | randombytes "^2.1.0" 1216 | 1217 | setimmediate@^1.0.5: 1218 | version "1.0.5" 1219 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1220 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1221 | 1222 | shebang-command@^2.0.0: 1223 | version "2.0.0" 1224 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1225 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1226 | dependencies: 1227 | shebang-regex "^3.0.0" 1228 | 1229 | shebang-regex@^3.0.0: 1230 | version "3.0.0" 1231 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1232 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1233 | 1234 | slash@^3.0.0: 1235 | version "3.0.0" 1236 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1237 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1238 | 1239 | string-width@^4.1.0, string-width@^4.2.0: 1240 | version "4.2.3" 1241 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1242 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1243 | dependencies: 1244 | emoji-regex "^8.0.0" 1245 | is-fullwidth-code-point "^3.0.0" 1246 | strip-ansi "^6.0.1" 1247 | 1248 | string_decoder@~1.1.1: 1249 | version "1.1.1" 1250 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1251 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1252 | dependencies: 1253 | safe-buffer "~5.1.0" 1254 | 1255 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1256 | version "6.0.1" 1257 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1258 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1259 | dependencies: 1260 | ansi-regex "^5.0.1" 1261 | 1262 | strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1263 | version "3.1.1" 1264 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1265 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1266 | 1267 | supports-color@8.1.1: 1268 | version "8.1.1" 1269 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1270 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1271 | dependencies: 1272 | has-flag "^4.0.0" 1273 | 1274 | supports-color@^7.1.0: 1275 | version "7.2.0" 1276 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1277 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1278 | dependencies: 1279 | has-flag "^4.0.0" 1280 | 1281 | text-table@^0.2.0: 1282 | version "0.2.0" 1283 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1284 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1285 | 1286 | to-regex-range@^5.0.1: 1287 | version "5.0.1" 1288 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1289 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1290 | dependencies: 1291 | is-number "^7.0.0" 1292 | 1293 | tslib@^1.8.1: 1294 | version "1.14.1" 1295 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1296 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1297 | 1298 | tsutils@^3.21.0: 1299 | version "3.21.0" 1300 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1301 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1302 | dependencies: 1303 | tslib "^1.8.1" 1304 | 1305 | type-check@^0.4.0, type-check@~0.4.0: 1306 | version "0.4.0" 1307 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1308 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1309 | dependencies: 1310 | prelude-ls "^1.2.1" 1311 | 1312 | type-fest@^0.20.2: 1313 | version "0.20.2" 1314 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1315 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1316 | 1317 | typescript@^5.0.4: 1318 | version "5.0.4" 1319 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" 1320 | integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== 1321 | 1322 | uri-js@^4.2.2: 1323 | version "4.4.1" 1324 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1325 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1326 | dependencies: 1327 | punycode "^2.1.0" 1328 | 1329 | util-deprecate@~1.0.1: 1330 | version "1.0.2" 1331 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1332 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1333 | 1334 | which@^2.0.1: 1335 | version "2.0.2" 1336 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1337 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1338 | dependencies: 1339 | isexe "^2.0.0" 1340 | 1341 | word-wrap@^1.2.3: 1342 | version "1.2.3" 1343 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1344 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1345 | 1346 | workerpool@6.2.1: 1347 | version "6.2.1" 1348 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1349 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1350 | 1351 | wrap-ansi@^7.0.0: 1352 | version "7.0.0" 1353 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1354 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1355 | dependencies: 1356 | ansi-styles "^4.0.0" 1357 | string-width "^4.1.0" 1358 | strip-ansi "^6.0.0" 1359 | 1360 | wrappy@1: 1361 | version "1.0.2" 1362 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1363 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1364 | 1365 | y18n@^5.0.5: 1366 | version "5.0.8" 1367 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1368 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1369 | 1370 | yallist@^4.0.0: 1371 | version "4.0.0" 1372 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1373 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1374 | 1375 | yargs-parser@20.2.4: 1376 | version "20.2.4" 1377 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1378 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1379 | 1380 | yargs-parser@^20.2.2: 1381 | version "20.2.9" 1382 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1383 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1384 | 1385 | yargs-unparser@2.0.0: 1386 | version "2.0.0" 1387 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1388 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1389 | dependencies: 1390 | camelcase "^6.0.0" 1391 | decamelize "^4.0.0" 1392 | flat "^5.0.2" 1393 | is-plain-obj "^2.1.0" 1394 | 1395 | yargs@16.2.0: 1396 | version "16.2.0" 1397 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1398 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1399 | dependencies: 1400 | cliui "^7.0.2" 1401 | escalade "^3.1.1" 1402 | get-caller-file "^2.0.5" 1403 | require-directory "^2.1.1" 1404 | string-width "^4.2.0" 1405 | y18n "^5.0.5" 1406 | yargs-parser "^20.2.2" 1407 | 1408 | yocto-queue@^0.1.0: 1409 | version "0.1.0" 1410 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1411 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1412 | --------------------------------------------------------------------------------