From d54711b20b321183401d226f866c35f335860ea8 Mon Sep 17 00:00:00 2001 From: zhh293 <928198963@qq.com> Date: Sat, 3 May 2025 21:58:51 +0800 Subject: [PATCH 01/19] Delete race special directory --- race special/common/HELP.md | 18 -- race special/common/common.iml | 8 - race special/common/pom.xml | 78 ----- .../example/constant/AutoFillConstant.java | 14 - .../example/constant/JwtClaimsConstant.java | 11 - .../org/example/constant/MessageConstant.java | 28 -- .../example/constant/PasswordConstant.java | 10 - .../org/example/constant/StatusConstant.java | 13 - .../java/org/example/context/BaseContext.java | 19 -- .../org/example/exception/BaseException.java | 15 - .../exception/LoginFailedException.java | 10 - .../PasswordEditFailedException.java | 12 - .../exception/PasswordErrorException.java | 15 - .../org/example/json/JacksonObjectMapper.java | 51 ---- .../properties/AiPictureProperties.java | 16 - .../org/example/properties/AiProperties.java | 20 -- .../properties/AiQueryPictureProperties.java | 16 - .../org/example/properties/JwtProperties.java | 26 -- .../java/org/example/result/PageResult.java | 22 -- .../main/java/org/example/result/Result.java | 37 --- .../java/org/example/utils/AiPictureUtil.java | 18 -- .../org/example/utils/AiQueryPictureUtil.java | 18 -- .../main/java/org/example/utils/AiUtil.java | 243 ---------------- .../main/java/org/example/utils/JwtUtil.java | 59 ---- .../spring-configuration-metadata.json | 154 ---------- .../example/constant/AutoFillConstant.class | Bin 564 -> 0 bytes .../example/constant/JwtClaimsConstant.class | Bin 538 -> 0 bytes .../example/constant/MessageConstant.class | Bin 1624 -> 0 bytes .../example/constant/PasswordConstant.class | Bin 399 -> 0 bytes .../org/example/constant/StatusConstant.class | Bin 522 -> 0 bytes .../org/example/context/BaseContext.class | Bin 940 -> 0 bytes .../org/example/exception/BaseException.class | Bin 489 -> 0 bytes .../exception/LoginFailedException.class | Bin 438 -> 0 bytes .../PasswordEditFailedException.class | Bin 459 -> 0 bytes .../exception/PasswordErrorException.class | Bin 525 -> 0 bytes .../example/json/JacksonObjectMapper.class | Bin 2573 -> 0 bytes .../properties/AiPictureProperties.class | Bin 3449 -> 0 bytes .../org/example/properties/AiProperties.class | Bin 5291 -> 0 bytes .../properties/AiQueryPictureProperties.class | Bin 3474 -> 0 bytes .../example/properties/JwtProperties.class | Bin 3807 -> 0 bytes .../org/example/result/PageResult.class | Bin 2045 -> 0 bytes .../classes/org/example/result/Result.class | Bin 3687 -> 0 bytes .../AiPictureUtil$AiPictureUtilBuilder.class | Bin 1749 -> 0 bytes .../org/example/utils/AiPictureUtil.class | Bin 3718 -> 0 bytes ...ictureUtil$AiQueryPictureUtilBuilder.class | Bin 1809 -> 0 bytes .../example/utils/AiQueryPictureUtil.class | Bin 3763 -> 0 bytes .../classes/org/example/utils/AiUtil.class | Bin 12624 -> 0 bytes .../classes/org/example/utils/JwtUtil.class | Bin 2275 -> 0 bytes race special/pojo/HELP.md | 18 -- race special/pojo/pom.xml | 75 ----- .../org/example/pojo/DTO/UserLoginDTO.java | 16 - .../java/org/example/pojo/VO/UserLoginVO.java | 26 -- .../java/org/example/pojo/entity/user.java | 25 -- race special/pom.xml | 181 ------------ race special/server/HELP.md | 18 -- race special/server/pom.xml | 168 ----------- .../org/example/server/ServerApplication.java | 16 - .../server/configuration/AiConfiguration.java | 19 -- .../configuration/WebMvcConfiguration.java | 93 ------ .../configuration/WebSocketConfiguration.java | 57 ---- .../example/server/controller/ai/test.java | 16 - .../example/server/controller/user/ai.java | 48 --- .../handler/GlobalExceptionHandler.java | 43 --- .../interceptor/JwtTokenAdminInterceptor.java | 63 ---- .../interceptor/JwtTokenUserceptor.java | 69 ----- .../org/example/server/mapper/AiMapper.java | 7 - .../org/example/server/service/AiService.java | 7 - .../example/server/service/Aiserviceimpl.java | 17 -- .../server/websocket/WebSocketServer.java | 68 ----- .../src/main/resources/application-dev.yml | 35 --- .../server/src/main/resources/application.yml | 67 ----- .../testServer/ServerApplicationTests.java | 274 ------------------ .../server/target/classes/application-dev.yml | 35 --- .../server/target/classes/application.yml | 67 ----- .../example/server/ServerApplication.class | Bin 1031 -> 0 bytes .../configuration/AiConfiguration.class | Bin 1456 -> 0 bytes .../configuration/WebMvcConfiguration.class | Bin 5679 -> 0 bytes .../WebSocketConfiguration.class | Bin 844 -> 0 bytes .../example/server/controller/ai/test.class | Bin 861 -> 0 bytes .../example/server/controller/user/ai.class | Bin 2625 -> 0 bytes .../handler/GlobalExceptionHandler.class | Bin 2149 -> 0 bytes .../JwtTokenAdminInterceptor.class | Bin 2979 -> 0 bytes .../interceptor/JwtTokenUserceptor.class | Bin 3033 -> 0 bytes .../org/example/server/mapper/AiMapper.class | Bin 204 -> 0 bytes .../example/server/service/AiService.class | Bin 298 -> 0 bytes .../server/service/Aiserviceimpl.class | Bin 895 -> 0 bytes .../server/websocket/WebSocketServer.class | Bin 3031 -> 0 bytes .../testServer/ServerApplicationTests.class | Bin 11351 -> 0 bytes 88 files changed, 2459 deletions(-) delete mode 100644 race special/common/HELP.md delete mode 100644 race special/common/common.iml delete mode 100644 race special/common/pom.xml delete mode 100644 race special/common/src/main/java/org/example/constant/AutoFillConstant.java delete mode 100644 race special/common/src/main/java/org/example/constant/JwtClaimsConstant.java delete mode 100644 race special/common/src/main/java/org/example/constant/MessageConstant.java delete mode 100644 race special/common/src/main/java/org/example/constant/PasswordConstant.java delete mode 100644 race special/common/src/main/java/org/example/constant/StatusConstant.java delete mode 100644 race special/common/src/main/java/org/example/context/BaseContext.java delete mode 100644 race special/common/src/main/java/org/example/exception/BaseException.java delete mode 100644 race special/common/src/main/java/org/example/exception/LoginFailedException.java delete mode 100644 race special/common/src/main/java/org/example/exception/PasswordEditFailedException.java delete mode 100644 race special/common/src/main/java/org/example/exception/PasswordErrorException.java delete mode 100644 race special/common/src/main/java/org/example/json/JacksonObjectMapper.java delete mode 100644 race special/common/src/main/java/org/example/properties/AiPictureProperties.java delete mode 100644 race special/common/src/main/java/org/example/properties/AiProperties.java delete mode 100644 race special/common/src/main/java/org/example/properties/AiQueryPictureProperties.java delete mode 100644 race special/common/src/main/java/org/example/properties/JwtProperties.java delete mode 100644 race special/common/src/main/java/org/example/result/PageResult.java delete mode 100644 race special/common/src/main/java/org/example/result/Result.java delete mode 100644 race special/common/src/main/java/org/example/utils/AiPictureUtil.java delete mode 100644 race special/common/src/main/java/org/example/utils/AiQueryPictureUtil.java delete mode 100644 race special/common/src/main/java/org/example/utils/AiUtil.java delete mode 100644 race special/common/src/main/java/org/example/utils/JwtUtil.java delete mode 100644 race special/common/target/classes/META-INF/spring-configuration-metadata.json delete mode 100644 race special/common/target/classes/org/example/constant/AutoFillConstant.class delete mode 100644 race special/common/target/classes/org/example/constant/JwtClaimsConstant.class delete mode 100644 race special/common/target/classes/org/example/constant/MessageConstant.class delete mode 100644 race special/common/target/classes/org/example/constant/PasswordConstant.class delete mode 100644 race special/common/target/classes/org/example/constant/StatusConstant.class delete mode 100644 race special/common/target/classes/org/example/context/BaseContext.class delete mode 100644 race special/common/target/classes/org/example/exception/BaseException.class delete mode 100644 race special/common/target/classes/org/example/exception/LoginFailedException.class delete mode 100644 race special/common/target/classes/org/example/exception/PasswordEditFailedException.class delete mode 100644 race special/common/target/classes/org/example/exception/PasswordErrorException.class delete mode 100644 race special/common/target/classes/org/example/json/JacksonObjectMapper.class delete mode 100644 race special/common/target/classes/org/example/properties/AiPictureProperties.class delete mode 100644 race special/common/target/classes/org/example/properties/AiProperties.class delete mode 100644 race special/common/target/classes/org/example/properties/AiQueryPictureProperties.class delete mode 100644 race special/common/target/classes/org/example/properties/JwtProperties.class delete mode 100644 race special/common/target/classes/org/example/result/PageResult.class delete mode 100644 race special/common/target/classes/org/example/result/Result.class delete mode 100644 race special/common/target/classes/org/example/utils/AiPictureUtil$AiPictureUtilBuilder.class delete mode 100644 race special/common/target/classes/org/example/utils/AiPictureUtil.class delete mode 100644 race special/common/target/classes/org/example/utils/AiQueryPictureUtil$AiQueryPictureUtilBuilder.class delete mode 100644 race special/common/target/classes/org/example/utils/AiQueryPictureUtil.class delete mode 100644 race special/common/target/classes/org/example/utils/AiUtil.class delete mode 100644 race special/common/target/classes/org/example/utils/JwtUtil.class delete mode 100644 race special/pojo/HELP.md delete mode 100644 race special/pojo/pom.xml delete mode 100644 race special/pojo/src/main/java/org/example/pojo/DTO/UserLoginDTO.java delete mode 100644 race special/pojo/src/main/java/org/example/pojo/VO/UserLoginVO.java delete mode 100644 race special/pojo/src/main/java/org/example/pojo/entity/user.java delete mode 100644 race special/pom.xml delete mode 100644 race special/server/HELP.md delete mode 100644 race special/server/pom.xml delete mode 100644 race special/server/src/main/java/org/example/server/ServerApplication.java delete mode 100644 race special/server/src/main/java/org/example/server/configuration/AiConfiguration.java delete mode 100644 race special/server/src/main/java/org/example/server/configuration/WebMvcConfiguration.java delete mode 100644 race special/server/src/main/java/org/example/server/configuration/WebSocketConfiguration.java delete mode 100644 race special/server/src/main/java/org/example/server/controller/ai/test.java delete mode 100644 race special/server/src/main/java/org/example/server/controller/user/ai.java delete mode 100644 race special/server/src/main/java/org/example/server/handler/GlobalExceptionHandler.java delete mode 100644 race special/server/src/main/java/org/example/server/interceptor/JwtTokenAdminInterceptor.java delete mode 100644 race special/server/src/main/java/org/example/server/interceptor/JwtTokenUserceptor.java delete mode 100644 race special/server/src/main/java/org/example/server/mapper/AiMapper.java delete mode 100644 race special/server/src/main/java/org/example/server/service/AiService.java delete mode 100644 race special/server/src/main/java/org/example/server/service/Aiserviceimpl.java delete mode 100644 race special/server/src/main/java/org/example/server/websocket/WebSocketServer.java delete mode 100644 race special/server/src/main/resources/application-dev.yml delete mode 100644 race special/server/src/main/resources/application.yml delete mode 100644 race special/server/src/test/java/org/example/testServer/ServerApplicationTests.java delete mode 100644 race special/server/target/classes/application-dev.yml delete mode 100644 race special/server/target/classes/application.yml delete mode 100644 race special/server/target/classes/org/example/server/ServerApplication.class delete mode 100644 race special/server/target/classes/org/example/server/configuration/AiConfiguration.class delete mode 100644 race special/server/target/classes/org/example/server/configuration/WebMvcConfiguration.class delete mode 100644 race special/server/target/classes/org/example/server/configuration/WebSocketConfiguration.class delete mode 100644 race special/server/target/classes/org/example/server/controller/ai/test.class delete mode 100644 race special/server/target/classes/org/example/server/controller/user/ai.class delete mode 100644 race special/server/target/classes/org/example/server/handler/GlobalExceptionHandler.class delete mode 100644 race special/server/target/classes/org/example/server/interceptor/JwtTokenAdminInterceptor.class delete mode 100644 race special/server/target/classes/org/example/server/interceptor/JwtTokenUserceptor.class delete mode 100644 race special/server/target/classes/org/example/server/mapper/AiMapper.class delete mode 100644 race special/server/target/classes/org/example/server/service/AiService.class delete mode 100644 race special/server/target/classes/org/example/server/service/Aiserviceimpl.class delete mode 100644 race special/server/target/classes/org/example/server/websocket/WebSocketServer.class delete mode 100644 race special/server/target/test-classes/org/example/testServer/ServerApplicationTests.class diff --git a/race special/common/HELP.md b/race special/common/HELP.md deleted file mode 100644 index 54e228d..0000000 --- a/race special/common/HELP.md +++ /dev/null @@ -1,18 +0,0 @@ -# Getting Started - -### Reference Documentation - -For further reference, please consider the following sections: - -* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) -* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.4/maven-plugin) -* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.4/maven-plugin/build-image.html) - -### Maven Parent overrides - -Due to Maven's design, elements are inherited from the parent POM to the project POM. -While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the -parent. -To prevent this, the project POM contains empty overrides for these elements. -If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides. - diff --git a/race special/common/common.iml b/race special/common/common.iml deleted file mode 100644 index 7184116..0000000 --- a/race special/common/common.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/race special/common/pom.xml b/race special/common/pom.xml deleted file mode 100644 index 5e76f95..0000000 --- a/race special/common/pom.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - 4.0.0 - - org.example - racespecial - 0.0.1-SNAPSHOT - - org.example - common - 0.0.1-SNAPSHOT - common - common - - - - - - - - - - - - - - - - - org.projectlombok - lombok - - - com.alibaba - fastjson - 1.2.76 - - - commons-lang - commons-lang - - - org.springframework.boot - spring-boot-starter-json - - - io.jsonwebtoken - jjwt - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - com.aliyun.oss - aliyun-sdk-oss - - - javax.xml.bind - jaxb-api - - - - com.github.wechatpay-apiv3 - wechatpay-apache-httpclient - - - org.apache.tomcat.embed - tomcat-embed-core - - - - - - diff --git a/race special/common/src/main/java/org/example/constant/AutoFillConstant.java b/race special/common/src/main/java/org/example/constant/AutoFillConstant.java deleted file mode 100644 index 60a1145..0000000 --- a/race special/common/src/main/java/org/example/constant/AutoFillConstant.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.example.constant; - -/** - * 公共字段自动填充相关常量 - */ -public class AutoFillConstant { - /** - * 实体类中的方法名称 - */ - public static final String SET_CREATE_TIME = "setCreateTime"; - public static final String SET_UPDATE_TIME = "setUpdateTime"; - public static final String SET_CREATE_USER = "setCreateUser"; - public static final String SET_UPDATE_USER = "setUpdateUser"; -} diff --git a/race special/common/src/main/java/org/example/constant/JwtClaimsConstant.java b/race special/common/src/main/java/org/example/constant/JwtClaimsConstant.java deleted file mode 100644 index ff840a9..0000000 --- a/race special/common/src/main/java/org/example/constant/JwtClaimsConstant.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.example.constant; - -public class JwtClaimsConstant { - - public static final String EMP_ID = "empId"; - public static final String USER_ID = "userId"; - public static final String PHONE = "phone"; - public static final String USERNAME = "username"; - public static final String NAME = "name"; - -} diff --git a/race special/common/src/main/java/org/example/constant/MessageConstant.java b/race special/common/src/main/java/org/example/constant/MessageConstant.java deleted file mode 100644 index 80e5645..0000000 --- a/race special/common/src/main/java/org/example/constant/MessageConstant.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.example.constant; - -/** - * 信息提示常量类 - */ -public class MessageConstant { - - public static final String PASSWORD_ERROR = "密码错误"; - public static final String ACCOUNT_NOT_FOUND = "账号不存在"; - public static final String ACCOUNT_LOCKED = "账号被锁定"; - public static final String UNKNOWN_ERROR = "未知错误"; - public static final String USER_NOT_LOGIN = "用户未登录"; - public static final String CATEGORY_BE_RELATED_BY_SETMEAL = "当前分类关联了套餐,不能删除"; - public static final String CATEGORY_BE_RELATED_BY_DISH = "当前分类关联了菜品,不能删除"; - public static final String SHOPPING_CART_IS_NULL = "购物车数据为空,不能下单"; - public static final String ADDRESS_BOOK_IS_NULL = "用户地址为空,不能下单"; - public static final String LOGIN_FAILED = "登录失败"; - public static final String UPLOAD_FAILED = "文件上传失败"; - public static final String SETMEAL_ENABLE_FAILED = "套餐内包含未启售菜品,无法启售"; - public static final String PASSWORD_EDIT_FAILED = "密码修改失败"; - public static final String DISH_ON_SALE = "起售中的菜品不能删除"; - public static final String SETMEAL_ON_SALE = "起售中的套餐不能删除"; - public static final String DISH_BE_RELATED_BY_SETMEAL = "当前菜品关联了套餐,不能删除"; - public static final String ORDER_STATUS_ERROR = "订单状态错误"; - public static final String ORDER_NOT_FOUND = "订单不存在"; - - public static final String ALREADY_EXITS = "用户名已经存在"; -} diff --git a/race special/common/src/main/java/org/example/constant/PasswordConstant.java b/race special/common/src/main/java/org/example/constant/PasswordConstant.java deleted file mode 100644 index a344103..0000000 --- a/race special/common/src/main/java/org/example/constant/PasswordConstant.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.example.constant; - -/** - * 密码常量 - */ -public class PasswordConstant { - - public static final String DEFAULT_PASSWORD = "123456"; - -} diff --git a/race special/common/src/main/java/org/example/constant/StatusConstant.java b/race special/common/src/main/java/org/example/constant/StatusConstant.java deleted file mode 100644 index 073dd74..0000000 --- a/race special/common/src/main/java/org/example/constant/StatusConstant.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.example.constant; - -/** - * 状态常量,启用或者禁用 - */ -public class StatusConstant { - - //启用 - public static final Integer ENABLE = 1; - - //禁用 - public static final Integer DISABLE = 0; -} diff --git a/race special/common/src/main/java/org/example/context/BaseContext.java b/race special/common/src/main/java/org/example/context/BaseContext.java deleted file mode 100644 index 3ba90ec..0000000 --- a/race special/common/src/main/java/org/example/context/BaseContext.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.example.context; - -public class BaseContext { - - public static ThreadLocal threadLocal = new ThreadLocal<>(); - - public static void setCurrentId(Long id) { - threadLocal.set(id); - } - - public static Long getCurrentId() { - return threadLocal.get(); - } - - public static void removeCurrentId() { - threadLocal.remove(); - } - -} diff --git a/race special/common/src/main/java/org/example/exception/BaseException.java b/race special/common/src/main/java/org/example/exception/BaseException.java deleted file mode 100644 index 2ebd8df..0000000 --- a/race special/common/src/main/java/org/example/exception/BaseException.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.example.exception; - -/** - * 业务异常 - */ -public class BaseException extends RuntimeException { - - public BaseException() { - } - - public BaseException(String msg) { - super(msg); - } - -} diff --git a/race special/common/src/main/java/org/example/exception/LoginFailedException.java b/race special/common/src/main/java/org/example/exception/LoginFailedException.java deleted file mode 100644 index ccea683..0000000 --- a/race special/common/src/main/java/org/example/exception/LoginFailedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.example.exception; - -/** - * 登录失败 - */ -public class LoginFailedException extends BaseException{ - public LoginFailedException(String msg){ - super(msg); - } -} diff --git a/race special/common/src/main/java/org/example/exception/PasswordEditFailedException.java b/race special/common/src/main/java/org/example/exception/PasswordEditFailedException.java deleted file mode 100644 index 883b33f..0000000 --- a/race special/common/src/main/java/org/example/exception/PasswordEditFailedException.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.example.exception; - -/** - * 密码修改失败异常 - */ -public class PasswordEditFailedException extends BaseException{ - - public PasswordEditFailedException(String msg){ - super(msg); - } - -} diff --git a/race special/common/src/main/java/org/example/exception/PasswordErrorException.java b/race special/common/src/main/java/org/example/exception/PasswordErrorException.java deleted file mode 100644 index 57de72e..0000000 --- a/race special/common/src/main/java/org/example/exception/PasswordErrorException.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.example.exception; - -/** - * 密码错误异常 - */ -public class PasswordErrorException extends BaseException { - - public PasswordErrorException() { - } - - public PasswordErrorException(String msg) { - super(msg); - } - -} diff --git a/race special/common/src/main/java/org/example/json/JacksonObjectMapper.java b/race special/common/src/main/java/org/example/json/JacksonObjectMapper.java deleted file mode 100644 index 70987eb..0000000 --- a/race special/common/src/main/java/org/example/json/JacksonObjectMapper.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.example.json; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -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 java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; - -/** - * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象 - * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] - * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] - */ -public class JacksonObjectMapper extends ObjectMapper { - - public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; - //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; - public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm"; - public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; - - public JacksonObjectMapper() { - super(); - //收到未知属性时不报异常 - this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); - - //反序列化时,属性不存在的兼容处理 - this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - - SimpleModule simpleModule = new SimpleModule() - .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) - .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) - .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))) - .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) - .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) - .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); - - //注册功能模块 例如,可以添加自定义序列化器和反序列化器 - this.registerModule(simpleModule); - } -} diff --git a/race special/common/src/main/java/org/example/properties/AiPictureProperties.java b/race special/common/src/main/java/org/example/properties/AiPictureProperties.java deleted file mode 100644 index 04188d6..0000000 --- a/race special/common/src/main/java/org/example/properties/AiPictureProperties.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.example.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Data -@Component -@ConfigurationProperties(prefix = "race.picture") -public class AiPictureProperties { - private String appId; - private String appKey; - private String httpMethod; - private String httpUrl; - private String requestUrl; -} diff --git a/race special/common/src/main/java/org/example/properties/AiProperties.java b/race special/common/src/main/java/org/example/properties/AiProperties.java deleted file mode 100644 index 8c9452c..0000000 --- a/race special/common/src/main/java/org/example/properties/AiProperties.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.example.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Data -@Component -@ConfigurationProperties(prefix = "race.deepseek") -public class AiProperties { - private String apiKey; - private String apiKey1; - private String deepSeekUrl; - private String TongYingUrl; - private String appId; - private String appKey; - private String httpMethod; - private String httpUrl; - private String requestUrl; -} diff --git a/race special/common/src/main/java/org/example/properties/AiQueryPictureProperties.java b/race special/common/src/main/java/org/example/properties/AiQueryPictureProperties.java deleted file mode 100644 index 9701776..0000000 --- a/race special/common/src/main/java/org/example/properties/AiQueryPictureProperties.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.example.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Data -@Component -@ConfigurationProperties(prefix = "race.querypicture") -public class AiQueryPictureProperties { - private String appId; - private String appKey; - private String httpMethod; - private String httpUrl; - private String requestUrl; -} diff --git a/race special/common/src/main/java/org/example/properties/JwtProperties.java b/race special/common/src/main/java/org/example/properties/JwtProperties.java deleted file mode 100644 index 594c52b..0000000 --- a/race special/common/src/main/java/org/example/properties/JwtProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.example.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@ConfigurationProperties(prefix = "race.jwt") -@Data -public class JwtProperties { - - /** - * 管理端员工生成jwt令牌相关配置 - */ - private String adminSecretKey; - private long adminTtl; - private String adminTokenName; - - /** - * 用户端微信用户生成jwt令牌相关配置 - */ - private String userSecretKey; - private long userTtl; - private String userTokenName; - -} diff --git a/race special/common/src/main/java/org/example/result/PageResult.java b/race special/common/src/main/java/org/example/result/PageResult.java deleted file mode 100644 index 170a553..0000000 --- a/race special/common/src/main/java/org/example/result/PageResult.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.example.result; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.List; - -/** - * 封装分页查询结果 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class PageResult implements Serializable { - - private long total; //总记录数 - - private List records; //当前页数据集合 - -} diff --git a/race special/common/src/main/java/org/example/result/Result.java b/race special/common/src/main/java/org/example/result/Result.java deleted file mode 100644 index 69c28a4..0000000 --- a/race special/common/src/main/java/org/example/result/Result.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.example.result; - -import lombok.Data; - -import java.io.Serializable; - -/** - * 后端统一返回结果 - * @param - */ -@Data -public class Result implements Serializable { - - private Integer code; //编码:1成功,0和其它数字为失败 - private String msg; //错误信息 - private T data; //数据 - - public static Result success() { - Result result = new Result(); - result.code = 1; - return result; - } - - public static Result success(T object) { - Result result = new Result(); - result.data = object; - result.code = 1; - return result; - } - - public static Result error(String msg) { - Result result = new Result(); - result.msg = msg; - result.code = 0; - return result; - } -} diff --git a/race special/common/src/main/java/org/example/utils/AiPictureUtil.java b/race special/common/src/main/java/org/example/utils/AiPictureUtil.java deleted file mode 100644 index 50bbbe4..0000000 --- a/race special/common/src/main/java/org/example/utils/AiPictureUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.utils; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class AiPictureUtil { - private String appId; - private String appKey; - private String httpMethod; - private String httpUrl; - private String requestUrl; -} diff --git a/race special/common/src/main/java/org/example/utils/AiQueryPictureUtil.java b/race special/common/src/main/java/org/example/utils/AiQueryPictureUtil.java deleted file mode 100644 index defd4de..0000000 --- a/race special/common/src/main/java/org/example/utils/AiQueryPictureUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.utils; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class AiQueryPictureUtil { - private String appId; - private String appKey; - private String httpMethod; - private String httpUrl; - private String requestUrl; -} diff --git a/race special/common/src/main/java/org/example/utils/AiUtil.java b/race special/common/src/main/java/org/example/utils/AiUtil.java deleted file mode 100644 index 3865991..0000000 --- a/race special/common/src/main/java/org/example/utils/AiUtil.java +++ /dev/null @@ -1,243 +0,0 @@ -package org.example.utils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.serializer.SerializerFeature; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.apache.catalina.session.StandardSession; -import org.apache.http.HttpEntity; -import org.apache.http.HttpRequest; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.web.server.Cookie; -import org.springframework.boot.web.servlet.server.Session; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import javax.servlet.http.HttpSessionContext; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.security.SecureRandom; -import java.time.Instant; -import java.util.Base64; -import java.util.Enumeration; -import java.util.UUID; - -@Data -@AllArgsConstructor -@Slf4j -public class AiUtil { - private String apiKey; - private String apiKey1; - private String deepSeekUrl; - private String TongYingUrl; - private String appId; - private String appKey; - private String httpMethod; - private String httpUrl; - private String requestUrl; - - private static String calculateSignature( - String httpMethod, - String httpUri, - String canonicalQueryString, - String appId, - long timestamp, // 输入为 long 类型 - String nonce, - String appKey) throws Exception { - - // 显式将 timestamp 转换为字符串 - String timestampStr = String.valueOf(timestamp); - - // 构建签名字符串(所有参数均为字符串) - String signingString = String.join("\n", - httpMethod.toUpperCase(), // POST - httpUri, // /vivogpt/completions - canonicalQueryString, // requestId=xxx - appId, // "2025158089" - timestampStr, // "1745768181"(显式转换) - "x-ai-gateway-app-id:" + appId, // 头部字段 - "x-ai-gateway-timestamp:" + timestampStr, // 使用转换后的字符串 - "x-ai-gateway-nonce:" + nonce - ); - - // 打印调试信息(确保 timestamp 为字符串形式) - System.out.println("Timestamp String: " + timestampStr); - System.out.println("Signing String:\n" + signingString); - - // 计算 HMAC-SHA256(不变) - Mac sha256Hmac = Mac.getInstance("HmacSHA256"); - SecretKeySpec secretKey = new SecretKeySpec(appKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); - sha256Hmac.init(secretKey); - byte[] hashBytes = sha256Hmac.doFinal(signingString.getBytes(StandardCharsets.UTF_8)); - - return Base64.getEncoder().encodeToString(hashBytes); - } - - public String getString(String message, String sessionId) throws Exception { - CloseableHttpClient httpClient = HttpClients.createDefault(); - //生成八位随机字符串 - final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - StringBuilder sb = new StringBuilder(8); - SecureRandom secureRandom = new SecureRandom(); - for (int i = 0; i < 8; i++) { - int randomIndex = secureRandom.nextInt(ALPHABET.length()); - sb.append(ALPHABET.charAt(randomIndex)); - } - String string = sb.toString(); - UUID requestId = UUID.randomUUID(); - URIBuilder uriBuilder = new URIBuilder(requestUrl); - uriBuilder.addParameter("requestId", requestId.toString()); - URI build = uriBuilder.build(); - HttpPost httpPost = new HttpPost(build); - httpPost.setHeader("Content-Type", "application/json; charset=utf-8"); - httpPost.setHeader("X-AI-GATEWAY-APP-ID",appId); - long epochSecond = Instant.now().getEpochSecond(); - httpPost.setHeader("X-AI-GATEWAY-TIMESTAMP",epochSecond+""); - httpPost.setHeader("X-AI-GATEWAY-NONCE",string); - String canonicalQueryString="requestId="+requestId; - String s = calculateSignature(httpMethod, httpUrl, canonicalQueryString, appId, epochSecond, string, appKey); - httpPost.setHeader("X-AI-GATEWAY-SIGNATURE",s); - httpPost.setHeader("X-AI-GATEWAY-SIGNED-HEADERS","x-ai-gateway-app-id;x-ai-gateway-timestamp;x-ai-gateway-nonce"); - String systemPrompt="你是一个生活小贴士,专门用来为别人做每一天的生活规划的。"; - String escapedMessage = JSON.toJSONString(message, SerializerFeature.WriteNonStringValueAsString); - String requestBody = "{" + - "\"messages\":[" + - "{\"role\":\"user\",\"content\":\"你好呀\"}," + - "{\"role\":\"assistant\",\"content\":\"你好!我是vivo助手,有什么可以帮助你的吗?\"}," + - "{\"role\":\"assistant\",\"content\":\"根据天气预报,今天天气晴朗,气温25℃,非常适合户外活动。\"}," + - "{\"role\":\"user\",\"content\":"+escapedMessage+"}" + - "]," + - "\"model\":\"vivo-BlueLM-TB-Pro\"," + - "\"sessionId\":\"" + sessionId + "\"," + - "\"systemPrompt\":\"" + systemPrompt + "\"," + - "\"extra\":{" + - "\"temperature\":0.9," + - "\"top_p\":0.7," + - "\"top_k\":50," + - "\"max_new_tokens\":2048," + - "\"repetition_penalty\":1.02" + - "}" + - "}"; - String requestBody1 = "{" + - "\"messages\":[" + - "{\"role\":\"user\",\"content\":\"你好呀\"}," + - "{\"role\":\"assistant\",\"content\":\"你好!我是vivo助手,有什么可以帮助你的吗?\"}," + - "{\"role\":\"assistant\",\"content\":\"根据天气预报,今天天气晴朗,气温25℃,非常适合户外活动。\"}," + - "{\"role\":\"user\",\"content\":\""+message+"\"}" + - "]," + - "\"model\":\"vivo-BlueLM-TB-Pro\"," + - "\"sessionId\":\"" + sessionId + "\"," + - "\"systemPrompt\":\"" + systemPrompt + "\"," + - "\"extra\":{" + - "\"temperature\":0.9," + - "\"top_p\":0.7," + - "\"top_k\":50," + - "\"max_new_tokens\":2048," + - "\"repetition_penalty\":1.02" + - "}" + - "}"; - System.out.println("我到这里了"); - System.out.println(requestBody); - System.out.println(requestBody1); - httpPost.setEntity(new StringEntity(requestBody1, StandardCharsets.UTF_8)); - CloseableHttpResponse response = httpClient.execute(httpPost); - if (response.getStatusLine().getStatusCode() == 200) { - HttpEntity entity = response.getEntity(); - JSONObject jsonObject = JSON.parseObject(EntityUtils.toString(entity)); - JSONObject result = jsonObject.getJSONObject("data"); - return result.getString("content"); - }else{ - System.out.println(response.getStatusLine().getStatusCode()); - return null; - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /*public String getdeepSeek(String message) throws IOException { - CloseableHttpClient httpclient = HttpClients.createDefault(); - HttpPost httpPost = new HttpPost(deepSeekUrl); - httpPost.setHeader("Content-type", "application/json"); - httpPost.setHeader("Accept", "application/json"); - httpPost.setHeader("Authorization", "Bearer " + apiKey); - String requestBody = "{\"model\": \"deepseek-reasoner\", \"messages\": [" + - "{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"}," + - "{\"role\": \"user\", \"content\":\""+message+"\" }" + - "], \"temperature\": 0.7}"; - StringEntity entity = new StringEntity(requestBody, "utf-8"); - httpPost.setEntity(entity); - CloseableHttpResponse execute = httpclient.execute(httpPost); - int statusCode = execute.getStatusLine().getStatusCode(); - if (statusCode != 200) { - throw new IOException(execute.getStatusLine().getReasonPhrase()); - } - HttpEntity entity1 = execute.getEntity(); - JSONObject jsonObject = JSONObject.parseObject(EntityUtils.toString(entity1)); - JSONArray jsonArray = JSONArray.parseArray(jsonObject.getString("choices")); - StringBuffer sb = new StringBuffer(); - for (Object object : jsonArray) { - JSONObject json = (JSONObject) object; - JSONObject message1 = json.getJSONObject("message"); - String string = message1.getString("content"); - sb.append(string); - } - return sb.toString(); - }*/ - //剩余部分自己补全即可,套路一模一样,哈哈哈哈哈哈哈哈哈哈哈哈,太爽啦 - -} -} diff --git a/race special/common/src/main/java/org/example/utils/JwtUtil.java b/race special/common/src/main/java/org/example/utils/JwtUtil.java deleted file mode 100644 index 80001c1..0000000 --- a/race special/common/src/main/java/org/example/utils/JwtUtil.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.example.utils; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.JwtBuilder; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; - -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.Map; - -public class JwtUtil { - /** - * 生成jwt - * 使用Hs256算法, 私匙使用固定秘钥 - * - * @param secretKey jwt秘钥 - * @param ttlMillis jwt过期时间(毫秒) - * @param claims 设置的信息 - * @return - */ - public static String createJWT(String secretKey, long ttlMillis, Map claims) { - // 指定签名的时候使用的签名算法,也就是header那部分 - SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; - - // 生成JWT的时间 - long expMillis = System.currentTimeMillis() + ttlMillis; - Date exp = new Date(expMillis); - - // 设置jwt的body - JwtBuilder builder = Jwts.builder() - // 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的 - .setClaims(claims) - // 设置签名使用的签名算法和签名使用的秘钥 - .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8)) - // 设置过期时间 - .setExpiration(exp); - - return builder.compact(); - } - - /** - * Token解密 - * - * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个 - * @param token 加密后的token - * @return - */ - public static Claims parseJWT(String secretKey, String token) { - // 得到DefaultJwtParser - Claims claims = Jwts.parser() - // 设置签名的秘钥 - .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8)) - // 设置需要解析的jwt - .parseClaimsJws(token).getBody(); - return claims; - } - -} diff --git a/race special/common/target/classes/META-INF/spring-configuration-metadata.json b/race special/common/target/classes/META-INF/spring-configuration-metadata.json deleted file mode 100644 index fd70663..0000000 --- a/race special/common/target/classes/META-INF/spring-configuration-metadata.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "groups": [ - { - "name": "race.deepseek", - "type": "org.example.properties.AiProperties", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.jwt", - "type": "org.example.properties.JwtProperties", - "sourceType": "org.example.properties.JwtProperties" - }, - { - "name": "race.picture", - "type": "org.example.properties.AiPictureProperties", - "sourceType": "org.example.properties.AiPictureProperties" - }, - { - "name": "race.querypicture", - "type": "org.example.properties.AiQueryPictureProperties", - "sourceType": "org.example.properties.AiQueryPictureProperties" - } - ], - "properties": [ - { - "name": "race.deepseek.api-key", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.api-key1", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.app-id", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.app-key", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.deep-seek-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.http-method", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.http-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.request-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.deepseek.tong-ying-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiProperties" - }, - { - "name": "race.jwt.admin-secret-key", - "type": "java.lang.String", - "description": "管理端员工生成jwt令牌相关配置", - "sourceType": "org.example.properties.JwtProperties" - }, - { - "name": "race.jwt.admin-token-name", - "type": "java.lang.String", - "sourceType": "org.example.properties.JwtProperties" - }, - { - "name": "race.jwt.admin-ttl", - "type": "java.lang.Long", - "sourceType": "org.example.properties.JwtProperties" - }, - { - "name": "race.jwt.user-secret-key", - "type": "java.lang.String", - "description": "用户端微信用户生成jwt令牌相关配置", - "sourceType": "org.example.properties.JwtProperties" - }, - { - "name": "race.jwt.user-token-name", - "type": "java.lang.String", - "sourceType": "org.example.properties.JwtProperties" - }, - { - "name": "race.jwt.user-ttl", - "type": "java.lang.Long", - "sourceType": "org.example.properties.JwtProperties" - }, - { - "name": "race.picture.app-id", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiPictureProperties" - }, - { - "name": "race.picture.app-key", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiPictureProperties" - }, - { - "name": "race.picture.http-method", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiPictureProperties" - }, - { - "name": "race.picture.http-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiPictureProperties" - }, - { - "name": "race.picture.request-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiPictureProperties" - }, - { - "name": "race.querypicture.app-id", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiQueryPictureProperties" - }, - { - "name": "race.querypicture.app-key", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiQueryPictureProperties" - }, - { - "name": "race.querypicture.http-method", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiQueryPictureProperties" - }, - { - "name": "race.querypicture.http-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiQueryPictureProperties" - }, - { - "name": "race.querypicture.request-url", - "type": "java.lang.String", - "sourceType": "org.example.properties.AiQueryPictureProperties" - } - ], - "hints": [] -} \ No newline at end of file diff --git a/race special/common/target/classes/org/example/constant/AutoFillConstant.class b/race special/common/target/classes/org/example/constant/AutoFillConstant.class deleted file mode 100644 index 85483e952067a95d4dafefd1077cc287c36ff35b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcma)($xg#C5Qcwu4W*@}tYwopAeIBUa04M#AxKDJQIqsqxvf=PrAd`Ih}YtT#DNFk zp%9ZUBIU%vBY(eVevijr-yfdv`$xye3{Dtct z_XoPILg^1K87fBLM~eHZ&AnJ?*qK$jPdD>Q4ZDkWu5Gq7>@8+a#eIgtmGq^$X2_nL zwi$9p&=-_yNnbp~qpk=Y-t|bSTS1R|Z63;mXJSr0%ZTCF3c`UdUioP33B5OKQE$d7 zxRsta@0t29*+Crk1gT`X@i*Z-d2tyls4^V=%aWn?JEh0&Q1lcHDH6&E1y{n6Bf2MH zcidm#>A4$;Fnyjd4w0ds0di>2%7bP^lmYz{v=lE9mr}e;TuyO?Dp~RviZyc3Ck*7z e-of4`ma7yCBqy;>u{_!5v4(Xbnh?bdHh%!kq<^9S diff --git a/race special/common/target/classes/org/example/constant/JwtClaimsConstant.class b/race special/common/target/classes/org/example/constant/JwtClaimsConstant.class deleted file mode 100644 index 8115441e695807426a05bca8633ce5ae6608e71a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcma)&OHaZ;6ot<~Yb%00R21KA47#uzcN!Ce7%}A$QMP6%6ByD5=|lZnu1s9`1N>3O zTg2GJjhi#~JMG+i?tFZ{y#qKwHG?!N8a6d-F)TD%-G}BSL&==*M{d~M9T~mQm+t74 zAy@a@Amnb?=XNA?Y%^&0y~Zuw(6PgycCS0_hK^kZJ@(rdEuuXJ<-6La0cX;c;WgPmW;^1QfM|O!3Vp=Z;pAcx% zdX@hEnA~GTc~v)Jnjyy}%>9%=D=!GDsA)z-QTn!bJ|hq+7h!bsG088P_e<`V6ke!F z5#Kqe!w_XYB8j!FC^~O9QHWtTDn0@_`-K^bY-qeBav&1eU$v=;-2@Jo!*;oL4-N$f zg#FTVUXN?lHuj=fpfe+gVeP!6io7srh+o8Xjf2k#>^+-EC9>F_Jzd8K2-HW@Us{+g zB~q3=c5%qc=;lxol@=*IY$gZHOv2}iSfBkWF-qW=l+KKVt#8eXUni~baOFXS&sn3R z=7?2&AUNA5Ej^YQwz?C(W9t+9r~TIzf|GEHK3*%e) zId5eJFXFA;q0>dXl%vZ((fPYI#k+lfD?d&PH!;PT|HZwvR7-L5cb%!CFV1by%~=9n zbn_a$oTF2d?&=1ec<7Di?e$5zbYp9A<|JBs-)+*Vg{`^8-9o+Td3tU9iO^1OZP~qi z&)dA?%sy~(1-rEF-dq3s@zuc5F8xSzcz8!p4xN8Mf4;O!Oem<7F0OiOOE@d%`VaQT zBfE6Pe!Nf>PX+bT$q9OOg3jE>`_Y*dnlA*!;knL@1?S;xAfidoNc+!%lmESH((e6M z#1y--~G1M2YK4B#0!1ohAW_|%c=pb?p4_$lNjhMz_bF}x4Cnc@A&2N*tx+`_PbUMs_G z$j>tT9P;xFA3{FN@Dbz}7=97Co#B^|UuL)i`6$D$Aa^qSD)KRgUqkL<_&D+jhF`}{ u5&u_+>uKy*xXb_zCyGE;%PkD!x))`CeFN7}`MUw$gtw3gyp3xeocR|fbQZJ# diff --git a/race special/common/target/classes/org/example/constant/PasswordConstant.class b/race special/common/target/classes/org/example/constant/PasswordConstant.class deleted file mode 100644 index dbd418846136d7c477139a89a212cf20720a035f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399 zcma)2yH3ME5S(-T2*!b6NI^+~cobNHKm$UG5>imim`nT@%e$w~6yYbDC!FK2Ti90b* zBF8H-nMCIdtwEaP1y2f}$E9dui$TATi7YM|8v6%6gE~lOf??g2iMTEofykyjh)J>C zG~}_*GgXG9%PbTlS*`5+9XP5^ zw$Q{1!|uOUQuN=L<6thrf+BT~PkN_k*nvV%0vNWTLZhk^Q(#cXDi=bN6sP8ZcK8PN ZT92#}>Lgca5n6Sxp@lVK^dCY6?QeXkT=f6| diff --git a/race special/common/target/classes/org/example/constant/StatusConstant.class b/race special/common/target/classes/org/example/constant/StatusConstant.class deleted file mode 100644 index c3080703406c31d91da5bce4dc4d0487ae789f57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcma)2O-sW-5Pj38NgJd6(rWzz5usHu7jG6pYlT8+50&1xajhw7BI&01x5R_u!5`p{ z5_i*J5j=RAnfGRP-t7DQdj9}$hJ6z{)=g}nRzMD$Dr_038`vi3o!;e@(;-xy37a$9 zXTjL+27-@ybWSj?yMskvZ+U?yE(qC1b4bwI;TK(QW==6%M4U zy7W7Px;jEub#+I=kh&2BOCnolk~w$$3VKf3t1{{dsbfvn)?xrflqAZd{PXxE=>SFT b4Vf2Yvq{p_8iHD5N_|LOBUw_Bbq3XMzIJS| diff --git a/race special/common/target/classes/org/example/context/BaseContext.class b/race special/common/target/classes/org/example/context/BaseContext.class deleted file mode 100644 index eb8263a75a0b09c74c5916d5d40dc8a56ec7cc02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmah{U279T6g`u#O*U(rrmgk6rq!B6?Y@XF34Jgi2=N123O-JfA=#4bmdT{_XZZmw zD2UJgDDlj0aJNP9Vdu`Ad+)jT+`YekfBOO81$-AS8WmKqSo}66plLw%qw++ zFfa!K`DW`_pwNp(WLWJ7p?bHN4U|5TgDH`E+`+NbfqgH*f|&$!fkr>lV_%)i+38gI z!zeWB-1x8LT=kMW>v(fzdJC;pXx@wj)|=OxvDI?{UA5~TLT{CsM57N<%b7Atv!*w` z!dGu*MaSx>LaSMHrZQ#A-Qjep*FB6DdZ=CpR$VRA?7khbhgH-(RN;AO3|<1F(Tj+6r!Bi$pg0 zC9U<9zaZDXKt9cP=^@S~u4FjMxP{xq@9--MJ}li`+#`vl+lk2lmvk2>{6z5+QLY`& zq#=*-_y6|3yNq|@_>!%j1Si#NOj=_P4>Ae1E1>!v&c{oXzap0=B^B&+wi%Mc!$0S| B!2|#R diff --git a/race special/common/target/classes/org/example/exception/BaseException.class b/race special/common/target/classes/org/example/exception/BaseException.class deleted file mode 100644 index 06898b79359f5f7f10503e0f1f3966aca482cb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcma)2%T5A85Ul1cu7W5WycuJHn79YMVK`{?v>GFZ`v8+=%s$BMVEiplBp&<#Kg!q* z7@}UBNvcyl)m5GO_I#JCFaOSB{bW?lX_Nu zq>|9@J8P1#E1~%~3nk&tBcXn)-6S2~E30DdwB@vFKb_f;zA=lneq@}AgNGtY0v_S; zABz$8*TE07#F==#H4c#H?~;=Pi8EuF*%?>jTI|e0uZ!mjW0hqYU7x`|Tk6Z!H{JOV!GO_1xcPry9=|iHX?O8FSeA0>-3dC;$Ke diff --git a/race special/common/target/classes/org/example/exception/LoginFailedException.class b/race special/common/target/classes/org/example/exception/LoginFailedException.class deleted file mode 100644 index c49206dc28f972916d7bf8ce641c82267139224e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcma)2O-sW-6r7jFrl!@_ih@V+qE*brTcroZo}vhq-nYpkT}iTKvlaiAC&7b1z#k>P z_;s-dcj3*OVVE8E?fvByz!|nfG|&sM6`)UOp6gP(5n<;rzE=+_%2k;~6K8dq4UeV- z|I(yP=*GI_n`JR$d#7f(DE-(ZDxWH=YyK_zZmuiBNo;Hu@uMmhISVGdaN3knY%*Pr zmCiZ6`VohOMp0#T;GY77-Zi_qNpF=^1v|D99!|{CCOnoD!rrRL(>kaFA8Ulc|CFW#T}iTKvsM3=C&7b1z#k<} z{JJQDvoLSo?ChJzzPvs?131NIfC}0*Y}C*p_-8uTu20z7k8aeh3R9IQ;n-Q7C%uCS zp?YCrCbS}*^VKq&vb|Q*R63o=%v3s2R+s#cY$L(Lhs_)}$8S4FSTsWDl)3_^oww diff --git a/race special/common/target/classes/org/example/exception/PasswordErrorException.class b/race special/common/target/classes/org/example/exception/PasswordErrorException.class deleted file mode 100644 index 4ebe953bced122cff4a69d62c01dc6cecdb3fe5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmb7AJx>Bb6rAN-JOxo`tc(q!;R@|A6dJ5fLxQ1S?l#AoyIZn%pnuDX#KIrok21ao zXrVOjCiC)U=gsWy$LHHSfGf1BD4@Y`SjJHqO@Y$2PIT56$hXhN0)<->D1n-%6ZJ5U zC(1s`NkmM;Gro+*(rWHEWFedCRG{k_8@lR6#7t)Pn61tLl!OdOl7=j{0*bP`_8%)C5CmWvnt~DYiN?bL*=+&G$Rr9@b?m z2St<^9D$4fTvgz7yZlC`>gPc?L7u*pR}O-+2+P!6QWaE-oh8KU>bOE!B^gkmksaEA zvlbD*OC1|Hq+o+SRo0d|=S$>%JMfG4Rt~MTYU4n9;`hm^Mzcjh4cpcUb2#_{-$-+J diff --git a/race special/common/target/classes/org/example/json/JacksonObjectMapper.class b/race special/common/target/classes/org/example/json/JacksonObjectMapper.class deleted file mode 100644 index cd352888a2ca266495678ff79606176b41db183b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2573 zcmbVOU3(Kn6n>`(Y`SbI1StVT3L;HX%FLT9=giDs|NQoBt(6P z$+#%2&t(KU6W1kd$haz;n=-Bm=NUYc5NEis7L7%==3C#sn~6tTz| zvuTyIm@YU1Ln7T3g;H=EGYS$&Do7!%;0tUqJaCD)rZqH5v8w;TZQV3t8n>I4CLyCB zi*1Gl7yJ;#442v;&em(1+OFanx3w%;4AJB1?ALWsOY8ppJ+&-U4PqUkn#FMIBp-m` z+-v&HB@%Px^7Q)pQmrN-ry!3nMX?GBp5q0rz9DKEA|ojsR4F^*kA~?KF+j%E3wE% zyqHQBx0BD3seH1S-b$sTTiK0hhT)-G>p3OuZv^VT@serm>J{n=hDvZmn&%-mV1F(Y zHBiy)w-fD1zpL8B8hd;rJzG`v^##U+b_+g-Q68%oz;Uc+!A_=tBYM8S^G_= zO?OSJ#%;B?t;E_U?Wy#!%-uA%>D3T*I(mSFIxbsmO~iGxI25A_IcsSZU7T{glP~AmIGvg9 z0SEd7H|P#AP1hI?F4Ox>FnmbX82n`4>a!KHKkBomXeOQGn4vL9h`;IjGe*y!!v|pD zUoqxs!IKZS;Pw82Qw0xsGA*3WA3`b|z~>)7gk10|zhUA4XIq%`pF70)g5TeETo8`; z4so&IpK3cU2?s#}J;>!2t_aB09^`%DAjq{I7ZhRp`yqce`< z=okIuj6XoW;Eax1X4G-e4>;o=;0Nf>5b-(pZeH0LJIS2;oO_;g?!D)nd-ujE9(;q=`fykZYh*31wnP* z2}&NQ1}hi+GNyg!dfll7LeY=A6*oAcP<&{3Ss``WTXhubopUSBx%%dc<6p2>%9zQ{ zc}2UtZ2K9mIkm7aLC^VsfUQlv;)PgfO7*;bSCYxHr zB=%)BZ9?r8#`gMVB%yuEYLevcTMVJg812mv#%P~PF9mjSW8SWYB{z$9Wrk0UI+pBO zN%jkxXBLNASe%`o!Ks0D->KEh0YKwC1_QDA)L{EAO`(Y$r3TxVHUm%gG}5%>)%~J# z%H>wv8_`yW_#P;fTdY?CchgyRYcAS!s#5U+J8-=UYBVCcv{vO?vc|>#!1FiqHMD@^ z1-GhBe%jltdKISh|xGMKkoWMME@f(Mya*7>%+RV=>O+6rEOR zPxn)CvhJ2wxe510By>ph+pfGpmmLg}%AR{5YOrH%qhW2=PF6|BBM!?<>> z)#W9S@03%)(=;A+RUf;(;dUpGI|Gj;kw!62AyAC7C`KewjL4-Jkxq=gq;SR|pN5vl zs9@Aa?vnDIpbbLmV$z^zfGtU&XX!a;3a1yc)A{F8ri%i;@jSs-S_AD(E?lIr@Fd-llX;%js<-t6+d+70jH$Br_x#IkSzF zE+jxo7m~RIlae7RkxRCbdI~9!dJ0x9#Uv{v0X0bK9ULuA-PijgdE{olJ)ooX3Ubs( zztb^X`4~LDrvm2Ucu&8f2_ThD)8}*?NTYfBlqP|6D$@p?05ZrYhh7CT=?lEKuK^|K zON>)MN!r5ua}p>;zo4C`fh>9*dz+%HVg5rs1{n`&H{Lb;P30l&l`!%DuyIL_qOdA| z3}j((4h0DJhbziy;6ru3a`M_~%`|9m;xvTU?wDv5d^<3Or%(ACAxwn$EHiOjofHkx zpP4A39n8$=Z8FBUsP`(*rwS??a%yNXxk;qSDrmxl{t!-PPHULb1zni*rU_jmy?P3U zFri^WFGHC6qszM}w;7%*PM^>jn#CbB`k3ATilHDM(pj7}j)RqG4oF2A=keq6UZ%rz z4oIhf_Rx7CLlo;TN7cgGLUY2Y0)_+4~TZjMv diff --git a/race special/common/target/classes/org/example/properties/AiProperties.class b/race special/common/target/classes/org/example/properties/AiProperties.class deleted file mode 100644 index bd1be256f6acf5476d406be1ceba86ccaa9337a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5291 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 EFR%z^F8}}l diff --git a/race special/common/target/classes/org/example/properties/JwtProperties.class b/race special/common/target/classes/org/example/properties/JwtProperties.class deleted file mode 100644 index 95e30cff121578fa88b24510fffc88cb50f3736e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3807 zcma)8-E$LF6#v~Mo86>on+7OEL5dXY7sT(66jZ37V2el*@!M^>v`f?7xY-D(`1#_K zvBNtaL4XJxehnGhQrh%s1 zeFH7Izir@xfr|z%8F`fA=HjaD%v&|j@}IRX36y5fn{S(yy6G%c=6%n0 zmZk*^g*xrm1;p{T(P?+Za!#15mOy{2X?Zaxx;!hmx``pP2W-do9~VfEjh_+7%(#oR zADp!v>qKjHfmY^1oto0DTQlotOwX3*P?_tSQpLJM%}73Jhx$azHK!t z$1nINqZ7j(TC)5@J^5`O8&ArxuMJgEGdQLhnaAQU68A!PviVS@EZg@nlcDDND7K8P z4?@C9Fav}lP{ai<)9zQ|1sux^3<`pBP;^ttYv#@yFSR`NQ(fbhZFtr>`ywmpnKf(w`3rsl_h77mofs)#7w#@# zx0FWZvPT~GVnkqcBhy^K9G)!TUffsU)5&E&Dg`_tb@xl@0l7RRmlJqSU~BIqcDQBN z7iGil=qlw{cjq1~;C+0+nVTAEzj#XZAt$b_YEREWPV3Z2S0_@H4^-@l&V58MRbsq= zmr$W?C&FN;*kfj+VL6Ke`;uOVbq_|E5((VSN8x|3S$Kn=1|W-+WP(yklA(6;p>|TD zcCw;&62pB6LK4VzoTmzR!Cjm95#oCaDNJz9DrF9nlnVg>Q`pCokR);KHolJ3cRj{~ ziN@qQGEN1KC$1y?ZI5v=(U?sU8Mni}j!f?_4<#D2nG%e(UgP0JV|Hg`+zC6|8}`;j zV|H+4+zDIn{pD?m#t-8Waw4l;<(}f6otV6VR5Dk?0V3o|@+g}_;8EIXf`=jxk11Dy z%QVu;<<1*OZ`7siv&iKx<#IYX%FISx%9f2>?p7`jB)il$>QZ)pUxPlD&NYAawiEp4~u1)?1;|jF&waH&$%uP+K zA*YTM@>Bf(#nGi&H?TMtww^KDS(8Z%0-du19y zrcvkK!XX@HX|~`e%<$z&u_~Y8DeBTVicfKbQU*1w@N^g&Y*=`jQkHi|@eC!M_$P6U zl7VmeI3A~z!wH^J13HZU{@WPVaTos?;x@JgV(x#$_Cy^bWf}Py z3n=4k2{nS6JB2?-5O^hBfMjwNP28>QX7mGK!N|LE6?Zr0@e(LtPos6)6m^2CF%B zMfO6gT>FZos;hi-MNVn8J(LpI|G_QVPhs3FBWDKC8nJB9kFu5aM6b5!a-oY76uZ zsDtZKhESsm+Ci_^hX%P`gN{w&70p-&{=pD1jE`9X!CIaD8Kswg#HP~bHEbcR1#YF` zKxV18mbL}*fYg@*c~HuC1ahCm+!@G4so&0J4Lf>2H1W^+*^r+UURKTe3SQ+tNOoT1 M{yO7&qlq{F0~wjQP5=M^ diff --git a/race special/common/target/classes/org/example/result/PageResult.class b/race special/common/target/classes/org/example/result/PageResult.class deleted file mode 100644 index d22db028ab46758585013149edd37d2b14b09ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2045 zcma)6TW=dx5dMyL*WS3B*m0VKKuQuw!Iz|l5}?hcKuTH?>@+tj!BaQRD&FFF!)A>T z5>LGF19*WSKwpAHCF)8bae1KSc>~3r~3Kg<_&YU@OX1@7m#()0v(=Pz#@IfCm zT$AOk6y8pAe@B*OS+1usgm-0GN#RBseYk1jJ=s@fSu^pz>=hGL+1JJLW(v1b*ibM6 zFR&X5YE2>KJ2lVWJ5tD2?%JQ)e>({+KM^n!TMo`|c_noa!WSlhP zY@Oi9) zZtjSxk{HCTdUO-#-yB#c%d*ISI6u+H3M%u@ZILV!ub<+LUfUq3?>)drW;(7 z`?a(3W4cEWJxx8yi((M{o(5o+6tH`v`CVR!Zfu8#|T*- zF5;z*OG#H;mL4GSe_aYK9hak_OSV+(@>l3E=yJ1E{0@eGT>2f_w=lHh(r?hJGsQOa z@JPX!;qU8jtdsC23MdlY zFcwiF{|Q{?Izyd?D=gzIB^{UOYXqs3`4 z2?>_o()E&Wbg&piAXsAZOCeL7JF29f_X$18eJ;DOs4od0%j4OF`c!uEi>WWax+9w8 zydkPF;}Ohk=^o56qYd-U()iQJn2P~ujC2{VF`B_V<|rlD%SF7-)HQa?DBj@72+6pJ z#ABj0NQP26iGWg%rIKAmLP_s(ykq!VbRxZ+{~3KBK14cqt_@4FXrn(j5Xs3lGPx|} zHU>|(d&F5ZEBP3*;{VQkOn8<4b^6Z~A0ijFd~x=SCLIX-ev-yC?NFbI`(AX?u3A`x hJ{j#S6*2|~*``YxNRyHmK>q`O zz#kxA_@FaV9GP+S3(okPRD90fO_P+gcG}*1?m6e4m*u&%i@FS&-(H7 zEaZ#c#oGFcS6+5k3N#d3C}rKkHMg9XbHKFpb%nuQjrOQw)5D0iBv! z&NKlKBssHN8uhE`#OoJ#&)zEe7%KEGdeybk>Sed=u6tFlOynka2!wI&VzeHM>6Oc+ zvO-HtK{a=|P5{pD;I}Ea|F=^Q!!yKwkmA(q?s5EITx_v))`@hQ3pO7fwh^D8zUCa5y-L_rfSU zsG#Z~jzbQH@P>my9CmOC=N!C`4;-8o>O-7z@DVZ&F5`2BfkwaSB+k_Gg;lACqrE4j zBGV3Pcp%F|R&{Kc`A@SG#)bs}Qfkz}b)4elHq7Zv*|R=tTdE5C8k#}-(clBOQ1dR` zQRq+1?=TAP#)em1RTyvAo=rfvWJ6?I^y|&Kqdt!CIT_&JL4?pDkn(Bj5J3H%=u-Bk zPY?4!iBSJ2<;Tdm#$9oby@0y$932;u#xDpxgOU7^+z>{%c5?^z!^Q#hq7QHJYmPvy zWKOuYn)?|>14wPIdynQgY;DY0+s*at(HzH?;BJr3+-|OSPv&$#O)|bIOb2Ecg4$Wh z6dSfZh`KGT07Ss@r$e`l^ssOyAaDi+i?hY~X~f6voLGBxBHgfylR@9fX?B6044Fci z3_lZduTJz_%j`9>luRV2Aq+EsAg3X^(*T|!lOI-{n_A``q59)g@&}m4)6^eO-@^<& zP5lnFIF{Um?H@@*E{<`@7~_AUGj6=Zz9(?T)BI8NH3EO|8I}G&? z`okFDuTAoxCL_&c9rRg(ZpeG4!KP0|isLINOOmfoye?yX;$_n37+!N9iL9wv=lnk6 z(?}%_nmSDn7ENF6ot!eJ{jweIom^wl?B3K9gvU40bzAtI8AAkdBaqlqN-c6SrY~X@ z{Y!S-^hJl;7iLB~3q}I^f&ZRN~=YIwoO>8iD`9e&* zKsVpUo>=cD_6ew)h{g76x|3V%fTkVc_mSR2|Mst3^Cx{G0IQL@aHOmq!I*x58~*9$ Ee?dl!0{{R3 diff --git a/race special/common/target/classes/org/example/utils/AiPictureUtil$AiPictureUtilBuilder.class b/race special/common/target/classes/org/example/utils/AiPictureUtil$AiPictureUtilBuilder.class deleted file mode 100644 index 2518a579ff2bf6f712ed66f8344514186fe0754f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1749 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 WOyCWwC75cDvUO>O-_Lji>AwLC7m-&0 diff --git a/race special/common/target/classes/org/example/utils/AiUtil.class b/race special/common/target/classes/org/example/utils/AiUtil.class deleted file mode 100644 index 2631d47e20bae2ca3d6147f8b5fe9852407c4b8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12624 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 CI8<5y diff --git a/race special/pojo/HELP.md b/race special/pojo/HELP.md deleted file mode 100644 index 54e228d..0000000 --- a/race special/pojo/HELP.md +++ /dev/null @@ -1,18 +0,0 @@ -# Getting Started - -### Reference Documentation - -For further reference, please consider the following sections: - -* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) -* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.4/maven-plugin) -* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.4/maven-plugin/build-image.html) - -### Maven Parent overrides - -Due to Maven's design, elements are inherited from the parent POM to the project POM. -While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the -parent. -To prevent this, the project POM contains empty overrides for these elements. -If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides. - diff --git a/race special/pojo/pom.xml b/race special/pojo/pom.xml deleted file mode 100644 index ddc2684..0000000 --- a/race special/pojo/pom.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - 4.0.0 - - org.example - racespecial - 0.0.1-SNAPSHOT - - org.example - pojo - 0.0.1-SNAPSHOT - pojo - pojo - - - - - - - - - - - - - - - - - org.projectlombok - lombok - - - com.fasterxml.jackson.core - jackson-databind - 2.9.2 - - - com.github.xiaoymin - knife4j-spring-boot-starter - - - org.projectlombok - lombok - provided - - - org.projectlombok - lombok - provided - - - org.projectlombok - lombok - provided - - - org.projectlombok - lombok - provided - - - org.projectlombok - lombok - provided - - - org.projectlombok - lombok - provided - - - - diff --git a/race special/pojo/src/main/java/org/example/pojo/DTO/UserLoginDTO.java b/race special/pojo/src/main/java/org/example/pojo/DTO/UserLoginDTO.java deleted file mode 100644 index 524fd01..0000000 --- a/race special/pojo/src/main/java/org/example/pojo/DTO/UserLoginDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.example.pojo.DTO; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -@Data -@ApiModel(description = "用户登录时传递的数据模型") -public class UserLoginDTO implements Serializable { - @ApiModelProperty("用户名") - private String username; - @ApiModelProperty("密码") - private String password; -} diff --git a/race special/pojo/src/main/java/org/example/pojo/VO/UserLoginVO.java b/race special/pojo/src/main/java/org/example/pojo/VO/UserLoginVO.java deleted file mode 100644 index fff6800..0000000 --- a/race special/pojo/src/main/java/org/example/pojo/VO/UserLoginVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.example.pojo.VO; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ApiModel(description = "用户登录时返回的数据格式") -public class UserLoginVO implements Serializable { - @ApiModelProperty("主键值") - private Long id; - @ApiModelProperty("用户名") - private String username; - @ApiModelProperty("姓名") - private String name; - @ApiModelProperty("jwt令牌") - private String token; -} diff --git a/race special/pojo/src/main/java/org/example/pojo/entity/user.java b/race special/pojo/src/main/java/org/example/pojo/entity/user.java deleted file mode 100644 index 6676f8e..0000000 --- a/race special/pojo/src/main/java/org/example/pojo/entity/user.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.example.pojo.entity; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.time.LocalDateTime; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class user implements Serializable { - private static final long serialVersionUID = 1L; - private Long id; - private String name; - private String password; - private String username; - private Long count; - private LocalDateTime loginTime; - private LocalDateTime logoutTime; - private LocalDateTime updateAt; -} diff --git a/race special/pom.xml b/race special/pom.xml deleted file mode 100644 index 85467f1..0000000 --- a/race special/pom.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - 4.0.0 - org.example - racespecial - 0.0.1-SNAPSHOT - pom - - - org.springframework.boot - spring-boot-starter-parent - 2.7.3 - - - - - common - pojo - server - - - - - - - - - - - - - - - - - - 1.8 - 2.2.0 - 1.18.20 - 2.6 - 1.2.1 - 1.3.0 - 3.10.2 - 3.0.2 - 1.9.4 - 0.9.1 - 3.16 - 2.3.1 - - 2.3.6 - - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis.spring} - - - - org.projectlombok - lombok - ${lombok} - - - - - com.fasterxml.jackson.core - jackson-databind - 2.15.3 - - - - commons-lang - commons-lang - ${commons.lang} - - - - com.alibaba - druid-spring-boot-starter - ${druid} - - - - com.github.pagehelper - pagehelper-spring-boot-starter - ${pagehelper} - - - - com.github.xiaoymin - knife4j-spring-boot-starter - ${knife4j} - - - - org.aspectj - aspectjrt - ${aspectj} - - - - org.aspectj - aspectjweaver - ${aspectj} - - - - io.jsonwebtoken - jjwt - ${jjwt} - - - - com.aliyun.oss - aliyun-sdk-oss - ${aliyun.sdk.oss} - - - - javax.xml.bind - jaxb-api - ${jaxb-api} - - - org.glassfish.jaxb - jaxb-runtime - ${jaxb-runtime} - - - com.sun.activation - javax.activation - 1.2.0 - - - - - org.apache.poi - poi - ${poi} - - - org.apache.poi - poi-ooxml - ${poi} - - - - com.github.wechatpay-apiv3 - wechatpay-apache-httpclient - 0.4.8 - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - - \ No newline at end of file diff --git a/race special/server/HELP.md b/race special/server/HELP.md deleted file mode 100644 index 54e228d..0000000 --- a/race special/server/HELP.md +++ /dev/null @@ -1,18 +0,0 @@ -# Getting Started - -### Reference Documentation - -For further reference, please consider the following sections: - -* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) -* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.4/maven-plugin) -* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.4/maven-plugin/build-image.html) - -### Maven Parent overrides - -Due to Maven's design, elements are inherited from the parent POM to the project POM. -While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the -parent. -To prevent this, the project POM contains empty overrides for these elements. -If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides. - diff --git a/race special/server/pom.xml b/race special/server/pom.xml deleted file mode 100644 index 3a27481..0000000 --- a/race special/server/pom.xml +++ /dev/null @@ -1,168 +0,0 @@ - - 4.0.0 - - org.example - racespecial - 0.0.1-SNAPSHOT - - org.example - server - 0.0.1-SNAPSHOT - server - server - - - - - - - - - - - - - - - - - - com.github.xiaoymin - knife4j-spring-boot-starter - 3.0.3 - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - org.springframework.boot - spring-boot-starter - - - org.example - common - 0.0.1-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.boot - spring-boot-starter-web - compile - - - - com.mysql - mysql-connector-j - 8.0.33 - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - - - - org.projectlombok - lombok - - - - - com.fasterxml.jackson.core - jackson-databind - - - com.alibaba - fastjson - 1.2.76 - - - com.alibaba - druid-spring-boot-starter - - - - com.github.pagehelper - pagehelper-spring-boot-starter - - - - org.aspectj - aspectjrt - - - - org.aspectj - aspectjweaver - - - - com.github.xiaoymin - knife4j-spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.springframework.boot - spring-boot-starter-cache - - - - org.springframework.boot - spring-boot-starter-websocket - - - - javax.xml.bind - jaxb-api - - - org.glassfish.jaxb - jaxb-runtime - - - com.sun.activation - javax.activation - - - - - - org.apache.poi - poi - - - org.apache.poi - poi-ooxml - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - \ No newline at end of file diff --git a/race special/server/src/main/java/org/example/server/ServerApplication.java b/race special/server/src/main/java/org/example/server/ServerApplication.java deleted file mode 100644 index 25e1f8b..0000000 --- a/race special/server/src/main/java/org/example/server/ServerApplication.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.example.server; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.web.bind.annotation.CrossOrigin; - -@SpringBootApplication -@ComponentScan(basePackages = {"org.example.server.handler,org.example.server.mapper,org.example.server.service,org.example.server.controller,org.example.properties,org.example.server.interceptor", "org.example.server.configuration"}) -public class ServerApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerApplication.class, args); - } - -} \ No newline at end of file diff --git a/race special/server/src/main/java/org/example/server/configuration/AiConfiguration.java b/race special/server/src/main/java/org/example/server/configuration/AiConfiguration.java deleted file mode 100644 index 8b59e09..0000000 --- a/race special/server/src/main/java/org/example/server/configuration/AiConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.example.server.configuration; - -import lombok.extern.slf4j.Slf4j; -import org.example.properties.AiProperties; -import org.example.utils.AiUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@Slf4j -public class AiConfiguration { - @Bean - public AiUtil aiUtil(AiProperties aiProperties) { - return new AiUtil(aiProperties.getApiKey(),aiProperties.getApiKey1(),aiProperties.getDeepSeekUrl(), - aiProperties.getTongYingUrl(), aiProperties.getAppId(), aiProperties.getAppKey(), aiProperties.getHttpMethod(), aiProperties.getHttpUrl(), aiProperties.getRequestUrl()); - } -} diff --git a/race special/server/src/main/java/org/example/server/configuration/WebMvcConfiguration.java b/race special/server/src/main/java/org/example/server/configuration/WebMvcConfiguration.java deleted file mode 100644 index 2d06d2f..0000000 --- a/race special/server/src/main/java/org/example/server/configuration/WebMvcConfiguration.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.example.server.configuration; - -import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -import lombok.extern.slf4j.Slf4j; -import org.example.json.JacksonObjectMapper; -import org.example.server.interceptor.JwtTokenAdminInterceptor; -import org.example.server.interceptor.JwtTokenUserceptor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -import java.util.List; - -/** - * 配置类,注册web层相关组件 - */ -@Configuration -@Slf4j -@ConditionalOnWebApplication -@EnableSwagger2 -@EnableKnife4j -public class WebMvcConfiguration extends WebMvcConfigurationSupport { - - @Autowired - private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; - @Autowired - private JwtTokenUserceptor jwtTokenUserInterceptor; - /** - * 注册自定义拦截器 - * - * @param registry - */ - protected void addInterceptors(InterceptorRegistry registry) { - log.info("开始注册自定义拦截器..."); - registry.addInterceptor(jwtTokenUserInterceptor) - .addPathPatterns("/user/**") - .excludePathPatterns("/user/user/login") - .excludePathPatterns("/user/shop/status") - .excludePathPatterns("/user/questionSimple"); - - } - - /** - * 通过knife4j生成接口文档 - * @return - */ - @Bean - public Docket docket() { - ApiInfo apiInfo = new ApiInfoBuilder() - .title("vivo蓝心大模型开发文档") - .version("1.0") - .description("vivo文档") - .build(); - Docket docket = new Docket(DocumentationType.SWAGGER_2) - .groupName("用户端接口") - .apiInfo(apiInfo) - .select() - .apis(RequestHandlerSelectors.basePackage("org.example.server.controller")) - .paths(PathSelectors.any()) - .build(); - return docket; - } - /** - * 设置静态资源映射 - * @param registry - */ - @Override - protected void addResourceHandlers(ResourceHandlerRegistry registry) { - log.info("开始设置静态资源映射"); - registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); - } - @Override - protected void extendMessageConverters(List> converters) { - log.info("扩展消息转化器"); - MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); - converter.setObjectMapper(new JacksonObjectMapper()); - converters.add(0,converter); - } -} diff --git a/race special/server/src/main/java/org/example/server/configuration/WebSocketConfiguration.java b/race special/server/src/main/java/org/example/server/configuration/WebSocketConfiguration.java deleted file mode 100644 index 48d5b22..0000000 --- a/race special/server/src/main/java/org/example/server/configuration/WebSocketConfiguration.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.example.server.configuration; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -/** - * WebSocket配置类,用于注册WebSocket的Bean - */ -@Configuration -public class WebSocketConfiguration { - - @Bean - @ConditionalOnWebApplication - public ServerEndpointExporter serverEndpointExporter() { - return new ServerEndpointExporter(); - } -/*这个代码我之后并没有创建它的对象,是不是可以推测这个被注入到ioc容器之后,依赖底层会进行某些操作需要用到他 -是的,当你使用 @Bean 注解将 ServerEndpointExporter 方法注册到 Spring 的 IOC 容器中,即便你在代码里没有显式创建它的对象,底层框架也会用到它。 -ServerEndpointExporter 是 Spring 对 JSR - 356(Java API for WebSocket)的支持组件,它的主要作用是扫描带有 @ServerEndpoint 注解的类,然后将这些 WebSocket 端点注册到 Spring 容器里,从而让 WebSocket 端点能够被 Spring 管理。 -下面是它的具体工作流程: -注册到 IOC 容器:借助 @Bean 注解,ServerEndpointExporter 实例会被注册到 Spring 的 IOC 容器中。 -自动扫描:ServerEndpointExporter 会自动扫描项目里所有带有 @ServerEndpoint 注解的类。 -端点注册:把扫描到的 @ServerEndpoint 注解类注册为 WebSocket 端点,如此一来,这些端点就能处理 WebSocket 连接与消息了。 -所以,即便你没有在代码中显式创建 ServerEndpointExporter 对象,Spring 框架在启动时会自动调用 serverEndpointExporter() 方法, -创建 ServerEndpointExporter 实例,进而完成 WebSocket 端点的注册工作。*/ - /*工作机制 -ServerEndpointExporter的作用:ServerEndpointExporter属于 Spring 框架里专门用于 WebSocket 的一个组件。它的主要功能是扫描项目里所有带有@ServerEndpoint注解的类, -并且将这些类注册到 WebSocket 服务器中。 -生命周期回调:当 Spring 容器完成ServerEndpointExporter这个 Bean 的创建后,会调用其afterPropertiesSet方法(ServerEndpointExporter实现了InitializingBean接口)。 -在这个方法里,ServerEndpointExporter会扫描所有带有@ServerEndpoint注解的类,然后把这些类注册到底层的 WebSocket 服务器里。*/ - /*是的,被注入到 Spring IOC(控制反转)容器中的实例,并非所有方法都会自动执行。下面从不同情况来详细分析: -1. 常规方法不会自动执行 -在 Spring IOC 容器里,一个 Bean 实例化后, -只有特定的方法会被自动调用,而普通的业务方法不会自动执行 -import org.springframework.stereotype.Component; - -@Component -public class MyService { - - public void doSomething() { - System.out.println("Doing something..."); - } -} -在上述代码中,MyService类被标记为@Component, -会被 Spring IOC 容器管理。但doSomething方法不会自动执行, -只有在其他代码中显式调用时才会执行 -. 特定生命周期方法会自动执行 -Spring IOC 容器会在特定的生命周期阶段自动调用一些方法,常见的有以下几种情况: -实现InitializingBean接口 -当一个 Bean 实现了InitializingBean接口, -Spring 会在 Bean 的属性设置完成后调用afterPropertiesSet方法 -使用@PostConstruct注解 -使用@PostConstruct注解标注的方法会在 Bean 的依赖注入完成后自动执行。*/ -//so easy,这就是生命周期的意义吗,啊,爽了 -} diff --git a/race special/server/src/main/java/org/example/server/controller/ai/test.java b/race special/server/src/main/java/org/example/server/controller/ai/test.java deleted file mode 100644 index a47a236..0000000 --- a/race special/server/src/main/java/org/example/server/controller/ai/test.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.example.server.controller.ai; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@Slf4j -@RequestMapping("/test") -public class test { - @PostMapping("/test1") - public String test1() { - return "test1"; - } -} diff --git a/race special/server/src/main/java/org/example/server/controller/user/ai.java b/race special/server/src/main/java/org/example/server/controller/user/ai.java deleted file mode 100644 index f8ea6c1..0000000 --- a/race special/server/src/main/java/org/example/server/controller/user/ai.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.example.server.controller.user; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.example.result.Result; -import org.example.server.service.AiService; -import org.example.utils.AiUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import java.util.HashMap; -import java.util.Map; - -@RestController -@Slf4j -@RequestMapping("/user") -@Api("用户端ai开发") -public class ai { - @Autowired - private AiUtil aiUtil; - @Autowired - private AiService aiService; - @PostMapping("/questionSimple") - @ApiOperation(value="简单文本输出",notes = "服务器会自动生成或获取SessionID,用于会话管理") - public Result> questionSimple(HttpSession session, @RequestParam String question) throws Exception { - String id = session.getId(); - log.info("这是sessionid,{} question,{}",session.getId(),question); - Map map = new HashMap<>(); - map.put("SessionId",id); - //前端一定要保存下来sessionId,不保存也行其实 - String respond=aiService.question(id,question); - map.put("Respond",respond); - return Result.success(map); - - } - - - - - - -} diff --git a/race special/server/src/main/java/org/example/server/handler/GlobalExceptionHandler.java b/race special/server/src/main/java/org/example/server/handler/GlobalExceptionHandler.java deleted file mode 100644 index 11824bb..0000000 --- a/race special/server/src/main/java/org/example/server/handler/GlobalExceptionHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.example.server.handler; - - -import lombok.extern.slf4j.Slf4j; -import org.example.constant.MessageConstant; -import org.example.exception.BaseException; -import org.example.result.Result; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import java.sql.SQLIntegrityConstraintViolationException; - -/** - * 全局异常处理器,处理项目中抛出的业务异常 - */ -@RestControllerAdvice -@Slf4j -public class GlobalExceptionHandler { - - /** - * 捕获业务异常 - * @param ex - * @return - */ - @ExceptionHandler - public Result exceptionHandler(BaseException ex){ - log.error("异常信息:{}", ex.getMessage()); - return Result.error(ex.getMessage()); - } - @ExceptionHandler - public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){ - log.error("异常信息{}", ex.getMessage()); - if(ex.getMessage().contains("Duplicate entry")){ - String []split = ex.getMessage().split(" "); - String username=split[2]; - String message=username+ MessageConstant.ALREADY_EXITS; - return Result.error(message); - }else{ - return Result.error(MessageConstant.UNKNOWN_ERROR); - - } - } -} diff --git a/race special/server/src/main/java/org/example/server/interceptor/JwtTokenAdminInterceptor.java b/race special/server/src/main/java/org/example/server/interceptor/JwtTokenAdminInterceptor.java deleted file mode 100644 index 5904120..0000000 --- a/race special/server/src/main/java/org/example/server/interceptor/JwtTokenAdminInterceptor.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.example.server.interceptor; - -import io.jsonwebtoken.Claims; -import lombok.extern.slf4j.Slf4j; -import org.example.constant.JwtClaimsConstant; -import org.example.context.BaseContext; -import org.example.properties.JwtProperties; -import org.example.utils.JwtUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * jwt令牌校验的拦截器 - */ -@Component -@Slf4j -public class JwtTokenAdminInterceptor implements HandlerInterceptor { - - @Autowired - private JwtProperties jwtProperties; - - /** - * 校验jwt - * - * @param request - * @param response - * @param handler - * @return - * @throws Exception - */ - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - System.out.println("线程id"+Thread.currentThread().getId()); - - //判断当前拦截到的是Controller的方法还是其他资源 - if (!(handler instanceof HandlerMethod)) { - //当前拦截到的不是动态方法,直接放行 - return true; - } - - //1、从请求头中获取令牌 - String token = request.getHeader(jwtProperties.getAdminTokenName()); - - //2、校验令牌 - try { - log.info("jwt校验:{}", token); - Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token); - Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString()); - BaseContext.setCurrentId(empId); - log.info("当前员工id{}", empId); - //3、通过,放行 - return true; - } catch (Exception ex) { - //4、不通过,响应401状态码 - response.setStatus(401); - return false; - } - } -} diff --git a/race special/server/src/main/java/org/example/server/interceptor/JwtTokenUserceptor.java b/race special/server/src/main/java/org/example/server/interceptor/JwtTokenUserceptor.java deleted file mode 100644 index fce23e9..0000000 --- a/race special/server/src/main/java/org/example/server/interceptor/JwtTokenUserceptor.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.example.server.interceptor; - -import io.jsonwebtoken.Claims; -import lombok.extern.slf4j.Slf4j; -import org.example.constant.JwtClaimsConstant; -import org.example.context.BaseContext; -import org.example.properties.JwtProperties; -import org.example.utils.JwtUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * jwt令牌校验的拦截器 - */ -@Component -@Slf4j -public class JwtTokenUserceptor implements HandlerInterceptor { - - @Autowired - private JwtProperties jwtProperties; - - /** - * 校验jwt - * - * @param request - * @param response - * @param handler - * @return - * @throws Exception - */ - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - System.out.println("线程id"+Thread.currentThread().getId()); - - //判断当前拦截到的是Controller的方法还是其他资源 - if (!(handler instanceof HandlerMethod)) { - //当前拦截到的不是动态方法,直接放行 - return true; - } - - //1、从请求头中获取令牌 - String token = request.getHeader(jwtProperties.getUserTokenName()); - //1、从请求头中获取令牌 - - if (token == null) { - log.info("请求头中未包含JWT令牌"); - response.setStatus(401); - return false; - } - //2、校验令牌 - try { - log.info("jwt校验:{}", token); - Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token); - Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString()); - BaseContext.setCurrentId(userId); - log.info("当前员工id{}", userId); - //3、通过,放行 - return true; - } catch (Exception ex) { - //4、不通过,响应401状态码 - response.setStatus(401); - return false; - } - } -} diff --git a/race special/server/src/main/java/org/example/server/mapper/AiMapper.java b/race special/server/src/main/java/org/example/server/mapper/AiMapper.java deleted file mode 100644 index 1678658..0000000 --- a/race special/server/src/main/java/org/example/server/mapper/AiMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example.server.mapper; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface AiMapper { -} diff --git a/race special/server/src/main/java/org/example/server/service/AiService.java b/race special/server/src/main/java/org/example/server/service/AiService.java deleted file mode 100644 index dae0106..0000000 --- a/race special/server/src/main/java/org/example/server/service/AiService.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example.server.service; - -import javax.servlet.http.HttpSession; - -public interface AiService { - String question(String SessionId, String question) throws Exception; -} diff --git a/race special/server/src/main/java/org/example/server/service/Aiserviceimpl.java b/race special/server/src/main/java/org/example/server/service/Aiserviceimpl.java deleted file mode 100644 index 9bdbebe..0000000 --- a/race special/server/src/main/java/org/example/server/service/Aiserviceimpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.example.server.service; - -import org.example.utils.AiUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpSession; - -@Service -public class Aiserviceimpl implements AiService{ - @Autowired - private AiUtil aiUtil; - @Override - public String question(String SessionId, String question) throws Exception { - return aiUtil.getString(question, SessionId); - } -} diff --git a/race special/server/src/main/java/org/example/server/websocket/WebSocketServer.java b/race special/server/src/main/java/org/example/server/websocket/WebSocketServer.java deleted file mode 100644 index 557e5bf..0000000 --- a/race special/server/src/main/java/org/example/server/websocket/WebSocketServer.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.example.server.websocket; - -import org.springframework.stereotype.Component; - -import javax.websocket.OnClose; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.server.PathParam; -import javax.websocket.server.ServerEndpoint; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -/** - * WebSocket服务 - */ - -@Component -@ServerEndpoint("/ws/{sid}") -public class WebSocketServer { - - //存放会话对象 - private static Map sessionMap = new HashMap(); - - /** - * 连接建立成功调用的方法 - */ - - @OnOpen - public void onOpen(Session session, @PathParam("sid") String sid) { - System.out.println("客户端:" + sid + "建立连接"); - sessionMap.put(sid, session); - } - - /** - * 收到客户端消息后调用的方法 - * - * @param message 客户端发送过来的消息 - */ - - @OnMessage - public void onMessage(String message, @PathParam("sid") String sid) { - System.out.println("收到来自客户端:" + sid + "的信息:" + message); - } - - /** - * 连接关闭调用的方法 - * - * @param sid - */ - @OnClose - public void onClose(Session session, @PathParam("sid") String sid) { - sessionMap.remove(sid); - } - public void sendToAllClient(String message) { - Collection sessions = sessionMap.values(); - for (Session session : sessions) { - try { - //服务器向客户端发送消息 - session.getBasicRemote().sendText(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - } -//妙啊,这些东西都是谁设计出来的,太尼玛的牛逼了,这思维,啊啊啊啊啊啊啊啊 -} diff --git a/race special/server/src/main/resources/application-dev.yml b/race special/server/src/main/resources/application-dev.yml deleted file mode 100644 index 9a73c26..0000000 --- a/race special/server/src/main/resources/application-dev.yml +++ /dev/null @@ -1,35 +0,0 @@ -race: - deepseek: - api-key: sk-b6baa9fc68b742f780fc9b64f4635868 - api-key1: sk-d88586a4d04744c2a0fea3a0e2841aca - deep-seek-url: https://api.deepseek.com/chat/completions - tong-ying-url: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions - app-id: 2025158089 - app-key: FIKXhKoeMNzWSCLV - http-method: POST - http-url: /vivogpt/completions - request-url: https://api-ai.vivo.com.cn/vivogpt/completions - picture: - app-id: 2025158089 - app-key: FIKXhKoeMNzWSCLV - http-method: POST - http-url: /api/v1/task_submit - request-url: https://api-ai.vivo.com.cn/api/v1/task_submit - querypicture: - app-id: 2025158089 - app-key: FIKXhKoeMNzWSCLV - http-method: POST - http-url: /api/v1/task_progress - request-url: https://api-ai.vivo.com.cn/api/v1/task_progress - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - host: 10.9.29.24 - port: 3306 - database: sky_take_out - username: root - password: zhang20061023@ - redis: - host: localhost - port: 6379 - #password: 123456 - database: 0 diff --git a/race special/server/src/main/resources/application.yml b/race special/server/src/main/resources/application.yml deleted file mode 100644 index 2249ffd..0000000 --- a/race special/server/src/main/resources/application.yml +++ /dev/null @@ -1,67 +0,0 @@ - -server: - port: 8080 - -spring: - profiles: - active: dev - main: - allow-circular-references: true - datasource: - druid: - driver-class-name: ${race.datasource.driver-class-name} - url: jdbc:mysql://${race.datasource.host}:${race.datasource.port}/${race.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true - username: ${race.datasource.username} - password: ${race.datasource.password} - redis: - host: ${race.redis.host} - port: ${race.redis.port} - password: ${race.redis.password} - database: ${race.redis.database} -mybatis: - mapper-locations: classpath:mapper/*.xml - type-aliases-package: org.example.entity - configuration: - map-underscore-to-camel-case: true -#mapper配置文件 -logging: - level: - org: - example: - mapper: debug - service: info - controller: info -race: - jwt: - admin-ttl: 7200000000000000000 - # 设置前端传递过来的令牌名称 - user-secret-key: itheima - user-ttl: 7200000000000 - user-token-name: authentication - admin-token-name: token - admin-secret-key: itcast - deepseek: - api-key: ${sky.deepseek.api-key} - api-key1: ${sky.deepseek.api-key1} - deep-seek-url: ${sky.deepseek.deep-seek-url} - tong-ying-url: ${sky.deepseek.tong-ying-url} - app-id: ${race.deepseek.app-id} - app-key: ${race.deepseek.app-key} - http-method: ${race.deepseek.http-method} - http-url: ${race.deepseek.http-url} - request-url: ${race.deepseek.request-url} - picture: - app-id: ${race.picture.app-id} - app-key: ${race.picture.app-key} - http-method: ${race.picture.http-method} - http-url: ${race.picture.http-url} - request-url: ${race.picture.request-url} - querypicture: - app-id: ${race.querypicture.app-id} - app-key: ${race.querypicture.app-key} - http-method: ${race.querypicture.http-method} - http-url: ${race.querypicture.http-url} - request-url: ${race.querypicture.request-url} -springfox: - documentation: - enabled: false \ No newline at end of file diff --git a/race special/server/src/test/java/org/example/testServer/ServerApplicationTests.java b/race special/server/src/test/java/org/example/testServer/ServerApplicationTests.java deleted file mode 100644 index 4ae4ff7..0000000 --- a/race special/server/src/test/java/org/example/testServer/ServerApplicationTests.java +++ /dev/null @@ -1,274 +0,0 @@ -package org.example.testServer; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; -import org.example.server.ServerApplication; -import org.example.server.configuration.WebSocketConfiguration; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.web.bind.annotation.RequestHeader; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import javax.servlet.http.HttpSession; -import javax.websocket.Session; -import java.io.*; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.time.Instant; -import java.util.Base64; -import java.util.Dictionary; -import java.util.UUID; - -import static org.mockito.Mockito.when; - -@SpringBootTest( classes = ServerApplication.class, // 显式指定主应用类 - webEnvironment = SpringBootTest.WebEnvironment.NONE) -class ServerApplicationTests { -//蓝心大模型AppID -//2025158089 -//蓝心大模型AppKEY -//FIKXhKoeMNzWSCLV - @Test - void contextLoads() throws IOException { - CloseableHttpClient httpclient = HttpClients.createDefault(); - HttpPost httppost = new HttpPost("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"); - httppost.setHeader("Content-Type", "application/json"); - httppost.setHeader("Accept", "application/json"); - httppost.setHeader("Authorization", "Bearer " + "sk-d88586a4d04744c2a0fea3a0e2841aca"); - String requestBody = "{\"model\": \"qwen-plus\", \"messages\": [" + - "{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"}," + - "{\"role\": \"user\", \"content\":\"" + "你好,请解释一下级数的概念,详细一点" + "\" }" + - "], \"stream\": true,\"stream_options\":{\"include_usage\":true}}"; - HttpEntity requestEntity = new StringEntity(requestBody, StandardCharsets.UTF_8); - httppost.setEntity(requestEntity); - CloseableHttpResponse response = httpclient.execute(httppost); - if (response.getStatusLine().getStatusCode() == 200) { - InputStream content = response.getEntity().getContent(); - InputStreamReader reader = new InputStreamReader(content, StandardCharsets.UTF_8); - BufferedReader br = new BufferedReader(reader); - String length; - while ((length = br.readLine()) != null) { - if (length.startsWith("data: ")) { - String jsonPart = length.substring(6).trim(); - if ("[DONE]".equals(jsonPart)) { - break; - } - JSONObject jsonObject = JSONObject.parseObject(jsonPart); - JSONArray jsonArray = jsonObject.getJSONArray("choices"); - for (Object object : jsonArray) { - JSONObject json = (JSONObject) object; - JSONObject jsonobject = json.getJSONObject("delta"); - String string = jsonobject.getString("content"); - System.out.println(string); - } - } - } - } - response.close(); - } - @MockBean - private HttpSession session; - @Test - void test(/*Session session*/) throws Exception { - CloseableHttpClient httpclient = HttpClients.createDefault(); - // 构建HTTP请求 - String appId = "2025158089"; - String appKey = "FIKXhKoeMNzWSCLV"; - String httpMethod = "POST"; - //String httpUri = "/vivogpt/completions"; - String httpUri="/api/v1/task_submit"; - //String requestUrl = "https://api-ai.vivo.com.cn" + httpUri; - String requestUrl="https://api-ai.vivo.com.cn"+httpUri; - //生成八位随机字符串 - final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - StringBuilder sb = new StringBuilder(8); - SecureRandom secureRandom = new SecureRandom(); - for (int i = 0; i < 8; i++) { - int randomIndex = secureRandom.nextInt(ALPHABET.length()); - sb.append(ALPHABET.charAt(randomIndex)); - } - String string = sb.toString(); - UUID requestId = UUID.randomUUID(); - /*URIBuilder builder = new URIBuilder(requestUrl); - builder.addParameter("requestId", requestId.toString()); - //builder.addParameter("requestId", URLEncoder.encode(requestId.toString(),StandardCharsets.UTF_8.toString())); - URI uri = builder.build();*/ - HttpPost httpPost = new HttpPost(requestUrl); - httpPost.setHeader("Content-Type", "application/json"); - httpPost.setHeader("X-AI-GATEWAY-APP-ID","2025158089"); - long epochSecond = Instant.now().getEpochSecond(); - httpPost.setHeader("X-AI-GATEWAY-TIMESTAMP",epochSecond+""); - httpPost.setHeader("X-AI-GATEWAY-NONCE",string); - //String canonicalQueryString="requestId="+requestId; - String canonicalQueryString=""; - String s = calculateSignature(httpMethod, httpUri, canonicalQueryString, appId, epochSecond, string, appKey); - httpPost.setHeader("X-AI-GATEWAY-SIGNATURE",s); - httpPost.setHeader("X-AI-GATEWAY-SIGNED-HEADERS","x-ai-gateway-app-id;x-ai-gateway-timestamp;x-ai-gateway-nonce"); - // 生成合法的 UUID 字符串 - when(session.getId()).thenReturn(String.valueOf(requestId)); - String id = session.getId(); - UUID uuid = UUID.fromString(id); - /*String systemPrompt="你是一个生活小贴士,专门用来为别人做每一天的生活规划的。"; - String requestBody = "{" + - "\"messages\":[" + - "{\"role\":\"user\",\"content\":\"你好呀\"}," + - "{\"role\":\"assistant\",\"content\":\"你好!我是vivo助手,有什么可以帮助你的吗?\"}," + - "{\"role\":\"user\",\"content\":\"今天天气如何?\"}," + - "{\"role\":\"assistant\",\"content\":\"根据天气预报,今天天气晴朗,气温25℃,非常适合户外活动。\"}," + - "{\"role\":\"user\",\"content\":\"适合穿什么衣服?\"}" + - "]," + - "\"model\":\"vivo-BlueLM-TB-Pro\"," + - "\"sessionId\":\"" + uuid + "\"," + - "\"systemPrompt\":\"" + systemPrompt + "\"," + - "\"extra\":{" + - "\"temperature\":0.9," + - "\"top_p\":0.7," + - "\"top_k\":50," + - "\"max_new_tokens\":2048," + - "\"repetition_penalty\":1.02" + - "}" + - "}"; - // 在 httpclient.execute(httpPost) 前添加以下调试代码 - System.out.println("===== 请求调试信息 ====="); - System.out.println("Request URL: " + httpPost.getURI()); - System.out.println("Headers:"); - for (Header header : httpPost.getAllHeaders()) { - System.out.println(" " + header.getName() + ": " + header.getValue()); - } - System.out.println("Canonical Query String: " + canonicalQueryString); - System.out.println("Signing String: " + s); // 在 calculateSignature 方法中添加打印 - System.out.println("Generated Signature: " + s); - System.out.println("=======================");*/ - String requestBody = "{" + - "\"dataId\": \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"," + - "\"businessCode\": \"pc\"," + - "\"userAccount\": \"openid_123456\"," + - "\"prompt\": \"梦泪老师在偷塔\"," + - "\"imageType\": 1," + - "\"styleConfig\": \"4cbc9165bc615ea0815301116e7925a3\"," + - "\"height\": 512," + - "\"width\": 512," + - "\"seed\": -1," + - "\"cfgScale\": 7," + - "\"denoisingStrength\": 0.1," + - "\"ctrlNetStrength\": 0.5," + - "\"steps\": 15," + - "\"negativePrompt\": \"低分辨率, 扭曲的面部\"" + - "}"; - httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8)); - CloseableHttpResponse response = httpclient.execute(httpPost); - if (response.getStatusLine().getStatusCode() == 200) { - /* HttpEntity entity = response.getEntity(); - JSONObject jsonObject = JSONObject.parseObject(EntityUtils.toString(entity)); - jsonObject = jsonObject.getJSONObject("data"); - String string1 = jsonObject.getString("content"); - System.out.println(string1);*/ - HttpEntity entity = response.getEntity(); - JSONObject jsonObject = JSONObject.parseObject(EntityUtils.toString(entity)); - JSONObject result = jsonObject.getJSONObject("result"); - String string1 = result.getString("task_id"); - //开始查询作画任务 - response.close(); - httpclient.close(); - String httpurL="/api/v1/task_progress"; - String requestURL="https://api-ai.vivo.com.cn"+httpurL; - CloseableHttpClient httpclient1 = HttpClients.createDefault(); - for(int i=0;i<5;i++) { - URIBuilder uriBuilder = new URIBuilder(requestURL); - uriBuilder.addParameter("task_id", string1); - URI build = uriBuilder.build(); - HttpGet httpGet = new HttpGet(build); - String canonicalQueryString1 = "task_id=" + string1; - httpGet.setHeader("X-AI-GATEWAY-TIMESTAMP", epochSecond + ""); - httpGet.setHeader("X-AI-GATEWAY-NONCE", string); - httpGet.setHeader("X-AI-GATEWAY-SIGNED-HEADERS", "x-ai-gateway-app-id;x-ai-gateway-timestamp;x-ai-gateway-nonce"); - String s1 = calculateSignature("GET", httpurL, canonicalQueryString1, appId, epochSecond, string, appKey); - httpGet.setHeader("X-AI-GATEWAY-SIGNATURE", s1); - httpGet.setHeader("Content-Type", "application/json"); - httpGet.setHeader("X-AI-GATEWAY-APP-ID", "2025158089"); - CloseableHttpResponse execute = httpclient1.execute(httpGet); - if (execute.getStatusLine().getStatusCode() == 200) { - // 1. 一次性读取完整响应内容(推荐使用 EntityUtils) - String responseBody = EntityUtils.toString(execute.getEntity()); - - // 2. 解析完整的 JSON 对象 - JSONObject jsonObject1 = JSONObject.parseObject(responseBody); - JSONObject result1 = jsonObject1.getJSONObject("result"); - Integer status = result1.getInteger("status"); - System.out.println(responseBody); - // 3. 检查任务状态 - if (status==2) { - System.out.println("任务完成,响应内容:"); - System.out.println(responseBody); - break;// 直接打印完整响应 - // 此处可提取 images_url 等信息 - } else { - System.out.println("任务未完成,当前状态:" + status); - } - } else { - System.out.println("HTTP请求失败,状态码:" + execute.getStatusLine().getStatusCode()); - } - if (i < 4) { - Thread.sleep(3000); - } - } - - } - - - } - private static String calculateSignature( - String httpMethod, - String httpUri, - String canonicalQueryString, - String appId, - long timestamp, // 输入为 long 类型 - String nonce, - String appKey) throws Exception { - - // 显式将 timestamp 转换为字符串 - String timestampStr = String.valueOf(timestamp); - - // 构建签名字符串(所有参数均为字符串) - String signingString = String.join("\n", - httpMethod.toUpperCase(), // POST - httpUri, // /vivogpt/completions - canonicalQueryString, // requestId=xxx - appId, // "2025158089" - timestampStr, // "1745768181"(显式转换) - "x-ai-gateway-app-id:" + appId, // 头部字段 - "x-ai-gateway-timestamp:" + timestampStr, // 使用转换后的字符串 - "x-ai-gateway-nonce:" + nonce - ); - - // 打印调试信息(确保 timestamp 为字符串形式) - System.out.println("Timestamp String: " + timestampStr); - System.out.println("Signing String:\n" + signingString); - - // 计算 HMAC-SHA256(不变) - Mac sha256Hmac = Mac.getInstance("HmacSHA256"); - SecretKeySpec secretKey = new SecretKeySpec(appKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); - sha256Hmac.init(secretKey); - byte[] hashBytes = sha256Hmac.doFinal(signingString.getBytes(StandardCharsets.UTF_8)); - - return Base64.getEncoder().encodeToString(hashBytes); - } -} diff --git a/race special/server/target/classes/application-dev.yml b/race special/server/target/classes/application-dev.yml deleted file mode 100644 index 9a73c26..0000000 --- a/race special/server/target/classes/application-dev.yml +++ /dev/null @@ -1,35 +0,0 @@ -race: - deepseek: - api-key: sk-b6baa9fc68b742f780fc9b64f4635868 - api-key1: sk-d88586a4d04744c2a0fea3a0e2841aca - deep-seek-url: https://api.deepseek.com/chat/completions - tong-ying-url: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions - app-id: 2025158089 - app-key: FIKXhKoeMNzWSCLV - http-method: POST - http-url: /vivogpt/completions - request-url: https://api-ai.vivo.com.cn/vivogpt/completions - picture: - app-id: 2025158089 - app-key: FIKXhKoeMNzWSCLV - http-method: POST - http-url: /api/v1/task_submit - request-url: https://api-ai.vivo.com.cn/api/v1/task_submit - querypicture: - app-id: 2025158089 - app-key: FIKXhKoeMNzWSCLV - http-method: POST - http-url: /api/v1/task_progress - request-url: https://api-ai.vivo.com.cn/api/v1/task_progress - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - host: 10.9.29.24 - port: 3306 - database: sky_take_out - username: root - password: zhang20061023@ - redis: - host: localhost - port: 6379 - #password: 123456 - database: 0 diff --git a/race special/server/target/classes/application.yml b/race special/server/target/classes/application.yml deleted file mode 100644 index 2249ffd..0000000 --- a/race special/server/target/classes/application.yml +++ /dev/null @@ -1,67 +0,0 @@ - -server: - port: 8080 - -spring: - profiles: - active: dev - main: - allow-circular-references: true - datasource: - druid: - driver-class-name: ${race.datasource.driver-class-name} - url: jdbc:mysql://${race.datasource.host}:${race.datasource.port}/${race.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true - username: ${race.datasource.username} - password: ${race.datasource.password} - redis: - host: ${race.redis.host} - port: ${race.redis.port} - password: ${race.redis.password} - database: ${race.redis.database} -mybatis: - mapper-locations: classpath:mapper/*.xml - type-aliases-package: org.example.entity - configuration: - map-underscore-to-camel-case: true -#mapper配置文件 -logging: - level: - org: - example: - mapper: debug - service: info - controller: info -race: - jwt: - admin-ttl: 7200000000000000000 - # 设置前端传递过来的令牌名称 - user-secret-key: itheima - user-ttl: 7200000000000 - user-token-name: authentication - admin-token-name: token - admin-secret-key: itcast - deepseek: - api-key: ${sky.deepseek.api-key} - api-key1: ${sky.deepseek.api-key1} - deep-seek-url: ${sky.deepseek.deep-seek-url} - tong-ying-url: ${sky.deepseek.tong-ying-url} - app-id: ${race.deepseek.app-id} - app-key: ${race.deepseek.app-key} - http-method: ${race.deepseek.http-method} - http-url: ${race.deepseek.http-url} - request-url: ${race.deepseek.request-url} - picture: - app-id: ${race.picture.app-id} - app-key: ${race.picture.app-key} - http-method: ${race.picture.http-method} - http-url: ${race.picture.http-url} - request-url: ${race.picture.request-url} - querypicture: - app-id: ${race.querypicture.app-id} - app-key: ${race.querypicture.app-key} - http-method: ${race.querypicture.http-method} - http-url: ${race.querypicture.http-url} - request-url: ${race.querypicture.request-url} -springfox: - documentation: - enabled: false \ No newline at end of file diff --git a/race special/server/target/classes/org/example/server/ServerApplication.class b/race special/server/target/classes/org/example/server/ServerApplication.class deleted file mode 100644 index d638de37aec5f49733d7c1240e800138ab3ed3d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcma)5&2G~`5dJnz>eK{UQYe()RzfI^P<%nX1XU`LI0dLM3WuK7&eqx1-nG{2()ZyB zIDt6u06Y|8)(JF#g|Oru&EGfQ&dh%M{^cuxr`Yw;#I}b!KJMb4hx-hx&!m#}fMKP# zH(_Xw^i(jckEIf?$}AG*Ess*NbjLd8>4Y2U^o6l$XR=^;Jk}-�AgtR0M@E=fVVG zB@XjEl`*$ct0AFhTq=gG-tqX9pYtH)DhWbsq)LWWb#4;E+pKXjY`he9rl&{T@Jv`? zD9{geX=3q0I)+<+RUEh?4BKx?Wo0HNvXI36P$_LIMuc!sQ7>{w;lu&I*XAsUw6*~+ zt&X)ikx6Mp5LO}2$?^M@_GzGy^`aB;LLBke~Xdg*j%s9E;dQtB>hGu O=~*13QQ%gA+dlw&+A8?~ diff --git a/race special/server/target/classes/org/example/server/configuration/AiConfiguration.class b/race special/server/target/classes/org/example/server/configuration/AiConfiguration.class deleted file mode 100644 index f778ad8eaea50057868ae3fe5bb8839c8918ed9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 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 VYDBSF5M4%SmQcJ!c6-tA%1>Zu%zyv@ diff --git a/race special/server/target/classes/org/example/server/controller/user/ai.class b/race special/server/target/classes/org/example/server/controller/user/ai.class deleted file mode 100644 index 22fdbd6ea785fae3295244d1e1048ee0efb3b496..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2625 zcmb_e-E$LF6#s3LcGEOKDPI;4DNtyku!?|`)?z6jl|ZrKL&UF5vP~~;cjNAc!Z^u}EU#F%khxFTs9{g!2Wx+iSQRj@NKn{|Yh8FBP6W88K=){=&9x!Q=H@@(gvrk548 z{+wrz3&%*)Y@;p`hI2-w3)X*fr9LiEE;>E?0W5prD=hP_ci%o}PsOWBs^*rrLpIXc#KL2vUv$r-MUG$AB0 z3Whr3r}Z=XSs$Bec-pAvWwiqw5{B#YV2{7AnYxwH5}stGr?bkPW4Jlf(}w*IU8ruL zs9^PfnN|=f;gJDKAXSbO)QL2i8Pl_p5`SM_rFKZqN>6m1wJn}l8n-LSIhQRFw7puX zcdn1Ql0KS_?mL?@vVKaaIH92Vkl~Hm=_9(#2+wdxdSgOlEZxgFWbwlP%VH5`Db(jg zEpczJnZ4siQcDUeU75H?Y}X@=S$Uxf>d)wAPUf9fx{y+Ww8w?5x#PMlunK)vQ&tRR z4act=T4{VtHQ*^!mS^tAAgy@_>g8xzL~!Geg5*D zsTc*WX53kCT_r9IFdwc5o1qExWOSXIwRkge0 zxuYL8{5X9x1Rv>5nZ+`UChVM(GWH8u9jY$2$gF!>Tc|}W3&9&G*B*`6?kKfYeN+|K z;+L+1mCv{YdRR!t3YR9Qez>QL{G;>vYhT3BisdTaiQy#PjbR~L6s(&5<7VOOd&Tk; z>8?*dTV1+s&Q+X>;XS-hb2Ei@KzBz8M`n9a)q`mjAH?t>K8j%(UQnUOuntL5#kgfL zsz}9<2FYue{khbEiyd%oQ&KS!Lk6R)v6=cGN}e`So`OX)qH;kp5Gj3n$70%L3~!Ka zVR1+2-14TQ*$)TXuCPXI1>Hd%S2dvu3jwUkj#!k)&OL92HJ`CiHpd8dR$6?z{#+*t z*45x|&I>ZjL$O0wm@D_}87hk+zJrw>*i2{oxNPIOREl@5K&uhLv!8%vvkBfGJe*7; z-c0aVGe0Wr4w$;@7GIXCHyv&K8EEG3LkP=d9&=WQMOX|4OE_=fcd0L9HqMfTxMmq} zT)`6>zY4$g8z-Us?5nKgC=GzBFLI0p2e1k+am5FW&KrE?zYyjOIJoHn>J%LQ1)-L3 zFzkHf$p%Dnrt@Ys^Wc{_16BT=TzMVGPu#s9FgxpQO zIw`BCBnU6q+r+&tO2V|T8Cy7OtfN8Dlq5=0{IXB)O3q&4p{=K&xOkQSaCO+~Vmo%Y zcnv!PMM+gRrxENbv)$%nqurMI_p#ttge2o^WE=y=m(WrVS9R$1J*^<{*SYR1d)tjS IX-|=Xsy^>+H{e z{`e5U0NxFw8U1x=!hnkB!gwC1_u&P+7{(xmR1Al42B%ewgz*wyRxv8&n1Xm1_2`$w zSq0}*jLYeH6&Dmtgz*YqRghq)G3_ivBw;&Q-8HWbEa(Y4n-$IwL+!9(8Qut;iN@v_ zf^j<|81^R&OHAb#Q^L8#QzmKXa+;fS+%e?3qzroVhRe|J1B+$8m@|d$3TH_;`aHKX zCdu=ro#N)X<+R9ohHYIas>$*Ju|vl&7Og@mAJE6RE6NZ zyXweZKty6vc=L8GMrj?<~H7fhFd5UM6 zd!k*CnH2?d8eYd646I#46qgxVcE)imZ-V#Z-o`t8>3UsqQd`YItGtGN`s zrQvP7L*@O5?R08Eq{(z=CEOm3!4S?0uf&?6DH_|Yd=Bh#YK! z$Yn@AIIWd*s#=*r-v#BLd%w^3_rEk)Rg8+ALybe3^Qa-Iy{pos+S)f^r>m4PY=Uk**r80(wusU#x`2%BpJ!j@pZ88XcEAaG}ijc2%e(3Ry=?s zc$!uW?F3rmU!EcvAYJo41R^yj))4#wp&H1^25P^hog!M;Kh=f?!j_25#aksrxju?c zLhhoy5TgaqO@B$^8IscEv69J$BtxW|kR}zfq;8v3BXw&C-$svAM)s{io9qdln!1nr z%j;<9UBmuJBMoba3?UZ!T4f(5!G;QF} Y_Xxt<8 diff --git a/race special/server/target/classes/org/example/server/interceptor/JwtTokenAdminInterceptor.class b/race special/server/target/classes/org/example/server/interceptor/JwtTokenAdminInterceptor.class deleted file mode 100644 index 08d9e2a1659301c3081c321fc1d476923294098a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2979 zcmb7GS#uOs6#jZLlb%dE5)!sx*pwv+ODiBtf=Gy9HXtS;2(F!(n@J}#-9yivEFuc- z2&jk)qE_jHRhGqzXoUnzEnoc~k@8Qd-<_T$osgLF<#zYE=YHpWXS@B!-*b zO7T2iP~sP3cnOw{-Y9mJB94SI!_xwNF(lC+g{@%gLI3R$RK?sA)|fFdK8y9kxA@ zAZ+mg+p*$YeuPbO}qdMwXY-vwb<_S-bSe-?+V z@P>qE+Kv=nTx4imap`skh0~Zw+fK{O2JM$*Jke}931uTu(>`DgStF)`NC|27OPMj7 zxpeu0PH{FTva(@OwQPoQ5x$<8vYe!OqIW>VWkc;5QjVuAJ59e=wcD;akaeA5(JPgI zW>bELZbd{o(~{6oo;T$~w7X7{TOl!`VR=A)WJJ+qCb+44zKa^REb64sMMKmRzP}n4 z4?uw#E%oQ4=Bd=EsLi5D0(nBSH@l=N5PDhGC9U}2F)NeLqmHvWJROWkY?=!{%8v=z z?gFxbEJ1}UM>E1~a??ziaAbpl z8r15L267nEuyTf*@BZPOok|GOj^4Zb+r95D+X(~17|}6m;ANaM@Cwc=$*Trl!v!4| z4ZMywG;GT^@;!ScROVckx&*yAlBR1)H)4*G}VBl@MW8fh?tifRW{`vJce|>+Y z{@i&T?;5y-_Y7QCmaZ7Miuc*l%F50d}QD{KGyMx zflu)n13&r8^~ptn z;7D!NP+ij+)S7E1DqUZsVK!XB#i`uSCdU3(r7Tkpna@XzvwUN)Fc!L5G%TgJ`N5nY z(Z|{AoXV6nld|fw&GW(E7dI8Ke9Z)|J6dD@vS5%+{_6QjKO zf;@84PGwayo#YFLK*sX2qV-g_hJ*iYq!7;9g=hYX`ELW}k&s57*(ZJ266Ks>M}2( z5+}XPadL-iT9jzz+#DVCe-HeW`+q5Hre1Nb{nvPzf9|)@fpHuH6Qsq z7E+Uwvdw%i=5q_5MSOCobFJf-$*0C=r0x#1ANUf&R<24JSb=R^4POD?Bl8Z7(xSY zr~`SzorqFrBOaxGgqoE+vzs9qLMcz}p^TIZ;ZSdTiJ`)EkvR1Xpn7W{RuOgE@Hh@K zOixf+jnI~V(2j_XwK@*zXwBCXVLU?LA^Uc7&>rF<@ diff --git a/race special/server/target/classes/org/example/server/interceptor/JwtTokenUserceptor.class b/race special/server/target/classes/org/example/server/interceptor/JwtTokenUserceptor.class deleted file mode 100644 index 3701ca3435e99e8282c2b2c4935c6372ed62597e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3033 zcmai0`EwLS6#iz9%w{tY2yz6KOCX29cz|MpC`6FN0Fi_!h{t5NvzcUfW|{3JiHIVK ziUbAm#i$95;kjAiNn7MJtSK;wAuE$j3o|=;VzveOC|J8U z??^i%y6v3ZlNMVY$CZ|}U56l>d`(%;c2d2bl@WukH(>S%%gLF&RzkYouxU*Sm|OGG z9ke}>By7cI+p*;q+Fakzts&ClCWVGM?Y1L!=QBOR>$0e=;7r0wcUzvV_C;bu_SsZ_ zPni!n;T;y9X**JQ36Z68GQ@Yxd_{XHfJ= zWtrJhI8gz~(}vchhPee@K1RFiq<9t*LmCzY=-Y>sJ4^x(bbZk`$3VXLGqx<0Mzl{p$3XROB@;e;!Pv%+j~Gt854WV3-r z+@a&Jfk801i>CbXP2QHb(@8;BW7mHA?b=tT?4*HVJg4J`f#-45zzcX$QH~jS3CDH3 zY~U4~(6F}9d(%3C**57F{WJZ_^L%d&tU;ZQR}H+TFkUxs5^oq-h1D9C{`KwUtKS`; zxbWkZv2U(^d~ssr#Kf7e+aB+_^7DmjCr5OgGBAP@I!+sS6K`oS*x^?{|Kjh9BTYwW z-w4haIICdaHgFE_u;rC$rH)UqT&3km)gyilwiGEk-Zk(Z-q-Pgfe-PKj`IdS#wX0t z#4qP2PM)4P`@zKJFYV-!qZ;N<#ceX18tw{eQmr*>U+VbOz-RcJN~RF~4$^S!r&_-Z$IoavX_!@!;q-CyoSVhgVsCb^TqXI1l~FxuWwXLzPpx|TptARsg#VSgj7?2W3f%ct@Uj|uIXxG()CFi%HfJ8 zmhw~X7#msDr%XHad?v>@k5>gVc%$2ae$rYsTnkfnH#=9uYL&lP2P(%fMRzhXs>jyM zWW{yiRdFp;Lf~fO&0#yeE+J-9Tbg&3Il%;5GS3MUsc%)6Pu&da1KLZ2oSY?pJ4M11 z@=-C&`!N`)ytLCf)l&QT!`YFwyqsXqYS{AsI*JKvxbgk4aORtXmBK(y3t`FP>z&YW z(^P+{+l9q&*h=Tco?a$>1{;IrSG$tmCSffrVJl)$kd}dM9@rZMd5t6xMnXflk`_ z?-BYL;r*8psfmuFVhs8yVxy=WMSK)h>wbsv5u%YxcQpQp>QUS@jyWMTMQS5|VDa~u zTQhGQH6g5>r=1f`J<(;st5SqP+k!Ka9HXusQ`PfLT3i4FpK4L^waEgIb zfAr lbeu^Te~9u2k84~r?BdBa_6GVg(`84I4XJy{csA44oEqhlumIbi4PPM25r|) P0}T5)!noZ*dkKIKoUAzT diff --git a/race special/server/target/classes/org/example/server/service/AiService.class b/race special/server/target/classes/org/example/server/service/AiService.class deleted file mode 100644 index ff710713c2a8f5f4e3295d2c7ef985c1b82b3f08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmZXPJ#NB45QX2^24j*~NL+ye8n#IhDOHLfMG8tJpI|W~v&h(Fcd>jn3J#D%MHy4z zf@Wskn@{ue`**$oct#rIA;u$N^mAh8O4Csz%hmg4kwB%TV|tekyJYtj zR})xknMe&f%4&a~1oQ4tbNTu?-3i%aveG*p5jQY7Y3_;(E`LcW@w!=dt#zc1l^m$J zFWb(mZ!AXk7DEEXHYEv@yy3r-N1#17DYr=3c?rcP|J#Mm5#wC=?2(cVur;J@x89e`(7Y&8Q%^G;$J)+17 z>|BVR)D@`Ckkf_**5|?Vd&Gn5lN*m3+q{eg@Cxu3c_myt}W(<{#VQZW< mVeq_HacxpzjZXotGcM1O8(8O4G2jGnAy2lE+0AJWH-UdPiQY>9 diff --git a/race special/server/target/classes/org/example/server/websocket/WebSocketServer.class b/race special/server/target/classes/org/example/server/websocket/WebSocketServer.class deleted file mode 100644 index 15072fe0dbc7f900e3301ffba149981325f0c5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3031 zcmb7G+iw(Q6#q@T+u6%Nq0rKT7kUv&DXb{hwp`j31nEr{i{N#-9onI@GwaN3TSQb8 z1vT->7fCeHgpf!gf=Nlih|j+JA4uWNM-vjo-#0URV_S_)_M7?6cP_tk&hI;&U;n=K zGk~r5G=?=e97R6{WDLeojl&TPiRW+xFN)`p7*aSI#cI41#|Vx^@Nxvl#p?;Nyb?zr zUX3G(*TnL=j5p#~fj8q&F)AY+Lj%TSXfZV6u#A&3#wElY&2ePCWsZVAzpK5nXR&ekOKl%ED$Lp8?}Dc9D`@orCHCNZszI#zm8a}z1wdG{W=s_D^9 z-Q6Rhx_!flgiz8Nqtn`c-P8tinNiI?s*W0z)b(3w)fiE2UF-v4$eqv~37h*Zdpx1d zsF|#xB^=G3((ICO$F$Lu7dYjeh@h4^l+{dHwl50KPpdQ!flm$!BcW+gOXlL}V*;{Q zw^A1pmJMj`gf%v-+G<8~HJk98j^s>N&uAmMqcgW&)3jXGW%YU1SP^B&gU%#c%FPNM z%j{b!?1S7`|hVl*>MYhbO zVL9|&S-K(rh+4IdW{w@TdJQ9K=$h$Ds9ykyh%3=keF>!fGifa=%0@4dpiQh`gRkPT zH)$D$mJW0p${BS!n`hOQ1ucAHFGk}fDOXKT@^*O4lrbSgmvM?ndeTO~@L0;q*=g;7 zF8I9i5ms&%T#?Y>QQ66gi*r&?WZJSP6Ap=@SuPx#Fa9w9)#dvazAJUa(Q@z7 z`QPt+Gk@+Hjixc9;56P=a0c%vIE!}`yodJ#TniLi!8x3l@v(vn=#sFa2*1#N1sBmQ zVYzqYwf&&#On8&5^Z(2V-qoV_q0v($4%=4rS|k&%dQp6cy;5C^6)Z9LCtQ{ToqpdPhlN* zoHb}i$TQCJo1>btjvJ`Djq2k!5vmK%qNbC-I+@EXBD09zK&*4)9OBhDR*bOJvs_D9 z&DcP1BGOvlTM&tUdD7uU@4!ZM68hl$=0q|j_41KyXFGS4Ac+@{#0#~Gmm_(!Ry!9(vI|{AAXxDypEZ2$C6YPR zN*ExXWfBHA&0)EOFVW7IItjmEMOUaPG>4TE*x~vrTtTcW+(Z(ry7KV1>#R&0yRnrY zmLXOMbROZl3sHt@!)~7K130BU#?`BVvLhl9!WzR~p&61C&+ad5@O0d^^bfA!?C}FW^INV%(_s2p`l$ F{{iNG_A&qf diff --git a/race special/server/target/test-classes/org/example/testServer/ServerApplicationTests.class b/race special/server/target/test-classes/org/example/testServer/ServerApplicationTests.class deleted file mode 100644 index 8de2a1670c7608203015df64b0ad3f0e6385a3ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11351 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 Date: Sat, 3 May 2025 22:45:20 +0800 Subject: [PATCH 02/19] vue --- .gitignore | 30 + .vscode/extensions.json | 3 + README.md | 3 +- auto-imports.d.ts | 11 + components.d.ts | 61 + env.d.ts | 1 + index.html | 13 + package-lock.json | 4439 ++++++++++++++++++++++++++++++++++ package.json | 35 + public/favicon.ico | Bin 0 -> 4286 bytes src/@types/request.d.ts | 4 + src/App.vue | 14 + src/api/index.ts | 0 src/api/interface/index.ts | 0 src/api/user/index.ts | 16 + src/api/user/type.ts | 12 + src/assets/base.css | 0 src/assets/logo.svg | 1 + src/assets/main.css | 0 src/components/vaildCode.vue | 79 + src/main.ts | 23 + src/router/index.ts | 28 + src/shims-vue.d.ts | 5 + src/stores/counter.ts | 12 + src/utils/index.ts | 13 + src/utils/request.ts | 60 + src/views/home.vue | 3 + src/views/login/index.vue | 164 ++ src/views/register/index.vue | 148 ++ tsconfig.app.json | 12 + tsconfig.json | 11 + tsconfig.node.json | 19 + vite.config.ts | 27 + 33 files changed, 5245 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 auto-imports.d.ts create mode 100644 components.d.ts create mode 100644 env.d.ts create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 src/@types/request.d.ts create mode 100644 src/App.vue create mode 100644 src/api/index.ts create mode 100644 src/api/interface/index.ts create mode 100644 src/api/user/index.ts create mode 100644 src/api/user/type.ts create mode 100644 src/assets/base.css create mode 100644 src/assets/logo.svg create mode 100644 src/assets/main.css create mode 100644 src/components/vaildCode.vue create mode 100644 src/main.ts create mode 100644 src/router/index.ts create mode 100644 src/shims-vue.d.ts create mode 100644 src/stores/counter.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/request.ts create mode 100644 src/views/home.vue create mode 100644 src/views/login/index.vue create mode 100644 src/views/register/index.vue create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/README.md b/README.md index 51f241a..8b13789 100644 --- a/README.md +++ b/README.md @@ -1,2 +1 @@ -# race -aigc代码 + diff --git a/auto-imports.d.ts b/auto-imports.d.ts new file mode 100644 index 0000000..bc57d8c --- /dev/null +++ b/auto-imports.d.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const ElMenu: typeof import('element-plus/es')['ElMenu'] + const ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] +} diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000..13b8414 --- /dev/null +++ b/components.d.ts @@ -0,0 +1,61 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + ElAside: typeof import('element-plus/es')['ElAside'] + ElAvatar: typeof import('element-plus/es')['ElAvatar'] + ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] + ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] + ElButton: typeof import('element-plus/es')['ElButton'] + ElCard: typeof import('element-plus/es')['ElCard'] + ElCarousel: typeof import('element-plus/es')['ElCarousel'] + ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem'] + ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] + ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] + ElCol: typeof import('element-plus/es')['ElCol'] + ElContainer: typeof import('element-plus/es')['ElContainer'] + ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] + ElDropdown: typeof import('element-plus/es')['ElDropdown'] + ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] + ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] + ElForm: typeof import('element-plus/es')['ElForm'] + ElFormItem: typeof import('element-plus/es')['ElFormItem'] + ElHeader: typeof import('element-plus/es')['ElHeader'] + ElIcon: typeof import('element-plus/es')['ElIcon'] + ElInput: typeof import('element-plus/es')['ElInput'] + ElMain: typeof import('element-plus/es')['ElMain'] + ElMenu: typeof import('element-plus/es')['ElMenu'] + ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + ElOption: typeof import('element-plus/es')['ElOption'] + ElRadio: typeof import('element-plus/es')['ElRadio'] + ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] + ElRow: typeof import('element-plus/es')['ElRow'] + ElSegmented: typeof import('element-plus/es')['ElSegmented'] + ElSelect: typeof import('element-plus/es')['ElSelect'] + ElSelectV2: typeof import('element-plus/es')['ElSelectV2'] + ElSubmenu: typeof import('element-plus/es')['ElSubmenu'] + ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] + ElSwitch: typeof import('element-plus/es')['ElSwitch'] + ElTable: typeof import('element-plus/es')['ElTable'] + ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] + ElText: typeof import('element-plus/es')['ElText'] + ElTimePicker: typeof import('element-plus/es')['ElTimePicker'] + HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] + IconCommunity: typeof import('./src/components/icons/IconCommunity.vue')['default'] + IconDocumentation: typeof import('./src/components/icons/IconDocumentation.vue')['default'] + IconEcosystem: typeof import('./src/components/icons/IconEcosystem.vue')['default'] + IconSupport: typeof import('./src/components/icons/IconSupport.vue')['default'] + IconTooling: typeof import('./src/components/icons/IconTooling.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + TheWelcome: typeof import('./src/components/TheWelcome.vue')['default'] + VaildCode: typeof import('./src/components/vaildCode.vue')['default'] + WelcomeItem: typeof import('./src/components/WelcomeItem.vue')['default'] + } +} diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/index.html b/index.html new file mode 100644 index 0000000..872ab31 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..faa9784 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4439 @@ +{ + "name": "vivo-aigc", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vivo-aigc", + "version": "0.0.0", + "dependencies": { + "axios": "^1.9.0", + "element-plus": "^2.9.9", + "pinia": "^3.0.1", + "vue": "^3.5.13", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.1", + "@types/axios": "^0.9.36", + "@types/node": "^22.14.0", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "less": "^4.3.0", + "npm-run-all2": "^7.0.2", + "typescript": "~5.8.0", + "unplugin-auto-import": "^19.1.2", + "unplugin-vue-components": "^28.5.0", + "vite": "^6.2.4", + "vite-plugin-vue-devtools": "^7.7.2", + "vue-tsc": "^2.2.8" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.1.tgz", + "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", + "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.1.tgz", + "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", + "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.1.tgz", + "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", + "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz", + "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", + "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz", + "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", + "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", + "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", + "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", + "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", + "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", + "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", + "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", + "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", + "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", + "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", + "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", + "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", + "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", + "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", + "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", + "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", + "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", + "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", + "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", + "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", + "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", + "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", + "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", + "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", + "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", + "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", + "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", + "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", + "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", + "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", + "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", + "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", + "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", + "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", + "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", + "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", + "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", + "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", + "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", + "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", + "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tsconfig/node22": { + "version": "22.0.1", + "resolved": "https://registry.npmmirror.com/@tsconfig/node22/-/node22-22.0.1.tgz", + "integrity": "sha512-VkgOa3n6jvs1p+r3DiwBqeEwGAwEvnVCg/hIjiANl5IEcqP3G0u5m8cBJspe1t9qjZRlZ7WFgqq5bJrGdgAKMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/axios": { + "version": "0.9.36", + "resolved": "https://registry.npmmirror.com/@types/axios/-/axios-0.9.36.tgz", + "integrity": "sha512-NLOpedx9o+rxo/X5ChbdiX6mS1atE4WHmEEIcR9NLenRVa5HoVjAvjafwU3FPTqnZEstpoqCaW7fagqSoTDNeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.16", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.3", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.3.tgz", + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz", + "integrity": "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.13", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.13.tgz", + "integrity": "sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.13" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.13", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.13.tgz", + "integrity": "sha512-l/EBcc2FkvHgz2ZxV+OZK3kMSroMr7nN3sZLF2/f6kWW66q8+tEL4giiYyFjt0BcubqJhBt6soYIrAPhg/Yr+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.13", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.13.tgz", + "integrity": "sha512-Ukz4xv84swJPupZeoFsQoeJEOm7U9pqsEnaGGgt5ni3SCTa22m8oJP5Nng3Wed7Uw5RBELdLxxORX8YhJPyOgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.13", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz", + "integrity": "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz", + "integrity": "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", + "@vue/babel-helper-vue-transform-on": "1.4.0", + "@vue/babel-plugin-resolve-type": "1.4.0", + "@vue/shared": "^3.5.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.4.0.tgz", + "integrity": "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/parser": "^7.26.9", + "@vue/compiler-sfc": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.6.tgz", + "integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.6" + } + }, + "node_modules/@vue/devtools-core": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-7.7.6.tgz", + "integrity": "sha512-ghVX3zjKPtSHu94Xs03giRIeIWlb9M+gvDRVpIZ/cRIxKHdW6HE/sm1PT3rUYS3aV92CazirT93ne+7IOvGUWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.6", + "@vue/devtools-shared": "^7.7.6", + "mitt": "^3.0.1", + "nanoid": "^5.1.0", + "pathe": "^2.0.3", + "vite-hot-client": "^2.0.4" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", + "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.6", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz", + "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.10", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.10.tgz", + "integrity": "sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz", + "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/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/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/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/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.3.0.tgz", + "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "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.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001716", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", + "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/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/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/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/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.149", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", + "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/element-plus": { + "version": "2.9.9", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.9.tgz", + "integrity": "sha512-gN553+xr7ETkhJhH26YG0fERmd2BSCcQKslbtR8fats0Mc0yCtZOXr00bmoPOt5xGzhuRN1TWc9+f1pCaiA0/Q==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.13", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-stack-parser-es": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.3", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.3.tgz", + "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.3", + "@esbuild/android-arm": "0.25.3", + "@esbuild/android-arm64": "0.25.3", + "@esbuild/android-x64": "0.25.3", + "@esbuild/darwin-arm64": "0.25.3", + "@esbuild/darwin-x64": "0.25.3", + "@esbuild/freebsd-arm64": "0.25.3", + "@esbuild/freebsd-x64": "0.25.3", + "@esbuild/linux-arm": "0.25.3", + "@esbuild/linux-arm64": "0.25.3", + "@esbuild/linux-ia32": "0.25.3", + "@esbuild/linux-loong64": "0.25.3", + "@esbuild/linux-mips64el": "0.25.3", + "@esbuild/linux-ppc64": "0.25.3", + "@esbuild/linux-riscv64": "0.25.3", + "@esbuild/linux-s390x": "0.25.3", + "@esbuild/linux-x64": "0.25.3", + "@esbuild/netbsd-arm64": "0.25.3", + "@esbuild/netbsd-x64": "0.25.3", + "@esbuild/openbsd-arm64": "0.25.3", + "@esbuild/openbsd-x64": "0.25.3", + "@esbuild/sunos-x64": "0.25.3", + "@esbuild/win32-arm64": "0.25.3", + "@esbuild/win32-ia32": "0.25.3", + "@esbuild/win32-x64": "0.25.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "9.5.2", + "resolved": "https://registry.npmmirror.com/execa/-/execa-9.5.2.tgz", + "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exsolve": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/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": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/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/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/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-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/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-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "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, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/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/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/less": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/less/-/less-4.3.0.tgz", + "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less/node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/less/node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "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, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/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://registry.npmmirror.com/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/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-all2": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-7.0.2.tgz", + "integrity": "sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.6", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-package-json-fast": "^4.0.0", + "shell-quote": "^1.7.3", + "which": "^5.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0", + "npm": ">= 9" + } + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.1.2", + "resolved": "https://registry.npmmirror.com/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinia": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.2.tgz", + "integrity": "sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/read-package-json-fast": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", + "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/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/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/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/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.40.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.40.1.tgz", + "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.1", + "@rollup/rollup-android-arm64": "4.40.1", + "@rollup/rollup-darwin-arm64": "4.40.1", + "@rollup/rollup-darwin-x64": "4.40.1", + "@rollup/rollup-freebsd-arm64": "4.40.1", + "@rollup/rollup-freebsd-x64": "4.40.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", + "@rollup/rollup-linux-arm-musleabihf": "4.40.1", + "@rollup/rollup-linux-arm64-gnu": "4.40.1", + "@rollup/rollup-linux-arm64-musl": "4.40.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-musl": "4.40.1", + "@rollup/rollup-linux-s390x-gnu": "4.40.1", + "@rollup/rollup-linux-x64-gnu": "4.40.1", + "@rollup/rollup-linux-x64-musl": "4.40.1", + "@rollup/rollup-win32-arm64-msvc": "4.40.1", + "@rollup/rollup-win32-ia32-msvc": "4.40.1", + "@rollup/rollup-win32-x64-msvc": "4.40.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/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://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.1.tgz", + "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/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/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-4.2.0.tgz", + "integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "tinyglobby": "^0.2.12", + "unplugin": "^2.2.2", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.2.tgz", + "integrity": "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "picomatch": "^4.0.2", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "19.1.2", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.2.tgz", + "integrity": "sha512-EkxNIJm4ZPYtV7rRaPBKnsscgTaifIZNrJF5DkMffTxkUOJOlJuKVypA6YBSBOjzPJDTFPjfVmCQPoBuOO+YYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "picomatch": "^4.0.2", + "unimport": "^4.1.2", + "unplugin": "^2.2.2", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz", + "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "28.5.0", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-28.5.0.tgz", + "integrity": "sha512-o7fMKU/uI8NiP+E0W62zoduuguWqB0obTfHFtbr1AP2uo2lhUPnPttWUE92yesdiYfo9/0hxIrj38FMc1eaySg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "debug": "^4.4.0", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "tinyglobby": "^0.2.12", + "unplugin": "^2.3.2", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "6.3.4", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.4.tgz", + "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-hot-client": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-2.0.4.tgz", + "integrity": "sha512-W9LOGAyGMrbGArYJN4LBCdOC5+Zwh7dHvOHC0KmGKkJhsOzaKbpo/jEjpPKVHIW0/jBWj8RZG0NUxfgA8BxgAg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "0.8.9", + "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", + "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "debug": "^4.3.7", + "error-stack-parser-es": "^0.1.5", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.1.1", + "sirv": "^3.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.6.tgz", + "integrity": "sha512-L7nPVM5a7lgit/Z+36iwoqHOaP3wxqVi1UvaDJwGCfblS9Y6vNqf32ILlzJVH9c47aHu90BhDXeZc+rgzHRHcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^7.7.6", + "@vue/devtools-kit": "^7.7.6", + "@vue/devtools-shared": "^7.7.6", + "execa": "^9.5.2", + "sirv": "^3.0.1", + "vite-plugin-inspect": "0.8.9", + "vite-plugin-vue-inspector": "^5.3.1" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", + "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.5.1", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "2.2.10", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.10.tgz", + "integrity": "sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~2.4.11", + "@vue/language-core": "2.2.10" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1fdbd5e --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "vivo-aigc", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build" + }, + "dependencies": { + "axios": "^1.9.0", + "element-plus": "^2.9.9", + "pinia": "^3.0.1", + "vue": "^3.5.13", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.1", + "@types/axios": "^0.9.36", + "@types/node": "^22.14.0", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "less": "^4.3.0", + "npm-run-all2": "^7.0.2", + "typescript": "~5.8.0", + "unplugin-auto-import": "^19.1.2", + "unplugin-vue-components": "^28.5.0", + "vite": "^6.2.4", + "vite-plugin-vue-devtools": "^7.7.2", + "vue-tsc": "^2.2.8" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/src/@types/request.d.ts b/src/@types/request.d.ts new file mode 100644 index 0000000..36db081 --- /dev/null +++ b/src/@types/request.d.ts @@ -0,0 +1,4 @@ +declare module "@/utils/request" { + const request: any; // 如果你知道具体类型,可以替换 `any` + export default request; +} \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..38cd007 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/api/interface/index.ts b/src/api/interface/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/api/user/index.ts b/src/api/user/index.ts new file mode 100644 index 0000000..8e8b11e --- /dev/null +++ b/src/api/user/index.ts @@ -0,0 +1,16 @@ +//用户相关接口 +import request from "@/utils/request"; +import { type loginForm ,type userResponseData} from '@/api/user/type'; + +//统一管理接口 +enum API{ + LOGIN_URL = "/user/login", + REGISTER_URL = "/user/register" +} +//对外暴露请求函数 + +//登录接口方法 +export const reqLogin = (data: loginForm) => request.post(API.LOGIN_URL, data) as Promise; + +//注册用户信息接口方法 +export const reqRegiter = (data: loginForm) => request.post(API.REGISTER_URL, data) as Promise; \ No newline at end of file diff --git a/src/api/user/type.ts b/src/api/user/type.ts new file mode 100644 index 0000000..3bd0df0 --- /dev/null +++ b/src/api/user/type.ts @@ -0,0 +1,12 @@ +//登录接口参数 +export interface loginForm{ + username:string, + password:string + email: string, +} + +//登录,注册返回数据类型 +export interface userResponseData { + code:number, + message:string +} \ No newline at end of file diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/vaildCode.vue b/src/components/vaildCode.vue new file mode 100644 index 0000000..72d7917 --- /dev/null +++ b/src/components/vaildCode.vue @@ -0,0 +1,79 @@ + + + + + \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..7bb1572 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,23 @@ +import './assets/main.css' + +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import App from './App.vue' +import router from './router' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) + +app.mount('#app') + + +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' + + + +app.use(ElementPlus) + diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..dd03598 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,28 @@ +import { createRouter, createWebHistory } from 'vue-router' +import Login from '@/views/login/index.vue' +import Register from '@/views/register/index.vue' +import Home from '@/views/home.vue' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'home', + component: Home, + }, + { + path: '/login', + name: 'login', + component: Login, + }, + { + path: '/register', + name: 'register', + component: Register, + }, + + ] +}) + +export default router diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts new file mode 100644 index 0000000..e8fe42a --- /dev/null +++ b/src/shims-vue.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/src/stores/counter.ts b/src/stores/counter.ts new file mode 100644 index 0000000..b6757ba --- /dev/null +++ b/src/stores/counter.ts @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..d85cb47 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,13 @@ +/** + * @description 获取当前时间对应的提示语 + * @returns {String} + */ +export function getTimeState() { + let timeNow = new Date(); + let hours = timeNow.getHours(); + if (hours >= 6 && hours <= 10) return `早上好 ⛅`; + if (hours >= 10 && hours <= 14) return `中午好 🌞`; + if (hours >= 14 && hours <= 18) return `下午好 🌞`; + if (hours >= 18 && hours <= 24) return `晚上好 🌛`; + if (hours >= 0 && hours <= 6) return `凌晨好 🌛`; + } \ No newline at end of file diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..49ade8c --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,60 @@ +//axios二次封装,请求与响应拦截器 + +import axios from 'axios' +import { ElMessage } from 'element-plus'; + +//利用axios对象create方法,创建axios实例,方便配置其他设置 +let request = axios.create({ + //基础路径 + // baseURL: `${import.meta.env.VITE_API_URL}`, + baseURL: "localhost:8080", + timeout: 5000 +}); + +//添加请求与响应拦截器 +request.interceptors.request.use((config) => { + //config配置对象有headers属性请求头,配置一些公共参数 + //返回配置对象 + return config; +}) + +//添加响应拦截器 +request.interceptors.response.use( + //成功的回调 + (response) => { + //简化数据 + return response.data; + }, + //失败的回调 + (error) => { + //处理http网络错误 + //存储错误信息 + let message = ''; + let status = error.response.state; + switch (status) { + case 401: + message = 'TOKEN过期' + break; + case 403: + message = '无权访问' + break; + case 404: + message = '请求地址错误' + break; + case 500: + message = '服务器出问题' + break; + default: + message = '网络出问题了' + } + ElMessage({ + type:'error', + message, + grouping: true, + }); + + return Promise.reject(error) + }) + + //对外暴露 + export default request; \ No newline at end of file diff --git a/src/views/home.vue b/src/views/home.vue new file mode 100644 index 0000000..f851824 --- /dev/null +++ b/src/views/home.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..539b157 --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,164 @@ + + + + + + \ No newline at end of file diff --git a/src/views/register/index.vue b/src/views/register/index.vue new file mode 100644 index 0000000..1a6f56c --- /dev/null +++ b/src/views/register/index.vue @@ -0,0 +1,148 @@ + + + + + + \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..f599fa1 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "auto-imports.d.ts"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..a83dfc9 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*", + "eslint.config.*" + ], + "compilerOptions": { + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..f69c120 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,27 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueDevTools from 'vite-plugin-vue-devtools' +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueDevTools(), + AutoImport({ + resolvers: [ElementPlusResolver()], + }), + Components({ + resolvers: [ElementPlusResolver()], + }), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) From 4789ca39c438c41bddf5d3a0462a816870b8349c Mon Sep 17 00:00:00 2001 From: IHIRINA <2582067027@qq.com> Date: Sat, 3 May 2025 23:22:23 +0800 Subject: [PATCH 03/19] update --- src/utils/request.ts | 32 +++++++++++++++++--------------- src/views/register/index.vue | 28 +++++++++++++++++----------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/utils/request.ts b/src/utils/request.ts index 49ade8c..e05b30c 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -7,7 +7,7 @@ import { ElMessage } from 'element-plus'; let request = axios.create({ //基础路径 // baseURL: `${import.meta.env.VITE_API_URL}`, - baseURL: "localhost:8080", + baseURL: "http://localhost:8080", timeout: 5000 }); @@ -27,34 +27,36 @@ request.interceptors.response.use( }, //失败的回调 (error) => { - //处理http网络错误 - //存储错误信息 + // 处理 http 网络错误 + // 存储错误信息 let message = ''; - let status = error.response.state; + // 修正为使用 status 获取响应状态码 + let status = error.response? error.response.status : null; switch (status) { case 401: - message = 'TOKEN过期' + message = 'TOKEN 过期'; break; case 403: - message = '无权访问' + message = '无权访问'; break; case 404: - message = '请求地址错误' + message = '请求地址错误'; break; case 500: - message = '服务器出问题' + message = '服务器出问题'; break; default: - message = '网络出问题了' + message = '网络出问题了'; } + // 假设 ElMessage 是一个消息提示组件 ElMessage({ - type:'error', + type: 'error', message, grouping: true, }); - - return Promise.reject(error) + + return Promise.reject(error); }) - - //对外暴露 - export default request; \ No newline at end of file + + // 对外暴露 +export default request; \ No newline at end of file diff --git a/src/views/register/index.vue b/src/views/register/index.vue index 1a6f56c..fc48eed 100644 --- a/src/views/register/index.vue +++ b/src/views/register/index.vue @@ -109,18 +109,24 @@ const registerHandler = async () => { try { const response = await request.post('/user/register', ruleForm); - if (response.code === 200) { - localStorage.setItem('token', response.data.token) - alert('注册成功,请登录') - router.push('/login') - } else { - alert(response.msg) + if (response) { + if (response.code === 200) { + localStorage.setItem('token', response.data.token); + alert('注册成功,请登录'); + this.$router.push('/login'); + } else { + alert(response.msg); + } + } else { + console.error('未收到有效的响应'); + alert('注册失败,请重试'); + } + } catch (error) { + console.error('注册失败:', error); + alert('注册失败,请重试'); + } } - } catch (error) { - console.error('注册失败:', error); - alert('注册失败,请重试'); - } -} + \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 539b157..e371ffd 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,7 +1,7 @@ \ No newline at end of file From f873f58ac2aa0e9dea016f5262fc9e616c4a7fab Mon Sep 17 00:00:00 2001 From: IHIRINA <2582067027@qq.com> Date: Sat, 17 May 2025 17:39:45 +0800 Subject: [PATCH 07/19] home --- package.json | 2 +- src/router/index.ts | 30 +++++++ src/views/ask/chatAi.vue | 165 ++++++++++++++++++++++++++++++++++++++ src/views/ask/musicAi.vue | 154 +++++++++++++++++++++++++++++++++++ src/views/ask/tableAi.vue | 162 +++++++++++++++++++++++++++++++++++++ src/views/home.vue | 68 +++++++++++----- src/views/login/index.vue | 2 +- src/views/myself/my.vue | 121 ++++++++++++++++++++++++++++ src/views/myself/used.vue | 119 +++++++++++++++++++++++++++ src/views/table/index.vue | 23 +++--- 10 files changed, 812 insertions(+), 34 deletions(-) create mode 100644 src/views/ask/chatAi.vue create mode 100644 src/views/ask/musicAi.vue create mode 100644 src/views/ask/tableAi.vue create mode 100644 src/views/myself/my.vue create mode 100644 src/views/myself/used.vue diff --git a/package.json b/package.json index 60daafc..5423c0e 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "devDependencies": { "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", - "@types/echarts": "^4.9.22", + "@types/echarts": "^4.9.22", "@types/node": "^22.14.0", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", diff --git a/src/router/index.ts b/src/router/index.ts index 66be941..beaa195 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -3,6 +3,11 @@ import Login from '@/views/login/index.vue' import Register from '@/views/register/index.vue' import Home from '@/views/home.vue' import Table from '@/views/table/index.vue' +import TableAi from '@/views/ask/tableAi.vue' +import ChatAi from '@/views/ask/chatAi.vue' +import MusicAi from '@/views/ask/musicAi.vue' +import My from '@/views/myself/my.vue' +import Used from '@/views/myself/used.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -26,6 +31,31 @@ const router = createRouter({ path: '/table', name: 'table', component: Table, + }, + { + path: '/tableAi', + name: 'tableAi', + component: TableAi, + }, + { + path: '/chatAi', + name: 'chatAi', + component: ChatAi, + }, + { + path: '/musicAi', + name: 'musicAi', + component: MusicAi, + }, + { + path: '/my', + name: 'my', + component: My, + }, + { + path: '/used', + name: 'used', + component: Used, } ] }) diff --git a/src/views/ask/chatAi.vue b/src/views/ask/chatAi.vue new file mode 100644 index 0000000..0188327 --- /dev/null +++ b/src/views/ask/chatAi.vue @@ -0,0 +1,165 @@ + + + + + \ No newline at end of file diff --git a/src/views/ask/musicAi.vue b/src/views/ask/musicAi.vue new file mode 100644 index 0000000..fd0ceb7 --- /dev/null +++ b/src/views/ask/musicAi.vue @@ -0,0 +1,154 @@ + + + + + \ No newline at end of file diff --git a/src/views/ask/tableAi.vue b/src/views/ask/tableAi.vue new file mode 100644 index 0000000..7689a8b --- /dev/null +++ b/src/views/ask/tableAi.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/src/views/home.vue b/src/views/home.vue index b642de8..5b45a5a 100644 --- a/src/views/home.vue +++ b/src/views/home.vue @@ -10,37 +10,38 @@ 收缩侧边栏 - + - 蓝心小V - AI原子能力 - AI语音研究实验室 + 蓝心小V + AI原子能力 + AI语音研究实验室 - + - + - 个人信息 - 使用情况 + 个人信息 + 使用情况 @@ -64,17 +65,16 @@ -
-
- -
- - - -
- -
-
+ + +

{{ key }}

+
+
@@ -88,8 +88,9 @@ \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index caab0d3..50a6d63 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -124,7 +124,7 @@ const loginHandler = async () => { const response: userResponseData = await reqLogin(loginData); if (response.code === 200) { // 验证验证码 - router.push('/home') + router.push('/') console.log(response.message) } else { alert('用户名或密码错误'); diff --git a/src/views/myself/my.vue b/src/views/myself/my.vue new file mode 100644 index 0000000..9dab16b --- /dev/null +++ b/src/views/myself/my.vue @@ -0,0 +1,121 @@ + + + + + \ No newline at end of file diff --git a/src/views/myself/used.vue b/src/views/myself/used.vue new file mode 100644 index 0000000..365a84c --- /dev/null +++ b/src/views/myself/used.vue @@ -0,0 +1,119 @@ + + + + + \ No newline at end of file diff --git a/src/views/table/index.vue b/src/views/table/index.vue index ef98f35..184f539 100644 --- a/src/views/table/index.vue +++ b/src/views/table/index.vue @@ -4,43 +4,44 @@ - + 打开侧边栏 收缩侧边栏 - + - 蓝心小V - AI原子能力 - AI语音研究实验室 + 蓝心小V + AI原子能力 + AI语音研究实验室 - + - + - 个人信息 - 使用情况 + 个人信息 + 使用情况 @@ -79,7 +80,7 @@ import { nextTick, onMounted, ref } from 'vue' import { getTimeState } from '@/utils/index' import * as echarts from 'echarts' - const isCollapse = ref(true) + const isCollapse = ref(false) const handleOpen = (key: string, keyPath: string[]) => { console.log(key, keyPath) } From f2354bf4ba1cd6f7528c6f5f44dc2070e0977729 Mon Sep 17 00:00:00 2001 From: IHIRINA <2582067027@qq.com> Date: Tue, 27 May 2025 14:39:55 +0800 Subject: [PATCH 08/19] aichat --- components.d.ts | 1 + src/api/interface/index.ts | 9 ++ src/api/interface/type.ts | 9 ++ src/api/user/index.ts | 2 +- src/api/user/type.ts | 2 +- src/components/charts.vue | 163 +++++++++++++++++++++++++++++++++++++ src/utils/index.ts | 2 +- src/views/ask/chatAi.vue | 80 +++++++++++++----- 8 files changed, 246 insertions(+), 22 deletions(-) create mode 100644 src/api/interface/type.ts create mode 100644 src/components/charts.vue diff --git a/components.d.ts b/components.d.ts index 74c199e..73ded34 100644 --- a/components.d.ts +++ b/components.d.ts @@ -8,6 +8,7 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + Charts: typeof import('./src/components/charts.vue')['default'] ElAside: typeof import('element-plus/es')['ElAside'] ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] diff --git a/src/api/interface/index.ts b/src/api/interface/index.ts index e69de29..9486dbf 100644 --- a/src/api/interface/index.ts +++ b/src/api/interface/index.ts @@ -0,0 +1,9 @@ +import request from "@/utils/request" +import { type aiChatForm , type aiResponseData} from '@/api/interface/type' + +enum API { + AICHAT_URL = "/questionSimple" +} +//对外暴露请求函数 + +export const reqAiChat = (data: aiChatForm) => request.post(API.AICHAT_URL, data) as Promise; \ No newline at end of file diff --git a/src/api/interface/type.ts b/src/api/interface/type.ts new file mode 100644 index 0000000..4a09cf2 --- /dev/null +++ b/src/api/interface/type.ts @@ -0,0 +1,9 @@ +//AI接口参数 +export interface aiChatForm { + answer: string; +} + +export interface aiResponseData { + code:number, + Respond:string +} \ No newline at end of file diff --git a/src/api/user/index.ts b/src/api/user/index.ts index 8e8b11e..034336c 100644 --- a/src/api/user/index.ts +++ b/src/api/user/index.ts @@ -4,7 +4,7 @@ import { type loginForm ,type userResponseData} from '@/api/user/type'; //统一管理接口 enum API{ - LOGIN_URL = "/user/login", + LOGIN_URL = "/login", REGISTER_URL = "/user/register" } //对外暴露请求函数 diff --git a/src/api/user/type.ts b/src/api/user/type.ts index 3bd0df0..6fc5e77 100644 --- a/src/api/user/type.ts +++ b/src/api/user/type.ts @@ -8,5 +8,5 @@ export interface loginForm{ //登录,注册返回数据类型 export interface userResponseData { code:number, - message:string + msg:string } \ No newline at end of file diff --git a/src/components/charts.vue b/src/components/charts.vue new file mode 100644 index 0000000..fbf071e --- /dev/null +++ b/src/components/charts.vue @@ -0,0 +1,163 @@ + + + + + + diff --git a/src/utils/index.ts b/src/utils/index.ts index d85cb47..19ed654 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -10,4 +10,4 @@ export function getTimeState() { if (hours >= 14 && hours <= 18) return `下午好 🌞`; if (hours >= 18 && hours <= 24) return `晚上好 🌛`; if (hours >= 0 && hours <= 6) return `凌晨好 🌛`; - } \ No newline at end of file +} \ No newline at end of file diff --git a/src/views/ask/chatAi.vue b/src/views/ask/chatAi.vue index 0188327..4e1c891 100644 --- a/src/views/ask/chatAi.vue +++ b/src/views/ask/chatAi.vue @@ -68,12 +68,21 @@
-
- +
+ + +

{{ userThing }}

+
+ user +
+
+ +
+ + AI -

{{ 'List item ' + o }}

+

{{ backThing }}

- user
@@ -105,20 +114,25 @@ From 4b64175e5843cc428ed5d50597f5db56723dbe07 Mon Sep 17 00:00:00 2001 From: IHIRINA <2582067027@qq.com> Date: Tue, 27 May 2025 15:48:34 +0800 Subject: [PATCH 09/19] aichat --- package-lock.json | 376 +++++++++++++++++++++++++++++++++-- package.json | 3 +- src/api/interface/type.ts | 7 +- src/api/user/type.ts | 3 + src/stores/counter.ts | 12 -- src/stores/index.ts | 8 + src/stores/modules/user.ts | 123 ++++++++++++ src/views/ask/chatAi.vue | 44 ++-- src/views/login/index.vue | 2 +- src/views/register/index.vue | 2 +- 10 files changed, 524 insertions(+), 56 deletions(-) delete mode 100644 src/stores/counter.ts create mode 100644 src/stores/index.ts create mode 100644 src/stores/modules/user.ts diff --git a/package-lock.json b/package-lock.json index 74aebc9..f3903f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "echarts": "^5.6.0", "element-plus": "^2.9.9", "pinia": "^3.0.1", + "pinia-plugin-persistedstate": "^4.3.0", "vue": "^3.5.13", "vue-router": "^4.5.0" }, @@ -1022,6 +1023,85 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nuxt/kit": { + "version": "3.17.4", + "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.17.4.tgz", + "integrity": "sha512-l+hY8sy2XFfg3PigZj+PTu6+KIJzmbACTRimn1ew/gtCz+F38f6KTF4sMRTN5CUxiB8TRENgEonASmkAWfpO9Q==", + "license": "MIT", + "dependencies": { + "c12": "^3.0.4", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.5", + "ignore": "^7.0.4", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyglobby": "^0.2.13", + "ufo": "^1.6.1", + "unctx": "^2.4.1", + "unimport": "^5.0.1", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxt/kit/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@nuxt/kit/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nuxt/kit/node_modules/unimport": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-5.0.1.tgz", + "integrity": "sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "tinyglobby": "^0.2.13", + "unplugin": "^2.3.2", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=18.12.0" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz", @@ -1391,7 +1471,6 @@ "version": "1.0.7", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/lodash": { @@ -1845,7 +1924,6 @@ "version": "8.14.1", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2025,6 +2103,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/c12": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/c12/-/c12-3.0.4.tgz", + "integrity": "sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.5.0", + "exsolve": "^1.0.5", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.1.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -2084,6 +2218,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2100,9 +2243,17 @@ "version": "0.2.2", "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true, "license": "MIT" }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2200,6 +2351,12 @@ } } }, + "node_modules/deep-pick-omit": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz", + "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==", + "license": "MIT" + }, "node_modules/default-browser": { "version": "5.2.1", "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.2.1.tgz", @@ -2243,6 +2400,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2252,6 +2415,24 @@ "node": ">=0.4.0" } }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2351,6 +2532,12 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/errx": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/errx/-/errx-0.1.0.tgz", + "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==", + "license": "MIT" + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2457,7 +2644,6 @@ "version": "5.0.0", "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -2503,14 +2689,12 @@ "version": "1.0.5", "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.5.tgz", "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", - "dev": true, "license": "MIT" }, "node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -2688,6 +2872,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -2809,6 +3010,15 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", @@ -2981,6 +3191,15 @@ "node": ">=16" } }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3037,6 +3256,21 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/knitwork/-/knitwork-1.2.0.tgz", + "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==", + "license": "MIT" + }, "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", @@ -3095,7 +3329,6 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz", "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", - "dev": true, "license": "MIT", "dependencies": { "mlly": "^1.7.4", @@ -3262,7 +3495,6 @@ "version": "1.7.4", "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz", "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.14.0", @@ -3275,14 +3507,12 @@ "version": "0.1.8", "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, "license": "MIT" }, "node_modules/mlly/node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.1.8", @@ -3350,6 +3580,12 @@ "node": ">= 4.4.x" } }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz", + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", @@ -3440,6 +3676,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/nypm": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.6.0.tgz", + "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "pathe": "^2.0.3", + "pkg-types": "^2.0.0", + "tinyexec": "^0.3.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, "node_modules/open": { "version": "10.1.2", "resolved": "https://registry.npmmirror.com/open/-/open-10.1.2.tgz", @@ -3503,7 +3764,6 @@ "version": "2.0.3", "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, "license": "MIT" }, "node_modules/perfect-debounce": { @@ -3522,7 +3782,6 @@ "version": "4.0.2", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -3576,11 +3835,34 @@ } } }, + "node_modules/pinia-plugin-persistedstate": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.3.0.tgz", + "integrity": "sha512-x9wxpHj6iFDj5ITQJ3rj6+KesEqyRk/vqcE3WE+VGfetleV9Zufqwa9qJ6AkA5wmRSQEp7BTA1us/MDVTRHFFw==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^3.17.2", + "deep-pick-omit": "^1.2.1", + "defu": "^6.1.4", + "destr": "^2.0.5" + }, + "peerDependencies": { + "@pinia/nuxt": ">=0.10.0", + "pinia": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@pinia/nuxt": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, "node_modules/pkg-types": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz", "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", - "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.2.1", @@ -3650,7 +3932,6 @@ "version": "0.2.10", "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz", "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "dev": true, "funding": [ { "type": "individual", @@ -3663,6 +3944,16 @@ ], "license": "MIT" }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/read-package-json-fast": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", @@ -3782,7 +4073,6 @@ "version": "1.3.0", "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -3888,6 +4178,12 @@ "node": ">=0.10.0" } }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "license": "MIT" + }, "node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz", @@ -3905,7 +4201,6 @@ "version": "3.0.0", "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.0.0.tgz", "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^9.0.1" @@ -3918,7 +4213,6 @@ "version": "9.0.1", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, "license": "MIT" }, "node_modules/superjson": { @@ -3933,11 +4227,16 @@ "node": ">=16" } }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.13.tgz", "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.4.4", @@ -3998,9 +4297,29 @@ "version": "1.6.1", "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true, "license": "MIT" }, + "node_modules/unctx": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/unctx/-/unctx-2.4.1.tgz", + "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17", + "unplugin": "^2.1.0" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", @@ -4071,7 +4390,6 @@ "version": "2.3.2", "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.2.tgz", "integrity": "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==", - "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.14.1", @@ -4119,7 +4437,6 @@ "version": "0.2.4", "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz", "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", - "dev": true, "license": "MIT", "dependencies": { "pathe": "^2.0.2", @@ -4168,6 +4485,22 @@ } } }, + "node_modules/untyped": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/untyped/-/untyped-2.0.0.tgz", + "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "defu": "^6.1.4", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -4432,7 +4765,6 @@ "version": "0.6.2", "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, "license": "MIT" }, "node_modules/which": { diff --git a/package.json b/package.json index 5423c0e..88e4215 100644 --- a/package.json +++ b/package.json @@ -16,13 +16,14 @@ "echarts": "^5.6.0", "element-plus": "^2.9.9", "pinia": "^3.0.1", + "pinia-plugin-persistedstate": "^4.3.0", "vue": "^3.5.13", "vue-router": "^4.5.0" }, "devDependencies": { "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", - "@types/echarts": "^4.9.22", + "@types/echarts": "^4.9.22", "@types/node": "^22.14.0", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", diff --git a/src/api/interface/type.ts b/src/api/interface/type.ts index 4a09cf2..c2d61ef 100644 --- a/src/api/interface/type.ts +++ b/src/api/interface/type.ts @@ -1,9 +1,10 @@ //AI接口参数 export interface aiChatForm { - answer: string; + question: string, + userId: number } export interface aiResponseData { - code:number, - Respond:string + code: number, + Respond: string } \ No newline at end of file diff --git a/src/api/user/type.ts b/src/api/user/type.ts index 6fc5e77..06bda70 100644 --- a/src/api/user/type.ts +++ b/src/api/user/type.ts @@ -9,4 +9,7 @@ export interface loginForm{ export interface userResponseData { code:number, msg:string + data: { + userId: number, + } } \ No newline at end of file diff --git a/src/stores/counter.ts b/src/stores/counter.ts deleted file mode 100644 index b6757ba..0000000 --- a/src/stores/counter.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ref, computed } from 'vue' -import { defineStore } from 'pinia' - -export const useCounterStore = defineStore('counter', () => { - const count = ref(0) - const doubleCount = computed(() => count.value * 2) - function increment() { - count.value++ - } - - return { count, doubleCount, increment } -}) diff --git a/src/stores/index.ts b/src/stores/index.ts new file mode 100644 index 0000000..0c7dfda --- /dev/null +++ b/src/stores/index.ts @@ -0,0 +1,8 @@ +import { createPinia } from "pinia"; +import piniaPluginPersistedstate from "pinia-plugin-persistedstate"; + +// pinia persist +const pinia = createPinia(); +pinia.use(piniaPluginPersistedstate); + +export default pinia; diff --git a/src/stores/modules/user.ts b/src/stores/modules/user.ts new file mode 100644 index 0000000..2bfe252 --- /dev/null +++ b/src/stores/modules/user.ts @@ -0,0 +1,123 @@ +import { defineStore } from 'pinia' +import { reqLogin, reqRegiter } from '@/api/user' +import { type loginForm, type userResponseData } from '@/api/user/type' +import { useRouter } from 'vue-router' +import { ElNotification } from 'element-plus' +import { ref } from 'vue' + +// 定义用户状态类型 +interface UserState { + userId: number | null + token: string | null + username: string | null + email: string | null +} + +// 创建用户小仓库 +export const useUserStore = defineStore('user', { + // 小仓库数据 + state: (): UserState => ({ + userId: null, + token: null, + username: null, + email: null + }), + + actions: { + // 用户登录方法 + async userLogin(data: loginForm) { + try { + const result: userResponseData = await reqLogin(data) + console.log('Login response:', result) + + if (result.code === 200) { + // 存储用户信息到状态 + this.userId = result.data.userId + this.email = data.email + + // 存储到本地存储,确保刷新后数据不丢失 + localStorage.setItem('userId', result.data.userId.toString()) + + + const router = useRouter() + router.push({ name: 'home' }) + /* + ElNotification({ + title: '登录成功', + message: `欢迎回来,${this.username}`, + type: 'success', + duration: 3000 + })*/ + } else { + ElNotification({ + title: '登录失败', + message: result.msg || '用户不存在或密码错误', + type: 'error', + duration: 3000 + }) + } + } catch (error: any) { + console.error('Login request failed:', error) + ElNotification({ + title: '登录异常', + message: error.response?.data?.message || '登录请求失败,请稍后再试', + type: 'error', + duration: 3000 + }) + } + }, + + // 用户注册方法 + async userRegister(data: loginForm) { + try { + const result = await reqRegiter(data) + console.log('Register response:', result) + + if (result.code === 200) { + ElNotification({ + title: '注册成功', + message: '请登录后使用完整功能', + type: 'success', + duration: 3000 + }) + + const router = useRouter() + router.push({ name: 'login' }) + } else { + ElNotification({ + title: '注册失败', + message: result.msg || '用户已存在', + type: 'error', + duration: 3000 + }) + } + } catch (error: any) { + console.error('Register request failed:', error) + ElNotification({ + title: '注册异常', + message: error.response?.data?.message || '注册请求失败,请稍后再试', + type: 'error', + duration: 3000 + }) + } + }, + + /* + // 从本地存储初始化用户状态 + initUserState() { + const userId = localStorage.getItem('userId') + const token = localStorage.getItem('token') + if (userId && token) { + this.userId = parseInt(userId) + this.token = token + } + }*/ + }, + + getters: { + /* 判断用户是否已登录 + isLoggedIn(): boolean { + return this.userId !== null && this.token !== null + }*/ + } +}) \ No newline at end of file diff --git a/src/views/ask/chatAi.vue b/src/views/ask/chatAi.vue index 4e1c891..93997ca 100644 --- a/src/views/ask/chatAi.vue +++ b/src/views/ask/chatAi.vue @@ -120,8 +120,12 @@ import { ElMessage } from 'element-plus' import router from '@/router' import axios from 'axios' import { reqAiChat } from '@/api/interface' +import { useUserStore } from '@/stores/modules/user' + +// 获取用户状态 +const userStore = useUserStore() +const userId = ref(userStore.userId) -const baseURL = '' //侧边栏开合 const isCollapse = ref(false) @@ -156,22 +160,26 @@ const handleEnter = (event: KeyboardEvent) => { const backThing = ref() const userThing = ref() watch(userThing, async (newValue) => { - if (newValue.trim()) { + if (newValue && newValue.question.trim() && newValue.userId !== null) { backThing.value = '思考中...' - backThing.value = await reqAiChat(newValue.trim()) - .then((res) => { - if (res.code === 200) { - return res.Respond - } else { - ElMessage.error('请求失败,请稍后再试') - return '请求失败,请稍后再试' - } - }) - .catch((error) => { - console.error('请求错误:', error) - ElMessage.error('请求错误,请稍后再试') - return '请求错误,请稍后再试' + try { + // 发送包含userId和问题的请求 + const res = await reqAiChat({ + question: newValue.question, + userId: newValue.userId }) + + if (res.code === 200) { + backThing.value = res.Respond + } else { + ElMessage.error('请求失败,请稍后再试') + backThing.value = '请求失败,请稍后再试' + } + } catch (error) { + console.error('请求错误:', error) + ElMessage.error('请求错误,请稍后再试') + backThing.value = '请求错误,请稍后再试' + } } }) const submitClick = (): void => { @@ -181,7 +189,11 @@ const submitClick = (): void => { return } - userThing.value = inputValue + // 构造包含userId的请求数据 + userThing.value = { + question: inputValue, + userId: userId.value + } text.value = '' isShow.value = true } diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 50a6d63..fd4a0e8 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -125,7 +125,7 @@ const loginHandler = async () => { if (response.code === 200) { // 验证验证码 router.push('/') - console.log(response.message) + console.log(response.msg) } else { alert('用户名或密码错误'); } diff --git a/src/views/register/index.vue b/src/views/register/index.vue index cb35886..10ca039 100644 --- a/src/views/register/index.vue +++ b/src/views/register/index.vue @@ -117,7 +117,7 @@ const registerHandler = async () => { alert('注册成功,请登录'); router.push('/login'); } else { - alert(response.message); + alert(response.msg); } } else { console.error('未收到有效的响应'); From debb7519cfa920d680248f0ad5ffb525e71e0047 Mon Sep 17 00:00:00 2001 From: IHIRINA <2582067027@qq.com> Date: Tue, 3 Jun 2025 15:15:58 +0800 Subject: [PATCH 10/19] =?UTF-8?q?=E8=BF=99=E6=8A=8A=E6=98=AF=E7=9C=9F?= =?UTF-8?q?=E7=9A=84=E5=86=99=E5=AE=8C=E4=BA=86chat=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/interface/index.ts | 8 ++- src/api/interface/type.ts | 16 ++++- src/api/user/index.ts | 16 ----- src/api/user/login/index.ts | 8 +++ src/api/user/login/type.ts | 16 +++++ src/api/user/register/index.ts | 12 ++++ src/api/user/register/type.ts | 13 ++++ src/api/user/type.ts | 15 ----- src/main.ts | 4 +- src/stores/modules/user.ts | 107 +++++++++++++++++---------------- src/views/ask/chatAi.vue | 33 ++++++---- src/views/ask/musicAi.vue | 7 ++- src/views/ask/tableAi.vue | 25 +++----- src/views/home.vue | 7 ++- src/views/login/index.vue | 10 ++- src/views/myself/my.vue | 7 ++- src/views/myself/used.vue | 5 ++ src/views/register/index.vue | 29 ++++----- src/views/table/index.vue | 6 +- 19 files changed, 200 insertions(+), 144 deletions(-) create mode 100644 src/api/user/login/index.ts create mode 100644 src/api/user/login/type.ts create mode 100644 src/api/user/register/index.ts create mode 100644 src/api/user/register/type.ts diff --git a/src/api/interface/index.ts b/src/api/interface/index.ts index 9486dbf..c7a5001 100644 --- a/src/api/interface/index.ts +++ b/src/api/interface/index.ts @@ -1,9 +1,11 @@ import request from "@/utils/request" -import { type aiChatForm , type aiResponseData} from '@/api/interface/type' +import { type aiChatForm , type aiTableForm, type aiResponseData} from '@/api/interface/type' enum API { - AICHAT_URL = "/questionSimple" + AICHAT_URL = "/user/questionSimple", + AIPICTURE_URL = "/user/picture" } //对外暴露请求函数 -export const reqAiChat = (data: aiChatForm) => request.post(API.AICHAT_URL, data) as Promise; \ No newline at end of file +export const reqAiChat = (data: aiChatForm) => request.post(API.AICHAT_URL, data) as Promise; +export const reqAitable = (data: aiTableForm) => request.post(API.AIPICTURE_URL, data) as Promise \ No newline at end of file diff --git a/src/api/interface/type.ts b/src/api/interface/type.ts index c2d61ef..5db48f2 100644 --- a/src/api/interface/type.ts +++ b/src/api/interface/type.ts @@ -4,7 +4,19 @@ export interface aiChatForm { userId: number } +export interface aiTableForm { + picture: string + userId: string +} + export interface aiResponseData { - code: number, - Respond: string + code: number + msg: string + data: { + Respond: string + } +} + +export interface aiResponsePictureData { + } \ No newline at end of file diff --git a/src/api/user/index.ts b/src/api/user/index.ts index 034336c..e69de29 100644 --- a/src/api/user/index.ts +++ b/src/api/user/index.ts @@ -1,16 +0,0 @@ -//用户相关接口 -import request from "@/utils/request"; -import { type loginForm ,type userResponseData} from '@/api/user/type'; - -//统一管理接口 -enum API{ - LOGIN_URL = "/login", - REGISTER_URL = "/user/register" -} -//对外暴露请求函数 - -//登录接口方法 -export const reqLogin = (data: loginForm) => request.post(API.LOGIN_URL, data) as Promise; - -//注册用户信息接口方法 -export const reqRegiter = (data: loginForm) => request.post(API.REGISTER_URL, data) as Promise; \ No newline at end of file diff --git a/src/api/user/login/index.ts b/src/api/user/login/index.ts new file mode 100644 index 0000000..d542bb6 --- /dev/null +++ b/src/api/user/login/index.ts @@ -0,0 +1,8 @@ +import request from "@/utils/request" +import { type loginForm, type userLoginResponseData } from "./type" + + +const LOGIN_URL = "/user/login" + + +export const reqLogin = (data: loginForm) => request.post(LOGIN_URL,data) as Promise \ No newline at end of file diff --git a/src/api/user/login/type.ts b/src/api/user/login/type.ts new file mode 100644 index 0000000..18613e2 --- /dev/null +++ b/src/api/user/login/type.ts @@ -0,0 +1,16 @@ +export interface loginForm { + username:string, + password:string + email: string, +} + +export interface userLoginResponseData { + code:number + msg:string + data:{ + id:number + username:string + email:string + token:string + } +} \ No newline at end of file diff --git a/src/api/user/register/index.ts b/src/api/user/register/index.ts new file mode 100644 index 0000000..202678d --- /dev/null +++ b/src/api/user/register/index.ts @@ -0,0 +1,12 @@ +//用户相关接口 +import request from "@/utils/request"; +import { type registerForm ,type userRegisterResponseData} from '@/api/user/register/type'; + +//统一管理接口 +enum API{ + REGISTER_URL = "/user/register" +} +//对外暴露请求函数 + +//注册用户信息接口方法 +export const reqRegiter = (data: registerForm) => request.post(API.REGISTER_URL, data) as Promise; \ No newline at end of file diff --git a/src/api/user/register/type.ts b/src/api/user/register/type.ts new file mode 100644 index 0000000..79df6b4 --- /dev/null +++ b/src/api/user/register/type.ts @@ -0,0 +1,13 @@ +//登录接口参数 +export interface registerForm{ + username:string, + password:string + email: string, +} + +//登录,注册返回数据类型 +export interface userRegisterResponseData { + code:number, + msg:string + data: string +} \ No newline at end of file diff --git a/src/api/user/type.ts b/src/api/user/type.ts index 06bda70..e69de29 100644 --- a/src/api/user/type.ts +++ b/src/api/user/type.ts @@ -1,15 +0,0 @@ -//登录接口参数 -export interface loginForm{ - username:string, - password:string - email: string, -} - -//登录,注册返回数据类型 -export interface userResponseData { - code:number, - msg:string - data: { - userId: number, - } -} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 6158c08..4c51d67 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,7 +15,9 @@ const app = createApp(App) for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component) } -app.use(createPinia()) +const pinia = createPinia() + +app.use(pinia) app.use(router) app.mount('#app') diff --git a/src/stores/modules/user.ts b/src/stores/modules/user.ts index 2bfe252..98cd07b 100644 --- a/src/stores/modules/user.ts +++ b/src/stores/modules/user.ts @@ -1,108 +1,112 @@ import { defineStore } from 'pinia' -import { reqLogin, reqRegiter } from '@/api/user' -import { type loginForm, type userResponseData } from '@/api/user/type' +import { reqRegiter } from '@/api/user/register' +import { reqLogin } from '@/api/user/login' +import { type registerForm, type userRegisterResponseData } from '@/api/user/register/type' +import { type loginForm, type userLoginResponseData } from '@/api/user/login/type' import { useRouter } from 'vue-router' import { ElNotification } from 'element-plus' -import { ref } from 'vue' + // 定义用户状态类型 interface UserState { - userId: number | null - token: string | null - username: string | null - email: string | null + userId: number + token: string + username: string + email: string } // 创建用户小仓库 export const useUserStore = defineStore('user', { // 小仓库数据 state: (): UserState => ({ - userId: null, - token: null, - username: null, - email: null + userId: 0, + token: '', + username: '', + email: '' }), actions: { - // 用户登录方法 - async userLogin(data: loginForm) { + // 用户注册方法 + async userRegister(data: registerForm) { try { - const result: userResponseData = await reqLogin(data) - console.log('Login response:', result) + const result:userRegisterResponseData = await reqRegiter(data) + console.log('Register response:', result) //code,msg,注册成功请登录 if (result.code === 200) { - // 存储用户信息到状态 - this.userId = result.data.userId - this.email = data.email - - // 存储到本地存储,确保刷新后数据不丢失 - localStorage.setItem('userId', result.data.userId.toString()) - - - const router = useRouter() - router.push({ name: 'home' }) - /* ElNotification({ - title: '登录成功', - message: `欢迎回来,${this.username}`, + title: '注册成功', + message: '请登录后使用完整功能', type: 'success', duration: 3000 - })*/ + }) + + const router = useRouter() + router.push('/login') + } else { ElNotification({ - title: '登录失败', - message: result.msg || '用户不存在或密码错误', + title: '注册失败', + message: result.msg, type: 'error', duration: 3000 }) } } catch (error: any) { - console.error('Login request failed:', error) + console.error('Register request failed:', error) ElNotification({ - title: '登录异常', - message: error.response?.data?.message || '登录请求失败,请稍后再试', + title: '注册异常', + message: error.response?.data?.message || '注册请求失败,请稍后再试', type: 'error', duration: 3000 }) } }, - // 用户注册方法 - async userRegister(data: loginForm) { + // 用户登录方法 + async userLogin(data: loginForm) { try { - const result = await reqRegiter(data) - console.log('Register response:', result) + const result: userLoginResponseData = await reqLogin(data) + console.log('Login response:', result) if (result.code === 200) { + // 存储用户信息到状态 + this.userId = result.data.id + this.email = result.data.email + this.username = result.data.username + + // 存储到本地存储,确保刷新后数据不丢失 + localStorage.setItem('userId', result.data.id.toString()) + + const router = useRouter() + router.push('/') + ElNotification({ - title: '注册成功', - message: '请登录后使用完整功能', + title: '登录成功', + message: `欢迎回来,${this.username}`, type: 'success', duration: 3000 }) - const router = useRouter() - router.push({ name: 'login' }) } else { ElNotification({ - title: '注册失败', - message: result.msg || '用户已存在', + title: '登录失败', + message: result.msg || '用户不存在或密码错误', type: 'error', duration: 3000 }) } } catch (error: any) { - console.error('Register request failed:', error) + console.error('Login request failed:', error) ElNotification({ - title: '注册异常', - message: error.response?.data?.message || '注册请求失败,请稍后再试', + title: '登录异常', + message: error.response?.data?.message || '登录请求失败,请稍后再试', type: 'error', duration: 3000 }) } }, - /* + // 从本地存储初始化用户状态 initUserState() { const userId = localStorage.getItem('userId') @@ -111,13 +115,14 @@ export const useUserStore = defineStore('user', { this.userId = parseInt(userId) this.token = token } - }*/ + } }, + //getters计算属性 getters: { - /* 判断用户是否已登录 + //判断用户是否已登录 isLoggedIn(): boolean { return this.userId !== null && this.token !== null - }*/ + } } }) \ No newline at end of file diff --git a/src/views/ask/chatAi.vue b/src/views/ask/chatAi.vue index 93997ca..74be02e 100644 --- a/src/views/ask/chatAi.vue +++ b/src/views/ask/chatAi.vue @@ -57,7 +57,7 @@
- + user @@ -71,7 +71,7 @@
-

{{ userThing }}

+

{{ userThing.question }}

user
@@ -117,14 +117,9 @@ import { onMounted, ref, watch } from 'vue' import { getTimeState } from '@/utils/index' import { ElMessage } from 'element-plus' -import router from '@/router' -import axios from 'axios' import { reqAiChat } from '@/api/interface' import { useUserStore } from '@/stores/modules/user' - -// 获取用户状态 -const userStore = useUserStore() -const userId = ref(userStore.userId) +import { type aiChatForm } from '@/api/interface/type' //侧边栏开合 @@ -144,6 +139,11 @@ onMounted(() => { console.log(thisTimeState.value) }) + /*网页全屏*/ +const handleFullscreen = () => { + document.documentElement.requestFullscreen() +} + /*对话框写入部分*/ const text = ref() const isShow = ref(false) @@ -157,20 +157,28 @@ const handleEnter = (event: KeyboardEvent) => { } /*对话框交互部分*/ +// 获取用户状态 +const userStore = useUserStore() +const userId = userStore.userId + const backThing = ref() -const userThing = ref() +const userThing = ref({ + question: text.value ?? '', + userId: userId ?? 1 // 默认用1或默认userId +}) + watch(userThing, async (newValue) => { if (newValue && newValue.question.trim() && newValue.userId !== null) { backThing.value = '思考中...' try { - // 发送包含userId和问题的请求 + // 请求 const res = await reqAiChat({ question: newValue.question, userId: newValue.userId }) if (res.code === 200) { - backThing.value = res.Respond + backThing.value = res.data.Respond } else { ElMessage.error('请求失败,请稍后再试') backThing.value = '请求失败,请稍后再试' @@ -182,6 +190,7 @@ watch(userThing, async (newValue) => { } } }) + const submitClick = (): void => { const inputValue = text.value.trim() if (!inputValue) { @@ -192,7 +201,7 @@ const submitClick = (): void => { // 构造包含userId的请求数据 userThing.value = { question: inputValue, - userId: userId.value + userId: userId ?? 1 // 保证userId为number类型 } text.value = '' isShow.value = true diff --git a/src/views/ask/musicAi.vue b/src/views/ask/musicAi.vue index fd0ceb7..f27d7e8 100644 --- a/src/views/ask/musicAi.vue +++ b/src/views/ask/musicAi.vue @@ -57,7 +57,7 @@ - + user @@ -114,6 +114,11 @@ onMounted(() => { console.log(thisTimeState.value) }) + /*网页全屏*/ +const handleFullscreen = () => { + document.documentElement.requestFullscreen() +} + const text = ref() const handleEnter = (event: KeyboardEvent) => { // 如果按下Shift+Enter则插入换行 diff --git a/src/views/ask/tableAi.vue b/src/views/ask/tableAi.vue index 7689a8b..c09cef8 100644 --- a/src/views/ask/tableAi.vue +++ b/src/views/ask/tableAi.vue @@ -56,8 +56,8 @@ {{ thisTimeState }} - - + + user @@ -67,6 +67,9 @@
+ + + { console.log(key, keyPath) @@ -129,18 +134,8 @@ const handleEnter = (event: KeyboardEvent) => { } const submitClick = () => { - if(text.value.trim() == 0) { - ElMessage.warning("请输入东西哦亲") - }else{ - - } - - - - - ElMessage.success("正在为您生成计划") -} - + +} diff --git a/src/views/home.vue b/src/views/home.vue index 5b45a5a..68f92db 100644 --- a/src/views/home.vue +++ b/src/views/home.vue @@ -57,7 +57,7 @@ - + user @@ -106,6 +106,11 @@ onMounted(() => { console.log(thisTimeState.value) }) + /*网页全屏*/ +const handleFullscreen = () => { + document.documentElement.requestFullscreen() +} + const item = [ ['在蓝心小V里你可以问问AI该怎么制定计划'], ["如果你不开心,你也可以在AI原子能力里面和AI聊天"], diff --git a/src/views/login/index.vue b/src/views/login/index.vue index fd4a0e8..6179cea 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -47,10 +47,8 @@ import { reactive, ref, type Component } from 'vue' import { RowAlign, type FormInstance, type FormRules } from 'element-plus' import ValidCodeComponent from '@/components/validCode.vue' import { useRouter } from 'vue-router' -import axios from 'axios' -import request from '@/utils/request' -import type { loginForm, userResponseData } from '@/api/user/type' -import { reqLogin } from '@/api/user' +import type { loginForm, userLoginResponseData } from '@/api/user/login/type' +import { reqLogin } from '@/api/user/login' interface RuleForm { @@ -114,6 +112,7 @@ const loginHandler = async () => { } }) + //注册申请 const loginData: loginForm = { username: ruleForm.name, password: ruleForm.password, @@ -121,9 +120,8 @@ const loginHandler = async () => { } try { - const response: userResponseData = await reqLogin(loginData); + const response: userLoginResponseData = await reqLogin(loginData); if (response.code === 200) { - // 验证验证码 router.push('/') console.log(response.msg) } else { diff --git a/src/views/myself/my.vue b/src/views/myself/my.vue index 9dab16b..4f3c656 100644 --- a/src/views/myself/my.vue +++ b/src/views/myself/my.vue @@ -57,7 +57,7 @@ - + user @@ -98,7 +98,10 @@ onMounted(() => { console.log(thisTimeState.value) }) - + /*网页全屏*/ +const handleFullscreen = () => { + document.documentElement.requestFullscreen() +} diff --git a/src/views/myself/used.vue b/src/views/myself/used.vue index 365a84c..475fd6b 100644 --- a/src/views/myself/used.vue +++ b/src/views/myself/used.vue @@ -98,6 +98,11 @@ onMounted(() => { console.log(thisTimeState.value) }) + /*网页全屏*/ +const handleFullscreen = () => { + document.documentElement.requestFullscreen() +} + diff --git a/src/views/register/index.vue b/src/views/register/index.vue index 10ca039..f2a7f10 100644 --- a/src/views/register/index.vue +++ b/src/views/register/index.vue @@ -41,10 +41,8 @@ import { reactive, ref } from 'vue' import { RowAlign, type FormInstance, type FormRules } from 'element-plus' import { useRouter } from 'vue-router' -import axios from 'axios' -import request from '@/utils/request' -import type { loginForm, userResponseData } from '@/api/user/type' -import { reqRegiter } from '@/api/user' +import type { registerForm, userRegisterResponseData } from '@/api/user/register/type' +import { reqRegiter } from '@/api/user/register' interface RuleForm { name: string @@ -105,28 +103,23 @@ const registerHandler = async () => { }) // 提交注册请求 - const registerData: loginForm = { + const registerData: registerForm = { username: ruleForm.name, password: ruleForm.password, email: ruleForm.email, } try { - const response: userResponseData = await reqRegiter(registerData); - if (response) { - if (response.code === 200) { - alert('注册成功,请登录'); - router.push('/login'); - } else { - alert(response.msg); - } - } else { - console.error('未收到有效的响应'); - alert('注册失败,请重试'); - } + const response: userRegisterResponseData = await reqRegiter(registerData); + if (response.code === 200) { + alert('注册成功,请登录'); + router.push('/login'); + } else { + alert(response.msg); + } } catch (error) { console.error('注册失败:', error); alert('注册失败,请重试'); - } + } } diff --git a/src/views/table/index.vue b/src/views/table/index.vue index 184f539..c86dd43 100644 --- a/src/views/table/index.vue +++ b/src/views/table/index.vue @@ -57,7 +57,7 @@ - + user @@ -96,6 +96,10 @@ onMounted(() => { console.log(thisTimeState.value) }) + /*网页全屏*/ +const handleFullscreen = () => { + document.documentElement.requestFullscreen() +} const chartRef = ref(null); From 3aea5964b7459695b631be3888ec270e28368da4 Mon Sep 17 00:00:00 2001 From: IHIRINA <2582067027@qq.com> Date: Mon, 30 Jun 2025 20:54:48 +0800 Subject: [PATCH 11/19] hahaha --- auto-imports.d.ts | 1 + components.d.ts | 12 + index.html | 2 + package-lock.json | 440 ++++++++++++++++++++++++++++++++- package.json | 8 +- public/5.png | Bin 0 -> 77678 bytes src/api/interface/index.ts | 7 +- src/api/interface/type.ts | 13 +- src/api/user/login/index.ts | 12 +- src/api/user/login/type.ts | 18 ++ src/api/user/register/index.ts | 2 +- src/api/user/register/type.ts | 4 +- src/api/user/show/index.ts | 12 + src/api/user/show/type.ts | 21 ++ src/assets/fonts/DFKTL1B.TTF | Bin 0 -> 42436 bytes src/assets/fonts/blomster.ttf | Bin 0 -> 44628 bytes src/assets/fonts/theFonts.css | 4 + src/main.ts | 8 +- src/stores/modules/user.ts | 209 +++++++++++++--- src/types/amap.d.ts | 71 ++++++ src/utils/request.ts | 2 +- src/views/ask/chatAi.vue | 71 +++--- src/views/ask/musicAi.vue | 216 ++++++++++++++-- src/views/ask/tableAi.vue | 80 +++++- src/views/home.vue | 140 +++++++++-- src/views/login/index.vue | 358 ++++++++++++++++++++------- src/views/myself/my.vue | 411 +++++++++++++++++++++++++++--- src/views/myself/used.vue | 214 +++++++++------- src/views/register/index.vue | 304 ++++++++++++++++++----- src/views/table/index.vue | 194 ++++++++------- 30 files changed, 2321 insertions(+), 513 deletions(-) create mode 100644 public/5.png create mode 100644 src/api/user/show/index.ts create mode 100644 src/api/user/show/type.ts create mode 100644 src/assets/fonts/DFKTL1B.TTF create mode 100644 src/assets/fonts/blomster.ttf create mode 100644 src/assets/fonts/theFonts.css create mode 100644 src/types/amap.d.ts diff --git a/auto-imports.d.ts b/auto-imports.d.ts index bc57d8c..b60e825 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -8,4 +8,5 @@ export {} declare global { const ElMenu: typeof import('element-plus/es')['ElMenu'] const ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + const ElMessage: typeof import('element-plus/es')['ElMessage'] } diff --git a/components.d.ts b/components.d.ts index 73ded34..2bfc728 100644 --- a/components.d.ts +++ b/components.d.ts @@ -9,6 +9,7 @@ export {} declare module 'vue' { export interface GlobalComponents { Charts: typeof import('./src/components/charts.vue')['default'] + ElAlert: typeof import('element-plus/es')['ElAlert'] ElAside: typeof import('element-plus/es')['ElAside'] ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] @@ -22,14 +23,19 @@ declare module 'vue' { ElCol: typeof import('element-plus/es')['ElCol'] ElContainer: typeof import('element-plus/es')['ElContainer'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] + ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] + ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] + ElEmpty: typeof import('element-plus/es')['ElEmpty'] ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElHeader: typeof import('element-plus/es')['ElHeader'] ElIcon: typeof import('element-plus/es')['ElIcon'] + ElImage: typeof import('element-plus/es')['ElImage'] ElInput: typeof import('element-plus/es')['ElInput'] + ElLoading: typeof import('element-plus/es')['ElLoading'] ElMain: typeof import('element-plus/es')['ElMain'] ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] @@ -47,14 +53,17 @@ declare module 'vue' { ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] + ElTag: typeof import('element-plus/es')['ElTag'] ElText: typeof import('element-plus/es')['ElText'] ElTimePicker: typeof import('element-plus/es')['ElTimePicker'] + ElTooltip: typeof import('element-plus/es')['ElTooltip'] HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] IconCommunity: typeof import('./src/components/icons/IconCommunity.vue')['default'] IconDocumentation: typeof import('./src/components/icons/IconDocumentation.vue')['default'] IconEcosystem: typeof import('./src/components/icons/IconEcosystem.vue')['default'] IconSupport: typeof import('./src/components/icons/IconSupport.vue')['default'] IconTooling: typeof import('./src/components/icons/IconTooling.vue')['default'] + Main: typeof import('./src/components/main.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] TheWelcome: typeof import('./src/components/TheWelcome.vue')['default'] @@ -62,4 +71,7 @@ declare module 'vue' { ValidCode: typeof import('./src/components/validCode.vue')['default'] WelcomeItem: typeof import('./src/components/WelcomeItem.vue')['default'] } + export interface ComponentCustomProperties { + vLoading: typeof import('element-plus/es')['ElLoadingDirective'] + } } diff --git a/index.html b/index.html index 872ab31..4d45f34 100644 --- a/index.html +++ b/index.html @@ -11,3 +11,5 @@ + + diff --git a/package-lock.json b/package-lock.json index f3903f4..f7dd675 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,23 +9,27 @@ "version": "0.0.0", "dependencies": { "@element-plus/icons-vue": "^2.3.1", - "axios": "^1.9.0", + "axios": "^1.10.0", "echarts": "^5.6.0", "element-plus": "^2.9.9", "pinia": "^3.0.1", "pinia-plugin-persistedstate": "^4.3.0", + "recordrtc": "^5.6.2", "vue": "^3.5.13", - "vue-router": "^4.5.0" + "vue-router": "^4.5.0", + "weixin-js-sdk": "^1.6.5" }, "devDependencies": { "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", "@types/echarts": "^4.9.22", "@types/node": "^22.14.0", + "@types/recordrtc": "^5.6.14", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", "less": "^4.3.0", "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", "typescript": "~5.8.0", "unplugin-auto-import": "^19.1.2", "unplugin-vue-components": "^28.5.0", @@ -503,6 +507,13 @@ "node": ">=6.9.0" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.5.2.tgz", + "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", @@ -1498,6 +1509,13 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/recordrtc": { + "version": "5.6.14", + "resolved": "https://registry.npmmirror.com/@types/recordrtc/-/recordrtc-5.6.14.tgz", + "integrity": "sha512-Reiy1sl11xP0r6w8DW3iQjc1BgXFyNC7aDuutysIjpFoqyftbQps9xPA2FoBkfVXpJM61betgYPNt+v65zvMhA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/web-bluetooth": { "version": "0.0.16", "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", @@ -1992,9 +2010,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -2087,6 +2105,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true, + "license": "MIT/X11" + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", @@ -2227,6 +2252,13 @@ "consola": "^3.2.3" } }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2931,6 +2963,16 @@ "dev": true, "license": "ISC" }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", @@ -3033,6 +3075,13 @@ "node": ">=0.10.0" } }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3994,6 +4043,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/recordrtc": { + "version": "5.6.2", + "resolved": "https://registry.npmmirror.com/recordrtc/-/recordrtc-5.6.2.tgz", + "integrity": "sha512-1QNKKNtl7+KcwD1lyOgP3ZlbiJ1d0HtXnypUy7yq49xEERxk31PHvE9RCciDrulPCY7WJ+oz0R9hpNxgsIurGQ==", + "license": "MIT" + }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", @@ -4053,6 +4108,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4061,6 +4126,319 @@ "license": "MIT", "optional": true }, + "node_modules/sass-embedded": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.89.2.tgz", + "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.89.2", + "sass-embedded-android-arm64": "1.89.2", + "sass-embedded-android-riscv64": "1.89.2", + "sass-embedded-android-x64": "1.89.2", + "sass-embedded-darwin-arm64": "1.89.2", + "sass-embedded-darwin-x64": "1.89.2", + "sass-embedded-linux-arm": "1.89.2", + "sass-embedded-linux-arm64": "1.89.2", + "sass-embedded-linux-musl-arm": "1.89.2", + "sass-embedded-linux-musl-arm64": "1.89.2", + "sass-embedded-linux-musl-riscv64": "1.89.2", + "sass-embedded-linux-musl-x64": "1.89.2", + "sass-embedded-linux-riscv64": "1.89.2", + "sass-embedded-linux-x64": "1.89.2", + "sass-embedded-win32-arm64": "1.89.2", + "sass-embedded-win32-x64": "1.89.2" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz", + "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz", + "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz", + "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz", + "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz", + "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz", + "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz", + "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz", + "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz", + "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz", + "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz", + "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz", + "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz", + "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz", + "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz", + "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz", + "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", @@ -4227,6 +4605,45 @@ "node": ">=16" } }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz", @@ -4532,6 +4949,13 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "6.3.4", "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.4.tgz", @@ -4767,6 +5191,12 @@ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "license": "MIT" }, + "node_modules/weixin-js-sdk": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/weixin-js-sdk/-/weixin-js-sdk-1.6.5.tgz", + "integrity": "sha512-Gph1WAWB2YN/lMOFB/ymb+hbU/wYazzJgu6PMMktCy9cSCeW5wA6Zwt0dpahJbJ+RJEwtTv2x9iIu0U4enuVSQ==", + "license": "MIT" + }, "node_modules/which": { "version": "5.0.0", "resolved": "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", diff --git a/package.json b/package.json index 88e4215..46efefb 100644 --- a/package.json +++ b/package.json @@ -12,23 +12,27 @@ }, "dependencies": { "@element-plus/icons-vue": "^2.3.1", - "axios": "^1.9.0", + "axios": "^1.10.0", "echarts": "^5.6.0", "element-plus": "^2.9.9", "pinia": "^3.0.1", "pinia-plugin-persistedstate": "^4.3.0", + "recordrtc": "^5.6.2", "vue": "^3.5.13", - "vue-router": "^4.5.0" + "vue-router": "^4.5.0", + "weixin-js-sdk": "^1.6.5" }, "devDependencies": { "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", "@types/echarts": "^4.9.22", "@types/node": "^22.14.0", + "@types/recordrtc": "^5.6.14", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", "less": "^4.3.0", "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", "typescript": "~5.8.0", "unplugin-auto-import": "^19.1.2", "unplugin-vue-components": "^28.5.0", diff --git a/public/5.png b/public/5.png new file mode 100644 index 0000000000000000000000000000000000000000..c123c5ea7da121d5f4b2eca12f533ec76703b4bc GIT binary patch literal 77678 zcmeEu_dnJBAGhsfuk7qNnJ3BKn`9+>CnQTzA-oX>l_UeEO^TvJ_%5RVoQ4GoP@MOj`O4GsN0{E9iG8yJ&B8m4h@Y7O+{Wt$K&mvCIeTxRZq#+J~(I1Bxpwu^W{|%B?wD6Ys5!>?p=Sf@m5e`^S;K2YlHI3pRT>(BOOMRVwHIlWj74spYRCW zilcCkn8za%LwzyFIlEdsSvhNGD^QL=Msyq*ulZ95Q}=uC`)=CXF4O1U6X#3lCBO+{LTDEYWDPq0_0+O=Knk8>A(6g!^0jaEeVnvUUOiD`Z%0LG z7YCPzUCpeK=T9VN&oXwh`y2CW6poOEci0PZQQ(Eh#;LLQUVXPsSv-^;fGL>PE zp#m42JX~C~b2KUNu;bTRDPz3?DTIh&_XTnFlau;Zc0I&N5aL(o`*-f#ajEwX+04tX zy9wu@@)}b@uVtmaVET)Onds=~d-v{1olOq9)En1t<`FSWFE>5Dtd zql{e?`oEtU)+?b`wIE(LC$`thu3D5fTJmt>Q3|ig-q{6Nc(4U^^5Z+H1jn~W5C8Wb znw&`?vNF6Wc~~D{qiCc1Rz$szcXoE1xGCj)H4C(1b7gZXtQFn_T4KY8s>4K@;JP2O zl8n9A;mlk$NQSRx9d~g2`t>WYHQShX(7KACec46iI9%t<|9_tfR#Fq0ul*!PbI4Xe ze6VojNvMUrppl$hdq)QrXA8;`uk&iISDlBclkmU&^_R^->lI1pb)vVaow|;vz@9*= zuzS3_Bqt{~US<-6iA?F+KM}9?q7cG-fBaEFn!&@W*^1wQCC*=5hd;G{b)PcwWfJ zs3yEh7#1FWotC7M?9OCxeFbQ*W1+9$*A>`R(<*uoY)4`sh>!`riK;8d$H(6?#7M8Y zEGt)59w+qX>u|O&RP z_Vx1mTwYF`4Aqx1&Tecq#C9#mmR+GSoR# zSuQRv-~v8xm_eq;qN~*YeSxguv|Vw(hps??WM++jOs$xs*U3W?WQAkcJ^t9+5u}QjJhRbR{XaK9toyfh_1NQYZvPvDJtT}6R1LLlziD7 z)3dVlIFpLZ5rHHz-Fd^v!F^OFAhCh{?^4^OVF9c{6B$mDA#%%?@ zT76Vzv#d58vpc{f7T>wp_G>9GhicTj;*!wImeMzvCB=u3eg6E;o9`ugj)o_t`kMQ- z1!#VRIgIC$MQHlmlv)(e>))D|!yCIbG?kQW^u)1NRaH^(8td!pE3+pUme#y`r%2K1 zAx<<*5s$^zoX><HLFs8)UFyQsMTJuio4mTuWK~tdQr)+2>J2lO z-^8~69vy8@*Y7`KJfq%=af&S-D{+F4&Fe3RKEj&NtEquj@+hN?m!3QsqYL|m#yQ`q zMchw0njC#@uO`!mnP#7}!~NC4mZRC11=`mryKMz1@vsy9;~3%1k$4I34ACCqdsp8b z#M7l_96%A+(L(XG7knx}o1q?dhpii(wJ;|Ky#+2>4;l-OS%wufU7|2dz3Y5Yic2|i zVPz%_H9lun`Ceb4 zdPYR|QbtAwJYy>QkiQc$b2UlzX5UAss)=cPT)LMxES&W6G0f@5#Wh?u^sKa=xPR>m zOqTqCUG$}`np7d~*ng!N({nZBV*2i_7b|bY-V*qh>u`Ezrl=Mu=2aFHbXr$k3q(ms zG*whUIpm>?9JZA|3uZ#h69me2L)$>XQbU!rt4^!-cemu`J24hc3dWU-!vCq&L(_KN zy3yE5PfU;di`uUfr3Nd`nWSAZh7*L2QRLM$YcEJg5E>8=kdwn)tYZfU4F{7yzgR~V zT6+T4sIyL%b7sd-kPP8L>6oc$y`HjfI8}am=v%>E`r@P70B8Xw(r+cjO^Ujbt6pvY zv}I^3HQJ?ntH_=JMaF{&TV}^Y+@ZGN^XIfx&#b|ez7=S94+v&)>Qox3hS$8}+{U{);&9 zS)2UB-j13MPkv?(S|%#Hyguw&Pa_+EaV|zC*!GdBB~;KT`Ej)3qx<&>)xJ+pzlB5$9q0?W zZQP54CcG(Ao8PRf+S}WAJ-nggS2&noW%p6XN!A-MZ6!wDA}M2$ByBMxeV-8A9)a`? z@hSY}m?!<*Zv#6~lIbB!M6O{eyGGyX-Kn`RdGdjbgBCfOJu5EI`qBq-u>$tEq7)>v z^h(BNW@aYs1xXOu?<2Vv4n7`?_j#83?&IAJzV4~rR?6&$L41m1mip%U8!3H_lCd<^ z0zf0jvqfG(flIDXLp>ipOq#Uc+TLcQp)t_cUt3$7sC8uQ`?%{t@8c546w6@I(OBW! zvC#S0c;JHlmv2b4(LSE0J$KQG5nt@(WQkrmdqVHU*%52?r=P!PWLWFoe&6Jomk@l>mgFE@^qcNk!z)}JpzXes`PR~bx<;i_3(6ZUJ*%Kx= z-DHXQDDVW+@0X0RlZ6}ej?c}RaZ`$kiFsy1xAAIXa7*y+wiirSV}DdhJ-FX#8Mh>y zx#~>2QW(J(s7L|mam=puSVoc*hjdxV?o5z=^!!4Kl47gn z$~Ureug~m~pEjB{x(fiaJWH!H{da9Ean>kqefD6_NN;ja|C}IMm)}f7tp=Kzm?dAUY<7DzdXZjCiT#eMt%Pdu0JjY#FrY75dzZiyH@CpA3l!389Xyudl3SXlI9m%XSkA7#RuiWXl9Cc+IqrCKi)PJ-Z9%*ns-JfeeLY*EH1tU zHFt28nfB{P?!J%EqZne83P)rHDCY3BsP|5HgtUn3gT|j%jS2vU>9nkz+RR11j*bqI zWe%5bbACH!H(*^=Z>(ObTU%2jdk5!zU|r|1ErkS6-TWHAd^nI{^Ku|Lz>^8u0ly{m zS_!54iRHGGZZezVNZrG4*Skv7LSkgyuLoF~4VZ#tT7@H+T? z)O^%bnC1I(#f7;ub8z**O9E+aSektN=2f#wagO*IZ=7;`Z@y`{QVlN&0xPH$IH3-w zTu!WPj`VUTDr&~TT{HvvCvZ4fz0d-wqKnUh>{!B_IqJd=dx`7*wGlp`3<-7U`r4Yg zfgojMT(a03lneqY*0~FpXSBG_B>%!FF`wa`0$}))4`8O zzUHFwjatXKOW;GY?|L0-_r+s4NE}#iYwvsmXv19H`Wx6{eSN(S=k>@==v}~^S&HFg z)znbB6avpE)n&~Lnd?Ro@LMXg#?#(R)7IRmyFF}mPnI`j!&TH?)}eOF9QCCrM>_ak zFqL8+DIJ@yK&qNPPaxA<(HCD=Tyh>bSy(Wq^ySzEXLQ+BGYC7OrBKz*<8c0a1=D}0lc*$MkI0g@%)>=}RR&^62&c0oFQ=?}3woFVQJxv!{@a-eRA&=Uc< z4UHYJ2GX#0Qu6*itOsQzb_id!;f-iTE}m8|;=r^PVstvm2m;$F=}{F`MxiG+VppI? zAOwdo)H1OWdR^zg1nlna*3S8!`CYF1>2Qv{z9IIxp&>mjElTl`Xhv7+yeGNB?cJyH zdBe(V@oMbAgaKO{mI6eArnc@H&#bg^Zb1;nHcF!AB`2gWGFjJHmCN6`ZGIFk7Da&8 zjtZ9#H0F(+*i}zl0vJ-}3E#HjQsE=!_NS=0nEB2_#C=*((Va8?)F`N<+%%y)1nX6U zl4k>szR&YC9xVlw3MZ*r)L|v^1K8`eGS`}aCS-QlxfHyLW%Bq{ka;{Djo&T6o&uzq zXro~ly~{J9_@zrIBb|M$g(lz9%^o0f~ImeS(llPamRJ1B*JACcOFj#5Cs z10|7*w9LYN5cP=*^sSoAQr>X6 zg@|;zkB{A_P)3%lWMXpTM-VIkl494xI7gEyCg3qzd)SLM6am?dl|Yk~mk;aTF!i3W z5MmrP!qTxVa(@65~)n6}(Gib0Uq-JIk;RG!>y;=2q#Y`971^uFm`)So=lww}{!n`mM@tC3+Pejs} zD2hLB0OCOxgE${fXGcHFEa#zT(-bU8yUP-SYxIskoKMG1pmF+{;{M}%>A zy&RPk6@hB*ctk}jV2X|}KG|)kW z>}Ixot`4Wj>vqWql}y_{^a7mkBcNi@6SXHjC>f*g4ryP2PO6DyLtqR?wH8?}ivmN3 zO1P-ao1(-*+A%u6yXN}YL!5yqOiWbtgKmiqC-y*srYGq0Mwn1){dTGRoKN;v{H~7t zwl_E7^einc+4}Bzh$9$ZGe|_R8-!XQ$a5RlBOV(Ram0Nh{kXJ-PJ)GAFPLaHX7}RJ zqeqU8vj&2MQ_g$JQbbc$}Wf@M!#-^h1hP~ z|F+VX64?nN6N)z4HocRGI1ezT^qH(3C_ci_uG)u(hAQgnKyap`rTt{c)AzAwF^-xe zRZTVsi|?y5t4@oE9RkN#wAu&I@~HcIU@mm5J>^JJwh>$`tW$u z(J%e+BsqtA&&pnEDox>th?Laa$jFjg!~V%RfKXxj&?gD11-l+^S3TjnP`zXyy<~4TqoZdWYJoY!Eg4zYOkpCshITj5 zopJn*-^3uu=P`cgk6PxgMjvRTs<9`2Yg=$aQUHC2bKu*;crnkOa4Vsg>GDOrG2pX} z14|Dy>uV&B?a4kXvXItJWvH=Z27F24(qn4s{AjPIr|07%!9sxeok&coa2r?mdioKL zN&QQF;22ng`+%GBhM^8>T4cW5s)q+p;Lu=UP+?C{<_wd~QDa{^I*W^6@|2{E%$eng zuoR~6ns-toZBNb|u!epI2!WH%uKK5CWt}mvPJjvTzxQH4$c_!{C(UF`d;>RXE$VJ5 z!`%>fTzEEE1ls7YD|;h_8XEWS8*nEV6x{seH#$1XmY^aV9QYR;0=N>Ck(~=p<|<4= zVdDJpUMsf@Sz51t7&!uGSXi(~ANaNF0gd0Hb}CwtH5vC;vj4}R8b%h~P^p%OZ3DX4 z0~bCBWzKZ9ck(O&w?sNEcOPV(j_wai`JMh%Gxa>i( zx0*{|th}o7tXFk%9;n+Yv0&in% z({1UEes$6BT!E-~`X9FJ3E|yK6-homKA4!82?+_HF|B3D7NWbXzEP~P%x2-4aX@5u z%i*}l9_jF=m^FF5u(u}|cy;5(4NwN)EyIt&q3CHPy|8JcXH&Q{eP6cHRHB49_>HS* z)5{}=lCcO{L&>Zdd6qckFw9ZL69Tmy+_^ng+aC4^>T>jjVj!XqKq)R9Jq9dLvz6 zQ19VG=pSSEpD=pwpugummhc*_5Y-wrlBkKcl+%>tVZeU}s-tX9TwL6?&-P1zpm(xP z)J#lf-~=$@g-BkV4Ay@7Bp@gV5HS}gIC@7{it4XDPyzv309+(YL8hz-SpnLEvkRaL zuughq#&N0zy;dI^8UV$P{`m1@d>s1e8`<2Apl^?@3`vT=AQN6^^Vpw3rN2h@BJdrq z*PV8hZ%a!~POD`l0Rh3^!$V+TfFzDDd{g?We>wMHaOzRBTfN!~uT&oK=WT%H%g5KU z{b4IGWT$kPR?*voV2Fsucw6l)Ni556%FWFUhT@wVOk5%YV&Xinsj;!gmHN_jLw41# zIKQAZJ*-~6u6QSX0KB(%5`7;D2?+rh!VC5d*q8~F#nt`t=F|7Xw&I?9`G8^u(7I?3 zY~{s=Z4)i1BRd1Vg#_)FjlS-O8W9`q8_fs~spk*dnx|*eJmjW)Av%N0=uLtb@>YEn zihRp%wBz|OxTMhfJT?tw}J?HLt;)Sy;4^Uq(rxa;Cw=j`+YrM|5z z1tvp0PeR3g=A&q`3b2*RezpeTdS+57?DnVL+4VRtt)2B+FGvCI+i2?e;K2hE6BDRB zi?&UspjRyI3g?){jooA4)Y{i0MNt#vR}r?!gP;23$@=fHlC|njhNayxj4f`PhA3+A zJcLHX3?%UhZ!lRk^N1smx-yE_o~e~9yh;6E7NFN^FG30Qb~ zdgG&`e`BtWV}K>Mqw+k&)!)%F$A2kRvUk3hg`Yt^WT`xWg^l+{?>H&HmyA#uT=G1| z3uM=wf&P9t_UFqSQlwa|8wYN#u1q|ycIYLT<-hvPl+85-mR=D$UR(RBSu&QYX6@tz zpyAY8az`2X*w##g7DY*MF?fh;TaCBB+L-742$;advW}Ng!tru&*n(Y9DbR*9&Yx<3 zb$J1{&LZPbyo>K0vYxRezd-G%~nS0++pX^nt3GJRB5_PQW@m^{FXkw^&go30ILpX2Grg+Z%D8#JUk}WU4PnxUvL-@N6d*<)B`^x@fRH< zAzzPxLz^sG9`-XZDer-F?dtlewzl^Ddpm1uYcNEbnl2W?7`vuW_5^=W@&fJ~UYZ{W z1-M!G=%W>>C@D`*PZxLVrZ#<#7s3kPy<6P%0I{*8Zql9-E5P-S`ITH@_cLz+dqzCl zil-}gmaZv;+CI$XTW>Ot!=?FqEE#EpKf&$WAYzKAs)57hL|SHCPlgu)$|7JQ{?va$9Z2FhRV>KR z+nkhh!w90Iv==r$ENS!NF-;*txoxyJ|Z9U7{hri`DHc z=Dua`=*WR#oWG5Dc!QrDAT{#j(F%b$r#*c*NuocpXrgtCzcRXlkXDuOFI zjdv}D6`ccF;HiwNd^H-v|1txL5!0){Sr8g;5QR-`Iy`w2V9pnRm&8`?mCWCbzST$5 z;uV_aqfmzn3k&bk!nKTILeO_xpjUtTL@(_0Wx**{UPI)^rnc5JMy#Lo6y#l?+riay zsC@~655AW3k8|7Z!u0jV4sLEgmUc;ey7ovG)K!va2z34Mx@K*v43vv*QQ#%1g2zcq zOA9WxcJbSc3?K|XD@l4F9)pYa^XJc3(`;}2!F#i=ii^9p!x>96CtuSXg*%*F*ARUBjko5`Y9;gk9<8Pa8pdhNN{d+Z@{7O&ZGn4c_c7pCT z{2|m1a zV?<#29+a5D&I$+!yisHCcjuF$We6U)e&XP>A7;(e(E>bznjj(<%!FU7t8vFgB_&mc zrLcH)Bk~T2(|&4YWe1LH9yyJ=v%}5_Ur1wxfDl4sfvyCyF6QI81*bo=O;ff4>PjJMU95xm_Wqt;$wS)hOL+-z7ETW8Su`14 ztQwpk=2SJ7J4GYwqGDp;k;V5egQl*bF*rSKtfUmyYxTakc-O0Gh|_F%vA$mS7p0Kj zP*k9_CQBSOBO{0uYvM}20}izuWY=_potKy!qfB!>#G7HeMMa@ot?qhIhu$g_om0F+ zq8p{d39JiB3-A-xLGp0<`}YSH+QR@d%7AsK{wKnv`P~{v1%-r!#Kqq#vw`dOpZ-f5%^s%=Y*5CPiY%$) zM+Gz=>zK23C&t$-bhT2xdtEj=A1U=S|`--_%zUL86@^QgbNJR7sS zI~$cYyIGG-7c$_STpMjG5OJ9~ISKi=MYjf#*W?PM*DVq&V{uG#@^CM5As7~?3_lCZ zS)G*OTPi>9i&WO1KaYFP%}9kWT|(A)uFvhZ{{5z!udSow_V3@aKMORG5Q7q+y;l4i zCv}g|FP4*X?G9vs)C>2Al^8+20^TLrl`46@18}x|zQMT3>n>UNTVZEQIF)bIpVUri zjkDZ$>1*do2;^VYG?OWog=gy$lY7-O8vhl-r%Y2BPy9p zc*naX5C66I)>aufusKh_3*te)ubTeYz`=PRya*c`o0OE411}%&gLqnFpgUn)iyw^6^cePm^4e=aeBi_m%Rn zz$Iq*P+Z))-J2ac@G(S}Nwt7X*az|xcGcEZlNvt1AAs59b8#>Z)>gs2l+T|(LzF~~ zePeCS7;O8Inhm z*gzVM00)!3+Vb^%z#Gq=Wu&Ej1=as(Yi!*$d)S`$+APnde}EELw|y(`OG_UjDYEZc z=(449MEhwG$%&l;g#BOxQ4(u{c)}Lr%{?zBdo=pDJIT!1F_cB%+L<(ai=_0uaCetF zo(~!u8xxkGm@l$%=VN7vf$H6;Sk&Nm<+~g*+~Bj&h8@(Jty|J^+{yPkD(bD6`|HP( z5EbcW^rIif^xz=DlP|>5r4k%J*s8qgz{D>C8ZxoeIVxTj5so4Y{va27$Nb}=m-o%1(aZ`1LFmLRCY<(kMpb1jU7@kLI|+xQ%jqwCiuvE{UUB+Zye zoJ2D~OV~JI!BP|?nG$9mFykA?cOe*F{lee2gX`LOo8XS9=;y{p`%3+vQ&Vt-M(yqn z|7NmOHL4!-u9C|e_9vDCI(qQ?VgFcu)+vrR7nAEO#NW*0Pyj@$<^RxtXP zK_>H8lSWaGuDcS2$rX;=S6BZwIQX(@7N3fj9^3%P1o<6@`5i;N$Zx9V*@^e%MCBte zeJ$fA!c}UyCm-ldHH&#%%1dJA1-I;k@WF->u?qBMNH!9V5XvA}pHA5ej{o?X)cnbg^mCRo_<0F2#pRW z^RsLn&bV~e**U_m=R0R8T}29oKLt)S@>&!Mpr3($^a?*fS|eGEW~DORZCDj^aoSZh zdh9WZT0hyu)RYJdL%aAdC>8o5u~V-)ErFAK3Ba6x36fKanXjjv9bRMr7OuR!dB_-R z{-PLyB`s@kb-;QbWZ}cDnW^z{At|XCG(e!x01ZeRSg6 z`ZHO^xcm=X`<@>wW_5{TJfi~_I!^h^*X*yM>rdAf{S%OJ%AnZ!`AKy z8czWgIFS0+!)y?PC0s7pGoE_mXDK z10M?`C@4sLP)I;PnErKZE0~HpW@dAs;c_Mc{#|tyjbW79I`Dd4KMftI-+CXSt&5Af zV|IigvTFiDscQ36tToc^Ctg&iGN+I=F6xwt+nKI^&Y5Hf`}=C6wLk1n5))$24D-HY z9pczb?L$`&tqh6oJ@M(PiN#jFA~ku-R~FPrkvtpn4T4s_e()|{$+Hl&o5wPJZ?f`Z z|N2Y*<6kc#TGb||W^?Dk!NEsQv7;{`#t6DwD=y=ot*siv(v^JAMI47*Ji~$j!~h=; zj|ly1sBmiRRgI1GG2H-Okr7#E)2l#qm=L@v_eikhiJ=?)KGBfP1vfH`!3*K_IlFTnJwQ$=S>W0OKwRCR1$vN-rtQZJveUe+t2 zEfCn-dt6@lUUhWH^QHikEiNtPp}>QPGMxP|q8k|Ds*r9`V-K|mY@LTfOE8cr@e(}A zi3#d%XVBjvG6aarHecbCV3z#jSVj7TL$9Mpri}q*lL|sa#kAp^KqX(+a&=E3WGy(B z9NI`b3NEhy=@XEK!P=oFfb1Y`G+Afb7(SVa8hpLPYowsG)?;hi>x(w#HstqO=CTH? zL2~^5{kzZ6OyT&3g4VJp!$(Txh1O3wt3vcdV7AzbCaKCiL@~r9@XkQ^@FUQv?R$Jp z!S$fMo~;|_YKQm=B_Qy(o$*q$RQJrg*?ra%w^v?<1QAE+zqE%*1e^x!>r1MTylj;yA(c5vz{3h6l>%09|( zGJ0hv_t?lLIAk7z;STHzs4Qf9zL` zlkD2)G~9tF)uC_^ONCbM5mswSGq0w zvuBAmb3H>@vNaTc;pOV$^0Bk@D*Co>qz)bA^+9SW(1w5?x0i6Cyeq>y zlIMJVVIRtlc}uYWhOdae_?;-5Gtu-?C=u^=iqAdXKD@hr%Fq1Udr?pnJkK_3FML~I zU|>D~SM!^aHfHJTAupNj3hiR78R8OhJepUk(l#eQYMbv03%@d)z$6wQnw*>*9wx;L zG3V;d9|wc(J*=u}E911+hW$Rq*u-At9Bj3ln;Xb7fDGZubRW66xY*kRa)Vd+8!~SC$mR@s( zeOMq1gCFK7tEx$ep=csOz5OQwW{80p2H(v>+T*+0TY)yaQCfSso^`q2NoD2@n*+Q?jh*}}q;I*?2M+)Km9D`YtAcX9cF*ke zJAA54?>!ah!n+>Q&2s*bWgJcl-ori-&96^zb^cIc+iUfGPr zNgT%x_wf!crIm5+gf7)VhA2GzT1wvmP$Rh}vXbD(li-z#iJgsPUAn@{%L|A%C@Xml z4Rl_y$|yOqgFlm1d`*AJ82rJuxdIu%R#-+%2aXktpA2&nccCpN-ZfIHnH6kMk$GRV zJSUrjx_kHTojXCTit;-?PEJnN);Oox9r|B7NbXX}HzPnqQV^gGu}fBC#}AQhYHETw zl$oI+EhD3&qhmJ_jA8JaHN(R}BnoiOe~HWe{e4J>UY)gEz5LamN@ePiQ(Noq>&tMR z3_+f~Et@yIBi<7DUN$Y|YhUy7SuQS(oTKmQNY>BILoi0n?PijVlZ{4-t`wPULki%~ z!PU2x%$lpRAr^kCECQSqgpb`_XQ=jlDm6J8&SA%Dq?U=8n7O z=jTDX%hz6?yO^2F07C+r3AB9n1fUasAhUMxLjGNkn-V;H;n#GGjKpE>scOIA_6Yl& z{{8+veq?>R`e{n{Qt^MnH}%hudXp7AdwEA3vuG#v7osNO3=nV!PLc)kGlYVGi^5B2 zi|7L%=jeIdE3_sDs5?u-G2NKA13~y#F9eEA_o4%``M(TFptY7GR1BZHeN=b?@nS zBR!>9BqGX|$9pH@%e0_tsux0t0C}4CCz2E!@*nI8olDMY{%rkXY@VbvB%O}&!M#@e z^xYC?f2uSj4n~)k!GIBm(VC-{E1ysc0D57|{A@p=i-OT1nEuSxR(fu?_(5T#>Gqc| z(gL(i;A8NoHhS#l_F4sA7xVfH5=(FaTu@;fHg6_mcmQ6}Wk8jJei-A~MEB)^*;O?t z(ACw~CAsY-w3H2{OxhYkp|<*~7QjTt-06>6{bUK}MJ&?hE69X(b#*yCfH5HV&7U_T z7NN$F=LcAf?wy>&TLUUM*>^LT zqiQ`<)Ni8E(x7njyX>kanJ`};`kuc7?Dp;*P8DOH4RfgzvmPU(^w8-MSf_KBhqZ7D zD54kUxB_#igFNB0(|Fh9Uyd|@AIAT-IIfg6gEBvwktadM5Bn3p3t*d03V;@gKH=qL^Kj*za@a`Qu zmLhF*=qt8TC62urrI25jv4r8BmQa5rBqV5~e^q5&aCbX{Jt&#w=RO^xcrsgojB|JpggYKLof7u?11R@z$;f*amQJ0bqcsW>pL#7;UU{(f4&%%E-sC zA%Nb%E`zA9LoK-J#=JuCEFhWgpTzfCaVDi@WPl{l^TmHr^;0Ry4XQ|mu=Yw&*-)sR ze$G8+x+w1i5iFm0Ht>H z^#!*sYj7N7fS7Jj!Je;tO>!0Wfu<4Tz06vmT?`9NO%SLFgCvb6p%!4pL&yV;sbBY! zbKyw%H+70~3pb&~%xM*!qNA`1J(A#YGd~{y6QHC+&!;B}YhQqNT2@xZk>&mI-Mi2w zVKpgXzsqx&MYOS51wR!O`f|{4L0o7uotvIMFV^sZG$91(!`cHBk&&G&5sNTL)zJ|Q zps4QevJ~0q`Aij(>VP@wv06PF29MLg&?QJf(&WrOD=R_2_3lIuKM$v2 zI{u)~t!re|hw3+SY=U?@@Wo$8XHX+S={(w;f|N+%uq_TQE=XQRMsx^&piX2Dm3!lU znT;mOn88FAXvL+ar4Sx1hO>GXGBs<}3lwhxIu{NdEES9h z!aP%^L^=qgm8l(BMIagnhJo7_cxKQ zi4DG=ww(Eb>U`@AtTJiT2+o;?3P~tfNkUJ!Z1Bq_3E7iWmv%h_(-oFzb#7tHR2Y^r z#Mm5d%|P_2vhv>?CL|aNQcO=fI3#oaeVV86<70gP=0O;mLCRPBpWks4GNsD&%m^%m zc_8z5^f6O`8}6>I;s8>>Ri111Y3N>pfF)n!PFuQTvnOKSvH0 z2Zk;473^LZx6o+i{L+9NS>7<90Q6sc^hA$-`~;+J_w=cAOl2+WKEI?S5$TtOg#}II z=;Y){2f4=R*qDVm)3nN8-yLx&ett5dFfgtlMo&H3Gi=@?ck)Tj?rh81oG|f79g??M zAB=6$ZabbtDG93z{lJ&Lm8{baVb5NxHY?r`+2Of4z9dzcVgqCXjUyVs1Pn5ijAcss z`8qrAt_|ne#<$xrJ9JhM*;dPxK|*ap$@bKmp9Y2*9(aIVJoe*WXmG<1 z4M~E9=DbH%_aWLXLjrEfYep$kGcye`3FNE{e@S_{1_@TRVKfqRfmpZ*BHpFV`963Y za-M!i-1BpB!YO}Dvkyom1QPiw9^`7pQ|HlXILIxD{N{M$k7xQ9co`fuNX{@Y9D0Z& zA5Yi|mg+{b-vj~*18PnC-^3vO@6`lD8{k^zwi5X=YOO%t2Jxk}!g^LB`F~je7#PZ4 z1T97WU-<Qic1`lUAmykt;bbf%wiYqwTvwFCE{^R7=J;gdX^XWb$?!(scj9*Yw_O1OI9; z0D@(dx%*6;ysDd<85+rRu}ig!rJH;~REGWj7kG)4m1b19)+WHl`Tn>`G4B>*0T%14 z+rfsVl+kDmG2N^CU>ic19oj8qk9*mkB(;m!qceYqK=}n%hO|+3JA+4tb9?1E2sq*7 z9OnM9e^|M$+s(f*pWi13Vs+kj&m z193M3I(cHg$&$)?=9Zv8*FH-|DYDk>RqDflU}Ua7l7iQ`4(<9HjAH<#u~OVwm;X7> z+wWLVS2a=8O?OtN!ztl3{{@mUL;uo1sfZTh8>!S3N7X>TPFA!0w(3`#!MBrJ#VezE zQ`i!h{&5kXtV^M32aP;G@gCIcsAZu5wj2Pb}6;ePGsSS>}c~47e6hlmED# zjW-|OjaCfulG+=}7t8poz;Xx&4@8&dvn{Ada!vssNCH#1^vcvUG*ww12KVMg8b7|HA(^;h=#z#ey1hE5d2s)U zfdE2mPH;kx^K@yZIA?G!vTd|2vV%PM+aHhs zo@ltj`$L%by;WG*()w>>T#MU-KL6*By*R^M^;13YpT_J$0x9D@vz^Maq4AY7Xloi1 zBgEqz$Q3}EA|fJ!VQeT_S%XIaOzkZ!7KU=oINxdmA9vByKc@{J-%s*eR|wc=iNFU2~NDv*AaotWcqKFQ$7I&3WgpassJ9tzk=^{5$^xEJ{O(&ba;C12Tt4r(*UEUr3qmz8?^45 zamwe5R4r>;TV*i4jT00gZ4Rjr=p{_oE%zz0ataGqfiX!FyLh5rCj26;FRk_Wqe}3+pi^N>MRyw|+G< zp>G8&{}}PTR|D2(-`ty@{~iUP)ryK5u$G%6?RJLDMk7}dd6@&MW%dheuAQ9fmlY0U zN%7!Do2v3vs4cpA=b=ewmO{;OJLkj6z%(GO0}8fo$ukEBH_;4|Hntnt@;EM?s}2ES z=j!OaSUSPV8l9B$aSP|YQD2RDQ(z28*I|7t;RAl9FsL%VzLE?vFyjhxHo##K5xCCa z3wdTLoohiXg_{!k>StwT{ilo!?guhK!F^l>6=^VDCbY!e(lCT|;`A4>e#W0Vn!*_WWgl>@0Wo@J zLP!M4%KbF9Z#*1wr3kJc3u4bK6ZMvJG-~gT2E{QcreSBy+j=%e%aMNNtn`OaDI6ux zPJ6Ai3rBn|Hq5$T^?|7I_wQer2m*Z!qN8xc;Ar#m@i|7{`&?E;vF{#~^Gyh|qXsg% zkWw))H3cX=Tk|X(#9;}lO=lR!Km>91bD2b9$z#Vv(cQ#oOQ$W0SI8Td%>f6}V%kxT z@{=(qP6|L{z^Y1&K03uZ&0ulEY_VmfH)JOi$XE4RPRC#r=U;FXgm{qaRoTd(zpxp9%zD>aT! zo!Um$;V)KDl;ee8LMP{>ZwAI1D7WawyOV7qQiP9ch)_)Hbxrebv5D2XcXG!Rac@ z97R&`N$&UG@ol*ZlR976KL5522Kyo;xIjIJ2#91BU!3x%>gv+o%d=;{hmEcoS@c~z zb4qx*1VKL>9oc$~ykQgp<}apoG>-49Txs51o}MPe`2|qIVGQTw|L-y`M{-oh;3gfIL(AmELSj#9Lvz&mofAaT#; zyRnxXo7_RmbA;Yk?01xXL*9}6347C1|D`ClC;tr`fJsQA4^AZ8HH3BlJG8C;L(_GK zW7)rbn`GQ1D+vi9D@pbyNl1295+xyzBzuJHBo*0(B$0~jO%fs_gd`*)gfiaG-S2q& z=Q)n&DDL~ZzT-SU>%8LUS7lK+KRXMmGGoL}yD}y_p_R>&vK8tbi=uuIaaL#;fm)qX z-Yos6GQlwd%jhY7X5B}>a1bFa$JyE0%ZrtgkoS3_)j;^r=!(c7rwKmnaUOH^#;pt= zWl71*j~CICaxqZT(C75u*4yS2xN?>KH$ zM{}{ueHZGA0ybyif1`PtG&*{+RQ4wsQLFrvQ7;BEe<*Kphyw3MbNA#4?XVBufl!|V zT=zYEHXTVJ-Kz8K_a*(H5cpUOxHDvLgEyR{PChasxLO>F^%Dn){7}|iO*lzRObm)@ zv)ZBGTk-5oFM}^db9Mu7j%xY>;WcVUH@CE@)gOaPZ$*ki8|-2yKr@VPbd37WUrpbC zS@2HCO97(!VnO;gD|)?hpt-MyMu3&P7;Ifu%d$84Oi+6Rod9h}!x`7IfNX;gR~YMk z&|{T(f=mf!5^ev!;)BNE!-eajzCV#2ff6I%SnkM?-3;NTt%IY?5*L^+zZy8-eTic4 z>7xD{i(i^NDK#B0)r&-kpDV+P zk&>cjRQd2>BojfJQD=+rB8ARGg9N=J(6zNWFb7m~9H$BmQCpL{HYF0zSU)Uf$O2u^ zhYv>5oQGa>rd*N-Wy{ra?4iErmi_nn%icv1g3sRplKH1q-7ebxQ`FR?87+ps&r<4s z>VpSxS`IwN$$z!nDj=Yy$sR>4ivRn1_*lEiUkM2ZuX*fgom#@{gZ;~zpBXI{XiVUY zZbm%UNX=D@kD;dd@PXMWaKPfq^ZNOhf*g_S_!V?-NkgW@^v3w}70cd1AL8#{Z6E|p zL5Cl-vEfk_WB(zB-Vy2tiXUc{hljatH;Mdtdu7XD?Tb*|L6%#9Fap+-19pTraL47o zdGqPwOE3edLZKc&d5JU`*yG%Xf$B5tQ;N>iY<>2HwrF9?Rg~oPu?)+)@W81<1R6bk zeXQ+5lcCR_pY_ZDoZ|R?GeGi8ftl!IqkJ5{;6#MHug*OKHa1ZPcu9>j`*eoN}UmbNxBU+n5#8&aCj*0P_8?m>dYKQ{?s zZ?@u%-<3G;VST&vR4p^`{v_-QQ`ciBB;vTJb0mL07|`qdK0?ZQ1APRboqu#Xcyd|_ zGTbJ)fi2v$Gu z+CI|ib*l?6p`)`?FtH5^HHzCQBBlp!WeME^&!EuRa9>lS=5u;f0qs8OT`oH=85Q++ zzI&H(o@{HUzKf>OFY6O8zW9QFMZ8hD)jyP6FU^X{|1({L%z34Bl-)$57m5Kz?l>MA zjaatJHK-J9?Z@}yq)yWl075kAB5?oohofqt#-^(|qnG-Z<}*Ax_AQD&_gP2*MT7JX z4ZiMApDa+)>gS?dBI=7HHI~7y7HOXejo?HkkHm?(fNJ^kJ@Pa$T8VlB;7x051BGtU z^vwr1gb5mC8Z0Qp^?*s6y#5)5b4)WlS!rm06dK9ql|=r&B0UE_8xde-;sm9#j}tV( zfqH!HB{QBdqo-5JGaJ!hr+$PqW;Hf8R!me>BinF+6qF2{<2_{5e$i7`GNWzkPSgqI=NKcxlKpR#+OVWT18O+}MSKIt%^*tfd1#p7oxXv(ct&yQ~NqG7yrwPseEtRog!cxZ6X-Nn{;+ zZgezZeZRDpL(ihq2xZzs9va;ESndO%zt$^pD_9ibx56v;^5x2hM<=*i4kqcwXuXK! zKIfF7x_aK(x$Wnw`s$=fT!?(|SE&e5!Bc6&fIDt()NdfF2|F1uG|D6UVw#7P#yY4J z+s(yU`qjf8D3grbS@?tiyyaz_e^5z489>x#;)z3{l=Gt7DO6Aj$}2g!TL);^1kyWi zC~(&YSWEJbb5pMkIdKcIMg{ZS*$D|Yg(^D-N4eX0Jv5|v&heoT(5*x2N8}ygu(UP5 zy|cnRP_hf)Wr9xQ)Dp_sp{~CnJKIV`*QkhElTc{UK>UkA*m1a4LQg6ETDcXFex4Km zVl*smY?S5Yk#=z<`>T<2p63$vQHdm7$i*o_R3QKz9GqENm-ya0>2b!?6a~XgJ4D== z6d>iM>(fW@z)6tF<1Po{ofYHz0`LTkNe)txw;8soc7C=|fUVl8jV>9*S5N z+9sIO+e?HfqOu~|uFv`@U899MF@?I6Q8rec{YF8H>ZN05p-$I!hBr*FYYrrIIA+!b zwfflE@v=toE=A-QW+)bQz8;nX(yDFzq|4+OpcJY&D={`23JB$K%MH4G27hKzc+;?U z-~lKssr$&y$ax3DjMNbt-lGrSIKY9o?n~Feqt2KaUU79x!vKeg?GHojS=~opi0;gz z8v#H3u6YhmCcV-+EnUUd5iOm~apXkFA@h>qNirD$22ye=)>cRI9p((YK|f0PQ@%Q| zy|)XBkEe1s(^1=zDG(U4Xa4S?Hj|e=9RHo{UslTQ_6<;&s<;pvvtrjG6TALdS@uz z`zKf?Ix0;*CQe;!Yf)CLR3uY*FWTdGBZefQRXP4UIk_?R1AeKKG*0WWTh`OF;9yG# z$YN077AMd^$)uFtiPSgh_Z=NrHz=7=!EUu?`0oFe0l~w~m8%0x8MVDgJmZSBb4oDPKDuCq{Zy3D(%3tEcq!vu>m$CWg3e zn{$z!jN#JW!heG`J zB;UP|HCsqAe0)&!!oxc)A7t9~-o$rRt0f5=)8-!V&SA@z(5A8CvgPQ?36{6^DD=rr7>}HBOb(HU|LH+|*7-1qB5wDk|WiTP#@% zry$KtrY|TJ`R}ZF|DWKS%4^!FcW}6>@Q@Tda*{@ZX8YT>NE&>_W5g@ez>|ed0e5k+ zS+vZqSCla&&1CMRSAz^&;}fRNpJk48xOnmHxEn0Hd|$e@4`iF@-WhOtg+xCBbu!uL zyhnh(nTsSl9oEFG#5A=ju6SI4dJHP!rVp&;9(F4zowW$1#PmM2B7ETgA%}>2J2iYigSg z74`3-p#b#`o~qskfLF=+cDQSj+hbZLJax01BvJO$P#`t}7Wg`ZlGUj;8BFDB=(V^m@e0Qh^%=E9exU=Vc ztWa}7<8|=13J)4C*rB=Ovgb~GGxU6tXtT#ax$M>1`JYE*WKc)Ev^d0{zDCy@ttF#t zK91D#^{L(N)3EG1?{rPa4@j>+v%56f~fYMT2r%CaJTQWt;$F`)+smoQ~sfTZ=melVnWv+o)!7P_n;^h5?lAy zK35;{q?CRo%lOn}7D|rMpVS&h6civa2f$`s6i%INER3Vd@cjAn;Oio)RTd5F5tN8# zB%HM`2$#g9hhMb@$Adq7tWm1G>`0;#NOaq&&7jG^FjbLx=T#y-{4&F+iV+J@ZiSrU z1RXcoR1H2}7FsaK#E_zrl9J+LNd(h0TtJfsdAyhWc+TKY@au?;GE~ZDu5ZSX2YCkg zaM#!J+;QrJ!H*w_R&rYjbd;pjXWPnYlK;c<83hUrXHNg@A#w51=XUCvnqfxyjn(|) zoOAaKguZ%|qjraojU#PDD#R`6gUHwY-XwX7WVzEK3sr>uM)@p09c#SRER&fzE-!}W zAQ%L}f?!N`y0t+HvLF!^-#TijiEBS`&{4fiK>|xkht}^0I{es$sQ#`Ln~iPVc}Q-Q zPFfTh`>Mln4;NQu*SQI!L-nj(*@UPjfy5n5MAE}M*J{Ogua{Ka`}s^XhQLB}AHg6? zI%mh?!Vg*59TT+pa#eW3}1`VoIrv$RGw8C$L>j{XU^Gd}w%toRl-Dv^W{NaRZpLiP;{ zZEx;?B%uJn3k+?G-dI#!+?uX5BV;l{F>5>qH-Cxe2t#&q@uk{65AzyR1#XmP|MuWS zQN%Y;*uzX4yVDOdN9sKKkd?(3eIVq*8x20FPilR{M%64-ot=e~ZtL*-D(xc&_SOLL zu-kFS^uKkaY%k|3Lsm3hOL*wMNUA~L1Wv!d9==7AYeoO-?V?= z`7ob-ne@t511=nbl5gBlr6%Z%_0|4R5h5m1iF{4Sb1w)dk?AW! z1d^ZqE$}W;%>qZfi_FyIB%)yRjUOZ?EZnI)^lfk^a!_o4U3&)$KjHpb( ztLx%Z=WR@#*RnbMyrpKQbR0?ocJVA;(4H;+2>+E<_F%Q&4OP`3SXU^>7T#s3CJ(f9 z9fEKbfg`gc*qy*S8N%J~?Rx)Eafq#AA2H4k6)n$`hDNpcAFWNH)d!hMO7iz~$prBP zH}0xAReM!|Tl)ogZJ7R0RqbYFtrs9U1@j=;dAfyT)?84+1s)4xB3ny^#3R!nIyM%*P%!?VWf?K1HpSz9np zJVfiC)jxZ~#|IIxv^#h5GLg%vsx(gi_R^M$+K8&NeQH+x1ANg(yrk>Gjx!6sF0+Ff=UJ@JmT4NGDm)XdK#IOIF>7z`foie?{@M9tBC9r zLsevZ0OZ^dyDVdAXlSUas*29f+?+#+`O6W%gn;F5KhJP((Nrn5Kl^=Jd{uLpJW2PA zv2keb&SR9jpW}8xP0(t-P~AV{Nw9^V0-Y&q6t208c25kZ)%o+GUi z`);c7f*kmG@x_ePpdQVqMPPFgetGf>U-_AL)ZS^-!x?~<))_H(!FrTh8##ASU3*I* z7t1GLEmHT9S{eMHP5h^XQx6_*!&{)C0BL_Gqb9&moH>s0o-xy4U}&fSiJ7yrlOF4U zw{IVS<1GSur)SUn7n|6qsi-nu*EL~#$p&>P)D`e9&CSjtZ-xCjshbo02F#a{ zQ9HG?xW0i$etEQ7F+m6MJxJAjX#r+p2Ny{*byB89Vf9qnjZih-xEA#+-1mq`Irfg~ zkl6og0kXTx&b1(h#@NIJvXU2Pvx{P4sS69xWxS20S$;Rh7)o!`cqnLZ3Lb?QIUl9_ z)9IDPg$k=@#Jyces!muYOVXvJ+u1>X@tO)LS)c%C%s>!*KP!O_kY)db!W=NyQz?(&9gR2ciA1oKg}=CENk?EJZkq`2Gk z@&5N|uTz}nB&BOyG8!>q{%k;%pbzR6akh{X>Jro2;-aH%?~-U;Bhr_EwuOa-kwsWG z<{(N-zhnO4pbNwUEAURDyd1ODark*+Wt`2-b0Xr;lvl+|i#bG`|5xkAb3QwCO01qb zQ?+rQo2#=lXOIe!#aCkNz3cem7=ea`jV%Ba%O+%eA9{OBT}R#o2M4S0xIr3obx#=< zIok$!ZSuf)9e$N@Ikzzt;3G4SQ*gPNiE7Qp)y7{E-8frSF0!{*V=~wK8f(fb-(4Mk zfO`X{%o?eiKR>GavidjwRg+3I07|6w#PjTU_rc{nC9e2InpVo=XnABoL- z_da^>;+4Xe!mK)MYAohmneZdSFDMs?E(9IW4I*e+>V9BU&;#UtjoU`}a1=#%zd@PA z#eg_F-)pzF${1Jl^o0)TFeh0oxY&+SW1< zbZ$-X8>(?fHL1lw%?E#ANX~!QDCAK9NPqMC(U;1X^y7ReIiSjK4yX?qAn)!UJWxq< z=umlz!S^6SBHG(O!8Fuf6-b6fa#q*DHQ(x?IqrX&8Ml?%W2se#B2t-XD1hz21xaMq z9cb>sNM_~JY5b?YT#U1tHcaCE5n@jL@h1UHw`)7es!#(Wy3_5FiuL`Jl!n}< z8@x&CM`ENY#5H3cLZ0yx!~~~zYFkZ<91aiEh#yGB1rKmc zP*5Atnyg!3BX=*E(rkMAqZ8^}0C;UBu+of$HJ8HS;#N|1b$wQ68#sb|uc(#@6tGBt zfm(Kg1Dpi_D;`2dvgQc=yzrQU2Ji;d3fKnpM~BhYE%Z&rR=<()sWwZ$y7o7kf|8(( za|YWKVzoJLBXO%n%L!g>lO)ADsT;WHR5)X(at=Y?49%TV`k>3rRVq->3xz)E7P`CIjy)ozb8%I=KlPVhZopI z-cBt+DUFpR%8J97{OV;due%+NqgOi>@$DZyqP)fQg&E}q;$l9_#kJrq-~t|ZLqX2B zp_y&yai;8Pl!cwF3uN#Js?y57)c17e`}emv@@c~cN#2_WidQixQm(xl_&)X-deEpQ z`=b7#zCO%~fXEGg$#@EU*+~zayb$vM^H$(yOzC)*m#0#<^Wsj)&&7-f_iKf;Bf+KW zGhzi(eb=u1E`8U@*Z-H=!t~1T3w&-XF}>om zXuaHy8W|Y3kR8@K4W;0P8Bop!LMY=gv|>HOHbkv4_&v{#`T-X&erDu`pkR1p#8kw` zPM4)Z^#wUW$Ow)6cCv2s_EQ%{@~VR&bwVN{J$R!jhqxFJiCQs|ro*qn$MoGCqXUfc zxBm3kKsh@s4>x~|R`=65t!$0c;vypI^fYrzyDy#oVqq8^XpT(L!lELiWCi| z&CusnJ@MP-tQcFu&kr-D0O>r+;i<7_<{}25CAJ|C0Q~`yY1niYAZ~e_c7csc$2g(? z+%}wAu%CXsSe(4jXT0O=jijGv_Tpf;h0A}=3mLGy1!^|wUQ3!PzgV_PHr2)|B7YH- zHQY&ysT11}po7e_&Z&^#cE=Ye03B3HC)$=vU%WUB!G;hE>+apC-4?uO_P%(O|5bxR zfuWA=hO49FzwKjB=8eLSa1PSx>c_ruP6#;`yisp-Na+;nJ$FS7Qi23}>)`5H3Tek@z6p zM;~5Z>PP01{>hU;4@DAmx;RwEsou*pGh%)YRxG6c0AVFODSJg(tRn6<+DepKT!wWY zFfC9iq4908K+W5NfM)polRBr=snrocnO2D7=RN;3GDOZfLKWwyv`^mUhi%dU;Q&&zpu{g&Jz;frn9`iIk+n|`0R?!z#;1A zlAlbLeszI~TzNumx$&?42~sI_Q&J{=&KN}I5S9jAUpJ@$GK3nCWDRl^x2vQzL2vc} z+eXL=Qe^V-A}ErUlkz)NaySsJK%j~L5$}Gta|*5r>I3)M9H79>2(Kkw3`cB)VHS0v zynlGa)^sV4UdU@2XNpjY>4J!->;{WzG<^0Il8$UiIeY83-@5uD zOk|)Gm1UK6Tp?vD!zqH8Gn5WETit$rJua3URmm-X2<_^RAR3)gYNRJEt=CpJ4x)SP zUe1tvs58>9w`1ejg@CdPttM{!QPcjCcj2i88vw=x5FtESTP!YjojI2u{ZVL@UVMNY zkw(-Z!2qYc&!8MyZc?e!o<>hAq@c>^D8UZVAPmJIXdI+6cNQ-g9``@F@L7fLF*H6h zU<`hsj0*UB-oyKWQ1ea;U}G*o2_l_ z&($K!*9`i!YY%qTh`+yF*1mvAL+jUbZjc3KKw#A9!Z%s>@f=8ccoRAtQD-@X4-|Ul zp;6^Lz#Xa4WufY6S?MkLfmYhg(2-B5wojQr1MT1k|62FMK>8H8A-(sMW9k#HZ{0a; zd+QZTYdj;;^L+gu>f;Llmp$HxtaHH0e^zD#mb3TamLyrSFJ`AW*JbZ^(7yOyoh@X* zYkdYQHuFC8s|nK-T|8L@S7AWBDw_%d5^cr$NlzDtsp!G~4m@{81Xfvr{Z zZo@cG_aFzzO+3H0CcvYxSI!f(XCY*BP~8tz-FQ9X+M>c0nsh?8lf{8D`t)-%QC!q{ zc|aD(0@Y_?9#9%R!O=*v;Kr@J8w@Q-e*VNZT(;xK!;ekxG`2)?_S6!JjJl8H<_oX{ zeEg?m{k60N`ZQ2^S`0)Q6b0wbW$W+@BfB?>+*#^ms!EoHfdK#nG`jcn9s_$mjhc(< zYNKb6~ACugfE2Gn{nyF222~rucjM=}Iy07S)Olf07rP2I7pejGO*JJJQN< z)59BxvzMQlDXOXUXo9qR`S6fy1+wRr*1sl3L>gSf->(>neMO>M`Q^)(Lzb@~4TUBb zZ3|iX*8Js?uB^vgFo>n4-5e9;juW@3w)!W2LqbgHNay!QX@7V5oaEY_XV;xTewb^L z$)9=;N&hZ3ED9H(Kl0Ri0=-7P9T~<<`z-kq?%cggcAvLzrvp+yZu!N|UN!NHrzDi{ zH`d|&1p28Ki4H5|PJFxt!g>sZ;-d)NW#;L^kH@+{KvENX1NL6fkG^wO3v^6^P-m8;2!*> zurfh&0L(PGo%f7ZW~c@tmFpu2X>CB`R~Q=SxEONF%Aim-+NREuEW3rM%73Ax;uyE_ zw2>)nfcihqs3ypv_pr0)6&2M?&+4UhwyGqE@P1B$mv40y0gCAQZFfRnJ-#O^Ofb#+ zizPf?ZHa>8J81g$+{17!H=Nb5;PE9u-g^7?ZE)odQr9P9j#|&F8ZVy>ylYR!#CaZ2 z*}nh@=oNvGG`1|wQ5(&S74^pMq7Bn=1c{t5#T*>{RqVc=JtK(_u7(2#4ousO2XqfJ zzF}G;mt_QoRejf6IKeD+a<})P!cOJC>Q_TVe}jmqvvtCu;o`!@$@#XuT|`vWxZor5 z*wD4(1C^GtbdntTA#SJ5oNqv!lEeolKrFez#`KX9M~oJtLMmb`9)VlNG!lwnGf}h# zV4j&y;wKqiLN9|hE9}57omKn|z`gv;s+|l&(#p#FKKSXSgp8BXfEn}|dGjAhrJGC! zTQnChb0nhkyv?(%f_1!neSIP9QvVS_9wbB4e9Vpz3PZ-lmw=jI3UcpGJ-%j(W25Jj zSe6o58!JKhIt_r`Wd~a)I(m@PB^HG^B!$*-6TOww4KUq{dTDQCgbftc)#% z&L3S}U9un*Q`6)Q#|pB+eRdat@y&PwvahAV%{uq#Wf$icOL5zPl*>1QHmOFSg6D>L(ZE!h($tT*c+mwC zg7~wFc{x3K2MKlv^WbeoUE$`o0PQgTu}_uK(CXxe*jK8zk@*f@1j-EQ6hNIY1+f~b z%pQNv0eND3JN$W|PS7>?&t67!Qh38285fn}n-(j`XoUS~lPrDLjbu+37nzExDn*>O zQ&Z~KBKrij%8+~mJ94e>sEdqxZ`kR*pZ@E8;$Jg5wFKA|9+IWKv{Fhy#3RrtYw zospr!&pghgmQK+p)#Z};F$4Q=2*T~GR1K;i4f67VwKZAyMzLkNY{I!>v#vRi1h0pH zRZ1u*AVv?D^|fn9I~Ycw7Bv=z0zky%DM{327`%weDQJC?Yc|d&=)iLcE7U%pY2G}m zu1I?ccC?MDj?JlAeW13o?Q zLtYilQFZAHK=2`;1qR(Eob){%zV3;|HOwO@JKxSq6#{6Jh(3>9R4ER$ z#0!VswQpo(^Y7^P7R2|;?{!JqbSHie9Jw&6-FpwE2R}2MvBhSrhb$=WW##A3VEl@} ziQ=o<#}-qWNEcVSgQ@GRk;zoA_kwEtvF6=a&#=V+cZ;t359c~a1LKq=>eIp0aPFZE zbLwh2Qm*uR;acC#?ENA`Mms2(YE1!UFh`CrQ>Q&`X4dK;g%HhST>3X|R6tbl^eM$PYTLUe1#>@splL#MfF5nDRdTe>aj^&g z+{bV%3$Y-E0U6w^Y;vub>yVqPEyR*lAb;ctVr?YSg$Ojnyel~3@~S62j#X|;&~zhP zr|ApWUrf?6*v9@u+?4^x4hk|jQeO{g@*#jwNS1)-inI=xnGq!LyT(amfa|AzPZ^9SC3hSKNlTivqXD0pStCXYg9F{?La$6#(9x zt5{*R`QtCeAyXH%frD~f3>31dgU@>@<8SH9$r)xy$M^K-R?FspS#Tn0f%yOvqS_o# zpsDX$06Mwg>poUF-Jb{bYD*EbeiWhGtD30-O*D!SErzb`|-`_ zqsc$##f=I0A}%uW=wuRUgGYaG@m3r+H8MiI!&~bq%SA_Z4oU2TA@~jIQ2TZ`iinA& zrKI4rftIu;QigIyu5BE;=l^_txgOBx4T2h8^YusgD4yzI7^enR)xXe2 zDM70U|wpI-xfiyxI9s-JV_oIlnfbcriz4d2Get{uCBnxSfj>eDX4h_1*ruXKstlc;*LvBN_u$gDxyj) z3ODvVmW)%9`<>z~4h9*LR?J$nHikgRRe9X#Z^DsP+TwmPx4!*xo|89Dm?i zO(R1?5mSgApg0T`oAD%0_aHptoyJ{UZWY@I>8a1hCui9I5+XI=y0*SPiF-;)Qj&D9 z86vIlWTBlvVL#_p(J&rJ`59rs*lbrS7n`wB=I7^O(b|I49g$gRkAOZiJb)SJBs*&q zCKEx6wK37UBY~eHkjHki6#P)>a~+{zlmC7vKYGiMotWvIU48=Lo~Tbi844%e(#WFU zBLmSHWb!PuN3VRgGB%c0R0IZ)-nwUmR6X{*Ff(&_t5YimUR>_;c*dz_q+8ej@>5<`c> zYj#J6KZ^Ab%IJP10k~q4OJ^CcYF(68HWvdbH#|;*r(#(X+NU~>@C=mk&kEBA@XtId zKkv4vDYEcX$8$%6jnw_nqpFx;a0P+@$L;#^T{KhQz7ai_T*ss&Brp&Knm+H ztRuKjpf3(M;vo!9SC^NO9an=pban+{ z4@tV3tgpHno|`>AQ(!VTS`&clv804q@#F^+o9V2dn#~kw5+@cNUdXFwB9#)eQwD1S zwoyfDYq#7zWC?6vhy`Nu%DGoVtTc9OwiMfT3gpeHU=3JuJ%8JDZEbG{iQhQ;Xguzg zwr(#%!|oAkzrA>|e8OA1XJ#4QmIOP}06fYok>WYD_~q$0TX)(-lG!&*=N&D)^$jBXf51)Z9jieSS89b;o-inqud=t6_H zf)!sk=hZNXVJ^r}M)&R}Ymf@C43?6eVfALBudXkBL!tut#O&N06bjuBj$BgU?j%ls zg3-|cp%wO$zo<3r;4Y%xjzbcE<4LuIh1C9!AK~}wpIQpKd?HmU!@rC{DAf6zprZ`9 z4AHjyeMW}bd-g*Zes#`SBVM_7$?7t#TJP9Q2_(&&gl|m zEvTv4XElw(9LdL{sJ;-5HMKN1_#*e|Q$W~&Hqp&O#W;`u^ZfY&c*pDb3D_(po--ft z?9H6(DF~w&MT@5RDddrG_wt?gX~ibQP-^r~SFUImP*c%M&r=T)?8?>vS^bANKv?rp zXFyoX#emE$ymunL55xy)cmFa;iu!?;{u7~oMIs(CbQAJ>gw0`Cud4FBWZ2NR-W~4b z*@9vTVs2vOP|DFO@YS}y&%1;lTVvO76LC5L2x*AdBPlAQvEI|2(pJT^aNu*8LLNX~ zJvv6%0vhPZZ$jG#c}$jO6s!LwzG=wea4!x#td9$cuL~=#+i@5l3v~eiq-`aD z<9OuNe66*?vKn!P7z^4kC_p?64HVz|vE7cE=tR_>lM_vdH(@LOZ>`$RCVSK?n1@r& zeb3LsIV$<7& zzYFH=u)KUh&&)J$u5c0ZwXm}A_#s-awhk1HFxR4s))PQY?+bV*TRV>L42nbM$ge@v z++`SH1s(*SGqXy4SlRE7Cyp1i=U6`OvlyAtIYmxaKe34DZ1_ad(pV!kP)5Twza$>8 zj=LA|3wC|zg2vfoPr0*(hQ(MgA=Hd8;==5{;LcPj^C?k-zuAx4HPEzyE(WS4*mDUq zW6igA92RB0gcGtmOLJ!ptYy+P=k5AM+i(;TZ5*c_E$hCQu#>>)Wb1qF+A6{%K-*z35(*$8 zp#jJX54|2H?)Shw27I_&0YM?9bm8H(&p((KC;wjyfIP^ue`3k!;t-sm25x;gz5!Vu zbT}ZI;moh9ff__z8IFI1RaWM-p1R57hHb3V)Q$ZnA0XF zbahd%xW1Wrj0y}Jo|XDuGz|x;7U&RBmq5(*zDhccX^>A;5YQm*1`~t8l z^Rd9RX6;K9azEs9S{6>L_^R&uMvQyvE3}l{CS5m`<-+LBE6&bfJ`g)I=>a4os&_Bi zRjf5=r2h>Gz?=v~fwG%qj|H2OeG&ye<0S2)zzt!{O@UNnaIaVqP&47i@cI@zOUL~V z;y?=_NU% zM)WTvmQ^Fq36)qEJrWi$CfnW5ZxhE63Da$(0}u7D3_Ks7dp$b;Z`>~gpPEyvr>C?7 zE;eg~!6MUiOgoajL-(7TEEXA!nXFD9Rtz$2P|=|e0-if~h2|<|t`V4}>yEeFY~*+~ zE>TZ*TWtsFhK<@PZnB3KZHj>VUIAq9R&ySJlpEI zODb(8%6!*y6pOrBSp^->*4y$ zP_hH|?od$ob8&Mc76fjovG_A4Ce^5PSfeJ3Teur|s4GSo(s{EE7^JDjPNE9Y?K*W< z=imZO;MaiNv6|ZueP8VC=2jatv$2WexCfF!j70jt#AzGq-FzE5cg4=i9X`AS!~{b^ z9Kt-O?Pfvyf-6Tz83MplV`N`5UCgu#PQ2>wE_v%DyppLpV#%Q5Q1BO8zP6vTlMw-~ zRq*lkXP;SMEw^w5MMZ(;gt$pK2?;q!u|*9DV&YzEDh9Zq+wQY;+RL|y4hqL4fd))& z8O~p5O}?s{<;F*Q;&lu*b<9%eIi*~6WmJh>nx}pL(a?>J4Hce19}}@;wD)0Z zi(eB@%?}js7ZjYjp!|0bydneB35fhSi0Q|(eTAUg^O7Tl-`Psw;`lr~TzT#1XB78# z?@s?-t9`M&ePP7?7enpS1JQgzThtovzUL84am`v!8-&l%&)yR-&R&Ar!Ppq0NMv%L zC?a91UQdF+xJm)2PBf;kW#MAmvE z?Ht)HsA@2|FdZY`h9*50*L_2OxXFqlJHlVtvyuIB&<}E{3k=~eoO=XtSZq7wyF)*4u$so~XkQx7UKSnz5SeiLY+#r@DrXGZK*= z5A;)FMXkx_Zs4^bnuzOrbsFQP8YH;pju>yk1Y=B^-ii4|@uDFd4EYn-Biie|8lyRK#o_ zR|e^y^g_b+R+!{K1jl6SIyB`)9_j-)LiK=_W{UXvgqQPQulcU-Wyhclh_q?LvJn3K zPOvcy?q1J5!7+&Bp$!|e?j9H@`!@#cX}1$`AOiFSQnEa}Ke03hr2k}lH3Y+<$gNeA_^@O6e)Hi+(3 zxNJKsE%NP&g-zE&cvnaX%}_+3%yYXP@sIl&bE_Ey{BigEn+%Ie<_~H-H*atDGrXas z#$tB;S)BDDs^YOe9pi4b+KdJ)?=2z0@s90qgvS>o<%J2N2?H8;nDMmC!HVId`9W(6 zcgDha0~$ikm@hVUB0JXi53{0|DZQloNQyw?GV70^>81moj^P8LdnkOcwrZBn=2~+AH3`|YKiR(Z6Kuo=Ep$ROk*_RU1)3qVGl2@DI)yJ;x}_{K6| z43bXVsV)!fO93%{%F579O1e^RiV?^OP7>=B$3=P**|#v{!JXNrtMaVx7;Mug-xDJv z?HZ`YxKXR4*8#tW=|6~sv6Z?HMNwWJ%_3)x4u*BC9A&<+{I=E7F6h}gVCDJ7K$~#+ z6xIOgNzyHPMdKY4UbA%8RYIRI;wGQZ9_or|ero2$&-3Ywps&g@$_GUS1a#kxAH|r% z$IrRY-EifDqo&=?eDb8`Mej<;#?UrKlDxU);2-ihx6OfAHwGR+C4-BCca85VOH>mY zkGkBb1l|9IDNmWGqAlq~G6v3kPY}4{%Qay%hfY&Jr`0dEDDg8niad z0mFbY#>OyP=3f*ndGPKxe%+))rkD$DvhZ2**#-%bVm=|MJ<5pJbVpEzkK-m96C{D7Pm375K$;JBaj zf^Z+kgoD*T%}&y~;{8Q(+-E=`OBHwu8lEKQ-=f-g!MRI54d;Ey1Q%@DX6jxet&l zR!-iv?0aesj)unL7n~Cqw!Afkrnw#A>s&V{7Rz+_>my{#2C^BW^lfChwDebzUS|6v zRx2A0IJbD<91yLLP~&P^X|aojiye`)Gktv~DhjplVE}zQggWX$$2aU2icfazJVJ)D0--7y z7UfCGo5qsjAq2kO>$nL~3~--&n#`HZ`ACm5gDQJtLqSW`akS@Z__On!=bHek1ID(Y zcXe5?2h8L88m#MHv2t{7odFW;ERh-@$S~0oUjiwZ*l+L}&3H1;?&2^(ZQC=0tp4Uu zJ-T(Wdx39{u5Lf;WZufyIFZ{EuN-``{8GQz*r$d0-H{r;N&)uvYW&P~(I9D{uv0|F z8{$@Qxnf$P@_O4T#MM%h^6}Zq{M;M{(z1e7sviJ9KpnfiuoA0@NH9yjadu*G-(sAb zQiwyKzrr--qBmE^jXM&{LPmE>B~H#fJ$S;cBSewZhJ}6ZIml;uh{3bR*-STktf!!PJAjG07im?9#Jr)Gl2hP%hjf z#rC*#w=={7^Hyhi#i zQPP2S?%>*sEVY(RHLgrYxtnt18oYb14O6m4tsoiv6g2m0-odvRTC87LhiUN;=mYC) zmseKGN9IxBK?!F|(Z^DMwE4E}?}O6HYk6`H=K&IV0}YgymxrJvxGrPFRa{t@>^E5; z-CRCGB7=j;Ak&D$A zgdc$YgM&!X>xY>HJ4iB&(Ey20oIZu0!76SY9TjcvV|zZcB`mrAG&J9@NRIceP2Ye=ESiyspqxB9 zVr*%-vxPL@_!HXCK`IhiI?VK`Glq`u(X_k242^@`pz4%oD(@166c61@;1sz&EvkrR3!{nnm6m>xB@ z`%Aj*)5Ep?Drcv^;;bxX5K30SaRDevLNn^lWqvU=8_L!qWZiMbV7|)Wa_$3H(dTZo zx3jpGN^l7bx-{SWro)dJOE1&|z&xVg^|^7wy%6$h9>SQLtXD-9I1g|WbfnMoN%`vH zcjuD`7{JLvQb(b37Rt*u9q*vSuP<-CG5#W-CJIV_YzsE z#zWw_Od8+f_ySRVpGHToNOMBAo93pFm1j0ycL6r=SeO8SbIr`o%K!JhcX=5u11g$` zTG~#ZctfXq{A={U`-lK2>Lnlc&e~Ix#L#ybck0;cQtIg^v4kL>oLbuacC@ChvI;XK zv&Xy@KBM6f-9nyTgu`X9cnLZVfPrxNU_=p;Pi${s*tV(l^)P85OH?Ynw_W3n8|~fk z6i{0uIUG)G8P{RiW5?EE!8*)ByYl;YmI`8IX=v}%J=__T@KE?93+Yi!h<0ltgArEJ z?oa|?3+Dpyb6y+y4+1DSgGp5%EWCU%yh!*4aRke)Y5V<>p~p3@Uq9wZ2m6Zbv~8L= zp~_RPu-i%I@~36oTnU|1xTRKq|Av$GoV_^BxGmYiq_>C&MrI*|aPm@I##6hpL{$cw z#rT>uA!(xxgEbXJH8ii;-CT-3ET6pa?RsV)h}%Sk0U!g@V1XJT^R*5MCB8~fr@KZE zSlpuvp{A{kFc3l^VT=O^AKSEIMC_lpM=V44(HpX>cf~!=PK?Lp9dar@FaH#?URPFE zM}b6)WuxQc)b&%nWLG_4zVnpvt7e`ds*7N|p%f`D?w<21_;~S-H_aeGw7@x@*8`xh zkUiaGPpW>;mvxLZj1BoQPH!?LzAkzb8;k5XrCaMKt;ALVsS?v{kqM7TT*T6KKUX&- zC$C0|S}E=rcGg?=%TMhp^*stOAI!S2eNxVM4TBgqh?NSyVSRl)W|ks8WpgnuKx1TY zTuXuzWD*No5Nz9h0fpOpaV3ON>0d`^`~+#;e?e6tN&{^iVq{xIx*OVDThed5?4%6< zqjR{9(=~!+_~5ctw}Y$Y3HN|dKEBIq^$b?e@H}!?7QC%Er9abMU4-;bn_~Mgwai*yW@wum#?;b_+TT1|T%c|e-+8$X`02yCeP2&b&%OnvOy!H93_pJ~e_h*`4US#lDMAe-%m@ zLX5KRSrR#&D|HMo&QMzEB+;aIii?W+A_M33U+{~`-GCN3`V!`;VjJeS_j`;QTTjUjyxg)>N8GFDX`NriMo-f3!LQ{h6! zt3BrTNBY4rol&@IqMC>U&hFnw zz@*PfAKM8`ADmcqe**)^>0Et!28Q4vsBOUKG5#57DIpT=(fum{xG4BfEA zUvYK4xrm_5XAR>>R9Fyd@>HxXL*fVW4>EQ^Y`cY%1I98UOoRy{3xjLEN)q%EhHzV` zWv&@NU3y`#t>cHldf*fIAuv~RUjr#Co$se)gSi$0FSATd&Ys=;5+(j6eb~KaFV+rw zeRvk875j{i?XZ8+8yB!~F1!Jjd5F|-#6b0NIi4Y{;Nsc8lAhCy{?j#`hk9O=Kd zp)xdRCy61d5HMKdf1{PrI?A{VV3-c}T#zqh=`isjcjOkkg`A#KeE;yra3@_s-VVkIL9PNVQ|+!Q>z@d@zkIn64!5iQWQFCFS^`Wqf~-;abjZVt z)Ie3lN>TyjkVuBtIjIV=QBu?@(G_4U2r*Ks^7`Rk-7*FQ#r0Dc?)LO2dixI|u@2uc zh#@TShWo&uNo!O(KF7ppGb}c}PR6tdT(V2M9B9=7$-X z{3Vjl04ofdc;%b3vkZj5SR^D3gJ9xfn1Z+UA_ClWU7Q5LpQ8mrvyhFhk2dKchV86R zCfoHaEHp5Jfg|ROBYNfeb3)9I6xTO9$fL|f`*8cMC8lp+42b@zQ_3s7rxDq~+j>t$ zg10nSepfJ?0A~ojeoQu{LOw=|U^2{K8b1DRxTz7I1=0zydT#Co>>VKqchSs?j~xhq zYJem~HPvIf#U7F=FpJ3ClR0t(7b@@ho7AW9NgWmUTS7e3HJ4RGdM*N>BL=jH=m{*n zMxsbTQT3<3KGYMhM?BgOfxjv07q=)CVvZbpZ{6sxu1;4B>^&|v79f|2i3x@g;g5q9 zF_yj(3m2WB8#9D}SVc%?L#lpt^%el9t>l1pwi<|Pwzn{@67jBC>EtH`#TaDBZ-3eR zySj}E5l{r$QsPyjBNoi?d9?Fs+1J?z^Z|pe?;KVo9^hQ}`y03SPFCV) zOLkV0og@{KRCX$* z>(M^zqUcyJNIDvYHWK3n;XxK2p*T~V zr4b1@@lA=11k=PZNlDo4v@q1VFUJ;v?h{&{K@MWUyt%pAb8(-GIj=7Uu%$!RD4_9_ zK)nSczSn$C7{EJ{<+7w?r{hB3LWzvkI3$SodQfqRvnLL*_A^Vr&iMYV_=?h2KUqAf zcKZ18IFgZ6c$Lx(QStx6J&TCi8tm2?M8m>*U!Hm^@`H~0HpM;G6KfD0pEz*>T;#cD zvokXVZx^u#A1Kf0vLSiaI$SY4`tH z01g3Op(&vg``rzj9-S(}p$rQ`f0>A%=Cf!B1sl4|C6x{y92*!Y2R#5;5>31_i_l-W z%ywZt#_&n_#h$L%FTIA#vAuDGC>7!`5U>hJfj(XH+k}a{YN_gT0}1ta-jvOUR@5%G z`;Vq039?@~EN}&w320gzpZ|uo3hLVhK2i2@=VnHnP-w+u9|fEb8T!2Dp$5P+d>)8r zf(yihzZG9k=vR2Ui6ck6i#nDS7khZ3y#*3R-=4pIr?%vJ|E{&^2{DX@>F7clZHy#R z?kfG))!CVT?;Zt9W(K*H=tEROG1|KvjXbVRkox!-T>{NkshF1_M?Cll#03+MoKBCVEU6SL`YEd|8M02GYN=wUBlV zz`+J72lx?IrR}fOJZvuB=U-V>e1)Y`pKLhiqitOSO$Fe zDgm_4H^KZK{^9Zw3-pT^62d27lYIrZZw@1b*pY@02R3lj6YVJ>+AVgxRL*2n1ekrW z6gqiwN1{P;8=Mmd&khrmEDAnt?>vW#O(&DGS3kA;EyB4*=po>z+VORqn0Su^t1xEC907DI6}d-#1XR71$fgVEusY zysTQdo6br9^0(WUG9Kr3=Ga2cG9tT7dRN($7b}Fy2{APenl3swO+g zI>4;APh*niq2?r?4m8s8*N?TE%JmyP$Rq8PefUX zo*HGFHk#WdKVb2z3jnFOd4tUqR+FO0iS&B7?tLu!;iNWv z@^WMDZvFOJ>G>j(-P&%;$7&xo(v)<9JxnF`L=9>3=MzhxwHt z=!CMzMTIxV$N?271Z=2~xKh6U+9c-9TtdG?bdkvTuF|iYWl;86G*SA<35Ivi@<0Z- zdv{0*iNRT_AX}xoSYi0X>PO-AOYzFPEo7^QG9n@n4QK$Vg_c$$krt1%_M*4HQT;8V zaQY9z19w}f!X-JF85lZdUDP~gt{jVcqA^&*o`IUuh^7BRUg6UpXeQ1S=dM z_+he{dBGV0=tHvp=ua>g6&zGe^`<|t~EyKXruMXjOAA2s1$Q&bg z%O&f!ax(%8U=a#+Y_DvkQ$O_et$^K>wf}}*(cAlWgrjLUIM4ni;l5rnA?$xC8f>30 z%TThq;Fa|As~>X$zTux)3&lGY4)1lqANCIePPxp+IQg3LZ(E_ zy`@(LND?TE*M^rCPj$HG+{D%nG`qS+=)*C8>LO1SR#Un2p~lOEW<^WWHNi=cM>^Vvot0UYKF1dj zZY+R*c>W<$2R&?`2Z?y|WCs#4G+A(I)S@Q%(-yg6eP z*Z5uJVbjdd4=I=)WHsE~UU7G9awUv_bSwof2JGO70asd#w-KPz%2f`b>oo{JG`2Ao zL^{KWcXI~~MTx>0#v#(n zM&drm#mv(1vnnr%WJOR&5sUy<%5&&80f?ypN% z>s4t?vb)ymF9t=n$<$fB5X8Y{xlUYe;(~S`_u<^hRvF1YDOea>Vyj)jkb@*Ey1!(z z+Ty2S{ouCZyYX9!&+Z$`<#|rUpUpnQ&o1wXTn~{lfson@7iJ-YhT$Ay ztoCUEKHkWO^s0wXUv^&VGkG^WoCb)uNg;YBhlSM8@*K;m z`n#VK6BEc8!4d(Bu~mP8W0>j6aiz}7b7}Zbkt@zLkW;n^IJbS&`yN%;%JuM07SYv% zko7w3kuX?Ww^wApB<>Xz_6ZC1|M4N>lWfY&abyREYNLQFh#FqT^@}v6OP3xtPeKs| zWk&~DqZH*0&0@2YMT$!*ANw(&73!32bGx%AR@jR_Ss(s_H{E4U|j5^nMETx%C zLQsdX7xDMs^j09#brERHPfJfPEGTGbSzY@~w9Bw_a4<15Hy;VkqA_NvpTs6G5QT+Dip>y$Gx!HS z5khj*E%M4ix9Z*1cq~$M1p~bOkW)9l{dF9wLgazl3>vFuP*qcM@@BE0yC})=0Z&s` z==j#0^5vG#f&-0CdtnPJEieB*Ty`GQwsj~&nVI=>Up`rvOR)Ku1b7u?C`NoO6xzY@ zdGt?%)9KYlI~2TXKjJdpKI2)b^?0w0%<{ql2s?eslqE-m6QQrOrAKx->Sy@}hQQ0} zUllx6F|qmj^pPg9Z<~KEmfv!9Wq(4?!+F+P<5aEawEy>R@4+~bNwC#MTMlqWC~IoL zo}?Cz@UHOgk_FGeK`JAEa!iupS;O8>ON%s8%GsRb+J4Qyp^%oIEyf}r(gG<73GE~7 zic8Sr!j^fSU1EyXVRYb?HTyupZ&L1@$w}L|_JRI>5HND4$Zy9%n-QUlmqK>`!-5i) z?zqH=zR^(5`i_l#rwSX_@z2nevp7?719L9W6PZl8%6qbK5Un-3hrla_IRM||37J2g zb8*)lW-YZ{KMaVYHoW3EyEy4S@@ITdJgBccvgEw(H5DPI4!!Ntl9R(__}|2@=RT(W zTLiU@qvNBxI((8^k|eIAk`H%9bj#4S_KX7AA$Dh#}xt)>Jm*xY!o`iganG>=r|GJZ1wpIB;A5GXV)VTJnP1 z9A5?7wKVBEdr{dqKuy}GNE6n~6C;YzS9CPg^oXhPgeodc?u4X%eD4uE*b6ZJMtg=3 zREtVyEpc`x1_nY*IL}@K##Ik*50CW_PAdReG`T%z#M4A-g!XLhJs7F)FSr(Qd)Fxa zRT77AT~j9ER+?Zi;J)1YJX8v(uvMx1)vI4H^gs4+Aa7sWRUKVp8eav`EtnT_7y)TW zda6LfK>ymH?%ihfs9RVwC}O^7U?80%x_2;TYie$~;a|+Q!v#uOc+{Spm?~@Y=2-WC z6`-r^L~|NFB1|l)-HJRhD85W>{g>hFSL9)oU4oPl#big%<>&8-c}Vas22ruEU}LOF zzeD^9VMXqQKlhg1Ad@DL`(RusgOK5{d?#~gqf2?6E{#MQ#R|92>4GGn5n=dscI|Ml ze)mP?-F|EsQ<9UBUx|SkREGB2=?mS5aC~UnXy=;%VRG!QQh+gyY+y20x{Z&oo5qvS ziGK+sSAbIK*QTZP5Jt&vM_yvH^9`Q<3Du zO}b<3Ws3j}i%R6SK$WTL0Cva5nv- z8Na>4F=fm_7eXKh^&v)2$5rBi1gGjLh}aRYmu*r=paS5GbRGx9Q+%5rzILz(JP*zm zZML+O{gJ&~rlk1;EDK_mI-%0J*!e`eZJo@UTPSwBRniSHyA|jRpNzrZ(k&ZNG#;va z@axb`lN=*hX<&t!Z-rsfIK{t7VR5%bpSXXB^+_|cP|~kyT~psT-hcQ2z8uz$$R~fd z!$OK@817Ezt#!oKqRj*S9*!}yBG3WWHviyv#n(3bE9328i!dv-irJR!i+dtBZF~NW ztTC@x?`MOT8egmi+m8t`XjwIe2vVYN{krNw0)Ffp8(IIh@Bmr-SPQy^N+CwqX}-hy zQ&1zQG*7wl(|5T}W~n2u9<6@8>aMcYD0UY8F$^8RQWJ>_;f3(XV6B3XM@Sl5cI#)^ zmgd@C8yv4P{iNd^jy;QtQ`*Kc3U(e}3eL9+u9%XCX$!crlL*zV#$3Y_nDuw-Qvo0B zA`C^)sh*bbv8S0yC=cajRA8@LE52qM%SkCS#Jbk&H^0Xo?qq{}7hJmNXS8!x-~d8P zjxQVfC5L15A=*Q~-8v!{*M37~OFWoy-r+auJ{Ku7p`$8&CYtktIZ)xOS++;GZr#x5 zuZxS1-~)YjISGoH%|Bdv$M=L_Gz`ZT_T3m;B2pZ2 z5hGuJBA}z-%Oo4=iObP4Z=PbJ4{SY6<$5j2RKs%fC0!liQHAWCNz4Sch~pWmimIwS zOkub(WHVU`A;Alb3-#B5<(GxgLySWNKw)h37peyDMj4L4V*c zu^lI>7Pq&zA)!)Pca}2Fd@x3{9F)N_?i6r|@e zForUgC9LlBk76LqT{S9|cJqKeiJi{xTT&K|M}cEO`82jx(MNRELbOt89`{)Q24-}g zk^)aCc!5Ko-M;up`Em5!P6h=_rMrw`oTgk#cP-DJ1(XMo?Q1^OoNCYGptoF&CfH$dZ&FJW zYAFLP*gPA<7ttGHK87Xx{o2TjIoUfu{cNv0FutiXuq#cFSfgtEQBZA0{|rbqX$b$9 zn^2l^jWoX+mDymT>O8@|19qdBTTJ0k(ga=EpG%4Bhs^DlPOZkc-J!Jk8XZ*-&B5#? z>OcV#9I2&13OSM8JBC-U-vO>a1sK|8n}uq>%6%m zw+3Y>P07M_c%oJW|3RjgMqid=7AhkXSJhRreA{xtTJ}EYfBPU~&`n5XXCVo(xsG`- zyx=Vn^qEx8`v4*=Ia40m$KlTFnJk{8na*f%K|i|bt6kSGX^(Agp4uo2YUxxI6-bSj zPU-}{sO({&w`cxd9i8PTdkK@-L!SZABB^t5ZuzA=$$IwRJ1&?2c>`n}y5YpWCvxXr zD4(z?9bd){8R3psm8>hBb4p8>w>Ou23r6r+q1lHF^3EH~#LmRE2kCPCH`rlf`#rCP zF^M7iWMJ-ZVvZ~EQmXr&u?*`xN}p^mhLOFx-VXZygMcnTbgDv%L{%c*p8NMF%-cJN zX+GIIq`y-4%CaS**O||Cz`7}{*|T;VN{h{3%lv$N5YuL-kRAYezti5};Q)?alpk34 zulL9K3WITXJTU(H*qQfx$L2u^UK|A6aq!I>m>Lf9F+YD`ti|!%a^+3B<79Gc^M8j( zoD_J#dnn^?X3cdwxOldC2zeMV)O#K@k&Du&etm6v)3iiAvjS2aILW}p&x*}^@`?ZU zv**{FxXj;!I{p4VokGhC&kuCxEIU!Uc6WAyQD4xW+s>!!hAF7T-!EUjpl`%HH(}(= z(t)tUyo@PWM;BgyFA;I)@QGa%r8L_#DJ+z^0y7DR`G|2uc%jVA%#h5ADF!~^SqA{a zbOq7l1Em@(V4{XoT9fh&{Cmo*$7Ft)Q>m&SXJb4?u$^D~jZGG!m$2*NSNHZn&oD%x z>Iz|_yKeyEg4Az3-yXW@_=G9{cSixqZ`Q32Foj?V>24==q;76{vk=_D^IG$>m#N1@Z=ioP4)p@_f z_D4elF@}&5<6;P4A-{d|&>>2NjQICRy~gqoJ2u+wdk7;tonT zL?<+14qFai-071i&&#K0za)8i3l^xILh&96TULp^ULradxWD~KPJC#qCmx$Ck9Qy^ z_HADu3IFZ)3;m*vhRP-0Nf47i*Z|SYeY3f|i8!Q?wT@bEwT~3fKv8-`BW~0dTd?!_X zMN~k_@p8t-nWmEPcSl`)Fuasdw;z6^RI3%3EWF4j!aGuqc|{nE}@&69o>j-bDN`%Lyylil@PQ zB@*;)$jIG%E7igk(s#*t(>>Te+(sUwlJHd9P|N{LuHz5)vC!b8c?><6aVL`KvDOxk z$v(+)nBh*UIk|Y?_`O??S?=as&QkGvPfO^C-RmFCWyWKKK)J~`0^#S~>MwLCe#{mS zVqh>3O>)RZ68>#Eba^TaaZ56?9_Ki;=3~J@~NibtKFkr{v|aw%~T;bhaLsGPlvLE zn$9@fis$drRef+cezHKi;DzSmk-<|?ANKek;TG`t!;qg;(%E+ft4uk|3N%EZmVLL9 zrHb0n{Mht)rEt00P`7OMMK$|&AER~&bx8Wr;g8kXIXn3S#MZ=E&YxFb7gQlTMOpvS zz;1`H$L9ZQ0frcPZZKbB5(~Pkm&x-^*x6hCr`!SQG%@B`{Di7yggr9?-=y!$2)v+bdy&dnt4y-8Wbjb$y{H#9yveIV(AhRz z4X$OG7A_{8%QuhL_HO4=j68PycqWF~2!Y46V1k32d2zCq{K=fsGkm5F(hN6#|EHJt zf;Y6C=Sv?5XRpO{TfUbubRMZTEA0XM;1s` z&dukGB)0dgI$xu19%Be=#tHzSZfqPdH4b*q+wyL=4m)?jeb3ef8n3?P)DN4@9lC-U zc43F#N=~P|k|3SkmJb{+vfpnJ#(Hn^aFv1X=L;MqhR+_Sh_U>Y!=HbO{t~lW zd@-<4gQ@_d2Pz4x!Y4;pHOna} zh4LNfWA4nillEfxp~}>3Y<)nF%Yxi!{ z{Q;W(b%|s<_wgTQm44$k9~|O;p#RD0&L=eWyQJ*0tuQfdY;25;Wda@L*XB_1xv*_D zVG(_uziyueT4QvU*k~E;Z(eU27Lffz{aAGV%w(5lqbx@h{HAEVU}D*~Zve;#7`Cj_ z(%!;(vA`x z+kf;bz};;#-cOV-S0iC15L{+n>8?NL5uMb&i5(^uTSmFNncAU}+8LvF9YIdmuc(4v zy=M;*3!J1YsHGA*C8_&pb-~|ko|@zk_rsWSG-L7P4bJWky(|k*ZryZqyYCa&K3#0_ zGEt)b`@?r*W}$5|1toS@pMicgMenArzZ1iFd|YGniTCkLVOx_Xt+9W9xaW<>g7ulgTM5z&q2HkHeb`<=9#Q zF6>HK8%g;%L*K5z7S31XLCds5RO&J{^?=d*{P6?!a@=z5c4f(_srz(lKAhRlWO|I{ zr0iyls^-KoA!d@pfRUUp0j~*09?f8QpJD5Bqq(E%9~uwy8jT5Tj^I#1SV#1S;We!I ztur2QJEZ=CT(Da9n%1S2$uNGb8@OJhBf>Y+;E~NU?|nQ=R}dq0=;&r$jE_wIW+7dI z8wrXT%xj#SUSBN7Esxq5O}%TTjUMxlDY;y7@?nQQkZ|&jusSc542pC;=1lsjnmmEG z$g>2<(e?F8I3mv$qeQ@9flK`;>GD?wzqG0_D;J~69TCAMg(a{Rg&=< zNIxWudDTJ!g=I9@YmPUeDSp7y5Y!f;9UrAY^B@m2in_|mbCWzcpE81#gs9b6xG^i{aA ziQTS)0=9Yp2U66tq%~|gk1Owku~0&IxAyxb=Na;V2KZFfl$0QalNH*-#bEbH=IMPSu15t0vUhvp>01UZ zgP#FaN0VtJ5lAM4Fk6X~EY;#YSB7lQte@j(e(!Heo9GmNJ)Z1*`3Us6JTakfY=xgw z<&IQqzHwH8IbW9b>+d(V{>LRxhc&~afyMR+w4&&KJ=BO2&(ySXO96!Jt3zp*F?d88v3*u*!Ziq6~?9?fwQif=k0rUZNw^zczu>ABo!wdWqES+SN&OIE+`Ez^!)w>22ua?;DqAx|i zuzf9{6UfjBo+9u{nDP?yY~VX#3L`4#;mB_Oqm|-+cK5tdg}~3oK}W?HwqX9#W@bN| z=w+}$26_!jQ79;sS-2Ulo+pvdW703C-mm*=S726bNg6gcNP-|bPO1?bC;Z>L+kH=0 zDkMW&7$0#!iwW84m=jotR2X*1#xZKKB!$LY%a#Fb5Aw+EjKc7n#n~jh0j~}|EAKmB z4YV6}93VO4P`v5tYF_-V*JtU5XKiM|>p^B6k9G!^!ox8eUJrKB)H8cEU@(hKD^z6D zs~)#*Z9pN}o#&qYODK23>w~AC4HFSYUQywW)hupBgg})WnqY%5gLQ{cr%#u|XYx<=|X{oo>~`=wj>M)g!C6*PRMJ zlD&{U%yom$**p3v46%nI_hlTn25!&Wy9PaJ#_{FhGM%Egz+BEK1kk)n`z`9e`8w6$ zqT3F@;*mD2kndmgWz_>1E{IgI+B7SIG6AMMq?Sue6nrOq)!aIK=UwPyvfWu}CptVD zSnHf8weed4(m}?rz0Hc(U|%8kl9KQt-%v?QV_!2AlWg-S(( z=$x!xlPE96BdLzr=1xj;$X%RO)D#tO!uyHm0D~H+CXjB*?lwVf%ee2-vC$bZTde@9 z2X8p5WSmR?`1;|C_43+;71LmAV#)Z5QuM}hRD2SxT>n{e_iL`MgBQ!eZo-9vs0T>G z%FHn_6Av!PnRGiDd22)F&2ER0iC=f5gieJ8D?nat@V)(;)vVm7yLjb*)4}QrwvC*X z_0?%`Lcrh16=OMVAe`u-7CX9elj5-RDcro81n{@u4aIoKZ@rmc+Pcod$jEuBB?7!D zpz%otj5Qh^bUmKx{zsa{s_PIwcU}*aBE*s$z>ZJcH}2riG~^W)xa4W&{JD9>U43ew zyjQy1ZC_B0M@UvGASF1SsTN^1hd(apUNAe~Tjx^sD@WKihC3(NFb%+`3i~hQd{D5x zdGoDnZz%%<14c+J#qfN9V?Qe#<)dtOW_ejPhNoX^Q!|kNy7<73npJn?wJ*4yMYxuE z+5PJ311vOv%Ol!_gx|rH%Q(3|O6l*_PrJ%YCdO?gG9l*$F$qpo+=9f!+xPFQs;iB| zz{n7fCS)FB4`mnQ5cZAJ!GEEi<@W^-Wf;@36DQCK!%R?YS#w4GumQv!)@1QrM|IAyHV{I)^Cg4OMDQ4tOotq}u!<$pC<{kA)0zMau; z;JyY3Ec|;YS`cHui-$)x9)vfzjqibP3!NYw>ah}cdt%$Chdr;0r2Z8gBNi-Io=~>V zvohR&xVu&Tk?&|FN=l@_UtM>21VT4vX?A5Q04lQ6U4LouL?k@L<=8N(3E!gFym70b zZVW)3kN_c?^wcSAZd9>%`!Nsf6@D;KE=4>HWUVldL0Q}BRX?tQXhn$dfW-n^5;H&u zCxH%eR>3$#O;`87f_p5@bGIA#kKAnB{lNOZ`Sq2FMnICF5L8D_ZWj1HX7Gv^Wo-Jj z@xJ$3Yh&2j@b(pF$LqPcuz>I~Fg0Ko-b_DRtPY}}ySuxwF>48*=+B>@?JRF6mT&DF7*}h>fcto7|d!p(9;uNQh3NKYew3Q#e(;QCw z(zHiXSPj)yAr=9ft4UecdF*mxcOOuamk$(W1PnNlhX%vNB8;7X)&Ko7Gh+|FJ!}9_ zuwWtm>f-mUmkug70&RE*UPo&*9Or`gvElMjA19I|kx7bWnyc!6^6Bt-!XBYNdT`YJ zy;sQ~*?J)p;iD%ah3f0;i;Ee1>Y)IvA75@)giwiCDf?};``y#dqBa4F+f)Lo3!?&TG@#M^@WeLA zP*i6%S#B4ZYzvC^Y?XRIJ-n!1oO_szLKBs`L&(aEOC&p7pNaUKb*XA zAHD*g0hTtn`oQzfuf*u(4)aZX4XmOO?o#OmNE};T&aC8iGV*I%KdsKSlhGC$6n^DiM`U~QElV2UGtbm)i0O0^aa;c=W zG9fC5BMa7nA5eUL^90-PDR|KMW6X*W4A)SL0JI4g`I~eNI#utIgzMv)!C`c--^I`Zn{`Q7-x8hY z?iwkku%JxFlviP>>t>aol1Ic}x;1ZHRkf;$mt39@t{B`)^_2!|8lhGcn zDwiB95VE2_sQox3(CNo+q7!9)U(usSIMYFk0ColUDzK!H9**IP-wJ z6CPM>oGA9Njo6Q#$vDm#*Pe0w5=gvIrZtgOe5ifadAqvj>5BWQ(6G!w@qq;exfql>G`ELR<{mGqGn6q%I~mO|IaB!DIGod0azIZnc4&8A{%X6R1ph znXrv?IEP-X?VQ7EW5U-rpW)v9cvb1Vy~ukte?^psu!9ZrmDDj*1&4a+PNzTFn;pYb ze$r?T5Im8EN7$3!-!TG~2Rl2Y4A7X}H5Bz&>U*IrXh+++q_y+j-MeslDBV4lV+0=D zJuZvo|IsP;&ts2NF+z-%fX&+bNC%~51)0-3r_#~!uUEsjC&;H>w#cJ;C0+~86aJY@}`i_Zd zK9yVd*VKt#3Lc6e)5i|oOsmyFwP~uM%ydG3-&TQq)Bq&U`X{xIO7O%$8pn^P5;YC{ z$8bcN6g~sN6Mbh@6{>**0wwM5pxJVjyUUA=w@yX#V;7F^0ugVBPU>KDemRQyPlPVv z4lap)tP)|2^jurSAS6C3sZ-dgJ<+1#-_PzjsP5#?-PyOZtq{S76Y3YFYPhoD#zz>* z(m2t=gaO-|Waf!hSeg%sE7x7c4(iPb2?oz*D+W-CD7!RIjZd$VumC^u>&wWE zpI=7$`!RJs6V&(wT?Q78Q1Afe3cS3U`W){d{>jCV-&DOj4oUTO;32{xM;x@!P!RmX z)u!?FsW%;!sde4>b|K?9b=6J51d=gJU?*SS`u<_$Y2)%KZsCs0Ov-6K|1hCe|8!N* zX5dr#(TQ22FSzs%2T)}=z5xg>@m?HI43qQ`-@&>&%y%oVxcF;Ff)Ej1Fde61Woa4X zNwaS~V>!g~^V7zMByTz9nKNZ&$vPG7_4`?xc*nf_Nc!Fc}1oA39LY1$aeu_NP6oESbC%flVVbjJZ2%C0XObnDke!n03 zk#zwW;ri$ITA}G8kdAmYQ8hK%u(Sr`#~8t2ivB~K-L8CuCkBdrBt&{6T-9eGKh+o7 zgqgWHs7q(@KhxE^O>xMH#eZd)u>a%&2Ok~nLCr&<`|o}K{ph2zU0y^?H3z!S0L^RH zmiu!Lk2xu~#XQ2BqIVLRD8s|yFHQB0{QID+OB)rPQH`%N*WRgJ!|I^G<-bOB&BJ*F z0Y_-3J-FUMm%e`AK-~%jdrmIpU!DN$;<7YIrLUa6j3(d_gY9mL{o#U}@2`}i`D9>Z zEHi(MtHf?3`_VcG3|K-#ssWJ?vT%*POscFCTbu35Fl7Xg$88MA44iLBg>h9qk)gWw z^TRcqpzyXnHvQO99YhFJ;Y&&`?cI4^l>C8|VA_!MG;8g2AN zlO}#Wuc!bvZ)SE@EAK^py&u$}W<_iC*6Z4*PVMCVZ+<#S?d-dfx5N{*jonUrk*Kbj zUIj%#A?xKBmfk1No<%jo%&XEjFo4)eutbDYyBVo;2rTeN4hiT#U*D6UOX%f@D$W z^jMRm+2fNvya_gBDH9jvDeud9BSroXv}=Eeh!m_eRaE9(ULwQ-t|nAwL=d~9Bb1g% zKMG}6m$Xp3>Vm;X5^cer_&a;$A0$e9G@ZUIysTey{NIij#TcfrpnOV5BzDg_)PP9` zMiG|!W)dl&OMT$$S{mA98T)#h(YLfKjm(*Z9^`q*=i}P>Z_Ok?@;?c&G*KbVkcEI! zY*oUV^VPEM!fT`$kOsBa;1@k$rtao$>k4>h-L zpfvbc>(z6y{H-GbA>FDEveW%HT3Pn!kwI>M{JTAb1E2p`W?iVQFOu&YnNUq=iAP@X zNl#IuBnghi3rSkSnYeu#rRj0Wm(t0{?WE0Iaq;KF3hwl@Jm(2lKR2 zu82y}rbRU!R6pP=T%4e^md0lk6dc(xof zjSTIKm26WVHMl?^ZNNx|=Zm;c#jFqPw3bticp> z<5m12k~8p%Qjn20Njjf_`bT4XeHy^pqU!2hUtYqiQt_eKNPJ~P&TJG&u5Toc*}S=` zhOVym*9v7q5`BbCn3v-UWvdKVAgzbH8twM$ERA}%ukSH21a`*D!C{`r?0T>&KzU>~ zL*&*#b>F`$Xbsi3ar9%|QpkfKF2V1Ki32 zf2ejY!Z@aZ8o;*a`-XS<2+>`B6;x@Bzuz_TO%{NuB1-bh%rQB=ET4{2TQ9X=)0Q{> z5%-U2MX7I}9hh>T#M)OHB{V!SV#h(4&^)Q)GNUia0qq6C)Nma@xKv-C)jf-Ws1~mm z<}tG_0U<%}rMn)lvlq1Ho}tX5xvWbdL|V4oBBMJ`F4TW#c3(#q=tcjNFXt)+HtGKh zbjmBGWL$ha)3|nqW4ok_FdZwGV$O%0s{q8KBParRCIudAk4eN%{fm%T{&lYSovFmE zt7?p%kRwyKz|r&o-3VQ6!30eMKFiK|am^$hgs@7sP74)MueZajn7&BPKdzPH78_e$r|%oS%nb{5WLc zid!kSZ-c9eN6`zD4b{gWaB4|Uoq6?+&?!^!g5(mbwa!u2DNiG}&a|H|y+gAniMBNz zoghuZ{L<2GgM9Q~njitOpTOv+!7=zs&FH5a56=?6ZI*8~@szg@YCpu)nr{-p-*3}B z>p}$C;3uEe8+IfGbS8-uP?~CN(qFR_K%=C2BX>`8#|_&?qqULgRmhxgr>4U8hlPpG zVH6(4;7?$7f%4broc0C(!tN$ll619{y|e2jL1v5|WGT2RG%Xz+9Ee$Wo}PEQXAOke zMkzb`Hvjl`^ymq)Y6^!&-S5IW1l~QQwSV{ufe2+W^J_1#VdY&^?iq>Wrnyf{4rZVr zQ;}C`BjH3GoYc9M;nZEE|8fEl8VlO`r|%)n;M&#P_;lQr`i2TGG{p7lY!McPWnx#d z97l@WPEk!Vsu*=7G+O%`9f;h;We2`^UtYxMj&HO28ph>=CL@8jln1GeBtp&sB1qD* zp73J;Ee{l|z|Y}q!&nY`0dz*zu#dyG2?0H_qhL6s35YWsWNE59abeMN@2HS6wT+8v z2B=C-71TjmhQ~~b-tscRsY~MXI`iOO78==mJ1WSz2oc%YLh=oI+ zC+R_jqX^RK^T%up-*|2FFbSZ_s~%{3dp|YPYXY;{gU_5J>QKH(de7YFD$AjZnCI*v z#)V!RvMaM`+qHF_{qf|_kHOzx3Q2iQmb{Y}Zk=Q&3{j12B)0lxwzH=Zt6*x1aglgR7Y0}0uwu-hFPMO!PEdXjQ$)$= zW=fhZo~idIaPML2ho*ZBlJv6zq!KQgZv4L%fWkV_!IkFP5xdOpSu80(e*6f7uE!00 zk*#JP-sV5iq99tw)03yfT8&R^%t*oEcsuMwSQ)uZe@d z)zPsFoG7c>-$Y4YcXxC0PThHr_WYi!nz|+!e^K}J_Hst(rkR}h`bvB-{$q&Vx7st*#fM zb+dYv5yuBQEQUf<+X&bOocy@h+20safv2w&G$k{7&PAK_l4&2|0n;gCqg4W>-kc$` ziB}tI_;iz98Gy=i=cd68h|tT0?gm6E;*1B)bn4FQun;9m;F^b4F6h${Bc=0nUU;KF zpeEC4bA90OjkRDWNc0kbz8QNcci+j{HVw55Ez(a4m&@Kwt9VZ=tT~~377q`^X4pdw zV>XB!I;=qIx4P>)X5qg1hM_EiU1+K%`~c$Kf0D$k(o4KG`peD^Ft0BXr(*9poUx#365N$(|CM^{Pt#&Hf% zY5rF;({3zJ@4wgZ9 z0-%>8n$Dh}b+fJbfHf&FXq$J(xAY24k&X?hNsB)+Akkgq8q;7)^ih)lw=m4~pucBk z;tggo$IS+;BE{h&CY0h-5m(a3IzC$Wh}7%2>INR_{jJ1*XbYpSk=1WetZ&Iqr@ksJ$R}J3`-M~!EXqgJrRAu{TrvBF_7;d~A#as}P61Lbo=<& z`Js`xQ7TC+;RKz}`FkYy&yq=E1RvLK{GdUSiEvhhx9xC4eeYIQV>$V*gh(;r;&2AS zEU7IwjrPJm(fIzToQW8V08}p-Ad?xcB#|aD<)yA5O56EDlBEVp@{9Q*)rb7#ZtsK*K0j`YCeSe;_V-=Jy{eP9>}!_7lnlH@;)-vp1nqvr{PbCjrb`KO@M{) z+6NM4(sPyHoNXF4s2$$Wukbwj8K3a^@XFyuD(2m~GFaJV)0j0MDg$u47*fmDJx~*ImShF%WcPJmp-U&M~#`jH= zPnsu5M!3R*$nSsc{pxnIkll7-^e=b$t=pm{q-WCX+3n}k7WVnG21iAlIQ-~jfeV3} znvVXF0%5?2J(^*+4SOUB_%eynvMLYPMNW1`rhm)5#&V{)9kosk^ud!Gfj17%UgU9k zYWgen_)d{RS5+u2_Ss0&-%@rW-cHS3aeBEl*T6{wwHhQuR2o;6KA``=Br>Rx&?YZg zEWW>gUi0eD4R4fKwaAw}cn~B+60%pcIv-&!hKpHu3Vzg`Sbtppk+h$esl^jRIVP$g zXI1p9TZ+1=Ncb?_L{yo)XUiVj+YSpq=DhTf_Pxin`D&if`QLWobw?cUW^<&tW9+=g zN##^!{QL)zcg9Xm(#KOiCd(#tdJ0G|)FRlPDe*q23|OYGALNd->K>xbcs^TBeB7`o zil)%n!UW^05+bIt%;W-?f{%~NL~}Qf&-tU@>d;E0oe78yCr*E&qp{e=x&u`K1_(0~ z&|5*DA;NQv!5w|az)PAEX_EaHQFWxM7lv|jLc9Uj%{wnR6 zxz9cql0|90&2dpxVueaCI@U+2mFq!!u8fq>O1mVGPec1i{+{|)ig*~wNr}&>YWy35 z<%beS+aHge?QR<<+y~ zTA}Wxw-VUbB%*R&FT-$Mr_x|hO>}GWZnP05649Q^9gVtN^cBfnec`+asKSNVX;0If zpzvxUR(5v{1~1!8<4j@ezXeEe1h=C@)3N^ zaO(9nki^7`xN@Ud$m;zImjR?7$lJVk9GI^|*6cw% zO>`HlMe>ITN7Npn&@?8+0Bmx4wzCAt^*4OyF3WB<&n35#|2^da`=fLAryUee?S|K&l&FHzxpYa4Od1{26fd4}kAYI3uUEhU!Tag( z5DSAz=d?X3hHMNrLON1R_bzSe=j|ZSzvY%aLau22h{4F`cBcw?8&9lbSw7)QCVh_P`B8I6g?23P z+r%RgwIk+Kd6~>Yvb82t*e$nCUw4iJXra-@#w<8ZT4L5Db!PkG*STR!IzQd)Lrv&U zYqx)Y#s&m4mzo+RjB7(i8*;Wd(~m;!S2lGnj|Yb8sAlRYnPQW7&rvA#=&LIQv@r<$$A;@N&3IbfBztT0VX!N7M)@<@}-=* zLsIT2*73tBrFYY^ub~n-E&7rocIUT{(BGrliyiO#XG@>@ZJrj#HH4NkJ8&L5bu zmRAyg0T7nk9@IREw$ZR$=gp3)K9J2*>$md35?0MXZ-=Qy_BTy!j0?sd;1vJ8pC zv=$e0X&60`0^M=#K8g0eqlL#phF`C2XJ-KJvVn36e=JDR01QYfue^9pluG+5nd}dz z#zK(DlE(4}F)XqyH1n=ixHlM%-u*i<<@J~vn0Ne$tH(ZKl&=`nMP9zc<}$zMN&(V1 z74&6K(u$DTs9r9eGE9@Lu&HwNoeb=YFO2D$>5*d=VWBbd2-zf;)QpX$qaW;}+RZ6i zmd>;9hi7f`q)i=h61WL54AvPP*-y-a_gyzs03bMOT?0~~FwOie znDF4p2YD23CxA77Vuy`SUpypMA`=XxwEhl=(j^iCs}3|-)u@2Vg0&_<=ZT|(>% z_z!gaA%IzW9_8J}qI=_nnWLR$H{AcNx?}hUX|~laapVeVH1}uAS}T+XD9AsaIASto zWn10&WlI-o0>6$Y7dVz{q5*b;q6R-2*Lhb`R`~aGAaX)By{SDMs;?(upf(^#xGoo-&BBg~!;&-Rcz)>NcCCU2{!!A|+qw zCYjP-Bz^es6I5>CT`*GKH-Pcv>5tKrlOzc}QL${}UU zNpMrdbtPXt>3hc2jZ5mpPo;;)?I$*YyVt;hqoug6_-Qv-?>wNFT)0YA4cBFayQB)Y$LH5TVh@vQtN2+jeR;8%DUpm>S1-(5rRb<)P4aX6d%nj0cc;m``|%(?=*6OmzuN{7lEJfIM?)swh;Gz!&Ew8R%y;G&aN6std|v^(ng@bECC26S%1!j07z6*Ui{ zUVlUCLRK~G$P`aZ$dd%(FX@2I8mVv^HMJ3&bIf)SL~BGAAj_4%yRm;hgfXXg8l+1A zvw%x{gebt#y@S_ytlPdRaV4N#$;{o@3(N;1AA)K-|74gI*?_80`JvlaG6pEq3;b{K z(n+34B5&eqGw|TLs_+q?A41tElzshWiP5vrFwROfQPtsn7l|J*&rhBZX^yyH@8jS= z14klfZcYyR>$;~KQLTw-Ae>i1nTmh|BM}6r22%UEd3kqaGz5$SH8ZhiOOxB9SYS}6^N7Tqm&AECZZi0u*rabKwAa=0XA_Tfy{VDg@q%EH?k7u zMweQvx5omN*bEIdsOR?8@5&Tk+oV-2B&SuN4`pDKgfBuF)N16m{hR+`&32Xjq;|4uXq;q5Noml97-KF8Qia*90y zG##VT!S5@NYip6+;#TzWfZS$Bt)glQiUG`Q0Q(`ydKO45u=Vg>DD4wa%wvemr^#3=fAj&3@wVQq9J0N2r+}~ zJaOFrR|+0#%(bYE$P_LPbkc-dNoPH`Sp?w_7H;pih&^~I@Jed_RJ&+BIp zMF6)EPJ8iv<@1Rzhlve3@F@e5`5Prr!~_R0&bT7r_X<+xZNFbsN}}>oUcU?unHT?9 zsQbp1okw!;1TZB^O7VXgGIbR$mNMK1s24gLY9mh{*1(2BT60GcetN6Uz@U z9z?)xZ?2#`3ut^~ZxOben6Se(rXzqaf0%71g;ZfyKq~hVEU4&9+96Lg5SnV#_phnH z2ec!fa}g|ctbZO{1Lwhh2B%0*Ump``wE`Y{XkxI4V#sD`nFYf_=^!jS=mZ}~$*CUv6w_8eE&&dbG~G=pSE!Fy?K0l<$kgw$1+hDIq2XvpYl=oM13rAiht8;E-?f z@%Wviz{2cW=t_DxWpLNa-!6MyEwh<{v^0#lF!AqZ#xRHfpJ``->G`8QNdAot+CVhpXUXa~CIm;?Y zNkREWk1f!P!$63fIHCUV?qXz61KtuhC#RT*2*Qr&=ZU%bqyn2nSL%j}Il)ucP6pR* zy*J9s{pwheaR$NWz2sw4U~DYW^;tFm+MRU&`MFH#$2+HmbouwxON!;u+&a&QTC!Lu;C z_g@2^q>~*eQrK#N=xs9>U?f0VRjAahi22$RR9=JM5N(OtMb^ERaH^q2BaDL27=Uo2 zyJiqlV95j8$sfmAT;sqEfG-^24rOKTfgLNX==OoKt|Nep3pzX;#`Zro7FGRS`AB!5s~ zQ%PPP4mf;fdL#y7uh(0iM4r;Imr#l58KQ}3&orC;y^e(h7#w1V0hBDPvOQVGLeP!- zsYxl$hMUs77n51)68+kDzP;a4%C&24w?^Z{-W2hJ4}E3ZZYg#Vb(v3U7btv!)LVbF zwV>cc8fz=6l5K3ZfUkG^@N@uoxHb$CIY5C1hc{m}-ad-O@8A`f`|qYU^i z?KiYOejo+z&*j<3f3#UUD~Eh>KQU{B*#nh5{q6dn4sRnQ0ZkAu5j7WpZ$Iar>pr~I z;&jn+9{Z@(C!z%*|6t32y1FJz{ldbdH5UfaQqmXztpsT~M`;sF6lmLvKSirVd8C$E zKYv*_A)M}DtnJ`+X{pF%n!kj@X&T<-@Ree$*{dXkckBtszfF>7<(x%OFeX$nw})L5ob+N*sjLH<$=T zg**>Kk~1lEh91Y{aC;Cwfa?G_ySLaIn=1%b6uXk%(56VH=H!f_a~M~51ihC1c?J*5 z$e_^=UmivR?l5w?A0=#(#P#jN_b?l*H6P z(@$5xF_*xc)fVxJV3u`R{MXr+BI?xnG@Y~TV(o85W91k;U+H{K98qo62m)p8Gr^#S zyaZqCi|Jpbz_N1xTjEX%GCYt1PaHZ^UE7-(=;`5*e)8ziZZ4L$c}u6xnz!@Bg{i^% z2F#@DL((SU4*|F`IlUrQj)IVmpkG-VmQ|jfOoIa;nydaWAPSQjprL*tU8j=uL6J1h zmKo{k@GY(-2=#y2Fs`SUNy#ZuA6Fy(wqn`#+5LuRgvfT)C!J(VbZrl(!*2?CFKpa^ zz;WI$Fvii@vci0-p(-7>bW9w0I}GgkX9>oF6c0mNj@pr}5O$JG3iDloo8DONqPzRQ zFWmp+<>U@95*QbPoFbXIWEdUH#RzYu!#yR7MrqG5RO#Pm^|}7i-{QvpE1!RCox63} zV&ho$n8)?3>j%?%{+}1%k<=tFte;q{7h=wA@mV~FURq$h_SZj5jU-oz_F4c`4Kx&$ z84Ka)F3$n?3Meo?yuW)rLpHvVu1=Xg0wyi|oM7R{6LQxK^G=yf3V;L@C?&9JCTEpU9qI)h7rJP3MaszN(0?!zy^$0Z>Hd2wv1)af$!Qn+I5C0in zfBEQf6*j&MRga>rKQGcm{-G`NyrW|=U`Y%@c>~ys5fJ`{B?~WaR0`pL zdQy1LRK>(`)mhf-H_T26ozRjbDKW_Bn#=RxgR^amAViKU1%CL@wy-A={|y94_~Uqt zDCgUK+yzEuC@dXAtC?y0&dbY45DXbh!}Jyp-{w;*@R_;eSpU8zafH z7$)JT3iYKeraVHHqbW**58Zgh#ZyGWcXziAuKu_MVnPv&oi;B)n2*X~r+m!o1e^K{(>bXl*QP??mb_wLiDcnf2f;iMk)?m%rED5%_ZE zt~K8;O6Fr7YFB&|@rWv^eDUd9o-A+q-I z;{{Osn>H8PKgn|lz6rJvy)*Q^=ic6TEtvW=kN^8{<#p=^5_Jtm|A$73#rL-u{L+s+ zpcBd6cFtnoc9qK^>X$&J77;p}DiH>LQ$@on?s)FpfF8Bkh6x>6$|~wlzAS;!lGK!t z`+=vI)Ouec=~5aUrN`q8D zPuhRwk~L*V@}iulH&HE?wBQkd1ujg5s7cW|7-^113IMp;RptH58QIo zyU3DGEJP4!=*)4({>Jur?zptNG|BUyCsgTDim?t6%d~Oj0k%^(MA8~F8#XR4B5CwLfz{tH|P8r|xC@!|#!w$Rb52FOn;&&@i_QIKntdEl<+@n-es`1sfu z?rYnBe+D2Iyo8TIFpD|5;h^9}`E3!4g5@VVca@GF_4V|8_~5}MSp8~>0Y8R@i(ont z@>yAl-XGkFa*ebL6*UYz_V>Ja(KbO6t*60JID6WZ>8$5>w6$O+z5T0KqTu`;&Bpu* z?4nLG#{PD5@wYxNaW*hARYVr5r4N-!sRdCT;fnD$Tqevn)AZaJp|n5mu6aVpt=x)u z$`_`cQR#H^L8YY5*i z{{3Fftrdh1q1G|~g_m)__pDRo=P!bk%YNAEiL+4As`mQPThy%;NLXRh{v%f7itP8) z$_+3ck0_E?7#$$lA=vs)++65y6kB2&qn`_|({`h=F`z(3^=g2$l z_%WJ`usJtuk+AaCVXVn{txE3CnzfLVv#~)ck6`7d#RsPBlVgcXo)3L_!arfsYo`+P z-UF8k7OO%^&0{CFhG3icxPTV|DmiHR73RJeiy(uUn|ra=ijzJ9ww+lo0vkHbaVt7B zJ{hL&AZ)R2Ze{h%eY^<~OUMe5Le*j#|AqXicRWmESyvc*=7vkNyL^8IA$-sEo_=Zg9yP+Y>q5R@a7CR5+56(iiy>{&n z&S<)w7!yBkMO_9|BDlOPe9vZ*ne3A@fpt1lt?SF>DQ&o6pCUjG(E)wX>{JTf!#j2P z+iR5KJ|Cbp>%V97SWz&0!R}zfHb)SbMxEE8WbGYNO67wGmSl2TNSz%At0dPrxs1^> z`M%kHp4L*?h?BgTjVyfk%c-eiz|?PFyhVv=^1C7n{pFGKw=r?U{*2=R>{yUOv#C&e zfpS~;q%Jx;w-`ox69LF6*_78?yoh*Nc^IGwMv&|zXx;rDz(tCeg{U9^5g_RM~ z0K%r5f48wT-+oP*!sf=gwC)Ebljsdc?0?7aQ#kHCa+T*wUQQ6}USywirxnTGP7djDGJ^j8628<*{`Gv<8NOJ()zM#k|G^G64|AI;prhLeSi>bTZu!@CMLQs zogM*bAb(_6lu(*p>_Z@q@WkIzy#5P?OS_^R?d~C$Hh3n^pZ^v{!#Xh?mP6^xY1)sS6A?{R zj-yq)0i`I!ysMco?D>B_UgM_vk}|FFubM%=OVMK^hY}n+d3gW`AEP4=rz`}VfeA(g z&HmQz6D_z|?u{c}HX-Sl8$t8~2v8Ggrib^3WsG=76=FeCvA+;(psYvUIfx0XJ4v_~)yuPK(6mOSQff03!`2<*cBl%Id+AKu|Z zF}CvO?n9Gc4E0f5Sn@%0GMscn-#hBHXp9`H*_31~G$kQ@w^_)h-ed&dzpKYs#ESLU!=L#?X2@(l*og0DXo7SPc_9TpsYEp;mSc+d=i zbtF5qUB4%pdBG%H|D60o0Uk~ICLM2ITgS}^4ZhZVa;pc6(t$7OLL>Ly8v2f717g!6 zibefXsByD!Aa5IxWo22Knwp+D^AFQnh&Z8gW;amJ!TI=6LM@ z2g8{3oe<{zZH3%PbR@NxFSLs5JLW55zFP{uR zYZ3X+ER0@1ptulL-kn4F4Uw02ToTq1z(KYNBNU)d>{IDr{OUa?$<}hvc~k9z!6+x& z6UM&-q3lMa@(_Fg)8v;crVP^GLw%ibFnjIxf{^+B)mbWhT7G=}4TG1HKvTY&bJ+^{X=!P(;}1 zLIhg5VMT@sW}+B8o_^WrBrG4m16gmzIG^Z`r$t`mTKYef+om8URH#C(JYjw}60_i#h?|C+FfwAb&D zH0i$cl56bfi>?!>Qg`Pw5_od{Jy*ED%(`0G_%ZIhMlQYdvE^Ws0>pK2J=UKF<716nkWN8WviLWInDZM#DjoN8_0E#$DL*uC}mR zQWD9@=ffGg)f8f@ESkZNA;M>$IX0_p*<*QRhXwi>3dI6YEOz(Z9RA-`8M_mDe|Q77 zD71pj9ak(=5+Y!Sqfox<(&pa-DN*UH2wOf6f4Zmj0rkqEnyS{b!!ZIk_ONy4^FN;r zbK9+Y_|9W{@wfoq+ggnb=UO#wvZp=Qp+f3?hehT8-gKB)KFoj*z1J4=``+mr7$)Ee9ryVX2k0`<=p`2+N4T%h z^ON<^ef$9pZOJq-Y{aea)hifuAzS_HyVkUGL&bULvry&w*WVnDjhxU5=<(B5=9@F9 zGs&@Hmz_LLV)uggh_`H5?z%opQ~x7JCnxZi56H;;2Gzf(w^w~T#+kuBq{2<;LgZ$^89G$r9scrjr%0=AUU?J2&yVQaV!t*G z*I0a+^p0H(F30Gfup2l+c7!FTEWfo)$Dem0NOdPC1&3?Zy=gSkAjMzVv~dsV6+eNq z0S%7|v+s911v}KW%pRv*-VKk`ozha=VQ`>^ArLx*LTgIQCX{xu+dbKHo z30Mm8mHU#;8@oFR>nE(Zo*NA?4fPxEwcgafqqgf|VH)UDk zx*pXVkeRYUd%!3&!5l`Gg^!OJ#0&8kT1)Mj2`weslp-}^Z5@3fb-(#|_vIC;dR zj_xrzkM`p#lr9e^3zcj=4;0{PJC2KaVwUOcP%YyJRKr!V2RR9)h!HymF1O~NO3nW^dC_=!5fRC5hGz3?i-0B-f z@c~uOU%?4SKNE^gAkaBVLrO+fry*`jona)D3dK)`yHyQO-r%5i8Lqb3%9!delq2LQ zJvw!0ta{InR>r&57SD=(QYxriWV4}3VTj>ATGIn!UFx2_jTrubcF03$`J@x4^&3~= z=D(|BNDdVZKzw^{^R({*8RN=P1t%u*#3gPUdMQ7OE>82Wq|x?2S)8LLP7)u>HT6&* znhJ$FVPp-EVXPiNI~Npkg#EEwa>&)MrqC7Y`h*%ZgM3k{{C5`hPXj00$D;S~-riVq zYQY8(IZ&mpE}r2&@=)`xnbWy*IQ4@%*CeJRaBh+!gHLp{I-0fw)(K+x%e6Bt)-LF+ zy`8$JtcrAZxaWKe%TYCbFZJZZ-dp_FdpJg92g+G0>`KdwH3HE3N#$_m%5Mlbmt}aq z2`yWzUaVQ6s%^%kCMV~poLr~4UTLm|e3o1B0n)cRFc|?rLmQ6AG;yylgWXRK`9|4m zgd{tdS>SYzPn^rEDg2$SBzPd@0%&MYsZeErfQn8okJ@vZ)}DgJEWR7r7icI#VDZEA zJO_74kf#jUYQN5zFM=6gZV=xqtbJN~4BSehX?iAg>Tg5*SoEZ<5;JX*TCYhq<_|c7 z0fSq}(08zCKH;bYZ%X(*#^{izt2#S^sF})piyEKx7+OEB?tSnvzunIFV2xw)1Fbhl z9!cD`CCufxMMrbnzbhU4;dH1|Mn;D1Y?v~2872EoNw(*6OLmfkr3P!dl@?FM*ge|V3% zJ;s3FY(|n#PipTA>-+RZ#VVa?v@ykSoK{y?V=Pc{rkU&PsZh(u{uwQc2f> zU%6aPN(l)pV=`!NQS%CA_Ap^fo~P0oxFz&2EIsbyEo`F8m*j;_PkfQG|NQg6kAw#ux8;2M5TS%o9H(I>Gw^HG|O2Fy}FZ4()V|be9u>| zv$-UfgRjO9vvK5a@v2biNd!2O*#+yzTM#ykUF=>hTrR|8h!!0jgfZlhz~fR^cVwQS z?tNS!I=OAnW>UWFgffRSDA+Ma7oP59$(b67_*&WBk+)}jlEz>ge*^mstytiMi;GL* z^`!OvBl01X{7HldaE`>46E2fIeyU0l8!J6h=5py$yg%g|x*eeea)nz0@69TJ`=WZWULauI(+5GHeD4ZqDl&hLReGyS1eLcp9#smSoc?i+o06 zxPm8@ZLVcQa`m6ey2NE;zN8kP!rp1DIIti)8VprOfYt-u9E2QMbd{cqCo?LS9fVlTo_qBmE;9mU3@oH|XDr*?CJccjNVef640rAG6TSbZ1%NXxpg4krwtEAitp5U~vZ?PU~9BKyg&vo!7cX zM)5evjr}0r8P^)YxkF^^BZGG}$zAV7@h_jktubu7otX(g)-nIBHPm=auH2ZcPQQKo zby2fB1@YNVC278cY1VW3r;jhcifkBWak)7G^D<)5*swsbXr*35gguz2#gI%kDA!)6 zT#7QdPRQa2Z)GtF#rqEjuam_Ie~;`_i7(sWUw!W4;ZpTRN7>qxxne(4qwE^jqavQS zCptrw-&jlM-Z_^nF9+!PC)SSMc~{-_CcF5|!1KCBVn z{+7(O|9Z>ygDS4Q&aw+|{-8Ek86|0BV`GzlA}sRmMHlZU-SdV+ih>NVHQBv}l59YQ zjbV7P{;@DUns4VenRf5HfL;Q2r@+?>#Hj(RfUBF}rKsDAP&UOd+dozQ4$nbp={Hn| z-4573a-_&EkVH&bE?eE7PKl3&-<(v+J~GbG{oq)k8@->STn>mQ@Vkohsxks+AfD07 zyP$i0vG5>MdUDIr9=BS?)8gd4@1`BU=L|Q*7NWHP2Mb_EuA^DIKerLd)*{zjF|XB$P*kq#k?TIA3G2ZzZso z9&cpFA&ED;BYj!t7RBj{1|rLu&K=Zghg5|G6Os>H8oNmexx=)nE>p4%9S2Hv7KW!X zk`X`C^Y)RC{rveeTq}-C;DR7b1yfyZY__P*sePozs~vH zWL;Hj<)61m{9Txum6GC6Yjxo@b2-bi_;2Lb3#h^m@eJ2%ywFJUx}`P4v(&!K#lbBt zBQr@)ccwBpI2Z~z2#!ff2nM3M;YZZhdewB!SvX>l%-;;yl-xcQ=!^(z9;6l2$=l+R z$rtJPrKqEl!%?9u9@|pk%Rd|6D~m3Y@)FV(b$+(Vx!kqQ`!KD;6{_YOXhX~DjogXP zE&>^1Z>Si?H2tESHExg>F5DfQ<=D4RJyLk|d8f-#a>Qiv>3$btAiD)a>$xfWOg0Wo8^4uB0Wq!k}h~uLa=HK5xP}5r8lP zW^T6TlZ<0_tyWKUc#reWvWpMao>kx52>N5tVK7E(cXc$3ZZX(z0>VQ#WEd)WXdQt%t5!)ABThxX!{TC}dQ6 zrf8N`XmcV|2!ZeEu4C{*_`)ZG+jxYTaO3v}^$SnG#KZ7`rCWf~_=M+sYj2245q6Rw z2u^#}VbaCUUhwf)sHRe|==lN)Wc!I^(CHUxkg6~cN0)8#=x1uxF(!YH`E$BIPR;Q~ z-XNcvZ=;Z&n$>tFqmc^;GE79s^MWDD5HEE!^4E;L<|$EMNj~+8k#)O$JVTfJQVgv# z;vFR{Nc+STnHcTY|N0X$o0Jla$1M+}z=sS@5*|i>@jcv&hx!-_)!1&RKjkN=VV$!P z|A%Z}e_!|n5fg?d{)BMa(Q6CKK8lhG@a@+4{&eL!LP>+4h@D(c(SY-f8_$3;o`(ps zGiZmCPvyb15If@%Q*h`pU$xleC3Oo^BZ%d}#iUDrZ#@ z{vsjQJ1`1kkU$&uLQ3!03|jLj4&AHWTDHslR^c&*Igu*hk~k&ST8ULq7aEfsImSoJcqW+k&a-XLKQMH5yfLIbU- zsVOck{j<87{EAE@<@o~d~qhLiPIu>h@;(y^ErE zEBKwYtMCBBrl1#>&`M`IgEybCz#FHol|`$?%GclcFMfo(n32;#gvM*$XZI3|gx6M? zzDh^b3F=A}LMA2^#CQc#@&W(0QE1}v?%qlG2`nY`I-Q^Hi_=o1>89V)2*ao_;jGX( zZ*TLW0UyOYJIOUvoYg#j%;%}GTlAspjve$hx*Doxs{H3>UMyX0Ng2Pca&`RYA8o!Q z{F{qJ|N4#P8Az}(4VhjI&NdUIDp#q}?%-5=YM0w~$MKy(zzMGSD6Vl7CDWaw5Vy0T z75&5XiZ_(`sv1k(4vX`w8!4$0CzdzwJ6RNeaoE??n-)<0Ozpiz5be_CQz{)T@O#!I z@(LY|SF4O%U`Hz=ri3qF!n%ZZ&AX7vo*VJezHIGNVx#?>Ye>~FWTBJ)&SgoSjd~ZE zy@y9tT^-nM=r9BI0cV9J7!^^t5^q&OPexkPxuYpm=;+y60tfBNjlXaZQ^x*rmd(a` zf}x7n)vL&%07!TJx6`d47#f}?ux_VwDz4{J>U_)Jgu55zgXoR6YP?bV@lu9f39hJ; z4b%XJbHcwZRMI+4ck&|e^Qwn4y)eMR@ZQl8!9pN4C}})HpBbkW@Zx~$B-!!~dEn7B1I*z`;UK*~yQL6RSbQJC2IQ{7C?8H6txOj#uY@%q`UM-o(1}nFYeoEf? z6XYD6f;&64>TKW{221v5-M2ja7f=adv_60C96oECmpb}VF$aEKDj4O+WU>goG^5S; z#Bt-0`6;0{5Bq;Un%3`Ud^qnYF_YTmVVKXZG@xH)RYA-pD1ImTTdcsHV zz4h8%y%N&)PYB#Vv|{JxR)(YxpS^q2x|4?OlFx_lE3mw|-L#&OznoaSzip_>4XCIl zpQS<`0=`r<-QYOEMhjpem%PUWKvzn)-9a?4m_z6R=z6=!kUs=}HMrYLteyVD?L7J5 ziT7-cn**`a5}8!c(tzDe=?Sgl!AHxvK+6#m2vLpaH!eN>xxf_=X$Hg(ZL&S0zP{f5 z>0~&N-uNraj2`OY`KqOZuU@{4jgQB??L?^&rbtBtnYp#PbrS&W`du54UWjQu~^76ZZn@p?@*A=xk zcs{hJ9jCDIvTE5&C|M$8-oeL+-lv)xFAopkKuaG#HfIdQ!3ykyfVIg8Y<|!-e8|`? zVbMUraQ|d$PWpXoT#Y=35yZw@g}oAg0Drz0+2fdf>sG^;_@nPp>J+5`G6me~!P+<# zzTjk%<>Fw7p(`oVgcr*1r7c)2MC&=MEaGdYkqsnkuZ|_kY_qeoww0{xuA(dm1)-LK z*e8q^0lPOkQh~)n(HMdR^Yiy#IfazAAP@pbvyUQ#dd%%`enssx3yYO#I)3g%3Kk<7 zG^A<^c+`6++1~6H=oJuj>JaYbi&a8x9vDpp58eM`Ow<9D# zIzt;ZIutNW?-E|X+668n}O^`O~BaDi6Sd0pJcGP#BzWq{U0{ zTfWfFp5|%XSt!;xKT16?S#9d*?G$p=|9qCnez9mSv66zF#|UF=Otl&h^nzphsdLOv z&=N|cRCthH9>w6`1JMRYWNeFWwA>7?J^0pHHkik*Rk3NOFt|U&Z9a#-_=-#I4VXUg z6TD+4{P)wJrigKLwO3ojt_}+B+zeoPZl8MrRw(Gl(sFVbba{JJQ zJBzB?f_=o%Lb$PzW35&7^M`ltIC*qEr+HdN_oIm_c{-sOKBe(@QUS=gb#IU13^0 z-f+)yr-|Ur2)6VR<<)`o_%N4~#l{7h^l!LBTCqDJW&@Wum;ai*P>`i6!>pU}s6+Gd z&O%2)FyW+3cK#Y|^nKE5=d;wo3h54S&b|J}WAG#!ZJTve7%l#%IDG?q`k~>bXMoIbc5`C6!Dm%!FPQ!jFroGo+#}s z&A5*wt%CYRWY2E8b9eruwpgO%@jM(fFS08t@s#Agy8fa5zp(QGCKRwSTZ)t%*2bq^ zA#D-EhgMcKK&W_`kYsa*gOMMNb7$}SvGZ% zPKL*l)HkL)4o+lJ)>@t*3Hr;$=rN(~+=tabR-u3l90AFAEx*tYXDXpTOx{<2FRJ7D z&gD?HPF1KLyPECotykYy{I}P?A!eloTJ!z;AD&)DWaV&wWGLZF zyKH;RgZ(*A9>$1Vpd@_Pc@}AAED&aYsvyRn+FMH^xbs4F6FB`3#Rq$MF4EQC$-QZj z{4vry;!U}_SufY>N+YKKIB>}+D>oMuOk&c4#STUoWXfRO$4s*`^j62&tehM?3jn!d zFJJQ6LLnOt(pa?-@5F0|?&-C&$m+*XwUG|Az`&!O_fD2Cpji&)aDO~TmG z58|wlF(pnvLjY?PXl+hGmO)nk<};=6oT*X6*KG)Yhsii9WB!tx+;7x5 zG41+`#%TbA;jS+jvG^it3ThW5UQ8}v%+~hJs{X?4z>CKoHg#9j{wdUf==Mk8eQ-`+ z=g<*3Ch&A1(+Dx^9Y5Z@^4=O|SD$f*k=9uW^5m2=j}O1_|G+w`A46rR;Vo3H+Wt~b zd_+y@qLO2~&=#{sR4D6-Gj3h##ohX=_D%0uI&&H(58?2wh!-Bq zx+-kA2SZ}&{lhJGRQ_*?mgjQD{YTc_d#HCFC-6yr45HsrB2#0LUZ^9-RvZ}rG`1lo zDnaAQ1u|ipXqTiIn!m{jx5cI;KHpHWD>}j=@22N(`RVwG`JHv;$6ueuatU@f!J`Ue zkQ{SJoAa;3FuT9v>Qk0I?EEEBOh%Y(p0_&WO)t4m%fu%tN*SS+jHQF}copF~jM_n5 zwc$%=Y*zVxL`HfU^Q$Y%PV

Ken0TC^0X$)ZbHMIAT>lqsz*aZ8O-*s(DdVIeCeL zJ+Z3b%!~JqFN99MO>Z5V64M%2<#@)}Xe%N)6He}%?=vitzmtnPtbZ_2;sO!|eSH-C zMXV$_rm{^L(>^SuVsoKh6x<=2mmHu88wKc-o_<#R(n>(M)%~o#J+dAp9KFqxtr>1( zy|zY$3GyW^2Tyn=P3ykUwjk@FZk_@~ Vx4(S++UySe(bY84c%Wt%{C`Vf?Zp59 literal 0 HcmV?d00001 diff --git a/src/api/interface/index.ts b/src/api/interface/index.ts index c7a5001..9b17b0d 100644 --- a/src/api/interface/index.ts +++ b/src/api/interface/index.ts @@ -1,11 +1,12 @@ import request from "@/utils/request" -import { type aiChatForm , type aiTableForm, type aiResponseData} from '@/api/interface/type' +import { type aiChatForm , type aiTableForm, type aiResponseData, type aiResponsePictureData} from '@/api/interface/type' enum API { AICHAT_URL = "/user/questionSimple", - AIPICTURE_URL = "/user/picture" + AIPICTURE_URL = "/user/picture", + AIMUSIC_URL = "/wordAudio/handleAudioFile" } //对外暴露请求函数 export const reqAiChat = (data: aiChatForm) => request.post(API.AICHAT_URL, data) as Promise; -export const reqAitable = (data: aiTableForm) => request.post(API.AIPICTURE_URL, data) as Promise \ No newline at end of file +export const reqAitable = (data: aiTableForm) => request.post(API.AIPICTURE_URL, data) as Promise; diff --git a/src/api/interface/type.ts b/src/api/interface/type.ts index 5db48f2..f295982 100644 --- a/src/api/interface/type.ts +++ b/src/api/interface/type.ts @@ -1,12 +1,16 @@ //AI接口参数 export interface aiChatForm { question: string, - userId: number + userId: string, + sessionId: string, + token: string } export interface aiTableForm { picture: string userId: string + sessionId: string + token: string } export interface aiResponseData { @@ -18,5 +22,8 @@ export interface aiResponseData { } export interface aiResponsePictureData { - -} \ No newline at end of file + code: number + msg: string + data: string +} + diff --git a/src/api/user/login/index.ts b/src/api/user/login/index.ts index d542bb6..36c719e 100644 --- a/src/api/user/login/index.ts +++ b/src/api/user/login/index.ts @@ -1,8 +1,12 @@ import request from "@/utils/request" -import { type loginForm, type userLoginResponseData } from "./type" +import { type loginForm, type userLoginResponseData, type userRecordResponseData } from "./type" +import { useUserStore } from "@/stores/modules/user" +enum API { + LOGIN_URL = "/user/login", + RECORD_URL = "/user/queryRecord" +} -const LOGIN_URL = "/user/login" +export const reqLogin = (data: loginForm) => request.post(API.LOGIN_URL,data) as Promise - -export const reqLogin = (data: loginForm) => request.post(LOGIN_URL,data) as Promise \ No newline at end of file +export const reqRecordGet = (id: number) => request.post(API.RECORD_URL, id) as Promise \ No newline at end of file diff --git a/src/api/user/login/type.ts b/src/api/user/login/type.ts index 18613e2..4390dba 100644 --- a/src/api/user/login/type.ts +++ b/src/api/user/login/type.ts @@ -1,3 +1,5 @@ +import { number } from "echarts" + export interface loginForm { username:string, password:string @@ -12,5 +14,21 @@ export interface userLoginResponseData { username:string email:string token:string + sessionId:string + } +} + +export interface userRecordResponseData { + code: number + msg: string + data: { + flatMap(arg0: (session: { 文本对话: any[] }) => { username: any; content: any; createdAt: any; updatedAt: any }[]): { username: string; content: string; createdAt: string; updatedAt: string }[] | { username: string; content: string; createdAt: string; updatedAt: string }[] + sessionId: string + 文本对话 : Array<{ + username: string + content: string + createdAt: string + updatedAt: string + }> } } \ No newline at end of file diff --git a/src/api/user/register/index.ts b/src/api/user/register/index.ts index 202678d..c140cec 100644 --- a/src/api/user/register/index.ts +++ b/src/api/user/register/index.ts @@ -9,4 +9,4 @@ enum API{ //对外暴露请求函数 //注册用户信息接口方法 -export const reqRegiter = (data: registerForm) => request.post(API.REGISTER_URL, data) as Promise; \ No newline at end of file +export const reqRegister = (data: registerForm) => request.post(API.REGISTER_URL, data) as Promise; \ No newline at end of file diff --git a/src/api/user/register/type.ts b/src/api/user/register/type.ts index 79df6b4..23cfec0 100644 --- a/src/api/user/register/type.ts +++ b/src/api/user/register/type.ts @@ -1,8 +1,8 @@ //登录接口参数 export interface registerForm{ username:string, - password:string - email: string, + password:string, + email: string } //登录,注册返回数据类型 diff --git a/src/api/user/show/index.ts b/src/api/user/show/index.ts new file mode 100644 index 0000000..1cea8bf --- /dev/null +++ b/src/api/user/show/index.ts @@ -0,0 +1,12 @@ +import { type UserShowResponse } from "./type"; +import request from "@/utils/request"; +import { type UserUpdateForm , type UserUpdateResponse} from "./type"; + +enum API { + USER_SHOW_URL = "/user/show", + USER_UPDATE_URL = "/common/upload" +} + +// 获取用户信息接口方法 +export const reqUserShow = (id: string) => request.post(`${API.USER_SHOW_URL}/${id}`) as Promise; +export const reqUserUpdate = (data: UserUpdateForm) => request.post(API.USER_UPDATE_URL, data) as Promise; \ No newline at end of file diff --git a/src/api/user/show/type.ts b/src/api/user/show/type.ts new file mode 100644 index 0000000..f764671 --- /dev/null +++ b/src/api/user/show/type.ts @@ -0,0 +1,21 @@ +export interface UserShowResponse { + code: number + message: string + data: { + username: string + email: string + imageUrl: string + weatherImageUrl: string + } +} + +export interface UserUpdateForm { + userId: number + file: File +} + +export interface UserUpdateResponse { + code: number + message: string + data: string +} \ No newline at end of file diff --git a/src/assets/fonts/DFKTL1B.TTF b/src/assets/fonts/DFKTL1B.TTF new file mode 100644 index 0000000000000000000000000000000000000000..2dcf336db12a67dfe330716bb298d5856742bbaf GIT binary patch literal 42436 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�Z1tlwYFm*{JFz_&bMc0Q z8}B{66g5|H*X-W(%b#Khaq5*XFQ(#7&6L0PQKH6)kE)jP1dv(xiat9Qc6ABTnh_kGt7m@2`PT?|TU*4!s_F0wXQ0yBQnjCY^N7rNRPd z`=XFd+4*Ef2(zh5*7Z3(Vuqv9Iuzr1jyQN%qu z7{|gH7*_h!Bw474VKO^fO1C^&l4iH2f1?s+-%^-}CcPLfOPqbV8i{w-S&7!Nj+3|! zJh>vRWgL#juo@N}%QYodyshYDcv`%!GMN?Fx9k{HLLCjmX1*Yd4v-iiq3_FvoR=FQ zu-idyuU`h}U@t5lUf&pV9hbXft6eCZdF;BAo8H;OM=BL8b|&RVA|qH__-?j#a++w4 zG|H`%C0h1=E8$dk3+WPlDF3KdL-(olGHo6o|EqwPiA&@38I?Z@Gb|? z8k#&psyV>nHXs==3?SY%8uS{L)cXaZ;3*IlfZ1(Be_&|=M$tYDxpnA;>R|ExYt@kl zwr1>+Wh{U1Ewjy${Q7B`377*x9YM=Z2+8juJhF#XFfY^p^zVW2HPT zMLv4lCEGc#2`uPjY_2UGYY|oOm^oTVn1Y_TD`-T)&0;B$Yvb%@@PbpVJI^;*2rBv& zOC}p{3Ou0>#=2$&Hfd6gV@W63<#}j{Z7 z@)|@JV94;_KpuUbL~PWz?Ld@4X{jH;^r^r{=0B8e(69-dGU}sz4mO4k6w0IURsDf1 zbb^VhRe5v;Lw{O;VZm2pnuv{8s+CJyXJE|m#ScktD;7Z|{K&l|PnVbTDvuvqYn|+N zF-p94qrFhhWi}5lbnS(Dk%bPOxbNmUV#^St9s{F^5iOhvQsO*HcZO z2B&33vz=(lZ_UIf9q|xUG%(jLXCsznG!L(DmFic%W7*PmnSo+)>)eoTYHWz#x97|L>(vCZe;AmJ5H}oE?4vU zdmlPKUfolyFgR9lq4bV@6;DQUQF03VI*#M*b|I$L$C~S^do1VbQp?MXtxGV{o^cf4 zP1JAZ71wKG_zRe3wRl>%Hgk%nyY-uv%0kNb{1$YXP{r!n+VT8uN(w+ef6nFUhjvzZ zrXc3u3p2q^!3;1I^$qPlKwn=-VB&pjBD3wAdl#_TcXfS%AfZsG0}?<_LFVt7L8l_P zE2!2(*p8$Lz{KF=L4*#VZX*@}&^}pk<}u>+=N6|db5}w$79P!9uhh5pKDR525qt7F z zWFIzNBxpmZX1vAU&AMT%w4}KglV6ycf#K~<(sEMiiB;h`=@w7}W1ME>$=%XxELXQ?7Sm0)O2c9)6^JL<=ap~IomFhdV<>6Nh! zc*X!q{n#NO1SGz`tB3I%B*;O_Cqh^&;7K6IflEiy>{lOigQ5@Ex;luo5MHsp=^{f3 zxrbMF7yY+BKfbW6xQ?^u`A@xR;t42Ah;B68_{y11;=Ck?;pp0o5W!wWiOK03zc9t) z_2{Wj_1;DpGvB-}6Tj}E=btLQEa^;MTe69w$Fg3rusCY(ib@%++itek4oz0RCHF;)kL~j7WL0ztVcFFXD}&c?sBqbg5Mdi zc`zGpZ)hv@5}?p0`vDt>$26cYWcg8H)wE1AZ4h%1BHOie=L=acan;lNg4^A!+CB^uBH{5dY|tRn?}cR z!+b0!^VlxDo3dk^pvrHEx$+X`CPYU{VqZ>I{U)rIM&=nZ57<5t$ZP(hSj>A#2|Bd%S#GbnGZ*L zFKmrY9hrZ{y}x+CHUy{lHW^#jjv83O_;8zy|)avz{GAVEZleP`bP6pYyl96d-0v;~m>_$%n| zK*SjA8)^u41P(AzCW13M=EK>{xzdDH@?FaTwtgw%Lek+k5!EVx0u3_pI9M7xW`NZ=N#9y6S zD|c7-JoMH>i~E;txxB-nz<*rv-kqTS01jmE{2mPKBcr~8-2T&|F8lya z17;lhm-}lKg)2-gFlJpQD=V)qL(A@$6=Cymp{cC$KP&-$c1l&pp$r z^uBR=8mewxeFA@fR#He=t;7tmH5zG%*i>z8?tM}w-(|_CFP?dZlFE&J)v?O`jv;aN z-kY7Rjf89bEmQcjSizeul@*wvKP>y)0E~4Big2$AJrjCc==so3Ls!OchJFkBGX4sl z95`oN>%inFiwYDCX3|&lFpxnU#{?}9{V{Cx7Wvg}rUT)DI~dqt8(jpM+Q6ZrHg^NM zA;7_a8A3jj_u*jF?uM)x>@gQeAGshi2eJPcl7*?+R)Jxfd87AQ%Cn%5{2URfS%0Z18Uz$LtFn`2$M~`n^VMYC ze-k59Fmeg>?C7B zBRp0eU7@+;%o|~l$0uoeF&J;q1d?-2#q53a!PmUgCSq}m!pY3-xE53pFMn~Kpk~7O z7>1|aHxis_kOFQ@7!HZ4$rdXKYFJ3g9BJVqD;;j&w??K2%On{t!)Y%%85qju3|w=r^Zj#{5@otc@=XCHIz+DdA2v{aowbQaY#Tg?fvOT^PR9^r9$V$=3J9H>mXc7R@KS&J&xdjBfqfZ3R zN3=|V*pXOILYL1ncJH~hO6}~%t1cRQ;zyw8UZRtU1Rk#4QJe6yl2qQk`Rs02nd<$? z`8^o1u`IeWE|P>5zC$DIO!I4sw0OhCk%BkT`*6jvWP^x!I8#Nf84s`T9@BAX3fUJf zT!Y%_eHaFWmi#p+yGE=s+y%Z4?XzU%@{30|@w*pODp$Dt4oI#%$0Sc#EOr~|)|^

C+ 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 G4g5besSASu literal 0 HcmV?d00001 diff --git a/src/assets/fonts/blomster.ttf b/src/assets/fonts/blomster.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b342c50934838a6fc0c80176f0ce2a3fd9a2bee1 GIT binary patch literal 44628 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/theFonts.css b/src/assets/fonts/theFonts.css new file mode 100644 index 0000000..fca5426 --- /dev/null +++ b/src/assets/fonts/theFonts.css @@ -0,0 +1,4 @@ +@font-face { + font-family: bigWord; + src: url(./blomster.ttf); +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 4c51d67..42a5c84 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,7 @@ import './assets/main.css' import * as ElementPlusIconsVue from '@element-plus/icons-vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' +import '@/assets/fonts/theFonts.css' import { createApp } from 'vue' import { createPinia } from 'pinia' @@ -17,15 +18,10 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) { } const pinia = createPinia() + app.use(pinia) app.use(router) app.mount('#app') - - - - - - app.use(ElementPlus) diff --git a/src/stores/modules/user.ts b/src/stores/modules/user.ts index 98cd07b..e6fda8f 100644 --- a/src/stores/modules/user.ts +++ b/src/stores/modules/user.ts @@ -1,36 +1,86 @@ import { defineStore } from 'pinia' -import { reqRegiter } from '@/api/user/register' +import { reqRegister } from '@/api/user/register' import { reqLogin } from '@/api/user/login' import { type registerForm, type userRegisterResponseData } from '@/api/user/register/type' import { type loginForm, type userLoginResponseData } from '@/api/user/login/type' +import { reqAitable } from '@/api/interface' +import { type aiTableForm, type aiResponsePictureData } from '@/api/interface/type' import { useRouter } from 'vue-router' import { ElNotification } from 'element-plus' - // 定义用户状态类型 interface UserState { userId: number token: string username: string email: string + sessionId: string + generatedImages: UserImage[] + currentImage: UserImage | null +} + +interface UserImage { + ossUrl: string + createdAt: number +} + +// localStorage键名常量 +const STORAGE_KEYS = { + USER_ID: 'userId', + TOKEN: 'token', + USERNAME: 'username', + EMAIL: 'email', + SESSION_ID: 'sessionId', + GENERATED_IMAGES: 'generatedImages', + CURRENT_IMAGE: 'currentImage' } -// 创建用户小仓库 export const useUserStore = defineStore('user', { - // 小仓库数据 state: (): UserState => ({ userId: 0, token: '', username: '', - email: '' + email: '', + sessionId: '', + generatedImages: [], + currentImage: null }), actions: { - // 用户注册方法 + /** + * 保存用户基本信息到localStorage + */ + saveUserToLocalStorage() { + localStorage.setItem(STORAGE_KEYS.USER_ID, this.userId.toString()) + localStorage.setItem(STORAGE_KEYS.TOKEN, this.token) + localStorage.setItem(STORAGE_KEYS.USERNAME, this.username) + localStorage.setItem(STORAGE_KEYS.EMAIL, this.email) + localStorage.setItem(STORAGE_KEYS.SESSION_ID, this.sessionId) + }, + + /** + * 从localStorage加载用户基本信息 + */ + loadUserFromLocalStorage() { + const userId = localStorage.getItem(STORAGE_KEYS.USER_ID) + const token = localStorage.getItem(STORAGE_KEYS.TOKEN) + const username = localStorage.getItem(STORAGE_KEYS.USERNAME) + const email = localStorage.getItem(STORAGE_KEYS.EMAIL) + const sessionId = localStorage.getItem(STORAGE_KEYS.SESSION_ID) + + if (userId && token) { + this.userId = parseInt(userId) + this.token = token + this.username = username || '' + this.email = email || '' + this.sessionId = sessionId || '' + } + }, + + // 用户注册方法 async userRegister(data: registerForm) { try { - const result:userRegisterResponseData = await reqRegiter(data) - console.log('Register response:', result) //code,msg,注册成功请登录 + const result: userRegisterResponseData = await reqRegister(data) if (result.code === 200) { ElNotification({ @@ -39,10 +89,7 @@ export const useUserStore = defineStore('user', { type: 'success', duration: 3000 }) - - const router = useRouter() - router.push('/login') - + return true } else { ElNotification({ title: '注册失败', @@ -66,19 +113,17 @@ export const useUserStore = defineStore('user', { async userLogin(data: loginForm) { try { const result: userLoginResponseData = await reqLogin(data) - console.log('Login response:', result) if (result.code === 200) { - // 存储用户信息到状态 this.userId = result.data.id this.email = result.data.email this.username = result.data.username + this.token = result.data.token + this.sessionId = result.data.sessionId - // 存储到本地存储,确保刷新后数据不丢失 - localStorage.setItem('userId', result.data.id.toString()) - - const router = useRouter() - router.push('/') + // 使用新的方法保存用户信息 + this.saveUserToLocalStorage() + this.loadImagesFromStorage() ElNotification({ title: '登录成功', @@ -86,7 +131,7 @@ export const useUserStore = defineStore('user', { type: 'success', duration: 3000 }) - + return true } else { ElNotification({ title: '登录失败', @@ -106,23 +151,127 @@ export const useUserStore = defineStore('user', { } }, - - // 从本地存储初始化用户状态 + // 初始化用户状态 initUserState() { - const userId = localStorage.getItem('userId') - const token = localStorage.getItem('token') - if (userId && token) { - this.userId = parseInt(userId) - this.token = token + this.loadUserFromLocalStorage() + this.loadImagesFromStorage() + }, + + /** + * 从localStorage加载图片数据 + */ + loadImagesFromStorage() { + const imagesJson = localStorage.getItem(STORAGE_KEYS.GENERATED_IMAGES) + if (imagesJson) { + try { + this.generatedImages = JSON.parse(imagesJson) + this.generatedImages.sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0)) + } catch (error) { + console.error('Failed to parse generated images:', error) + this.generatedImages = [] + } + } + + const currentImageJson = localStorage.getItem(STORAGE_KEYS.CURRENT_IMAGE) + if (currentImageJson) { + try { + this.currentImage = JSON.parse(currentImageJson) + } catch (error) { + console.error('Failed to parse current image:', error) + this.currentImage = null + } } + }, + + /** + * 保存图片数据到localStorage + */ + saveImagesToStorage() { + localStorage.setItem(STORAGE_KEYS.GENERATED_IMAGES, JSON.stringify(this.generatedImages)) + console.log('保存生成的图片到localStorage:', this.generatedImages) + localStorage.setItem(STORAGE_KEYS.CURRENT_IMAGE, JSON.stringify(this.currentImage)) + }, + + + // 生成图片方法 + async generateImage(prompt: string) { + try { + const requestData: aiTableForm = { + picture: prompt, + userId: this.userId.toString(), + sessionId: this.sessionId, + token: this.token + } + + const response: aiResponsePictureData = await reqAitable(requestData) + + if (response.code === 200 && response.data) { + const newImage: UserImage = { + ossUrl: response.data, + createdAt: Date.now() + } + + this.generatedImages.unshift(newImage) + this.currentImage = newImage + this.saveImagesToStorage() + + ElNotification({ + title: '图片生成成功', + message: '已生成新图片', + type: 'success', + duration: 3000 + }) + + return newImage.ossUrl + } else { + throw new Error(response.msg || '图片生成失败') + } + } catch (error: any) { + ElNotification({ + title: '生成失败', + message: error.message, + type: 'error', + duration: 3000 + }) + throw error + } + }, + + // 设置当前显示的图片 + setCurrentImage(imageUrl: string) { + const image = this.generatedImages.find(img => img.ossUrl === imageUrl) + if (image) { + this.currentImage = image + localStorage.setItem(STORAGE_KEYS.CURRENT_IMAGE, JSON.stringify(image)) + } + }, + + // 清除用户数据 + clearUserData() { + this.$reset() + Object.values(STORAGE_KEYS).forEach(key => localStorage.removeItem(key)) } }, - //getters计算属性 getters: { - //判断用户是否已登录 + // 判断用户是否已登录 isLoggedIn(): boolean { - return this.userId !== null && this.token !== null + return !!this.token && !!this.userId && !!this.username && !!this.email + }, + + // 获取当前用户的所有图片 + allImages(): UserImage[] { + return this.generatedImages + }, + + // 获取当前显示的图片 + displayedImage(): string | undefined { + return this.currentImage?.ossUrl + }, + + // 检查是否有生成记录 + hasGeneratedImages(): boolean { + return this.generatedImages.length > 0 } } }) \ No newline at end of file diff --git a/src/types/amap.d.ts b/src/types/amap.d.ts new file mode 100644 index 0000000..d2f1030 --- /dev/null +++ b/src/types/amap.d.ts @@ -0,0 +1,71 @@ +// types/amap.d.ts +declare global { + namespace AMap { + // 基础类 + class Map { + constructor(container: HTMLElement, options?: MapOptions); + destroy(): void; + add(overlay: Overlay): void; + setCenter(lnglat: LngLat | [number, number]): void; + setZoom(zoom: number): void; + } + class Marker { + constructor(options?: MarkerOptions); + on(event: string, callback: (event: MapsEvent) => void): void; + getPosition(): LngLat; + setPosition(lnglat: LngLat | [number, number]): void; + } + class InfoWindow { + constructor(options?: InfoWindowOptions); + open(map: Map, position: LngLat | [number, number]): void; + } + class Polyline { + constructor(options?: PolylineOptions); + } + class LngLat { + constructor(lng: number, lat: number); + } + class Pixel { + constructor(x: number, y: number); + } + + // 配置接口 + interface MapOptions { + zoom?: number; + center?: LngLat | [number, number]; + resizeEnable?: boolean; + } + interface MarkerOptions { + position?: LngLat | [number, number]; + icon?: string; + offset?: Pixel; + } + interface InfoWindowOptions { + isCustom?: boolean; + content?: string; + offset?: Pixel; + } + interface PolylineOptions { + path?: (LngLat | [number, number])[]; + strokeColor?: string; + strokeWeight?: number; + strokeStyle?: string; + } + interface MapsEvent { + target: Marker; + } + + // 全局暴露 + const Map: typeof Map; + const Marker: typeof Marker; + const InfoWindow: typeof InfoWindow; + const Polyline: typeof Polyline; + const LngLat: typeof LngLat; + const Pixel: typeof Pixel; + } + + // 全局变量 + const AMap: typeof AMap; +} + +export {}; \ No newline at end of file diff --git a/src/utils/request.ts b/src/utils/request.ts index e05b30c..fe8c2c8 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -58,5 +58,5 @@ request.interceptors.response.use( return Promise.reject(error); }) - // 对外暴露 +// 对外暴露 export default request; \ No newline at end of file diff --git a/src/views/ask/chatAi.vue b/src/views/ask/chatAi.vue index 74be02e..70235b6 100644 --- a/src/views/ask/chatAi.vue +++ b/src/views/ask/chatAi.vue @@ -120,6 +120,7 @@ import { ElMessage } from 'element-plus' import { reqAiChat } from '@/api/interface' import { useUserStore } from '@/stores/modules/user' import { type aiChatForm } from '@/api/interface/type' +import { useRouter } from 'vue-router' //侧边栏开合 @@ -148,63 +149,59 @@ const handleFullscreen = () => { const text = ref() const isShow = ref(false) const handleEnter = (event: KeyboardEvent) => { - // 如果按下Shift+Enter则插入换行 - if (event.shiftKey) { - return - } - // 否则阻止默认行为(不换行) + if (event.shiftKey) return event.preventDefault() + submitClick() // 回车触发提交 } /*对话框交互部分*/ // 获取用户状态 const userStore = useUserStore() -const userId = userStore.userId +const userId = userStore.userId.toString() +const sessionId = userStore.sessionId const backThing = ref() const userThing = ref({ question: text.value ?? '', - userId: userId ?? 1 // 默认用1或默认userId + userId: userId, // 默认用1或默认userId + sessionId: sessionId, + token: userStore.token }) -watch(userThing, async (newValue) => { - if (newValue && newValue.question.trim() && newValue.userId !== null) { - backThing.value = '思考中...' - try { - // 请求 - const res = await reqAiChat({ - question: newValue.question, - userId: newValue.userId - }) - - if (res.code === 200) { - backThing.value = res.data.Respond - } else { - ElMessage.error('请求失败,请稍后再试') - backThing.value = '请求失败,请稍后再试' - } - } catch (error) { - console.error('请求错误:', error) - ElMessage.error('请求错误,请稍后再试') - backThing.value = '请求错误,请稍后再试' - } - } -}) -const submitClick = (): void => { +const submitClick = async (): Promise => { const inputValue = text.value.trim() if (!inputValue) { ElMessage.warning('请输入内容') return } + + isShow.value = true - // 构造包含userId的请求数据 - userThing.value = { - question: inputValue, - userId: userId ?? 1 // 保证userId为number类型 + try { + backThing.value = '思考中...' + userThing.value.question = inputValue // 更新用户输入内容 + + const res = await reqAiChat({ + question: inputValue, + userId: userId, + sessionId: sessionId, + token: userStore.token + }) + + if (res.code === 200) { + backThing.value = res.data.Respond + } else { + ElMessage.error(res.msg || '请求失败,请稍后再试') + backThing.value = '请求失败,请稍后再试' + } + } catch (error) { + console.error('请求错误:', error) + ElMessage.error('请求错误,请稍后再试') + backThing.value = '请求错误,请稍后再试' + } finally { + text.value = '' } - text.value = '' - isShow.value = true } diff --git a/src/views/ask/musicAi.vue b/src/views/ask/musicAi.vue index f27d7e8..104f6d3 100644 --- a/src/views/ask/musicAi.vue +++ b/src/views/ask/musicAi.vue @@ -67,15 +67,48 @@

- - - -
- +
+ + +

发送了一条音频

+
+ user +
+
+ +
+ + AI + +

{{ backThing }}

+
+
+
+ + + +
+

录音时长: {{ duration }}秒

+

文件大小: {{ fileSize }}KB

+ +
+
+ + 暂无录音内容 +
+
+ +
+ + 点我录制 + + + 点我停止 + + + 点我重录 + +
@@ -93,10 +126,14 @@ diff --git a/src/views/ask/tableAi.vue b/src/views/ask/tableAi.vue index c09cef8..a84157b 100644 --- a/src/views/ask/tableAi.vue +++ b/src/views/ask/tableAi.vue @@ -68,9 +68,31 @@
- +
+ + +

{{ userThing.picture }}

+
+ user +
+
+ +
+ + AI + + + + + +
{ document.documentElement.requestFullscreen() } +/*对话框写入部分*/ const text = ref() +const isShow = ref(false) + const handleEnter = (event: KeyboardEvent) => { - // 如果按下Shift+Enter则插入换行 - if (event.shiftKey) { - return + if (!event.shiftKey) { + event.preventDefault() + submitClick() } - // 否则阻止默认行为(不换行) - event.preventDefault() } -const submitClick = () => { - -} +/*对话框交互部分*/ +// 获取用户状态 +const userStore = useUserStore() +const userId = userStore.userId.toString() + +const backThing = ref() +const userThing = ref({ + picture: text.value, + userId: userId , + sessionId: userStore.sessionId, + token: userStore.token +}) + +const submitClick = async () => { + const inputValue = text.value.trim() + if (!inputValue) { + ElMessage.warning('请输入图片描述') + return + } + + try { + isShow.value = true + userThing.value.picture = inputValue + backThing.value = '思考中...' + + // 使用store中的方法生成图片 + const imageData = await userStore.generateImage(inputValue) + backThing.value = imageData + + ElMessage.success('图片生成成功') + console.log('生成的图片:', imageData) // 打印生成的图片数据 + text.value = '' + } catch (error: any) { + console.error('图片生成失败:', error) + ElMessage.error(error.message || '图片生成失败') + backThing.value = '' + } finally { + } +} \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 6179cea..7cda6b6 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,160 +1,352 @@ + + - \ No newline at end of file + \ No newline at end of file diff --git a/src/views/myself/my.vue b/src/views/myself/my.vue index 4f3c656..1683456 100644 --- a/src/views/myself/my.vue +++ b/src/views/myself/my.vue @@ -1,8 +1,6 @@ - + @@ -112,13 +441,27 @@ const handleFullscreen = () => { min-height: 400px; } .el-menu-item-group__title { - height: 0; - width: 0; + height: 0; + width: 0; } .el-main { - margin-top: 0; - padding-top: 0.8%; - margin-left: 0; - padding-left: 0; + margin-top: 0; + padding-top: 0.8%; + margin-left: 0; + padding-left: 0; +} +.tag-display { + display: flex; + width: 80%; + height: 40%; + margin-top: 2%; + align-content: center; + justify-content: center; +} +.tag-text { + width: 100%; + text-align: center; + font-family: bigWord; + font-size: 6vh; } \ No newline at end of file diff --git a/src/views/myself/used.vue b/src/views/myself/used.vue index 475fd6b..ceb8088 100644 --- a/src/views/myself/used.vue +++ b/src/views/myself/used.vue @@ -1,115 +1,161 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/views/table/index.vue b/src/views/table/index.vue index c86dd43..ae91922 100644 --- a/src/views/table/index.vue +++ b/src/views/table/index.vue @@ -1,8 +1,6 @@ \ No newline at end of file From 80373d8188ccdbad9a80ca6a7d9d799dbbe4685e Mon Sep 17 00:00:00 2001 From: IHIRINA <2582067027@qq.com> Date: Wed, 2 Jul 2025 20:53:42 +0800 Subject: [PATCH 12/19] finish? --- components.d.ts | 1 + package-lock.json | 8 +- package.json | 2 +- src/components/LocationMap.vue | 182 ++++++++++++++++++++++++ src/utils/ws.ts | 144 +++++++++++++++++++ src/views/myself/my.vue | 251 ++------------------------------- 6 files changed, 347 insertions(+), 241 deletions(-) create mode 100644 src/components/LocationMap.vue create mode 100644 src/utils/ws.ts diff --git a/components.d.ts b/components.d.ts index 2bfc728..93b8b95 100644 --- a/components.d.ts +++ b/components.d.ts @@ -63,6 +63,7 @@ declare module 'vue' { IconEcosystem: typeof import('./src/components/icons/IconEcosystem.vue')['default'] IconSupport: typeof import('./src/components/icons/IconSupport.vue')['default'] IconTooling: typeof import('./src/components/icons/IconTooling.vue')['default'] + LocationMap: typeof import('./src/components/LocationMap.vue')['default'] Main: typeof import('./src/components/main.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] diff --git a/package-lock.json b/package-lock.json index f7dd675..16bbadd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", "@types/echarts": "^4.9.22", - "@types/node": "^22.14.0", + "@types/node": "^22.15.34", "@types/recordrtc": "^5.6.14", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", @@ -1500,9 +1500,9 @@ } }, "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.15.34", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.34.tgz", + "integrity": "sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 46efefb..3ca1ab1 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", "@types/echarts": "^4.9.22", - "@types/node": "^22.14.0", + "@types/node": "^22.15.34", "@types/recordrtc": "^5.6.14", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", diff --git a/src/components/LocationMap.vue b/src/components/LocationMap.vue new file mode 100644 index 0000000..63de0ae --- /dev/null +++ b/src/components/LocationMap.vue @@ -0,0 +1,182 @@ + + + + + \ No newline at end of file diff --git a/src/utils/ws.ts b/src/utils/ws.ts new file mode 100644 index 0000000..88aa8ba --- /dev/null +++ b/src/utils/ws.ts @@ -0,0 +1,144 @@ +import { ref, onBeforeUnmount } from 'vue' +import { ElMessage } from 'element-plus' + +export interface WebSocketMessage { + userId: number + latitude: number + longitude: number + recordTime: string +} + +export interface WebSocketResponse { + trackId?: string + status?: string + recordTime?: string +} + +export class RealtimeLocationWS { + private ws: WebSocket | null = null + private sid: string + private userId: number + private wsUrl: string + private retryCount = 0 + private maxRetryCount = 3 + private retryTimer: number | null = null + private messageHandler: ((data: WebSocketResponse) => void) | null = null + + public connected = ref(false) + + constructor(userId: number, host: string, onMessage?: (data: WebSocketResponse) => void) { + this.userId = userId + this.sid = this.generateSessionId() + this.wsUrl = `ws://${host}/realtime/${this.sid}` + this.messageHandler = onMessage || null + this.connect() + } + + private generateSessionId(): string { + return 'sid-' + Math.random().toString(36).substr(2, 9) + Date.now().toString(36) + } + + public connect(): void { + if (this.connected.value) return + + try { + this.ws = new WebSocket(this.wsUrl) + + this.ws.onopen = () => { + this.connected.value = true + this.retryCount = 0 + console.log('WebSocket连接已建立') + } + + this.ws.onmessage = (event) => { + try { + const response: WebSocketResponse = JSON.parse(event.data) + console.log('收到服务端响应:', response) + this.messageHandler?.(response) + } catch (error) { + console.error('解析WebSocket消息失败:', error) + } + } + + this.ws.onerror = (error) => { + console.error('WebSocket错误:', error) + this.reconnect() + } + + this.ws.onclose = () => { + this.connected.value = false + console.log('WebSocket连接已关闭') + this.reconnect() + } + } catch (error) { + console.error('WebSocket初始化失败:', error) + this.reconnect() + } + } + + private reconnect(): void { + if (this.retryCount >= this.maxRetryCount) { + console.error(`已达到最大重试次数(${this.maxRetryCount}),停止重连`) + ElMessage.warning('位置服务连接失败,请刷新页面重试') + return + } + + this.retryCount++ + const delay = Math.min(1000 * 2 ** this.retryCount, 30000) // 指数退避,最大30秒 + + console.log(`将在${delay}ms后尝试第${this.retryCount}次重连...`) + this.retryTimer = window.setTimeout(() => { + this.connect() + }, delay) + } + + public sendLocation(position: [number, number]): boolean { + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + console.warn('WebSocket未连接,无法发送位置数据') + return false + } + + const [longitude, latitude] = position + const message: WebSocketMessage = { + userId: this.userId, + latitude, + longitude, + recordTime: new Date().toISOString().split('.')[0] // ISO8601格式,去掉毫秒部分 + } + + try { + this.ws.send(JSON.stringify(message)) + console.log('已发送位置数据:', message) + return true + } catch (error) { + console.error('发送位置数据失败:', error) + return false + } + } + + public close(): void { + if (this.retryTimer) { + clearTimeout(this.retryTimer) + this.retryTimer = null + } + + if (this.ws) { + this.ws.close() + this.ws = null + } + + this.connected.value = false + } +} + +// 导出一个创建WebSocket实例的函数 +export function useRealtimeLocationWS(userId: number, host: string, onMessage?: (data: WebSocketResponse) => void) { + const wsInstance = new RealtimeLocationWS(userId, host, onMessage) + + // 自动在组件卸载时关闭连接 + onBeforeUnmount(() => { + wsInstance.close() + }) + + return wsInstance +} \ No newline at end of file diff --git a/src/views/myself/my.vue b/src/views/myself/my.vue index 1683456..438d9d7 100644 --- a/src/views/myself/my.vue +++ b/src/views/myself/my.vue @@ -85,7 +85,7 @@ 天气图片 - {{ userId }} + {{ id }} 学生 上班族 @@ -100,17 +100,11 @@
-->
-
-
-
- - 正在定位... -
-
- -
-
- +
@@ -126,6 +120,9 @@ import { ChatRound, Memo, UserFilled, FullScreen } from '@element-plus/icons-vue import { reqUserShow, reqUserUpdate } from '@/api/user/show' import type { UserUpdateForm} from '@/api/user/show/type' import { onBeforeMount } from 'vue' +import { useRealtimeLocationWS } from '@/utils/ws' +import LocationMap from '@/components/LocationMap.vue' + // 侧边栏状态 const isCollapse = ref(false) @@ -175,7 +172,6 @@ const allTagsVisible = computed(() => const username = ref('') const email = ref('') const userStore = useUserStore() -const userId = ref() const id = userStore.userId const weatherImage = ref('') @@ -206,233 +202,16 @@ const changeAdvater = async () => { fileInput.click() } -// 地图相关 -interface AMapComponents { - map: AMap.Map | null; - marker: AMap.Marker | null; - infoWindow: AMap.InfoWindow | null; - polyline: AMap.Polyline | null; -} -const mapContainer = ref(null) -const amapComponents = ref({ - map: null, - marker: null, - infoWindow: null, - polyline: null -}) - -const mapLoaded = ref(false) -const locationLoading = ref(false) -const userLocation = ref<[number, number] | null>(null) -const locationError = ref(null) - -// 加载地图脚本 -const loadAMapScript = async (): Promise => { - return new Promise((resolve, reject) => { - if (window.AMap) { - resolve() - return - } - - const script = document.createElement('script') - script.type = 'text/javascript' - script.src = 'https://webapi.amap.com/maps?v=2.0&key=5ee696eaddb2f84093a5721c8e505cf8' - script.async = true - script.defer = true - - script.onload = () => { - if (typeof AMap !== 'undefined' && AMap.Map) { - resolve() - } else { - reject(new Error('高德地图API加载失败')) - } - } - - script.onerror = (e) => { - reject(new Error('加载地图脚本失败: ' + (e as Event).type)) - } - - document.head.appendChild(script) - }) -} - -// 获取浏览器位置 -const getBrowserLocation = (): Promise<[number, number]> => { - return new Promise((resolve, reject) => { - if (!navigator.geolocation) { - reject(new Error('浏览器不支持地理定位')) - return - } - - locationLoading.value = true - locationError.value = null - - const success = (position: GeolocationPosition) => { - const { latitude, longitude } = position.coords - userLocation.value = [longitude, latitude] - resolve([longitude, latitude]) - } - - const error = (err: GeolocationPositionError) => { - let message = '' - switch (err.code) { - case err.PERMISSION_DENIED: - message = '用户拒绝了位置请求' - break - case err.POSITION_UNAVAILABLE: - message = '位置信息不可用' - break - case err.TIMEOUT: - message = '位置请求超时' - break - default: - message = '未知错误' - } - locationError.value = message - reject(new Error(message)) - } - - const options = { - enableHighAccuracy: true, - timeout: 10000, - maximumAge: 0 - } - - navigator.geolocation.getCurrentPosition(success, error, options) - }) +const handlePositionUpdate = (pos: { lng: number; lat: number }) => { + console.log('位置更新:', pos) } -// 初始化地图 -const initMap = async (): Promise => { - try { - // 确保AMap脚本加载 - await loadAMapScript(); - - // 等待DOM完全渲染 - await nextTick(); - - // 检查地图容器是否存在 - if (!mapContainer.value) { - throw new Error('地图容器元素不存在'); - } - - // 强制设置容器尺寸 - mapContainer.value.style.width = '100%'; - mapContainer.value.style.height = '100%'; - - console.log('修复后地图容器尺寸:', - mapContainer.value.offsetWidth, - mapContainer.value.offsetHeight - ); - - // 获取位置中心点 - let center: [number, number]; - try { - center = await getBrowserLocation(); - ElMessage.success('定位成功'); - } catch (err) { - console.warn('使用默认中心点:', err); - center = [116.397428, 39.90923]; // 天安门坐标 - ElMessage.warning('使用默认位置'); - } finally { - locationLoading.value = false; - } - - // 创建地图实例 - amapComponents.value.map = new AMap.Map(mapContainer.value, { - zoom: 15, - center: center, - resizeEnable: true - }); - - // 添加标记 - amapComponents.value.marker = new AMap.Marker({ - position: center, - }); - amapComponents.value.map.add(amapComponents.value.marker); - - // 强制重绘 - setTimeout(() => { - (amapComponents.value.map as any)?.setFitView(); - // 再次检查尺寸 - console.log('地图初始化后容器尺寸:', - mapContainer.value?.offsetWidth, - mapContainer.value?.offsetHeight - ); - }, 300); - - mapLoaded.value = true; - } catch (error: any) { - console.error('地图初始化失败:', error); - ElMessage.error(`地图加载失败: ${error.message}`); - locationError.value = error.message; - } -}; - -// 清理资源 -const cleanupMap = (): void => { - try { - if (amapComponents.value.map) { - amapComponents.value.map.destroy() - amapComponents.value = { - map: null, - marker: null, - infoWindow: null, - polyline: null - } - } - } catch (error) { - console.error('销毁地图失败:', error) +const handleWsMessage = (msg: any) => { + console.log('收到WS消息:', msg) + if (msg.status === 'success') { + ElMessage.success('位置上报成功') } } - -onMounted(async () => { - // 先加载用户信息 - async () => { - try { - const res = await reqUserShow(id.toString()) - if(res.code === 200) { - userId.value = id - username.value = res.data.username || '未设置用户名' - email.value = res.data.email || '未设置邮箱' - weatherImage.value = res.data.weatherImageUrl || '/defaultWeather.png' - imgUrl.value = res.data.imageUrl || '/5.png' - } else { - console.error('获取用户信息失败:', res.message) - } - }catch - (error) { - console.error('修改头像失败:', error) - }finally { - console.log('用户信息加载完成') - } - } - - // 等待DOM更新 - await nextTick(); - - // 确保容器可见 - if (mapContainer.value) { - mapContainer.value.style.display = 'block'; - mapContainer.value.style.visibility = 'visible'; - } - - // 初始化地图 - await initMap(); - console.log(AMap.Map.prototype) - - // 最终检查 - if (amapComponents.value.map) { - setTimeout(() => { - (amapComponents.value.map as any)?.setFitView(); - }, 500); - } -}) - -onBeforeUnmount(() => { - cleanupMap() -}) -