From 7129e32d27afd613d21e06d19fbba2f425a9627b Mon Sep 17 00:00:00 2001 From: lensfrex Date: Wed, 10 Apr 2024 17:58:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=98=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 40 + backend/database.sql | 456 + backend/pom.xml | 240 + .../java/net/lensfrex/rd/BackendMain.java | 29 + .../net/lensfrex/rd/cache/CacheManager.java | 18 + .../net/lensfrex/rd/configure/CorsFilter.java | 34 + .../rd/configure/JacksonConfigure.java | 35 + .../rd/configure/MybatisConfigure.java | 17 + .../rd/configure/MywustConfigure.java | 50 + .../rd/configure/PasswordConfigure.java | 13 + .../net/lensfrex/rd/controller/Health.java | 13 + .../activity/ActivityController.java | 45 + .../activity/AdminActivityController.java | 51 + .../admin/AdminCourseScheduleController.java | 9 + .../course/AdminCourseController.java | 57 + .../controller/course/CourseController.java | 38 + .../course/StudentCourseController.java | 36 + .../course/TeacherCourseController.java | 4 + .../major/AdminMajorController.java | 32 + .../rd/controller/major/PublicMajor.java | 35 + .../schedule/AdminScheduleController.java | 77 + .../schedule/ScheduleController.java | 105 + .../schedule/StudentScheduleController.java | 104 + .../schedule/TeacherScheduleController.java | 37 + .../rd/controller/score/ScoreController.java | 56 + .../score/StudentScoreController.java | 31 + .../score/TeacherScoreController.java | 45 + .../student/AdminStudentController.java | 67 + .../controller/student/StudentController.java | 38 + .../teacher/AdminTeacherController.java | 56 + .../controller/teacher/TeacherController.java | 38 + .../controller/user/UserAuthController.java | 134 + .../controller/user/UserInfoController.java | 34 + .../dao/mapper/activity/ActivityMapper.java | 10 + .../rd/dao/mapper/course/CourseMapper.java | 18 + .../experiment/ExperimentItemMapper.java | 10 + .../rd/dao/mapper/major/MajorMapper.java | 9 + .../mapper/schedule/CourseScheduleMapper.java | 19 + .../CourseScheduleSelectionMapper.java | 10 + .../mapper/schedule/TeacherClassMapper.java | 18 + .../schedule/TeacherClassMapperService.java | 9 + .../mapper/score/ExperimentScoreMapper.java | 9 + .../rd/dao/mapper/score/ScoreMapper.java | 21 + .../rd/dao/mapper/user/StudentInfoMapper.java | 11 + .../rd/dao/mapper/user/TeacherInfoMapper.java | 9 + .../rd/dao/mapper/user/UserBasicMapper.java | 9 + .../rd/dao/type/DoubleListTypeHandler.java | 77 + .../rd/dao/type/FloatListTypeHandler.java | 77 + .../rd/dao/type/IntegerListTypeHandler.java | 67 + .../rd/dao/type/LongListTypeHandler.java | 69 + .../rd/dao/type/ShortListTypeHandler.java | 69 + .../rd/dao/type/StringListTypeHandler.java | 55 + .../type/json/BaseJsonListTypeHandler.java | 9 + .../rd/dao/type/json/BaseJsonTypeHandler.java | 64 + .../rd/dao/type/json/FloatMapTypeHandler.java | 15 + .../json/UsualScoreItemListTypeHandler.java | 9 + .../rd/data/dto/course/CourseDTO.java | 42 + .../data/dto/schedule/CourseScheduleDTO.java | 67 + .../data/dto/schedule/StudentExportDto.java | 11 + .../rd/data/dto/score/ScheduleScore.java | 23 + .../rd/data/dto/score/ScoreExportDto.java | 18 + .../rd/data/dto/score/StudentScore.java | 22 + .../rd/data/dto/user/UserBasicInfoDTO.java | 4 + .../dto/user/student/BasicStudentInfoDto.java | 4 + .../data/dto/user/student/NewStudentDTO.java | 7 + .../dto/user/student/StudentUserBasicDTO.java | 7 + .../dto/user/student/StudentUserInfoDTO.java | 10 + .../data/dto/user/teacher/TeacherUserDTO.java | 7 + .../dto/user/teacher/TeacherUserInfoDTO.java | 7 + .../lensfrex/rd/data/entity/CourseDetail.java | 49 + .../rd/data/entity/CourseScheduleDetail.java | 89 + .../rd/data/entity/UsualScoreItem.java | 7 + .../rd/data/entity/table/Activity.java | 68 + .../lensfrex/rd/data/entity/table/Course.java | 65 + .../rd/data/entity/table/CourseSchedule.java | 101 + .../rd/data/entity/table/CourseSelection.java | 47 + .../rd/data/entity/table/ExperimentItem.java | 44 + .../rd/data/entity/table/ExperimentScore.java | 17 + .../lensfrex/rd/data/entity/table/Major.java | 58 + .../lensfrex/rd/data/entity/table/Score.java | 37 + .../rd/data/entity/table/StudentInfo.java | 64 + .../rd/data/entity/table/TeacherClass.java | 43 + .../rd/data/entity/table/TeacherInfo.java | 44 + .../rd/data/entity/table/UserBasic.java | 47 + .../net/lensfrex/rd/data/enums/UserType.java | 24 + .../model/request/admin/ActivityInfoDto.java | 14 + .../request/admin/StudentAddRequest.java | 9 + .../request/admin/TeacherAddRequest.java | 7 + .../model/request/auth/UserLoginRequest.java | 5 + .../model/request/course/CourseRequest.java | 33 + .../schedule/ClassScheduleRequest.java | 28 + .../model/response/PaginationWrapper.java | 7 + .../rd/data/model/response/Response.java | 35 + .../rd/data/model/response/ResponseCode.java | 43 + .../auth/UserLoginStatusResponse.java | 7 + .../course/CandidateCourseResponse.java | 41 + .../model/response/course/CourseResponse.java | 31 + .../response/score/StudentScoreSummary.java | 7 + .../model/response/user/UserBasicInfo.java | 15 + .../lensfrex/rd/exception/BaseException.java | 7 + .../rd/exception/GlobalExceptionHandler.java | 133 + .../exception/data/DataConflictException.java | 13 + .../data/DataFormatWrongException.java | 13 + .../data/DataNotExistsException.java | 13 + .../exception/data/DataNotMatchException.java | 13 + .../internal/BaseJwcFetchException.java | 13 + .../exception/internal/JwcAuthException.java | 11 + .../internal/JwcNetworkException.java | 7 + .../user/PasswordWrongException.java | 9 + .../user/UserAlreadyExistsException.java | 9 + .../user/UserNotExistsException.java | 9 + .../rd/service/activity/ActivityService.java | 217 + .../auth/UserTypeStpInterfaceImpl.java | 69 + .../rd/service/course/CourseService.java | 237 + .../service/experiment/ExperimentService.java | 8 + .../rd/service/major/MajorService.java | 135 + .../OfficialUndergradAuthService.java | 63 + .../OfficialUndergradScheduleService.java | 75 + .../OfficialUndergradStudentInfoService.java | 45 + .../schedule/CourseScheduleService.java | 466 + .../StudentCourseScheduleService.java | 100 + .../TeacherCourseScheduleService.java | 45 + .../rd/service/score/ScoreService.java | 172 + .../rd/service/user/StudentUserService.java | 272 + .../rd/service/user/TeacherUserService.java | 139 + .../rd/service/user/UserBasicService.java | 192 + .../rd/service/user/UserInfoService.java | 79 + .../net/lensfrex/rd/util/PasswordUtil.java | 53 + backend/src/main/resources/application.yml | 100 + backend/src/main/resources/logback.xml | 54 + .../main/resources/mapper/CourseMapper.xml | 38 + .../resources/mapper/CourseScheduleMapper.xml | 45 + .../src/main/resources/mapper/ScoreMapper.xml | 41 + .../resources/mapper/StudentInfoMapper.xml | 9 + .../resources/mapper/TeacherClassMapper.xml | 28 + .../src/main/resources/template_score.xlsx | Bin 0 -> 10812 bytes .../main/resources/template_student_list.xlsx | Bin 0 -> 10514 bytes backend/src/test/java/JacksonTest.java | 26 + backend/src/test/java/PasswordTest.java | 9 + .../test/java/TeacherCourseScheduleTest.java | 8 + doc/features.html | 412 + doc/features.md | 40 + frontend/.editorconfig | 9 + frontend/.eslintignore | 7 + frontend/.eslintrc.cjs | 66 + frontend/.gitignore | 33 + frontend/.npmrc | 3 + frontend/README.md | 41 + frontend/env.dev.js | 3 + frontend/env.prod.js | 4 + frontend/index.html | 20 + frontend/jsconfig.json | 36 + frontend/package-lock.json | 9067 +++++++++++++++++ frontend/package.json | 53 + frontend/postcss.config.cjs | 28 + frontend/public/favicon.ico | Bin 0 -> 270398 bytes frontend/public/icon.xcf | Bin 0 -> 51580 bytes frontend/public/icons/apple-icon-120x120.png | Bin 0 -> 4762 bytes frontend/public/icons/apple-icon-152x152.png | Bin 0 -> 5765 bytes frontend/public/icons/apple-icon-167x167.png | Bin 0 -> 6644 bytes frontend/public/icons/apple-icon-180x180.png | Bin 0 -> 7179 bytes frontend/public/icons/apple-icon-384x384.png | Bin 0 -> 15561 bytes frontend/public/icons/favicon-128x128.png | Bin 0 -> 4694 bytes frontend/public/icons/favicon-16x16.png | Bin 0 -> 359 bytes frontend/public/icons/favicon-32x32.png | Bin 0 -> 927 bytes frontend/public/icons/favicon-96x96.png | Bin 0 -> 3832 bytes frontend/public/icons/icon-128x128.png | Bin 0 -> 4683 bytes frontend/public/icons/icon-192x192.png | Bin 0 -> 14340 bytes frontend/public/icons/icon-256x256.ico | Bin 0 -> 270398 bytes frontend/public/icons/icon-256x256.png | Bin 0 -> 8807 bytes frontend/public/icons/icon-384x384.png | Bin 0 -> 15561 bytes frontend/public/icons/icon-64x64.png | Bin 0 -> 2323 bytes frontend/public/icons/info.svg | 1 + frontend/public/icons/ms-icon-144x144.png | Bin 0 -> 5241 bytes frontend/public/icons/personal.svg | 1 + frontend/public/icons/schedule.svg | 1 + frontend/public/icons/score.svg | 1 + frontend/public/icons/selection.svg | 1 + frontend/quasar.config.js | 212 + frontend/quasar.extensions.json | 3 + frontend/src-pwa/custom-service-worker.js | 30 + frontend/src-pwa/manifest.json | 36 + frontend/src-pwa/pwa-flag.d.ts | 10 + frontend/src-pwa/register-service-worker.js | 41 + frontend/src/App.vue | 30 + frontend/src/api/activity/activity.js | 72 + frontend/src/api/api-urls.js | 96 + frontend/src/api/api.js | 0 frontend/src/api/auth/authApi.js | 39 + frontend/src/api/class/class.js | 74 + frontend/src/api/client.js | 41 + frontend/src/api/course/course.js | 142 + frontend/src/api/major/major.js | 55 + frontend/src/api/score/score.js | 65 + frontend/src/api/student/student.js | 76 + frontend/src/api/teacher/teacher.js | 64 + frontend/src/api/user/user.js | 20 + frontend/src/assets/quasar-logo-vertical.svg | 15 + frontend/src/boot/.gitkeep | 0 frontend/src/component/AsideAvatar.vue | 22 + frontend/src/component/TitledDialog.vue | 36 + frontend/src/css/app.scss | 47 + frontend/src/css/quasar.variables.scss | 25 + frontend/src/css/tailwind.css | 3 + frontend/src/pages/ErrorNotFound.vue | 27 + .../admin/activity/AdminActivityAddPane.vue | 101 + .../admin/activity/AdminActivityEditPane.vue | 108 + .../admin/activity/AdminActivityPage.vue | 321 + .../pages/admin/class/AdminClassAddPane.vue | 230 + .../admin/class/AdminClassDuplicatePane.vue | 144 + .../pages/admin/class/AdminClassEditPane.vue | 289 + .../src/pages/admin/class/AdminClassPage.vue | 394 + .../class/AdminClassTeacherSelectingPane.vue | 202 + .../pages/admin/class/AdminTimeSelectView.vue | 220 + .../pages/admin/course/AdminCourseAddPane.vue | 168 + .../admin/course/AdminCourseEditPane.vue | 178 + .../pages/admin/course/AdminCoursePage.vue | 354 + frontend/src/pages/admin/main/AdminMain.vue | 128 + .../pages/admin/main/AdminUserinfoPane.vue | 142 + .../admin/student/AdminStudentAddPane.vue | 144 + .../admin/student/AdminStudentEditPane.vue | 87 + .../admin/student/AdminStudentImportPane.vue | 277 + .../pages/admin/student/AdminStudentPage.vue | 302 + .../admin/teacher/AdminTeacherAddPane.vue | 89 + .../admin/teacher/AdminTeacherEditPane.vue | 84 + .../pages/admin/teacher/AdminTeacherPage.vue | 287 + frontend/src/pages/index/FooterInfo.vue | 23 + frontend/src/pages/index/LoginCard.vue | 135 + frontend/src/pages/index/LoginIndexPage.vue | 15 + .../course/StudentCandidateCourseListPage.vue | 117 + .../student/course/StudentCourseCard.vue | 105 + .../course/StudentCourseSelectingnPage.vue | 112 + .../StudentCourseSelectingConfirmPane.vue | 167 + .../view/StudentCourseSelectingView.vue | 330 + .../src/pages/student/main/StudentMain.vue | 137 + .../student/main/StudentUserinfoPane.vue | 171 + .../schedule/StudentCourseTablePage.vue | 109 + .../schedule/StudentCourseTableView.vue | 326 + .../pages/student/score/StudentScorePage.vue | 147 + .../teacher/course/TeacherCourseCard.vue | 80 + .../teacher/course/TeacherCourseListPage.vue | 152 + .../teacher/course/TeacherCourseTableView.vue | 337 + .../pages/teacher/info/TeacherInfoPage.vue | 76 + .../src/pages/teacher/main/TeacherMain.vue | 115 + .../teacher/main/TeacherUserinfoPane.vue | 150 + .../score/TeacherClassStudentScorePage.vue | 287 + .../teacher/score/TeacherScoreImportPane.vue | 318 + .../pages/teacher/score/TeacherScorePage.vue | 170 + frontend/src/router/index.js | 25 + frontend/src/router/routes.js | 76 + frontend/src/stores/index.js | 20 + frontend/src/stores/majors.js | 25 + frontend/src/stores/store-flag.d.ts | 10 + frontend/tailwind.config.js | 9 + frontend/vite.config.js | 6 + frontend/yarn.lock | 5092 +++++++++ 256 files changed, 31236 insertions(+) create mode 100644 .gitignore create mode 100644 backend/database.sql create mode 100644 backend/pom.xml create mode 100644 backend/src/main/java/net/lensfrex/rd/BackendMain.java create mode 100644 backend/src/main/java/net/lensfrex/rd/cache/CacheManager.java create mode 100644 backend/src/main/java/net/lensfrex/rd/configure/CorsFilter.java create mode 100644 backend/src/main/java/net/lensfrex/rd/configure/JacksonConfigure.java create mode 100644 backend/src/main/java/net/lensfrex/rd/configure/MybatisConfigure.java create mode 100644 backend/src/main/java/net/lensfrex/rd/configure/MywustConfigure.java create mode 100644 backend/src/main/java/net/lensfrex/rd/configure/PasswordConfigure.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/Health.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/activity/ActivityController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/activity/AdminActivityController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/admin/AdminCourseScheduleController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/course/AdminCourseController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/course/CourseController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/course/StudentCourseController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/course/TeacherCourseController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/major/AdminMajorController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/major/PublicMajor.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/schedule/AdminScheduleController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/schedule/ScheduleController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/schedule/StudentScheduleController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/schedule/TeacherScheduleController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/score/ScoreController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/score/StudentScoreController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/score/TeacherScoreController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/student/AdminStudentController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/student/StudentController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/teacher/AdminTeacherController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/teacher/TeacherController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/user/UserAuthController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/controller/user/UserInfoController.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/activity/ActivityMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/course/CourseMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/experiment/ExperimentItemMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/major/MajorMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleSelectionMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapperService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ExperimentScoreMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ScoreMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/user/StudentInfoMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/user/TeacherInfoMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/mapper/user/UserBasicMapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/DoubleListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/FloatListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/IntegerListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/LongListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/ShortListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/StringListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/json/FloatMapTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/dao/type/json/UsualScoreItemListTypeHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/course/CourseDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/schedule/CourseScheduleDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/schedule/StudentExportDto.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/score/ScheduleScore.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/score/ScoreExportDto.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/score/StudentScore.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/user/UserBasicInfoDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/user/student/BasicStudentInfoDto.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/user/student/NewStudentDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserBasicDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserInfoDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserInfoDTO.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/CourseDetail.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/CourseScheduleDetail.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/UsualScoreItem.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/Activity.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/Course.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSchedule.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSelection.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentItem.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentScore.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/Major.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/Score.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/StudentInfo.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherClass.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherInfo.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/entity/table/UserBasic.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/enums/UserType.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/request/admin/ActivityInfoDto.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/request/admin/StudentAddRequest.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/request/admin/TeacherAddRequest.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/request/auth/UserLoginRequest.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/request/course/CourseRequest.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/request/schedule/ClassScheduleRequest.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/PaginationWrapper.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/Response.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/ResponseCode.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/auth/UserLoginStatusResponse.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/course/CandidateCourseResponse.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/course/CourseResponse.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/score/StudentScoreSummary.java create mode 100644 backend/src/main/java/net/lensfrex/rd/data/model/response/user/UserBasicInfo.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/BaseException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/GlobalExceptionHandler.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/data/DataConflictException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/data/DataFormatWrongException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/data/DataNotExistsException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/data/DataNotMatchException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/internal/BaseJwcFetchException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/internal/JwcAuthException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/internal/JwcNetworkException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/user/PasswordWrongException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/user/UserAlreadyExistsException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/exception/user/UserNotExistsException.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/activity/ActivityService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/auth/UserTypeStpInterfaceImpl.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/course/CourseService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/experiment/ExperimentService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/major/MajorService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradAuthService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradScheduleService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradStudentInfoService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/schedule/CourseScheduleService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/schedule/StudentCourseScheduleService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/schedule/TeacherCourseScheduleService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/score/ScoreService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/user/StudentUserService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/user/TeacherUserService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/user/UserBasicService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/service/user/UserInfoService.java create mode 100644 backend/src/main/java/net/lensfrex/rd/util/PasswordUtil.java create mode 100644 backend/src/main/resources/application.yml create mode 100644 backend/src/main/resources/logback.xml create mode 100644 backend/src/main/resources/mapper/CourseMapper.xml create mode 100644 backend/src/main/resources/mapper/CourseScheduleMapper.xml create mode 100644 backend/src/main/resources/mapper/ScoreMapper.xml create mode 100644 backend/src/main/resources/mapper/StudentInfoMapper.xml create mode 100644 backend/src/main/resources/mapper/TeacherClassMapper.xml create mode 100644 backend/src/main/resources/template_score.xlsx create mode 100644 backend/src/main/resources/template_student_list.xlsx create mode 100644 backend/src/test/java/JacksonTest.java create mode 100644 backend/src/test/java/PasswordTest.java create mode 100644 backend/src/test/java/TeacherCourseScheduleTest.java create mode 100644 doc/features.html create mode 100644 doc/features.md create mode 100644 frontend/.editorconfig create mode 100644 frontend/.eslintignore create mode 100644 frontend/.eslintrc.cjs create mode 100644 frontend/.gitignore create mode 100644 frontend/.npmrc create mode 100644 frontend/README.md create mode 100644 frontend/env.dev.js create mode 100644 frontend/env.prod.js create mode 100644 frontend/index.html create mode 100644 frontend/jsconfig.json create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.cjs create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/icon.xcf create mode 100644 frontend/public/icons/apple-icon-120x120.png create mode 100644 frontend/public/icons/apple-icon-152x152.png create mode 100644 frontend/public/icons/apple-icon-167x167.png create mode 100644 frontend/public/icons/apple-icon-180x180.png create mode 100644 frontend/public/icons/apple-icon-384x384.png create mode 100644 frontend/public/icons/favicon-128x128.png create mode 100644 frontend/public/icons/favicon-16x16.png create mode 100644 frontend/public/icons/favicon-32x32.png create mode 100644 frontend/public/icons/favicon-96x96.png create mode 100644 frontend/public/icons/icon-128x128.png create mode 100644 frontend/public/icons/icon-192x192.png create mode 100644 frontend/public/icons/icon-256x256.ico create mode 100644 frontend/public/icons/icon-256x256.png create mode 100644 frontend/public/icons/icon-384x384.png create mode 100644 frontend/public/icons/icon-64x64.png create mode 100644 frontend/public/icons/info.svg create mode 100644 frontend/public/icons/ms-icon-144x144.png create mode 100644 frontend/public/icons/personal.svg create mode 100644 frontend/public/icons/schedule.svg create mode 100644 frontend/public/icons/score.svg create mode 100644 frontend/public/icons/selection.svg create mode 100644 frontend/quasar.config.js create mode 100644 frontend/quasar.extensions.json create mode 100644 frontend/src-pwa/custom-service-worker.js create mode 100644 frontend/src-pwa/manifest.json create mode 100644 frontend/src-pwa/pwa-flag.d.ts create mode 100644 frontend/src-pwa/register-service-worker.js create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/api/activity/activity.js create mode 100644 frontend/src/api/api-urls.js create mode 100644 frontend/src/api/api.js create mode 100644 frontend/src/api/auth/authApi.js create mode 100644 frontend/src/api/class/class.js create mode 100644 frontend/src/api/client.js create mode 100644 frontend/src/api/course/course.js create mode 100644 frontend/src/api/major/major.js create mode 100644 frontend/src/api/score/score.js create mode 100644 frontend/src/api/student/student.js create mode 100644 frontend/src/api/teacher/teacher.js create mode 100644 frontend/src/api/user/user.js create mode 100644 frontend/src/assets/quasar-logo-vertical.svg create mode 100644 frontend/src/boot/.gitkeep create mode 100644 frontend/src/component/AsideAvatar.vue create mode 100644 frontend/src/component/TitledDialog.vue create mode 100644 frontend/src/css/app.scss create mode 100644 frontend/src/css/quasar.variables.scss create mode 100644 frontend/src/css/tailwind.css create mode 100644 frontend/src/pages/ErrorNotFound.vue create mode 100644 frontend/src/pages/admin/activity/AdminActivityAddPane.vue create mode 100644 frontend/src/pages/admin/activity/AdminActivityEditPane.vue create mode 100644 frontend/src/pages/admin/activity/AdminActivityPage.vue create mode 100644 frontend/src/pages/admin/class/AdminClassAddPane.vue create mode 100644 frontend/src/pages/admin/class/AdminClassDuplicatePane.vue create mode 100644 frontend/src/pages/admin/class/AdminClassEditPane.vue create mode 100644 frontend/src/pages/admin/class/AdminClassPage.vue create mode 100644 frontend/src/pages/admin/class/AdminClassTeacherSelectingPane.vue create mode 100644 frontend/src/pages/admin/class/AdminTimeSelectView.vue create mode 100644 frontend/src/pages/admin/course/AdminCourseAddPane.vue create mode 100644 frontend/src/pages/admin/course/AdminCourseEditPane.vue create mode 100644 frontend/src/pages/admin/course/AdminCoursePage.vue create mode 100644 frontend/src/pages/admin/main/AdminMain.vue create mode 100644 frontend/src/pages/admin/main/AdminUserinfoPane.vue create mode 100644 frontend/src/pages/admin/student/AdminStudentAddPane.vue create mode 100644 frontend/src/pages/admin/student/AdminStudentEditPane.vue create mode 100644 frontend/src/pages/admin/student/AdminStudentImportPane.vue create mode 100644 frontend/src/pages/admin/student/AdminStudentPage.vue create mode 100644 frontend/src/pages/admin/teacher/AdminTeacherAddPane.vue create mode 100644 frontend/src/pages/admin/teacher/AdminTeacherEditPane.vue create mode 100644 frontend/src/pages/admin/teacher/AdminTeacherPage.vue create mode 100644 frontend/src/pages/index/FooterInfo.vue create mode 100644 frontend/src/pages/index/LoginCard.vue create mode 100644 frontend/src/pages/index/LoginIndexPage.vue create mode 100644 frontend/src/pages/student/course/StudentCandidateCourseListPage.vue create mode 100644 frontend/src/pages/student/course/StudentCourseCard.vue create mode 100644 frontend/src/pages/student/course/StudentCourseSelectingnPage.vue create mode 100644 frontend/src/pages/student/course/view/StudentCourseSelectingConfirmPane.vue create mode 100644 frontend/src/pages/student/course/view/StudentCourseSelectingView.vue create mode 100644 frontend/src/pages/student/main/StudentMain.vue create mode 100644 frontend/src/pages/student/main/StudentUserinfoPane.vue create mode 100644 frontend/src/pages/student/schedule/StudentCourseTablePage.vue create mode 100644 frontend/src/pages/student/schedule/StudentCourseTableView.vue create mode 100644 frontend/src/pages/student/score/StudentScorePage.vue create mode 100644 frontend/src/pages/teacher/course/TeacherCourseCard.vue create mode 100644 frontend/src/pages/teacher/course/TeacherCourseListPage.vue create mode 100644 frontend/src/pages/teacher/course/TeacherCourseTableView.vue create mode 100644 frontend/src/pages/teacher/info/TeacherInfoPage.vue create mode 100644 frontend/src/pages/teacher/main/TeacherMain.vue create mode 100644 frontend/src/pages/teacher/main/TeacherUserinfoPane.vue create mode 100644 frontend/src/pages/teacher/score/TeacherClassStudentScorePage.vue create mode 100644 frontend/src/pages/teacher/score/TeacherScoreImportPane.vue create mode 100644 frontend/src/pages/teacher/score/TeacherScorePage.vue create mode 100644 frontend/src/router/index.js create mode 100644 frontend/src/router/routes.js create mode 100644 frontend/src/stores/index.js create mode 100644 frontend/src/stores/majors.js create mode 100644 frontend/src/stores/store-flag.d.ts create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/vite.config.js create mode 100644 frontend/yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a9d8ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store + +.env \ No newline at end of file diff --git a/backend/database.sql b/backend/database.sql new file mode 100644 index 0000000..f38ac72 --- /dev/null +++ b/backend/database.sql @@ -0,0 +1,456 @@ +/* + Navicat Premium Data Transfer + + Source Server : local_postgresql + Source Server Type : PostgreSQL + Source Server Version : 150003 (150003) + Source Host : localhost:5432 + Source Catalog : little_busters + Source Schema : public + + Target Server Type : PostgreSQL + Target Server Version : 150003 (150003) + File Encoding : 65001 + + Date: 21/08/2023 18:32:52 +*/ + + +-- ---------------------------- +-- Table structure for activity +-- ---------------------------- +DROP TABLE IF EXISTS "public"."activity"; +CREATE TABLE "public"."activity" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL DEFAULT 0, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying, + "term" varchar(11) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '2023-2024-1'::character varying, + "start_time" timestamp(6) NOT NULL DEFAULT now(), + "end_time" timestamp(6) NOT NULL DEFAULT now(), + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."activity"."id" IS '选课活动id'; +COMMENT ON COLUMN "public"."activity"."name" IS '活动id'; +COMMENT ON COLUMN "public"."activity"."term" IS '学期,格式如2023-2024-1'; +COMMENT ON COLUMN "public"."activity"."start_time" IS '开始时间'; +COMMENT ON COLUMN "public"."activity"."end_time" IS '结束时间'; + +-- ---------------------------- +-- Table structure for class +-- ---------------------------- +DROP TABLE IF EXISTS "public"."class"; +CREATE TABLE "public"."class" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "course" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "start_week" int2 NOT NULL, + "end_week" int2 NOT NULL, + "time" int2 NOT NULL, + "academic_term" varchar(11) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '2023-2024-1'::character varying, + "place" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying, + "ratio" float4 NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false, + "distribution" jsonb NOT NULL DEFAULT '{}'::jsonb, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "week_day" int2 NOT NULL DEFAULT 1 +) +; +COMMENT ON COLUMN "public"."class"."id" IS '课堂id'; +COMMENT ON COLUMN "public"."class"."course" IS '课程id'; +COMMENT ON COLUMN "public"."class"."start_week" IS '开始周'; +COMMENT ON COLUMN "public"."class"."end_week" IS '结束周'; +COMMENT ON COLUMN "public"."class"."time" IS '节次时间,即第几节课'; +COMMENT ON COLUMN "public"."class"."academic_term" IS '学年学期,格式如2023-2024-2'; +COMMENT ON COLUMN "public"."class"."place" IS '上课地点'; +COMMENT ON COLUMN "public"."class"."ratio" IS '考试成绩占比'; +COMMENT ON COLUMN "public"."class"."distribution" IS '平时分成绩分布,usual_score参考依据'; +COMMENT ON COLUMN "public"."class"."name" IS '课堂名称'; +COMMENT ON COLUMN "public"."class"."week_day" IS '星期几'; + +-- ---------------------------- +-- Table structure for course +-- ---------------------------- +DROP TABLE IF EXISTS "public"."course"; +CREATE TABLE "public"."course" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "course_hours" int2 NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false, + "spring_term" bool NOT NULL DEFAULT true, + "target_major" varchar[] COLLATE "pg_catalog"."default" NOT NULL DEFAULT ARRAY[''::text], + "target_grade" int2[] NOT NULL +) +; +COMMENT ON COLUMN "public"."course"."id" IS '课程id'; +COMMENT ON COLUMN "public"."course"."name" IS '课程名称'; +COMMENT ON COLUMN "public"."course"."course_hours" IS '课时'; +COMMENT ON COLUMN "public"."course"."spring_term" IS '是否春季期课程(false即是秋季期)'; +COMMENT ON COLUMN "public"."course"."target_major" IS '上课专业'; +COMMENT ON COLUMN "public"."course"."target_grade" IS '上课专业'; + +-- ---------------------------- +-- Table structure for course_selection +-- ---------------------------- +DROP TABLE IF EXISTS "public"."course_selection"; +CREATE TABLE "public"."course_selection" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "student" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "schedule" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false, + "activity" varchar(64) COLLATE "pg_catalog"."default" NOT NULL +) +; +COMMENT ON COLUMN "public"."course_selection"."id" IS '选课记录id'; +COMMENT ON COLUMN "public"."course_selection"."student" IS '学生id'; +COMMENT ON COLUMN "public"."course_selection"."schedule" IS '课堂id'; +COMMENT ON COLUMN "public"."course_selection"."activity" IS '选课时候的活动id'; + +-- ---------------------------- +-- Table structure for experiment_item +-- ---------------------------- +DROP TABLE IF EXISTS "public"."experiment_item"; +CREATE TABLE "public"."experiment_item" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "course" int8 NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."experiment_item"."id" IS '实验项目id'; +COMMENT ON COLUMN "public"."experiment_item"."name" IS '项目名称'; +COMMENT ON COLUMN "public"."experiment_item"."course" IS '课程id'; + +-- ---------------------------- +-- Table structure for experiment_score +-- ---------------------------- +DROP TABLE IF EXISTS "public"."experiment_score"; +CREATE TABLE "public"."experiment_score" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "student" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "experiment" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "score" int2 NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."experiment_score"."id" IS '成绩id'; +COMMENT ON COLUMN "public"."experiment_score"."student" IS '学生id'; +COMMENT ON COLUMN "public"."experiment_score"."experiment" IS '实验id'; +COMMENT ON COLUMN "public"."experiment_score"."score" IS '实验分'; + +-- ---------------------------- +-- Table structure for major +-- ---------------------------- +DROP TABLE IF EXISTS "public"."major"; +CREATE TABLE "public"."major" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."major"."id" IS '专业id'; +COMMENT ON COLUMN "public"."major"."name" IS '专业名称'; + +-- ---------------------------- +-- Table structure for score +-- ---------------------------- +DROP TABLE IF EXISTS "public"."score"; +CREATE TABLE "public"."score" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "student" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "usual_score" float4 NOT NULL, + "exam_score" float4 NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false, + "class" varchar(64) COLLATE "pg_catalog"."default" NOT NULL +) +; +COMMENT ON COLUMN "public"."score"."id" IS '成绩id'; +COMMENT ON COLUMN "public"."score"."student" IS '学生id'; +COMMENT ON COLUMN "public"."score"."usual_score" IS '平时分'; +COMMENT ON COLUMN "public"."score"."exam_score" IS '考试分'; +COMMENT ON COLUMN "public"."score"."class" IS '课堂id'; + +-- ---------------------------- +-- Table structure for student_info +-- ---------------------------- +DROP TABLE IF EXISTS "public"."student_info"; +CREATE TABLE "public"."student_info" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "student_number" varchar(12) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "major" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "grade" int2 NOT NULL DEFAULT 2, + "class" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."student_info"."id" IS '学生id'; +COMMENT ON COLUMN "public"."student_info"."student_number" IS '学号'; +COMMENT ON COLUMN "public"."student_info"."name" IS '学生姓名'; +COMMENT ON COLUMN "public"."student_info"."major" IS '专业id'; +COMMENT ON COLUMN "public"."student_info"."grade" IS '年级,使用大x表示,如大二:2'; +COMMENT ON COLUMN "public"."student_info"."class" IS '班级'; + +-- ---------------------------- +-- Table structure for teacher_class +-- ---------------------------- +DROP TABLE IF EXISTS "public"."teacher_class"; +CREATE TABLE "public"."teacher_class" ( + "teacher" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "class" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."teacher_class"."teacher" IS '教师id'; +COMMENT ON COLUMN "public"."teacher_class"."class" IS '课程班级id'; + +-- ---------------------------- +-- Table structure for teacher_info +-- ---------------------------- +DROP TABLE IF EXISTS "public"."teacher_info"; +CREATE TABLE "public"."teacher_info" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."teacher_info"."id" IS '教师id'; +COMMENT ON COLUMN "public"."teacher_info"."name" IS '教师姓名'; + +-- ---------------------------- +-- Table structure for user_basic +-- ---------------------------- +DROP TABLE IF EXISTS "public"."user_basic"; +CREATE TABLE "public"."user_basic" ( + "id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "username" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "password" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "create_time" timestamp(6) NOT NULL DEFAULT now(), + "edit_time" timestamp(6) NOT NULL DEFAULT now(), + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."user_basic"."id" IS '用户uuid'; +COMMENT ON COLUMN "public"."user_basic"."username" IS '用户名,登陆用'; +COMMENT ON COLUMN "public"."user_basic"."password" IS '密码'; +COMMENT ON COLUMN "public"."user_basic"."type" IS '用户类型,0:学生,1:教师,2:管理员'; + +-- ---------------------------- +-- Function structure for cs_timestamp +-- ---------------------------- +DROP FUNCTION IF EXISTS "public"."cs_timestamp"(); +CREATE OR REPLACE FUNCTION "public"."cs_timestamp"() + RETURNS "pg_catalog"."trigger" AS $BODY$ +begin + new.update_time= current_timestame; + return new; +end +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; + +-- ---------------------------- +-- Indexes structure for table activity +-- ---------------------------- +CREATE INDEX "act_idx_end" ON "public"."activity" USING brin ( + "end_time" "pg_catalog"."timestamp_minmax_ops" +); +CREATE INDEX "act_idx_id" ON "public"."activity" USING hash ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" +); +CREATE INDEX "act_idx_start" ON "public"."activity" USING brin ( + "start_time" "pg_catalog"."timestamp_minmax_ops" +); +CREATE INDEX "act_idx_term" ON "public"."activity" USING btree ( + "term" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table activity +-- ---------------------------- +ALTER TABLE "public"."activity" ADD CONSTRAINT "activity_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table class +-- ---------------------------- +CREATE INDEX "cs_idx_course" ON "public"."class" USING btree ( + "course" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "cs_idx_id" ON "public"."class" USING btree ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "cs_idx_term" ON "public"."class" USING btree ( + "academic_term" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table class +-- ---------------------------- +ALTER TABLE "public"."class" ADD CONSTRAINT "class_pkey" PRIMARY KEY ("id", "course"); + +-- ---------------------------- +-- Indexes structure for table course +-- ---------------------------- +CREATE INDEX "cours_idx_major" ON "public"."course" USING gin ( + "target_major" COLLATE "pg_catalog"."default" "pg_catalog"."array_ops" +) WITH (GIN_PENDING_LIST_LIMIT = 64); +CREATE INDEX "course_idx_grade" ON "public"."course" USING gin ( + "target_grade" "pg_catalog"."array_ops" +) WITH (GIN_PENDING_LIST_LIMIT = 64); +CREATE INDEX "course_idx_id" ON "public"."course" USING hash ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" +); +COMMENT ON INDEX "public"."course_idx_id" IS 'id索引'; + +-- ---------------------------- +-- Primary Key structure for table course +-- ---------------------------- +ALTER TABLE "public"."course" ADD CONSTRAINT "course_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table course_selection +-- ---------------------------- +CREATE INDEX "csel_idex_student" ON "public"."course_selection" USING btree ( + "student" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "csel_idx_activity" ON "public"."course_selection" USING btree ( + "activity" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "csel_idx_course" ON "public"."course_selection" USING btree ( + "schedule" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "csel_idx_id" ON "public"."course_selection" USING btree ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table course_selection +-- ---------------------------- +ALTER TABLE "public"."course_selection" ADD CONSTRAINT "course_selection_pkey" PRIMARY KEY ("id", "student", "schedule"); + +-- ---------------------------- +-- Primary Key structure for table experiment_item +-- ---------------------------- +ALTER TABLE "public"."experiment_item" ADD CONSTRAINT "course_experiment_pkey" PRIMARY KEY ("id", "course"); + +-- ---------------------------- +-- Primary Key structure for table experiment_score +-- ---------------------------- +ALTER TABLE "public"."experiment_score" ADD CONSTRAINT "experiment_score_pkey" PRIMARY KEY ("id", "student", "experiment"); + +-- ---------------------------- +-- Indexes structure for table major +-- ---------------------------- +CREATE INDEX "major_idx_id" ON "public"."major" USING hash ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" +); +CREATE INDEX "major_idx_name" ON "public"."major" USING btree ( + "name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table major +-- ---------------------------- +ALTER TABLE "public"."major" ADD CONSTRAINT "major_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table score +-- ---------------------------- +CREATE INDEX "score_idx_class" ON "public"."score" USING btree ( + "class" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "score_idx_id" ON "public"."score" USING hash ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" +); +CREATE INDEX "score_idx_student" ON "public"."score" USING btree ( + "student" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table score +-- ---------------------------- +ALTER TABLE "public"."score" ADD CONSTRAINT "score_pkey" PRIMARY KEY ("id", "student", "class"); + +-- ---------------------------- +-- Indexes structure for table student_info +-- ---------------------------- +CREATE INDEX "stu_dix_grade" ON "public"."student_info" USING btree ( + "grade" "pg_catalog"."int2_ops" ASC NULLS LAST +); +CREATE INDEX "stu_idx_id" ON "public"."student_info" USING hash ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" +); +CREATE INDEX "stu_idx_major" ON "public"."student_info" USING btree ( + "major" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "stu_idx_num" ON "public"."student_info" USING btree ( + "student_number" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table student_info +-- ---------------------------- +ALTER TABLE "public"."student_info" ADD CONSTRAINT "student_info_pkey" PRIMARY KEY ("id", "student_number"); + +-- ---------------------------- +-- Indexes structure for table teacher_class +-- ---------------------------- +CREATE INDEX "tc_idx_course" ON "public"."teacher_class" USING btree ( + "class" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "tc_idx_teacher" ON "public"."teacher_class" USING btree ( + "teacher" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table teacher_class +-- ---------------------------- +ALTER TABLE "public"."teacher_class" ADD CONSTRAINT "teacher_course_pkey" PRIMARY KEY ("teacher", "class"); + +-- ---------------------------- +-- Indexes structure for table teacher_info +-- ---------------------------- +CREATE INDEX "ti_idx_id" ON "public"."teacher_info" USING hash ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" +); + +-- ---------------------------- +-- Primary Key structure for table teacher_info +-- ---------------------------- +ALTER TABLE "public"."teacher_info" ADD CONSTRAINT "teacher_info_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table user_basic +-- ---------------------------- +CREATE INDEX "usr_idx_id" ON "public"."user_basic" USING hash ( + "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" +); +CREATE INDEX "usr_idx_username" ON "public"."user_basic" USING btree ( + "username" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table user_basic +-- ---------------------------- +ALTER TABLE "public"."user_basic" ADD CONSTRAINT "user_pkey" PRIMARY KEY ("id", "username", "password"); diff --git a/backend/pom.xml b/backend/pom.xml new file mode 100644 index 0000000..40760fd --- /dev/null +++ b/backend/pom.xml @@ -0,0 +1,240 @@ + + + 4.0.0 + + net.lensfrex.service + radical-dreamers + ${revision} + + + 17 + 17 + UTF-8 + + 0.0.1-SNAPSHOT + + 3.1.1 + + 3.1.6 + 2.0 + 5.10.0-RC1 + + 3.5.3.1 + 3.0.2 + 1.18.26 + 5.8.20 + + 1.34.0 + + 1.2.18 + + 6.2.5.RELEASE + + 1.0.6 + + 3.3.2 + + + + + + org.springframework.boot + spring-boot-dependencies + ${springboot.version} + pom + import + + + cn.hutool + hutool-bom + ${hutool.version} + pom + import + + + + + + + com.baomidou + mybatis-plus-boot-starter-test + 3.5.3.2 + test + + + + org.springframework.boot + spring-boot-devtools + true + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis.version} + + + org.postgresql + postgresql + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + com.github.ben-manes.caffeine + caffeine + ${caffeine.version} + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.apache.commons + commons-pool2 + + + io.lettuce + lettuce-core + ${lettuce.bersion} + + + + + com.github.yitter + yitter-idgenerator + ${idgen.version} + + + + + cn.dev33 + sa-token-spring-boot3-starter + ${satoken.version} + + + cn.dev33 + sa-token-dao-redis-jackson + ${satoken.version} + + + + + cn.hutool + hutool-crypto + + + cn.hutool + hutool-core + + + + cn.wustlinghang.mywust + mywust-core + 0.0.4-alpha + + + cn.wustlinghang.mywust + mywust-network-okhttp + 0.0.4-alpha + + + + + com.alibaba + easyexcel + ${easyexcel.version} + + + org.apache.commons + commons-compress + 1.23.0 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + org.projectlombok + lombok + + + + + + + repackage + + + + + + + \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/BackendMain.java b/backend/src/main/java/net/lensfrex/rd/BackendMain.java new file mode 100644 index 0000000..b6a468b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/BackendMain.java @@ -0,0 +1,29 @@ +package net.lensfrex.rd; + +import com.github.yitter.contract.IdGeneratorOptions; +import com.github.yitter.idgen.YitIdHelper; +import org.mybatis.spring.annotation.MapperScan; +import org.slf4j.MDC; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import java.lang.management.ManagementFactory; + +@EnableAsync +@EnableScheduling +@SpringBootApplication +@EnableTransactionManagement +@MapperScan(basePackages = "net.lensfrex.rd.dao.mapper") +public class BackendMain { + public static void main(String[] args) { + IdGeneratorOptions options = new IdGeneratorOptions(); + options.WorkerIdBitLength = 4; + options.WorkerId = 0; + YitIdHelper.setIdGenerator(options); + + SpringApplication.run(BackendMain.class, args); + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/cache/CacheManager.java b/backend/src/main/java/net/lensfrex/rd/cache/CacheManager.java new file mode 100644 index 0000000..307bc7d --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/cache/CacheManager.java @@ -0,0 +1,18 @@ +package net.lensfrex.rd.cache; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +@Component +public class CacheManager { + private static final Cache cache = Caffeine.newBuilder() + .expireAfterWrite(2, TimeUnit.DAYS) + .initialCapacity(256) + .maximumSize(2048) + .build(); + + +} diff --git a/backend/src/main/java/net/lensfrex/rd/configure/CorsFilter.java b/backend/src/main/java/net/lensfrex/rd/configure/CorsFilter.java new file mode 100644 index 0000000..8becc09 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/configure/CorsFilter.java @@ -0,0 +1,34 @@ +package net.lensfrex.rd.configure; + +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +@WebFilter(filterName = "CorsFilter", urlPatterns = "/*") +public class CorsFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) servletResponse; + + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); + response.setHeader("Access-Control-Allow-Headers", "*"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/configure/JacksonConfigure.java b/backend/src/main/java/net/lensfrex/rd/configure/JacksonConfigure.java new file mode 100644 index 0000000..1a8823b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/configure/JacksonConfigure.java @@ -0,0 +1,35 @@ +package net.lensfrex.rd.configure; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +@Configuration +public class JacksonConfigure { + @Bean + public ObjectMapper objectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + + // other serializer and deSerializer config ... + + JavaTimeModule javaTimeModule = new JavaTimeModule(); + + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME)); + + objectMapper.registerModule(javaTimeModule); + return objectMapper; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/configure/MybatisConfigure.java b/backend/src/main/java/net/lensfrex/rd/configure/MybatisConfigure.java new file mode 100644 index 0000000..0266261 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/configure/MybatisConfigure.java @@ -0,0 +1,17 @@ +package net.lensfrex.rd.configure; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MybatisConfigure { + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); + return interceptor; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/configure/MywustConfigure.java b/backend/src/main/java/net/lensfrex/rd/configure/MywustConfigure.java new file mode 100644 index 0000000..139c5d6 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/configure/MywustConfigure.java @@ -0,0 +1,50 @@ +package net.lensfrex.rd.configure; + +import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCourseTableParser; +import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradStudentInfoPageParser; +import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; +import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCourseTableApiService; +import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradStudentInfoApiService; +import cn.wustlinghang.mywust.network.RequestClientOption; +import cn.wustlinghang.mywust.network.Requester; +import cn.wustlinghang.mywust.network.okhttp.SimpleOkhttpRequester; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MywustConfigure { + @Bean + public RequestClientOption requestClientOption() { + return new RequestClientOption(); + } + + @Bean + public Requester requester() { + return new SimpleOkhttpRequester(requestClientOption()); + } + + @Bean + public UndergraduateLogin undergraduateLogin(Requester requester) { + return new UndergraduateLogin(requester); + } + + @Bean + public UndergradStudentInfoApiService undergradStudentInfoApiService(Requester requester) { + return new UndergradStudentInfoApiService(requester); + } + + @Bean + public UndergradStudentInfoPageParser undergradStudentInfoPageParser() { + return new UndergradStudentInfoPageParser(); + } + + @Bean + public UndergradCourseTableApiService undergradCourseTableApiService(Requester requester) { + return new UndergradCourseTableApiService(requester); + } + + @Bean + public UndergradCourseTableParser undergradCourseTableParser() { + return new UndergradCourseTableParser(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/configure/PasswordConfigure.java b/backend/src/main/java/net/lensfrex/rd/configure/PasswordConfigure.java new file mode 100644 index 0000000..7587063 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/configure/PasswordConfigure.java @@ -0,0 +1,13 @@ +package net.lensfrex.rd.configure; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties("little-busters.password") +public class PasswordConfigure { + private String key; + private String iv; +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/Health.java b/backend/src/main/java/net/lensfrex/rd/controller/Health.java new file mode 100644 index 0000000..f2c13ab --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/Health.java @@ -0,0 +1,13 @@ +package net.lensfrex.rd.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/health") +public class Health { + @RequestMapping("") + public String health() { + return ""; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/activity/ActivityController.java b/backend/src/main/java/net/lensfrex/rd/controller/activity/ActivityController.java new file mode 100644 index 0000000..719dcc7 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/activity/ActivityController.java @@ -0,0 +1,45 @@ +package net.lensfrex.rd.controller.activity; + +import net.lensfrex.rd.data.entity.table.Activity; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.activity.ActivityService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/activity") +public class ActivityController { + + private final ActivityService activityService; + + public ActivityController(ActivityService activityService) { + this.activityService = activityService; + } + + @RequestMapping("/current") + public Response> current() { + var result = activityService.getCurrentActivity(); + + return Response.success(result); + } + + @RequestMapping("/list") + public Response>> list( + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize + ) { + var result = activityService.list(page, pageSize); + return Response.success(result); + } + + @RequestMapping("/info") + public Response info(@RequestParam(value = "id") String id) { + var result = activityService.getById(id); + return Response.success(result); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/activity/AdminActivityController.java b/backend/src/main/java/net/lensfrex/rd/controller/activity/AdminActivityController.java new file mode 100644 index 0000000..dfcd7cb --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/activity/AdminActivityController.java @@ -0,0 +1,51 @@ +package net.lensfrex.rd.controller.activity; + +import cn.dev33.satoken.annotation.SaCheckRole; +import net.lensfrex.rd.data.entity.table.Activity; +import net.lensfrex.rd.data.model.request.admin.ActivityInfoDto; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.exception.data.DataConflictException; +import net.lensfrex.rd.service.activity.ActivityService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/admin/activity") +public class AdminActivityController { + + private final ActivityService activityService; + + public AdminActivityController(ActivityService activityService) { + this.activityService = activityService; + } + + @SaCheckRole("ADMIN") + @PostMapping("/add") + public Response add(@RequestBody ActivityInfoDto request) { + try { + activityService.addActivity(request); + } catch (DataConflictException e) { + return Response.error(ResponseCode.PARAM_WRONG, "同一个学期内一个时间段内只能有一个选课活动"); + } + + return Response.success(); + } + + @SaCheckRole("ADMIN") + @PostMapping("/update") + public Response update(@RequestParam("id") String id, @RequestBody ActivityInfoDto request) { + try { + var activity = activityService.update(id, request); + return Response.success(activity); + } catch (DataConflictException e) { + return Response.error(ResponseCode.PARAM_WRONG, "同一个学期内一个时间段内只能有一个选课活动"); + } + } + + @SaCheckRole("ADMIN") + @PostMapping("/delete") + public Response delete(@RequestParam("id") String id) { + activityService.delete(id); + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/admin/AdminCourseScheduleController.java b/backend/src/main/java/net/lensfrex/rd/controller/admin/AdminCourseScheduleController.java new file mode 100644 index 0000000..b2fee60 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/admin/AdminCourseScheduleController.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.controller.admin; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/admin/course-schedule") +public class AdminCourseScheduleController { +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/course/AdminCourseController.java b/backend/src/main/java/net/lensfrex/rd/controller/course/AdminCourseController.java new file mode 100644 index 0000000..de129f4 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/course/AdminCourseController.java @@ -0,0 +1,57 @@ +package net.lensfrex.rd.controller.course; + +import cn.dev33.satoken.annotation.SaCheckRole; +import net.lensfrex.rd.data.dto.course.CourseDTO; +import net.lensfrex.rd.data.model.request.course.CourseRequest; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.course.CourseService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/admin/course") +public class AdminCourseController { + private final CourseService courseService; + + public AdminCourseController(CourseService courseService) { + this.courseService = courseService; + } + + @SaCheckRole("ADMIN") + @PostMapping("/add") + public Response add(@RequestBody CourseRequest request) { + CourseDTO dto = CourseDTO.builder() + .name(request.getName()) + .courseHours(request.getCourseHours()) + .targetMajor(request.getTargetMajor()) + .targetGrade(request.getTargetGrade()) + .springTerm(request.getSpringTerm()) + .build(); + + var newCourse = courseService.add(dto); + + return Response.success(newCourse); + } + + @SaCheckRole("ADMIN") + @PostMapping("/update") + public Response update(@RequestParam("id") String id, @RequestBody CourseRequest request) { + CourseDTO dto = CourseDTO.builder() + .name(request.getName()) + .courseHours(request.getCourseHours()) + .targetMajor(request.getTargetMajor()) + .targetGrade(request.getTargetGrade()) + .springTerm(request.getSpringTerm()) + .build(); + + var teacherInfo = courseService.update(id, dto); + + return Response.success(teacherInfo); + } + + @SaCheckRole("ADMIN") + @PostMapping("/delete") + public Response delete(@RequestParam("id") String id) { + courseService.delete(id); + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/course/CourseController.java b/backend/src/main/java/net/lensfrex/rd/controller/course/CourseController.java new file mode 100644 index 0000000..6b32b45 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/course/CourseController.java @@ -0,0 +1,38 @@ +package net.lensfrex.rd.controller.course; + +import net.lensfrex.rd.data.dto.course.CourseDTO; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.course.CourseService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/course") +public class CourseController { + + private final CourseService courseService; + + public CourseController(CourseService courseService) { + this.courseService = courseService; + } + + @GetMapping("/list") + public Response>> list( + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize + ) { + var result = courseService.list(page, pageSize); + return Response.success(result); + } + + @GetMapping("/info") + public Response info(@RequestParam(value = "id") String id) { + var result = courseService.getCourse(id); + return Response.success(result); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/course/StudentCourseController.java b/backend/src/main/java/net/lensfrex/rd/controller/course/StudentCourseController.java new file mode 100644 index 0000000..e3d17a4 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/course/StudentCourseController.java @@ -0,0 +1,36 @@ +package net.lensfrex.rd.controller.course; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.stp.StpUtil; +import net.lensfrex.rd.data.dto.course.CourseDTO; +import net.lensfrex.rd.data.entity.table.Course; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.course.CourseResponse; +import net.lensfrex.rd.service.course.CourseService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/student/course") +public class StudentCourseController { + private final CourseService courseService; + + public StudentCourseController(CourseService courseService) { + this.courseService = courseService; + } + + @SaCheckLogin + @SaCheckRole("STUDENT") + @GetMapping("/candidate") + public Response> listCandidate() { + String uid = StpUtil.getLoginId().toString(); + var courses = courseService.getCandidateCourseForStudent(uid); + + return Response.success(courses); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/course/TeacherCourseController.java b/backend/src/main/java/net/lensfrex/rd/controller/course/TeacherCourseController.java new file mode 100644 index 0000000..0502645 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/course/TeacherCourseController.java @@ -0,0 +1,4 @@ +package net.lensfrex.rd.controller.course; + +public class TeacherCourseController { +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/major/AdminMajorController.java b/backend/src/main/java/net/lensfrex/rd/controller/major/AdminMajorController.java new file mode 100644 index 0000000..c57b6c5 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/major/AdminMajorController.java @@ -0,0 +1,32 @@ +package net.lensfrex.rd.controller.major; + +import cn.dev33.satoken.annotation.SaCheckRole; +import net.lensfrex.rd.data.entity.table.Major; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.major.MajorService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/admin/major") +public class AdminMajorController { + + private final MajorService majorService; + + public AdminMajorController(MajorService majorService) { + this.majorService = majorService; + } + + @SaCheckRole("ADMIN") + @PostMapping("/add") + public Response add(@RequestParam("name") String name) { + Major major = majorService.addMajorIfNotExists(name); + return Response.success(major); + } + + @SaCheckRole("ADMIN") + @PostMapping("/delete") + public Response delete(@RequestParam("id") String id) { + majorService.deleteMajor(id); + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/major/PublicMajor.java b/backend/src/main/java/net/lensfrex/rd/controller/major/PublicMajor.java new file mode 100644 index 0000000..bca9392 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/major/PublicMajor.java @@ -0,0 +1,35 @@ +package net.lensfrex.rd.controller.major; + +import net.lensfrex.rd.data.entity.table.Major; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.major.MajorService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Set; + +@RestController +@RequestMapping("/major") +public class PublicMajor { + + private final MajorService majorService; + + public PublicMajor(MajorService majorService) { + this.majorService = majorService; + } + + @GetMapping("/info") + public Response get(@RequestParam("id") String id) { + Major major = majorService.getMajor(id); + return Response.success(major); + } + + @GetMapping("/list") + public Response> list() { + var majorList = majorService.listAllMajor(); + return Response.success(majorList); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/schedule/AdminScheduleController.java b/backend/src/main/java/net/lensfrex/rd/controller/schedule/AdminScheduleController.java new file mode 100644 index 0000000..f00f4da --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/schedule/AdminScheduleController.java @@ -0,0 +1,77 @@ +package net.lensfrex.rd.controller.schedule; + +import cn.dev33.satoken.annotation.SaCheckRole; +import net.lensfrex.rd.data.dto.schedule.CourseScheduleDTO; +import net.lensfrex.rd.data.entity.table.CourseSchedule; +import net.lensfrex.rd.data.model.request.schedule.ClassScheduleRequest; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.schedule.CourseScheduleService; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; + +@RestController +@RequestMapping("/admin/course-schedule") +public class AdminScheduleController { + + private final CourseScheduleService courseScheduleService; + + public AdminScheduleController(CourseScheduleService courseScheduleService) { + this.courseScheduleService = courseScheduleService; + } + + @SaCheckRole("ADMIN") + @PostMapping("/add") + public Response add(@RequestBody ClassScheduleRequest request) { + var dto = convert(request); + + var newCourse = courseScheduleService.add(dto); + + return Response.success(newCourse); + } + + @SaCheckRole("ADMIN") + @RequestMapping("/duplicate") + public Response info(@RequestParam("course") String course, + @RequestParam("from") String sourceTerm, + @RequestParam("to") String targetTerm) { + courseScheduleService.duplicate(course, sourceTerm, targetTerm); + return Response.success(); + } + + @SaCheckRole("ADMIN") + @PostMapping("/update") + public Response update(@RequestParam("id") String id, @RequestBody ClassScheduleRequest request) { + var dto = convert(request); + + var newCourse = courseScheduleService.update(id, dto); + + return Response.success(newCourse); + } + + private CourseScheduleDTO convert(ClassScheduleRequest request) { + CourseScheduleDTO dto = new CourseScheduleDTO(); + dto.setName(request.getName()); + dto.setCourse(request.getCourse()); + dto.setStartWeek(request.getStartWeek()); + dto.setEndWeek(request.getEndWeek()); + dto.setTime(request.getEndWeek()); + dto.setWeekDay(request.getWeekDay()); + dto.setAcademicTerm(request.getTerm()); + dto.setPlace(request.getPlace()); + dto.setRatio(request.getRatio()); + dto.setDistribution(new HashMap<>()); + dto.setTime(request.getSection()); + dto.setTeacherIds(request.getTeachers()); + + return dto; + + } + + @SaCheckRole("ADMIN") + @PostMapping("/delete") + public Response delete(@RequestParam("id") String id) { + courseScheduleService.delete(id); + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/schedule/ScheduleController.java b/backend/src/main/java/net/lensfrex/rd/controller/schedule/ScheduleController.java new file mode 100644 index 0000000..4c74774 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/schedule/ScheduleController.java @@ -0,0 +1,105 @@ +package net.lensfrex.rd.controller.schedule; + +import cn.dev33.satoken.annotation.SaCheckRole; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletResponse; +import net.lensfrex.rd.data.dto.schedule.CourseScheduleDTO; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.service.schedule.CourseScheduleService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +@RestController +@RequestMapping("/course-schedule") +public class ScheduleController { + + private final CourseScheduleService courseScheduleService; + private final ObjectMapper objectMapper; + + public ScheduleController(CourseScheduleService courseScheduleService, ObjectMapper objectMapper) { + this.courseScheduleService = courseScheduleService; + this.objectMapper = objectMapper; + } + + @RequestMapping("/list") + public Response>> list( + @RequestParam(value = "course") String course, + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize) { + + var result = courseScheduleService.getScheduleOfCourse(course, page, pageSize); + return Response.success(result); + } + + @RequestMapping("/list-term") + public Response> getAllForCourse( + @RequestParam(value = "course") String course, + @RequestParam(value = "term") String term + ) { + + var result = courseScheduleService.getTermCourseSchedule(course, term); + return Response.success(result); + } + + @RequestMapping("/list-teachers") + public Response> listTeachers(@RequestParam("id") String scheduleId) { + var result = courseScheduleService.getScheduleTeacherInfo(scheduleId); + return Response.success(result); + } + + @RequestMapping("/info") + public Response info(@RequestParam("id") String id) { + var result = courseScheduleService.getScheduleDTO(id); + return Response.success(result); + } + + @RequestMapping("/selected-count") + public Response selectCount(@RequestParam("id") String id) { + var result = courseScheduleService.getSelectedCount(id); + return Response.success(result); + } + + private class ASD { + + } + + protected class asdd { + + } + @SaCheckRole({"TEACHER", "ADMIN"}) + @RequestMapping("/list-student") + public void exportStudents(@RequestParam("id") String scheduleId, HttpServletResponse response) throws IOException { + if (scheduleId == null) { + Response responseData = Response.error(ResponseCode.PARAM_WRONG); + response.setContentType("application/json"); + response.getWriter().write(objectMapper.writeValueAsString(responseData)); + return; + } + + var data = courseScheduleService.exportStudentExcel(scheduleId); + + if (data == null) { + Response responseData = Response.success("数据是空的"); + response.setContentType("application/json"); + response.getWriter().write(objectMapper.writeValueAsString(responseData)); + return; + } + + response.setContentLength(data.length); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", "export_students_" + scheduleId + ".xlsx")); + + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + + response.getOutputStream().write(data); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/schedule/StudentScheduleController.java b/backend/src/main/java/net/lensfrex/rd/controller/schedule/StudentScheduleController.java new file mode 100644 index 0000000..2efc843 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/schedule/StudentScheduleController.java @@ -0,0 +1,104 @@ +package net.lensfrex.rd.controller.schedule; + +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.stp.StpUtil; +import cn.wustlinghang.mywust.data.common.Course; +import cn.wustlinghang.mywust.exception.ApiException; +import cn.wustlinghang.mywust.exception.ParseException; +import cn.wustlinghang.mywust.util.StringUtil; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.data.dto.schedule.CourseScheduleDTO; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.official.OfficialUndergradScheduleService; +import net.lensfrex.rd.service.schedule.CourseScheduleService; +import net.lensfrex.rd.service.schedule.StudentCourseScheduleService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@RestController +@RequestMapping("/student/course-schedule") +public class StudentScheduleController { + + private final CourseScheduleService courseScheduleService; + private final OfficialUndergradScheduleService officialUndergradScheduleService; + private final StudentCourseScheduleService studentCourseScheduleService; + + public StudentScheduleController(CourseScheduleService courseScheduleService, + OfficialUndergradScheduleService officialUndergradScheduleService, + StudentCourseScheduleService studentCourseScheduleService) { + + this.courseScheduleService = courseScheduleService; + this.officialUndergradScheduleService = officialUndergradScheduleService; + this.studentCourseScheduleService = studentCourseScheduleService; + } + + @SaCheckRole("STUDENT") + @RequestMapping("/current") + public Response> list(@RequestParam(value = "term", required = false, defaultValue = "") String term) { + if (term == null || term.isEmpty()) { + term = StringUtil.getCurrentTermString(); + } + + String uid = StpUtil.getLoginId().toString(); + var result = courseScheduleService.getStudentTermSchedule(uid, term); + + return Response.success(result); + } + + @SaCheckRole("STUDENT") + @RequestMapping("/official") + public Response> getOfficialCourse( + @RequestParam(value = "term", required = false, defaultValue = "") String term) + throws IOException, ParseException, ApiException { + + if (term == null || term.equals("")) { + term = StringUtil.getCurrentTermString(); + log.debug("默认的学期:" + term); + } + + String uid = StpUtil.getLoginId().toString(); + var schedules = officialUndergradScheduleService.getOfficialCourseSchedule(uid, term); + + var result = new ArrayList(schedules.size()); + for (var schedule : schedules) { + result.add(convert(schedule)); + } + + return Response.success(result); + } + + private CourseScheduleDTO convert(Course course) { + CourseScheduleDTO courseScheduleDTO = new CourseScheduleDTO(); + courseScheduleDTO.setName(course.getName()); + courseScheduleDTO.setCourse(course.getName()); + courseScheduleDTO.setStartWeek(course.getStartWeek()); + courseScheduleDTO.setEndWeek(course.getEndWeek()); + courseScheduleDTO.setTime(course.getStartSection() / 2); + courseScheduleDTO.setWeekDay(course.getWeekDay()); + courseScheduleDTO.setPlace(course.getClassroom()); + courseScheduleDTO.setDistribution(null); + + List teachers = new ArrayList<>(); + teachers.add(TeacherInfo.builder().name(course.getTeacher()).build()); + courseScheduleDTO.setTeachers(teachers); + + return courseScheduleDTO; + } + + @SaCheckRole("STUDENT") + @RequestMapping("/select") + public Response select(@RequestParam("schedule") String schedule, @RequestParam("activity") String activity) { + String uid = StpUtil.getLoginId().toString(); + + studentCourseScheduleService.selectSchedule(uid, schedule, activity); + + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/schedule/TeacherScheduleController.java b/backend/src/main/java/net/lensfrex/rd/controller/schedule/TeacherScheduleController.java new file mode 100644 index 0000000..f9ec1af --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/schedule/TeacherScheduleController.java @@ -0,0 +1,37 @@ +package net.lensfrex.rd.controller.schedule; + +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.stp.StpUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletResponse; +import net.lensfrex.rd.data.dto.schedule.CourseScheduleDTO; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.service.schedule.TeacherCourseScheduleService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +@RestController +@RequestMapping("/teacher/course-schedule") +public class TeacherScheduleController { + private final TeacherCourseScheduleService teacherCourseScheduleService; + + public TeacherScheduleController(TeacherCourseScheduleService teacherCourseScheduleService) { + + this.teacherCourseScheduleService = teacherCourseScheduleService; + } + + @SaCheckRole("TEACHER") + @RequestMapping("/my-class") + public Response> list(@RequestParam("term") String term) { + String uid = StpUtil.getLoginId().toString(); + + var result = teacherCourseScheduleService.getTeacherSchedule(uid, term); + + return Response.success(result); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/score/ScoreController.java b/backend/src/main/java/net/lensfrex/rd/controller/score/ScoreController.java new file mode 100644 index 0000000..cabe067 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/score/ScoreController.java @@ -0,0 +1,56 @@ +package net.lensfrex.rd.controller.score; + +import cn.dev33.satoken.annotation.SaCheckRole; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletResponse; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.service.score.ScoreService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@RestController +@RequestMapping("/score") +public class ScoreController { + private final ScoreService scoreService; + + private final ObjectMapper objectMapper; + + public ScoreController(ScoreService scoreService, ObjectMapper objectMapper) { + this.scoreService = scoreService; + this.objectMapper = objectMapper; + } + + @SaCheckRole({"TEACHER", "ADMIN"}) + @RequestMapping("/export") + public void exportStudents(@RequestParam("id") String scheduleId, HttpServletResponse response) throws IOException { + if (scheduleId == null) { + Response responseData = Response.error(ResponseCode.PARAM_WRONG); + response.setContentType("application/json"); + response.getWriter().write(objectMapper.writeValueAsString(responseData)); + return; + } + + var data = scoreService.exportScoreExcel(scheduleId); + + if (data == null) { + Response responseData = Response.success("数据是空的"); + response.setContentType("application/json"); + response.getWriter().write(objectMapper.writeValueAsString(responseData)); + return; + } + + response.setContentLength(data.length); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", "export_score_" + scheduleId + ".xlsx")); + + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + + response.getOutputStream().write(data); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/score/StudentScoreController.java b/backend/src/main/java/net/lensfrex/rd/controller/score/StudentScoreController.java new file mode 100644 index 0000000..6fcb10b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/score/StudentScoreController.java @@ -0,0 +1,31 @@ +package net.lensfrex.rd.controller.score; + +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.stp.StpUtil; +import net.lensfrex.rd.data.dto.score.StudentScore; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.score.ScoreService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/student/score") +public class StudentScoreController { + + private final ScoreService scoreService; + + public StudentScoreController(ScoreService scoreService) { + this.scoreService = scoreService; + } + + @SaCheckRole("STUDENT") + @RequestMapping("/all") + public Response> getAll() { + String uid = StpUtil.getLoginId().toString(); + var result = scoreService.getStudentScore(uid); + + return Response.success(result); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/score/TeacherScoreController.java b/backend/src/main/java/net/lensfrex/rd/controller/score/TeacherScoreController.java new file mode 100644 index 0000000..f985d43 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/score/TeacherScoreController.java @@ -0,0 +1,45 @@ +package net.lensfrex.rd.controller.score; + +import cn.dev33.satoken.annotation.SaCheckRole; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletResponse; +import net.lensfrex.rd.data.dto.score.ScheduleScore; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.service.score.ScoreService; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +@RestController +@RequestMapping("/teacher/score") +public class TeacherScoreController { + + private final ScoreService scoreService; + + public TeacherScoreController(ScoreService scoreService) { + this.scoreService = scoreService; + } + + @SaCheckRole("TEACHER") + @RequestMapping("/list-students") + public Response> listStudents(@RequestParam("id") String schedule) { + var result = scoreService.getClassScore(schedule); + + return Response.success(result); + } + + @SaCheckRole("TEACHER") + @PostMapping("/update") + public Response update(@RequestParam("schedule") String scheduleId, + @RequestParam(value = "scoreId", required = false) String scoreId, + @RequestBody ScheduleScore scheduleScore) { + + scoreService.insertOrUpdateScore(scheduleId, scoreId, scheduleScore); + + return Response.success(); + } +} + + diff --git a/backend/src/main/java/net/lensfrex/rd/controller/student/AdminStudentController.java b/backend/src/main/java/net/lensfrex/rd/controller/student/AdminStudentController.java new file mode 100644 index 0000000..401a5b2 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/student/AdminStudentController.java @@ -0,0 +1,67 @@ +package net.lensfrex.rd.controller.student; + +import cn.dev33.satoken.annotation.SaCheckRole; +import net.lensfrex.rd.data.dto.user.student.BasicStudentInfoDto; +import net.lensfrex.rd.data.dto.user.student.NewStudentDTO; +import net.lensfrex.rd.data.dto.user.student.StudentUserBasicDTO; +import net.lensfrex.rd.data.dto.user.student.StudentUserInfoDTO; +import net.lensfrex.rd.data.dto.user.teacher.TeacherUserDTO; +import net.lensfrex.rd.data.entity.table.StudentInfo; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import net.lensfrex.rd.data.model.request.admin.StudentAddRequest; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.service.user.StudentUserService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/admin/user/student") +public class AdminStudentController { + private final StudentUserService studentUserService; + + public AdminStudentController(StudentUserService studentUserService) { + this.studentUserService = studentUserService; + } + + @SaCheckRole("ADMIN") + @PostMapping("/add") + public Response add(@RequestBody StudentAddRequest request) { + var dto = new BasicStudentInfoDto(request.studentNumber(), request.studentName(), request.major()); + + var teacherInfo = studentUserService.add(dto); + return Response.success(teacherInfo); + } + + @SaCheckRole("ADMIN") + @PostMapping("/add-with-auto-major") + public Response addWithAutoMajor(@RequestBody StudentAddRequest request) { + if (request.studentNumber() == null || request.studentName() == null || request.major() == null) { + return Response.error(ResponseCode.PARAM_WRONG); + } + var dto = new BasicStudentInfoDto(request.studentNumber(), request.studentName(), request.major()); + + var teacherInfo = studentUserService.addWithAutoMajor(dto); + return Response.success(teacherInfo); + } +// +// @SaCheckRole("ADMIN") +// @PostMapping("/update") +// public Response update(@RequestParam("id") String id, @RequestBody StudentAddRequest request) { +// String username = request.studentNumber(); +// String teacherName = request.studentName(); +// String initialPassword = request.initialPassword(); +// +// var dto = new BasicStudentInfoDto(request.studentNumber(), request.studentName()); +// +// var teacherInfo = studentUserService.update(id, dto); +// +// return Response.success(teacherInfo); +// } + + @SaCheckRole("ADMIN") + @PostMapping("/delete") + public Response delete(@RequestParam("id") String id) { + studentUserService.delete(id); + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/student/StudentController.java b/backend/src/main/java/net/lensfrex/rd/controller/student/StudentController.java new file mode 100644 index 0000000..d25e7e2 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/student/StudentController.java @@ -0,0 +1,38 @@ +package net.lensfrex.rd.controller.student; + +import net.lensfrex.rd.data.dto.user.student.StudentUserInfoDTO; +import net.lensfrex.rd.data.entity.table.StudentInfo; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.user.StudentUserService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/student") +public class StudentController { + private final StudentUserService studentUserService; + + public StudentController(StudentUserService studentUserService) { + this.studentUserService = studentUserService; + } + + @GetMapping("/list") + public Response>> list( + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize + ) { + var result = studentUserService.list(page, pageSize); + return Response.success(result); + } + + @GetMapping("/info") + public Response info(@RequestParam(value = "id") String id) { + var result = studentUserService.getInfoById(id); + return Response.success(result); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/teacher/AdminTeacherController.java b/backend/src/main/java/net/lensfrex/rd/controller/teacher/AdminTeacherController.java new file mode 100644 index 0000000..658f505 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/teacher/AdminTeacherController.java @@ -0,0 +1,56 @@ +package net.lensfrex.rd.controller.teacher; + +import cn.dev33.satoken.annotation.SaCheckRole; +import net.lensfrex.rd.data.dto.user.teacher.TeacherUserDTO; +import net.lensfrex.rd.data.dto.user.teacher.TeacherUserInfoDTO; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import net.lensfrex.rd.data.model.request.admin.TeacherAddRequest; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.user.TeacherUserService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/admin/user/teacher") +public class AdminTeacherController { + private final TeacherUserService teacherUserService; + + public AdminTeacherController(TeacherUserService teacherUserService) { + this.teacherUserService = teacherUserService; + } + + @SaCheckRole("ADMIN") + @PostMapping("/add") + public Response add(@RequestBody TeacherAddRequest request) { + String username = request.username(); + String teacherName = request.teacherName(); + String initialPassword = request.initialPassword(); + + TeacherUserDTO dto = new TeacherUserDTO(username, teacherName, initialPassword); + + var teacherInfo = teacherUserService.add(dto); + return Response.success(teacherInfo); + } + + @SaCheckRole("ADMIN") + @PostMapping("/update") + public Response update(@RequestParam("id") String id, @RequestBody TeacherAddRequest request) { + String username = request.username(); + String teacherName = request.teacherName(); + String initialPassword = request.initialPassword(); + + TeacherUserDTO dto = new TeacherUserDTO(username, teacherName, initialPassword); + var teacherInfo = teacherUserService.update(id, dto); + + return Response.success(teacherInfo); + } + + @SaCheckRole("ADMIN") + @PostMapping("/delete") + public Response delete(@RequestParam("id") String id) { + teacherUserService.delete(id); + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/teacher/TeacherController.java b/backend/src/main/java/net/lensfrex/rd/controller/teacher/TeacherController.java new file mode 100644 index 0000000..6f86058 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/teacher/TeacherController.java @@ -0,0 +1,38 @@ +package net.lensfrex.rd.controller.teacher; + +import cn.dev33.satoken.annotation.SaCheckRole; +import net.lensfrex.rd.data.dto.user.teacher.TeacherUserDTO; +import net.lensfrex.rd.data.dto.user.teacher.TeacherUserInfoDTO; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import net.lensfrex.rd.data.model.request.admin.TeacherAddRequest; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.service.user.TeacherUserService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/teacher") +public class TeacherController { + private final TeacherUserService teacherUserService; + + public TeacherController(TeacherUserService teacherUserService) { + this.teacherUserService = teacherUserService; + } + + @GetMapping("/list") + public Response>> list( + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize + ) { + var result = teacherUserService.list(page, pageSize); + return Response.success(result); + } + + @GetMapping("/info") + public Response info(@RequestParam(value = "id") String id) { + var result = teacherUserService.getUserInfoById(id); + return Response.success(result); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/user/UserAuthController.java b/backend/src/main/java/net/lensfrex/rd/controller/user/UserAuthController.java new file mode 100644 index 0000000..a9a9105 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/user/UserAuthController.java @@ -0,0 +1,134 @@ +package net.lensfrex.rd.controller.user; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.stp.StpUtil; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.configure.PasswordConfigure; +import net.lensfrex.rd.data.entity.table.UserBasic; +import net.lensfrex.rd.data.enums.UserType; +import net.lensfrex.rd.data.model.request.auth.UserLoginRequest; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.data.model.response.auth.UserLoginStatusResponse; +import net.lensfrex.rd.data.model.response.user.UserBasicInfo; +import net.lensfrex.rd.service.user.StudentUserService; +import net.lensfrex.rd.service.user.UserBasicService; +import net.lensfrex.rd.util.PasswordUtil; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 登录认证Controller + */ +@Slf4j +@RestController +@RequestMapping("/user/auth") +public class UserAuthController { + + private final UserBasicService userBasicService; + private final PasswordUtil passwordUtil; + + private final StudentUserService studentUserService; + + public UserAuthController(UserBasicService userBasicService, + PasswordConfigure passwordConfigure, + StudentUserService studentUserService) { + + this.userBasicService = userBasicService; + this.passwordUtil = new PasswordUtil(passwordConfigure.getKey(), passwordConfigure.getIv()); + this.studentUserService = studentUserService; + } + + @RequestMapping("/login") + public Response login(@RequestBody UserLoginRequest loginRequest) { + String username = loginRequest.username(); + String password = loginRequest.password(); + + UserBasic userBasic = userBasicService.getUserBasicByUsername(username); + if (userBasic == null || userBasic.getPassword() == null || "".equals(userBasic.getPassword())) { + // 用户不存在,尝试从教务处获取用户信息 + log.info("用户'{}'不存在,尝试从教务处获取用户信息", username); + try { + var newStudentDto = studentUserService.tryAddStudentFromOfficial(username, password); + userBasic = newStudentDto.userBasic(); + } catch (Exception e) { + return Response.error(ResponseCode.STUDENT_ID_DOES_NOT_EXISTS.getCode(), + "从教务处获取用户信息失败,\n" + + "如果是非学生学生用户,请检查用户名是否正确;\n" + + "如果是学生用户,请检查用户名和密码,或者再重试重试一下。\nException:" + e + ); + } + } else { + // 用户已经存在,直接从数据库获取数据 + String encodedPassword = passwordUtil.encode(password); + if (!encodedPassword.equals(userBasic.getPassword())) { + log.info("用户'{}'不存在,尝试从教务处获取用户信息", username); + try { + var newStudentDto = studentUserService.tryAddStudentFromOfficial(username, password); + userBasic = newStudentDto.userBasic(); + } catch (Exception e) { + return Response.error(ResponseCode.PASSWORD_WRONG); + } + } + } + + StpUtil.login(userBasic.getId()); + + UserType userType = switch (userBasic.getType()) { + case 0 -> UserType.STUDENT; + case 1 -> UserType.TEACHER; + case 2 -> UserType.ADMIN; + default -> { + log.warn("未知的用户类型:{}", userBasic.getType()); + yield UserType.STUDENT; + } + }; + + var basicInfoResponse = UserBasicInfo.builder() + .id(userBasic.getId()) + .username(userBasic.getUsername()) + .userType(userType) + .build(); + + return Response.success(basicInfoResponse); + } + + @RequestMapping("/logout") + public Response logout() { + StpUtil.logout(); + return Response.success(); + } + + @RequestMapping("/check") + public Response checkLogin() { + boolean login = StpUtil.isLogin(); + if (!login) { + return Response.success(new UserLoginStatusResponse(null, null, false)); + } + + String uid = StpUtil.getLoginId().toString(); + String role = StpUtil.getRoleList().get(0); + + return Response.success(new UserLoginStatusResponse(uid, role, true)); + } + + @SaCheckLogin + @RequestMapping("/modify-password") + public Response modifyPassword(@RequestParam("old") String oldPassword, + @RequestParam("new") String newPassword) { + String uid = StpUtil.getLoginId().toString(); + var userBasic = userBasicService.getUserBasicById(uid); + String encodedPassword = passwordUtil.encode(oldPassword); + if (!encodedPassword.equals(userBasic.getPassword())) { + return Response.error(ResponseCode.PASSWORD_WRONG); + } + + userBasicService.updatePassword(uid, newPassword); + + StpUtil.logout(); + + return Response.success(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/controller/user/UserInfoController.java b/backend/src/main/java/net/lensfrex/rd/controller/user/UserInfoController.java new file mode 100644 index 0000000..20cd1e1 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/controller/user/UserInfoController.java @@ -0,0 +1,34 @@ +package net.lensfrex.rd.controller.user; + +import cn.dev33.satoken.stp.StpUtil; +import net.lensfrex.rd.data.enums.UserType; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import net.lensfrex.rd.service.user.UserInfoService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/user/info") +public class UserInfoController { + private final UserInfoService userInfoService; + + public UserInfoController(UserInfoService userInfoService) { + this.userInfoService = userInfoService; + } + + @RequestMapping("") + public Object getUserInfo(@RequestParam("uid") String uid, @RequestParam("userType") String userType) { + // 如果不是自己的账号并且也不是管理员 + if (!StpUtil.getLoginId().equals(uid) && !StpUtil.hasRole(UserType.ADMIN.name())) { + return Response.error(ResponseCode.PERMISSION_DENIED); + } + + Object userInfo = switch (userType) { + case "STUDENT" -> userInfoService.getAsStudent(uid); + case "TEACHER" -> userInfoService.getAsTeacher(uid); + default -> null; + }; + + return Response.success(userInfo); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/activity/ActivityMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/activity/ActivityMapper.java new file mode 100644 index 0000000..4b5a6ac --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/activity/ActivityMapper.java @@ -0,0 +1,10 @@ +package net.lensfrex.rd.dao.mapper.activity; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.service.IService; +import net.lensfrex.rd.data.entity.table.Activity; +import org.springframework.stereotype.Service; + +@Service +public interface ActivityMapper extends BaseMapper { +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/course/CourseMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/course/CourseMapper.java new file mode 100644 index 0000000..d8dc9b8 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/course/CourseMapper.java @@ -0,0 +1,18 @@ +package net.lensfrex.rd.dao.mapper.course; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.Course; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface CourseMapper extends BaseMapper { + List getCourseByMajorAndGrade(@Param("major") String major, + @Param("grade") Integer grade, + @Param("springTerm") Boolean sprintTerm + ); + + Object getCourseDetail(String course); +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/experiment/ExperimentItemMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/experiment/ExperimentItemMapper.java new file mode 100644 index 0000000..3d124ee --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/experiment/ExperimentItemMapper.java @@ -0,0 +1,10 @@ +package net.lensfrex.rd.dao.mapper.experiment; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.ExperimentItem; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ExperimentItemMapper extends BaseMapper { + +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/major/MajorMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/major/MajorMapper.java new file mode 100644 index 0000000..6b67948 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/major/MajorMapper.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.dao.mapper.major; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.Major; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MajorMapper extends BaseMapper { +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleMapper.java new file mode 100644 index 0000000..d6908e9 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleMapper.java @@ -0,0 +1,19 @@ +package net.lensfrex.rd.dao.mapper.schedule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.CourseSchedule; +import net.lensfrex.rd.data.entity.table.StudentInfo; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CourseScheduleMapper extends BaseMapper { + Object getScheduleDetailFromCourseId(String course); + + Object getScheduleDetailFromScheduleId(String courseSchedule); + + Integer getScheduleTotalStudent(String courseSchedule); + + List getSelectedStudent(String courseSchedule); +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleSelectionMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleSelectionMapper.java new file mode 100644 index 0000000..aedd95f --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/CourseScheduleSelectionMapper.java @@ -0,0 +1,10 @@ +package net.lensfrex.rd.dao.mapper.schedule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.CourseSelection; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface CourseScheduleSelectionMapper extends BaseMapper { +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapper.java new file mode 100644 index 0000000..70b54e2 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapper.java @@ -0,0 +1,18 @@ +package net.lensfrex.rd.dao.mapper.schedule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.CourseSchedule; +import net.lensfrex.rd.data.entity.table.TeacherClass; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface TeacherClassMapper extends BaseMapper { + Integer insetBatch(@Param("scheduleId") String scheduleId, + @Param("teachers") List teachers + ); + + List getScheduleForTeacher(@Param("teacher") String teacher, @Param("term") String term); +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapperService.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapperService.java new file mode 100644 index 0000000..5c0ce26 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/schedule/TeacherClassMapperService.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.dao.mapper.schedule; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.lensfrex.rd.data.entity.table.TeacherClass; +import org.springframework.stereotype.Service; + +@Service +public class TeacherClassMapperService extends ServiceImpl { +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ExperimentScoreMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ExperimentScoreMapper.java new file mode 100644 index 0000000..151090b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ExperimentScoreMapper.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.dao.mapper.score; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.ExperimentScore; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ExperimentScoreMapper extends BaseMapper { +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ScoreMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ScoreMapper.java new file mode 100644 index 0000000..23112b7 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/score/ScoreMapper.java @@ -0,0 +1,21 @@ +package net.lensfrex.rd.dao.mapper.score; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.dto.score.ScheduleScore; +import net.lensfrex.rd.data.dto.score.StudentScore; +import net.lensfrex.rd.data.entity.table.Score; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface ScoreMapper extends BaseMapper { + List getStudentScore(@Param("student") String student); + + List getScheduleAllStudentScore(@Param("scheduleId")String scheduleId); + + void insertOrUpdateScore(@Param("score") Score score); + + void insertOrUpdateScoreBatch(@Param("scores") List score); +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/StudentInfoMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/StudentInfoMapper.java new file mode 100644 index 0000000..3bd85e0 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/StudentInfoMapper.java @@ -0,0 +1,11 @@ +package net.lensfrex.rd.dao.mapper.user; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.StudentInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface StudentInfoMapper extends BaseMapper { + void insertOrUpdate(@Param("student") StudentInfo studentInfo); +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/TeacherInfoMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/TeacherInfoMapper.java new file mode 100644 index 0000000..08ae820 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/TeacherInfoMapper.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.dao.mapper.user; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TeacherInfoMapper extends BaseMapper { +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/UserBasicMapper.java b/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/UserBasicMapper.java new file mode 100644 index 0000000..d174c2b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/mapper/user/UserBasicMapper.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.dao.mapper.user; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lensfrex.rd.data.entity.table.UserBasic; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserBasicMapper extends BaseMapper { +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/DoubleListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/DoubleListTypeHandler.java new file mode 100644 index 0000000..edb940a --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/DoubleListTypeHandler.java @@ -0,0 +1,77 @@ +package net.lensfrex.rd.dao.type; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Slf4j +//@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.ARRAY) +public class DoubleListTypeHandler extends BaseTypeHandler> { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + String typeName = "Double"; + + Connection conn = ps.getConnection(); + Array array = conn.createArrayOf(typeName, parameter.toArray()); + ps.setArray(i, array); + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return getArray(rs.getArray(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return getArray(rs.getArray(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return getArray(cs.getArray(columnIndex)); + } + + private List getArray(Array array) { + if (array == null) { + return null; + } + try { + var arr = array.getArray(); + var result = new ArrayList(); + + if (arr instanceof Double[] doubleArr) { + Collections.addAll(result, doubleArr); + } else if (arr instanceof Float[] floatArr) { + for (Float floatVal : floatArr) { + result.add(floatVal.doubleValue()); + } + } else if (arr instanceof Integer[] intArr) { + for (Integer intVal : intArr) { + result.add(intVal.doubleValue()); + } + } else if (arr instanceof Short[] shortArr) { + for (Short shortVal : shortArr) { + result.add(shortVal.doubleValue()); + } + } else if (arr instanceof Long[] longArr) { + for (Long longVal : longArr) { + result.add(longVal.doubleValue()); + } + } + + return result; + } catch (Exception e) { + log.error("类型转换出错:", e); + } + + return null; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/FloatListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/FloatListTypeHandler.java new file mode 100644 index 0000000..ed6241e --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/FloatListTypeHandler.java @@ -0,0 +1,77 @@ +package net.lensfrex.rd.dao.type; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Slf4j +//@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.ARRAY) +public class FloatListTypeHandler extends BaseTypeHandler> { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + String typeName = "double"; + + Connection conn = ps.getConnection(); + Array array = conn.createArrayOf(typeName, parameter.toArray()); + ps.setArray(i, array); + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return getArray(rs.getArray(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return getArray(rs.getArray(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return getArray(cs.getArray(columnIndex)); + } + + private List getArray(Array array) { + if (array == null) { + return null; + } + try { + var arr = array.getArray(); + var result = new ArrayList(); + + if (arr instanceof Float[] doubleArr) { + Collections.addAll(result, doubleArr); + } else if (arr instanceof Double[] doublearr) { + for (Double intVal : doublearr) { + result.add(intVal.floatValue()); + } + } else if (arr instanceof Integer[] intArr) { + for (Integer intVal : intArr) { + result.add(intVal.floatValue()); + } + } else if (arr instanceof Short[] shortArr) { + for (Short shortVal : shortArr) { + result.add(shortVal.floatValue()); + } + } else if (arr instanceof Long[] longArr) { + for (Long longVal : longArr) { + result.add(longVal.floatValue()); + } + } + + return result; + } catch (Exception e) { + log.error("类型转换出错:", e); + } + + return null; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/IntegerListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/IntegerListTypeHandler.java new file mode 100644 index 0000000..5281e3d --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/IntegerListTypeHandler.java @@ -0,0 +1,67 @@ +package net.lensfrex.rd.dao.type; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.*; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Slf4j +//@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.ARRAY) +public class IntegerListTypeHandler extends BaseTypeHandler> { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + String typeName = "integer"; + + Connection conn = ps.getConnection(); + Array array = conn.createArrayOf(typeName, parameter.toArray()); + ps.setArray(i, array); + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return getArray(rs.getArray(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return getArray(rs.getArray(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return getArray(cs.getArray(columnIndex)); + } + + private List getArray(Array array) { + if (array == null) { + return null; + } + try { + var arr = array.getArray(); + var result = new ArrayList(); + + if (arr instanceof Integer[] intArr) { + Collections.addAll(result, intArr); + } else if (arr instanceof Short[] shortArr) { + for (Short shortVal : shortArr) { + result.add(shortVal.intValue()); + } + } else if (arr instanceof Long[] longArr) { + for (Long longVal : longArr) { + result.add(longVal.intValue()); + } + } + + return result; + } catch (Exception e) { + log.error("类型转换出错:", e); + } + + return null; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/LongListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/LongListTypeHandler.java new file mode 100644 index 0000000..783783b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/LongListTypeHandler.java @@ -0,0 +1,69 @@ +package net.lensfrex.rd.dao.type; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Slf4j +//@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.ARRAY) +public class LongListTypeHandler extends BaseTypeHandler> { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + String typeName = "numeric"; + + Connection conn = ps.getConnection(); + Array array = conn.createArrayOf(typeName, parameter.toArray()); + ps.setArray(i, array); + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return getArray(rs.getArray(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return getArray(rs.getArray(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return getArray(cs.getArray(columnIndex)); + } + + private List getArray(Array array) { + if (array == null) { + return null; + } + try { + var arr = array.getArray(); + var result = new ArrayList(); + + if (arr instanceof Long[] longArr) { + Collections.addAll(result, longArr); + } else if (arr instanceof Integer[] intArr) { + for (Integer intVal : intArr) { + result.add(intVal.longValue()); + } + } else if (arr instanceof Short[] shortArr) { + for (Short shortVal : shortArr) { + result.add(shortVal.longValue()); + } + } + + return result; + } catch (Exception e) { + log.error("类型转换出错:", e); + } + + return null; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/ShortListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/ShortListTypeHandler.java new file mode 100644 index 0000000..96825c6 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/ShortListTypeHandler.java @@ -0,0 +1,69 @@ +package net.lensfrex.rd.dao.type; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Slf4j +//@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.ARRAY) +public class ShortListTypeHandler extends BaseTypeHandler> { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + String typeName = "integer"; + + Connection conn = ps.getConnection(); + Array array = conn.createArrayOf(typeName, parameter.toArray()); + ps.setArray(i, array); + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return getArray(rs.getArray(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return getArray(rs.getArray(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return getArray(cs.getArray(columnIndex)); + } + + private List getArray(Array array) { + if (array == null) { + return null; + } + try { + var arr = array.getArray(); + var result = new ArrayList(); + + if (arr instanceof Short[] shortArr) { + Collections.addAll(result, shortArr); + } else if (arr instanceof Integer[] intArr) { + for (Integer intVal : intArr) { + result.add(intVal.shortValue()); + } + } else if (arr instanceof Long[] longArr) { + for (Long longVal : longArr) { + result.add(longVal.shortValue()); + } + } + + return result; + } catch (Exception e) { + log.error("类型转换出错:", e); + } + + return null; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/StringListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/StringListTypeHandler.java new file mode 100644 index 0000000..62aedc3 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/StringListTypeHandler.java @@ -0,0 +1,55 @@ +package net.lensfrex.rd.dao.type; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.*; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Slf4j +//@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.ARRAY) +public class StringListTypeHandler extends BaseTypeHandler> { + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + String typeName = "varchar"; + + Connection conn = ps.getConnection(); + Array array = conn.createArrayOf(typeName, parameter.toArray()); + ps.setArray(i, array); + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return getArray(rs.getArray(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return getArray(rs.getArray(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return getArray(cs.getArray(columnIndex)); + } + + private List getArray(Array array) { + if (array == null) { + return null; + } + try { + var strArray = (String[]) array.getArray(); + var result = new ArrayList(strArray.length); + Collections.addAll(result, strArray); + + return result; + } catch (Exception e) { + log.error("类型转换出错:", e); + } + + return null; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonListTypeHandler.java new file mode 100644 index 0000000..de23a22 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonListTypeHandler.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.dao.type.json; + +import java.util.ArrayList; + +public abstract class BaseJsonListTypeHandler extends BaseJsonTypeHandler> { + protected BaseJsonListTypeHandler(Class clazz) { + super(objectMapper.getTypeFactory().constructParametricType(ArrayList.class, clazz)); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonTypeHandler.java new file mode 100644 index 0000000..6625c32 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/json/BaseJsonTypeHandler.java @@ -0,0 +1,64 @@ +package net.lensfrex.rd.dao.type.json; + +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.JdbcType; +import org.postgresql.util.PGobject; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Types; + +@Slf4j +public abstract class BaseJsonTypeHandler extends AbstractJsonTypeHandler { + protected static final ObjectMapper objectMapper = new ObjectMapper(); + + protected final JavaType javaType; + protected final Class clazz; + + protected BaseJsonTypeHandler(JavaType javaType) { + this.javaType = javaType; + this.clazz = null; + } + + protected BaseJsonTypeHandler(Class clazz) { + this.javaType = null; + this.clazz = clazz; + } + + @Override + protected T parse(String json) { + try { + if (clazz == null) { + return objectMapper.readValue(json, javaType); + } else { + return objectMapper.readValue(json, clazz); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException { + PGobject obj = new PGobject(); + obj.setType("jsonb"); + obj.setValue(toJson(parameter)); + + ps.setObject(i, obj); + } + + @Override + protected String toJson(T obj) { + try { + return objectMapper.writeValueAsString(obj); + } catch (JsonProcessingException e) { + log.warn("对象序列化异常:", e); + } + + return null; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/json/FloatMapTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/json/FloatMapTypeHandler.java new file mode 100644 index 0000000..172d94a --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/json/FloatMapTypeHandler.java @@ -0,0 +1,15 @@ +package net.lensfrex.rd.dao.type.json; + +import com.fasterxml.jackson.databind.JavaType; + +import java.util.HashMap; +import java.util.Map; + +public class FloatMapTypeHandler extends BaseJsonTypeHandler> { + private static final JavaType FLOAT_MAP_TYPE = + objectMapper.getTypeFactory().constructMapType(HashMap.class, String.class, Float.class); + + public FloatMapTypeHandler() { + super(FLOAT_MAP_TYPE); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/dao/type/json/UsualScoreItemListTypeHandler.java b/backend/src/main/java/net/lensfrex/rd/dao/type/json/UsualScoreItemListTypeHandler.java new file mode 100644 index 0000000..8fee6d6 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/dao/type/json/UsualScoreItemListTypeHandler.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.dao.type.json; + +import net.lensfrex.rd.data.entity.UsualScoreItem; + +public class UsualScoreItemListTypeHandler extends BaseJsonListTypeHandler { + public UsualScoreItemListTypeHandler() { + super(UsualScoreItem.class); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/course/CourseDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/course/CourseDTO.java new file mode 100644 index 0000000..9b4617e --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/course/CourseDTO.java @@ -0,0 +1,42 @@ +package net.lensfrex.rd.data.dto.course; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CourseDTO { + private String id; + + /** + * 课程名称 + */ + private String name; + + /** + * 课时 + */ + private Integer courseHours; + + /** + * 上课专业id + */ + private List targetMajor; + + /** + * 上课年级,使用大x表示,如大二:2 + */ + private List targetGrade; + + /** + * 是否春季期课程(false即是秋季期) + */ + private Boolean springTerm; + +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/schedule/CourseScheduleDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/schedule/CourseScheduleDTO.java new file mode 100644 index 0000000..8a31f28 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/schedule/CourseScheduleDTO.java @@ -0,0 +1,67 @@ +package net.lensfrex.rd.data.dto.schedule; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import net.lensfrex.rd.data.entity.table.TeacherInfo; + +import java.util.List; +import java.util.Map; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class CourseScheduleDTO { + private String id; + + private String name; + + /** + * 课程id + */ + private String course; + + /** + * 开始周 + */ + private int startWeek; + + /** + * 结束周 + */ + private int endWeek; + + /** + * 节次时间,即第几节课 + */ + private int time; + + /** + * 节次时间,即第几节课 + */ + private int weekDay; + + /** + * 学年学期,格式如2023-2024 + */ + private String academicTerm; + + /** + * 上课地点 + */ + private String place; + + /** + * 考试成绩占比 + */ + private float ratio; + + /** + * 平时分组成描述 + */ + private Map distribution; + + private List teachers; + + @JsonIgnore + private List teacherIds; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/schedule/StudentExportDto.java b/backend/src/main/java/net/lensfrex/rd/data/dto/schedule/StudentExportDto.java new file mode 100644 index 0000000..e29908b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/schedule/StudentExportDto.java @@ -0,0 +1,11 @@ +package net.lensfrex.rd.data.dto.schedule; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +@Data +public class StudentExportDto { + private int id; + private String studentNumber; + private String name; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/score/ScheduleScore.java b/backend/src/main/java/net/lensfrex/rd/data/dto/score/ScheduleScore.java new file mode 100644 index 0000000..cc52495 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/score/ScheduleScore.java @@ -0,0 +1,23 @@ +package net.lensfrex.rd.data.dto.score; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ScheduleScore { + private String id; + + private String name; + + private String number; + + private Float usualScore; + + private Float examScore; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/score/ScoreExportDto.java b/backend/src/main/java/net/lensfrex/rd/data/dto/score/ScoreExportDto.java new file mode 100644 index 0000000..5d32886 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/score/ScoreExportDto.java @@ -0,0 +1,18 @@ +package net.lensfrex.rd.data.dto.score; + +import lombok.Data; + +@Data +public class ScoreExportDto { + private int id; + + private String name; + + private String number; + + private Float usualScore; + + private Float examScore; + + private Double finalScore; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/score/StudentScore.java b/backend/src/main/java/net/lensfrex/rd/data/dto/score/StudentScore.java new file mode 100644 index 0000000..22cc388 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/score/StudentScore.java @@ -0,0 +1,22 @@ +package net.lensfrex.rd.data.dto.score; + +import lombok.Data; + +@Data +public class StudentScore { + private String id; + + private String courseName; + + private String scheduleName; + + private String term; + + private String schedule; + + private Float ratio; + + private Float usualScore; + + private Float examScore; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/user/UserBasicInfoDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/user/UserBasicInfoDTO.java new file mode 100644 index 0000000..7fabbc4 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/user/UserBasicInfoDTO.java @@ -0,0 +1,4 @@ +package net.lensfrex.rd.data.dto.user; + +public record UserBasicInfoDTO(String id, String username, String password, Short type) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/BasicStudentInfoDto.java b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/BasicStudentInfoDto.java new file mode 100644 index 0000000..d125120 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/BasicStudentInfoDto.java @@ -0,0 +1,4 @@ +package net.lensfrex.rd.data.dto.user.student; + +public record BasicStudentInfoDto(String studentNumber, String studentName, String major) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/NewStudentDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/NewStudentDTO.java new file mode 100644 index 0000000..8164a6a --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/NewStudentDTO.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.dto.user.student; + +import net.lensfrex.rd.data.entity.table.StudentInfo; +import net.lensfrex.rd.data.entity.table.UserBasic; + +public record NewStudentDTO(UserBasic userBasic, StudentInfo studentInfo) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserBasicDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserBasicDTO.java new file mode 100644 index 0000000..bcfa9a5 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserBasicDTO.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.dto.user.student; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public record StudentUserBasicDTO(String id, String username, String number, String name, String major, int grade, String clazz, String password) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserInfoDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserInfoDTO.java new file mode 100644 index 0000000..20062be --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/user/student/StudentUserInfoDTO.java @@ -0,0 +1,10 @@ +package net.lensfrex.rd.data.dto.user.student; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; + +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +public record StudentUserInfoDTO(String id, String username, String number, String name, String major, int grade, + String clazz, String password) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserDTO.java new file mode 100644 index 0000000..379fb64 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserDTO.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.dto.user.teacher; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public record TeacherUserDTO(String username, String teacherName, String password) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserInfoDTO.java b/backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserInfoDTO.java new file mode 100644 index 0000000..34545a9 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/dto/user/teacher/TeacherUserInfoDTO.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.dto.user.teacher; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public record TeacherUserInfoDTO(String id, String username, String teacherName) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/CourseDetail.java b/backend/src/main/java/net/lensfrex/rd/data/entity/CourseDetail.java new file mode 100644 index 0000000..aadc0dd --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/CourseDetail.java @@ -0,0 +1,49 @@ +package net.lensfrex.rd.data.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import net.lensfrex.rd.dao.type.IntegerListTypeHandler; +import net.lensfrex.rd.dao.type.StringListTypeHandler; + +import java.util.List; + +@Data +public class CourseDetail { + /** + * 课程id + */ + private String id; + + /** + * 课程名称 + */ + private String courseName; + + /** + * 授课教师 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List teachers; + + /** + * 课时 + */ + private Integer courseHours; + + /** + * 是否春季期课程(false即是秋季期) + */ + private Boolean springTerm; + + /** + * 上课专业 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List targetMajor; + + /** + * 上课年级 + */ + @TableField(typeHandler = IntegerListTypeHandler.class) + private List targetGrade; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/CourseScheduleDetail.java b/backend/src/main/java/net/lensfrex/rd/data/entity/CourseScheduleDetail.java new file mode 100644 index 0000000..d1e3853 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/CourseScheduleDetail.java @@ -0,0 +1,89 @@ +package net.lensfrex.rd.data.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import net.lensfrex.rd.dao.type.IntegerListTypeHandler; +import net.lensfrex.rd.dao.type.StringListTypeHandler; + +import java.util.List; + +@Data +public class CourseScheduleDetail { + /** + * 课程id + */ + private String courseId; + + /** + * 课程名称 + */ + private String courseName; + + /** + * 授课教师 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List teachers; + + /** + * 课时 + */ + private Integer courseHours; + + /** + * 是否春季期课程(false即是秋季期) + */ + private Boolean springTerm; + + /** + * 上课专业 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List targetMajor; + + /** + * 上课年级 + */ + @TableField(typeHandler = IntegerListTypeHandler.class) + private List targetGrade; + + /** + * 课堂id + */ + private String id; + + /** + * 课程id + */ + private String course; + + /** + * 开始周 + */ + private String startWeek; + + /** + * 结束周 + */ + private String endWeek; + + /** + * 节次时间,即第几节课 + */ + private String time; + + /** + * 学年学期,格式如2023-2024 + */ + private String academicTerm; + + /** + * 上课地点 + */ + private String place; + + /** + * 考试成绩占比 + */ + private String ratio; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/UsualScoreItem.java b/backend/src/main/java/net/lensfrex/rd/data/entity/UsualScoreItem.java new file mode 100644 index 0000000..3672bd8 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/UsualScoreItem.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.entity; + +import lombok.Builder; + +@Builder +public record UsualScoreItem(String name, float score, float ratio) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/Activity.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Activity.java new file mode 100644 index 0000000..71c8ad5 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Activity.java @@ -0,0 +1,68 @@ +package net.lensfrex.rd.data.entity.table; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.google.common.base.Objects; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Activity implements Serializable { + /** + * 选课活动id + */ + private String id; + + /** + * 活动id + */ + private String name; + + /** + * 学期,格式如2023-2024-1 + */ + private String term; + + /** + * 开始时间 + */ + private LocalDateTime startTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; + + public Activity() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Activity activity = (Activity) o; + return Objects.equal(id, activity.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/Course.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Course.java new file mode 100644 index 0000000..5235d59 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Course.java @@ -0,0 +1,65 @@ +package net.lensfrex.rd.data.entity.table; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import net.lensfrex.rd.dao.type.IntegerListTypeHandler; +import net.lensfrex.rd.dao.type.StringListTypeHandler; +//import org.apache.ibatis.type.ArrayTypeHandler; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@TableName(autoResultMap = true) +public class Course implements Serializable { + /** + * 课程id + */ + private String id; + + /** + * 课程名称 + */ + private String name; + + /** + * 课时 + */ + private Integer courseHours; + + /** + * 是否春季期课程(false即是秋季期) + */ + private Boolean springTerm; + + /** + * 上课专业 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List targetMajor; + + /** + * 上课年级 + */ + @TableField(typeHandler = IntegerListTypeHandler.class) + private List targetGrade; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSchedule.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSchedule.java new file mode 100644 index 0000000..4a36246 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSchedule.java @@ -0,0 +1,101 @@ +package net.lensfrex.rd.data.entity.table; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.google.common.base.Objects; +import lombok.Data; +import net.lensfrex.rd.dao.type.json.FloatMapTypeHandler; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Map; + +@Data +@TableName(value = "class", autoResultMap = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class CourseSchedule implements Serializable { + /** + * 课堂id + */ + private String id; + + private String name; + + /** + * 课程id + */ + private String course; + + /** + * 开始周 + */ + private Integer startWeek; + + /** + * 结束周 + */ + private Integer endWeek; + + /** + * 节次时间,即第几节课 + */ + private Integer time; + + /** + * 节次时间,即第几节课 + */ + private Integer weekDay; + + /** + * 学年学期,格式如2023-2024 + */ + private String academicTerm; + + /** + * 上课地点 + */ + private String place; + + /** + * 考试成绩占比 + */ + private Float ratio; + + /** + * 平时分组成描述 + */ + @TableField(typeHandler = FloatMapTypeHandler.class) + private Map distribution; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; + + public CourseSchedule() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CourseSchedule that = (CourseSchedule) o; + return Objects.equal(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSelection.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSelection.java new file mode 100644 index 0000000..be13f1c --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/CourseSelection.java @@ -0,0 +1,47 @@ +package net.lensfrex.rd.data.entity.table; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class CourseSelection implements Serializable { + /** + * 选课记录id + */ + private String id; + + /** + * 学生id + */ + private String student; + + /** + * 课堂id + */ + private String schedule; + + /** + * 课堂id + */ + private String activity; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; + + public CourseSelection() { + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentItem.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentItem.java new file mode 100644 index 0000000..77f4c8e --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentItem.java @@ -0,0 +1,44 @@ +package net.lensfrex.rd.data.entity.table; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class ExperimentItem implements Serializable { + + + /** + * 实验项目id + */ + private String id; + + /** + * 项目名称 + */ + private String name; + + /** + * 课程id + */ + private String course; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; + + public ExperimentItem() { + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentScore.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentScore.java new file mode 100644 index 0000000..da33778 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/ExperimentScore.java @@ -0,0 +1,17 @@ +package net.lensfrex.rd.data.entity.table; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @param id 成绩id + * @param student 学生id + * @param experiment 实验项目id + * @param score 实验分 + * @param createTime create_time + * @param editTime edit_time + * @param deleted delete + */ +public record ExperimentScore(String id, String student, String experiment, Float score, LocalDateTime createTime, + LocalDateTime editTime, Boolean deleted) implements Serializable { +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/Major.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Major.java new file mode 100644 index 0000000..92e79f8 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Major.java @@ -0,0 +1,58 @@ +package net.lensfrex.rd.data.entity.table; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.google.common.base.Objects; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Major implements Serializable { + /** + * 专业id + */ + @TableId(type = IdType.INPUT) + private String id; + + /** + * 专业名称 + */ + private String name; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Major major = (Major) o; + return Objects.equal(id, major.id) && Objects.equal(name, major.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name); + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/Score.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Score.java new file mode 100644 index 0000000..e86e98b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/Score.java @@ -0,0 +1,37 @@ +package net.lensfrex.rd.data.entity.table; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Score implements Serializable { + private String id; + + private String student; + + @TableField("class") + private String schedule; + + private Float usualScore; + + private Float examScore; + + private LocalDateTime createTime; + + private LocalDateTime editTime; + + private Boolean deleted; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/StudentInfo.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/StudentInfo.java new file mode 100644 index 0000000..92fd7d7 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/StudentInfo.java @@ -0,0 +1,64 @@ +package net.lensfrex.rd.data.entity.table; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class StudentInfo implements Serializable { + /** + * 学生id + */ + private String id; + + /** + * 学号 + */ + private String studentNumber; + + /** + * 学生姓名 + */ + private String name; + + /** + * 专业id + */ + private String major; + + /** + * 年级,使用大x表示,如大二:2 + */ + private Integer grade; + + /** + * 班级 + */ + @TableField("class") + private String clazz; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherClass.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherClass.java new file mode 100644 index 0000000..77d9901 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherClass.java @@ -0,0 +1,43 @@ +package net.lensfrex.rd.data.entity.table; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class TeacherClass implements Serializable { + + /** + * 教师id + */ + @TableId(type = IdType.INPUT) + private String teacher; + + /** + * 课程班级id + */ + @TableField("class") + private String clazz; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * deleted + */ + private Boolean deleted; + + public TeacherClass() { + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherInfo.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherInfo.java new file mode 100644 index 0000000..1df5bc6 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/TeacherInfo.java @@ -0,0 +1,44 @@ +package net.lensfrex.rd.data.entity.table; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class TeacherInfo implements Serializable { + /** + * 教师id + */ + private String id; + + /** + * 教师姓名 + */ + private String name; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; + + public TeacherInfo() { + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/entity/table/UserBasic.java b/backend/src/main/java/net/lensfrex/rd/data/entity/table/UserBasic.java new file mode 100644 index 0000000..0faa375 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/entity/table/UserBasic.java @@ -0,0 +1,47 @@ +package net.lensfrex.rd.data.entity.table; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class UserBasic implements Serializable { + /** + * 用户uuid + */ + private String id; + + /** + * 用户名,登陆用 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 用户类型 + */ + private Short type; + + /** + * create_time + */ + private LocalDateTime createTime; + + /** + * edit_time + */ + private LocalDateTime editTime; + + /** + * delete + */ + private Boolean deleted; + + public UserBasic() { + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/enums/UserType.java b/backend/src/main/java/net/lensfrex/rd/data/enums/UserType.java new file mode 100644 index 0000000..957bc57 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/enums/UserType.java @@ -0,0 +1,24 @@ +package net.lensfrex.rd.data.enums; + +public enum UserType { + STUDENT(0, "student"), + TEACHER(1, "teacher"), + ADMIN(0, "admin"), + ; + + public final int code; + private final String value; + + UserType(int code, String value) { + this.code = code; + this.value = value; + } + + public int getCode() { + return code; + } + + public String value() { + return value; + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/ActivityInfoDto.java b/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/ActivityInfoDto.java new file mode 100644 index 0000000..5f6daf7 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/ActivityInfoDto.java @@ -0,0 +1,14 @@ +package net.lensfrex.rd.data.model.request.admin; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; + +import java.time.LocalDateTime; + +@Builder +public record ActivityInfoDto(String id, String name, String term, + @JsonFormat(locale = "zh", timezone = "GMT+8") + LocalDateTime start, + @JsonFormat(locale = "zh", timezone = "GMT+8") + LocalDateTime end) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/StudentAddRequest.java b/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/StudentAddRequest.java new file mode 100644 index 0000000..ed5e94e --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/StudentAddRequest.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.data.model.request.admin; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; + +@Builder +public record StudentAddRequest(String studentNumber, String studentName, String major) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/TeacherAddRequest.java b/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/TeacherAddRequest.java new file mode 100644 index 0000000..c7e673f --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/request/admin/TeacherAddRequest.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.model.request.admin; + +import lombok.Builder; + +@Builder +public record TeacherAddRequest(String username, String teacherName, String initialPassword) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/request/auth/UserLoginRequest.java b/backend/src/main/java/net/lensfrex/rd/data/model/request/auth/UserLoginRequest.java new file mode 100644 index 0000000..58fae2b --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/request/auth/UserLoginRequest.java @@ -0,0 +1,5 @@ +package net.lensfrex.rd.data.model.request.auth; + +public record UserLoginRequest(String username, String password) { + +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/request/course/CourseRequest.java b/backend/src/main/java/net/lensfrex/rd/data/model/request/course/CourseRequest.java new file mode 100644 index 0000000..81abba1 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/request/course/CourseRequest.java @@ -0,0 +1,33 @@ +package net.lensfrex.rd.data.model.request.course; + +import lombok.Data; + +import java.util.List; + +@Data +public class CourseRequest { + /** + * 课程名称 + */ + private String name; + + /** + * 课时 + */ + private Integer courseHours; + + /** + * 上课专业id + */ + private List targetMajor; + + /** + * 上课年级,使用大x表示,如大二:2 + */ + private List targetGrade; + + /** + * 是否春季期课程(false即是秋季期) + */ + private Boolean springTerm; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/request/schedule/ClassScheduleRequest.java b/backend/src/main/java/net/lensfrex/rd/data/model/request/schedule/ClassScheduleRequest.java new file mode 100644 index 0000000..0fe8165 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/request/schedule/ClassScheduleRequest.java @@ -0,0 +1,28 @@ +package net.lensfrex.rd.data.model.request.schedule; + +import lombok.Data; + +import java.util.List; + +@Data +public class ClassScheduleRequest { + private String name; + + private String course; + + private String term; + + private int section; + + private int weekDay; + + private int startWeek; + + private int endWeek; + + private String place; + + private int ratio; + + private List teachers; +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/PaginationWrapper.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/PaginationWrapper.java new file mode 100644 index 0000000..4b370fd --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/PaginationWrapper.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.model.response; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public record PaginationWrapper(int current, int pageSize, int total, T result) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/Response.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/Response.java new file mode 100644 index 0000000..e760e17 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/Response.java @@ -0,0 +1,35 @@ +package net.lensfrex.rd.data.model.response; + + +import com.fasterxml.jackson.annotation.JsonInclude; + +/** + * 通用的响应 + * + * @param code 响应码 + * @param msg 响应信息 + * @param data 响应数据 + * @param data的类型 + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public record Response(int code, String msg, T data) { + public static Response success(T data) { + return new Response<>(ResponseCode.SUCCESS.getCode(), "ok", data); + } + + public static Response success() { + return success(null); + } + + public static Response error(int code, String message) { + return new Response<>(code, message, null); + } + + public static Response error(ResponseCode code) { + return error(code.getCode(), code.getMessage()); + } + + public static Response error(ResponseCode code, String message) { + return error(code.getCode(), message); + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/ResponseCode.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/ResponseCode.java new file mode 100644 index 0000000..1dbc987 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/ResponseCode.java @@ -0,0 +1,43 @@ +/* + * Class created by lensfrex. + */ + +package net.lensfrex.rd.data.model.response; + +public enum ResponseCode { + SUCCESS(20000, "成功"), + REQUEST_TOO_FAST(20001, "技能冷却中..."), + INVALID_REQUEST(30000, "非法请求"), + PARAM_WRONG(30001, "参数错误"), + PERMISSION_DENIED(40000, "权限不足"), + TOKEN_EXPIRED(40001, "token过期"), + TOKEN_INVALID(40002, "token无效"), + SERVER_INTERNAL_ERROR(50000, "服务器内部错误"), + API_NOT_IMPLEMENT(0, "接口未实现"), + + STUDENT_ID_DOES_NOT_EXISTS(60001,"学生学号不存在"), + PASSWORD_WRONG(60002, "密码错误"), + IMAGE_FORMAT_WORN(60202, ""), + NOTICE_WAS_INTERCEPT(60203, "消息被系统拦截发布"), + + USER_DOES_NOT_MATCH_PUBLISHER(60301, "请求用户与告示发表者不匹配"), + + REQUEST_FILE_DOES_NOT_EXIST(60701, "请求的文件不存在"); + + private final int code; + + private final String message; + + ResponseCode(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/auth/UserLoginStatusResponse.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/auth/UserLoginStatusResponse.java new file mode 100644 index 0000000..9d21a32 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/auth/UserLoginStatusResponse.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.model.response.auth; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public record UserLoginStatusResponse(String id, String role, boolean status) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/course/CandidateCourseResponse.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/course/CandidateCourseResponse.java new file mode 100644 index 0000000..266647d --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/course/CandidateCourseResponse.java @@ -0,0 +1,41 @@ +package net.lensfrex.rd.data.model.response.course; + +import lombok.Data; + +import java.util.List; + +/** + * 待选课程响应 + */ +@Data +public class CandidateCourseResponse { + /** + * 课程id + */ + private String id; + + /** + * 课程名称 + */ + private String name; + + /** + * 课时 + */ + private String courseHours; + + /** + * 上课专业id + */ + private List targetMajor; + + /** + * 上课年级,使用大x表示,如大二:2 + */ + private List targetGrade; + + /** + * 是否春季期课程(false即是秋季期) + */ + private Boolean springTerm; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/course/CourseResponse.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/course/CourseResponse.java new file mode 100644 index 0000000..90c3ec5 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/course/CourseResponse.java @@ -0,0 +1,31 @@ +package net.lensfrex.rd.data.model.response.course; + +import lombok.Builder; +import lombok.Data; + +/** + * 课程信息响应 + */ +@Data +@Builder +public class CourseResponse { + /** + * 课程id + */ + private String id; + + /** + * 课程名称 + */ + private String name; + + /** + * 课时 + */ + private int courseHours; + + /** + * 春季期课程 + */ + private String term; +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/score/StudentScoreSummary.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/score/StudentScoreSummary.java new file mode 100644 index 0000000..0349292 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/score/StudentScoreSummary.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.data.model.response.score; + +import lombok.Builder; + +@Builder +public record StudentScoreSummary(String courseName, int usualScore, int finalScore) { +} diff --git a/backend/src/main/java/net/lensfrex/rd/data/model/response/user/UserBasicInfo.java b/backend/src/main/java/net/lensfrex/rd/data/model/response/user/UserBasicInfo.java new file mode 100644 index 0000000..bdf5bce --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/data/model/response/user/UserBasicInfo.java @@ -0,0 +1,15 @@ +package net.lensfrex.rd.data.model.response.user; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; +import net.lensfrex.rd.data.enums.UserType; + +@Data +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +public class UserBasicInfo { + private String id; + private String username; + private UserType userType; +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/BaseException.java b/backend/src/main/java/net/lensfrex/rd/exception/BaseException.java new file mode 100644 index 0000000..1746203 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/BaseException.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.exception; + +public class BaseException extends RuntimeException { + public BaseException(String message) { + super(message); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/GlobalExceptionHandler.java b/backend/src/main/java/net/lensfrex/rd/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..d353001 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/GlobalExceptionHandler.java @@ -0,0 +1,133 @@ +package net.lensfrex.rd.exception; + +import cn.dev33.satoken.exception.SaTokenException; +import cn.wustlinghang.mywust.exception.ApiException; +import cn.wustlinghang.mywust.exception.ParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.data.model.response.Response; +import net.lensfrex.rd.data.model.response.ResponseCode; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +@Slf4j +@ControllerAdvice +public class GlobalExceptionHandler { + @ResponseBody + @ExceptionHandler(BaseException.class) + public Response baseException(BaseException e) { + return Response.error(ResponseCode.INVALID_REQUEST, e.getMessage()); + } + + @ResponseBody + @ExceptionHandler(ApiException.class) + public Response baseException(ApiException e) { + return Response.error(ResponseCode.SERVER_INTERNAL_ERROR, e.getMessage()); + } + + @ResponseBody + @ExceptionHandler(ParseException.class) + public Response baseException(ParseException e) { + return Response.error(ResponseCode.SERVER_INTERNAL_ERROR, + "mywust解析数据错误,请联系开发者,或者到https://github.com/LingHangStudio/mywust/issues提交问题,多谢啦" + ); + } + + @ResponseBody + @ExceptionHandler(SaTokenException.class) + public Response baseException(SaTokenException e) { + return Response.error(ResponseCode.PERMISSION_DENIED, e.getMessage()); + } + + @ResponseBody + @ExceptionHandler(Exception.class) + public Response baseException(Exception e) { + log.error("未处理的异常:", e); + return Response.error(ResponseCode.SERVER_INTERNAL_ERROR); + } + + + /** + * 处理参数不完整的请求异常 + * + * @param e 异常 + * @return 统一响应 + */ + @ResponseBody + @ExceptionHandler(MissingServletRequestParameterException.class) + public Response handler(MissingServletRequestParameterException e) { + log.debug("请求的参数不完整: " + e.getMessage()); + return Response.error(ResponseCode.PARAM_WRONG); + } + + /** + * 处理参数类型错误的请求异常(请求参数类型错误) + * + * @param e 异常 + * @return 统一响应 + */ + @ResponseBody + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public Response handler(MethodArgumentTypeMismatchException e) { + log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e.getMessage())); + return Response.error(ResponseCode.PARAM_WRONG); + } + + /** + * 处理参数类型错误的请求异常2(Json解析错误) + * + * @param e 异常 + * @return 统一响应 + */ + @ResponseBody + @ExceptionHandler(JsonMappingException.class) + public Response handler(JsonMappingException e) { + log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e.getMessage())); + return Response.error(ResponseCode.PARAM_WRONG); + } + + /** + * 处理参数类型错误的请求异常3(字段映射错误) + * + * @param e 异常 + * @return 统一响应 + */ + @ResponseBody + @ExceptionHandler(HttpMessageNotReadableException.class) + public Response handler(HttpMessageNotReadableException e) { + log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e.getMessage())); + return Response.error(ResponseCode.PARAM_WRONG); + } + + /** + * 处理请求头中“Content-Type”字段不正确的异常 + * + * @param e 异常 + * @return 统一响应 + */ + @ResponseBody + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public Response handler(HttpMediaTypeNotSupportedException e) { + log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e.getMessage())); + return Response.error(ResponseCode.PARAM_WRONG, "请求头\"Contene-Type\"字段有误"); + } + + /** + * 处理请求方法错误的情况 + * + * @param e 异常 + * @return 统一响应 + */ + @ResponseBody + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public Response handler(HttpRequestMethodNotSupportedException e) { + log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e.getMessage())); + return Response.error(ResponseCode.INVALID_REQUEST); + } +} \ No newline at end of file diff --git a/backend/src/main/java/net/lensfrex/rd/exception/data/DataConflictException.java b/backend/src/main/java/net/lensfrex/rd/exception/data/DataConflictException.java new file mode 100644 index 0000000..a90adb7 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/data/DataConflictException.java @@ -0,0 +1,13 @@ +package net.lensfrex.rd.exception.data; + +import net.lensfrex.rd.exception.BaseException; + +public class DataConflictException extends BaseException { + public DataConflictException(String message) { + super(message); + } + + public DataConflictException() { + super("数据冲突"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/data/DataFormatWrongException.java b/backend/src/main/java/net/lensfrex/rd/exception/data/DataFormatWrongException.java new file mode 100644 index 0000000..1a8b703 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/data/DataFormatWrongException.java @@ -0,0 +1,13 @@ +package net.lensfrex.rd.exception.data; + +import net.lensfrex.rd.exception.BaseException; + +public class DataFormatWrongException extends BaseException { + public DataFormatWrongException(String message) { + super(message); + } + + public DataFormatWrongException() { + super("数据格式错误"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/data/DataNotExistsException.java b/backend/src/main/java/net/lensfrex/rd/exception/data/DataNotExistsException.java new file mode 100644 index 0000000..d32d96a --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/data/DataNotExistsException.java @@ -0,0 +1,13 @@ +package net.lensfrex.rd.exception.data; + +import net.lensfrex.rd.exception.BaseException; + +public class DataNotExistsException extends BaseException { + public DataNotExistsException(String message) { + super(message); + } + + public DataNotExistsException() { + super("数据不存在"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/data/DataNotMatchException.java b/backend/src/main/java/net/lensfrex/rd/exception/data/DataNotMatchException.java new file mode 100644 index 0000000..b40a460 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/data/DataNotMatchException.java @@ -0,0 +1,13 @@ +package net.lensfrex.rd.exception.data; + +import net.lensfrex.rd.exception.BaseException; + +public class DataNotMatchException extends BaseException { + public DataNotMatchException(String message) { + super(message); + } + + public DataNotMatchException() { + super("数据不匹配"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/internal/BaseJwcFetchException.java b/backend/src/main/java/net/lensfrex/rd/exception/internal/BaseJwcFetchException.java new file mode 100644 index 0000000..b07a947 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/internal/BaseJwcFetchException.java @@ -0,0 +1,13 @@ +package net.lensfrex.rd.exception.internal; + +import net.lensfrex.rd.exception.BaseException; + +public abstract class BaseJwcFetchException extends BaseException { + public BaseJwcFetchException() { + super("教务处信息获取异常"); + } + + public BaseJwcFetchException(String message) { + super(message); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/internal/JwcAuthException.java b/backend/src/main/java/net/lensfrex/rd/exception/internal/JwcAuthException.java new file mode 100644 index 0000000..015b958 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/internal/JwcAuthException.java @@ -0,0 +1,11 @@ +package net.lensfrex.rd.exception.internal; + +public class JwcAuthException extends BaseJwcFetchException { + public JwcAuthException() { + super("教务处登录认证错误"); + } + + public JwcAuthException(String reason) { + super(reason); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/internal/JwcNetworkException.java b/backend/src/main/java/net/lensfrex/rd/exception/internal/JwcNetworkException.java new file mode 100644 index 0000000..6aeb598 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/internal/JwcNetworkException.java @@ -0,0 +1,7 @@ +package net.lensfrex.rd.exception.internal; + +public class JwcNetworkException extends BaseJwcFetchException { + public JwcNetworkException() { + super("请求教务处时发生网络错误"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/user/PasswordWrongException.java b/backend/src/main/java/net/lensfrex/rd/exception/user/PasswordWrongException.java new file mode 100644 index 0000000..009c3a1 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/user/PasswordWrongException.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.exception.user; + +import net.lensfrex.rd.exception.BaseException; + +public class PasswordWrongException extends BaseException { + public PasswordWrongException() { + super("密码不正确"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/user/UserAlreadyExistsException.java b/backend/src/main/java/net/lensfrex/rd/exception/user/UserAlreadyExistsException.java new file mode 100644 index 0000000..6dea82c --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/user/UserAlreadyExistsException.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.exception.user; + +import net.lensfrex.rd.exception.BaseException; + +public class UserAlreadyExistsException extends BaseException { + public UserAlreadyExistsException() { + super("用户名已存在"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/exception/user/UserNotExistsException.java b/backend/src/main/java/net/lensfrex/rd/exception/user/UserNotExistsException.java new file mode 100644 index 0000000..b4e1b5c --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/exception/user/UserNotExistsException.java @@ -0,0 +1,9 @@ +package net.lensfrex.rd.exception.user; + +import net.lensfrex.rd.exception.BaseException; + +public class UserNotExistsException extends BaseException { + public UserNotExistsException() { + super("用户不存在"); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/activity/ActivityService.java b/backend/src/main/java/net/lensfrex/rd/service/activity/ActivityService.java new file mode 100644 index 0000000..a26bf54 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/activity/ActivityService.java @@ -0,0 +1,217 @@ +package net.lensfrex.rd.service.activity; + +import cn.wustlinghang.mywust.util.StringUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.yitter.idgen.YitIdHelper; +import net.lensfrex.rd.dao.mapper.activity.ActivityMapper; +import net.lensfrex.rd.data.entity.table.Activity; +import net.lensfrex.rd.data.model.request.admin.ActivityInfoDto; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.exception.data.DataConflictException; +import net.lensfrex.rd.exception.data.DataFormatWrongException; +import net.lensfrex.rd.exception.data.DataNotExistsException; +import net.lensfrex.rd.service.course.CourseService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +@Service +public class ActivityService { + private static final Cache cache = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.DAYS) + .initialCapacity(16) + .maximumSize(64) + .build(); + + private static final Cache> termCache = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.DAYS) + .initialCapacity(16) + .maximumSize(64) + .build(); + + private final ActivityMapper activityMapper; + + private final CourseService courseService; + + public ActivityService(ActivityMapper activityMapper, + CourseService courseService) { + this.activityMapper = activityMapper; + this.courseService = courseService; + } + + public PaginationWrapper> list(int page, int pageSize) { + Page queryPage = new Page<>(page, pageSize); + var result = activityMapper + .selectPage(queryPage, new QueryWrapper() + .select("id, name, term, start_time, end_time, create_time, edit_time") + .orderByDesc("end_time") + .eq("deleted", false) + ); + + return new PaginationWrapper<>( + (int) result.getCurrent(), + (int) result.getSize(), + (int) result.getTotal(), + result.getRecords() + ); + } + + public Activity getById(String id) { + return getById(id, true); + } + + public Activity getById(String id, boolean useCache) { + var activity = cache.getIfPresent(id); + if (!useCache || activity == null) { + activity = activityMapper.selectOne(new QueryWrapper() + .select("id, name, term, start_time, end_time, create_time, edit_time") + .eq("id", id) + .eq("deleted", false) + .last("limit 1") + ); + + putCache(activity); + } + + return activity; + } + + public Set getByTerm(String term) { + var list = termCache.getIfPresent(term); + if (list == null) { + var result = activityMapper.selectList(new QueryWrapper() + .select("id, name, term, start_time, end_time, create_time, edit_time") + .orderByDesc("end_time") + .eq("term", term) + .eq("deleted", false) + ); + list = new HashSet<>(result); + termCache.put(term, list); + } + + return list; + } + + private void putCache(Activity activity) { + cache.put(activity.getId(), activity); + var list = termCache.getIfPresent(activity.getTerm()); + if (list == null) { + list = new HashSet<>(4); + } + + list.add(activity); + termCache.put(activity.getTerm(), list); + } + + public List getCurrentActivity() { + var now = LocalDateTime.now();//.format(dateTimeFormatter); + return activityMapper.selectList(new QueryWrapper() + .select("id, name, term, start_time, end_time, create_time, edit_time") + .le("start_time", now) + .ge("end_time", now) + .eq("term", StringUtil.getCurrentTermString()) + .orderByDesc("end_time") + .eq("deleted", false) + ); + } + + private boolean checkConflict(String id, ActivityInfoDto dto) { + // 检查开始时间和结束时间 + if (!dto.start().isBefore(dto.end())) { + throw new DataFormatWrongException(); + } + + // 检查冲突 + var activities = activityMapper.selectList(new QueryWrapper() + .eq("term", dto.term()) + .eq("deleted", false) + ); + + for (var activity : activities) { + if (activity.getId().equals(id)) { + continue; + } + + boolean conflict = + // ____|____|____i____i____ + !dto.start().isAfter(activity.getEndTime()) && + // ____i____i____|____|____ + !dto.end().isBefore(activity.getStartTime()); + if (conflict) { + return true; + } + } + + return false; + } + + public void addActivity(ActivityInfoDto request) { + if (checkConflict(null, request)) { + throw new DataConflictException(); + } + + String id = Long.toString(YitIdHelper.nextId()); + + Activity activity = new Activity(); + activity.setId(id); + activity.setName(request.name()); + activity.setTerm(request.term()); + activity.setStartTime(request.start()); + activity.setEndTime(request.end()); + + activityMapper.insert(activity); + + putCache(activity); + courseService.invalidStudentCandidateCourseCache(); + } + + @Transactional + public void delete(String id) { + Activity activity = getById(id); + activity.setDeleted(true); + activity.setEditTime(LocalDateTime.now()); + + activityMapper.update(activity, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + cache.invalidate(id); + termCache.invalidate(activity.getTerm()); + courseService.invalidStudentCandidateCourseCache(); + } + + @Transactional + public Activity update(String id, ActivityInfoDto request) { + Activity activity = getById(id); + if (activity == null) { + throw new DataNotExistsException(); + } + + if (checkConflict(id, request)) { + throw new DataConflictException(); + } + + activity.setName(request.name()); + activity.setTerm(request.term()); + activity.setStartTime(request.start()); + activity.setEndTime(request.end()); + + activityMapper.update(activity, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + courseService.invalidStudentCandidateCourseCache(); + + return this.getById(id, false); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/auth/UserTypeStpInterfaceImpl.java b/backend/src/main/java/net/lensfrex/rd/service/auth/UserTypeStpInterfaceImpl.java new file mode 100644 index 0000000..038bc58 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/auth/UserTypeStpInterfaceImpl.java @@ -0,0 +1,69 @@ +package net.lensfrex.rd.service.auth; + +import cn.dev33.satoken.stp.StpInterface; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.data.enums.UserType; +import net.lensfrex.rd.data.entity.table.UserBasic; +import net.lensfrex.rd.service.user.UserBasicService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class UserTypeStpInterfaceImpl implements StpInterface { + private static final Cache> userRoleCache = Caffeine.newBuilder() + .expireAfterAccess(15, TimeUnit.DAYS) + .initialCapacity(256) + .maximumSize(2048) + .build(); + + private static final List EMPTY_ARRAY = List.of(); + + private final UserBasicService userBasicService; + + public UserTypeStpInterfaceImpl(UserBasicService userBasicService) { + this.userBasicService = userBasicService; + } + + @Override + public List getPermissionList(Object uid, String loginType) { + List permissions = new ArrayList<>(); + permissions.add("all"); + + return permissions; + } + + @Override + public List getRoleList(Object uid, String loginType) { + List roles = userRoleCache.getIfPresent(uid.toString()); + if (roles != null) { + log.info("使用缓存的用户角色,用户:{}", uid); + return roles; + } else { + roles = new ArrayList<>(1); + } + + UserBasic userBasic = userBasicService.getUserBasicById(uid.toString()); + if (userBasic == null) { + return EMPTY_ARRAY; + } + + roles.add(switch (userBasic.getType()) { + case 0 -> UserType.STUDENT.name(); + case 1 -> UserType.TEACHER.name(); + case 2 -> UserType.ADMIN.name(); + default -> { + log.warn("未知的用户类型:{}", userBasic.getType()); + yield UserType.STUDENT.name(); + } + }); + + userRoleCache.put(uid.toString(), roles); + return roles; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/course/CourseService.java b/backend/src/main/java/net/lensfrex/rd/service/course/CourseService.java new file mode 100644 index 0000000..95b5130 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/course/CourseService.java @@ -0,0 +1,237 @@ +package net.lensfrex.rd.service.course; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.yitter.idgen.YitIdHelper; +import net.lensfrex.rd.dao.mapper.course.CourseMapper; +import net.lensfrex.rd.data.dto.course.CourseDTO; +import net.lensfrex.rd.data.entity.table.Course; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.service.user.UserInfoService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Service +public class CourseService { + private static final Cache cache = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.HOURS) + .initialCapacity(16) + .maximumSize(64) + .build(); + + private static final Cache> studentCandidateCourseCache = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.HOURS) + .initialCapacity(16) + .maximumSize(64) + .build(); + + private final CourseMapper courseMapper; + + private final UserInfoService userInfoService; + + public CourseService(CourseMapper courseMapper, + UserInfoService userInfoService) { + this.courseMapper = courseMapper; + this.userInfoService = userInfoService; + } + + /** + * 添加一个课程信息 + * + * @param courseRequest 添加请求 + * @return 已添加的课程信息 + */ + @Transactional + public CourseDTO add(CourseDTO courseRequest) { + String id = String.valueOf(YitIdHelper.nextId()); + + Course course = new Course(); + course.setId(id); + course.setName(courseRequest.getName()); + course.setCourseHours(courseRequest.getCourseHours()); + course.setSpringTerm(courseRequest.getSpringTerm()); + course.setTargetMajor(courseRequest.getTargetMajor()); + course.setTargetGrade(courseRequest.getTargetGrade()); + + courseMapper.insert(course); + + studentCandidateCourseCache.invalidateAll(); + return this.getCourse(id, false); + } + + /** + * 删除指定id的课程 + * + * @param id 欲删除的课程id + */ + @Transactional + public void delete(String id) { + Course course = new Course(); + course.setDeleted(true); + course.setEditTime(LocalDateTime.now()); + courseMapper.update(course, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + cache.invalidate(id); + } + + public CourseDTO getCourse(String id) { + return getCourse(id, true); + } + + /** + * 根据课程id获取课程信息 + * + * @param id 课程id + * @param useCache 是否使用缓存 + * @return 课程信息 + */ + public CourseDTO getCourse(String id, boolean useCache) { + var result = cache.getIfPresent(id); + if (!useCache || result == null) { + result = courseMapper.selectOne(new QueryWrapper() + .select("id", "name", "course_hours", "spring_term", "target_major", "target_grade") + .eq("id", id) + .eq("deleted", false) + ); + if (result == null) { + return null; + } + + cache.put(id, result); + } + + return convert(result); + } + + /** + * 分页获取所有课程 + * + * @param page 第几页 + * @param pageSize 每页数据量 + * @return 分页包装数据 + */ + public PaginationWrapper> list(int page, int pageSize) { + Page queryPage = new Page<>(page, pageSize); + var result = courseMapper.selectPage(queryPage, new QueryWrapper() + .select("id", "name", "course_hours", "spring_term", "target_major", "target_grade") + .eq("deleted", false) + ); + + List courseDTOList = new ArrayList<>(); + var records = result.getRecords(); + for (var course : records) { + courseDTOList.add(convert(course)); + } + + return new PaginationWrapper<>( + (int) result.getCurrent(), + (int) result.getSize(), + (int) result.getTotal(), + courseDTOList + ); + } + + private CourseDTO convert(Course course) { + CourseDTO courseDTO = new CourseDTO(); + courseDTO.setId(course.getId()); + courseDTO.setName(course.getName()); + courseDTO.setCourseHours(course.getCourseHours()); + courseDTO.setTargetMajor(course.getTargetMajor()); + courseDTO.setTargetGrade(course.getTargetGrade()); + courseDTO.setSpringTerm(course.getSpringTerm()); + + return courseDTO; + } + + private Course convert(CourseDTO courseDTO) { + Course course = new Course(); + course.setName(courseDTO.getName()); + course.setCourseHours(courseDTO.getCourseHours()); + course.setSpringTerm(courseDTO.getSpringTerm()); + course.setTargetMajor(courseDTO.getTargetMajor()); + course.setTargetGrade(courseDTO.getTargetGrade()); + + return course; + } + + /** + * 更新指定id的课程信息 + * + * @param id 课程id + * @param dto 新的课程信息 + * @return 更新好的课程信息 + */ + @Transactional + public CourseDTO update(String id, CourseDTO dto) { + var course = convert(dto); + course.setEditTime(LocalDateTime.now()); + + courseMapper.update(course, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + studentCandidateCourseCache.invalidateAll(); + return this.getCourse(id, false); + } + + private boolean isSpringTerm() { + int month = LocalDateTime.now().getMonthValue(); + + // 3~7月认为是春季期 + return month < 8 && month > 2; + } + + private int getGrade(Integer sessionYear) { + var now = LocalDateTime.now(); + int month = now.getMonthValue(); + int year = now.getYear(); + + // 到了秋季期的时间之后已经是下一个年级了 + if (month >= 8 || month < 2) { + return year - sessionYear + 1; + } else { + return year - sessionYear; + } + } + + /** + * 获取学生当前待选的课程 + * + * @param uid 学生uid + * @return 待选的课程列表 + */ + public ArrayList getCandidateCourseForStudent(String uid) { + var result = studentCandidateCourseCache.getIfPresent(uid); + if (result != null) { + return result; + } + + var courseInfo = userInfoService.getAsStudent(uid); + + var grade = getGrade(courseInfo.getGrade()); + var courses = courseMapper.getCourseByMajorAndGrade(courseInfo.getMajor(), grade, isSpringTerm()); + + result = new ArrayList<>(courses.size()); + for (var course : courses) { + result.add(convert(course)); + } + + studentCandidateCourseCache.put(uid, result); + return result; + } + + public void invalidStudentCandidateCourseCache() { + studentCandidateCourseCache.invalidateAll(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/experiment/ExperimentService.java b/backend/src/main/java/net/lensfrex/rd/service/experiment/ExperimentService.java new file mode 100644 index 0000000..c880566 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/experiment/ExperimentService.java @@ -0,0 +1,8 @@ +package net.lensfrex.rd.service.experiment; + +import org.springframework.stereotype.Service; + +@Service +public class ExperimentService { + +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/major/MajorService.java b/backend/src/main/java/net/lensfrex/rd/service/major/MajorService.java new file mode 100644 index 0000000..9e3eeb5 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/major/MajorService.java @@ -0,0 +1,135 @@ +package net.lensfrex.rd.service.major; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.yitter.idgen.YitIdHelper; +import net.lensfrex.rd.dao.mapper.major.MajorMapper; +import net.lensfrex.rd.data.entity.table.Major; +import net.lensfrex.rd.exception.data.DataNotExistsException; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +@Service +public class MajorService { + private static final Cache cache = Caffeine.newBuilder() + .expireAfterAccess(30, TimeUnit.DAYS) + .initialCapacity(16) + .maximumSize(64) + .build(); + + private final MajorMapper majorMapper; + + public MajorService(MajorMapper majorMapper) { + this.majorMapper = majorMapper; + } + + public Major addMajorIfNotExists(String name) { + Major major = this.getMajorByName(name); + if (major == null) { + major = new Major(); + String id = Long.toString(YitIdHelper.nextId()); + major.setId(id); + major.setName(name); + + majorMapper.insert(major); + + major = getMajor(id, false); + + putCache(major); + } + + return major; + } + + public void deleteMajor(String id) { + var major = majorMapper.selectOne(new QueryWrapper() + .select("name") + .eq("id", id) + .eq("deleted", false) + .last("limit 1") + ); + + if (major == null) { + return; + } + + major.setDeleted(true); + major.setEditTime(LocalDateTime.now()); + + majorMapper.update(major, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + cache.invalidate(id); + cache.invalidate(major.getName()); + } + + public Major getMajor(String id, boolean useCache) { + var major = cache.getIfPresent(id); + if (useCache && major != null) { + return major; + } + + major = majorMapper.selectOne(new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + if (major == null) { + throw new DataNotExistsException(); + } + + putCache(major); + + return major; + } + + public Major getMajor(String id) { + return getMajor(id, true); + } + + public Major getMajorByName(String name) { + var major = cache.getIfPresent(name); + if (major == null) { + major = majorMapper.selectOne(new QueryWrapper() + .eq("name", name) + .eq("deleted", false) + .last("limit 1") + ); + } + + return major; + } + + public Set listAllMajor() { + var cacheMap = cache.asMap(); + + if (!cacheMap.isEmpty()) { + return new HashSet<>(cacheMap.values()); + } + + var results = majorMapper.selectList(new QueryWrapper() + .select("id", "name") + .eq("deleted", false) + ); + + for (var result : results) { + putCache(result); + } + + return new HashSet<>(results); + } + + private void putCache(Major major) { + cache.put(major.getId(), major); + cache.put(major.getName(), major); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradAuthService.java b/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradAuthService.java new file mode 100644 index 0000000..8f16d52 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradAuthService.java @@ -0,0 +1,63 @@ +package net.lensfrex.rd.service.official; + +import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; +import cn.wustlinghang.mywust.exception.ApiException; +import cn.wustlinghang.mywust.network.RequestClientOption; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.exception.internal.JwcAuthException; +import net.lensfrex.rd.exception.internal.JwcNetworkException; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class OfficialUndergradAuthService { + private static final Cache cookieCache = Caffeine.newBuilder() + .expireAfterWrite(2, TimeUnit.HOURS) + .initialCapacity(256) + .maximumSize(2048) + .build(); + + private final UndergraduateLogin undergraduateLogin; + + private final RequestClientOption requestClientOption; + + public OfficialUndergradAuthService(UndergraduateLogin undergraduateLogin, + RequestClientOption requestClientOption) { + this.undergraduateLogin = undergraduateLogin; + this.requestClientOption = requestClientOption; + } + + public String getCookie(String username, String password) { + String cookie = cookieCache.getIfPresent(username); + if (cookie != null) { + try { + boolean cookieValid = undergraduateLogin.testCookie(cookie); + if (cookieValid) { + return cookie; + } + } catch (ApiException e) { + throw new JwcAuthException(e.getCodeDescribe()); + } catch (Exception e) { + log.warn("测试cookie出现异常, {}", e.toString()); + log.debug("", e); + } + } + + return renewCookie(username, password); + } + + private String renewCookie(String username, String password) { + try { + return undergraduateLogin.getLoginCookie(username, password, requestClientOption); + } catch (IOException e) { + throw new JwcNetworkException(); + } catch (ApiException e) { + throw new JwcAuthException(e.getCodeDescribe()); + } + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradScheduleService.java b/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradScheduleService.java new file mode 100644 index 0000000..016511d --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradScheduleService.java @@ -0,0 +1,75 @@ +package net.lensfrex.rd.service.official; + +import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCourseTableParser; +import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCourseTableApiService; +import cn.wustlinghang.mywust.data.common.Course; +import cn.wustlinghang.mywust.exception.ApiException; +import cn.wustlinghang.mywust.exception.ParseException; +import cn.wustlinghang.mywust.util.StringUtil; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.configure.PasswordConfigure; +import net.lensfrex.rd.service.user.StudentUserService; +import net.lensfrex.rd.service.user.UserBasicService; +import net.lensfrex.rd.util.PasswordUtil; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.List; + +@Slf4j +@Service +public class OfficialUndergradScheduleService { + private final OfficialUndergradAuthService authService; + private final UndergradCourseTableApiService apiService; + private final UndergradCourseTableParser parser; + + private final UserBasicService userBasicService; + private final StudentUserService studentUserService; + + private final PasswordUtil passwordUtil; + + public OfficialUndergradScheduleService(OfficialUndergradAuthService authService, + UndergradCourseTableApiService apiService, + UndergradCourseTableParser parser, + UserBasicService userBasicService, + PasswordConfigure passwordConfigure, + StudentUserService studentUserService) { + + this.authService = authService; + this.apiService = apiService; + this.parser = parser; + + this.userBasicService = userBasicService; + this.studentUserService = studentUserService; + + this.passwordUtil = new PasswordUtil(passwordConfigure.getKey(), passwordConfigure.getIv()); + } + + public List getOfficialCourseSchedule(String username, String password, String term) throws IOException, ApiException, ParseException { + if (term == null) { + term = StringUtil.getCurrentTermString(); + } + + String cookie = authService.getCookie(username, password); + String page = apiService.getPage(term, cookie); + + return parser.parse(page); + } + + public List getOfficialCourseSchedule(String uid, String term) throws IOException, ParseException, ApiException { + var user = userBasicService.getUserBasicById(uid); + var username = user.getUsername(); + var password = passwordUtil.decode(user.getPassword()); + + return getOfficialCourseSchedule(username, password, term); + } + + public List getOfficialCourseScheduleByStudentNumber(String studentNumber, String term) throws IOException, ParseException, ApiException { + var student = studentUserService.getByStudentNumber(studentNumber); + var username = student.username(); + var password = passwordUtil.decode(student.password()); + + return getOfficialCourseSchedule(username, password, term); + } +} + diff --git a/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradStudentInfoService.java b/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradStudentInfoService.java new file mode 100644 index 0000000..c85c55f --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/official/OfficialUndergradStudentInfoService.java @@ -0,0 +1,45 @@ +package net.lensfrex.rd.service.official; + +import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradStudentInfoPageParser; +import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradStudentInfoApiService; +import cn.wustlinghang.mywust.data.common.StudentInfo; +import cn.wustlinghang.mywust.exception.ApiException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +@Slf4j +@Service +public class OfficialUndergradStudentInfoService { + private final OfficialUndergradAuthService authService; + + private final UndergradStudentInfoApiService apiService; + + private final UndergradStudentInfoPageParser parser; + + public OfficialUndergradStudentInfoService(OfficialUndergradAuthService authService, + UndergradStudentInfoApiService apiService, + UndergradStudentInfoPageParser parser) { + this.authService = authService; + this.apiService = apiService; + this.parser = parser; + } + + public StudentInfo getNewStudentInfo(String username, String password) { + try { + String cookie = authService.getCookie(username, password); + String page = apiService.getPage(cookie); + return parser.parse(page); + } catch (ApiException e) { + log.warn("请求教务处学生信息发生api异常:{}", e.toString()); + } catch (IOException e) { + log.warn("请求教务处学生信息发生网络异常:{}", e.toString()); + } catch (Exception e) { + log.warn("请求教务处学生信息发生异常:{}", e.toString()); + log.debug("", e); + } + + return new StudentInfo(); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/schedule/CourseScheduleService.java b/backend/src/main/java/net/lensfrex/rd/service/schedule/CourseScheduleService.java new file mode 100644 index 0000000..23081d7 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/schedule/CourseScheduleService.java @@ -0,0 +1,466 @@ +package net.lensfrex.rd.service.schedule; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.util.MapUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.google.common.collect.Maps; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.yitter.idgen.YitIdHelper; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleMapper; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleSelectionMapper; +import net.lensfrex.rd.dao.mapper.schedule.TeacherClassMapper; +import net.lensfrex.rd.data.dto.schedule.CourseScheduleDTO; +import net.lensfrex.rd.data.dto.schedule.StudentExportDto; +import net.lensfrex.rd.data.entity.table.*; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.exception.data.DataNotExistsException; +import net.lensfrex.rd.service.activity.ActivityService; +import net.lensfrex.rd.service.user.StudentUserService; +import net.lensfrex.rd.service.user.TeacherUserService; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class CourseScheduleService { + private static final Cache cache = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.HOURS) + .initialCapacity(16) + .maximumSize(64) + .build(); + + private static final Cache> courseScheduleCache = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.HOURS) + .initialCapacity(16) + .maximumSize(64) + .build(); + + private final CourseScheduleMapper courseScheduleMapper; + private final CourseScheduleSelectionMapper courseScheduleSelectionMapper; + private final TeacherClassMapper teacherClassMapper; + private final TeacherUserService teacherUserService; + + private final StudentUserService studentUserService; + + private final ActivityService activityService; + + public CourseScheduleService(CourseScheduleMapper courseScheduleMapper, + CourseScheduleSelectionMapper courseScheduleSelectionMapper, + TeacherClassMapper teacherClassMapper, + TeacherUserService teacherUserService, + StudentUserService studentUserService, + ActivityService activityService) { + + this.courseScheduleMapper = courseScheduleMapper; + this.courseScheduleSelectionMapper = courseScheduleSelectionMapper; + this.teacherClassMapper = teacherClassMapper; + this.teacherUserService = teacherUserService; + this.studentUserService = studentUserService; + this.activityService = activityService; + } + + public CourseScheduleDTO getScheduleDTO(String id) { + var schedule = getSchedule(id); + + var result = convert(schedule); + var teachers = this.getScheduleTeacherInfo(id); + + result.setTeachers(teachers); + + return result; + } + + public CourseSchedule getSchedule(String id) { + return getSchedule(id, true); + } + + public CourseSchedule getSchedule(String id, boolean useCache) { + var schedule = cache.getIfPresent(id); + if (!useCache || schedule == null) { + schedule = courseScheduleMapper.selectOne(new QueryWrapper() + .select("id", "name", "course", "start_week", "end_week", "time", "week_day", + "academic_term", "place", "ratio", "distribution") + .eq("id", id) + .eq("deleted", false) + .last("limit 1") + ); + if (schedule == null) { + throw new DataNotExistsException(); + } + + putCache(schedule); + } + + return schedule; + } + + private List getScheduleOfCourse(String courseId, String term) { + String key = new StringJoiner(":").add(courseId).add(term).toString(); + var result = courseScheduleCache.getIfPresent(key); + if (result == null) { + result = courseScheduleMapper.selectList(new QueryWrapper() + .select("id", "name", "course", "start_week", "end_week", "time", "week_day", + "academic_term", "place", "ratio", "distribution") + .eq("academic_term", term) + .eq("course", courseId) + .eq("deleted", false) + ); + + courseScheduleCache.put(key, result); + } + + return result; + } + + public List getTermCourseSchedule(String courseId, String term) { + var schedules = getScheduleOfCourse(courseId, term); + + var dto = new ArrayList(schedules.size()); + for (var schedule : schedules) { + dto.add(convert(schedule)); + } + + return dto; + } + + public PaginationWrapper> getScheduleOfCourse(String courseId, int page, int pageSize) { + Page queryPage = new Page<>(page, pageSize); + var pageRecord = courseScheduleMapper.selectPage(queryPage, new QueryWrapper() + .select("id", "name", "course", "start_week", "end_week", "time", "week_day", + "academic_term", "place", "ratio", "distribution") + .eq("course", courseId) + .eq("deleted", false) + ); + + return wrapPaginationResult(pageRecord); + } + + public List getStudentTermSchedule(String uid, String term) { + var activityList = activityService.getByTerm(term); + if (activityList.isEmpty()) { + return new ArrayList<>(); + } + + var activityIds = new ArrayList(); + for (var activity : activityList) { + // 只取已经开始的活动 + if (LocalDateTime.now().isAfter(activity.getStartTime())) { + activityIds.add(activity.getId()); + } + } + + var records = courseScheduleSelectionMapper.selectList(new QueryWrapper() + .eq("student", uid) + .in("activity", activityIds) + .eq("deleted", false) + ); + + if (records.isEmpty()) { + return new ArrayList<>(); + } + + var scheduleIds = new ArrayList(records.size()); + + for (var record : records) { + scheduleIds.add(record.getSchedule()); + } + + var schedules = courseScheduleMapper.selectList(new QueryWrapper() + .select("id", "name", "course", "start_week", "end_week", "time", "week_day", + "academic_term", "place", "ratio", "distribution") + .in("id", scheduleIds) + .eq("deleted", false) + ); + + var result = new ArrayList(); + for (var schedule : schedules) { + result.add(convert(schedule)); + } + + return result; + } + + private PaginationWrapper> wrapPaginationResult(Page pageRecord) { + var records = pageRecord.getRecords(); + var resultList = new ArrayList(records.size()); + for (var schedule : records) { + resultList.add(convert(schedule)); + } + + return new PaginationWrapper<>( + (int) pageRecord.getCurrent(), + (int) pageRecord.getSize(), + (int) pageRecord.getTotal(), + resultList + ); + } + + static CourseSchedule convert(CourseScheduleDTO dto) { + CourseSchedule courseSchedule = new CourseSchedule(); + + courseSchedule.setId(dto.getId()); + courseSchedule.setName(dto.getName()); + courseSchedule.setCourse(dto.getCourse()); + courseSchedule.setStartWeek(dto.getStartWeek()); + courseSchedule.setEndWeek(dto.getEndWeek()); + courseSchedule.setTime(dto.getTime()); + courseSchedule.setWeekDay(dto.getWeekDay()); + courseSchedule.setAcademicTerm(dto.getAcademicTerm()); + courseSchedule.setPlace(dto.getPlace()); + courseSchedule.setRatio(dto.getRatio()); + courseSchedule.setDistribution(dto.getDistribution()); + + return courseSchedule; + + } + + static CourseScheduleDTO convert(CourseSchedule courseSchedule) { + CourseScheduleDTO courseScheduleDTO = new CourseScheduleDTO(); + + courseScheduleDTO.setId(courseSchedule.getId()); + courseScheduleDTO.setName(courseSchedule.getName()); + courseScheduleDTO.setCourse(courseSchedule.getCourse()); + courseScheduleDTO.setStartWeek(courseSchedule.getStartWeek()); + courseScheduleDTO.setEndWeek(courseSchedule.getEndWeek()); + courseScheduleDTO.setTime(courseSchedule.getTime()); + courseScheduleDTO.setWeekDay(courseSchedule.getWeekDay()); + courseScheduleDTO.setAcademicTerm(courseSchedule.getAcademicTerm()); + courseScheduleDTO.setPlace(courseSchedule.getPlace()); + courseScheduleDTO.setRatio(courseSchedule.getRatio()); + courseScheduleDTO.setDistribution(courseSchedule.getDistribution()); + + return courseScheduleDTO; + } + + private void putCache(CourseSchedule courseSchedule) { + cache.put(courseSchedule.getId(), courseSchedule); + + String key = new StringJoiner(":") + .add(courseSchedule.getCourse()) + .add(courseSchedule.getAcademicTerm()) + .toString(); + + var list = courseScheduleCache.getIfPresent(key); + if (list == null) { + list = new ArrayList<>(8); + list.add(courseSchedule); + courseScheduleCache.put(key, list); + } + + list.remove(courseSchedule); + list.add(courseSchedule); + } + + public List getScheduleTeachers(String scheduleId) { + var teacherClassList = teacherClassMapper.selectList(new QueryWrapper() + .select("teacher") + .eq("class", scheduleId) + .eq("deleted", false) + ); + + if (teacherClassList == null) { + return new ArrayList<>(); + } + + List teachers = new ArrayList<>(teacherClassList.size()); + for (var result : teacherClassList) { + teachers.add(result.getTeacher()); + } + + return teachers; + } + + public List getScheduleTeacherInfo(String scheduleId) { + var teacherIds = this.getScheduleTeachers(scheduleId); + + return teacherUserService.getInfoById(teacherIds); + } + + @Transactional + public CourseSchedule add(CourseScheduleDTO dto) { + String id = Long.toString(YitIdHelper.nextId()); + + CourseSchedule courseSchedule = convert(dto); + courseSchedule.setId(id); + + courseScheduleMapper.insert(courseSchedule); + + var teachers = dto.getTeacherIds(); + + if (!teachers.isEmpty()) { + teacherClassMapper.insetBatch(id, teachers); + } + + return getSchedule(id, false); + } + + @Transactional + public CourseSchedule update(String id, CourseScheduleDTO dto) { + CourseSchedule courseSchedule = convert(dto); + courseSchedule.setId(id); + + courseScheduleMapper.update(courseSchedule, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + var teachers = dto.getTeacherIds(); + + var existsTeachers = teacherClassMapper.selectList(new QueryWrapper() + .eq("class", id) + // deleted记录也一同带上,所以这里就不带deleted过滤了 + ); + + var deletedTeacherIds = new ArrayList(existsTeachers.size()); + for (var existsTeacher : existsTeachers) { + if (!dto.getTeacherIds().contains(existsTeacher.getTeacher())) { + deletedTeacherIds.add(existsTeacher.getTeacher()); + } + } + + TeacherClass deleteEntity = new TeacherClass(); + deleteEntity.setEditTime(LocalDateTime.now()); + deleteEntity.setDeleted(true); + + if (!deletedTeacherIds.isEmpty()) { + teacherClassMapper.update(deleteEntity, new QueryWrapper() + .in("teacher", deletedTeacherIds) + ); + } + + if (!teachers.isEmpty()) { + teacherClassMapper.insetBatch(id, teachers); + } + + return getSchedule(id, false); + } + + @Async + @Transactional + public void duplicate(String course, String sourceTerm, String targetTerm) { + var classList = this.getScheduleOfCourse(course, sourceTerm); + if (classList.isEmpty()) { + return; + } + + for (CourseSchedule clazz : classList) { + var teachers = this.getScheduleTeachers(clazz.getId()); + + String id = Long.toString(YitIdHelper.nextId()); + CourseSchedule clone = new CourseSchedule(); + clone.setId(id); + clone.setName(clazz.getName()); + clone.setCourse(course); + clone.setStartWeek(clazz.getStartWeek()); + clone.setEndWeek(clone.getEndWeek()); + clone.setTime(clone.getTime()); + clone.setWeekDay(clazz.getWeekDay()); + clone.setAcademicTerm(targetTerm); + clone.setPlace(clazz.getPlace()); + clone.setRatio(clone.getRatio()); + clone.setDistribution(clazz.getDistribution()); + clone.setCreateTime(LocalDateTime.now()); + clone.setEditTime(LocalDateTime.now()); + clone.setDeleted(false); + + courseScheduleMapper.insert(clone); + teacherClassMapper.insetBatch(id, teachers); + } + } + + public void delete(String id) { + CourseSchedule schedule = getSchedule(id); + schedule.setDeleted(true); + schedule.setEditTime(LocalDateTime.now()); + + courseScheduleMapper.update(schedule, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + cache.invalidate(id); + String key = new StringJoiner(":") + .add(schedule.getCourse()) + .add(schedule.getAcademicTerm()) + .toString(); + courseScheduleCache.invalidate(key); + } + + public int getSelectedCount(String scheduleId) { + return courseScheduleSelectionMapper.selectCount(new QueryWrapper() + .eq("schedule", scheduleId) + .eq("deleted", false) + ).intValue(); + } + + public byte[] exportStudentExcel(String scheduleId) { + var courseSelectionResultList = courseScheduleSelectionMapper.selectList(new QueryWrapper() + .select("student") + .eq("schedule", scheduleId) + .eq("deleted", false) + ); + + var studentIdList = new ArrayList(courseSelectionResultList.size()); + for (var courseSelection : courseSelectionResultList) { + studentIdList.add(courseSelection.getStudent()); + } + + var studentResultList = studentUserService.getByIds(studentIdList); + + List studentExportDtoList = new ArrayList<>(studentResultList.size()); + for (int i = 0; i < studentResultList.size(); i++) { + var student = studentResultList.get(i); + studentExportDtoList.add(convert(i + 1, student)); + } + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + InputStream template = getClass().getResourceAsStream("/template_student_list.xlsx"); + try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(template).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + excelWriter.fill(studentExportDtoList, fillConfig, writeSheet); + + Map map = MapUtils.newHashMap(); + var scheduleInfo = courseScheduleMapper.selectOne(new QueryWrapper() + .eq("id", scheduleId) + .eq("deleted", false) + .last("limit 1") + ); + + map.put("courseName", scheduleInfo.getName()); + map.put("count", this.getSelectedCount(scheduleId)); + + excelWriter.fill(map, writeSheet); + + excelWriter.finish(); + } + + return outputStream.toByteArray(); + } + + private StudentExportDto convert(int index, StudentInfo studentInfo) { + StudentExportDto studentExportDto = new StudentExportDto(); + studentExportDto.setId(index); + studentExportDto.setStudentNumber(studentInfo.getStudentNumber()); + studentExportDto.setName(studentInfo.getName()); + + return studentExportDto; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/schedule/StudentCourseScheduleService.java b/backend/src/main/java/net/lensfrex/rd/service/schedule/StudentCourseScheduleService.java new file mode 100644 index 0000000..ce50a24 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/schedule/StudentCourseScheduleService.java @@ -0,0 +1,100 @@ +package net.lensfrex.rd.service.schedule; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.yitter.idgen.YitIdHelper; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleMapper; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleSelectionMapper; +import net.lensfrex.rd.data.entity.table.CourseSchedule; +import net.lensfrex.rd.data.entity.table.CourseSelection; +import net.lensfrex.rd.exception.data.DataNotExistsException; +import net.lensfrex.rd.exception.data.DataNotMatchException; +import net.lensfrex.rd.service.activity.ActivityService; +import net.lensfrex.rd.service.course.CourseService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; + +@Service +public class StudentCourseScheduleService { + + private final ActivityService activityService; + private final CourseScheduleMapper courseScheduleMapper; + private final CourseService courseService; + private final CourseScheduleService courseScheduleService; + private final CourseScheduleSelectionMapper courseScheduleSelectionMapper; + + public StudentCourseScheduleService(ActivityService activityService, + CourseScheduleMapper courseScheduleMapper, CourseService courseService, + CourseScheduleService courseScheduleService, + CourseScheduleSelectionMapper courseScheduleSelectionMapper) { + + this.activityService = activityService; + this.courseScheduleMapper = courseScheduleMapper; + this.courseService = courseService; + this.courseScheduleService = courseScheduleService; + this.courseScheduleSelectionMapper = courseScheduleSelectionMapper; + } + + @Transactional + public void selectSchedule(String uid, String scheduleId, String activityId) { + var schedule = courseScheduleService.getSchedule(scheduleId); + if (schedule == null) { + throw new DataNotExistsException(); + } + + var activity = activityService.getById(activityId); + if (activity == null) { + throw new DataNotExistsException(); + } + + if (!schedule.getAcademicTerm().equals(activity.getTerm())) { + throw new DataNotMatchException(); + } + + var schedulesOfCourseList = courseScheduleService.getTermCourseSchedule(schedule.getCourse(), schedule.getAcademicTerm()); + var schedulesOfCourseIdList = new ArrayList(schedulesOfCourseList.size()); + for (var scheduleOfCourse : schedulesOfCourseList) { + schedulesOfCourseIdList.add(scheduleOfCourse.getId()); + } + + var selectedScheduleList = courseScheduleSelectionMapper.selectList(new QueryWrapper() + .eq("student", uid) + .eq("activity", activityId) + .eq("deleted", false) + ); + + for (var selectedCourse : selectedScheduleList) { + if (schedulesOfCourseIdList.contains(selectedCourse.getSchedule())) { + this.update(uid, selectedCourse.getSchedule(), scheduleId, activityId); + return; + } + } + + String id = Long.toString(YitIdHelper.nextId()); + CourseSelection courseSelection = new CourseSelection(); + courseSelection.setId(id); + courseSelection.setStudent(uid); + courseSelection.setSchedule(scheduleId); + courseSelection.setActivity(activityId); + courseSelection.setCreateTime(LocalDateTime.now()); + courseSelection.setEditTime(LocalDateTime.now()); + courseSelection.setDeleted(false); + + courseScheduleSelectionMapper.insert(courseSelection); + } + + @Transactional + public void update(String uid, String oldSchedule, String newSchedule, String activityId) { + CourseSelection courseSelection = new CourseSelection(); + courseSelection.setSchedule(newSchedule); + courseSelection.setEditTime(LocalDateTime.now()); + courseScheduleSelectionMapper.update(courseSelection, new QueryWrapper() + .eq("schedule", oldSchedule) + .eq("activity", activityId) + .eq("student", uid) + .eq("deleted", false) + ); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/schedule/TeacherCourseScheduleService.java b/backend/src/main/java/net/lensfrex/rd/service/schedule/TeacherCourseScheduleService.java new file mode 100644 index 0000000..cbcaeda --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/schedule/TeacherCourseScheduleService.java @@ -0,0 +1,45 @@ +package net.lensfrex.rd.service.schedule; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.util.MapUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleMapper; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleSelectionMapper; +import net.lensfrex.rd.dao.mapper.schedule.TeacherClassMapper; +import net.lensfrex.rd.data.dto.schedule.CourseScheduleDTO; +import net.lensfrex.rd.data.dto.schedule.StudentExportDto; +import net.lensfrex.rd.data.entity.table.CourseSchedule; +import net.lensfrex.rd.data.entity.table.CourseSelection; +import net.lensfrex.rd.data.entity.table.StudentInfo; +import net.lensfrex.rd.service.user.StudentUserService; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +public class TeacherCourseScheduleService { + private final TeacherClassMapper teacherClassMapper; + + public TeacherCourseScheduleService(TeacherClassMapper teacherClassMapper) { + + this.teacherClassMapper = teacherClassMapper; + } + + public List getTeacherSchedule(String uid, String term) { + var scheduleList = teacherClassMapper.getScheduleForTeacher(uid, term); + var result = new ArrayList(scheduleList.size()); + + for (var schedule : scheduleList) { + result.add(CourseScheduleService.convert(schedule)); + } + + return result; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/score/ScoreService.java b/backend/src/main/java/net/lensfrex/rd/service/score/ScoreService.java new file mode 100644 index 0000000..2eeced4 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/score/ScoreService.java @@ -0,0 +1,172 @@ +package net.lensfrex.rd.service.score; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.util.MapUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.yitter.idgen.YitIdHelper; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleMapper; +import net.lensfrex.rd.dao.mapper.schedule.CourseScheduleSelectionMapper; +import net.lensfrex.rd.dao.mapper.score.ScoreMapper; +import net.lensfrex.rd.data.dto.score.ScheduleScore; +import net.lensfrex.rd.data.dto.score.ScoreExportDto; +import net.lensfrex.rd.data.dto.score.StudentScore; +import net.lensfrex.rd.data.entity.table.CourseSchedule; +import net.lensfrex.rd.data.entity.table.CourseSelection; +import net.lensfrex.rd.data.entity.table.Score; +import net.lensfrex.rd.exception.data.DataFormatWrongException; +import net.lensfrex.rd.exception.data.DataNotExistsException; +import net.lensfrex.rd.service.user.StudentUserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +public class ScoreService { + private final ScoreMapper scoreMapper; + private final CourseScheduleSelectionMapper courseScheduleSelectionMapper; + private final CourseScheduleMapper courseScheduleMapper; + private final StudentUserService studentUserService; + + public ScoreService(ScoreMapper scoreMapper, + CourseScheduleSelectionMapper courseScheduleSelectionMapper, + CourseScheduleMapper courseScheduleMapper, + StudentUserService studentUserService) { + + this.scoreMapper = scoreMapper; + this.courseScheduleSelectionMapper = courseScheduleSelectionMapper; + + this.courseScheduleMapper = courseScheduleMapper; + this.studentUserService = studentUserService; + } + + public List getStudentScore(String uid) { + return scoreMapper.getStudentScore(uid); + } + + public List getClassScore(String scheduleId) { + return scoreMapper.getScheduleAllStudentScore(scheduleId); + } + + @Transactional + public void insertOrUpdateScore(String scheduleId, String scoreId, ScheduleScore scheduleScore) { + if (scheduleScore.getUsualScore() == null || scheduleScore.getExamScore() == null || scheduleScore.getNumber() == null) { + throw new DataFormatWrongException(); + } + + String studentUid = studentUserService.getByStudentNumber(scheduleScore.getNumber()).id(); + + boolean isCurrentCourseScheduleStudent = courseScheduleSelectionMapper.exists(new QueryWrapper() + .eq("student", studentUid) + .eq("schedule", scheduleId) + .eq("deleted", false) + ); + if (!isCurrentCourseScheduleStudent) { + throw new DataNotExistsException("不是当前课堂的学生"); + } + + if (scoreId == null) { + scoreId = Long.toString(YitIdHelper.nextId()); + } + + Score score = convert(scheduleScore); + score.setId(scoreId); + score.setStudent(studentUid); + score.setSchedule(scheduleId); + score.setEditTime(LocalDateTime.now()); + + scoreMapper.insertOrUpdateScore(score); + } + + public byte[] exportScoreExcel(String scheduleId) { + var scheduleInfo = courseScheduleMapper.selectOne(new QueryWrapper() + .select("name, ratio") + .eq("id", scheduleId) + .eq("deleted", false) + .last("limit 1") + ); + if (scheduleId == null) { + return null; + } + + var scoreList = scoreMapper.getScheduleAllStudentScore(scheduleId); + + double examRatio = scheduleInfo.getRatio() * 0.01; + + int count = 0; + double sum = 0.0; + + List scoreExportDtoList = new ArrayList<>(scoreList.size()); + for (int i = 0; i < scoreList.size(); i++) { + var score = scoreList.get(i); + ScoreExportDto dto = convert(i + 1, score); + if (score.getId() != null) { + count++; + double weightedUsualScore = score.getUsualScore() * (1 - examRatio); + double weightedExamScore = score.getExamScore() * examRatio; + double finalScore = weightedUsualScore + weightedExamScore; + sum += finalScore; + dto.setFinalScore(finalScore); + } + + scoreExportDtoList.add(dto); + } + + double avg = 0.0; + if(count != 0) { + avg = sum / count; + } + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + InputStream template = getClass().getResourceAsStream("/template_score.xlsx"); + try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(template).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + excelWriter.fill(scoreExportDtoList, fillConfig, writeSheet); + + Map map = MapUtils.newHashMap(); + + map.put("courseName", scheduleInfo.getName()); + map.put("count", count); + map.put("avg", avg); + map.put("sum", sum); + String ratioText = (1 - examRatio) + "/" + examRatio; + map.put("ratio", ratioText); + excelWriter.fill(map, writeSheet); + + excelWriter.finish(); + } + + return outputStream.toByteArray(); + } + + public static ScoreExportDto convert(int index, ScheduleScore scheduleScore) { + ScoreExportDto scoreExportDto = new ScoreExportDto(); + scoreExportDto.setId(index); + scoreExportDto.setName(scheduleScore.getName()); + scoreExportDto.setNumber(scheduleScore.getNumber()); + scoreExportDto.setUsualScore(scheduleScore.getUsualScore()); + scoreExportDto.setExamScore(scheduleScore.getExamScore()); + + return scoreExportDto; + } + + public static Score convert(ScheduleScore scheduleScore) { + Score score = new Score(); + score.setId(scheduleScore.getId()); +// score.setStudent(score.getStudent()); + score.setUsualScore(scheduleScore.getUsualScore()); + score.setExamScore(scheduleScore.getExamScore()); + + return score; + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/user/StudentUserService.java b/backend/src/main/java/net/lensfrex/rd/service/user/StudentUserService.java new file mode 100644 index 0000000..f9689af --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/user/StudentUserService.java @@ -0,0 +1,272 @@ +package net.lensfrex.rd.service.user; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yitter.idgen.YitIdHelper; +import net.lensfrex.rd.dao.mapper.user.StudentInfoMapper; +import net.lensfrex.rd.data.dto.user.UserBasicInfoDTO; +import net.lensfrex.rd.data.dto.user.student.BasicStudentInfoDto; +import net.lensfrex.rd.data.dto.user.student.NewStudentDTO; +import net.lensfrex.rd.data.dto.user.student.StudentUserInfoDTO; +import net.lensfrex.rd.data.entity.table.StudentInfo; +import net.lensfrex.rd.data.enums.UserType; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.exception.user.UserNotExistsException; +import net.lensfrex.rd.service.major.MajorService; +import net.lensfrex.rd.service.official.OfficialUndergradStudentInfoService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +public class StudentUserService { + private final StudentInfoMapper studentInfoMapper; + private final UserBasicService userBasicService; + private final UserInfoService userInfoService; + private final MajorService majorService; + + private final OfficialUndergradStudentInfoService officialUndergradStudentInfoService; + + public StudentUserService(StudentInfoMapper studentInfoMapper, + UserBasicService userBasicService, + UserInfoService userInfoService, + MajorService majorService, + OfficialUndergradStudentInfoService officialUndergradStudentInfoService) { + + this.studentInfoMapper = studentInfoMapper; + this.userBasicService = userBasicService; + this.userInfoService = userInfoService; + this.majorService = majorService; + + this.officialUndergradStudentInfoService = officialUndergradStudentInfoService; + } + + public PaginationWrapper> list(int page, int pageSize) { + Page queryPage = new Page<>(page, pageSize); + var result = studentInfoMapper.selectPage(queryPage, new QueryWrapper() + .select("id, student_number, name, major, grade, class, create_time, edit_time") + .eq("deleted", false) + ); + + return new PaginationWrapper<>( + (int) result.getCurrent(), + (int) result.getSize(), + (int) result.getTotal(), + result.getRecords() + ); + } + + public StudentInfo getById(String id) { + var result = studentInfoMapper.selectOne(new QueryWrapper() + .select("id, student_number, name, major, grade, class, create_time, edit_time") + .eq("id", id) + .eq("deleted", false) + ); + + if (result == null) { + throw new UserNotExistsException(); + } + + return result; + } + + public List getByIds(List idList) { + if (idList.isEmpty()) { + return new ArrayList<>(); + } + + var result = studentInfoMapper.selectList(new QueryWrapper() + .select("id, student_number, name, major, grade, class") + .in("id", idList) + .eq("deleted", false) + ); + + if (result.isEmpty()) { + throw new UserNotExistsException(); + } + + return result; + } + + public StudentUserInfoDTO getByStudentNumber(String studentNumber) { + var result = studentInfoMapper.selectOne(new QueryWrapper() + .select("id, student_number, name, major, grade, class, create_time, edit_time") + .eq("student_number", studentNumber) + .eq("deleted", false) + ); + + if (result == null) { + throw new UserNotExistsException(); + } + + var userBasic = userBasicService.getUserBasicById(result.getId()); + if (userBasic == null) { + throw new UserNotExistsException(); + } + + return StudentUserInfoDTO.builder() + .id(result.getId()) + .username(userBasic.getUsername()) + .number(result.getStudentNumber()) + .name(result.getName()) + .major(result.getMajor()) + .grade(result.getGrade()) + .clazz(result.getClazz()) + .build(); + } + + public StudentUserInfoDTO getInfoById(String id) { + var result = studentInfoMapper.selectOne(new QueryWrapper() + .select("id, student_number, name, major, grade, class, create_time, edit_time") + .eq("id", id) + .eq("deleted", false) + ); + + var userBasic = userBasicService.getUserBasicById(id); + + if (result == null || userBasic == null) { + throw new UserNotExistsException(); + } + + return StudentUserInfoDTO.builder() + .id(id) + .username(userBasic.getUsername()) + .number(result.getStudentNumber()) + .name(result.getName()) + .major(result.getMajor()) + .grade(result.getGrade()) + .clazz(result.getClazz()) + .build(); + } + + @Transactional + public StudentInfo add(BasicStudentInfoDto dto) { + String id = Long.toString(YitIdHelper.nextId()); + + StudentInfo studentInfo = new StudentInfo(); + studentInfo.setId(id); + studentInfo.setStudentNumber(dto.studentNumber()); + studentInfo.setName(dto.studentName()); + studentInfo.setMajor(dto.major()); + studentInfo.setGrade(Integer.parseInt(dto.studentNumber().substring(0, 4))); + studentInfo.setClazz(""); + studentInfo.setCreateTime(LocalDateTime.now()); + studentInfo.setEditTime(LocalDateTime.now()); + studentInfo.setDeleted(false); + + studentInfoMapper.insert(studentInfo); + + String username = dto.studentNumber(); + String password = ""; + userBasicService.addUser(id, username, password, (short) UserType.STUDENT.code); + + return studentInfo; + } + + @Transactional + public StudentInfo addWithAutoMajor(BasicStudentInfoDto dto) { + var userBasic = userBasicService.getUserBasicByUsername(dto.studentNumber()); + if (userBasic != null) { + return userInfoService.getAsStudent(userBasic.getId()); + } + + String id = Long.toString(YitIdHelper.nextId()); + + StudentInfo studentInfo = new StudentInfo(); + studentInfo.setId(id); + studentInfo.setStudentNumber(dto.studentNumber()); + studentInfo.setName(dto.studentName()); + + var major = majorService.addMajorIfNotExists(dto.major()); + studentInfo.setMajor(major.getId()); + + studentInfo.setGrade(Integer.parseInt(dto.studentNumber().substring(0, 4))); + studentInfo.setClazz("unknown"); + studentInfo.setCreateTime(LocalDateTime.now()); + studentInfo.setEditTime(LocalDateTime.now()); + studentInfo.setDeleted(false); + + studentInfoMapper.insert(studentInfo); + + String username = dto.studentNumber(); + String password = ""; + userBasicService.addUser(id, username, password, (short) UserType.STUDENT.code); + + return studentInfo; + } + + @Transactional + public void delete(String id) { + StudentInfo studentInfo = new StudentInfo(); + studentInfo.setDeleted(true); + + studentInfoMapper.update(studentInfo, new QueryWrapper() + .eq("id", id) + ); + + userBasicService.deleteUser(id); + userInfoService.invalidateCache(id); + } + + @Transactional + public StudentInfo update(String id, StudentUserInfoDTO dto) { + StudentInfo studentInfo = this.getById(id); + studentInfo.setStudentNumber(dto.id()); + studentInfo.setName(dto.name()); + studentInfo.setMajor(dto.major()); + studentInfo.setGrade(dto.grade()); + studentInfo.setClazz(dto.clazz()); + studentInfo.setEditTime(LocalDateTime.now()); + + studentInfoMapper.update(studentInfo, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + UserBasicInfoDTO userBasicInfoDTO = new UserBasicInfoDTO(id, dto.username(), dto.password(), (short) UserType.STUDENT.code); + userBasicService.updateUser(id, userBasicInfoDTO); + + return userInfoService.getAsStudent(id, false); + } + + @Transactional + public NewStudentDTO tryAddStudentFromOfficial(String studentNumber, String password) { + var originInfo = officialUndergradStudentInfoService.getNewStudentInfo(studentNumber, password); + + String name = originInfo.getName(); + String majorName = originInfo.getMajor(); + String clazz = originInfo.getClazz(); + + var studentInfo = studentInfoMapper.selectOne(new QueryWrapper() + .eq("student_number", studentNumber) + .eq("deleted", false) + ); + + String id; + if (studentInfo == null) { + id = Long.toString(YitIdHelper.nextId()); + studentInfo = StudentInfo.builder() + .id(id) + .studentNumber(studentNumber) + .name(name) + .grade(Integer.parseInt(studentNumber.substring(0, 4))) + .clazz(clazz) + .build(); + } else { + id = studentInfo.getId(); + } + + var major = majorService.addMajorIfNotExists(majorName); + studentInfo.setMajor(major.getId()); + studentInfoMapper.insertOrUpdate(studentInfo); + + var newUserBasic = userBasicService.addUser(id, studentNumber, password, (short) UserType.STUDENT.code); + + var newStudentInfo = userInfoService.getAsStudent(id, false); + + return new NewStudentDTO(newUserBasic, newStudentInfo); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/user/TeacherUserService.java b/backend/src/main/java/net/lensfrex/rd/service/user/TeacherUserService.java new file mode 100644 index 0000000..1cf8ca2 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/user/TeacherUserService.java @@ -0,0 +1,139 @@ +package net.lensfrex.rd.service.user; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yitter.idgen.YitIdHelper; +import net.lensfrex.rd.dao.mapper.user.TeacherInfoMapper; +import net.lensfrex.rd.data.dto.user.teacher.TeacherUserDTO; +import net.lensfrex.rd.data.dto.user.teacher.TeacherUserInfoDTO; +import net.lensfrex.rd.data.dto.user.UserBasicInfoDTO; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import net.lensfrex.rd.data.enums.UserType; +import net.lensfrex.rd.data.model.response.PaginationWrapper; +import net.lensfrex.rd.exception.user.UserNotExistsException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +public class TeacherUserService { + private final TeacherInfoMapper teacherInfoMapper; + + private final UserBasicService userBasicService; + private final UserInfoService userInfoService; + + public TeacherUserService(TeacherInfoMapper teacherInfoMapper, + UserBasicService userBasicService, + UserInfoService userInfoService) { + this.teacherInfoMapper = teacherInfoMapper; + this.userBasicService = userBasicService; + this.userInfoService = userInfoService; + } + + public PaginationWrapper> list(int page, int pageSize) { + Page queryPage = new Page<>(page, pageSize); + var result = teacherInfoMapper.selectPage(queryPage, new QueryWrapper() + .select("id, name, create_time, edit_time") + .eq("deleted", false) + ); + + return new PaginationWrapper<>( + (int) result.getCurrent(), + (int) result.getSize(), + (int) result.getTotal(), + result.getRecords() + ); + } + + public TeacherInfo getInfo(String id) { + var result = teacherInfoMapper.selectOne(new QueryWrapper() + .select("id, name, create_time, edit_time") + .eq("id", id) + .eq("deleted", false) + ); + + if (result == null) { + throw new UserNotExistsException(); + } + + return result; + } + + public TeacherUserInfoDTO getUserInfoById(String id) { + var result = teacherInfoMapper.selectOne(new QueryWrapper() + .select("id, name, create_time, edit_time") + .eq("id", id) + .eq("deleted", false) + ); + + var userBasic = userBasicService.getUserBasicById(id); + + if (result == null || userBasic == null) { + throw new UserNotExistsException(); + } + + return new TeacherUserInfoDTO(id, userBasic.getUsername(), result.getName()); + } + + public List getInfoById(List ids) { + if (ids.isEmpty()) { + return new ArrayList<>(); + } + + return teacherInfoMapper.selectList(new QueryWrapper() + .select("id", "name") + .in("id", ids) + .eq("deleted", false) + ); + } + + @Transactional + public TeacherInfo add(TeacherUserDTO dto) { + String id = Long.toString(YitIdHelper.nextId()); + + TeacherInfo teacherInfo = new TeacherInfo(); + teacherInfo.setId(id); + teacherInfo.setName(dto.teacherName()); + + teacherInfoMapper.insert(teacherInfo); + + String username = (dto.username() == null) ? teacherInfo.getId() : dto.username(); + String password = dto.password(); + userBasicService.addUser(id, username, password, (short) UserType.TEACHER.code); + + return userInfoService.getAsTeacher(id, false); + } + + @Transactional + public void delete(String id) { + TeacherInfo teacherInfo = new TeacherInfo(); + teacherInfo.setDeleted(true); + + teacherInfoMapper.update(teacherInfo, new QueryWrapper() + .eq("id", id) + ); + + userBasicService.deleteUser(id); + userInfoService.invalidateCache(id); + } + + @Transactional + public TeacherInfo update(String id, TeacherUserDTO dto) { + TeacherInfo teacherInfo = this.getInfo(id); + teacherInfo.setName(dto.teacherName()); + teacherInfo.setEditTime(LocalDateTime.now()); + + teacherInfoMapper.update(teacherInfo, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + UserBasicInfoDTO userBasicInfoDTO = new UserBasicInfoDTO(id, dto.username(), dto.password(), (short) UserType.TEACHER.code); + userBasicService.updateUser(id, userBasicInfoDTO); + + return userInfoService.getAsTeacher(id, false); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/user/UserBasicService.java b/backend/src/main/java/net/lensfrex/rd/service/user/UserBasicService.java new file mode 100644 index 0000000..3a4059c --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/user/UserBasicService.java @@ -0,0 +1,192 @@ +package net.lensfrex.rd.service.user; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.yitter.idgen.YitIdHelper; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.configure.PasswordConfigure; +import net.lensfrex.rd.dao.mapper.user.UserBasicMapper; +import net.lensfrex.rd.data.dto.user.UserBasicInfoDTO; +import net.lensfrex.rd.data.entity.table.UserBasic; +import net.lensfrex.rd.exception.user.UserNotExistsException; +import net.lensfrex.rd.util.PasswordUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class UserBasicService { + private static final Cache usernameCache = Caffeine.newBuilder() + .expireAfterWrite(2, TimeUnit.DAYS) + .initialCapacity(256) + .maximumSize(2048) + .build(); + + private static final Cache idCache = Caffeine.newBuilder() + .expireAfterWrite(2, TimeUnit.DAYS) + .initialCapacity(256) + .maximumSize(2048) + .build(); + + private final PasswordUtil passwordUtil; + + private final UserBasicMapper userBasicMapper; + + public UserBasicService(PasswordConfigure passwordConfigure, UserBasicMapper userBasicMapper) { + this.passwordUtil = new PasswordUtil(passwordConfigure.getKey(), passwordConfigure.getIv()); + this.userBasicMapper = userBasicMapper; + } + + public UserBasic getUserBasicByUsername(String username) { + UserBasic userBasic = usernameCache.getIfPresent(username); + if (userBasic != null) { + return userBasic; + } + + userBasic = userBasicMapper.selectOne( + new QueryWrapper() + .select("id", "username", "password", "type") + .eq("username", username) + .eq("deleted", false) + .last("limit 1") + ); + + return putCache(userBasic); + } + + public UserBasic getUserBasicById(String id) { + return getUserBasicById(id, true); + } + + public UserBasic getUserBasicById(String id, boolean useCache) { + UserBasic userBasic = idCache.getIfPresent(id); + if (useCache && userBasic != null) { + return userBasic; + } + + userBasic = userBasicMapper.selectOne( + new QueryWrapper() + .select("id", "username", "password", "type") + .eq("id", id) + .eq("deleted", false) + .last("limit 1") + ); + + return putCache(userBasic); + } + + private UserBasic putCache(UserBasic userBasic) { + if (userBasic == null) { + return null; + } + + usernameCache.put(userBasic.getUsername(), userBasic); + idCache.put(userBasic.getId(), userBasic); + + return userBasic; + } + + public UserBasic addUser(String username, String password, short type) { + long id = YitIdHelper.nextId(); + return this.addUser(Long.toString(id), username, password, type); + } + + public UserBasic addUser(String id, String username, String password, short type) { + var find = this.getUserBasicById(id); + + UserBasic userBasic = new UserBasic(); + if (find != null) { + String encryptedPassword = passwordUtil.encode(password); + + userBasic.setId(id); + userBasic.setUsername(username); + userBasic.setPassword(encryptedPassword); + userBasic.setType(type); + + userBasicMapper.update(userBasic, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + } else { + if (password == null) { + password = username; + } + + String encryptedPassword = password.isEmpty() ? "" : passwordUtil.encode(password); + + userBasic.setId(id); + userBasic.setUsername(username); + userBasic.setPassword(encryptedPassword); + userBasic.setType(type); + + userBasicMapper.insert(userBasic); + } + + putCache(userBasic); + return userBasic; + } + + @Transactional + public UserBasic updatePassword(String uid, String newPassword) { + var userBasic = this.getUserBasicById(uid); + if (userBasic == null) { + throw new UserNotExistsException(); + } + + String encryptedPassword = passwordUtil.encode(newPassword); + + userBasic.setPassword(encryptedPassword); + userBasic.setEditTime(LocalDateTime.now()); + userBasicMapper.update(userBasic, new QueryWrapper() + .eq("id", uid) + .eq("deleted", false) + ); + + return this.getUserBasicById(uid, false); + } + + @Transactional + public UserBasic updateUser(String id, UserBasicInfoDTO dto) { + var userBasic = this.getUserBasicById(id, false); + if (userBasic == null) { + throw new UserNotExistsException(); + } + + String encryptedPassword = passwordUtil.encode(dto.password()); + + userBasic.setId(id); + userBasic.setUsername(dto.username()); + userBasic.setPassword(encryptedPassword); + userBasic.setType(dto.type()); + userBasic.setEditTime(LocalDateTime.now()); + userBasicMapper.update(userBasic, new QueryWrapper() + .eq("id", id) + .eq("deleted", false) + ); + + return this.getUserBasicById(id, false); + } + + public void deleteUser(String id) { + UserBasic userBasic = this.getUserBasicById(id); + if (userBasic == null) { + throw new UserNotExistsException(); + } + + userBasic.setDeleted(true); + userBasic.setEditTime(LocalDateTime.now()); + userBasicMapper.update(userBasic, new QueryWrapper() + .eq("id", id) + ); + + var cache = idCache.getIfPresent(id); + if (cache != null) { + usernameCache.invalidate(cache.getUsername()); + } + idCache.invalidate(id); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/service/user/UserInfoService.java b/backend/src/main/java/net/lensfrex/rd/service/user/UserInfoService.java new file mode 100644 index 0000000..bda4a83 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/service/user/UserInfoService.java @@ -0,0 +1,79 @@ +package net.lensfrex.rd.service.user; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import lombok.extern.slf4j.Slf4j; +import net.lensfrex.rd.dao.mapper.user.StudentInfoMapper; +import net.lensfrex.rd.dao.mapper.user.TeacherInfoMapper; +import net.lensfrex.rd.data.entity.table.StudentInfo; +import net.lensfrex.rd.data.entity.table.TeacherInfo; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class UserInfoService { + + private static final Cache cache = Caffeine.newBuilder() + .expireAfterWrite(2, TimeUnit.DAYS) + .initialCapacity(256) + .maximumSize(2048) + .build(); + + private final StudentInfoMapper studentInfoMapper; + + private final TeacherInfoMapper teacherInfoMapper; + + public UserInfoService(StudentInfoMapper studentInfoMapper, TeacherInfoMapper teacherInfoMapper) { + this.studentInfoMapper = studentInfoMapper; + this.teacherInfoMapper = teacherInfoMapper; + } + + public void invalidateCache(String id) { + cache.invalidate(id); + } + + public StudentInfo getAsStudent(String id, boolean useCache) { + Object info = cache.getIfPresent(id); + if (useCache && info != null) { + log.debug("使用缓存的用户信息,用户id:{}", id); + return (StudentInfo) info; + } + + info = studentInfoMapper.selectOne(new QueryWrapper() + .select("id", "student_number", "name", "major", "grade", "class") + .eq("id", id) + .eq("deleted", false) + ); + + cache.put(id, info); + return (StudentInfo) info; + } + + public StudentInfo getAsStudent(String id) { + return getAsStudent(id, true); + } + + public TeacherInfo getAsTeacher(String id, boolean useCache) { + Object info = cache.getIfPresent(id); + if (useCache && info != null) { + log.debug("使用缓存的用户信息,用户id:{}", id); + return (TeacherInfo) info; + } + + info = teacherInfoMapper.selectOne(new QueryWrapper() + .select("id", "name") + .eq("id", id) + .eq("deleted", false) + ); + + cache.put(id, info); + return (TeacherInfo) info; + } + + public TeacherInfo getAsTeacher(String id) { + return getAsTeacher(id, true); + } +} diff --git a/backend/src/main/java/net/lensfrex/rd/util/PasswordUtil.java b/backend/src/main/java/net/lensfrex/rd/util/PasswordUtil.java new file mode 100644 index 0000000..371efa0 --- /dev/null +++ b/backend/src/main/java/net/lensfrex/rd/util/PasswordUtil.java @@ -0,0 +1,53 @@ +package net.lensfrex.rd.util; + +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; +import cn.hutool.crypto.symmetric.SymmetricCrypto; + +import java.nio.charset.StandardCharsets; +import java.util.StringJoiner; + +public class PasswordUtil { + private final SymmetricCrypto aes; + + public PasswordUtil(String key, String iv) { + byte[] keyBytes = normalization(key); + byte[] ivBytes = normalization(iv); + + this.aes = new AES(Mode.CBC, Padding.PKCS5Padding, keyBytes, ivBytes); + } + + private static byte[] normalization(String key) { + if (key.length() < 16) { + StringJoiner sj = new StringJoiner(key); + for (int i = 0; i < 16 - key.length(); i++) { + sj.add("a"); + } + key = sj.toString(); + } else if(key.length() > 16) { + key = key.substring(15); + } + + return key.getBytes(StandardCharsets.UTF_8); + } + + public String encode(String raw) { + if (raw == null) { + return null; + } + + byte[] data = aes.encrypt(raw.getBytes(StandardCharsets.UTF_8)); + return HexUtil.encodeHexStr(data); + } + + public String decode(String encodedHex) { + if (encodedHex == null) { + return null; + } + + byte[] data = aes.decrypt(HexUtil.decodeHex(encodedHex)); + return new String(data); + } +} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml new file mode 100644 index 0000000..c2060f4 --- /dev/null +++ b/backend/src/main/resources/application.yml @@ -0,0 +1,100 @@ + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl + mapper-locations: classpath*:/mapper/**/*.xml + +logging: + level: + net.lensfrex.rd: ${LOG_LEVEL} + druid.sql.Statement: trace + pattern: + console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}" + file: "%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}" + +spring: + devtools: + restart: + enabled: true + config: + import: optional:file:.env[.properties] + data: + redis: + client-name: neolaf + host: ${REDIS_HOST} + port: ${REDIS_PORT} + password: ${REDIS_PASSWORD} + database: 0 + lettuce: + pool: + max-active: 8 + max-wait: -1 + max-idle: 8 + min-idle: 0 + + datasource: + driver-class-name: org.postgresql.Driver + type: com.alibaba.druid.pool.DruidDataSource + url: jdbc:postgresql://${DATABASE_ADDRESS}:${DATABASE_PORT}/${DATABASE_DBNAME}?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + username: ${DATABASE_USERNAME} + password: ${DATABASE_PASSWORD} + + # drud配置: + druid: + initial-size: 2 + max-active: 16 + min-idle: 1 + max-wait: 2000 + pool-prepared-statements: false + max-pool-prepared-statement-per-connection-size: -1 + keep-alive: true + + filters: stat,wall,slf4j + + filter: + stat: + enabled: true + db-type: postgresql + log-slow-sql: true + slow-sql-millis: 512 + slf4j: + enabled: true + statement-log-error-enabled: true + statement-create-after-log-enabled: false + statement-close-after-log-enabled: false + result-set-open-after-log-enabled: false + result-set-close-after-log-enabled: false + statement-executable-sql-log-enable: true + + stat-view-servlet: + enabled: true + login-username: admin + login-password: 123456 + url-pattern: /druid/* + reset-enable: false + allow: 127.0.0.1 + + web-stat-filter: + enabled: true + url-pattern: /* + exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' + session-stat-enable: true + session-stat-max-count: 1 + principal-session-name: userName + principal-cookie-name: userName + profile-enable: true + +server: + port: ${SERVER_PORT} + address: ${SERVER_ADDRESS} + servlet: + context-path: / + +little-busters: + password: + key: ${PASSWORD_ENCKEY} + iv: ${PASSWORD_ENDIV} + +sa-token: + token-name: auth-token + is-concurrent: true \ No newline at end of file diff --git a/backend/src/main/resources/logback.xml b/backend/src/main/resources/logback.xml new file mode 100644 index 0000000..5922551 --- /dev/null +++ b/backend/src/main/resources/logback.xml @@ -0,0 +1,54 @@ + + + + + + RadicalDreamers + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${FILE_LOG_PATTERN} + + + + ${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log.gz + 365 + 128MB + + + true + + + + 5000 + 0 + false + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/mapper/CourseMapper.xml b/backend/src/main/resources/mapper/CourseMapper.xml new file mode 100644 index 0000000..d6044ad --- /dev/null +++ b/backend/src/main/resources/mapper/CourseMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/mapper/CourseScheduleMapper.xml b/backend/src/main/resources/mapper/CourseScheduleMapper.xml new file mode 100644 index 0000000..9972fb8 --- /dev/null +++ b/backend/src/main/resources/mapper/CourseScheduleMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + c.id course_id, c."name" course_name, array_agg(ti."name") teachers, c.course_hours, c.spring_term, c.target_major, c.target_grade, + cs.id schedule_id, cs.start_week, cs.end_week, cs.time, cs.academic_term, cs.place, cs.ratio + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/mapper/ScoreMapper.xml b/backend/src/main/resources/mapper/ScoreMapper.xml new file mode 100644 index 0000000..58f56d6 --- /dev/null +++ b/backend/src/main/resources/mapper/ScoreMapper.xml @@ -0,0 +1,41 @@ + + + + + insert into score ("id", "student", "usual_score", "exam_score", "class") + values (#{score.id}, #{score.student}, #{score.usualScore}, #{score.examScore}, #{score.schedule}) + on conflict (id, student, class) do update set (usual_score, exam_score) = (excluded.usual_score, excluded.exam_score) + + + + insert into score ("id", "student", "usual_score", "exam_score", "class") + values + + (#{score.id}, #{score.student}, #{score.usualScore}, #{score.examScore}, #{score.schedule}) + + on conflict (id, student, class) do update set (usual_score,exam_score) = (excluded.usual_score, excluded.exam_score) + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/mapper/StudentInfoMapper.xml b/backend/src/main/resources/mapper/StudentInfoMapper.xml new file mode 100644 index 0000000..13d4bb9 --- /dev/null +++ b/backend/src/main/resources/mapper/StudentInfoMapper.xml @@ -0,0 +1,9 @@ + + + + + insert into student_info (id, student_number, "name", major, grade, class) + values (#{student.id}, #{student.studentNumber}, #{student.name}, #{student.major}, #{student.grade}, #{student.clazz}) + on conflict (id, student_number) do update set (id, student_number, "name", major, grade, class) = (#{student.id}, #{student.studentNumber}, #{student.name}, #{student.major}, #{student.grade}, #{student.clazz}) + + \ No newline at end of file diff --git a/backend/src/main/resources/mapper/TeacherClassMapper.xml b/backend/src/main/resources/mapper/TeacherClassMapper.xml new file mode 100644 index 0000000..f83b5d9 --- /dev/null +++ b/backend/src/main/resources/mapper/TeacherClassMapper.xml @@ -0,0 +1,28 @@ + + + + + + insert into teacher_class (class, teacher) values + + (#{scheduleId}, #{teacher}) + + on conflict (class, teacher) do update set deleted = false + + + + \ No newline at end of file diff --git a/backend/src/main/resources/template_score.xlsx b/backend/src/main/resources/template_score.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1805b01894e01c5fa8a7f9e2e87f230979a4b031 GIT binary patch literal 10812 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 literal 0 HcmV?d00001 diff --git a/backend/src/main/resources/template_student_list.xlsx b/backend/src/main/resources/template_student_list.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..54a2adc0650643d5085060f464ad1a57646fe9dc GIT binary patch literal 10514 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 v0sxVu0Kh*)z;pAzXYRk6LxZUCf98MYaiA;|C + + +features.md + + + + + + + + + + + + +

功能详情

+

一些概念:

+
    +
  • 课程:一门课
  • +
  • 课堂:实际上课的一门课程,即具体安排的一门课,同一个课程的不同时间安排,就是一个课堂
  • +
  • 选课:实际上就是在选课活动的时间内,学生对课堂的选择
  • +
  • 选课活动:一个学期的选课活动,在选课时间段内学生可以进行任意的选课,是面向所有学生的,其对应课程在查看待选课堂时进行筛选
  • +
+
+

选课信息是实时的,不需要等待选课活动结束才能得到名单,也可以立即导出,在选课活动结束后只是学生不能再进行选课以及修改

+
+

用户(学生)

+
    +
  1. 学生进入网页,使用教务处账号登录认证,获取学生信息,进入系统
  2. +
  3. 进入系统后可自动获取显示自己专业自己年级待选的实验课列表
  4. +
  5. 在选课时间段内,可点击相应的实验课后查看可选则的时间段。选择相应的时间段(+如可能,可以拉取教务处课表以供时间选择的参考)
  6. +
  7. 在选课时间段内,可以任意更改所选课程的时间段。
  8. +
  9. 选课结束后,可以查看已选择的时间,未来或许可能会将数据同步至武科大助手课表与教务处课表一同显示
  10. +
  11. 课程结束后,可以按课程查看分数详情,包括平时分和考试分以及最后总分。(+如可能,可以将成绩细分为实验课内的每个实验项目)
  12. +
+

教师

+
    +
  1. 教师账号通过管理员手动添加
  2. +
  3. 教师登陆后可以查看自己教授的课程,
  4. +
  5. 查看自己教的课程列表,可以查看该课程相应的课堂,进而可以查看课堂信息(选课人数,时间等),包括学生名单,并将其导出为excel
  6. +
  7. 教师可以按照课堂对全班学生进行成绩登记,包括平时成绩与考试成绩,管理员设定该课堂的成绩占比后可以立即计算所有学生的最终成绩,并将其导出excel
  8. +
  9. 教师仍可以查看往期课堂的信息,包括学生名单和全班成绩信息等
  10. +
+

管理员

+
    +
  1. 管理员是负责对课堂、课程等信息进行管理的用户
  2. +
  3. 管理员可以增删查改课堂、课程信息,设定相应的参数信息。
  4. +
  5. 由管理员发布选课活动,设定课堂的成绩比例
  6. +
  7. 管理员可以查看所有信息(学生+教师)
  8. +
  9. 管理员也可查看未完整进行选课(一个或多个课程仍未进行选课)的学生列表(需要提前导入学生列表)
  10. +
+

一些信息的参数:

+
    +
  • 选课活动:名称,学年学期(如2023-2024-1),目标年级(多选),目标专业(多选),开始时间,结束时间
  • +
  • 课程:名称,课时,目标年级(多选),目标专业(多选)
  • +
  • 课堂:对应课程id,起始周,上课时间(12345678节等等),上课地点,成绩占比
  • +
+ + + diff --git a/doc/features.md b/doc/features.md new file mode 100644 index 0000000..9515925 --- /dev/null +++ b/doc/features.md @@ -0,0 +1,40 @@ +# 功能详情 + +一些概念: + - 课程:一门课 + - *课堂*:实际上课的一门课程,即具体安排的一门课,同一个课程的不同时间安排,就是一个*课堂* + - 选课:实际上就是在选课活动的时间内,学生对*课堂*的选择 + - 选课活动:一个学期的选课活动,在选课时间段内学生可以进行任意的选课,是面向所有学生的,其对应课程在查看待选*课堂*时进行筛选 + +> 选课信息是实时的,不需要等待选课活动结束才能得到名单,也可以立即导出,在选课活动结束后只是学生不能再进行选课以及修改 + + +## 用户(学生) + +1. 学生进入网页,使用教务处账号登录认证,获取学生信息,进入系统 +2. 进入系统后可自动获取显示自己专业自己年级待选的实验课列表 +3. 在选课时间段内,可点击相应的实验课后查看可选则的时间段。选择相应的时间段(+如可能,可以拉取教务处课表以供时间选择的参考) +4. 在选课时间段内,可以任意更改所选课程的时间段。 +5. 选课结束后,可以查看已选择的时间,未来或许可能会将数据同步至武科大助手课表与教务处课表一同显示 +6. 课程结束后,可以按课程查看分数详情,包括平时分和考试分以及最后总分。(+如可能,可以将成绩细分为实验课内的每个实验项目) + +## 教师 + +1. 教师账号通过管理员手动添加 +2. 教师登陆后可以查看自己教授的课程, +3. 查看自己教的课程列表,可以查看该课程相应的*课堂*,进而可以查看*课堂*信息(选课人数,时间等),包括学生名单,并将其导出为excel +4. 教师可以按照*课堂*对全班学生进行成绩登记,包括平时成绩与考试成绩,管理员设定该*课堂*的成绩占比后可以立即计算所有学生的最终成绩,并将其导出excel +5. 教师仍可以查看往期*课堂*的信息,包括学生名单和全班成绩信息等 + +## 管理员 + +1. 管理员是负责对*课堂*、课程等信息进行管理的用户 +2. 管理员可以增删查改*课堂*、课程信息,设定相应的参数信息。 +3. 由管理员发布选课活动,设定*课堂*的成绩比例 +4. 管理员可以查看所有信息(学生+教师) +5. 管理员也可查看未完整进行选课(一个或多个课程仍未进行选课)的学生列表(需要提前导入学生列表) + +一些信息的参数: + - 选课活动:名称,学年学期(如2023-2024-1),目标年级(多选),目标专业(多选),开始时间,结束时间 + - 课程:名称,课时,目标年级(多选),目标专业(多选) + - *课堂*:对应课程id,起始周,上课时间(12345678节等等),上课地点,成绩占比 diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/frontend/.eslintignore b/frontend/.eslintignore new file mode 100644 index 0000000..f78c8ac --- /dev/null +++ b/frontend/.eslintignore @@ -0,0 +1,7 @@ +/dist +/src-capacitor +/src-cordova +/.quasar +/node_modules +.eslintrc.js +/quasar.config.*.temporary.compiled* diff --git a/frontend/.eslintrc.cjs b/frontend/.eslintrc.cjs new file mode 100644 index 0000000..103f97b --- /dev/null +++ b/frontend/.eslintrc.cjs @@ -0,0 +1,66 @@ +module.exports = { + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, + + parserOptions: { + ecmaVersion: 2021, // Allows for the parsing of modern ECMAScript features + }, + + env: { + node: true, + browser: true, + 'vue/setup-compiler-macros': true + }, + + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + // 'eslint:recommended', + + // Uncomment any of the lines below to choose desired strictness, + // but leave only one uncommented! + // See https://eslint.vuejs.org/rules/#available-rules + 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + 'prettier' + ], + + plugins: [ + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + 'vue', + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + + ], + + globals: { + ga: 'readonly', // Google Analytics + cordova: 'readonly', + __statics: 'readonly', + __QUASAR_SSR__: 'readonly', + __QUASAR_SSR_SERVER__: 'readonly', + __QUASAR_SSR_CLIENT__: 'readonly', + __QUASAR_SSR_PWA__: 'readonly', + process: 'readonly', + Capacitor: 'readonly', + chrome: 'readonly' + }, + + // add your custom rules here + rules: { + + 'prefer-promise-reject-errors': 'off', + + // allow debugger during development only + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..f1d913c --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,33 @@ +.DS_Store +.thumbs.db +node_modules + +# Quasar core related directories +.quasar +/dist +/quasar.config.*.temporary.compiled* + +# Cordova related directories and files +/src-cordova/node_modules +/src-cordova/platforms +/src-cordova/plugins +/src-cordova/www + +# Capacitor related directories and files +/src-capacitor/www +/src-capacitor/node_modules + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln + +# local .env files +.env.local* diff --git a/frontend/.npmrc b/frontend/.npmrc new file mode 100644 index 0000000..32bd84d --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1,3 @@ +# pnpm-related options +shamefully-hoist=true +strict-peer-dependencies=false diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..6ba28fa --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,41 @@ +# LittleBusters (little-busters-fe) + +一个普普通通的选课 + +## Install the dependencies +```bash +yarn +# or +npm install +``` + +### Start the app in development mode (hot-code reloading, error reporting, etc.) +```bash +quasar dev +``` + + +### Lint the files +```bash +yarn lint +# or +npm run lint +``` + + +### Format the files +```bash +yarn format +# or +npm run format +``` + + + +### Build the app for production +```bash +quasar build +``` + +### Customize the configuration +See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js). diff --git a/frontend/env.dev.js b/frontend/env.dev.js new file mode 100644 index 0000000..f144789 --- /dev/null +++ b/frontend/env.dev.js @@ -0,0 +1,3 @@ +export let config = { + baseUrl: 'http://127.0.0.1:8800' +} diff --git a/frontend/env.prod.js b/frontend/env.prod.js new file mode 100644 index 0000000..fdd0b93 --- /dev/null +++ b/frontend/env.prod.js @@ -0,0 +1,4 @@ +export let config = { + // baseUrl: 'http://127.0.0.1:8800' + baseUrl: window.location.origin + "/api/v1" +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..480c1b6 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,20 @@ + + + + <%= productName %> + + + + + + + + + + + + + + + + diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json new file mode 100644 index 0000000..c8e8f37 --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "app/*": [ + "*" + ], + "components/*": [ + "src/components/*" + ], + "layouts/*": [ + "src/layouts/*" + ], + "pages/*": [ + "src/pages/*" + ], + "assets/*": [ + "src/assets/*" + ], + "boot/*": [ + "src/boot/*" + ], + "stores/*": [ + "src/stores/*" + ], + "vue$": [ + "node_modules/vue/dist/vue.runtime.esm-bundler.js" + ] + } + }, + "exclude": [ + "dist", + ".quasar", + "node_modules" + ] +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..aaebc29 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,9067 @@ +{ + "name": "radical-dreamers-fe", + "version": "0.0.1-beta", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "radical-dreamers-fe", + "version": "0.0.1-beta", + "dependencies": { + "@quasar/extras": "^1.16.6", + "@quasar/quasar-ui-qcalendar": "^4.0.0-beta.16", + "axios": "^1.5.0", + "axios-retry": "^3.7.0", + "dayjs": "^1.11.9", + "pinia": "^2.1.6", + "qs": "^6.11.2", + "quasar": "^2.12.6", + "stylus": "^0.60.0", + "vue": "^3.3.4", + "vue-router": "^4.2.4", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.0/xlsx-0.20.0.tgz" + }, + "devDependencies": { + "@quasar/app-vite": "^1.5.0", + "@quasar/quasar-app-extension-qcalendar": "^4.0.0-beta.16", + "@quasar/vite-plugin": "^1.4.1", + "autoprefixer": "^10.4.15", + "eslint": "^8.48.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-vue": "^9.17.0", + "postcss": "^8.4.29", + "prettier": "^3.0.3", + "tailwindcss": "^3.3.3", + "workbox-build": "^7.0.0", + "workbox-cacheable-response": "^7.0.0", + "workbox-core": "^7.0.0", + "workbox-expiration": "^7.0.0", + "workbox-precaching": "^7.0.0", + "workbox-routing": "^7.0.0", + "workbox-strategies": "^7.0.0" + }, + "engines": { + "node": "^20 || ^19 || ^18 || ^16 || ^14.19", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", + "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.14", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.14.tgz", + "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", + "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", + "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", + "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.12", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz", + "integrity": "sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.14", + "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.22.14.tgz", + "integrity": "sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.11", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.11", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.11", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.12", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.11", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.48.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://mirrors.cloud.tencent.com/npm/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://mirrors.cloud.tencent.com/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@quasar/app-vite": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@quasar/app-vite/-/app-vite-1.5.0.tgz", + "integrity": "sha512-iopq5UFtXHXrSlPoWj3dmlpnQ79c/dc5FCspAr07V3bLbICNTOEAPzxTuxja8W/bGXGBkQp2IY7k86W3iNuOVw==", + "dev": true, + "dependencies": { + "@quasar/render-ssr-error": "^1.0.1", + "@quasar/vite-plugin": "^1.3.3", + "@rollup/pluginutils": "^4.1.2", + "@types/chrome": "^0.0.208", + "@types/compression": "^1.7.2", + "@types/cordova": "0.0.34", + "@types/express": "^4.17.13", + "@vitejs/plugin-vue": "^2.2.0", + "archiver": "^5.3.0", + "chokidar": "^3.5.3", + "ci-info": "^3.7.1", + "compression": "^1.7.4", + "cross-spawn": "^7.0.3", + "dot-prop": "6.0.1", + "elementtree": "0.1.7", + "esbuild": "0.14.51", + "express": "^4.17.3", + "fast-glob": "3.2.12", + "fs-extra": "^11.1.0", + "html-minifier": "^4.0.0", + "inquirer": "^8.2.1", + "isbinaryfile": "^5.0.0", + "kolorist": "^1.5.1", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "open": "^8.4.0", + "register-service-worker": "^1.7.2", + "rollup-plugin-visualizer": "^5.5.4", + "sass": "1.32.12", + "semver": "^7.3.5", + "serialize-javascript": "^6.0.0", + "table": "^6.8.0", + "vite": "^2.9.13", + "webpack-merge": "^5.8.0" + }, + "bin": { + "quasar": "bin/quasar" + }, + "engines": { + "node": "^24 || ^22 || ^20 || ^18 || ^16 || ^14.19", + "npm": ">= 6.14.12", + "yarn": ">= 1.17.3" + }, + "peerDependencies": { + "electron-builder": ">= 22", + "electron-packager": ">= 15", + "eslint": "^8.11.0", + "pinia": "^2.0.0", + "quasar": "^2.8.0", + "vue": "^3.2.29", + "vue-router": "^4.0.12", + "vuex": "^4.0.0", + "workbox-build": "^6.5.0" + }, + "peerDependenciesMeta": { + "electron-builder": { + "optional": true + }, + "electron-packager": { + "optional": true + }, + "eslint": { + "optional": true + }, + "pinia": { + "optional": true + }, + "vuex": { + "optional": true + }, + "workbox-build": { + "optional": true + } + } + }, + "node_modules/@quasar/extras": { + "version": "1.16.6", + "resolved": "https://registry.npmmirror.com/@quasar/extras/-/extras-1.16.6.tgz", + "integrity": "sha512-yHvp2Z73LuS29fhjE+dSzUvEKGCuTTy+WGIsAYxbnhBVW2rTYlYmFQfGdOPdzNreHZh+G/1D56n0Q6ClZxJHKg==" + }, + "node_modules/@quasar/quasar-app-extension-qcalendar": { + "version": "4.0.0-beta.16", + "resolved": "https://registry.npmmirror.com/@quasar/quasar-app-extension-qcalendar/-/quasar-app-extension-qcalendar-4.0.0-beta.16.tgz", + "integrity": "sha512-Rj3KKjPFrE13cswlZAPcqdqi1YH9CeHMpWIw8xsNqdLhCoaRhMGbRas9fvHFLJOXpnsDaVwWINNgN/bBUyn99w==", + "dev": true, + "dependencies": { + "@quasar/quasar-ui-qcalendar": "^4.0.0-beta.16" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 5.6.0", + "yarn": ">= 1.6.0" + } + }, + "node_modules/@quasar/quasar-ui-qcalendar": { + "version": "4.0.0-beta.16", + "resolved": "https://mirrors.cloud.tencent.com/npm/@quasar/quasar-ui-qcalendar/-/quasar-ui-qcalendar-4.0.0-beta.16.tgz", + "integrity": "sha512-KVbFJD1HQp91tiklv+6XsG7bq8FKK6mhhnoVzmjgoyhUAEb9csfbDPbpegy1/FzXy3o0wITe6mmRZ8nbaiMEZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/hawkeye64" + } + }, + "node_modules/@quasar/render-ssr-error": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/@quasar/render-ssr-error/-/render-ssr-error-1.0.2.tgz", + "integrity": "sha512-Y0wyqYHVxc1IOBH6pRiKMSWDqO1mwQu11Zo8rw4cBdclPOQqFb7f65UuRbk5LfbqlXV2hYvklNcy0SBAOiAQnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "stack-trace": "^1.0.0-pre2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@quasar/vite-plugin": { + "version": "1.4.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/@quasar/vite-plugin/-/vite-plugin-1.4.1.tgz", + "integrity": "sha512-lLw7j1A7viLQ6++p29NuYUdfjpaWctRi6tRhMYm8VPumXs8enGeV59JEJ+1tJR2FcQUMYsGOoyHHcQrsakXIkA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + }, + "peerDependencies": { + "@vitejs/plugin-vue": "^2.0.0 || ^3.0.0 || ^4.0.0", + "quasar": "^2.8.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-babel/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chrome": { + "version": "0.0.208", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/chrome/-/chrome-0.0.208.tgz", + "integrity": "sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/@types/compression": { + "version": "1.7.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/compression/-/compression-1.7.2.tgz", + "integrity": "sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/filesystem": { + "version": "0.0.32", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/filesystem/-/filesystem-0.0.32.tgz", + "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.29", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/filewriter/-/filewriter-0.0.29.tgz", + "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/har-format": { + "version": "1.2.11", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/har-format/-/har-format-1.2.11.tgz", + "integrity": "sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.4.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/node/-/node-20.4.5.tgz", + "integrity": "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "2.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz", + "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "vite": "^2.5.10", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "license": "MIT", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true, + "license": "MIT" + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-retry": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/axios-retry/-/axios-retry-3.7.0.tgz", + "integrity": "sha512-ZTnCkJbRtfScvwiRnoVskFAfvU0UG3xNcsjwTR0mawSbIJoothxn67gKsMaNAFHRXJ1RmuLhmZBzvyXi3+9WyQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "is-retry-allowed": "^2.2.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://mirrors.cloud.tencent.com/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://mirrors.cloud.tencent.com/npm/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://mirrors.cloud.tencent.com/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001525", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", + "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://mirrors.cloud.tencent.com/npm/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.32.1", + "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.32.1.tgz", + "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.10" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://mirrors.cloud.tencent.com/npm/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.480", + "resolved": "https://mirrors.cloud.tencent.com/npm/electron-to-chromium/-/electron-to-chromium-1.4.480.tgz", + "integrity": "sha512-IXTgg+bITkQv/FLP9FjX6f9KFCs5hQWeh5uNSKxB9mqYj/JXhHDbu+ekS43LVvbkL3eW6/oZy4+r9Om6lan1Uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.14.51", + "resolved": "https://mirrors.cloud.tencent.com/npm/esbuild/-/esbuild-0.14.51.tgz", + "integrity": "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.51", + "esbuild-android-arm64": "0.14.51", + "esbuild-darwin-64": "0.14.51", + "esbuild-darwin-arm64": "0.14.51", + "esbuild-freebsd-64": "0.14.51", + "esbuild-freebsd-arm64": "0.14.51", + "esbuild-linux-32": "0.14.51", + "esbuild-linux-64": "0.14.51", + "esbuild-linux-arm": "0.14.51", + "esbuild-linux-arm64": "0.14.51", + "esbuild-linux-mips64le": "0.14.51", + "esbuild-linux-ppc64le": "0.14.51", + "esbuild-linux-riscv64": "0.14.51", + "esbuild-linux-s390x": "0.14.51", + "esbuild-netbsd-64": "0.14.51", + "esbuild-openbsd-64": "0.14.51", + "esbuild-sunos-64": "0.14.51", + "esbuild-windows-32": "0.14.51", + "esbuild-windows-64": "0.14.51", + "esbuild-windows-arm64": "0.14.51" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.51", + "resolved": "https://mirrors.cloud.tencent.com/npm/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz", + "integrity": "sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.48.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.17.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", + "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.3.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://mirrors.cloud.tencent.com/npm/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://mirrors.cloud.tencent.com/npm/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://mirrors.cloud.tencent.com/npm/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://mirrors.cloud.tencent.com/npm/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://mirrors.cloud.tencent.com/npm/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://mirrors.cloud.tencent.com/npm/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quasar": { + "version": "2.12.6", + "resolved": "https://registry.npmmirror.com/quasar/-/quasar-2.12.6.tgz", + "integrity": "sha512-C4rDMzRu+onIP+4f8WrXUJYqMZ7KsZZewU5zjxCPHQqDVKAWNbfqePN/4ME42PZ3u5C26J9eLLW32rc/vEXXfg==", + "engines": { + "node": ">= 10.18.1", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/register-service-worker": { + "version": "1.7.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/register-service-worker/-/register-service-worker-1.7.2.tgz", + "integrity": "sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.12.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.77.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/rollup/-/rollup-2.77.3.tgz", + "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.9.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.2.tgz", + "integrity": "sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "2.x || 3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.32.12", + "resolved": "https://mirrors.cloud.tencent.com/npm/sass/-/sass-1.32.12.tgz", + "integrity": "sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/sax/-/sax-1.1.4.tgz", + "integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=", + "dev": true, + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://mirrors.cloud.tencent.com/npm/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://mirrors.cloud.tencent.com/npm/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", + "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus": { + "version": "0.60.0", + "resolved": "https://registry.npmmirror.com/stylus/-/stylus-0.60.0.tgz", + "integrity": "sha512-j2pBgEwzCu05yCuY4cmyp0FtPQQFBBAGB7TY7QaNl7eztiHwkxzwvIp5vjZJND/a1JNOka+ZW9ewVPFZpI3pcA==", + "dependencies": { + "@adobe/css-tools": "~4.2.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/stylus/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.19.3", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.19.3.tgz", + "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://mirrors.cloud.tencent.com/npm/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://mirrors.cloud.tencent.com/npm/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://mirrors.cloud.tencent.com/npm/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://mirrors.cloud.tencent.com/npm/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "2.9.16", + "resolved": "https://mirrors.cloud.tencent.com/npm/vite/-/vite-2.9.16.tgz", + "integrity": "sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": ">=2.59.0 <2.78.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://mirrors.cloud.tencent.com/npm/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/vite/node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://mirrors.cloud.tencent.com/npm/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.3.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "4.2.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-background-sync": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz", + "integrity": "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==", + "dev": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz", + "integrity": "sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-build": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-build/-/workbox-build-7.0.0.tgz", + "integrity": "sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==", + "dev": true, + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.0.0", + "workbox-broadcast-update": "7.0.0", + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-google-analytics": "7.0.0", + "workbox-navigation-preload": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-range-requests": "7.0.0", + "workbox-recipes": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0", + "workbox-streams": "7.0.0", + "workbox-sw": "7.0.0", + "workbox-window": "7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", + "integrity": "sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-core": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-core/-/workbox-core-7.0.0.tgz", + "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==", + "dev": true + }, + "node_modules/workbox-expiration": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-7.0.0.tgz", + "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", + "dev": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz", + "integrity": "sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==", + "dev": true, + "dependencies": { + "workbox-background-sync": "7.0.0", + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", + "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-7.0.0.tgz", + "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz", + "integrity": "sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-recipes/-/workbox-recipes-7.0.0.tgz", + "integrity": "sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==", + "dev": true, + "dependencies": { + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-7.0.0.tgz", + "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-7.0.0.tgz", + "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-7.0.0.tgz", + "integrity": "sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-7.0.0.tgz", + "integrity": "sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==", + "dev": true + }, + "node_modules/workbox-window": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/workbox-window/-/workbox-window-7.0.0.tgz", + "integrity": "sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==", + "dev": true, + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "license": "ISC" + }, + "node_modules/xlsx": { + "version": "0.20.0", + "resolved": "https://cdn.sheetjs.com/xlsx-0.20.0/xlsx-0.20.0.tgz", + "integrity": "sha512-adg5edVTkXXGTnb0iWrc3Z47ViGgwmD47yx6VfSCZhfdKPtHcElYGs48OtcO4nwOu90Pjz5mmyl0HLcvbSRYTQ==", + "license": "Apache-2.0", + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..8179259 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,53 @@ +{ + "name": "radical-dreamers-fe", + "version": "0.0.1-beta", + "description": "一个普普通通的选课", + "productName": "RadicalDreamers", + "author": "lensfrex ", + "private": true, + "scripts": { + "lint": "eslint --ext .js,.vue ./", + "format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore", + "test": "echo \"No test specified\" && exit 0", + "dev": "quasar dev", + "build": "quasar build" + }, + "dependencies": { + "@quasar/extras": "^1.16.6", + "@quasar/quasar-ui-qcalendar": "^4.0.0-beta.16", + "axios": "^1.5.0", + "axios-retry": "^3.7.0", + "dayjs": "^1.11.9", + "pinia": "^2.1.6", + "qs": "^6.11.2", + "quasar": "^2.12.6", + "stylus": "^0.60.0", + "vue": "^3.3.4", + "vue-router": "^4.2.4", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.0/xlsx-0.20.0.tgz" + }, + "devDependencies": { + "@quasar/app-vite": "^1.5.0", + "@quasar/quasar-app-extension-qcalendar": "^4.0.0-beta.16", + "@quasar/vite-plugin": "^1.4.1", + "autoprefixer": "^10.4.15", + "eslint": "^8.48.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-vue": "^9.17.0", + "postcss": "^8.4.29", + "prettier": "^3.0.3", + "tailwindcss": "^3.3.3", + "workbox-build": "^7.0.0", + "workbox-cacheable-response": "^7.0.0", + "workbox-core": "^7.0.0", + "workbox-expiration": "^7.0.0", + "workbox-precaching": "^7.0.0", + "workbox-routing": "^7.0.0", + "workbox-strategies": "^7.0.0" + }, + "engines": { + "node": "^20 || ^19 || ^18 || ^16 || ^14.19", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } +} diff --git a/frontend/postcss.config.cjs b/frontend/postcss.config.cjs new file mode 100644 index 0000000..7e6e8ea --- /dev/null +++ b/frontend/postcss.config.cjs @@ -0,0 +1,28 @@ +/* eslint-disable */ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + plugins: [ + // https://github.com/postcss/autoprefixer + require('autoprefixer')({ + overrideBrowserslist: [ + 'last 4 Chrome versions', + 'last 4 Firefox versions', + 'last 4 Edge versions', + 'last 4 Safari versions', + 'last 4 Android versions', + 'last 4 ChromeAndroid versions', + 'last 4 FirefoxAndroid versions', + 'last 4 iOS versions' + ] + }), + require('tailwindcss') + + // https://github.com/elchininet/postcss-rtlcss + // If you want to support RTL css, then + // 1. yarn/npm install postcss-rtlcss + // 2. optionally set quasar.config.js > framework > lang to an RTL language + // 3. uncomment the following line: + // require('postcss-rtlcss') + ] +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ad0af3d0369d0eef33b346d905b964a7ae6d0a13 GIT binary patch literal 270398 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 XHGfj`j|F^jZ$SEZ{(nhP&Jq6)8bwz* literal 0 HcmV?d00001 diff --git a/frontend/public/icons/apple-icon-120x120.png b/frontend/public/icons/apple-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..245e05e7f497d4214faa886f50ea22f0862b2aa5 GIT binary patch literal 4762 zcmV;L5@qd)P)Px{R7pfZRCr$PT?uqlMY{gFvo9o_l`J${2nm}o2pE>2j<|s^s0fY%A`FaYW}X{} z!#o`q<_Smf5N75HZ{Bkl6=eiO2Or|X4D#4P6l4o~NRt3r$exgN()XReZddi~PIuBx zx-XsP);XM9YWb_`|LXheujSs>K??z`0bM}%PU{>rfCGFGXaH*f2e<|Tyn7mhHGl(L z0|DMWjlmkg0j_}n@1DkB4d4LRK!A5oW3UErfNLPYyQeW&1317n5a8X@7_0#t;2H?< z?r99x01j{s1bFu}25SHZxCR2edm4i^fCF3uo_A03pvXV~$2`dI^{g6$-Balfo^5(+ z+8F+9Oo(?`+EjiOTgpnmFE^X(6`69~tIm75G=SaHrC{xEd-WD2`lhD1EPd+IW&BUk zMU*u)Df6hVZ`CVwPoI91ivimnr~{4NMT1lREuB4YUAPDLFP)6obOT-=x0J;#J%5h= zsH$^SEAt!J+;2$W0KA}A9P7-o^A#S0&dVzGc0F?3*Sl&tnNI#XYLs1tVId*NOi6Xx z2+rWXRjJq5%*Oxr&{t!Qs7% z7_j@NJ<23*+`k_$%$v)e&mKD5suulywTOyOL{vfoF8`^BrBj?`XCzRo$G|s!%HqgW zTg|j;rn(hdHGmlwfeWy5cz!%OOL&jONN&Q{j?PNc14YU>$6-xnPn1=lw#j^5X5V{c z^jMOlWG*kwJ?5WHoQSfD3anng0lD*%SaQ;#UZRqtrb6~iUUbi-M1%$hgUV2dn3{md zjCnk-$5WxlJ!#LQ(*WKtbQ+KVyJ9mU!qNP|eIogX6@P(Fr(5yXxvS4!&nWZ5GIriG zflG{}@X&}6sBUP$)+0wmvnehvB?a**T}9kKKK~pArDbSpZnhgFvv=?I9|pTpJU7wG z^ec7sD6Fb&(;T~U(EJr(?mg2wmmDn$1U7+2;LZ5mlPvCoH&)w$&Hr=y@+CBy%_5Bk z3AY4%z$`s~&ZnmOx`b;02N=M_yy0odY$Q(Gb+Xls$BAjW-E8S#tj;Tn1~3G#vL$ddW08@h;*2l%m&R58rt`6bDycfmN zDrnmd=*r6BjIFLbbZ0VO=pCOYNzyYa?T$&xxtH2Q^Di-%Lgnsvas2EB{N$luqUgj4 z7Wa>be~Or}5X6Ls;@(w%7G3zyrx&B7@RD7ZZumyW^_WNkODAE))ZHiTyyy?}ULSXsIqo*FSuvY=PUP@~qj;b9<#S4d4I=n8uFdUNpt&AmvWo zbxQ0-E6sBABa_9DbH;FIyJX7phpv>t++q#LPRGkIkJWgq5EtwfC+A?Gi^rz3- ziq+M#|I@mff~mT01uT|N-zuowPJ@VN{IR$cjTRfgZx>Xq@P0c>v^2!Nes{O^)RbPW%|f~+*L)Zt84=D&Qg6m#C$ zf`Za2%nE4`Nu8F#?P-mtJ6kjJG$q(Sh7DrTL)R=u{^dGcxOxqLt&p7>YalP)Cr%b; zFb6}qwxziA$Ve<6GDMhdSAD0oGOd|;xG8RQXaEP`l^wo@rrj{doiJB`b2gg?O%V+E zzbW^N=f787MZIDUc3@FQR|kA8&*ccStuV2o%DC^oz_g-0m{z<8`<7RV_~ix1aHYv+ zp4&UUbJq%blCPtRaI3C`#>6zr7!)QInOiK(tn!T#+Slen=!{tijF5dZDL4X_0okzh z?t#O#@^)!vMh14x|1}ybD@69Yth-MXF?auNXQtcf#*B*&@HTNdY0*JJtZh&CpsUVu z7&Ti*+djvA*jdZ29&tEbi0i_rRExjIiKfOxeDP7g0su%08)DVSA@ZuGmbT zHhJBAUhda73w!5IM^i<)=*xrw@|;cK;ho!@;nvZ&HA|w=de*N*y0k8|UxQb>9ogJ4b((mn`z@Eu`o3keXA-0Wt zrTJD0ba2e<>iT$emeaZw(}>u1J-2=m%iH^rP3RdNi`ApF7Z7NR6si=26S6_o6g_J=B^*c7Fz#H&w7m3HF%h ze~z#&k#=UA7YI4B0hZ=wZ2OP*M0d%AS65Zxa&a*hmCLs?h`}wRb0DSJzoEc))~4+` z$?_2cOA3Er&l47%Kx0!A&J|ujzdo5P?w#I4MLmD3ly|%+bW2EPcd}mjd}CWE`4j`6 z3h&t1b6Q$}{b+1FBK3Na>8@AiK33uF9y;$Ff`9BokwTTajycM-IsHm&KxzbV=H*VlyoVaMhHFFa_J1SqbJ^sXR z(EmMg+N6r^RjI^_Kx+VdsLaj=u(Er!Y!OQ=rTHc{Lmve50Nc?W6}+H$yX4?y5OA=C$y6$sU51D!jWU{%r-geJ4<~Wf9#lz%*gHhkqga(D2gs5m# zHq@iVV!@8{vNNVJ*t5||S`+V&JYh(P2-OEM31fdZ1ClNX&HaA{eQ2nVTC!ssPOZ$t zJsI-c`OTSp{HwYerlv-;NV0KQ+_f80*L)%ad}tl}D}AyFbM~EP&tHz4g2K8Q%-g?J z$eoxy01Z}v_13M)=+G!s)Ymb94;IVw^6sf~F?7u;zVl%_$?&Y-9_8-L40i0O^vRez zSsXEwhp`*Bv{DFPQa!nB7OJ+ML8GZklu3F+ynO@1OAA<8a>|rTDk-K5TJF6|$W7jv zDXd=bw^l+4blO~@z|A&2b722mY`gosc(!a*?s$18cCGq7vU{Y7^I)rBRY|34WgWxL ztEMiBcdy>usFT09$^jg?G0(mx9soX zizfWAH(#_YDmWO!;}h|2k^G{WE-48y;o*o4k3emsd@XkC>63VQ)?}n68W3)fw_9hw zv`hoobA07jJ&CoaX4)@{DE{D*5ryALlSG_S zkP__vv+h8A|8C#_Qreg|rwg#@;rae?Fi0jASE(~H$BE1@zf5=d(WkKT=yzCk^gFxu zZoGdgGGgPg>%ajP|EsgiQ3`mnxjED#d5@y-TUU36MA;{SvW@eq( z`hHCXPBb;*){CbV@OM~zBD;!lcSU#!*rYg&O)%iGB`aB6T$dOmjU0mDs7M_DRBUUiu5Z;V^fth2iwZnp2YKA@@p)TO z*0EW3mVlV-?3PH$Ciz19-yJ| zf#@Y3XaFk}sT>pa(w9hV^(9qK2&NL$ig#zHV z`YnBwIg;V>*y%m3KvDudZ_TSLoj_ao_yc%x`U7?c3(IHqgfSruV{eyFxsoTXvKus3 z;XcK{r@}oWXPdb-fUi@TodIB1AK-TP-6T&LOsZsMIFoz#w7njh^UYeJY9*VU=|8Ws z3|CrgM~RN+nzP@R=2`>TIWshXuhU}O$YM%M(B>Shbgmp5+<5p)_EI;!+^uk!+U(a? z{p2}V8SXtHzkN|t`8v87e$SJztb;hpAM3iR0|nsX_Pe(H4s zm+tq_S7ey^H3WySvJ|314MOZAk0qgFPh)SAiqGj==)vl?}|IeWBkT7 z{HJ%6gT^ae)=V@&Cq@&wBSg**pMxD(>x^ZL^)u6KKgw};hWwR0V(7NKiRf!I*zI@` zW0k?mUZ3IMGr?XNe!dsdYK=|KkAvgWmic7m$pm*xNM!%GxeaMtkLI5|59zpxrSrf| zv!ZK0#lWY+eUDFvYtR7hunPTCfMA|u^N3-zHl^Uf`c!(bdj=lrk%64PvWd1bng6t% zv)wpV$fZgpeuObyV4nP7_Y8JQK!7B6i9xvH{iQ#CzYp1u$#d$GrQ77w1c1Go-$r=l zw#2S?q(w&G@#ftVST>Tg>1_Tx7pkk|AG>HB+LP%OwcTt0vl|`CIWa4}8{!o22k$+V z&m1Ic@I*iKorYJHPSp5~YjC>aDv9z$j#q%ao(_1m;u|1L8k3xcUuF#yW>nb*#agtZ zfZQ;1>`bROY-DKwtD}LN0bt=!?JOzAf1MP25{?=UNL>U>rzUha+95|TpM7b%NFcJ^ zru4{YWXHzg?lk%RB?`YixEllG;t(GmhAtr?KK~)-&4nhf?^LyC2LcITySYyRu+RaY zgLwowQ^S%H(N*!o8SN>oBk7w9O{(i#^$Oip(1h+rS2sD@6|uQcevgPk(I+$5UuPHO zC|*r~+ikcagSQ5Q2C#|@z9|9j2vZ#u#+gf-|74;+ykr9H2~#kKJ%VmgQ5c*M?}?uM zGOs7>R-M7#1k@G4w2`6L=`bQQOL^8RvQOx4bF};tK@S?$9@rYd9w^fvv-$INFGTyr9IVuY2C#R>h2H_}*gXw!&jD`_RHZ~!oUFFGFuuD{{3MA(!<66I@LUU> zyo6-`Z4tZPd{JnUe?Y>GaKiz1)yA8h*`BbpEu8%pU}udERM5QzrZb&s0J~x4e4RxD z*w-2kVELVj!2yhe&$^}o>@(H+hhPn0|G>d#t>oJztQ8u-K2xoK2-X1h4;*~f3JqYNsn$OPYXJKP4nAvz o2C&am>mPzOfc*mppS9xu0dofk@hf&sy8r+H07*qoM6N<$f^#51DF6Tf literal 0 HcmV?d00001 diff --git a/frontend/public/icons/apple-icon-152x152.png b/frontend/public/icons/apple-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae35a82333f7c555df5460dfbadb2f5b0cc6632 GIT binary patch literal 5765 zcmchb_d6SI)bN8CvBj)C5~^0z96000ySEj8nNo%jERgy{Zd>f_|PS9t!$ znks<03D!LTfI$(VrfeFFJhTA?o2s`ew8`zo#X(jO!^MC_RVHc&P&5f;UlNTu6FxaP z>DO5tJlw6{(MN5F(2{j%N1k4T?U@73Q<~{~saN@Ui;QSCd=Lmk%?Yw3v6O|cecac+ zWN7R37Lf|4)epD*GTPm?Z@SWRs}Q(9=SSEZMN*X%Rr210E{y~LCP$P!!q!= zc?Y|(KdGueynrVVoHh)5B?o5+*ataj9v zAh;)BSp`|@s^RNW!Cg=m7bFl56gY6_<`m?wJ4*_V57%SF2%=oD`%P3@O^m zJ@S{Z5G2&q&sro`M7HY+!{;+=j4_>kpvLEV?_e)l-5HbL7F-E{-(IdqdAN40rvZ4y zfQgzaK59U5b8*%AO1mLINoRL)zvtQ+#P`lTQrk{w$*#$U3q1aTTs1}}*8gyrd}Jy# zNWEN*ta0by%RtYkg&Eqw+~Cg~ue5c}ns@b+|Ajo5*q0diEn<0jyPje=Dte05w1Zn`_aiJdk*dmD}Xy~1TLg(FoxD_8|AvTIpR*A0ft`aDCyhlC6&X(F7 z9F-lkNb>CLIOTb*Vg_?rB(=mJ)YEhPX#ME!3j6XAjS_C;0BwVxK28qlYlKwRxWCh$ za{!Fx(wVoh5czG%u%JV&G�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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/apple-icon-167x167.png b/frontend/public/icons/apple-icon-167x167.png new file mode 100644 index 0000000000000000000000000000000000000000..8051acf6ec17a619aba12e7be05b42cdea5d9606 GIT binary patch literal 6644 zcmdUU$$|j@n5wnZUKj>g9asj2(5at=i4Si*7>=|D5_sd0;%(6ow9t8}+f2Wa z?O*k7-Kai9(V9N=|7{nQZ$G|#x)W5;%*H=k!S2ubjiY)fl!U~a=gCt78t>#>d&jfM z)7F7QFzVIo($x1U#&?FV{ilD-)^wh6@OX57fOV}D$8B~TlV)f-{_AkL-8&CrNI~iMoWF^K z$J}(~DAY56sN+m|P(XQ&pkS?zs80&N#6XAae93tvE1G2YZ9;O#%ceVBo35rB89+nH zX=UbrLH=xQ=YJFU({iwPk=&Hr!~+kU!FH!)FvtYE7*t5RPHf$NI}HO|Q0JXV2h?g- z-JQDhnamyMg1GORG?M&u-r3Zs)g(Yi164~Xk6H0v;eU77R|8><{j zFLB$D6-m{raL_M6s zw{C`^Lu`Nj_{P%7D~SH(%Y?*m=>W^DQrr|-fn}h1=i9PplB>79won;Dhj)A1Lj*_KEKv8?Dg>fsYP>@vII{fKqa;sm5R2+r`Xy(nWGu{ zu;Pah6tKn(hOkXduybs|K9%(&}Dvh2nagH9hoWQ+s`_E1+BJZ zJP*duOi8cV?rYpgOMxh~z>cUODkcHfbA+IIL22oy<>#gWFV5nd>dFfMQgDUE zPDvivBttvSFrypu(qeQ5Zl-uMAr`_?;b2kjC^%+-;?ZO*t0jjoT_7nB%oAB)Wcnvw zx`UEye|dI_UdlsR{K7gRXHpgjZO>z`XI+DsezizdH~ZpOZPi1=GmjWXA2n3JdNx=> z0M=brS)0=FQOu*0d{yA@Ne}u`#paTa{y~(WJpxw&C_+J9)hHpkbuq!1Yvh@oKsae?u zs+(f$P?Cg%t$bD6v8ztp7d*y*vibfBhS8-Dz)WsB=jE*TO|JViob5j{jwd@lykFP{ zr^Zy}JVW?@M9Jq?QAJ08G~aN0MRYw`MTAshC@j2r0;)dxe&N)*^?iG~_4Lv&k&mNIgTH!)6hvnk@ zF_j4BSvoIU5^E&-&kr|AKrB{|Sh@siUQADKY7<9`eR%o%cTaC;a}Yw3+q(0*083`! zqUM$UUqBqXC&JS)u&2&W0JVJ0%M!Hd;I}MJCK#M*6|6pxH;IXKXi_Q|@oqEkoZ<)o zmeKPD3aGBR@s5_4xE9+Xvlm}~cfp(+DU1)g`TZOEOAE&(=QpTA-pk{- z#mn5nQIuEKJv`8DPqo3S>eR5&;|iTjlNIO%fAjGvvmYxz^Cn1RX(h7lm{Pbd_#evC zNO2#YcSHcbk+^TXF!#qrwIANEK6xN=O6!sHXM53bn3(X5*W;TyYXy6WQ^>d*< z?u1!CV&{Epcdsz&8p28g(T|)xH|G7% zuMvspg#M%^bE)|rUT;6?`nQuyo+i9#tZxWXA(xL}J9&#IE$ur*nk@bHSw5{yu4a5U zhET1lRCf7a-R;6kD12MlRD%4qJip}kUzG;AdAw~D*C)%`3uBpgZnV&#itEyMk=C*@ zF^@KhPH>Px)osuJjH=8+3hDkP_)#x;c!tm`Jw6d=CXD2nfU^~Y*RGwTqPuxBm2+Le zuUR=PJKq~4ofC+z5@r!>><>C)Z@{=i&f0A@huPdPHP5Ri#25jm)+#_bH#?;mkr|?8 z;EqdH+RW3TV)4e=xJ=B1%%?JB2!#28At~JDffE%e4Zc900XYunWn6{h%+CH9XHY?Q zA4X)^e-^p9L2vtXZ&)x%8ZlUM)}Oo^_ut=ZjQ;>7=qBSpGg<79Osm0@iWyjAOaA1Wy&s?90pJ3mKn6 zTYK>z$|TV9JL|{#{y56qo0ZI=q9_BY*GN|FRN!lJ!KLJg$)SlpHBWkN~uJs18VHJ+wVm!8phq$*+8wZ(Pzx= z6sUFPP%ABC5|8x#-OPDnlg)4Sv5+n`=N-jxf$*ZlOd^8O(OYHM7% znHOm@hs3)-eF94DtQ~2JmhGSlp>^%Kp{*5x{G;D;D|t_@toSHY#WdI6`#yx#N8O&f zYh@(NS5qZLPCdr5>^K{QS?q1*Ofj($CzQ_)k38eibrJq%o8n^dH~R-op>?L7r}u@; z_8Dy#9rNo$(6dDSf$J6k`3`^ZW9Ca;dR9?I(-$r)UqaemExSD zCz6L3hl}s#CHvBi;Yl$oxYPse3Y9EQ(nKbHv5ie4i2z-e)>@}KQV5BhSz(_x4N?J| zzNcH}^67&z;Bq{6^@=+bhS3Y(!;Gg!terM_`4q}@KkJQa)R#3MWEy|K41YfQ+4$fU zx|u|z{CT7ArY*~JsVU=#z8EjbF6)G=%De^t6m(bKk$8qVenf$W9!Xp0V-L`ZKWX4W z{up^UaD2(h>$YKPmD|L);203X zQDl$iRt%-OTF#QEhbQMH8S>6IffB1tJ}L0$6kP0d?5z+Nh?2rky2kB=fwUSD>+Z{p z5}xIhc+G>4?yyQe2v*%aC+mI_!2Ivs5P5Dve3jpiO8@hL0#An@V)<{q4n0jfFNg3< z8dgor!*OvBWk}%!$i{2=0B3WPgcQ@c^i=Lb#o1CyV_hGe#N2{rqUG#V$`Z-x%JvED zuXcWyt+BdURcu63ovR{d!_50%kA;kRg1KHZsg|vp(>cVpwRer}U8Hb%Mh%B)UvIZt zFQ+iB-u)X9*Qm3Nnzjiibi%14^zoamlmwm32aE)LmG6F`;w0LH=UI3sxY zhQU%qzog?Ck%cq*Whme=XGmK(w@?MO%wqGT+-BquLo&G|&#$pKOupT?mu9(EiNm(j zhW>{^;yV7kMxS#ngAz1&5rM6w5e+t*PG@{3Jk1{iT?I@AYbsOLnsZKH@64A`9+z z;D+xNBKUBBOtc+0fIaH8Ya2)A1uL=j$IWr8^-Bgx_2*w}+GmT={5xY29fy7vUb>CH zRcqB{&}5HA{M#z8hpX=1cEz#M57pmKU~%p>+un%=rS6iEpzLjUJy3Pl{^oOjoVp#7 zoAvDxNKCb(d%u#vLg}s+5J7u{YAZXh1#1!O$g_bP&dsnqiM;*OMJp{rUD^z!=wjY+ z7C?^&5{XXbF6WJ*-Eb`G*g>jT+7(g2A1WLv1pJcAp=M%<;rshghH}gaYntf~#OIn# zA*9t%^$m9!bDZm9DQa{eAnb!{TF~zB3UU@{%`R*sRHMChnGMZJAEE=~iVSj*)@S}Q zp${@S0ymg*g_94ff52W>2-gpGF+Nk;L&v2K7HpH{q{u(bp$<&_@*I$n6nGI=_50qmImH10VGo*|aVLNPt74)8sGU9{m^XE7nE1cm=Dfx8LkHZA zlf`1SrVsNjRk?jsH|bI2!>clJSEOgugBWtML}nHT2dCcIr>_g{Wl z#e7pLBUMpnAOESL=aXOkW8<2fxMg#v$EI97A~iwSz2}LDD7|~~wT}?ao*db<^v_5( z;{54zqq9yS(JyX2(X2~YpVJhLInRc-c=>;i+=uYRjbCIjYUge`q9j__%W$R1Hk}M8 zmJY{xC6i87EI#9mG^>hQ7*YWtLSwm!<$|ZJU#%QbG_K`mch86SPDe<uk67H2g%k$>vjr|Zv$$Y>W7 zaA~LxwD+rSM@~R?LQ)~m_05m^!tdW+Gz6~9SWCHma#|VS^oy5zP=abL-Y0<%n2G*< zwMIAK_l1T2w)2a%Yl2;ErO({D3M=xvf5sznaVKXQff4q&WA8$Dn9$+BLImhHi zMn|MLs^AU{UoCie+sUx%h%2tujF#Fw9DdTnNbRr7+e5a{Y5%k zEB}NJU#W85j3Coh^jTjsg#>odZFk6fQq$u253j(dN!)J0Pp^G84@td|Lf-Q#Xqh++ za_VDcXiaS1Pr{`5VMZPXiL)@h5lyZ;QkISnE{6Zrys~bw>N*Og*sA5;H#fnOF|Vfg z0j;cU93w8u*~3^p#Os!0_m8N+`2??pm92rp^bZ8Dn`GoEd(`5(xTNk$69CYOzff0I zTo)KvKIMFKZDC-xpdZ7z6+xVVHJUjEvcWocT;V*p1&4@jJJog zlA(s2Bc{gh?_0>V{r#j~TXp!zZTT{QRM_km`|5-&HEWhZST7Nm({6NAh?-YG)2uUbEx1frfy5E8WgaApuCj~6K3xDJ$ z(cE|eNg4dC?-}8YY~!{jcFpTkw$kt>nAJX=8jKZ{85E-Pn1b~{CMK*Z&7ysteYZsYvi)BNp{WPA%uEE9dZaXbLOvNuC%0rN$`T{DZ zfhN@HFDtLcd>h=F1%^mr^_&HxgZ_`9K@YQp?-bb`UjJU!{0K|QbqA{UJyEl$GRUam zRisKJT3XoeQN9HMxaNgtE-Ma9lO%(Ssz-R!Qo>sc6+bJHr{ zzLY0;ff@Y;9h*M7AX&=!16ggl?G+v-sZkwlBBmh#vj@jWlqCUA>Y8iS8JEN8Vo>ol zZVP17UDlYyN*f_>rwm)0{J9Q>Kl>5uo-a!Z2exvAkNWQ-c;|`M-m9pR910sG%HDm= z$KUrpS`*X~BM`b@&XQPH@?vRaZgvIlQP_K;_a^H_AESAahAI$v`8|D6mLXI+bzj>C z>#(HIa_LU-2p_=siE)h(0CmcC634FBHR9nHwfzK;b}`30fjTZZ2Y{nF3Un155!u_n zl$vwK;j=su{{|+Lf6~kuZ^%V_Z3+%UME{nqAONp!l{83PZ7E8=BPiAw<{a|^F1d-@ zT|N%j*Ogb~7GpLJ3&HaHW~W^6Qb~*SoZj>4wM)^?YCN;lO>i(8~+iJ0$W~V4QL4z+HCP1mNsU&^iW`V&(k-~5L zVBMH5iZ{H}GP%Mg^aMW8S8j7lD@<-(2gmGZqAu3~^pX>}^i0U3^C)qq7K5Y8V>*`nER5J*PU`7s(@vaxKJSf* z6*GG8!oenEla`k5kNp3v>EbtWQn>q*(^7XoO=u9%*ynfkR2Jc#+TD=wIl8YM-CQyQ z5zE=e4%9U5R22r2!dHS`gn-x5$YZ<9f$)s6*u$fire?-i7g69coGnHm>^y`GA$STh zIUHJ`I(u$ZyPsIfDtYU-JNq%kG;9I?UJ_e4>75lv{l0 zHHeV5qTEQ+U=;WH_8p>~Iy$4E$?@B4%Siy9%nGe73=bPO5G~lzX45_j&WG31y#iBE z^OaV%hr}-xJYh2P0qg$7$$fM#{B-^0Y-c&t|3b`&3mWuM5(c@u z3uz;Ca!uq3ee^uPD)?A_VRS+)A3k!CmgY#rM|7Gv%QzdbeSvKhw77`vbA9@PgeJ+! z`K{3c7w&NzKI%CgB>T6)jjl)a9;V?Fvkza%@=R&5-~1JkQ|mHvCf)mM%G`+qZPqsL zp$3!1ZU4$^8fq1u5d)(Y+0i;QWtHr7(EN~ikV=UKkTnRG(mmg~zJlp4FKN?kb4gAK za|mI2F4a`xcWyd+{EYxCXmDIZ0h?69mCtamxiD1NoZ*@aJ|;3u35ng^C)9vQ>Mpl5 zYE6SL{FpVcB=H4uyan%6P~vb6?xz*3-hbwedW-!|(*ZDubs&u-E0^-xlzx_)w)Oq* r;WV8`e^MWK52PrqV(kCUkR$8DC{_#VnD*TJHx58c9jsQZViW#9un*30 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/apple-icon-180x180.png b/frontend/public/icons/apple-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..92e9000aac05b2266a00403654dc6ea856cebb3d GIT binary patch literal 7179 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/apple-icon-384x384.png b/frontend/public/icons/apple-icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..172372386fcb3f49b1f929f44d9104997ad78e30 GIT binary patch literal 15561 zcmeIZWmJ?=`!{;eFyc^3NK1EvQj$X`0@5JeAl*nv4J{y@l7e)1m$ZN&CEZAu(*54} zJZGKv!-a3QY!HXL@Z&cw2W0o@ndCB-#U>Aj`(Smvq0LuGegUPY{}V8 zD(34n5BVJV`NsDAV6K;XbHa4G=jj{{)snGwC!V&Gf=isS)j0?P$pfrbE{Zo9o9y`y^uguO{==#j^L(*qjmb;YcN6&7YVH8Xg}v;5`vgSuxX(}ia>=frcYnJ5d$3O ze2GNhT{xh!zsQyZpi#K&ME=MUaDw$7`4!e9sDWsPfg~li!V*38Wi5IP>H3fg*VpYB z+(LFXrAjrPZ3?olw-sDN%^Xj%GF-`(ZTxHqs^pBHV1O&I285R)+CiH`Ld^5CUIEZA zJ!o$!qu8L>Nb6`o5nke^s(&;tBD)g`0l;bTa7oe!tLKf^Qm1Rk)l`3NUG`;7q# z4o~;wCBohP2O3>Y4KrIynRjj|vHRTqSD!!K2PdPc7CbU1EJH=~c7efFHdi}_0`(1H zO>Z@{#bsNoWz3HjhHrH0YcuQeayXtCWzwt+2v8gOFcMP(kUne;ZVV_Ye3z1%J$<-8 zR7OivvtWGOk9aJ8*W?u>BQiN}Sg}xaZ&d5=+YA2LUvgyQjUhg(dCjeULk+*7nLkoQ zox|+ITiCi5NJjBbPsd#2P#@4pfLzGohFN^nFFG$1pp zLARx@=8@6ScWhx*8Gq2j-KnZenN9p+;$ae;*H%-O(VGt{E9NTel^cAU({~D_F9^OQ zT})mn9A-TmliT2h%PoA!tVjDK4B-D=p9R0kDy5LXBa1{kN~htZ-9TQ5r#Ma9f}cG! zcVuXG1{J4w?)oH%AW{y2jf~{s#=d&4HPypDyTnt~2U{vFz-?sd!+2dKD6SB9imqGM zbgi^Z0&9QsxS;L)|gQ6zz=aHj+j6ZBLHO$_N^3g zFm7y>QCAxffUX(VUR;wsE^h=$(*Ly<@nPz_WNBA(scf890J;C4hbGOFFnR&yFPaiBX5 zrl+SX$C4+vntbdgq^k6m-We}>h0pLaL~wpU{(_!u*T7!s4d>Bi_iT={DY3iEMQrL!LDslVovCwQpK3olS)MT_&1Ygo${E_0ZnK$4s_8~?IS&tP^nWy}XrCY?S zK22CZ(47$)XDNeDTDzmpI+YnMTmR>HPyQ8k^;a{*Cc8Rs`^5a?0ajdWJ>~QH>5ZSw ze;sXKHwg-c+;k^e#K${#cV}P+wchB&>Ur8(n_p%N$g907cY;Aq zM}5l^^jg+30>9t6U%8NcPJM$O*fKGu(b-1a#q709LxHn>yS==qvPjt$EpXNHl6#}2 zJGI2MUm@OOJNEPk<|)~WH{Uqh&{$>BGy3^a%+#ZrKKWE_iuxQA-E5>qZuJJp8PIVQ z5Q_n{sg!_a*u%Fnpxp_)d6wx1FqY7bg;N69z!)Ju$r>C1?x(he?tWmFeMpFy2;9HH zYz`*4+bI`^_3!Qf`OEK5XziC{$(GbyZOYGf6locQY!2PD=Ga$aB&7&h^GDW))@MFh zkUXGKf*h7!krQEB~?lM?rVz~dv2K)ny(!?>{_il^{3;Dck-Qh*J%3s zzA2u8*CqNZ9NF@#Su2)`w(}VCRMQ-z1>ei*iM6voR4l&^ zW~3hP&E-+x@%qZ?bQ9wtReR2VhOWjLo%Is1WlyaH%E;MWj3_)1oKATu6aEbj8)Tp? zz8Iby&a&_pom6=*jkbl?QqHkdt0!U&Epi_D&Vcb%)vGGMxI9Y4xdTo7=3*d$`G@DQ zw%v%f$C+boNDq@$RLewmq~>vN#3Li0Mkqw_@5f{u7$O|67}0JGI(GgnY@jMJQOg4x z;E^wfLaM;HKnc7nD~Ox*2eLn5;v?FhfcOlKWWr!dd$mgi?2ea}T$TCVEgdhmCpmpoT(A$n zow=xPt{VmZdRz!~-rRVNPfiZk5Pu3NsL>YsUAF!Gv_RT&@;Cn>?g_7l=h^0LeNGAf zSv2z$zo0f8xm~Y<#zAEj+kI}9Npl`w<~6&^v0M|5-*3nnWsI1(ayMgux4R~?eZ8c< z4bPaVbS#|s4L4Y(o?0($Wlj3#Q&2TL{f=w)Q#c1hdhMr#bQfG#n|#-g0w?53<_iq=#Oe{Bqz=X6c~nZL`a$_zdHN`7lY@#~wZ zns?#p-#T|clb!z9xHOFfHF@Vojdv^qT$EKisYzc*7d=%@qjMHb`^&9u&6&92NUa!R zIP%9q@_5igh~m-%h$1o$f(J*!nA3r0<)f*yv@pcCGi>0&Yhq4cP$tjHi+`Ft1;J5= zBNAXl^dr&kowBcKAUze}d|aNy+QE1V>^k{qFasgEEiSe>%KYa2?XNabL>q7EN5^9( zJt!6^--vx^)Oe;O_cg7q1`FNpI^XuKYea;~_R1C)tCQwdEcU3&r1;}oTFj929iB-L$Fas) zt%nUiNu-z8>U>S1KWmoX`K}dYv_+pj-CZg5G2YW^G~CnL*Q!3iKDj#<$n=(z@V759 zxRB~oQ%)bZ%KRp>eePe+)w0cy68p;(RY|VNjPq%$y4hfaAcJnN3|ad}YbxOLq5tk) zvU8`bkbUoDU|qZrX$IZoN3CYOstt?ZzC6=YCH-XvynJD^Rd0YtH@B}0Em=yNHL;O) zdOpHnNWk3@m5e>}(#;nwsZgpX&~>D@2=t60As*X&EgEin9e$`Z?_;g{{##uLJVZ~` zg18)X!T=Vuy%P+XY~*m{BRm+wVqU`t26+v6{vVX;-una;DrdQMaRC(a+V{VszQ7U# zCCWhe4D$sGP$_w2TNh@;Rio02D=Nv}fT-V|KYu#%6Ye_y+p*-=$GDhDFaW9ktuLyJ z1hvkPv~zwnR_5f2!EeVey4)M(=AT>tXlHO^A;+UN&bF>&ACi~j(ZdiJzExnq7U=t( zsq}{=3b!C(6)t=yJX-;{^Xdrcc)dO`p^QkhZgF)ExODb-BfQKwKhH%wu0D@azg)<& z8N^byG-+*~YQ8uip7IhOzoSNDPl%dA*2#VsH|6QqiV`3EPnNB2!S;K?rlzWEr}mRq z9hroupCWfAaR)+t6ES1Hsb34(JwWjKoW6_N*5<3cOtkiv4N+%q2%{kk%c9l==f}19G?sf zZ6v#Rc&Vyt+c8&Y(7wSF_9VjiC3f;c9sQ=y5p#)0QDvUWW)O{UNtFH(8bJ-XI%|DI`f#Q`(!O4Tm|!(vDMH)B^8u*WGPf8)K5b)4*{4D*WzmJHwEc ze1?$63o~s+jn`ob@R9y_>E0}^&@F|+hyK<2mG6d|Lemab270Y_@|6kENj-r6b1YH; z830q|LsQoF!P3@gr=%DQ3(wpqRy*Hft|CWFqV(6^s;UG?=e(=u(#q#Gy+5)Wp(4HQ z6oLXDL1Z21^lo&W!e`(RyXRGpg|&%a(c&+`HyPSzaX;71JT2`?#Q@AEi3VyIf*2nM zM)^R4(<>N&A?gSyfzyT;lmOE?6g+a)Byr#nW^mO6`f9&0aJ1cz=^jk}Uk(^Vhmq@4 zm{$a68AbSUUz(A2SJr(rk=sAv8;dJKUYYmQ5?b`sw%Jei_$kda>tjAY91y#ei!sI| zrSf#=@Am*i4}>JWs6?i({+pRr%hvC@>J0TC7Q*(54|oWA}CyuF_uMLsW?DXcb7d~ewU-w zoMc4ub>e2)M_#Yr80an7H37LF>J;Qc9nj+}8Muv>nH_mhg)mY%&K;8%IhwIKal-Y$ zmm}IRi&rZTd1BbWu;SLqXzz|&8<%6H+|rC6^zT+j=%-g%UAHS?d4}}ybM)!3R^zKX zywu7wh1DldL+MU76=`4l>@H-CM-ca|%S*DJwoO|}TL{T>`2pEmTRS8yuJt-y~x0y&c8UW=n}-ZI-Nd!Rg*6V8S^cU>H)WoPG8}Ogr~H3Xs8% zw26zf^Y6pOt2p_VrQ4I3vfxd+PBEE#anrT3u@m+NP@VQz|B+dFa)!Ph*?cOoJX5>) zY1E|cT)}UlT##G3u5K$Y)?Tu*q398X3o3|_G5tL9NMOi^aEPLwA~ryd4@01*@Q{AV~OQT$6Brr<3gvlR8I;)`;Jb!+u;u93J zAG$YWA13FXkdu?ONiC+aa$Wv|dDJU2agWCK3hBbTVEeeMQ`ZfW5RvG*x5^R~M!I~y z09nmMygJ1+txi#4K4oO@fbL?|$@`h3^&J`26f3LvT><(Y{c~;oGUcob7*-{gNo}Ti zUWfPWB;hGdv-enR$=9(}EKq1O-Q9G4ix@(IGDj>azv)g1^_zJnRGog`;cP#4lS~sZ zUbRvc7~JsOTzLLQ*zONQpG3Bjl{3iQOkU+&LC?`%fA?4?5d#K)yI0qM(3&rLfbLyO z)bV>Ol8})SA)Q(_dq2)g_wev1heuhC_BSZb_BS^&s>9l>wM<3lidPV=#f9AQchIk% zSB}x?Z1tw!uHuL$GL#Wj^1nO%&N0yQGcWivZ$ns0aY}_7e~ToGjtuKA-uCj&-1hp< z)re@CyAJfjbU&}<_d*d|-ld9(0yFHtG zGQz$8@CsU&g0AEF*PWRucQf=cT+StdoI@w2#sG4Ga&7lrci1*-NHmPJr;@9c;|l?^ z+v+m=hwVeEc#Ba*)end*DD{f`6f@6h?TA0i_@jZG(e*sOgP6U5O1#eN+|cZiZFC z! zRlqpu)x*(8ez?o~HM0M9xk-dV0m2KvUW)5(BIcsK-#@5YCUd_n@cV*;*e9YT!ZmnHK>^ipAY0s^4;quRu6E z+r;=4<%u{J!}eZP{8$|7v$Nw^^M&m*`&w3FVOg0nj$RJMS)KQ;2h<9~?4_4(2b3+% z`#3pVC6<=C%JZ`_H!UsWi@gku2NAC}BdBgkb`bPHC6;~8w`Q9)FAY!koklhrXE0mk zIr=eNmTTwj8wL}LK74}pbb-y;b%C$Ts$}mWQ@$*>Xh~tHW#PHp4e>3s(IH`GR-W`# zlQ|=aynt@oq-<4Tw><@)aPE3tHrXNSIlC+l(esDgC_n$^qr)hNKHr0Ha`0hPd;vzo zer+1ie=IRVgdl5s!rp@+VnFKFnd>{Oe{lTiH5phNDL)EV%H}FAAf{>$6w}?G9F=+ zd-RFX{h)oXPBH%qZYEgNocb>Q4}%GV1l5d-BBr3OcV`>gO<#vWAL`irgqZ6>{o8AE z6V-YbcVjF$j6*7t!iBnk!o@OKx)O^gSVuw{#=-j@ptESJCHvADOSOMlaFhbFX@q41 zay%kj=-rv#TntyO-@MUZQ40-kTW}YJ`Y2I8K~o8~{hFqBIiD~Y;IMG>?a17P=^%1( ze_FoH%c^N10nE5Fg^yppxF{dZa`*^FQ>qAF!{kcLx8hX=0g3!axx;8DG(XIu-zvWA zuwS%UIhfRw#v}7AzFbe%(o)p!J;6gqEhwo`+w|BJwZ$*}?nu>#IzRnO=I*pXHg4T% zRyv%!=;IwONXfsh=*EcOE^5`R{_yRObB}|OHG?KY$-Jj$##iy@oCqr2!5sIR_uOSJ z0+U^;jFKQ%81Rm7cZyl(YOGg8P7Ysf?!=?ERpzYuqHs4%FYlv_n*l8q0BNsO1PfXp zX&yk9{P)EGRXZAwX)$2;_hZ3GR8WfiGJpc$(kiDyN(!Uo(UY$Y`WNNhPq9Fr_IdC- zdx1*Yb#d45*7j|g$Y8o>3R>&}9)SjUMd=D_znw5udFAs$Up#lywnIkDFvpdKN2<8F zB~=|)?=cMf-puio4ZQpvQx!ccuR(w8m|c#fE?uiruyzjU$?z7>*Z)va5Am*T%jnk~ z^+eUVS+sE3ThD#nc=k9{CBAUPh!-t?bBcD;b^ZQ_rW9NVFTbGhvBR zrrRI%XG6kk3pK%2rpweCQ*bZ$TULjv&)utL4i~Zbyl2npq?fOHdt=muFJH(4`fD4D z$41m#+)V3O=M-s&m6zB6-C!=M81P1F`y7=DaF7MSgD*eggTmT}7QX+exR2seXiI4A zw|tzi_FIwu8k~D?gpGXKU_}MISjm4%vQAQamj7%4V}QBgX?O9^rw;MITeuUGspD^I z4wijV%<=-K3kGN`m*!DySYzn2Ywez)oz#Vgx_{>*-_MEW^daGW5~9f2 zub;Bc@nx7h^a`Cvv{`$z_pZlyEtzPgRAF~kA@=HAXUppwe14KXBINhoM52$~w0N4z z_oFicj~3@pTIZvm0UC8*I;7Yi-%a44H!?nTcA5`1R@x@RR}hM+(`gPeQ5COi=Vs zJh-0vZNsK53|%ZW^h@hco_EyvO1UbTm_OU%7p@sA*iI&m3sU^BQL?tREb;c*-RM(# z+8UqHfBqpSf1S-f{8NnCY8A8GXv_dTzaP$3l>7`%6qRhuf z%Voj}R|2pKgt8l5BoQA-RG0-PZ{Z<oxsY!&VVudgt>?{os{!+A|qi|UPxyrG!47-g>eSR}~o7+Ei z0bFVsG`7_YMEtzI@j{k!UK3)V14A~m{*)-@aF<5c=^(C06AWGMoGR0>>?wamXVVZrV~aYD;=^5gfqKIPV|A-%{B%` zN$B+FKL_@|<1jCrWRE5VrOzvjj4%z=(hy~zQf7<`FS(4R0vXSjHxC*b6-Pq^yxiTQ z^vKscxytQ_Fm@*739qgV9UIOG>s=_e@^phQrtU&`ePF@@Wgz3; zMmW&Gkq$2TpG6=!tj4l3ESmw9=%sbb_DSixTTfmc2FIIai!$qC)TlSBn>+Q6-pR(k z^i+=T7=bW9C0(+G_IniimY{xb8$Ru;!->CMBFc`&c^&@2J-N{|$PCILXPd+|XZ&^Kt4P_G6@PIQgv z3xSgOPvAA#2m{rQY=85_=f5&w^(F=RTlk`w?j-Jr+T{g1Q;9*_A4gNSWuZ{m`CR3D zUufZk%?DItt{K6ejbT%)v|mHPD(@!c*%)(;0%7~)Wr@tpED!3QaE#GqGh~fCAIdaG zYeU<`kc;8#3jX+OPA{1`#+r5K6kQ|lR{ic3yY8cf+YpCs3W|*$ZUF(YVc|A8i;L9f zRq6fBo)P|Oof6d&b!bmrnhNsj70sOt_nen!RQcag2=x0ac$ zZE=gkhNz;Ncl;-h;O@}!hhNrAS6^WRtGkLSX#mC^W%HjSrtjJeHWb3K;`l3sxt8i> zJ_jz};^<7x8r);?eJBy(N9%OY1uxwv0>k>Wsk{xhS*pT~Y7L7y)PgT)Id+|DH3xaa zW8+bDy^cBfZUsJ1j|`h$;9q)p6tqS980QI+WC{kITNU3vkWFAdsmj}c?`>_pt(5x) zzt81qahzn-E=A`H^&NsSkz~{zrP8 z=7Ab_{iaHXkeOT8;w4M4YYanA28?{?Ag4m?w(epm6YcUWZ}G{@r~Nq=ovZJkDY9Rf zUZ=|p__|nHtV-}j#=PP%=gRapW^*$8J36zd@DTOf;c}kbk`e#RiJl(x*1tSDRi2F4 zu;PJ)$BWBqRxp)ZmM}&0O<8Dlxcj5jFe$b1YXT$J zBpafCd2LGv^V{*6DCf>H@81fezxS6-3i#Hk%g2(BV zQd0CiA@r#G{R_70%#OXMCBG|;2Imf^%Of*R$Ai)dX^(5`Bt&T)=uGK5kV(a zxk}aUv9;&tioZ{i-De8scxp3$@Ybq@?vC$E>^(I1@*q`jDbMtkufLH3L(i#In@lVj znY4{A*88=KWgfrz?~C4w^{4L!M3Uiu?f!C)k1I>qkcplpJI;8YxQpNPbuUJRORb+} zuLg;IfQ>e2j_wfG9D!W|ltW?n2)%TE92==~l+@CL0V40GbVvrkV?L?yt1plrr(?h>#>J zNzT$2?2YsqjzO=th9mcd^^-PFEw(g)@L}OOvXGx-{w*>r_S=0pqaB7rr&Sy5xhzAb zSMvu6oisR?3(tkcQ$+bw7RTSA>et_>kN^4+>~-kgyms`Ls_y3H18&!X%@sC|Yc*aM zYbcBRxDM#F8-&t+CC31?GE4H3(>gx=Wkt8Ou|62Rv7X4`GOfLtGfm6-a21PcFqI57N30qB{GSxyF7*G)yG69!5l$m_{}W%Cmb9I#lf z8#RW~j)!zOy9aPR>XFhsV3FO|8S#9V D^l}UT`eM7?!O?T)S;~p6)KK33F8E#Am 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 V^ftFx`VCP8R28)pD&#DJ{|EYp)c61Z literal 0 HcmV?d00001 diff --git a/frontend/public/icons/favicon-16x16.png b/frontend/public/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..140cd704e14fb416334f76cb8ed49de2aeff748c GIT binary patch literal 359 zcmV-t0hs=YP)Px$AxT6*R5(v#WS|f*QmCJSZU+3HXJrL;Y|^n~D3-!GC5nRod+xu->Y{m8R{w83 zf58xBX2x*k@go#N;2Kt1tN#x_dXo`GBO3@ZAnDjKhMyOAFtF=;fE)tXht?t zsNTdG3&xd&|IfDfH?#{&G^lB6G6Wyl&tRpk%W&-KWujd0AL`F~1_p-4WvZ6{qi!E( zXcv}XsC@f^a2TL_=k4|x|Ajp>KsNusot(#@I(HKOKtwVCe-;L;7!j1m~+W-5v^695&vVG-|%%qjo?002ovPDHLk FV1jdlnXmu= literal 0 HcmV?d00001 diff --git a/frontend/public/icons/favicon-32x32.png b/frontend/public/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..61fb419dfce85d0d3245de93596bb670517aa31b GIT binary patch literal 927 zcmV;Q17Q4#P)Px&SxH1eR9Hvtm2F5;W4UN)htrrPW(+Wx`(Y{!TUkrq) z^`)&S6nnE5!i?06<)pGGi?YHXo3x5vG%6$0=_Hg&d($vHaSq;*wzq2wzj(jwo_p{4 zKfm+*pK~U_IA4Ns*2e_Egah7ofb3L+K{+#oWjn)cravw<{(7mCi}Vl(3~5k2p~T_8Bgv$!M86xXy|pG zCzrjpw`J)Z7B1W7Of>Hq?-BRKxtT$$KG`2281+CiGp| z{I!>bYFM1zs{*EySN&g@BcBr%p{=!%xgif*f+AyW9DsWs9YlPy!2Q|er6rRhV=aC@ zzX`vn1bdlVsyN(R4-^#EJ9J_!XTC$muMH+LDNw|T)4J^JIJayyEZ_QY{OQC03PAib z(=bqK%4jnjM$EEx9(u$h%?7Vi*OL$3n8bRB$Kk@*R37QVpIDor_s4? z?f5qUPHeP-70pE#g@K4B!sEZ`mu{Q05^exxZMS=AjYcf zu>+$8*2re-1rX4%@xGj8!L0+lm3U5=02p@%egooGFEEJjJ`n%_002ovPDHLkV1i!L BuRZ_( literal 0 HcmV?d00001 diff --git a/frontend/public/icons/favicon-96x96.png b/frontend/public/icons/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..92a86edda8d92843e04baf5befe5ff298c614891 GIT binary patch literal 3832 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-128x128.png b/frontend/public/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..0396aec6a39e2a388444b353464a284098a58523 GIT binary patch literal 4683 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-192x192.png b/frontend/public/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..01a2fbdd538bcdd62339f65c619e5266dd7cfd3e GIT binary patch literal 14340 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 Q7XW_bWmRO#o*KRTKd}1YssI20 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-384x384.png b/frontend/public/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..172372386fcb3f49b1f929f44d9104997ad78e30 GIT binary patch literal 15561 zcmeIZWmJ?=`!{;eFyc^3NK1EvQj$X`0@5JeAl*nv4J{y@l7e)1m$ZN&CEZAu(*54} zJZGKv!-a3QY!HXL@Z&cw2W0o@ndCB-#U>Aj`(Smvq0LuGegUPY{}V8 zD(34n5BVJV`NsDAV6K;XbHa4G=jj{{)snGwC!V&Gf=isS)j0?P$pfrbE{Zo9o9y`y^uguO{==#j^L(*qjmb;YcN6&7YVH8Xg}v;5`vgSuxX(}ia>=frcYnJ5d$3O ze2GNhT{xh!zsQyZpi#K&ME=MUaDw$7`4!e9sDWsPfg~li!V*38Wi5IP>H3fg*VpYB z+(LFXrAjrPZ3?olw-sDN%^Xj%GF-`(ZTxHqs^pBHV1O&I285R)+CiH`Ld^5CUIEZA zJ!o$!qu8L>Nb6`o5nke^s(&;tBD)g`0l;bTa7oe!tLKf^Qm1Rk)l`3NUG`;7q# z4o~;wCBohP2O3>Y4KrIynRjj|vHRTqSD!!K2PdPc7CbU1EJH=~c7efFHdi}_0`(1H zO>Z@{#bsNoWz3HjhHrH0YcuQeayXtCWzwt+2v8gOFcMP(kUne;ZVV_Ye3z1%J$<-8 zR7OivvtWGOk9aJ8*W?u>BQiN}Sg}xaZ&d5=+YA2LUvgyQjUhg(dCjeULk+*7nLkoQ zox|+ITiCi5NJjBbPsd#2P#@4pfLzGohFN^nFFG$1pp zLARx@=8@6ScWhx*8Gq2j-KnZenN9p+;$ae;*H%-O(VGt{E9NTel^cAU({~D_F9^OQ zT})mn9A-TmliT2h%PoA!tVjDK4B-D=p9R0kDy5LXBa1{kN~htZ-9TQ5r#Ma9f}cG! zcVuXG1{J4w?)oH%AW{y2jf~{s#=d&4HPypDyTnt~2U{vFz-?sd!+2dKD6SB9imqGM zbgi^Z0&9QsxS;L)|gQ6zz=aHj+j6ZBLHO$_N^3g zFm7y>QCAxffUX(VUR;wsE^h=$(*Ly<@nPz_WNBA(scf890J;C4hbGOFFnR&yFPaiBX5 zrl+SX$C4+vntbdgq^k6m-We}>h0pLaL~wpU{(_!u*T7!s4d>Bi_iT={DY3iEMQrL!LDslVovCwQpK3olS)MT_&1Ygo${E_0ZnK$4s_8~?IS&tP^nWy}XrCY?S zK22CZ(47$)XDNeDTDzmpI+YnMTmR>HPyQ8k^;a{*Cc8Rs`^5a?0ajdWJ>~QH>5ZSw ze;sXKHwg-c+;k^e#K${#cV}P+wchB&>Ur8(n_p%N$g907cY;Aq zM}5l^^jg+30>9t6U%8NcPJM$O*fKGu(b-1a#q709LxHn>yS==qvPjt$EpXNHl6#}2 zJGI2MUm@OOJNEPk<|)~WH{Uqh&{$>BGy3^a%+#ZrKKWE_iuxQA-E5>qZuJJp8PIVQ z5Q_n{sg!_a*u%Fnpxp_)d6wx1FqY7bg;N69z!)Ju$r>C1?x(he?tWmFeMpFy2;9HH zYz`*4+bI`^_3!Qf`OEK5XziC{$(GbyZOYGf6locQY!2PD=Ga$aB&7&h^GDW))@MFh zkUXGKf*h7!krQEB~?lM?rVz~dv2K)ny(!?>{_il^{3;Dck-Qh*J%3s zzA2u8*CqNZ9NF@#Su2)`w(}VCRMQ-z1>ei*iM6voR4l&^ zW~3hP&E-+x@%qZ?bQ9wtReR2VhOWjLo%Is1WlyaH%E;MWj3_)1oKATu6aEbj8)Tp? zz8Iby&a&_pom6=*jkbl?QqHkdt0!U&Epi_D&Vcb%)vGGMxI9Y4xdTo7=3*d$`G@DQ zw%v%f$C+boNDq@$RLewmq~>vN#3Li0Mkqw_@5f{u7$O|67}0JGI(GgnY@jMJQOg4x z;E^wfLaM;HKnc7nD~Ox*2eLn5;v?FhfcOlKWWr!dd$mgi?2ea}T$TCVEgdhmCpmpoT(A$n zow=xPt{VmZdRz!~-rRVNPfiZk5Pu3NsL>YsUAF!Gv_RT&@;Cn>?g_7l=h^0LeNGAf zSv2z$zo0f8xm~Y<#zAEj+kI}9Npl`w<~6&^v0M|5-*3nnWsI1(ayMgux4R~?eZ8c< z4bPaVbS#|s4L4Y(o?0($Wlj3#Q&2TL{f=w)Q#c1hdhMr#bQfG#n|#-g0w?53<_iq=#Oe{Bqz=X6c~nZL`a$_zdHN`7lY@#~wZ zns?#p-#T|clb!z9xHOFfHF@Vojdv^qT$EKisYzc*7d=%@qjMHb`^&9u&6&92NUa!R zIP%9q@_5igh~m-%h$1o$f(J*!nA3r0<)f*yv@pcCGi>0&Yhq4cP$tjHi+`Ft1;J5= zBNAXl^dr&kowBcKAUze}d|aNy+QE1V>^k{qFasgEEiSe>%KYa2?XNabL>q7EN5^9( zJt!6^--vx^)Oe;O_cg7q1`FNpI^XuKYea;~_R1C)tCQwdEcU3&r1;}oTFj929iB-L$Fas) zt%nUiNu-z8>U>S1KWmoX`K}dYv_+pj-CZg5G2YW^G~CnL*Q!3iKDj#<$n=(z@V759 zxRB~oQ%)bZ%KRp>eePe+)w0cy68p;(RY|VNjPq%$y4hfaAcJnN3|ad}YbxOLq5tk) zvU8`bkbUoDU|qZrX$IZoN3CYOstt?ZzC6=YCH-XvynJD^Rd0YtH@B}0Em=yNHL;O) zdOpHnNWk3@m5e>}(#;nwsZgpX&~>D@2=t60As*X&EgEin9e$`Z?_;g{{##uLJVZ~` zg18)X!T=Vuy%P+XY~*m{BRm+wVqU`t26+v6{vVX;-una;DrdQMaRC(a+V{VszQ7U# zCCWhe4D$sGP$_w2TNh@;Rio02D=Nv}fT-V|KYu#%6Ye_y+p*-=$GDhDFaW9ktuLyJ z1hvkPv~zwnR_5f2!EeVey4)M(=AT>tXlHO^A;+UN&bF>&ACi~j(ZdiJzExnq7U=t( zsq}{=3b!C(6)t=yJX-;{^Xdrcc)dO`p^QkhZgF)ExODb-BfQKwKhH%wu0D@azg)<& z8N^byG-+*~YQ8uip7IhOzoSNDPl%dA*2#VsH|6QqiV`3EPnNB2!S;K?rlzWEr}mRq z9hroupCWfAaR)+t6ES1Hsb34(JwWjKoW6_N*5<3cOtkiv4N+%q2%{kk%c9l==f}19G?sf zZ6v#Rc&Vyt+c8&Y(7wSF_9VjiC3f;c9sQ=y5p#)0QDvUWW)O{UNtFH(8bJ-XI%|DI`f#Q`(!O4Tm|!(vDMH)B^8u*WGPf8)K5b)4*{4D*WzmJHwEc ze1?$63o~s+jn`ob@R9y_>E0}^&@F|+hyK<2mG6d|Lemab270Y_@|6kENj-r6b1YH; z830q|LsQoF!P3@gr=%DQ3(wpqRy*Hft|CWFqV(6^s;UG?=e(=u(#q#Gy+5)Wp(4HQ z6oLXDL1Z21^lo&W!e`(RyXRGpg|&%a(c&+`HyPSzaX;71JT2`?#Q@AEi3VyIf*2nM zM)^R4(<>N&A?gSyfzyT;lmOE?6g+a)Byr#nW^mO6`f9&0aJ1cz=^jk}Uk(^Vhmq@4 zm{$a68AbSUUz(A2SJr(rk=sAv8;dJKUYYmQ5?b`sw%Jei_$kda>tjAY91y#ei!sI| zrSf#=@Am*i4}>JWs6?i({+pRr%hvC@>J0TC7Q*(54|oWA}CyuF_uMLsW?DXcb7d~ewU-w zoMc4ub>e2)M_#Yr80an7H37LF>J;Qc9nj+}8Muv>nH_mhg)mY%&K;8%IhwIKal-Y$ zmm}IRi&rZTd1BbWu;SLqXzz|&8<%6H+|rC6^zT+j=%-g%UAHS?d4}}ybM)!3R^zKX zywu7wh1DldL+MU76=`4l>@H-CM-ca|%S*DJwoO|}TL{T>`2pEmTRS8yuJt-y~x0y&c8UW=n}-ZI-Nd!Rg*6V8S^cU>H)WoPG8}Ogr~H3Xs8% zw26zf^Y6pOt2p_VrQ4I3vfxd+PBEE#anrT3u@m+NP@VQz|B+dFa)!Ph*?cOoJX5>) zY1E|cT)}UlT##G3u5K$Y)?Tu*q398X3o3|_G5tL9NMOi^aEPLwA~ryd4@01*@Q{AV~OQT$6Brr<3gvlR8I;)`;Jb!+u;u93J zAG$YWA13FXkdu?ONiC+aa$Wv|dDJU2agWCK3hBbTVEeeMQ`ZfW5RvG*x5^R~M!I~y z09nmMygJ1+txi#4K4oO@fbL?|$@`h3^&J`26f3LvT><(Y{c~;oGUcob7*-{gNo}Ti zUWfPWB;hGdv-enR$=9(}EKq1O-Q9G4ix@(IGDj>azv)g1^_zJnRGog`;cP#4lS~sZ zUbRvc7~JsOTzLLQ*zONQpG3Bjl{3iQOkU+&LC?`%fA?4?5d#K)yI0qM(3&rLfbLyO z)bV>Ol8})SA)Q(_dq2)g_wev1heuhC_BSZb_BS^&s>9l>wM<3lidPV=#f9AQchIk% zSB}x?Z1tw!uHuL$GL#Wj^1nO%&N0yQGcWivZ$ns0aY}_7e~ToGjtuKA-uCj&-1hp< z)re@CyAJfjbU&}<_d*d|-ld9(0yFHtG zGQz$8@CsU&g0AEF*PWRucQf=cT+StdoI@w2#sG4Ga&7lrci1*-NHmPJr;@9c;|l?^ z+v+m=hwVeEc#Ba*)end*DD{f`6f@6h?TA0i_@jZG(e*sOgP6U5O1#eN+|cZiZFC z! zRlqpu)x*(8ez?o~HM0M9xk-dV0m2KvUW)5(BIcsK-#@5YCUd_n@cV*;*e9YT!ZmnHK>^ipAY0s^4;quRu6E z+r;=4<%u{J!}eZP{8$|7v$Nw^^M&m*`&w3FVOg0nj$RJMS)KQ;2h<9~?4_4(2b3+% z`#3pVC6<=C%JZ`_H!UsWi@gku2NAC}BdBgkb`bPHC6;~8w`Q9)FAY!koklhrXE0mk zIr=eNmTTwj8wL}LK74}pbb-y;b%C$Ts$}mWQ@$*>Xh~tHW#PHp4e>3s(IH`GR-W`# zlQ|=aynt@oq-<4Tw><@)aPE3tHrXNSIlC+l(esDgC_n$^qr)hNKHr0Ha`0hPd;vzo zer+1ie=IRVgdl5s!rp@+VnFKFnd>{Oe{lTiH5phNDL)EV%H}FAAf{>$6w}?G9F=+ zd-RFX{h)oXPBH%qZYEgNocb>Q4}%GV1l5d-BBr3OcV`>gO<#vWAL`irgqZ6>{o8AE z6V-YbcVjF$j6*7t!iBnk!o@OKx)O^gSVuw{#=-j@ptESJCHvADOSOMlaFhbFX@q41 zay%kj=-rv#TntyO-@MUZQ40-kTW}YJ`Y2I8K~o8~{hFqBIiD~Y;IMG>?a17P=^%1( ze_FoH%c^N10nE5Fg^yppxF{dZa`*^FQ>qAF!{kcLx8hX=0g3!axx;8DG(XIu-zvWA zuwS%UIhfRw#v}7AzFbe%(o)p!J;6gqEhwo`+w|BJwZ$*}?nu>#IzRnO=I*pXHg4T% zRyv%!=;IwONXfsh=*EcOE^5`R{_yRObB}|OHG?KY$-Jj$##iy@oCqr2!5sIR_uOSJ z0+U^;jFKQ%81Rm7cZyl(YOGg8P7Ysf?!=?ERpzYuqHs4%FYlv_n*l8q0BNsO1PfXp zX&yk9{P)EGRXZAwX)$2;_hZ3GR8WfiGJpc$(kiDyN(!Uo(UY$Y`WNNhPq9Fr_IdC- zdx1*Yb#d45*7j|g$Y8o>3R>&}9)SjUMd=D_znw5udFAs$Up#lywnIkDFvpdKN2<8F zB~=|)?=cMf-puio4ZQpvQx!ccuR(w8m|c#fE?uiruyzjU$?z7>*Z)va5Am*T%jnk~ z^+eUVS+sE3ThD#nc=k9{CBAUPh!-t?bBcD;b^ZQ_rW9NVFTbGhvBR zrrRI%XG6kk3pK%2rpweCQ*bZ$TULjv&)utL4i~Zbyl2npq?fOHdt=muFJH(4`fD4D z$41m#+)V3O=M-s&m6zB6-C!=M81P1F`y7=DaF7MSgD*eggTmT}7QX+exR2seXiI4A zw|tzi_FIwu8k~D?gpGXKU_}MISjm4%vQAQamj7%4V}QBgX?O9^rw;MITeuUGspD^I z4wijV%<=-K3kGN`m*!DySYzn2Ywez)oz#Vgx_{>*-_MEW^daGW5~9f2 zub;Bc@nx7h^a`Cvv{`$z_pZlyEtzPgRAF~kA@=HAXUppwe14KXBINhoM52$~w0N4z z_oFicj~3@pTIZvm0UC8*I;7Yi-%a44H!?nTcA5`1R@x@RR}hM+(`gPeQ5COi=Vs zJh-0vZNsK53|%ZW^h@hco_EyvO1UbTm_OU%7p@sA*iI&m3sU^BQL?tREb;c*-RM(# z+8UqHfBqpSf1S-f{8NnCY8A8GXv_dTzaP$3l>7`%6qRhuf z%Voj}R|2pKgt8l5BoQA-RG0-PZ{Z<oxsY!&VVudgt>?{os{!+A|qi|UPxyrG!47-g>eSR}~o7+Ei z0bFVsG`7_YMEtzI@j{k!UK3)V14A~m{*)-@aF<5c=^(C06AWGMoGR0>>?wamXVVZrV~aYD;=^5gfqKIPV|A-%{B%` zN$B+FKL_@|<1jCrWRE5VrOzvjj4%z=(hy~zQf7<`FS(4R0vXSjHxC*b6-Pq^yxiTQ z^vKscxytQ_Fm@*739qgV9UIOG>s=_e@^phQrtU&`ePF@@Wgz3; zMmW&Gkq$2TpG6=!tj4l3ESmw9=%sbb_DSixTTfmc2FIIai!$qC)TlSBn>+Q6-pR(k z^i+=T7=bW9C0(+G_IniimY{xb8$Ru;!->CMBFc`&c^&@2J-N{|$PCILXPd+|XZ&^Kt4P_G6@PIQgv z3xSgOPvAA#2m{rQY=85_=f5&w^(F=RTlk`w?j-Jr+T{g1Q;9*_A4gNSWuZ{m`CR3D zUufZk%?DItt{K6ejbT%)v|mHPD(@!c*%)(;0%7~)Wr@tpED!3QaE#GqGh~fCAIdaG zYeU<`kc;8#3jX+OPA{1`#+r5K6kQ|lR{ic3yY8cf+YpCs3W|*$ZUF(YVc|A8i;L9f zRq6fBo)P|Oof6d&b!bmrnhNsj70sOt_nen!RQcag2=x0ac$ zZE=gkhNz;Ncl;-h;O@}!hhNrAS6^WRtGkLSX#mC^W%HjSrtjJeHWb3K;`l3sxt8i> zJ_jz};^<7x8r);?eJBy(N9%OY1uxwv0>k>Wsk{xhS*pT~Y7L7y)PgT)Id+|DH3xaa zW8+bDy^cBfZUsJ1j|`h$;9q)p6tqS980QI+WC{kITNU3vkWFAdsmj}c?`>_pt(5x) zzt81qahzn-E=A`H^&NsSkz~{zrP8 z=7Ab_{iaHXkeOT8;w4M4YYanA28?{?Ag4m?w(epm6YcUWZ}G{@r~Nq=ovZJkDY9Rf zUZ=|p__|nHtV-}j#=PP%=gRapW^*$8J36zd@DTOf;c}kbk`e#RiJl(x*1tSDRi2F4 zu;PJ)$BWBqRxp)ZmM}&0O<8Dlxcj5jFe$b1YXT$J zBpafCd2LGv^V{*6DCf>H@81fezxS6-3i#Hk%g2(BV zQd0CiA@r#G{R_70%#OXMCBG|;2Imf^%Of*R$Ai)dX^(5`Bt&T)=uGK5kV(a zxk}aUv9;&tioZ{i-De8scxp3$@Ybq@?vC$E>^(I1@*q`jDbMtkufLH3L(i#In@lVj znY4{A*88=KWgfrz?~C4w^{4L!M3Uiu?f!C)k1I>qkcplpJI;8YxQpNPbuUJRORb+} zuLg;IfQ>e2j_wfG9D!W|ltW?n2)%TE92==~l+@CL0V40GbVvrkV?L?yt1plrr(?h>#>J zNzT$2?2YsqjzO=th9mcd^^-PFEw(g)@L}OOvXGx-{w*>r_S=0pqaB7rr&Sy5xhzAb zSMvu6oisR?3(tkcQ$+bw7RTSA>et_>kN^4+>~-kgyms`Ls_y3H18&!X%@sC|Yc*aM zYbcBRxDM#F8-&t+CC31?GE4H3(>gx=Wkt8Ou|62Rv7X4`GOfLtGfm6-a21PcFqI57N30qB{GSxyF7*G)yG69!5l$m_{}W%Cmb9I#lf z8#RW~j)!zOy9aPR>XFhsV3FO|8S#9V D^l}UT`eM7?!O?T)S;~p6)KK33F8E#Am z!_ql5PD>Q3aqaRzx4SJPtDf%ui39Nfh7h?WJ3D@(wBci9I9HlO>4=>R2YVSMNRv$U z{9S7Q!Z{Qw&NY3RyKGAm@;9Y@AaO7opW%=y>!uZ&tk;4tKl++?n9@DClu>$RH{-Dh zH)~qydQiOrYi(UT$O}T{YU?1hyUiSo-}(5uts<&)aZKacP(C`uJ}BcyQckYj+T6?s z=CcdTy0i{LtHuzqxO7!qIa-O;CvJs)Z=M)^kjHP+9Gq#oU3x3aI@6zxEipD+= zU%AqsVln)Uedzd7b~vw0-$lgr$KHvOQc2Q7>hfdjc-thoMsM}K-U=6Nptn)vcZdWK zLnHee0|RQnKD<`)O`H-;QnK!ol-Kg;U|@tR0N)AU)PmIY^eJNh_%Y=5KFd9(x?rw| z28&9shRQD#F)}}pg5}>ic~$1A@S1{kNRNm~0HfU|fu8$aC&Q(qq{&P3WOYx^S67~4*9w}jq!J{Yg#bqZ5dq$6Jv0Rufq z+pm*j22YZ0Zkwib{s~OOHM4?s!@#hDM=6kv)(N%$Qx`vY;d6lgB2h* zZ2NyyEKLB*2tKBpj!V@Rw`_ghVOUDhE*nV^?|xiBe}{vNyT}x4&$PO5O^UhK_n656 z>qUDNXCF)&f63MgbW-bm1D#yA*dOrXD zx$?qeKmu_5^`4lNAJ(o@4Mt`K&K^W&T(IH|* zGXESGt11fqr@Mdk%4HUo@Hh202kxU_U9IQAg)QEXbTlo9<8?O;BxjY4+ zP5#O`L@}r-Q+0ivXl(lOL4|0%V}I^qVbaLwK)T~h&>sgVcRvYl{EE|PoX^p%)yu08 zSNG*ImBkc)42#8Rdunfr2-Y5)yoNPLdPy7y_s+V$XHGI>f2;YbTcr%Ec9r^n8*Qt5k=3zcgp>K?lL z$>;8;0lE1MeZ5`7ieI=0u=U~9J~ufVRV}!s)px_>=#hVnnHd?sbofE(2<1erJ{u6G z6Vb8t+m(_p%)ioYnvI)z(`&91HZq_BCI$n!1!>HQCwpvYihH5&mT46H>!+`OUfS$v zXyW||PJ0p-(6F=EcIR;U z4JFd-hbw6$p@dleqjdxO)LXlqBEO5xD59Q~HI@C`d5`18yVu+lj~_$7H2yV6902n< zhXsG&r>mnoSIP?)IPx?1NP_M^sCR(fcWTvN+b9M05IH_XjivfeqK9yF0_oi2aQ}BU zFAXI8x^^$cDos{*kMlpjY<$RBzeOlckvQ+kQK3@%YG7yQfS_=Hroum$o}po6PfiGJ$ z;EN$bkg9+QX{}5NS*LlitY;O2*sga`D=a>CIe%#Wx!t4ql1V8NDiY7dhC(?F9@mLK zCKHdKQEJzla}aQg^a8}7y}U6Q;Uc8hLV=)x-3K89(EB0K#5hMtz$A|!B-{Je>tNo{ z$_9VV=2Qj{ZQ$vC1m6r-(Ass9%zylW1x(3=WT__%a+5#u{f~Lm{fO$zy{k(%=b3Yz z(F`J#+2|sgKfII`zwyer3bo&xliJVo@^{17)F}T0GjLUveRnLoJTs1n#BRJGjBI<|=9!wK z;Z|p!{7OspO@Hf#0pWme5eIAYOGVc|mR=Elju{;GAAVQU<8!d3h=hfDiVQics6Q0; zsP}LB#orR={T@a3#ka(P){ABtKIiEyysgnyg(d6G3ZnNr;@X`4Wg>UkKi3iV+kUqp zXuNml9pVOXuB>>}xZqdVNFitDToW`1Rr^y}XGixRI;BUFe|DZfY0^LOCP-IhZWg&T z-@~M{&*L4;!4<_gIxdrmw(Z= z0uoFI;&0laQ1L8xYAp%LxuAoPm-t`_ZNS`}%SK4$&9By9YzrTvLzF_daO>?BS`&Hg zW{WbYXS;M5KG#_mN*F%=!mEg|N+v*)8!Akv*SV5ae;6JlK6g@=F!V)O_Ch#d+aQWv zlrbn@_P8fv&cmp<((-V0U;=&;b`*9EeLG{Pa{F@m#x>z z3zkSTAIy3(P|6wU>8o}uoO7ufoxJD1&9Dk=JXyp&i`RaPsmRHgdT5%GbP3zvqAxQe zo!UL1$Z5@|J^a0@@I)S((ezO?WPn-cXyy4hm%!i;i$ndlBR|dFI!sodE*KmeFOFq& znR;Nc9y^cz-6(x@S+(!{XErZ6kT>MD3%Y;>g*+cfs(U>!xcvjm=K7jL6ImE-q$!UT_;8Xm! z75o5K@fKG#5ET-2YxW4DsEZ)3^#@FdIFpB&Km$r^GEoq9gZ35hcnyN}kH5W%Nz#{~ ztzjdN)s-IAfTGDFP7B{q}N#zv6R z)A`~~h~{~n@ww6R*(C!<#(65NA{0SDAfqbz5Am5>18myVgH)8qog2@j8>z*=Ek=Fv7)JJWIs?orwv&5zX zEK?mv(V|H^cBS`u&jEEk}#aWL|JNp9Dzcp>{kgWWfo`@7tI3r_oXEH#08>@=MD+dT&2iQ;w*g4I&YtH}1=LIW1K-U9O3L(t>MrUQoTxl|1A~~%F zajD1@9a(ZKJ2SLJC05X$%dvSISHNc~r(OU{8+}7spkf9KexRd<0|{VkYqA12q0IEuEd! zc5addcSE8&>{DqDKa8vEj9(YD7UJ;ws!9JYoyXfFbHBSuI>Q^B|82J4_aB(4dRqqy z*M~yzUC@11(3qe}8ZQt?g5mx!$@u43Zq$;rX~3Ho32mG+#-NHL0DJ%J`%}Lsl_i&& zr?JFwo$!+1NjIa=SI3Uf-!9Bb;YGtId*}S9Eyn{LiNYl}FMRb3S;MZpnRKi)-Dw`2 zIXg~n#3lSp#TAisX2y#R^n0BnV(sLI++v8$Fh9^R%KL1LHzmK|=E2%EtK_I+$(mM`T@xr}*u4Jc(6w;?V`Kk@PICbOAv#!fiHZ~9F<$K}9t6~EDHfCVfbX>nFQ z_jT4|3j}*qG~tM30Kf1a`F!iDxVKwpVHoAnA=ou&_KDmv5!_5zE9m3NMZnQdBNF?d zP)tT#LDIf67%)la`p~Bfc4V_&f`E|hoYjQe!*qPmuMRnw9a39N4H{Tzbv6YY;j$zF zRCbcJ%-lPKFcDwC1C=O0h2d-15bz_FSpgUerIIR_b>{r(4rO%@*0n_&>txWE^fU|B!~qv z6AX3+tds`ipv!h=J*uUHBNiG7@SOO;-#ZDB{l~*8^X)Ocd<9dv2Awmq$;~2xrv~WI z3weXQX*|!Y7UPgsDSUp-~7N< zKn>J}dj~WJx}&vE1`tR)NuL<_U2F3G0IeAe11tw29)X8S>k9S{y`a&+#*sBg!KRFo zg;9I^45+ZNebXVSnlKIoG~}M%_<~LkDFi%AKx!vEe=k@lQJN>zh7y< z18yEHj!@h$Fa_SDYNwBA=e)n!*=`Bqm!gobqW>1S&tc@A`WpVbsW|}}#alcnpMMMB zfzwj>p`GB@0RO%67IFJ;0eWy6uLCRya{oMU!K&Z?Z0P?N5<0)bAm%N86c>{Q-c1Ii MU&>3CiW~U-FGC0EPx-%}GQ-RCr$PT4_*JR~G)d5f?-PvM3~zco2-Z9hnWDg0(v+D<`C%N0x%~*a|oD2pocSH4uLK% z0F{4#>xmA%EyL`stu>ZfRbP*c>gsp^Dq}EoWd#Uvo?fsYU=0p_gqu5I9lXjF$KO5+ z=c&(QM*J77%U~QdagC>)u&uDVRVQqmv)q=QF+0)1Tw&L^an#L$a~np0Z>=--{FsK> z+m9Mg04G5Tl7r@eQ^xxd2^UH$;K@{)>vv`B`a(%Lq`ST&aEQRhbO2$fi3pxK zhzOgAL+K|lVW}e=uX>WtEOim`O3P?$0+^?iP=6H!LHT&@EPCLT4|Zyh zU??&@=286nIuC}0+yXhp#WXeY#TVf{GKj7Z9zIMYFq@b&XG}`~UnrM7Nnc9|+99F` zI9*IB{#opw$jL@kT|E}Ovk1F4Cy7KzmB2_~WV~NkptmwxoUmCjIPLzU-%jvYCq)2w zGR#j|n*TFO3X53zL5PbJN*>fJ*>!RKFB-XFjn_bxfw@B18W;$Lt1AId@7)Ktu3WAH@*BBN<%{-wYK;>Cyj_0Si22XEQleud@K$!W0;~U)jFIw&&Lu#)SZR`E z{fvm~eF88lc@w_NuEMVBN^Y)Gs5KiC0j##O-;A1S#3&S4aqZ`)c>J?dAEUtQ6#~+y zvkJfxAkPa@A{Yq`0dvUwVBTWdkv!f)(n%%{3ap1x~aBfEp-N)r! z)YV_BBGhMRG@P_l2DOP`YEbz45fQ#lgW%)ngxMKsQa|lJe~P_}FvZ>lqu;WHcR&yV z$H(IO=>+VJIf2~9U-4OfR=Ymh3PGbLx8hh8+|P=t#9TKAJQ?nfp|3_kT~vpLg4?ht z&qhJ|WnB677x+33LRDo2>>Tx~d3eO#yg{~G><7bn-(gs0?guNasb!W-<}@~IL=dVT*3-3pe`{PR zRwFgy^=?4`$@A;bNy?))G6}#-`%^_V)a_gcm*PgSF~`jb)Ni|f4c1kaiArF7{HzfY z>xVbqzJXC8z3{=ln+ET`Q4=+^tosdx#Mhyd2rO^YQg*>beUfgI)_f-RGcrclHbQ>VYqd?+^*R^$&JI_VPpwEWHiy zJ1Nv%o^**w@{#wVd!_~!0<5txI8~UBx{Uu|KbbVp$Up0uBuy`Ahm6wyFLBcm#*QB~Lcq0v-sJrT+3b3(NT7(4S>JMr0?7AvQ zfs#{adFjFun}N#4N&Yx?U%;?SnQ)&Ph|qBh5wms~hW;}F^UoY7sjt`=heL@;P?z6> zo6{h?^uj3Y`8L&{w?MxB&LBW&mVIjr6#{H*k@=wMbl2SI6v%d-ADqe$EyJvJr}3}Y zS229a1~OwLsLSseg~6!FI;eoavzAp?!$C@)N#iYyi63D<9-_eVyE#p<-~2LUKVunP zCmhParjL`mbPf;+V2Mxb^EFon>zAs7z%zghD9aNIcTR=t?A;>Y`&av6&UPw)qMf0i z#ye60ZGmTNmlB|%ioHH#@%pW^1aOL#H7577#?oXJ5yFX~g!$2QgseJd6bT(gfGA-} zOlwC>YXlHEj07(a4}4mXg-`P{#fl+y!b&4=5@Phiq?fS{F|V%)CrU#B(p}!LJQ}eP zp|tzjZGodFq8*xY%(R>|)YWXn0NZ!<$_dY!0BuaFwb3(`8~?IW>_47%65+9%d5+Nd zgN)+2fl7s~9oeQ%8-pbmZ{x$u=ejKc!gq>Ew3Cmn9YcM|9lq-vys*%v>2HHmz5TJ^ z)c06DF9_RHuHn|=KT*HWzdzIqyxzw8>RS(cIwmuF_SL8Qg+EBAa+M0ZC;T2`eEkWi z<)g3gvTqz-arY)N+Q>C+E~86?K;%$wfdOHSfoUU_HArYKpZpWOL0Al$q{q(cVk&}S z#y{od@*Qn$ZGuGdMjeB@LI`MpZ;oMI*2SwwwnZAnaD{1LW1#iWxj|s5f$Is^Rrqf4vs||Ewny-zqg6$e*MixpOzYJ*OriAl%(e z`{dW+bB`9O!AjW|B}J6Q8~V&exVu|>Yc$FD(IRz=SdAh;SKu50BS2cpcz>rgvr;G-AEae5yf7@R_gLgbOeeU_vsx tr7N=ny5+W+aM5N3n2^kF>8i&o;D5(2i*9C}HKhOm002ovPDHLkV1mm~Sw{c> literal 0 HcmV?d00001 diff --git a/frontend/public/icons/info.svg b/frontend/public/icons/info.svg new file mode 100644 index 0000000..2dde11f --- /dev/null +++ b/frontend/public/icons/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/icons/ms-icon-144x144.png b/frontend/public/icons/ms-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..cb71641510073509827772198fb993929a673908 GIT binary patch literal 5241 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/personal.svg b/frontend/public/icons/personal.svg new file mode 100644 index 0000000..080da91 --- /dev/null +++ b/frontend/public/icons/personal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/icons/schedule.svg b/frontend/public/icons/schedule.svg new file mode 100644 index 0000000..7678008 --- /dev/null +++ b/frontend/public/icons/schedule.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/icons/score.svg b/frontend/public/icons/score.svg new file mode 100644 index 0000000..d664329 --- /dev/null +++ b/frontend/public/icons/score.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/icons/selection.svg b/frontend/public/icons/selection.svg new file mode 100644 index 0000000..60963ed --- /dev/null +++ b/frontend/public/icons/selection.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/quasar.config.js b/frontend/quasar.config.js new file mode 100644 index 0000000..234488a --- /dev/null +++ b/frontend/quasar.config.js @@ -0,0 +1,212 @@ +/* eslint-env node */ + +/* + * This file runs in a Node context (it's NOT transpiled by Babel), so use only + * the ES6 features that are supported by your Node version. https://node.green/ + */ + +// Configuration for your app +// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js + + +const { configure } = require('quasar/wrappers'); + + +module.exports = configure(function (/* ctx */) { + return { + eslint: { + // fix: true, + // include: [], + // exclude: [], + // rawOptions: {}, + warnings: true, + errors: true + }, + + // https://v2.quasar.dev/quasar-cli/prefetch-feature + // preFetch: true, + + // app boot file (/src/boot) + // --> boot files are part of "main.js" + // https://v2.quasar.dev/quasar-cli/boot-files + boot: [ + + + ], + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css + css: [ + 'app.scss', 'tailwind.css' + ], + + // https://github.com/quasarframework/quasar/tree/dev/extras + extras: [ + // 'ionicons-v4', + // 'mdi-v5', + // 'fontawesome-v6', + // 'eva-icons', + // 'themify', + // 'line-awesome', + // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! + + 'roboto-font', // optional, you are not bound to it + 'material-icons', // optional, you are not bound to it + ], + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#build + build: { + target: { + browser: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari13.1' ], + node: 'node18' + }, + + vueRouterMode: 'hash', // available values: 'hash', 'history' + // vueRouterBase, + // vueDevtools, + // vueOptionsAPI: false, + + // rebuildCache: true, // rebuilds Vite/linter/etc cache on startup + + publicPath: '/', + // analyze: true, + // env: {}, + // rawDefine: {} + // ignorePublicFolder: true, + // minify: false, + // polyfillModulePreload: true, + // distDir + + // extendViteConf (viteConf) {}, + // viteVuePluginOptions: {}, + + + // vitePlugins: [ + // [ 'package-name', { ..options.. } ] + // ] + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer + devServer: { + // https: true + open: false, // opens browser window automatically, + proxy: { + // with options + '/api/v1': { + target: 'http://127.0.0.1:8800', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api\/v1/, '') + } + } + }, + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework + framework: { + config: { + dark: 'true' + }, + lang: 'zh-cn', + plugins: ['Dialog', 'Loading'] + }, + + // animations: 'all', // --- includes all animations + // https://v2.quasar.dev/options/animations + animations: [], + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#property-sourcefiles + // sourceFiles: { + // rootComponent: 'src/App.vue', + // router: 'src/router/index', + // store: 'src/store/index', + // registerServiceWorker: 'src-pwa/register-service-worker', + // serviceWorker: 'src-pwa/custom-service-worker', + // pwaManifestFile: 'src-pwa/manifest.json', + // electronMain: 'src-electron/electron-main', + // electronPreload: 'src-electron/electron-preload' + // }, + + // https://v2.quasar.dev/quasar-cli/developing-ssr/configuring-ssr + ssr: { + // ssrPwaHtmlFilename: 'offline.html', // do NOT use index.html as name! + // will mess up SSR + + // extendSSRWebserverConf (esbuildConf) {}, + // extendPackageJson (json) {}, + + pwa: false, + + // manualStoreHydration: true, + // manualPostHydrationTrigger: true, + + prodPort: 3000, // The default port that the production server should use + // (gets superseded if process.env.PORT is specified at runtime) + + middlewares: [ + 'render' // keep this as last one + ] + }, + + // https://v2.quasar.dev/quasar-cli/developing-pwa/configuring-pwa + pwa: { + workboxMode: 'generateSW', // or 'injectManifest' + injectPwaMetaTags: true, + swFilename: 'sw.js', + manifestFilename: 'manifest.json', + useCredentialsForManifestTag: false, + // useFilenameHashes: true, + // extendGenerateSWOptions (cfg) {} + // extendInjectManifestOptions (cfg) {}, + // extendManifestJson (json) {} + // extendPWACustomSWConf (esbuildConf) {} + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli/developing-cordova-apps/configuring-cordova + cordova: { + // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli/developing-capacitor-apps/configuring-capacitor + capacitor: { + hideSplashscreen: true + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli/developing-electron-apps/configuring-electron + electron: { + // extendElectronMainConf (esbuildConf) + // extendElectronPreloadConf (esbuildConf) + + // specify the debugging port to use for the Electron app when running in development mode + inspectPort: 5858, + + bundler: 'packager', // 'packager' or 'builder' + + packager: { + // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options + + // OS X / Mac App Store + // appBundleId: '', + // appCategoryType: '', + // osxSign: '', + // protocol: 'myapp://path', + + // Windows only + // win32metadata: { ... } + }, + + builder: { + // https://www.electron.build/configuration/configuration + + appId: 'little-busters-fe' + } + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex + bex: { + contentScripts: [ + 'my-content-script' + ], + + // extendBexScriptsConf (esbuildConf) {} + // extendBexManifestJson (json) {} + } + } +}); diff --git a/frontend/quasar.extensions.json b/frontend/quasar.extensions.json new file mode 100644 index 0000000..e239c30 --- /dev/null +++ b/frontend/quasar.extensions.json @@ -0,0 +1,3 @@ +{ + "@quasar/qcalendar": {} +} \ No newline at end of file diff --git a/frontend/src-pwa/custom-service-worker.js b/frontend/src-pwa/custom-service-worker.js new file mode 100644 index 0000000..16a22ba --- /dev/null +++ b/frontend/src-pwa/custom-service-worker.js @@ -0,0 +1,30 @@ +/* eslint-env serviceworker */ + +/* + * This file (which will be your service worker) + * is picked up by the build system ONLY if + * quasar.config.js > pwa > workboxMode is set to "injectManifest" + */ + +import { clientsClaim } from 'workbox-core' +import { precacheAndRoute, cleanupOutdatedCaches, createHandlerBoundToURL } from 'workbox-precaching' +import { registerRoute, NavigationRoute } from 'workbox-routing' + +self.skipWaiting() +clientsClaim() + +// Use with precache injection +precacheAndRoute(self.__WB_MANIFEST) + +cleanupOutdatedCaches() + +// Non-SSR fallback to index.html +// Production SSR fallback to offline.html (except for dev) +if (process.env.MODE !== 'ssr' || process.env.PROD) { + registerRoute( + new NavigationRoute( + createHandlerBoundToURL(process.env.PWA_FALLBACK_HTML), + { denylist: [/sw\.js$/, /workbox-(.)*\.js$/] } + ) + ) +} diff --git a/frontend/src-pwa/manifest.json b/frontend/src-pwa/manifest.json new file mode 100644 index 0000000..8c7ca61 --- /dev/null +++ b/frontend/src-pwa/manifest.json @@ -0,0 +1,36 @@ +{ + "orientation": "portrait", + "background_color": "#ffffff", + "theme_color": "#027be3", + "icons": [ + { + "src": "icons/icon-64x64.png", + "sizes": "64x64", + "type": "image/png" + },{ + "src": "icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/icon-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/frontend/src-pwa/pwa-flag.d.ts b/frontend/src-pwa/pwa-flag.d.ts new file mode 100644 index 0000000..cda1c0e --- /dev/null +++ b/frontend/src-pwa/pwa-flag.d.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +// THIS FEATURE-FLAG FILE IS AUTOGENERATED, +// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING +import "quasar/dist/types/feature-flag"; + +declare module "quasar/dist/types/feature-flag" { + interface QuasarFeatureFlags { + pwa: true; + } +} diff --git a/frontend/src-pwa/register-service-worker.js b/frontend/src-pwa/register-service-worker.js new file mode 100644 index 0000000..c872c56 --- /dev/null +++ b/frontend/src-pwa/register-service-worker.js @@ -0,0 +1,41 @@ +import { register } from 'register-service-worker' + +// The ready(), registered(), cached(), updatefound() and updated() +// events passes a ServiceWorkerRegistration instance in their arguments. +// ServiceWorkerRegistration: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration + +register(process.env.SERVICE_WORKER_FILE, { + // The registrationOptions object will be passed as the second argument + // to ServiceWorkerContainer.register() + // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register#Parameter + + // registrationOptions: { scope: './' }, + + ready (/* registration */) { + // console.log('Service worker is active.') + }, + + registered (/* registration */) { + // console.log('Service worker has been registered.') + }, + + cached (/* registration */) { + // console.log('Content has been cached for offline use.') + }, + + updatefound (/* registration */) { + // console.log('New content is downloading.') + }, + + updated (/* registration */) { + // console.log('New content is available; please refresh.') + }, + + offline () { + // console.log('No internet connection found. App is running in offline mode.') + }, + + error (/* err */) { + // console.error('Error during service worker registration:', err) + } +}) diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..4011133 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,30 @@ + + + + + + + diff --git a/frontend/src/api/activity/activity.js b/frontend/src/api/activity/activity.js new file mode 100644 index 0000000..fafe3a0 --- /dev/null +++ b/frontend/src/api/activity/activity.js @@ -0,0 +1,72 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; + +const activityApi = { + list, add, getInfo, update, deleteActivity, getCurrent +} + +export default activityApi + +async function list(page, pageSize) { + const response = await client.get(apiUrls.activity.list, { + params: { + page: page, + pageSize: pageSize + } + }) + + return processResponse(response) +} + +async function getInfo(id) { + const response = await client.get(apiUrls.activity.info, { + params: {id: id} + }) + + return processResponse(response) +} + +async function add(data) { + const request = { + name: data.name, + term: data.term, + start: data.start, + end: data.end + } + + const response = await client.post(apiUrls.admin.activity.add, request) + + return processResponse(response) +} + +async function update(id, data) { + const request = { + name: data.name === '' ? undefined : data.name, + term: data.term === '' ? undefined : data.term, + start: data.start === '' ? undefined : data.start, + end: data.end === '' ? undefined : data.end + } + + const response = await client.post( + apiUrls.admin.activity.update, + request, { + params: {id: id} + }) + + return processResponse(response) +} + + +async function deleteActivity(id) { + const response = await client.post(apiUrls.admin.activity.delete, undefined, { + params: {id: id} + }) + + return processResponse(response) +} + + +async function getCurrent() { + const response = await client.get(apiUrls.activity.current) + return processResponse(response) +} diff --git a/frontend/src/api/api-urls.js b/frontend/src/api/api-urls.js new file mode 100644 index 0000000..f5c84cd --- /dev/null +++ b/frontend/src/api/api-urls.js @@ -0,0 +1,96 @@ +const apiUrls = { + auth: { + login: '/user/auth/login', + logout: '/user/auth/logout', + modifyPassword: '/user/auth/modify-password', + loginStatus: '/user/auth/check' + }, + user: { + info: '/user/info' + }, + admin: { + teacher: { + add: '/admin/user/teacher/add', + delete: '/admin/user/teacher/delete', + update: '/admin/user/teacher/update', + }, + course: { + add: '/admin/course/add', + delete: '/admin/course/delete', + update: '/admin/course/update', + }, + class: { + add: '/admin/course-schedule/add', + delete: '/admin/course-schedule/delete', + update: '/admin/course-schedule/update', + duplicate: '/admin/course-schedule/duplicate', + }, + major: { + add: '/admin/major/add', + delete: '/admin/major/delete', + update: '/admin/major/update', + }, + student: { + add: '/admin/user/student/add', + addWithAutoMajor: '/admin/user/student/add-with-auto-major', + delete: '/admin/user/student/delete', + update: '/admin/user/student/update', + }, + activity: { + add: '/admin/activity/add', + delete: '/admin/activity/delete', + update: '/admin/activity/update', + } + }, + course: { + list: '/course/list', + info: '/course/info', + }, + class: { + list: '/course-schedule/list', + info: '/course-schedule/info', + fromCourse: '/course-schedule/list-term', + studentList: '/course-schedule/list-student', + }, + major: { + list: '/major/list', + info: '/major/info', + }, + score: { + export: '/score/export', + }, + teacher: { + list: '/teacher/list', + info: '/teacher/info', + courseSchedule: { + list: '/teacher/course-schedule/my-class', + studentList: '/course-schedule/list-student' + }, + score: { + scheduleScore: '/teacher/score/list-students', + update: '/teacher/score/update', + } + }, + student: { + list: '/student/list', + info: '/student/info', + course: { + candidate: '/student/course/candidate', + selected: '/student/course-schedule/current', + select: '/student/course-schedule/select', + official: '/student/course-schedule/official', + }, + score: { + all: '/student/score/all' + } + }, + activity: { + current: '/activity/current', + list: '/activity/list', + info: '/activity/info', + } +} + +export { + apiUrls +} diff --git a/frontend/src/api/api.js b/frontend/src/api/api.js new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/api/auth/authApi.js b/frontend/src/api/auth/authApi.js new file mode 100644 index 0000000..f03b0ff --- /dev/null +++ b/frontend/src/api/auth/authApi.js @@ -0,0 +1,39 @@ +import {client, processResponse} from '../client' +import {apiUrls as api} from "src/api/api-urls"; +import qs from "qs"; + +const authApi = { + login, checkLoginStatus, logout, modifyPassword +} +async function login(username, password) { + const request = {username: username, password: password} + + // const response = await http.post(api.auth.login, qs.stringify(request)) + const response = await client.post(api.auth.login, request) + return processResponse(response) +} + +async function checkLoginStatus() { + const response = await client.get(api.auth.loginStatus) + return processResponse(response) + +} + +async function logout() { + const response = await client.get(api.auth.logout) + return processResponse(response) + +} + +async function modifyPassword(oldPassword, newPassword) { + const data = { + old: oldPassword, + new: newPassword + } + + const response = await client.post(api.auth.modifyPassword, qs.stringify(data)) + + return processResponse(response) +} + +export default authApi diff --git a/frontend/src/api/class/class.js b/frontend/src/api/class/class.js new file mode 100644 index 0000000..a2449dc --- /dev/null +++ b/frontend/src/api/class/class.js @@ -0,0 +1,74 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; +import qs from "qs"; + +const classApi = { + list, add, getInfo, update, duplicateClasses, deleteClass, getScheduleForCourse +} + +export default classApi + +async function list(courseId, page, pageSize) { + const response = await client.get(apiUrls.class.list, { + params: { + course: courseId, + page: page, + pageSize: pageSize + } + }) + + return processResponse(response) +} + +async function getInfo(id) { + const response = await client.get(apiUrls.class.info, { + params: {id: id} + }) + + return processResponse(response) +} + +async function add(data) { + const response = await client.post(apiUrls.admin.class.add, data) + + return processResponse(response) +} + +async function update(id, data) { + const response = await client.post( + apiUrls.admin.class.update, + data, { + params: {id: id} + }) + + return processResponse(response) +} + +async function deleteClass(id) { + const response = await client.post(apiUrls.admin.class.delete, undefined, { + params: {id: id} + }) + + return processResponse(response) +} + +async function duplicateClasses(id, source, target) { + const response = await client.post(apiUrls.admin.class.duplicate, qs.stringify({ + course: id, + from: source, + to: target + })) + + return processResponse(response) +} + +async function getScheduleForCourse(course, term) { + const response = await client.get(apiUrls.class.fromCourse, { + params: { + course: course, + term: term, + } + }) + + return processResponse(response) +} diff --git a/frontend/src/api/client.js b/frontend/src/api/client.js new file mode 100644 index 0000000..58a1d9b --- /dev/null +++ b/frontend/src/api/client.js @@ -0,0 +1,41 @@ +import axios from 'axios' +import {config as dev} from "app/env.dev"; +import {config as prod} from "app/env.prod"; +import axiosRetry from "axios-retry"; + +let baseUrl = '' + +const env = process.env.NODE_ENV; +console.info(env + " env") +switch (env) { + case 'production': + baseUrl = prod.baseUrl + break + default: + baseUrl = window.location.origin + "/api/v1" +} + +const client = axios.create({ + // headers: {}, + baseURL: baseUrl, + timeout: 8000, + withCredentials: true +}) + +axiosRetry(client, { + retries: 3, + shouldResetTimeout: true +}) + +function processResponse(response) { + const json = response.data + if (json.code !== 20000) { + throw {code: json.code, message: json.msg} + } + + return json.data +} + +export { + client, processResponse +} diff --git a/frontend/src/api/course/course.js b/frontend/src/api/course/course.js new file mode 100644 index 0000000..e286350 --- /dev/null +++ b/frontend/src/api/course/course.js @@ -0,0 +1,142 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; +import qs from "qs"; + +const courseApi = { + list, add, getInfo, update, deleteCourse, exportStudentExcel, + student: { + getCandidate, getSelected, getOfficial, select + }, + teacher: { + getTeacherCourseSchedule + } +} + +export default courseApi + +async function list(page, pageSize) { + const response = await client.get(apiUrls.course.list, { + params: { + page: page, + pageSize: pageSize + } + }) + + return processResponse(response) +} + +async function getInfo(id) { + const response = await client.get(apiUrls.course.info, { + params: {id: id} + }) + + return processResponse(response) +} + +async function add(data) { + const request = { + name: data.name === '' ? undefined : data.name, + courseHours: data.courseHours === '' ? undefined : data.courseHours, + targetMajor: data.targetMajor === '' ? undefined : data.targetMajor, + targetGrade: data.targetGrade === '' ? undefined : data.targetGrade, + springTerm: data.springTerm === '' ? undefined : data.springTerm, + } + + const response = await client.post(apiUrls.admin.course.add, request) + + return processResponse(response) +} + +async function update(id, data) { + const request = { + name: data.name === '' ? undefined : data.name, + courseHours: data.courseHours === '' ? undefined : data.courseHours, + targetMajor: data.targetMajor === '' ? undefined : data.targetMajor, + targetGrade: data.targetGrade === '' ? undefined : data.targetGrade, + springTerm: data.springTerm === '' ? undefined : data.springTerm, + } + + const response = await client.post( + apiUrls.admin.course.update, + request, { + params: {id: id} + }) + + return processResponse(response) +} + +async function deleteCourse(id) { + const response = await client.post(apiUrls.admin.course.delete, undefined, { + params: {id: id} + }) + + return processResponse(response) +} + +async function getCandidate() { + const response = await client.get(apiUrls.student.course.candidate) + return processResponse(response) +} + +async function getSelected(term) { + const response = await client.get(apiUrls.student.course.selected, { + params: { + term: term + } + }) + return processResponse(response) +} + +async function getOfficial(term) { + const response = await client.get(apiUrls.student.course.official, { + params: { + term: term + } + }) + + return processResponse(response) +} + +async function select(schedule, activity) { + const data = { + schedule: schedule, + activity: activity + } + const response = await client.post(apiUrls.student.course.select, qs.stringify(data)) + + return processResponse(response) +} + +async function getTeacherCourseSchedule(term) { + const response = await client.get(apiUrls.teacher.courseSchedule.list, { + params: { + term: term + } + }) + + return processResponse(response) +} + +async function exportStudentExcel(id, scheduleName) { + const response = await client.get(apiUrls.class.studentList, { + params: {id: id}, + responseType: "blob" + }) + + let data = response.data + + if (response.headers.getContentType() !== 'application/octet-stream' || data === undefined) { + return processResponse(response) + } + + const a = document.createElement('a') + a.style.display = 'none' + a.href = window.URL.createObjectURL(new Blob([data])) + a.setAttribute('download', `export_students_${scheduleName}_${id}.xlsx`) + document.body.appendChild(a) + a.click() + window.URL.revokeObjectURL(a.href) + document.body.removeChild(a) + + return undefined +} diff --git a/frontend/src/api/major/major.js b/frontend/src/api/major/major.js new file mode 100644 index 0000000..c589baa --- /dev/null +++ b/frontend/src/api/major/major.js @@ -0,0 +1,55 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; +import qs from "qs"; + +const majorManager = { + list, add, getInfo, update, deleteMajor +} + +export default majorManager + +async function list() { + const response = await client.get(apiUrls.major.list) + return processResponse(response) +} + +async function getInfo(id) { + const response = await client.get(apiUrls.major.info, { + params: {id: id} + }) + + return processResponse(response) +} + +async function add(data) { + const request = { + name: data + } + + const response = await client.post(apiUrls.admin.major.add, qs.stringify(request)) + + return processResponse(response) +} + +async function update(id, data) { + const request = { + name: data.name === '' ? undefined : data.name + } + + const response = await client.post( + apiUrls.admin.major.update, + qs.stringify(request), { + params: {id: id} + }) + + return processResponse(response) +} + + +async function deleteMajor(id) { + const response = await client.post(apiUrls.admin.major.delete, undefined, { + params: {id: id} + }) + + return processResponse(response) +} diff --git a/frontend/src/api/score/score.js b/frontend/src/api/score/score.js new file mode 100644 index 0000000..c6375ec --- /dev/null +++ b/frontend/src/api/score/score.js @@ -0,0 +1,65 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; +import qs from "qs"; + +const scoreApi = { + exportScoreExcel, + student: { + getStudentAllScore + }, + teacher: { + getScheduleStudentScore, updateScore + } +} + +export default scoreApi + +async function getStudentAllScore() { + const response = await client.get(apiUrls.student.score.all) + return processResponse(response) +} + +async function getScheduleStudentScore(id) { + const response = await client.get(apiUrls.teacher.score.scheduleScore, { + params: { + id: id + } + }) + + return processResponse(response) +} + +async function updateScore(schedule, scoreData) { + const response = await client.post(apiUrls.teacher.score.update, scoreData, { + params: { + schedule: schedule, + scoreId: scoreData.id, + } + }) + + return processResponse(response) +} + +async function exportScoreExcel(id, scheduleName) { + const response = await client.get(apiUrls.score.export, { + params: {id: id}, + responseType: "blob" + }) + + let data = response.data + + if (response.headers.getContentType() !== 'application/octet-stream' || data === undefined) { + return processResponse(response) + } + + const a = document.createElement('a') + a.style.display = 'none' + a.href = window.URL.createObjectURL(new Blob([data])) + a.setAttribute('download', `export_score_${scheduleName}_${id}.xlsx`) + document.body.appendChild(a) + a.click() + window.URL.revokeObjectURL(a.href) + document.body.removeChild(a) + + return undefined +} diff --git a/frontend/src/api/student/student.js b/frontend/src/api/student/student.js new file mode 100644 index 0000000..f7ba9dd --- /dev/null +++ b/frontend/src/api/student/student.js @@ -0,0 +1,76 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; + +const studentManager = { + list, add, getInfo, update, deleteStudent, addWithAutoMajor +} + +export default studentManager + +async function list(page, pageSize) { + const response = await client.get(apiUrls.student.list, { + params: { + page: page, + pageSize: pageSize + } + }) + + return processResponse(response) +} + +async function getInfo(id) { + const response = await client.get(apiUrls.student.info, { + params: {id: id} + }) + + return processResponse(response) +} + +async function add(data) { + const postData = { + "studentNumber": data.studentNumber, + "studentName": data.name, + "major": data.major + } + + const response = await client.post(apiUrls.admin.student.add, postData) + + return processResponse(response) +} + +async function addWithAutoMajor(data) { + const postData = { + "studentNumber": data.studentNumber, + "studentName": data.studentName, + "major": data.major + } + + const response = await client.post(apiUrls.admin.student.addWithAutoMajor, postData) + + return processResponse(response) +} + +async function update(id, studentName, username, initialPassword) { + const request = { + studentName: studentName === '' ? undefined : studentName, + username: username === '' ? undefined : username, + initialPassword: initialPassword === '' ? undefined : initialPassword + } + + const response = await client.post( + apiUrls.admin.student.update, + request, { + params: {id: id} + }) + + return processResponse(response) +} + + +async function deleteStudent(id) { + const response = await client.post(apiUrls.admin.student.delete, undefined, { + params: {id: id} + }) + + return processResponse(response) +} diff --git a/frontend/src/api/teacher/teacher.js b/frontend/src/api/teacher/teacher.js new file mode 100644 index 0000000..13066b7 --- /dev/null +++ b/frontend/src/api/teacher/teacher.js @@ -0,0 +1,64 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; + +const teacherManager = { + list, add, getInfo, update, deleteTeacher +} + +export default teacherManager + +async function list(page, pageSize) { + const response = await client.get(apiUrls.teacher.list, { + params: { + page: page, + pageSize: pageSize + } + }) + + return processResponse(response) +} + +async function getInfo(id) { + const response = await client.get(apiUrls.teacher.info, { + params: {id: id} + }) + + return processResponse(response) +} + +async function add(teacherName, username, initialPassword) { + const request = { + teacherName: teacherName === '' ? undefined : teacherName, + username: username === '' ? undefined : username, + initialPassword: initialPassword === '' ? undefined : initialPassword + } + + const response = await client.post(apiUrls.admin.teacher.add, request) + + return processResponse(response) +} + +async function update(id, teacherName, username, initialPassword) { + const request = { + teacherName: teacherName === '' ? undefined : teacherName, + username: username === '' ? undefined : username, + initialPassword: initialPassword === '' ? undefined : initialPassword + } + + const response = await client.post( + apiUrls.admin.teacher.update, + request, { + params: {id: id} + }) + + return processResponse(response) +} + + +async function deleteTeacher(id) { + const response = await client.post(apiUrls.admin.teacher.delete, undefined, { + params: {id: id} + }) + + return processResponse(response) +} diff --git a/frontend/src/api/user/user.js b/frontend/src/api/user/user.js new file mode 100644 index 0000000..2fb8aa9 --- /dev/null +++ b/frontend/src/api/user/user.js @@ -0,0 +1,20 @@ +import {client, processResponse} from '../client'; +import {apiUrls} from "app/src/api/api-urls"; +import qs from "qs"; + +const userApi = { + getInfo +} + +export default userApi + +async function getInfo(id, userType) { + const response = await client.get(apiUrls.user.info, { + params: { + uid: id, + userType: userType + } + }) + + return processResponse(response) +} diff --git a/frontend/src/assets/quasar-logo-vertical.svg b/frontend/src/assets/quasar-logo-vertical.svg new file mode 100644 index 0000000..8210831 --- /dev/null +++ b/frontend/src/assets/quasar-logo-vertical.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/boot/.gitkeep b/frontend/src/boot/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/component/AsideAvatar.vue b/frontend/src/component/AsideAvatar.vue new file mode 100644 index 0000000..06ff0b9 --- /dev/null +++ b/frontend/src/component/AsideAvatar.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/src/component/TitledDialog.vue b/frontend/src/component/TitledDialog.vue new file mode 100644 index 0000000..e94a474 --- /dev/null +++ b/frontend/src/component/TitledDialog.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/frontend/src/css/app.scss b/frontend/src/css/app.scss new file mode 100644 index 0000000..7733673 --- /dev/null +++ b/frontend/src/css/app.scss @@ -0,0 +1,47 @@ +// app global css in SCSS form +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + flex-direction: column; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +.mobile-column { + +} +.mobile-row { + +} + +@media not all and (max-width: 400px) { + .mobile-column { + flex-direction: column; + } + .mobile-row { + flex-direction: row; + } +} diff --git a/frontend/src/css/quasar.variables.scss b/frontend/src/css/quasar.variables.scss new file mode 100644 index 0000000..3996ce1 --- /dev/null +++ b/frontend/src/css/quasar.variables.scss @@ -0,0 +1,25 @@ +// Quasar SCSS (& Sass) Variables +// -------------------------------------------------- +// To customize the look and feel of this app, you can override +// the Sass/SCSS variables found in Quasar's source Sass/SCSS files. + +// Check documentation for full list of Quasar variables + +// Your own variables (that are declared here) and Quasar's own +// ones will be available out of the box in your .vue/.scss/.sass files + +// It's highly recommended to change the default colors +// to match your app's branding. +// Tip: Use the "Theme Builder" on Quasar's documentation website. + +$primary : #1976D2; +$secondary : #26A69A; +$accent : #9C27B0; + +$dark : #1D1D1D; +$dark-page : #121212; + +$positive : #21BA45; +$negative : #C10015; +$info : #31CCEC; +$warning : #F2C037; diff --git a/frontend/src/css/tailwind.css b/frontend/src/css/tailwind.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/frontend/src/css/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/frontend/src/pages/ErrorNotFound.vue b/frontend/src/pages/ErrorNotFound.vue new file mode 100644 index 0000000..2813c25 --- /dev/null +++ b/frontend/src/pages/ErrorNotFound.vue @@ -0,0 +1,27 @@ + + + diff --git a/frontend/src/pages/admin/activity/AdminActivityAddPane.vue b/frontend/src/pages/admin/activity/AdminActivityAddPane.vue new file mode 100644 index 0000000..a69a233 --- /dev/null +++ b/frontend/src/pages/admin/activity/AdminActivityAddPane.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/frontend/src/pages/admin/activity/AdminActivityEditPane.vue b/frontend/src/pages/admin/activity/AdminActivityEditPane.vue new file mode 100644 index 0000000..70350fb --- /dev/null +++ b/frontend/src/pages/admin/activity/AdminActivityEditPane.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/frontend/src/pages/admin/activity/AdminActivityPage.vue b/frontend/src/pages/admin/activity/AdminActivityPage.vue new file mode 100644 index 0000000..a228aa1 --- /dev/null +++ b/frontend/src/pages/admin/activity/AdminActivityPage.vue @@ -0,0 +1,321 @@ + + + + + + + diff --git a/frontend/src/pages/admin/class/AdminClassAddPane.vue b/frontend/src/pages/admin/class/AdminClassAddPane.vue new file mode 100644 index 0000000..0f0c782 --- /dev/null +++ b/frontend/src/pages/admin/class/AdminClassAddPane.vue @@ -0,0 +1,230 @@ + + + + + diff --git a/frontend/src/pages/admin/class/AdminClassDuplicatePane.vue b/frontend/src/pages/admin/class/AdminClassDuplicatePane.vue new file mode 100644 index 0000000..93a6f86 --- /dev/null +++ b/frontend/src/pages/admin/class/AdminClassDuplicatePane.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/frontend/src/pages/admin/class/AdminClassEditPane.vue b/frontend/src/pages/admin/class/AdminClassEditPane.vue new file mode 100644 index 0000000..63c3ec8 --- /dev/null +++ b/frontend/src/pages/admin/class/AdminClassEditPane.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/frontend/src/pages/admin/class/AdminClassPage.vue b/frontend/src/pages/admin/class/AdminClassPage.vue new file mode 100644 index 0000000..309fc74 --- /dev/null +++ b/frontend/src/pages/admin/class/AdminClassPage.vue @@ -0,0 +1,394 @@ + + + + + + + diff --git a/frontend/src/pages/admin/class/AdminClassTeacherSelectingPane.vue b/frontend/src/pages/admin/class/AdminClassTeacherSelectingPane.vue new file mode 100644 index 0000000..0f6c204 --- /dev/null +++ b/frontend/src/pages/admin/class/AdminClassTeacherSelectingPane.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/frontend/src/pages/admin/class/AdminTimeSelectView.vue b/frontend/src/pages/admin/class/AdminTimeSelectView.vue new file mode 100644 index 0000000..ee585a1 --- /dev/null +++ b/frontend/src/pages/admin/class/AdminTimeSelectView.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/frontend/src/pages/admin/course/AdminCourseAddPane.vue b/frontend/src/pages/admin/course/AdminCourseAddPane.vue new file mode 100644 index 0000000..fbb2f40 --- /dev/null +++ b/frontend/src/pages/admin/course/AdminCourseAddPane.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/frontend/src/pages/admin/course/AdminCourseEditPane.vue b/frontend/src/pages/admin/course/AdminCourseEditPane.vue new file mode 100644 index 0000000..7e0c557 --- /dev/null +++ b/frontend/src/pages/admin/course/AdminCourseEditPane.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/frontend/src/pages/admin/course/AdminCoursePage.vue b/frontend/src/pages/admin/course/AdminCoursePage.vue new file mode 100644 index 0000000..19e7e3a --- /dev/null +++ b/frontend/src/pages/admin/course/AdminCoursePage.vue @@ -0,0 +1,354 @@ + + + + + + + diff --git a/frontend/src/pages/admin/main/AdminMain.vue b/frontend/src/pages/admin/main/AdminMain.vue new file mode 100644 index 0000000..4a2c189 --- /dev/null +++ b/frontend/src/pages/admin/main/AdminMain.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/frontend/src/pages/admin/main/AdminUserinfoPane.vue b/frontend/src/pages/admin/main/AdminUserinfoPane.vue new file mode 100644 index 0000000..6d19e27 --- /dev/null +++ b/frontend/src/pages/admin/main/AdminUserinfoPane.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/frontend/src/pages/admin/student/AdminStudentAddPane.vue b/frontend/src/pages/admin/student/AdminStudentAddPane.vue new file mode 100644 index 0000000..31ea402 --- /dev/null +++ b/frontend/src/pages/admin/student/AdminStudentAddPane.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/frontend/src/pages/admin/student/AdminStudentEditPane.vue b/frontend/src/pages/admin/student/AdminStudentEditPane.vue new file mode 100644 index 0000000..3259602 --- /dev/null +++ b/frontend/src/pages/admin/student/AdminStudentEditPane.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/frontend/src/pages/admin/student/AdminStudentImportPane.vue b/frontend/src/pages/admin/student/AdminStudentImportPane.vue new file mode 100644 index 0000000..914c38c --- /dev/null +++ b/frontend/src/pages/admin/student/AdminStudentImportPane.vue @@ -0,0 +1,277 @@ + + + + + + + diff --git a/frontend/src/pages/admin/student/AdminStudentPage.vue b/frontend/src/pages/admin/student/AdminStudentPage.vue new file mode 100644 index 0000000..990f163 --- /dev/null +++ b/frontend/src/pages/admin/student/AdminStudentPage.vue @@ -0,0 +1,302 @@ + + + + + + + diff --git a/frontend/src/pages/admin/teacher/AdminTeacherAddPane.vue b/frontend/src/pages/admin/teacher/AdminTeacherAddPane.vue new file mode 100644 index 0000000..e9ccf46 --- /dev/null +++ b/frontend/src/pages/admin/teacher/AdminTeacherAddPane.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/frontend/src/pages/admin/teacher/AdminTeacherEditPane.vue b/frontend/src/pages/admin/teacher/AdminTeacherEditPane.vue new file mode 100644 index 0000000..3c18cc7 --- /dev/null +++ b/frontend/src/pages/admin/teacher/AdminTeacherEditPane.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/frontend/src/pages/admin/teacher/AdminTeacherPage.vue b/frontend/src/pages/admin/teacher/AdminTeacherPage.vue new file mode 100644 index 0000000..1609668 --- /dev/null +++ b/frontend/src/pages/admin/teacher/AdminTeacherPage.vue @@ -0,0 +1,287 @@ + + + + + + + diff --git a/frontend/src/pages/index/FooterInfo.vue b/frontend/src/pages/index/FooterInfo.vue new file mode 100644 index 0000000..245f9b1 --- /dev/null +++ b/frontend/src/pages/index/FooterInfo.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/frontend/src/pages/index/LoginCard.vue b/frontend/src/pages/index/LoginCard.vue new file mode 100644 index 0000000..f514781 --- /dev/null +++ b/frontend/src/pages/index/LoginCard.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/frontend/src/pages/index/LoginIndexPage.vue b/frontend/src/pages/index/LoginIndexPage.vue new file mode 100644 index 0000000..098d587 --- /dev/null +++ b/frontend/src/pages/index/LoginIndexPage.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/frontend/src/pages/student/course/StudentCandidateCourseListPage.vue b/frontend/src/pages/student/course/StudentCandidateCourseListPage.vue new file mode 100644 index 0000000..e4bffb1 --- /dev/null +++ b/frontend/src/pages/student/course/StudentCandidateCourseListPage.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/frontend/src/pages/student/course/StudentCourseCard.vue b/frontend/src/pages/student/course/StudentCourseCard.vue new file mode 100644 index 0000000..fe117f4 --- /dev/null +++ b/frontend/src/pages/student/course/StudentCourseCard.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/frontend/src/pages/student/course/StudentCourseSelectingnPage.vue b/frontend/src/pages/student/course/StudentCourseSelectingnPage.vue new file mode 100644 index 0000000..2863d95 --- /dev/null +++ b/frontend/src/pages/student/course/StudentCourseSelectingnPage.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/frontend/src/pages/student/course/view/StudentCourseSelectingConfirmPane.vue b/frontend/src/pages/student/course/view/StudentCourseSelectingConfirmPane.vue new file mode 100644 index 0000000..48ac77f --- /dev/null +++ b/frontend/src/pages/student/course/view/StudentCourseSelectingConfirmPane.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/frontend/src/pages/student/course/view/StudentCourseSelectingView.vue b/frontend/src/pages/student/course/view/StudentCourseSelectingView.vue new file mode 100644 index 0000000..f7f8e00 --- /dev/null +++ b/frontend/src/pages/student/course/view/StudentCourseSelectingView.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/frontend/src/pages/student/main/StudentMain.vue b/frontend/src/pages/student/main/StudentMain.vue new file mode 100644 index 0000000..d97c686 --- /dev/null +++ b/frontend/src/pages/student/main/StudentMain.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/frontend/src/pages/student/main/StudentUserinfoPane.vue b/frontend/src/pages/student/main/StudentUserinfoPane.vue new file mode 100644 index 0000000..f77f582 --- /dev/null +++ b/frontend/src/pages/student/main/StudentUserinfoPane.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/frontend/src/pages/student/schedule/StudentCourseTablePage.vue b/frontend/src/pages/student/schedule/StudentCourseTablePage.vue new file mode 100644 index 0000000..22f24d7 --- /dev/null +++ b/frontend/src/pages/student/schedule/StudentCourseTablePage.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/frontend/src/pages/student/schedule/StudentCourseTableView.vue b/frontend/src/pages/student/schedule/StudentCourseTableView.vue new file mode 100644 index 0000000..4363ab3 --- /dev/null +++ b/frontend/src/pages/student/schedule/StudentCourseTableView.vue @@ -0,0 +1,326 @@ + + + + + diff --git a/frontend/src/pages/student/score/StudentScorePage.vue b/frontend/src/pages/student/score/StudentScorePage.vue new file mode 100644 index 0000000..4e4c042 --- /dev/null +++ b/frontend/src/pages/student/score/StudentScorePage.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/frontend/src/pages/teacher/course/TeacherCourseCard.vue b/frontend/src/pages/teacher/course/TeacherCourseCard.vue new file mode 100644 index 0000000..a9334b1 --- /dev/null +++ b/frontend/src/pages/teacher/course/TeacherCourseCard.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/frontend/src/pages/teacher/course/TeacherCourseListPage.vue b/frontend/src/pages/teacher/course/TeacherCourseListPage.vue new file mode 100644 index 0000000..9c00b15 --- /dev/null +++ b/frontend/src/pages/teacher/course/TeacherCourseListPage.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/frontend/src/pages/teacher/course/TeacherCourseTableView.vue b/frontend/src/pages/teacher/course/TeacherCourseTableView.vue new file mode 100644 index 0000000..1ce333a --- /dev/null +++ b/frontend/src/pages/teacher/course/TeacherCourseTableView.vue @@ -0,0 +1,337 @@ + + + + + diff --git a/frontend/src/pages/teacher/info/TeacherInfoPage.vue b/frontend/src/pages/teacher/info/TeacherInfoPage.vue new file mode 100644 index 0000000..e86444c --- /dev/null +++ b/frontend/src/pages/teacher/info/TeacherInfoPage.vue @@ -0,0 +1,76 @@ + + + + + + + diff --git a/frontend/src/pages/teacher/main/TeacherMain.vue b/frontend/src/pages/teacher/main/TeacherMain.vue new file mode 100644 index 0000000..368e17a --- /dev/null +++ b/frontend/src/pages/teacher/main/TeacherMain.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/frontend/src/pages/teacher/main/TeacherUserinfoPane.vue b/frontend/src/pages/teacher/main/TeacherUserinfoPane.vue new file mode 100644 index 0000000..4c75e74 --- /dev/null +++ b/frontend/src/pages/teacher/main/TeacherUserinfoPane.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/frontend/src/pages/teacher/score/TeacherClassStudentScorePage.vue b/frontend/src/pages/teacher/score/TeacherClassStudentScorePage.vue new file mode 100644 index 0000000..f7b771e --- /dev/null +++ b/frontend/src/pages/teacher/score/TeacherClassStudentScorePage.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/frontend/src/pages/teacher/score/TeacherScoreImportPane.vue b/frontend/src/pages/teacher/score/TeacherScoreImportPane.vue new file mode 100644 index 0000000..e5a788a --- /dev/null +++ b/frontend/src/pages/teacher/score/TeacherScoreImportPane.vue @@ -0,0 +1,318 @@ + + + + + + + diff --git a/frontend/src/pages/teacher/score/TeacherScorePage.vue b/frontend/src/pages/teacher/score/TeacherScorePage.vue new file mode 100644 index 0000000..05bbde0 --- /dev/null +++ b/frontend/src/pages/teacher/score/TeacherScorePage.vue @@ -0,0 +1,170 @@ + + + + + + + diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100644 index 0000000..42084af --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,25 @@ +import {route} from 'quasar/wrappers' +import {createMemoryHistory, createRouter, createWebHashHistory, createWebHistory} from 'vue-router' +import routes from './routes' + +/* + * If not building with SSR mode, you can + * directly export the Router instantiation; + * + * The function below can be async too; either use + * async/await or return a Promise which resolves + * with the Router instance. + */ + +export default route(function (/* { store, ssrContext } */) { + + return createRouter({ + scrollBehavior: () => ({left: 0, top: 0}), + routes, + + // Leave this as is and make changes in quasar.conf.js instead! + // quasar.conf.js -> build -> vueRouterMode + // quasar.conf.js -> build -> publicPath + history: createWebHistory(process.env.VUE_ROUTER_BASE) + }) +}) diff --git a/frontend/src/router/routes.js b/frontend/src/router/routes.js new file mode 100644 index 0000000..c76860f --- /dev/null +++ b/frontend/src/router/routes.js @@ -0,0 +1,76 @@ +import LoginIndexPage from "pages/index/LoginIndexPage.vue"; + +import StudentMain from "pages/student/main/StudentMain.vue"; +import StudentCandidateCourseListPage from "pages/student/course/StudentCandidateCourseListPage.vue"; +import StudentCourseTablePage from "pages/student/schedule/StudentCourseTablePage.vue"; +import StudentScorePage from "pages/student/score/StudentScorePage.vue"; + +import TeacherMain from "pages/teacher/main/TeacherMain.vue"; +import TeacherCourseListPage from "pages/teacher/course/TeacherCourseListPage.vue"; +import TeacherScorePage from "pages/teacher/score/TeacherScorePage.vue"; + +import AdminMain from "pages/admin/main/AdminMain.vue"; +import AdminCoursePage from "pages/admin/course/AdminCoursePage.vue"; +import AdminClassPage from "pages/admin/class/AdminClassPage.vue"; +import AdminActivityPage from "pages/admin/activity/AdminActivityPage.vue"; +import AdminStudentPage from "pages/admin/student/AdminStudentPage.vue"; +import AdminTeacherPage from "pages/admin/teacher/AdminTeacherPage.vue"; +import StudentCourseSelectingPage from "pages/student/course/StudentCourseSelectingnPage.vue"; +import TeacherClassStudentScorePage from "pages/teacher/score/TeacherClassStudentScorePage.vue"; + +const studentRouter = { + path: 'student', components: { + root: StudentMain + }, children: [{ + path: 'course-selecting', component: StudentCandidateCourseListPage, + }, { + path: 'course-selecting/select/:id(\\d+)?', component: StudentCourseSelectingPage, + }/*, { + path: 'course-selecting2', component: StudentCandidateCourseListPage2, + }*/, { + path: 'course-table', component: StudentCourseTablePage + }, { + path: 'score', component: StudentScorePage + }] +} + +const teacherRouter = { + path: 'teacher', components: { + root: TeacherMain + }, children: [{ + path: 'courses', component: TeacherCourseListPage + }, { + path: 'score', component: TeacherScorePage + }, { + path: 'score/view/:id(\\d+)?', component: TeacherClassStudentScorePage + }] +} + +const adminRouter = { + path: 'admin', components: { + root: AdminMain + }, children: [ + { + path: 'course', component: AdminCoursePage + },{ + path: 'schedule/:id(\\d+)?', component: AdminClassPage + },{ + path: 'activity', component: AdminActivityPage + },{ + path: 'user-teacher', component: AdminTeacherPage + },{ + path: 'user-student', component: AdminStudentPage + }, + ] +} + +export default [{ + path: '/', // component: LoginIndexPage, + children: [{ + path: '/', components: { + root: LoginIndexPage + } + }, studentRouter, teacherRouter, adminRouter] +}, { + path: '/:catchAll(.*)*', component: () => import('pages/ErrorNotFound.vue') +}] diff --git a/frontend/src/stores/index.js b/frontend/src/stores/index.js new file mode 100644 index 0000000..ca5bee5 --- /dev/null +++ b/frontend/src/stores/index.js @@ -0,0 +1,20 @@ +import { store } from 'quasar/wrappers' +import { createPinia } from 'pinia' + +/* + * If not building with SSR mode, you can + * directly export the Store instantiation; + * + * The function below can be async too; either use + * async/await or return a Promise which resolves + * with the Store instance. + */ + +export default store((/* { ssrContext } */) => { + const pinia = createPinia() + + // You can add Pinia plugins here + // pinia.use(SomePiniaPlugin) + + return pinia +}) diff --git a/frontend/src/stores/majors.js b/frontend/src/stores/majors.js new file mode 100644 index 0000000..68be061 --- /dev/null +++ b/frontend/src/stores/majors.js @@ -0,0 +1,25 @@ +import { defineStore } from 'pinia' +import {computed, ref} from "vue"; +import majorManager from "app/src/api/major/major"; + +export const useMajorsStore = defineStore('majors', () => { + const majorsData = ref([]) + + function refreshMajors() { + majorManager.list() + .then(data => { + majorsData.value = data.result + }) + .catch(e => console.warn(e)) + } + + const majors = computed(() => { + if (majorsData.value === undefined || majorsData.value.length === 0) { + refreshMajors() + } + + return majorsData + }) + + return {majors, refreshMajors} +}) diff --git a/frontend/src/stores/store-flag.d.ts b/frontend/src/stores/store-flag.d.ts new file mode 100644 index 0000000..7677175 --- /dev/null +++ b/frontend/src/stores/store-flag.d.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +// THIS FEATURE-FLAG FILE IS AUTOGENERATED, +// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING +import "quasar/dist/types/feature-flag"; + +declare module "quasar/dist/types/feature-flag" { + interface QuasarFeatureFlags { + store: true; + } +} diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..b19dc4f --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} + diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..c40aa3c --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + plugins: [vue()], +}) diff --git a/frontend/yarn.lock b/frontend/yarn.lock new file mode 100644 index 0000000..e712658 --- /dev/null +++ b/frontend/yarn.lock @@ -0,0 +1,5092 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://mirrors.cloud.tencent.com/npm/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adobe/css-tools@~4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.2.0.tgz" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.npmmirror.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": + version "7.22.13" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.9.tgz" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.22.11.tgz" + integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.11" + "@babel/parser" "^7.22.11" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.22.10": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.10.tgz" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== + dependencies: + "@babel/types" "^7.22.10" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz" + integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== + dependencies: + "@babel/types" "^7.22.10" + +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz" + integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz" + integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.9" + resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.9": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.10" + +"@babel/helpers@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.11.tgz" + integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" + +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.13.tgz" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.20.15", "@babel/parser@^7.21.3", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5": + version "7.22.14" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.14.tgz" + integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz" + integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.10": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz" + integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.10": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz" + integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz" + integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== + dependencies: + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz" + integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz" + integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.11.0": + version "7.22.14" + resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.22.14.tgz" + integrity sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.11" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.10" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.10" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.11" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.11" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.12" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.11" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.15.4", "@babel/runtime@^7.8.4": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.11.tgz" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.22.5.tgz" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.11": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.11.tgz" + integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== + dependencies: + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.11" + "@babel/types" "^7.22.11" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.11" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.22.11.tgz" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://mirrors.cloud.tencent.com/npm/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.6.2" + resolved "https://mirrors.cloud.tencent.com/npm/@eslint-community/regexpp/-/regexpp-4.6.2.tgz" + integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.48.0": + version "8.48.0" + resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.48.0.tgz" + integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://mirrors.cloud.tencent.com/npm/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://mirrors.cloud.tencent.com/npm/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://mirrors.cloud.tencent.com/npm/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://mirrors.cloud.tencent.com/npm/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@quasar/app-vite@^1.5.0": + version "1.5.0" + resolved "https://registry.npmmirror.com/@quasar/app-vite/-/app-vite-1.5.0.tgz" + integrity sha512-iopq5UFtXHXrSlPoWj3dmlpnQ79c/dc5FCspAr07V3bLbICNTOEAPzxTuxja8W/bGXGBkQp2IY7k86W3iNuOVw== + dependencies: + "@quasar/render-ssr-error" "^1.0.1" + "@quasar/vite-plugin" "^1.3.3" + "@rollup/pluginutils" "^4.1.2" + "@types/chrome" "^0.0.208" + "@types/compression" "^1.7.2" + "@types/cordova" "0.0.34" + "@types/express" "^4.17.13" + "@vitejs/plugin-vue" "^2.2.0" + archiver "^5.3.0" + chokidar "^3.5.3" + ci-info "^3.7.1" + compression "^1.7.4" + cross-spawn "^7.0.3" + dot-prop "6.0.1" + elementtree "0.1.7" + esbuild "0.14.51" + express "^4.17.3" + fast-glob "3.2.12" + fs-extra "^11.1.0" + html-minifier "^4.0.0" + inquirer "^8.2.1" + isbinaryfile "^5.0.0" + kolorist "^1.5.1" + lodash "^4.17.21" + minimist "^1.2.6" + open "^8.4.0" + register-service-worker "^1.7.2" + rollup-plugin-visualizer "^5.5.4" + sass "1.32.12" + semver "^7.3.5" + serialize-javascript "^6.0.0" + table "^6.8.0" + vite "^2.9.13" + webpack-merge "^5.8.0" + +"@quasar/extras@^1.16.6": + version "1.16.6" + resolved "https://registry.npmmirror.com/@quasar/extras/-/extras-1.16.6.tgz" + integrity sha512-yHvp2Z73LuS29fhjE+dSzUvEKGCuTTy+WGIsAYxbnhBVW2rTYlYmFQfGdOPdzNreHZh+G/1D56n0Q6ClZxJHKg== + +"@quasar/quasar-app-extension-qcalendar@^4.0.0-beta.16": + version "4.0.0-beta.16" + resolved "https://registry.npmmirror.com/@quasar/quasar-app-extension-qcalendar/-/quasar-app-extension-qcalendar-4.0.0-beta.16.tgz" + integrity sha512-Rj3KKjPFrE13cswlZAPcqdqi1YH9CeHMpWIw8xsNqdLhCoaRhMGbRas9fvHFLJOXpnsDaVwWINNgN/bBUyn99w== + dependencies: + "@quasar/quasar-ui-qcalendar" "^4.0.0-beta.16" + +"@quasar/quasar-ui-qcalendar@^4.0.0-beta.16": + version "4.0.0-beta.16" + resolved "https://mirrors.cloud.tencent.com/npm/@quasar/quasar-ui-qcalendar/-/quasar-ui-qcalendar-4.0.0-beta.16.tgz" + integrity sha512-KVbFJD1HQp91tiklv+6XsG7bq8FKK6mhhnoVzmjgoyhUAEb9csfbDPbpegy1/FzXy3o0wITe6mmRZ8nbaiMEZg== + +"@quasar/render-ssr-error@^1.0.1": + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/@quasar/render-ssr-error/-/render-ssr-error-1.0.2.tgz" + integrity sha512-Y0wyqYHVxc1IOBH6pRiKMSWDqO1mwQu11Zo8rw4cBdclPOQqFb7f65UuRbk5LfbqlXV2hYvklNcy0SBAOiAQnw== + dependencies: + stack-trace "^1.0.0-pre2" + +"@quasar/vite-plugin@^1.3.3", "@quasar/vite-plugin@^1.4.1": + version "1.4.1" + resolved "https://mirrors.cloud.tencent.com/npm/@quasar/vite-plugin/-/vite-plugin-1.4.1.tgz" + integrity sha512-lLw7j1A7viLQ6++p29NuYUdfjpaWctRi6tRhMYm8VPumXs8enGeV59JEJ+1tJR2FcQUMYsGOoyHHcQrsakXIkA== + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.npmmirror.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^4.1.2": + version "4.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://mirrors.cloud.tencent.com/npm/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/chrome@^0.0.208": + version "0.0.208" + resolved "https://mirrors.cloud.tencent.com/npm/@types/chrome/-/chrome-0.0.208.tgz" + integrity sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + +"@types/compression@^1.7.2": + version "1.7.2" + resolved "https://mirrors.cloud.tencent.com/npm/@types/compression/-/compression-1.7.2.tgz" + integrity sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg== + dependencies: + "@types/express" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://mirrors.cloud.tencent.com/npm/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cordova@0.0.34": + version "0.0.34" + resolved "https://mirrors.cloud.tencent.com/npm/@types/cordova/-/cordova-0.0.34.tgz" + integrity sha1-6nrd907Ow9dimCegw54smt3HPQQ= + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://mirrors.cloud.tencent.com/npm/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://mirrors.cloud.tencent.com/npm/@types/express/-/express-4.17.17.tgz" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/filesystem@*": + version "0.0.32" + resolved "https://mirrors.cloud.tencent.com/npm/@types/filesystem/-/filesystem-0.0.32.tgz" + integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.29" + resolved "https://mirrors.cloud.tencent.com/npm/@types/filewriter/-/filewriter-0.0.29.tgz" + integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== + +"@types/har-format@*": + version "1.2.11" + resolved "https://mirrors.cloud.tencent.com/npm/@types/har-format/-/har-format-1.2.11.tgz" + integrity sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ== + +"@types/http-errors@*": + version "2.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/@types/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/mime@^1": + version "1.3.2" + resolved "https://mirrors.cloud.tencent.com/npm/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*": + version "20.4.5" + resolved "https://mirrors.cloud.tencent.com/npm/@types/node/-/node-20.4.5.tgz" + integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg== + +"@types/qs@*": + version "6.9.7" + resolved "https://mirrors.cloud.tencent.com/npm/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://mirrors.cloud.tencent.com/npm/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/send@*": + version "0.17.1" + resolved "https://mirrors.cloud.tencent.com/npm/@types/send/-/send-0.17.1.tgz" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.2" + resolved "https://mirrors.cloud.tencent.com/npm/@types/serve-static/-/serve-static-1.15.2.tgz" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.3" + resolved "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.3.tgz" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + +"@vitejs/plugin-vue@^2.0.0 || ^3.0.0 || ^4.0.0", "@vitejs/plugin-vue@^2.2.0": + version "2.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz" + integrity sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg== + +"@vue/compiler-core@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/compiler-core/-/compiler-core-3.3.4.tgz" + integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== + dependencies: + "@babel/parser" "^7.21.3" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + source-map-js "^1.0.2" + +"@vue/compiler-dom@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz" + integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== + dependencies: + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/compiler-sfc@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz" + integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-ssr" "3.3.4" + "@vue/reactivity-transform" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + postcss "^8.1.10" + source-map-js "^1.0.2" + +"@vue/compiler-ssr@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz" + integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/devtools-api@^6.5.0": + version "6.5.0" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/devtools-api/-/devtools-api-6.5.0.tgz" + integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== + +"@vue/reactivity-transform@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz" + integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + +"@vue/reactivity@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/reactivity/-/reactivity-3.3.4.tgz" + integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== + dependencies: + "@vue/shared" "3.3.4" + +"@vue/runtime-core@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/runtime-core/-/runtime-core-3.3.4.tgz" + integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== + dependencies: + "@vue/reactivity" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/runtime-dom@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz" + integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== + dependencies: + "@vue/runtime-core" "3.3.4" + "@vue/shared" "3.3.4" + csstype "^3.1.1" + +"@vue/server-renderer@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/server-renderer/-/server-renderer-3.3.4.tgz" + integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== + dependencies: + "@vue/compiler-ssr" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/shared@3.3.4": + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/@vue/shared/-/shared-3.3.4.tgz" + integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== + +accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://mirrors.cloud.tencent.com/npm/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://mirrors.cloud.tencent.com/npm/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://mirrors.cloud.tencent.com/npm/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.12.0" + resolved "https://mirrors.cloud.tencent.com/npm/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.6.0, ajv@>=8: + version "8.12.0" + resolved "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://mirrors.cloud.tencent.com/npm/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/any-promise/-/any-promise-1.3.0.tgz" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://mirrors.cloud.tencent.com/npm/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +archiver-utils@^2.1.0: + version "2.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/archiver-utils/-/archiver-utils-2.1.0.tgz" + integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== + dependencies: + glob "^7.1.4" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^2.0.0" + +archiver@^5.3.0: + version "5.3.1" + resolved "https://mirrors.cloud.tencent.com/npm/archiver/-/archiver-5.3.1.tgz" + integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w== + dependencies: + archiver-utils "^2.1.0" + async "^3.2.3" + buffer-crc32 "^0.2.1" + readable-stream "^3.6.0" + readdir-glob "^1.0.0" + tar-stream "^2.2.0" + zip-stream "^4.1.0" + +arg@^5.0.2: + version "5.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.3: + version "3.2.4" + resolved "https://mirrors.cloud.tencent.com/npm/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://mirrors.cloud.tencent.com/npm/asynckit/-/asynckit-0.4.0.tgz" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.15: + version "10.4.15" + resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.15.tgz" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios-retry@^3.7.0: + version "3.7.0" + resolved "https://registry.npmmirror.com/axios-retry/-/axios-retry-3.7.0.tgz" + integrity sha512-ZTnCkJbRtfScvwiRnoVskFAfvU0UG3xNcsjwTR0mawSbIJoothxn67gKsMaNAFHRXJ1RmuLhmZBzvyXi3+9WyQ== + dependencies: + "@babel/runtime" "^7.15.4" + is-retry-allowed "^2.2.0" + +axios@^1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/axios/-/axios-1.5.0.tgz" + integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://mirrors.cloud.tencent.com/npm/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.20.1: + version "1.20.1" + resolved "https://mirrors.cloud.tencent.com/npm/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/boolbase/-/boolbase-1.0.0.tgz" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://mirrors.cloud.tencent.com/npm/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.10, browserslist@^4.21.9, "browserslist@>= 4.21.0": + version "4.21.10" + resolved "https://mirrors.cloud.tencent.com/npm/browserslist/-/browserslist-4.21.10.tgz" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: + version "0.2.13" + resolved "https://mirrors.cloud.tencent.com/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://mirrors.cloud.tencent.com/npm/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/bytes/-/bytes-3.0.0.tgz" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.2: + version "3.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/camel-case/-/camel-case-3.0.0.tgz" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: + version "1.0.30001525" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz" + integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://mirrors.cloud.tencent.com/npm/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://mirrors.cloud.tencent.com/npm/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^3.7.1: + version "3.8.0" + resolved "https://mirrors.cloud.tencent.com/npm/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +clean-css@^4.2.1: + version "4.2.4" + resolved "https://mirrors.cloud.tencent.com/npm/clean-css/-/clean-css-4.2.4.tgz" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== + dependencies: + source-map "~0.6.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://mirrors.cloud.tencent.com/npm/cli-spinners/-/cli-spinners-2.9.0.tgz" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://mirrors.cloud.tencent.com/npm/clone/-/clone-1.0.4.tgz" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://mirrors.cloud.tencent.com/npm/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://mirrors.cloud.tencent.com/npm/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://mirrors.cloud.tencent.com/npm/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +compress-commons@^4.1.0: + version "4.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/compress-commons/-/compress-commons-4.1.1.tgz" + integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== + dependencies: + buffer-crc32 "^0.2.13" + crc32-stream "^4.0.2" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://mirrors.cloud.tencent.com/npm/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://mirrors.cloud.tencent.com/npm/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://mirrors.cloud.tencent.com/npm/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://mirrors.cloud.tencent.com/npm/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://mirrors.cloud.tencent.com/npm/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.5.0: + version "0.5.0" + resolved "https://mirrors.cloud.tencent.com/npm/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-js-compat@^3.31.0: + version "3.32.1" + resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.32.1.tgz" + integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== + dependencies: + browserslist "^4.21.10" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://mirrors.cloud.tencent.com/npm/crc-32/-/crc-32-1.2.2.tgz" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +crc32-stream@^4.0.2: + version "4.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/crc32-stream/-/crc32-stream-4.0.2.tgz" + integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.1.1: + version "3.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +dayjs@^1.11.9: + version "1.11.9" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.1.1: + version "4.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.2: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.4: + version "4.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://mirrors.cloud.tencent.com/npm/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://mirrors.cloud.tencent.com/npm/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://mirrors.cloud.tencent.com/npm/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://mirrors.cloud.tencent.com/npm/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://mirrors.cloud.tencent.com/npm/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-prop@6.0.1: + version "6.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/dot-prop/-/dot-prop-6.0.1.tgz" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^3.1.6: + version "3.1.9" + resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.477: + version "1.4.480" + resolved "https://mirrors.cloud.tencent.com/npm/electron-to-chromium/-/electron-to-chromium-1.4.480.tgz" + integrity sha512-IXTgg+bITkQv/FLP9FjX6f9KFCs5hQWeh5uNSKxB9mqYj/JXhHDbu+ekS43LVvbkL3eW6/oZy4+r9Om6lan1Uw== + +elementtree@0.1.7: + version "0.1.7" + resolved "https://mirrors.cloud.tencent.com/npm/elementtree/-/elementtree-0.1.7.tgz" + integrity sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA= + dependencies: + sax "1.1.4" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://mirrors.cloud.tencent.com/npm/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.1.tgz" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild-windows-64@0.14.51: + version "0.14.51" + resolved "https://mirrors.cloud.tencent.com/npm/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz" + integrity sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://mirrors.cloud.tencent.com/npm/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild@^0.14.27: + version "0.14.54" + resolved "https://mirrors.cloud.tencent.com/npm/esbuild/-/esbuild-0.14.54.tgz" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" + +esbuild@0.14.51: + version "0.14.51" + resolved "https://mirrors.cloud.tencent.com/npm/esbuild/-/esbuild-0.14.51.tgz" + integrity sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw== + optionalDependencies: + esbuild-android-64 "0.14.51" + esbuild-android-arm64 "0.14.51" + esbuild-darwin-64 "0.14.51" + esbuild-darwin-arm64 "0.14.51" + esbuild-freebsd-64 "0.14.51" + esbuild-freebsd-arm64 "0.14.51" + esbuild-linux-32 "0.14.51" + esbuild-linux-64 "0.14.51" + esbuild-linux-arm "0.14.51" + esbuild-linux-arm64 "0.14.51" + esbuild-linux-mips64le "0.14.51" + esbuild-linux-ppc64le "0.14.51" + esbuild-linux-riscv64 "0.14.51" + esbuild-linux-s390x "0.14.51" + esbuild-netbsd-64 "0.14.51" + esbuild-openbsd-64 "0.14.51" + esbuild-sunos-64 "0.14.51" + esbuild-windows-32 "0.14.51" + esbuild-windows-64 "0.14.51" + esbuild-windows-arm64 "0.14.51" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^9.0.0: + version "9.0.0" + resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz" + integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== + +eslint-plugin-vue@^9.17.0: + version "9.17.0" + resolved "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz" + integrity sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + natural-compare "^1.4.0" + nth-check "^2.1.1" + postcss-selector-parser "^6.0.13" + semver "^7.5.4" + vue-eslint-parser "^9.3.1" + xml-name-validator "^4.0.0" + +eslint-scope@^7.1.1, eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://mirrors.cloud.tencent.com/npm/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", eslint@^8.11.0, eslint@^8.48.0, eslint@>=6.0.0, eslint@>=7.0.0: + version "8.48.0" + resolved "https://registry.npmmirror.com/eslint/-/eslint-8.48.0.tgz" + integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.48.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.3.1, espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://mirrors.cloud.tencent.com/npm/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.0, esquery@^1.4.2: + version "1.5.0" + resolved "https://mirrors.cloud.tencent.com/npm/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1, estree-walker@^2.0.2: + version "2.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://mirrors.cloud.tencent.com/npm/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +express@^4.17.3: + version "4.18.2" + resolved "https://mirrors.cloud.tencent.com/npm/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://mirrors.cloud.tencent.com/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.12: + version "3.3.1" + resolved "https://mirrors.cloud.tencent.com/npm/fast-glob/-/fast-glob-3.3.1.tgz" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@3.2.12: + version "3.2.12" + resolved "https://mirrors.cloud.tencent.com/npm/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://mirrors.cloud.tencent.com/npm/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.15.0" + resolved "https://mirrors.cloud.tencent.com/npm/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +figures@^3.0.0: + version "3.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://mirrors.cloud.tencent.com/npm/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://mirrors.cloud.tencent.com/npm/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://mirrors.cloud.tencent.com/npm/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://mirrors.cloud.tencent.com/npm/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^11.1.0: + version "11.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/fs-extra/-/fs-extra-11.1.1.tgz" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.6" + resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://mirrors.cloud.tencent.com/npm/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://mirrors.cloud.tencent.com/npm/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.6: + version "7.1.6" + resolved "https://mirrors.cloud.tencent.com/npm/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.21.0" + resolved "https://registry.npmmirror.com/globals/-/globals-13.21.0.tgz" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://mirrors.cloud.tencent.com/npm/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://mirrors.cloud.tencent.com/npm/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +html-minifier@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/html-minifier/-/html-minifier-4.0.0.tgz" + integrity sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^2.19.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + uglify-js "^3.5.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@^0.4.24, iconv-lite@0.4.24: + version "0.4.24" + resolved "https://mirrors.cloud.tencent.com/npm/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://mirrors.cloud.tencent.com/npm/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://mirrors.cloud.tencent.com/npm/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://mirrors.cloud.tencent.com/npm/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^8.2.1: + version "8.2.5" + resolved "https://mirrors.cloud.tencent.com/npm/inquirer/-/inquirer-8.2.5.tgz" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://mirrors.cloud.tencent.com/npm/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.12.0: + version "2.12.1" + resolved "https://mirrors.cloud.tencent.com/npm/is-core-module/-/is-core-module-2.12.1.tgz" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://mirrors.cloud.tencent.com/npm/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^5.0.0: + version "5.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/isbinaryfile/-/isbinaryfile-5.0.0.tgz" + integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jiti@^1.18.2: + version "1.19.1" + resolved "https://mirrors.cloud.tencent.com/npm/jiti/-/jiti-1.19.1.tgz" + integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^2.2.0, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.1.tgz" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://mirrors.cloud.tencent.com/npm/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kolorist@^1.5.1: + version "1.8.0" + resolved "https://mirrors.cloud.tencent.com/npm/kolorist/-/kolorist-1.8.0.tgz" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +lazystream@^1.0.0: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/lazystream/-/lazystream-1.0.1.tgz" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== + dependencies: + readable-stream "^2.0.5" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://mirrors.cloud.tencent.com/npm/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://mirrors.cloud.tencent.com/npm/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/lodash.defaults/-/lodash.defaults-4.2.0.tgz" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://mirrors.cloud.tencent.com/npm/lodash.difference/-/lodash.difference-4.5.0.tgz" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://mirrors.cloud.tencent.com/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://mirrors.cloud.tencent.com/npm/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://mirrors.cloud.tencent.com/npm/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://mirrors.cloud.tencent.com/npm/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://mirrors.cloud.tencent.com/npm/lodash.union/-/lodash.union-4.6.0.tgz" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + +lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://mirrors.cloud.tencent.com/npm/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://mirrors.cloud.tencent.com/npm/lower-case/-/lower-case-1.1.4.tgz" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.0: + version "0.25.9" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.30.0: + version "0.30.2" + resolved "https://mirrors.cloud.tencent.com/npm/magic-string/-/magic-string-0.30.2.tgz" + integrity sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://mirrors.cloud.tencent.com/npm/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://mirrors.cloud.tencent.com/npm/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: + version "1.52.0" + resolved "https://mirrors.cloud.tencent.com/npm/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://mirrors.cloud.tencent.com/npm/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://mirrors.cloud.tencent.com/npm/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^5.1.0: + version "5.1.6" + resolved "https://mirrors.cloud.tencent.com/npm/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://mirrors.cloud.tencent.com/npm/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://mirrors.cloud.tencent.com/npm/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://mirrors.cloud.tencent.com/npm/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://mirrors.cloud.tencent.com/npm/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://mirrors.cloud.tencent.com/npm/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://mirrors.cloud.tencent.com/npm/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.3: + version "0.6.3" + resolved "https://mirrors.cloud.tencent.com/npm/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://mirrors.cloud.tencent.com/npm/no-case/-/no-case-2.3.2.tgz" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://mirrors.cloud.tencent.com/npm/node-releases/-/node-releases-2.0.13.tgz" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +nth-check@^2.1.1: + version "2.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://mirrors.cloud.tencent.com/npm/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://mirrors.cloud.tencent.com/npm/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://mirrors.cloud.tencent.com/npm/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.4.0: + version "8.4.2" + resolved "https://mirrors.cloud.tencent.com/npm/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://mirrors.cloud.tencent.com/npm/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://mirrors.cloud.tencent.com/npm/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +param-case@^2.1.1: + version "2.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/param-case/-/param-case-2.1.1.tgz" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://mirrors.cloud.tencent.com/npm/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://mirrors.cloud.tencent.com/npm/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://mirrors.cloud.tencent.com/npm/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://mirrors.cloud.tencent.com/npm/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/pify/-/pify-2.3.0.tgz" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pinia@^2.0.0, pinia@^2.1.6: + version "2.1.6" + resolved "https://registry.npmmirror.com/pinia/-/pinia-2.1.6.tgz" + integrity sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ== + dependencies: + "@vue/devtools-api" "^6.5.0" + vue-demi ">=0.14.5" + +pirates@^4.0.1: + version "4.0.6" + resolved "https://mirrors.cloud.tencent.com/npm/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-import/-/postcss-import-15.1.0.tgz" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-js/-/postcss-js-4.0.1.tgz" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-load-config/-/postcss-load-config-4.0.1.tgz" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-nested/-/postcss-nested-6.0.1.tgz" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.13: + version "6.0.13" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.0.0, postcss@^8.1.0, postcss@^8.1.10, postcss@^8.2.14, postcss@^8.4.13, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.29, postcss@>=8.0.9: + version "8.4.29" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.29.tgz" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/prettier/-/prettier-3.0.3.tgz" + integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://mirrors.cloud.tencent.com/npm/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@^6.11.2: + version "6.11.2" + resolved "https://mirrors.cloud.tencent.com/npm/qs/-/qs-6.11.2.tgz" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +qs@6.11.0: + version "6.11.0" + resolved "https://mirrors.cloud.tencent.com/npm/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +quasar@^2.12.6, quasar@^2.8.0: + version "2.12.6" + resolved "https://registry.npmmirror.com/quasar/-/quasar-2.12.6.tgz" + integrity sha512-C4rDMzRu+onIP+4f8WrXUJYqMZ7KsZZewU5zjxCPHQqDVKAWNbfqePN/4ME42PZ3u5C26J9eLLW32rc/vEXXfg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://mirrors.cloud.tencent.com/npm/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://mirrors.cloud.tencent.com/npm/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/read-cache/-/read-cache-1.0.0.tgz" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +readable-stream@^2.0.0: + version "2.3.8" + resolved "https://mirrors.cloud.tencent.com/npm/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^2.0.5: + version "2.3.8" + resolved "https://mirrors.cloud.tencent.com/npm/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://mirrors.cloud.tencent.com/npm/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdir-glob@^1.0.0: + version "1.1.3" + resolved "https://mirrors.cloud.tencent.com/npm/readdir-glob/-/readdir-glob-1.1.3.tgz" + integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== + dependencies: + minimatch "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://mirrors.cloud.tencent.com/npm/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +register-service-worker@^1.7.2: + version "1.7.2" + resolved "https://mirrors.cloud.tencent.com/npm/register-service-worker/-/register-service-worker-1.7.2.tgz" + integrity sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A== + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://mirrors.cloud.tencent.com/npm/relateurl/-/relateurl-0.2.7.tgz" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.0, resolve@^1.22.2: + version "1.22.3" + resolved "https://mirrors.cloud.tencent.com/npm/resolve/-/resolve-1.22.3.tgz" + integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== + dependencies: + is-core-module "^2.12.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://mirrors.cloud.tencent.com/npm/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.npmmirror.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup-plugin-visualizer@^5.5.4: + version "5.9.2" + resolved "https://mirrors.cloud.tencent.com/npm/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.2.tgz" + integrity sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A== + dependencies: + open "^8.4.0" + picomatch "^2.3.1" + source-map "^0.7.4" + yargs "^17.5.1" + +"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0, rollup@^2.43.1, "rollup@>=2.59.0 <2.78.0", "rollup@2.x || 3.x": + version "2.77.3" + resolved "https://mirrors.cloud.tencent.com/npm/rollup/-/rollup-2.77.3.tgz" + integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://mirrors.cloud.tencent.com/npm/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.5: + version "7.8.1" + resolved "https://mirrors.cloud.tencent.com/npm/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://mirrors.cloud.tencent.com/npm/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass@*, sass@1.32.12: + version "1.32.12" + resolved "https://mirrors.cloud.tencent.com/npm/sass/-/sass-1.32.12.tgz" + integrity sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +sax@1.1.4: + version "1.1.4" + resolved "https://mirrors.cloud.tencent.com/npm/sax/-/sax-1.1.4.tgz" + integrity sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk= + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.3.6, semver@^7.5.4: + version "7.5.4" + resolved "https://mirrors.cloud.tencent.com/npm/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://mirrors.cloud.tencent.com/npm/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://mirrors.cloud.tencent.com/npm/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://mirrors.cloud.tencent.com/npm/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://mirrors.cloud.tencent.com/npm/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3, source-map@^0.7.4: + version "0.7.4" + resolved "https://mirrors.cloud.tencent.com/npm/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@~0.6.0: + version "0.6.1" + resolved "https://mirrors.cloud.tencent.com/npm/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +stack-trace@^1.0.0-pre2: + version "1.0.0-pre2" + resolved "https://mirrors.cloud.tencent.com/npm/stack-trace/-/stack-trace-1.0.0-pre2.tgz" + integrity sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A== + +statuses@2.0.1: + version "2.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://mirrors.cloud.tencent.com/npm/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://mirrors.cloud.tencent.com/npm/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.6: + version "4.0.9" + resolved "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz" + integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/strip-comments/-/strip-comments-2.0.1.tgz" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +stylus@*, stylus@^0.60.0: + version "0.60.0" + resolved "https://registry.npmmirror.com/stylus/-/stylus-0.60.0.tgz" + integrity sha512-j2pBgEwzCu05yCuY4cmyp0FtPQQFBBAGB7TY7QaNl7eztiHwkxzwvIp5vjZJND/a1JNOka+ZW9ewVPFZpI3pcA== + dependencies: + "@adobe/css-tools" "~4.2.0" + debug "^4.3.2" + glob "^7.1.6" + sax "~1.2.4" + source-map "^0.7.3" + +sucrase@^3.32.0: + version "3.34.0" + resolved "https://mirrors.cloud.tencent.com/npm/sucrase/-/sucrase-3.34.0.tgz" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +table@^6.8.0: + version "6.8.1" + resolved "https://mirrors.cloud.tencent.com/npm/table/-/table-6.8.1.tgz" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tailwindcss@^3.3.3: + version "3.3.3" + resolved "https://mirrors.cloud.tencent.com/npm/tailwindcss/-/tailwindcss-3.3.3.tgz" + integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.18.2" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tar-stream@^2.2.0: + version "2.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/tempy/-/tempy-0.6.0.tgz" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terser@^5.0.0: + version "5.19.3" + resolved "https://registry.npmmirror.com/terser/-/terser-5.19.3.tgz" + integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://mirrors.cloud.tencent.com/npm/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://mirrors.cloud.tencent.com/npm/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://mirrors.cloud.tencent.com/npm/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://mirrors.cloud.tencent.com/npm/through/-/through-2.3.8.tgz" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://mirrors.cloud.tencent.com/npm/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://mirrors.cloud.tencent.com/npm/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^2.1.0: + version "2.6.1" + resolved "https://mirrors.cloud.tencent.com/npm/tslib/-/tslib-2.6.1.tgz" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://mirrors.cloud.tencent.com/npm/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://mirrors.cloud.tencent.com/npm/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://mirrors.cloud.tencent.com/npm/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +uglify-js@^3.5.1: + version "3.17.4" + resolved "https://mirrors.cloud.tencent.com/npm/uglify-js/-/uglify-js-3.17.4.tgz" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://mirrors.cloud.tencent.com/npm/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://mirrors.cloud.tencent.com/npm/upper-case/-/upper-case-1.1.3.tgz" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://mirrors.cloud.tencent.com/npm/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +vary@~1.1.2: + version "1.1.2" + resolved "https://mirrors.cloud.tencent.com/npm/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +"vite@^2.0.0 || ^3.0.0 || ^4.0.0", vite@^2.5.10, vite@^2.9.13: + version "2.9.16" + resolved "https://mirrors.cloud.tencent.com/npm/vite/-/vite-2.9.16.tgz" + integrity sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA== + dependencies: + esbuild "^0.14.27" + postcss "^8.4.13" + resolve "^1.22.0" + rollup ">=2.59.0 <2.78.0" + optionalDependencies: + fsevents "~2.3.2" + +vue-demi@>=0.14.5: + version "0.14.6" + resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz" + integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w== + +vue-eslint-parser@^9.3.1: + version "9.3.1" + resolved "https://mirrors.cloud.tencent.com/npm/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz" + integrity sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g== + dependencies: + debug "^4.3.4" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^7.3.6" + +vue-router@^4.0.12, vue-router@^4.2.4: + version "4.2.4" + resolved "https://mirrors.cloud.tencent.com/npm/vue-router/-/vue-router-4.2.4.tgz" + integrity sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ== + dependencies: + "@vue/devtools-api" "^6.5.0" + +"vue@^2.6.14 || ^3.3.0", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.29, vue@^3.3.4, vue@3.3.4: + version "3.3.4" + resolved "https://mirrors.cloud.tencent.com/npm/vue/-/vue-3.3.4.tgz" + integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-sfc" "3.3.4" + "@vue/runtime-dom" "3.3.4" + "@vue/server-renderer" "3.3.4" + "@vue/shared" "3.3.4" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-merge@^5.8.0: + version "5.9.0" + resolved "https://mirrors.cloud.tencent.com/npm/webpack-merge/-/webpack-merge-5.9.0.tgz" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://mirrors.cloud.tencent.com/npm/wildcard/-/wildcard-2.0.1.tgz" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +workbox-background-sync@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz" + integrity sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA== + dependencies: + idb "^7.0.1" + workbox-core "7.0.0" + +workbox-broadcast-update@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz" + integrity sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ== + dependencies: + workbox-core "7.0.0" + +workbox-build@^6.5.0, workbox-build@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-build/-/workbox-build-7.0.0.tgz" + integrity sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "7.0.0" + workbox-broadcast-update "7.0.0" + workbox-cacheable-response "7.0.0" + workbox-core "7.0.0" + workbox-expiration "7.0.0" + workbox-google-analytics "7.0.0" + workbox-navigation-preload "7.0.0" + workbox-precaching "7.0.0" + workbox-range-requests "7.0.0" + workbox-recipes "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + workbox-streams "7.0.0" + workbox-sw "7.0.0" + workbox-window "7.0.0" + +workbox-cacheable-response@^7.0.0, workbox-cacheable-response@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz" + integrity sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g== + dependencies: + workbox-core "7.0.0" + +workbox-core@^7.0.0, workbox-core@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-core/-/workbox-core-7.0.0.tgz" + integrity sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ== + +workbox-expiration@^7.0.0, workbox-expiration@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-7.0.0.tgz" + integrity sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ== + dependencies: + idb "^7.0.1" + workbox-core "7.0.0" + +workbox-google-analytics@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz" + integrity sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg== + dependencies: + workbox-background-sync "7.0.0" + workbox-core "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + +workbox-navigation-preload@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz" + integrity sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA== + dependencies: + workbox-core "7.0.0" + +workbox-precaching@^7.0.0, workbox-precaching@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-7.0.0.tgz" + integrity sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA== + dependencies: + workbox-core "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + +workbox-range-requests@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz" + integrity sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ== + dependencies: + workbox-core "7.0.0" + +workbox-recipes@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-recipes/-/workbox-recipes-7.0.0.tgz" + integrity sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww== + dependencies: + workbox-cacheable-response "7.0.0" + workbox-core "7.0.0" + workbox-expiration "7.0.0" + workbox-precaching "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + +workbox-routing@^7.0.0, workbox-routing@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-7.0.0.tgz" + integrity sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA== + dependencies: + workbox-core "7.0.0" + +workbox-strategies@^7.0.0, workbox-strategies@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-7.0.0.tgz" + integrity sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA== + dependencies: + workbox-core "7.0.0" + +workbox-streams@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-7.0.0.tgz" + integrity sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ== + dependencies: + workbox-core "7.0.0" + workbox-routing "7.0.0" + +workbox-sw@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-7.0.0.tgz" + integrity sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA== + +workbox-window@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/workbox-window/-/workbox-window-7.0.0.tgz" + integrity sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "7.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://mirrors.cloud.tencent.com/npm/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +"xlsx@https://cdn.sheetjs.com/xlsx-0.20.0/xlsx-0.20.0.tgz": + version "0.20.0" + resolved "https://cdn.sheetjs.com/xlsx-0.20.0/xlsx-0.20.0.tgz" + integrity sha512-adg5edVTkXXGTnb0iWrc3Z47ViGgwmD47yx6VfSCZhfdKPtHcElYGs48OtcO4nwOu90Pjz5mmyl0HLcvbSRYTQ== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://mirrors.cloud.tencent.com/npm/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://mirrors.cloud.tencent.com/npm/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.1.1: + version "2.3.1" + resolved "https://mirrors.cloud.tencent.com/npm/yaml/-/yaml-2.3.1.tgz" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://mirrors.cloud.tencent.com/npm/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.5.1: + version "17.7.2" + resolved "https://mirrors.cloud.tencent.com/npm/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zip-stream@^4.1.0: + version "4.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/zip-stream/-/zip-stream-4.1.0.tgz" + integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== + dependencies: + archiver-utils "^2.1.0" + compress-commons "^4.1.0" + readable-stream "^3.6.0"