From 5539c1b6affafdc33682fe0f2201a74f775f95db Mon Sep 17 00:00:00 2001 From: kerwincui <164770707@qq.com> Date: Sun, 17 Mar 2024 14:59:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 22 + README.md | 99 +- RoadMap.md | 57 + doc/CHANGELOG.md | 22 + doc/Git提交规范.md | 63 + doc/贡献者指南.md | 69 + docker/Dockerfile | 50 + docker/README.md | 39 + docker/data/docker-compose-emqx.yml | 117 + docker/data/docker-compose.yml | 56 +- docker/data/emqx/etc/acl.conf | 32 + docker/data/emqx/etc/emqx.conf | 92 + docker/data/java/libtaos.so | Bin 0 -> 9743760 bytes docker/data/java/放置fastbee-admin.jar包.txt | 1 + docker/data/mysql/initdb/fastbee2.0.sql | 2607 +++++++ docker/data/nginx/h5/放置移动端h5打包文件.txt | 0 docker/data/nginx/nginx-emqx.conf | 91 + docker/data/nginx/nginx.conf | 50 +- docker/data/nginx/ssl/fastbee.crt | 68 + docker/data/nginx/ssl/fastbee.key | 27 + docker/data/nginx/ssl/放置ssl证书.txt | 0 docker/data/nginx/vue/放置前端打包文件.txt | 0 docker/data/nginx/www/部署官网.txt | 0 docker/data/tdengine/tdengine文件.txt | 0 docker/settings.xml | 264 + docker/sources.list | 11 + sdk/Arduino/Arduino-ESP32/Helper.cpp | 2 +- sdk/Arduino/Arduino-ESP8266/Helper.cpp | 2 +- sdk/Arduino/FastBeeArduino/Apconfig.cpp | 2 +- sdk/Arduino/FastBeeArduino/Config.cpp | 18 +- sdk/Arduino/FastBeeArduino/FastBeeArduino.ino | 1 + sdk/Arduino/FastBeeArduino/User.cpp | 4 +- sdk/Arduino/FastBeeGateway/Config.cpp | 20 +- sdk/Arduino/FastBeeGateway/Mqtt.cpp | 4 +- sdk/Arduino/FastBeeGateway/User.cpp | 5 +- sdk/合宙/air780e/lua/WeiMeiApp.lua | 113 + sdk/合宙/air780e/lua/WeiMeiComAuth.lua | 184 + sdk/合宙/air780e/lua/WeiMeiComInteraction.lua | 304 + sdk/合宙/air780e/lua/WuMeiTest.lua | 130 + sdk/合宙/air780e/lua/main.lua | 31 + sdk/合宙/air780e/lua/mainAir724.lua | 65 + sdk/合宙/air780e/lua/mainVscode.lua | 10 + springboot/.gitignore | 2 +- springboot/README.md | 96 +- springboot/bin/run.bat | 4 +- springboot/fastbee-admin/pom.xml | 112 + .../java/com/fastbee/FastBeeApplication.java | 20 + .../fastbee/FastBeeServletInitializer.java | 18 + .../controller/common/CaptchaController.java | 99 + .../controller/common/CommonController.java | 171 + .../controller/monitor/CacheController.java | 131 + .../controller/monitor/ServerController.java | 31 + .../monitor/SysLogininforController.java | 91 + .../monitor/SysOperlogController.java | 77 + .../monitor/SysUserOnlineController.java | 98 + .../system/SysConfigController.java | 146 + .../controller/system/SysDeptController.java | 142 + .../system/SysDictDataController.java | 121 + .../system/SysDictTypeController.java | 144 + .../controller/system/SysIndexController.java | 29 + .../controller/system/SysLoginController.java | 97 + .../controller/system/SysMenuController.java | 153 + .../system/SysNoticeController.java | 100 + .../controller/system/SysPostController.java | 141 + .../system/SysProfileController.java | 163 + .../system/SysRegisterController.java | 42 + .../controller/system/SysRoleController.java | 282 + .../controller/system/SysUserController.java | 274 + .../controller/tool/SwaggerController.java | 24 + .../web/controller/tool/TestController.java | 185 + .../web/controller/tool/TestController2.java | 44 + .../web/core/config/SwaggerConfig.java | 125 + .../META-INF/spring-devtools.properties | 1 + .../src/main/resources/application-dev.yml | 82 + .../src/main/resources/application-prod.yml | 83 + .../src/main/resources/application.yml | 98 + .../src/main/resources/banner.txt | 2 + .../main/resources/i18n/messages.properties | 37 + .../src/main/resources/logback.xml | 118 + .../main/resources/mybatis/mybatis-config.xml | 20 + springboot/fastbee-common/pom.xml | 197 + .../fastbee/common/annotation/Anonymous.java | 19 + .../fastbee/common/annotation/DataScope.java | 33 + .../fastbee/common/annotation/DataSource.java | 28 + .../fastbee/common/annotation/DictFormat.java | 22 + .../com/fastbee/common/annotation/Excel.java | 187 + .../com/fastbee/common/annotation/Excels.java | 18 + .../com/fastbee/common/annotation/Log.java | 46 + .../common/annotation/RateLimiter.java | 40 + .../common/annotation/RepeatSubmit.java | 31 + .../common/annotation/SysProtocol.java | 21 + .../com/fastbee/common/config/DeviceTask.java | 104 + .../fastbee/common/config/RuoYiConfig.java | 135 + .../common/constant/CacheConstants.java | 49 + .../fastbee/common/constant/Constants.java | 142 + .../common/constant/FastBeeConstant.java | 252 + .../fastbee/common/constant/GenConstants.java | 117 + .../fastbee/common/constant/HttpStatus.java | 105 + .../common/constant/ProductAuthConstant.java | 41 + .../common/constant/ScheduleConstants.java | 50 + .../fastbee/common/constant/SipConstants.java | 9 + .../common/constant/UserConstants.java | 78 + .../core/controller/BaseController.java | 216 + .../common/core/domain/AjaxResult.java | 214 + .../fastbee/common/core/domain/BaseDO.java | 43 + .../common/core/domain/BaseEntity.java | 126 + .../common/core/domain/CommonResult.java | 112 + .../fastbee/common/core/domain/PageParam.java | 25 + .../common/core/domain/PageResult.java | 42 + .../com/fastbee/common/core/domain/R.java | 115 + .../common/core/domain/SortingField.java | 56 + .../common/core/domain/TenantBaseDO.java | 20 + .../common/core/domain/TreeEntity.java | 79 + .../common/core/domain/TreeSelect.java | 77 + .../common/core/domain/entity/SysDept.java | 219 + .../core/domain/entity/SysDictData.java | 189 + .../core/domain/entity/SysDictType.java | 104 + .../common/core/domain/entity/SysMenu.java | 279 + .../common/core/domain/entity/SysRole.java | 257 + .../common/core/domain/entity/SysUser.java | 346 + .../core/domain/model/BindLoginBody.java | 22 + .../core/domain/model/BindRegisterBody.java | 21 + .../common/core/domain/model/LoginBody.java | 82 + .../common/core/domain/model/LoginUser.java | 266 + .../core/domain/model/RegisterBody.java | 11 + .../core/iot/response/DashDeviceTotalDto.java | 22 + .../common/core/iot/response/DeCodeBo.java | 26 + .../core/iot/response/IdentityAndName.java | 70 + .../fastbee/common/core/mq/DeviceReplyBo.java | 17 + .../fastbee/common/core/mq/DeviceReport.java | 104 + .../common/core/mq/DeviceReportBo.java | 74 + .../common/core/mq/DeviceStatusBo.java | 35 + .../fastbee/common/core/mq/InvokeReqDto.java | 62 + .../common/core/mq/MQSendMessageBo.java | 51 + .../common/core/mq/MessageReplyBo.java | 51 + .../common/core/mq/message/DeviceData.java | 49 + .../core/mq/message/DeviceDownMessage.java | 69 + .../mq/message/DeviceFunctionMessage.java | 33 + .../common/core/mq/message/DeviceMessage.java | 20 + .../core/mq/message/InstructionsMessage.java | 20 + .../common/core/mq/message/MqttBo.java | 26 + .../common/core/mq/message/PropRead.java | 39 + .../common/core/mq/message/ProtocolDto.java | 21 + .../core/mq/message/SubDeviceMessage.java | 18 + .../common/core/mq/ota/OtaReplyMessage.java | 17 + .../common/core/mq/ota/OtaUpgradeBo.java | 46 + .../core/mq/ota/OtaUpgradeDelayTask.java | 54 + .../fastbee/common/core/page/PageDomain.java | 101 + .../common/core/page/TableDataInfo.java | 85 + .../common/core/page/TableSupport.java | 56 + .../fastbee/common/core/protocol/Message.java | 33 + .../core/protocol/modbus/ModbusCode.java | 87 + .../fastbee/common/core/redis/RedisCache.java | 735 ++ .../common/core/redis/RedisKeyBuilder.java | 84 + .../common/core/redis/RedisKeyDefine.java | 113 + .../common/core/redis/RedisKeyRegistry.java | 28 + .../fastbee/common/core/text/CharsetKit.java | 86 + .../com/fastbee/common/core/text/Convert.java | 1000 +++ .../common/core/text/IntArrayValuable.java | 13 + .../fastbee/common/core/text/KeyValue.java | 20 + .../common/core/text/StrFormatter.java | 92 + .../common/core/thingsModel/NeuronModel.java | 44 + .../thingsModel/ThingsModelSimpleItem.java | 109 + .../thingsModel/ThingsModelValuesInput.java | 76 + .../fastbee/common/enums/BusinessStatus.java | 20 + .../fastbee/common/enums/BusinessType.java | 59 + .../common/enums/CommonStatusEnum.java | 36 + .../com/fastbee/common/enums/DataEnum.java | 37 + .../fastbee/common/enums/DataSourceType.java | 19 + .../fastbee/common/enums/DeviceStatus.java | 36 + .../fastbee/common/enums/ExceptionCode.java | 23 + .../common/enums/FunctionReplyStatus.java | 21 + .../enums/GlobalErrorCodeConstants.java | 52 + .../com/fastbee/common/enums/HttpMethod.java | 36 + .../com/fastbee/common/enums/IErrorCode.java | 14 + .../com/fastbee/common/enums/LimitType.java | 20 + .../fastbee/common/enums/ModbusDataType.java | 38 + .../com/fastbee/common/enums/OTAUpgrade.java | 37 + .../fastbee/common/enums/OperatorType.java | 24 + .../com/fastbee/common/enums/ResultCode.java | 37 + .../com/fastbee/common/enums/ServerType.java | 36 + .../common/enums/SocialPlatformType.java | 68 + .../fastbee/common/enums/ThingsModelType.java | 50 + .../com/fastbee/common/enums/TopicType.java | 62 + .../com/fastbee/common/enums/UserStatus.java | 30 + .../fastbee/common/enums/VerifyTypeEnum.java | 23 + .../common/exception/DemoModeException.java | 15 + .../fastbee/common/exception/ErrorCode.java | 28 + .../common/exception/GlobalException.java | 58 + .../common/exception/ServerException.java | 60 + .../common/exception/ServiceException.java | 80 + .../exception/ServiceExceptionUtil.java | 125 + .../common/exception/UtilException.java | 26 + .../common/exception/base/BaseException.java | 97 + .../common/exception/file/FileException.java | 19 + .../FileNameLengthLimitExceededException.java | 16 + .../file/FileSizeLimitExceededException.java | 16 + .../file/InvalidExtensionException.java | 81 + .../iot/MqttAuthorizationException.java | 17 + .../MqttClientUserNameOrPassException.java | 17 + .../common/exception/job/TaskException.java | 34 + .../exception/user/CaptchaException.java | 16 + .../user/CaptchaExpireException.java | 16 + .../common/exception/user/UserException.java | 18 + .../user/UserPasswordNotMatchException.java | 16 + ...UserPasswordRetryLimitExceedException.java | 16 + .../filter/PropertyPreExcludeFilter.java | 24 + .../common/filter/RepeatableFilter.java | 52 + .../filter/RepeatedlyRequestWrapper.java | 76 + .../com/fastbee/common/filter/XssFilter.java | 75 + .../filter/XssHttpServletRequestWrapper.java | 111 + .../java/com/fastbee/common/utils/Arith.java | 114 + .../common/utils/BeanMapUtilByReflect.java | 73 + .../fastbee/common/utils/CaculateUtils.java | 360 + .../com/fastbee/common/utils/DateUtils.java | 233 + .../com/fastbee/common/utils/DictUtils.java | 186 + .../com/fastbee/common/utils/DigestUtils.java | 75 + .../com/fastbee/common/utils/EncodeUtils.java | 157 + .../fastbee/common/utils/ExceptionUtil.java | 39 + .../fastbee/common/utils/ExceptionUtils.java | 53 + .../com/fastbee/common/utils/LogUtils.java | 18 + .../com/fastbee/common/utils/MapUtils.java | 66 + .../com/fastbee/common/utils/Md5Utils.java | 82 + .../fastbee/common/utils/MessageUtils.java | 26 + .../com/fastbee/common/utils/PageUtils.java | 35 + .../fastbee/common/utils/SecurityUtils.java | 120 + .../fastbee/common/utils/ServletUtils.java | 228 + .../com/fastbee/common/utils/StringUtils.java | 674 ++ .../com/fastbee/common/utils/Threads.java | 99 + .../fastbee/common/utils/ValidationUtils.java | 55 + .../fastbee/common/utils/VerifyCodeUtils.java | 228 + .../fastbee/common/utils/bean/BeanUtils.java | 110 + .../common/utils/bean/BeanValidators.java | 24 + .../utils/collection/CollectionUtils.java | 232 + .../fastbee/common/utils/date/DateUtils.java | 173 + .../common/utils/date/LocalDateTimeUtils.java | 63 + .../common/utils/file/FileTypeUtils.java | 76 + .../common/utils/file/FileUploadUtils.java | 232 + .../fastbee/common/utils/file/FileUtils.java | 340 + .../fastbee/common/utils/file/ImageUtils.java | 98 + .../common/utils/file/MimeTypeUtils.java | 59 + .../common/utils/gateway/CRC16Utils.java | 128 + .../common/utils/gateway/CRC8Utils.java | 93 + .../common/utils/gateway/mq/Topics.java | 16 + .../common/utils/gateway/mq/TopicsPost.java | 14 + .../common/utils/gateway/mq/TopicsUtils.java | 306 + .../utils/gateway/protocol/ByteUtils.java | 958 +++ .../utils/gateway/protocol/NettyUtils.java | 22 + .../fastbee/common/utils/html/EscapeUtil.java | 167 + .../fastbee/common/utils/html/HTMLFilter.java | 570 ++ .../fastbee/common/utils/http/HttpHelper.java | 55 + .../fastbee/common/utils/http/HttpUtils.java | 274 + .../fastbee/common/utils/ip/AddressUtils.java | 56 + .../com/fastbee/common/utils/ip/IpUtils.java | 264 + .../fastbee/common/utils/json/JsonUtils.java | 159 + .../common/utils/object/ObjectUtils.java | 63 + .../common/utils/poi/ExcelHandlerAdapter.java | 19 + .../fastbee/common/utils/poi/ExcelUtil.java | 1734 +++++ .../common/utils/reflect/ReflectUtils.java | 410 + .../com/fastbee/common/utils/sign/Base64.java | 291 + .../fastbee/common/utils/sign/Md5Utils.java | 67 + .../common/utils/spring/SpringUtils.java | 183 + .../com/fastbee/common/utils/sql/SqlUtil.java | 61 + .../fastbee/common/utils/uuid/IdUtils.java | 128 + .../com/fastbee/common/utils/uuid/Seq.java | 86 + .../com/fastbee/common/utils/uuid/UUID.java | 484 ++ .../common/wechat/WeChatAppResult.java | 72 + .../common/wechat/WeChatLoginBody.java | 89 + .../common/wechat/WeChatLoginResult.java | 22 + .../wechat/WeChatMiniProgramResult.java | 42 + .../common/wechat/WeChatPhoneInfo.java | 41 + .../fastbee/common/wechat/WeChatUserInfo.java | 80 + .../main/java/com/fastbee/common/xss/Xss.java | 27 + .../com/fastbee/common/xss/XssValidator.java | 34 + springboot/fastbee-framework/pom.xml | 64 + .../framework/aspectj/DataScopeAspect.java | 167 + .../framework/aspectj/DataSourceAspect.java | 72 + .../fastbee/framework/aspectj/LogAspect.java | 227 + .../framework/aspectj/RateLimiterAspect.java | 90 + .../framework/config/ApplicationConfig.java | 30 + .../framework/config/CaptchaConfig.java | 83 + .../fastbee/framework/config/DruidConfig.java | 126 + .../config/FastJson2JsonRedisSerializer.java | 48 + .../framework/config/FilterConfig.java | 58 + .../framework/config/KaptchaTextCreator.java | 68 + .../framework/config/MyBatisConfig.java | 177 + .../fastbee/framework/config/RedisConfig.java | 69 + .../framework/config/ResourcesConfig.java | 73 + .../framework/config/SecurityConfig.java | 152 + .../framework/config/ServerConfig.java | 32 + .../framework/config/ThreadPoolConfig.java | 63 + .../config/properties/DruidProperties.java | 77 + .../properties/PermitAllUrlProperties.java | 72 + .../datasource/DynamicDataSource.java | 26 + .../DynamicDataSourceContextHolder.java | 45 + .../interceptor/RepeatSubmitInterceptor.java | 55 + .../impl/SameUrlDataInterceptor.java | 110 + .../framework/manager/AsyncManager.java | 55 + .../framework/manager/ShutdownManager.java | 39 + .../manager/factory/AsyncFactory.java | 102 + .../mybatis/LambdaQueryWrapperX.java | 136 + .../framework/mybatis/QueryWrapperX.java | 140 + .../framework/mybatis/mapper/BaseMapperX.java | 112 + .../framework/mybatis/utils/MyBatisUtils.java | 88 + .../context/AuthenticationContextHolder.java | 28 + .../context/PermissionContextHolder.java | 27 + .../filter/JwtAuthenticationTokenFilter.java | 44 + .../handle/AuthenticationEntryPointImpl.java | 40 + .../handle/LogoutSuccessHandlerImpl.java | 52 + .../fastbee/framework/web/domain/Server.java | 240 + .../framework/web/domain/server/Cpu.java | 101 + .../framework/web/domain/server/Jvm.java | 130 + .../framework/web/domain/server/Mem.java | 61 + .../framework/web/domain/server/Sys.java | 84 + .../framework/web/domain/server/SysFile.java | 114 + .../web/exception/GlobalExceptionHandler.java | 114 + .../web/service/PermissionService.java | 168 + .../web/service/SysLoginService.java | 217 + .../web/service/SysPasswordService.java | 126 + .../web/service/SysPermissionService.java | 82 + .../web/service/SysRegisterService.java | 115 + .../framework/web/service/TokenService.java | 270 + .../web/service/UserDetailsServiceImpl.java | 65 + springboot/fastbee-gateway/fastbee-mq/pom.xml | 28 + .../java/com/fastbee/mq/config/MqConfig.java | 17 + .../com/fastbee/mq/model/ReportDataBo.java | 40 + .../mq/mqttClient/MqttClientConfig.java | 58 + .../fastbee/mq/mqttClient/MqttService.java | 68 + .../mq/mqttClient/PubMqttCallBack.java | 117 + .../fastbee/mq/mqttClient/PubMqttClient.java | 225 + .../config/RedisConsumeConfig.java | 57 + .../consumer/DeviceOtherMsgConsumer.java | 34 + .../consumer/RedisChannelConsume.java | 33 + .../listen/DeviceOtherListen.java | 35 + .../producer/MessageProducer.java | 20 + .../redischannel/queue/DeviceOtherQueue.java | 25 + .../com/fastbee/mq/service/IDataHandler.java | 32 + .../service/IDeviceReportMessageService.java | 35 + .../fastbee/mq/service/IFunctionInvoke.java | 21 + .../mq/service/IMessagePublishService.java | 19 + .../mq/service/IMqttMessagePublish.java | 78 + .../service/impl/DeviceOtherMsgHandler.java | 95 + .../mq/service/impl/FunctionInvokeImpl.java | 55 + .../fastbee-gateway/gateway-boot/pom.xml | 24 + .../fastbee/gateway/boot/start/StartBoot.java | 42 + springboot/fastbee-gateway/pom.xml | 36 + springboot/fastbee-open-api/pom.xml | 25 + .../controller/AuthResourceController.java | 25 + .../data/controller/CategoryController.java | 128 + .../data/controller/DeviceController.java | 267 + .../data/controller/DeviceJobController.java | 147 + .../data/controller/DeviceLogController.java | 49 + .../data/controller/DeviceUserController.java | 136 + .../data/controller/EventLogController.java | 114 + .../controller/FunctionLogController.java | 114 + .../data/controller/GroupController.java | 140 + .../controller/NewsCategoryController.java | 126 + .../data/controller/NewsController.java | 141 + .../OauthClientDetailsController.java | 114 + .../ProductAuthorizeController.java | 121 + .../data/controller/ProductController.java | 154 + .../controller/SocialLoginController.java | 104 + .../controller/SocialPlatformController.java | 109 + .../controller/ThingsModelController.java | 180 + .../ThingsModelTemplateController.java | 147 + .../data/controller/ToolController.java | 450 ++ .../data/controller/UserSocialController.java | 69 + .../dashBoard/DashBoardController.java | 72 + .../netty/NettyManagerController.java | 121 + .../protocol/ProtocolController.java | 114 + .../runtime/DeviceRuntimeController.java | 119 + .../controller/wechat/WeChatController.java | 127 + .../data/quartz/AbstractQuartzJob.java | 108 + .../com/fastbee/data/quartz/CronUtils.java | 64 + .../fastbee/data/quartz/JobInvokeUtil.java | 77 + .../QuartzDisallowConcurrentExecution.java | 21 + .../data/quartz/QuartzJobExecution.java | 19 + .../fastbee/data/quartz/ScheduleUtils.java | 105 + .../service/impl/DeviceJobServiceImpl.java | 334 + .../fastbee-plugs/fastbee-generator/pom.xml | 39 + .../fastbee/generator/config/GenConfig.java | 73 + .../generator/controller/GenController.java | 230 + .../fastbee/generator/domain/GenTable.java | 399 + .../generator/domain/GenTableColumn.java | 394 + .../mapper/GenTableColumnMapper.java | 60 + .../generator/mapper/GenTableMapper.java | 83 + .../service/GenTableColumnServiceImpl.java | 68 + .../service/GenTableServiceImpl.java | 521 ++ .../service/IGenTableColumnService.java | 44 + .../generator/service/IGenTableService.java | 121 + .../com/fastbee/generator/util/GenUtils.java | 257 + .../generator/util/VelocityInitializer.java | 34 + .../fastbee/generator/util/VelocityUtils.java | 402 + .../src/main/resources/generator.yml | 10 + .../mapper/generator/GenTableColumnMapper.xml | 127 + .../mapper/generator/GenTableMapper.xml | 202 + .../main/resources/vm/java/controller.java.vm | 115 + .../src/main/resources/vm/java/domain.java.vm | 105 + .../src/main/resources/vm/java/mapper.java.vm | 91 + .../main/resources/vm/java/service.java.vm | 61 + .../resources/vm/java/serviceImpl.java.vm | 169 + .../main/resources/vm/java/sub-domain.java.vm | 76 + .../src/main/resources/vm/js/api.js.vm | 44 + .../src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 505 ++ .../src/main/resources/vm/vue/index.vue.vm | 602 ++ .../resources/vm/vue/v3/index-tree.vue.vm | 474 ++ .../src/main/resources/vm/vue/v3/index.vue.vm | 590 ++ .../src/main/resources/vm/vue/v3/readme.txt | 1 + .../src/main/resources/vm/xml/mapper.xml.vm | 135 + .../fastbee-plugs/fastbee-quartz/pom.xml | 40 + .../fastbee/quartz/config/ScheduleConfig.java | 57 + .../quartz/controller/SysJobController.java | 197 + .../controller/SysJobLogController.java | 101 + .../com/fastbee/quartz/domain/SysJob.java | 183 + .../com/fastbee/quartz/domain/SysJobLog.java | 168 + .../quartz/mapper/SysJobLogMapper.java | 64 + .../fastbee/quartz/mapper/SysJobMapper.java | 67 + .../quartz/service/ISysJobLogService.java | 56 + .../quartz/service/ISysJobService.java | 102 + .../service/impl/SysJobLogServiceImpl.java | 87 + .../service/impl/SysJobServiceImpl.java | 261 + .../java/com/fastbee/quartz/task/RyTask.java | 28 + .../quartz/util/AbstractQuartzJob.java | 107 + .../com/fastbee/quartz/util/CronUtils.java | 63 + .../fastbee/quartz/util/JobInvokeUtil.java | 182 + .../QuartzDisallowConcurrentExecution.java | 21 + .../quartz/util/QuartzJobExecution.java | 19 + .../fastbee/quartz/util/ScheduleUtils.java | 139 + .../mapper/quartz/SysJobLogMapper.xml | 93 + .../resources/mapper/quartz/SysJobMapper.xml | 111 + springboot/fastbee-plugs/pom.xml | 21 + .../fastbee-protocol-collect/pom.xml | 22 + .../fastbee/common/ProtocolDeCodeService.java | 53 + .../com/fastbee/json/JsonProtocolService.java | 70 + springboot/fastbee-protocol/pom.xml | 31 + springboot/fastbee-server/base-server/pom.xml | 12 + .../com/fastbee/base/codec/Delimiter.java | 29 + .../com/fastbee/base/codec/LengthField.java | 76 + .../fastbee/base/codec/MessageDecoder.java | 18 + .../fastbee/base/codec/MessageEncoder.java | 15 + .../base/core/AbstractHandlerMapping.java | 61 + .../base/core/DefaultHandlerMapping.java | 27 + .../fastbee/base/core/HandlerInterceptor.java | 37 + .../com/fastbee/base/core/HandlerMapping.java | 12 + .../base/core/SpringHandlerMapping.java | 23 + .../fastbee/base/core/annotation/Async.java | 15 + .../base/core/annotation/AsyncBatch.java | 27 + .../fastbee/base/core/annotation/Node.java | 14 + .../base/core/annotation/PakMapping.java | 17 + .../base/core/hanler/AsyncBatchHandler.java | 128 + .../fastbee/base/core/hanler/BaseHandler.java | 86 + .../fastbee/base/core/hanler/SyncHandler.java | 23 + .../com/fastbee/base/core/model/Response.java | 12 + .../com/fastbee/base/model/DeviceMsg.java | 19 + .../com/fastbee/base/model/SessionKey.java | 16 + .../fastbee/base/service/ISessionStore.java | 60 + .../base/service/impl/SessionStoreImpl.java | 104 + .../java/com/fastbee/base/session/Packet.java | 74 + .../com/fastbee/base/session/Session.java | 286 + .../fastbee/base/session/SessionListener.java | 26 + .../fastbee/base/session/SessionManager.java | 125 + .../com/fastbee/base/util/AttributeUtils.java | 42 + .../com/fastbee/base/util/ClassUtils.java | 106 + .../fastbee/base/util/ConcurrentStorage.java | 51 + .../com/fastbee/base/util/DeviceUtils.java | 30 + .../java/com/fastbee/base/util/Stopwatch.java | 48 + .../java/com/fastbee/base/util/Storage.java | 18 + .../com/fastbee/base/util/VirtualList.java | 101 + springboot/fastbee-server/boot-strap/pom.xml | 35 + .../fastbee/bootstrap/mqtt/MQTTBootStrap.java | 70 + .../fastbee-server/iot-server-core/pom.xml | 25 + .../main/java/com/fastbee/server/Server.java | 77 + .../fastbee/server/config/NettyConfig.java | 254 + springboot/fastbee-server/mqtt-broker/pom.xml | 28 + .../com/fastbee/mqtt/annotation/Process.java | 21 + .../com/fastbee/mqtt/auth/AuthService.java | 101 + .../mqtt/codec/WebSocketMqttCodec.java | 30 + .../com/fastbee/mqtt/handler/MqttConnect.java | 137 + .../fastbee/mqtt/handler/MqttDisConnect.java | 41 + .../com/fastbee/mqtt/handler/MqttPingreq.java | 37 + .../com/fastbee/mqtt/handler/MqttPubAck.java | 39 + .../com/fastbee/mqtt/handler/MqttPubRec.java | 47 + .../com/fastbee/mqtt/handler/MqttPubRel.java | 41 + .../com/fastbee/mqtt/handler/MqttPubcomp.java | 38 + .../com/fastbee/mqtt/handler/MqttPublish.java | 204 + .../fastbee/mqtt/handler/MqttSubscribe.java | 107 + .../fastbee/mqtt/handler/MqttUnsubscribe.java | 38 + .../mqtt/handler/adapter/MqttHandler.java | 12 + .../handler/adapter/MqttMessageAdapter.java | 89 + .../handler/adapter/MqttMessageDelegate.java | 58 + .../fastbee/mqtt/manager/ClientManager.java | 174 + .../mqtt/manager/MqttRemoteManager.java | 77 + .../fastbee/mqtt/manager/ResponseManager.java | 76 + .../mqtt/manager/RetainMsgManager.java | 53 + .../fastbee/mqtt/manager/SessionManger.java | 162 + .../mqtt/manager/WillMessageManager.java | 30 + .../com/fastbee/mqtt/model/ClientMessage.java | 45 + .../com/fastbee/mqtt/model/PushMessageBo.java | 23 + .../com/fastbee/mqtt/model/RetainMessage.java | 23 + .../com/fastbee/mqtt/model/Subscribe.java | 23 + .../com/fastbee/mqtt/model/WillMessage.java | 26 + .../com/fastbee/mqtt/server/MqttServer.java | 66 + .../fastbee/mqtt/server/WebSocketServer.java | 73 + .../fastbee/mqtt/service/IMessageStore.java | 90 + .../mqtt/service/ISubscriptionService.java | 40 + .../mqtt/service/impl/DataHandlerImpl.java | 135 + .../impl/DeviceReportMessageServiceImpl.java | 141 + .../mqtt/service/impl/MessageStoreImpl.java | 159 + .../service/impl/MqttMessagePublishImpl.java | 354 + .../service/impl/SubscriptionServiceImpl.java | 56 + .../fastbee/mqtt/utils/MqttMessageUtils.java | 144 + springboot/fastbee-server/pom.xml | 54 + .../fastbee-iot-service/pom.xml | 108 + .../java/com/fastbee/iot/domain/Category.java | 134 + .../java/com/fastbee/iot/domain/Device.java | 473 ++ .../com/fastbee/iot/domain/DeviceGroup.java | 46 + .../com/fastbee/iot/domain/DeviceJob.java | 308 + .../com/fastbee/iot/domain/DeviceLog.java | 474 ++ .../com/fastbee/iot/domain/DeviceUser.java | 167 + .../java/com/fastbee/iot/domain/EventLog.java | 237 + .../com/fastbee/iot/domain/FunctionLog.java | 121 + .../java/com/fastbee/iot/domain/Group.java | 120 + .../java/com/fastbee/iot/domain/News.java | 195 + .../com/fastbee/iot/domain/NewsCategory.java | 91 + .../iot/domain/OauthClientDetails.java | 206 + .../java/com/fastbee/iot/domain/Product.java | 318 + .../fastbee/iot/domain/ProductAuthorize.java | 171 + .../java/com/fastbee/iot/domain/Protocol.java | 47 + .../fastbee/iot/domain/SocialPlatform.java | 189 + .../com/fastbee/iot/domain/SocialUser.java | 188 + .../com/fastbee/iot/domain/ThingsModel.java | 452 ++ .../iot/domain/ThingsModelTemplate.java | 447 ++ .../fastbee/iot/domain/UserSocialProfile.java | 116 + .../java/com/fastbee/iot/domain/VarTemp.java | 149 + .../com/fastbee/iot/domain/VarTempSalve.java | 94 + .../com/fastbee/iot/enums/DeviceType.java | 28 + .../fastbee/iot/mapper/CategoryMapper.java | 81 + .../fastbee/iot/mapper/DeviceJobMapper.java | 118 + .../fastbee/iot/mapper/DeviceLogMapper.java | 86 + .../com/fastbee/iot/mapper/DeviceMapper.java | 298 + .../fastbee/iot/mapper/DeviceUserMapper.java | 96 + .../fastbee/iot/mapper/EventLogMapper.java | 77 + .../fastbee/iot/mapper/FunctionLogMapper.java | 97 + .../com/fastbee/iot/mapper/GroupMapper.java | 87 + .../iot/mapper/NewsCategoryMapper.java | 79 + .../com/fastbee/iot/mapper/NewsMapper.java | 70 + .../iot/mapper/OauthClientDetailsMapper.java | 63 + .../iot/mapper/ProductAuthorizeMapper.java | 92 + .../com/fastbee/iot/mapper/ProductMapper.java | 149 + .../fastbee/iot/mapper/ProtocolMapper.java | 80 + .../iot/mapper/SocialPlatformMapper.java | 71 + .../fastbee/iot/mapper/SocialUserMapper.java | 103 + .../fastbee/iot/mapper/ThingsModelMapper.java | 125 + .../iot/mapper/ThingsModelTemplateMapper.java | 97 + .../java/com/fastbee/iot/model/Action.java | 110 + .../iot/model/AuthenticateInputModel.java | 36 + .../com/fastbee/iot/model/CategoryNews.java | 49 + .../iot/model/ChangeProductStatusModel.java | 41 + .../com/fastbee/iot/model/DataResult.java | 19 + .../iot/model/DeviceAllShortOutput.java | 220 + .../fastbee/iot/model/DeviceGroupInput.java | 36 + .../iot/model/DeviceMqttConnectVO.java | 35 + .../com/fastbee/iot/model/DeviceMqttVO.java | 126 + .../iot/model/DeviceNumberAndProductId.java | 38 + .../iot/model/DeviceRelateAlertLogVO.java | 31 + .../iot/model/DeviceRelateUserInput.java | 41 + .../fastbee/iot/model/DeviceShortOutput.java | 421 + .../fastbee/iot/model/DeviceStatistic.java | 101 + .../com/fastbee/iot/model/HistoryModel.java | 20 + .../java/com/fastbee/iot/model/IdAndName.java | 44 + .../java/com/fastbee/iot/model/IdOutput.java | 24 + .../iot/model/ImportThingsModelInput.java | 47 + .../com/fastbee/iot/model/MonitorModel.java | 34 + .../iot/model/MqttAuthenticationModel.java | 89 + .../iot/model/MqttClientConnectModel.java | 98 + .../com/fastbee/iot/model/MqttInfoModel.java | 43 + .../java/com/fastbee/iot/model/NtpModel.java | 40 + .../iot/model/ProductAuthenticateModel.java | 137 + .../fastbee/iot/model/ProductAuthorizeVO.java | 30 + .../com/fastbee/iot/model/ProductCode.java | 20 + .../fastbee/iot/model/RegisterUserInput.java | 73 + .../fastbee/iot/model/RegisterUserOutput.java | 21 + .../java/com/fastbee/iot/model/Specs.java | 44 + .../ThingsModelItem/ArrayModelOutput.java | 24 + .../ThingsModelItem/BoolModelOutput.java | 23 + .../iot/model/ThingsModelItem/Datatype.java | 161 + .../ThingsModelItem/DecimalModelOutput.java | 43 + .../iot/model/ThingsModelItem/EnumItem.java | 27 + .../model/ThingsModelItem/EnumItemOutput.java | 23 + .../ThingsModelItem/EnumModelOutput.java | 16 + .../ThingsModelItem/IntegerModelOutput.java | 43 + .../ThingsModelItem/ReadOnlyModelOutput.java | 44 + .../ThingsModelItem/StringModelOutput.java | 14 + .../model/ThingsModelItem/ThingsModel.java | 167 + .../ThingsModelItem/ThingsModelItemBase.java | 88 + .../fastbee/iot/model/ThingsModelPerm.java | 42 + .../iot/model/ThingsModels/EventDto.java | 47 + .../iot/model/ThingsModels/FunctionDto.java | 45 + .../iot/model/ThingsModels/PropertyDto.java | 61 + .../iot/model/ThingsModels/ThingsItems.java | 19 + .../model/ThingsModels/ThingsModelShadow.java | 47 + .../ThingsModels/ThingsModelValueItem.java | 145 + .../ThingsModels/ThingsModelValueItemDto.java | 196 + .../ThingsModels/ThingsModelValuesOutput.java | 160 + .../model/ThingsModels/ThingsModelsDto.java | 50 + .../iot/model/ThingsModels/ValueItem.java | 62 + .../fastbee/iot/model/TriggerParameter.java | 92 + .../iot/model/UserIdDeviceIdModel.java | 36 + .../iot/model/dashBoard/DashMqttMetrics.java | 29 + .../iot/model/dashBoard/DashMqttStat.java | 31 + .../fastbee/iot/model/dto/DeviceRtDto.java | 29 + .../iot/model/login/AuthRequestWrap.java | 26 + .../fastbee/iot/model/login/BindIdValue.java | 23 + .../fastbee/iot/model/login/LoginIdValue.java | 22 + .../iot/model/login/WeChatLoginQrRes.java | 19 + .../iot/model/varTemp/DeviceSlavePoint.java | 26 + .../fastbee/iot/model/varTemp/DeviceTemp.java | 19 + .../fastbee/iot/model/varTemp/EnumClass.java | 14 + .../iot/model/varTemp/SlaveIdAndId.java | 14 + .../fastbee/iot/model/varTemp/SyncModel.java | 15 + .../iot/oauth/AuthorizationServerConfig.java | 119 + .../iot/oauth/ResourceServerConfig.java | 50 + .../iot/oauth/SpeakerApprovalHandler.java | 83 + .../oauth/api/ConfirmAccessController.java | 49 + .../iot/oauth/api/LoginController.java | 55 + .../iot/oauth/api/SpeakerController.java | 33 + .../iot/service/IAuthRequestFactory.java | 14 + .../fastbee/iot/service/ICategoryService.java | 72 + .../iot/service/IDeviceJobService.java | 127 + .../iot/service/IDeviceLogService.java | 27 + .../iot/service/IDeviceRuntimeService.java | 33 + .../fastbee/iot/service/IDeviceService.java | 263 + .../iot/service/IDeviceUserService.java | 88 + .../fastbee/iot/service/IEventLogService.java | 76 + .../iot/service/IFunctionLogService.java | 87 + .../fastbee/iot/service/IGroupService.java | 76 + .../iot/service/INewsCategoryService.java | 71 + .../com/fastbee/iot/service/INewsService.java | 69 + .../service/IOauthClientDetailsService.java | 61 + .../iot/service/IProductAuthorizeService.java | 76 + .../fastbee/iot/service/IProductService.java | 119 + .../fastbee/iot/service/IProtocolService.java | 75 + .../iot/service/ISocialLoginService.java | 89 + .../iot/service/ISocialPlatformService.java | 69 + .../iot/service/ISocialUserService.java | 99 + .../iot/service/IThingsModelService.java | 150 + .../service/IThingsModelTemplateService.java | 87 + .../com/fastbee/iot/service/IToolService.java | 70 + .../service/IUserSocialProfileService.java | 42 + .../iot/service/cache/IDeviceCache.java | 29 + .../iot/service/cache/IFirmwareCache.java | 30 + .../service/cache/impl/DeviceCacheImpl.java | 95 + .../service/cache/impl/FirmwareCacheImpl.java | 56 + .../service/impl/AuthRequestFactoryImpl.java | 74 + .../iot/service/impl/AuthStateRedisCache.java | 52 + .../iot/service/impl/CategoryServiceImpl.java | 146 + .../service/impl/DeviceLogServiceImpl.java | 41 + .../impl/DeviceRuntimeServiceImpl.java | 169 + .../iot/service/impl/DeviceServiceImpl.java | 1312 ++++ .../service/impl/DeviceUserServiceImpl.java | 146 + .../iot/service/impl/EventLogServiceImpl.java | 116 + .../service/impl/FunctionLogServiceImpl.java | 134 + .../iot/service/impl/GroupServiceImpl.java | 158 + .../service/impl/NewsCategoryServiceImpl.java | 117 + .../iot/service/impl/NewsServiceImpl.java | 131 + .../impl/OauthClientDetailsServiceImpl.java | 93 + .../impl/ProductAuthorizeServiceImpl.java | 143 + .../iot/service/impl/ProductServiceImpl.java | 321 + .../iot/service/impl/ProtocolServiceImpl.java | 119 + .../service/impl/SocialLoginServiceImpl.java | 432 ++ .../impl/SocialPlatformServiceImpl.java | 103 + .../service/impl/SocialUserServiceImpl.java | 155 + .../service/impl/ThingsModelServiceImpl.java | 556 ++ .../impl/ThingsModelTemplateServiceImpl.java | 261 + .../iot/service/impl/ToolServiceImpl.java | 536 ++ .../impl/UserSocialProfileServiceImpl.java | 105 + .../iot/tdengine/service/ILogService.java | 35 + .../service/impl/MySqlLogServiceImpl.java | 55 + .../iot/tdengine/service/model/TdLogDto.java | 27 + .../java/com/fastbee/iot/util/AESUtils.java | 120 + .../fastbee/iot/util/SnowflakeIdWorker.java | 104 + .../fastbee/iot/util/VelocityInitializer.java | 35 + .../com/fastbee/iot/util/VelocityUtils.java | 89 + .../com/fastbee/iot/wechat/WeChatService.java | 68 + .../iot/wechat/impl/WeChatServiceImpl.java | 491 ++ .../fastbee/iot/wechat/vo/WxBindReqVO.java | 19 + .../iot/wechat/vo/WxCancelBindReqVO.java | 32 + .../resources/mapper/iot/CategoryMapper.xml | 113 + .../resources/mapper/iot/DeviceJobMapper.xml | 194 + .../resources/mapper/iot/DeviceLogMapper.xml | 146 + .../resources/mapper/iot/DeviceMapper.xml | 639 ++ .../resources/mapper/iot/DeviceUserMapper.xml | 146 + .../resources/mapper/iot/EventLogMapper.xml | 149 + .../mapper/iot/FunctionLogMapper.xml | 185 + .../main/resources/mapper/iot/GroupMapper.xml | 117 + .../mapper/iot/NewsCategoryMapper.xml | 103 + .../main/resources/mapper/iot/NewsMapper.xml | 127 + .../mapper/iot/OauthClientDetailsMapper.xml | 101 + .../mapper/iot/ProductAuthorizeMapper.xml | 142 + .../resources/mapper/iot/ProductMapper.xml | 230 + .../resources/mapper/iot/ProtocolMapper.xml | 143 + .../mapper/iot/SocialPlatformMapper.xml | 141 + .../resources/mapper/iot/SocialUserMapper.xml | 275 + .../mapper/iot/ThingsModelMapper.xml | 519 ++ .../mapper/iot/ThingsModelTemplateMapper.xml | 207 + .../resources/mapper/iot/VarTempMapper.xml | 220 + .../mapper/iot/VarTempSalveMapper.xml | 139 + .../static/oauth/css/bootstrap-theme.css | 587 ++ .../static/oauth/css/bootstrap-theme.css.map | 1 + .../static/oauth/css/bootstrap-theme.min.css | 6 + .../oauth/css/bootstrap-theme.min.css.map | 1 + .../resources/static/oauth/css/bootstrap.css | 6834 +++++++++++++++++ .../static/oauth/css/bootstrap.css.map | 1 + .../static/oauth/css/bootstrap.min.css | 6 + .../static/oauth/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../resources/static/oauth/js/bootstrap.js | 2580 +++++++ .../static/oauth/js/bootstrap.min.js | 6 + .../src/main/resources/static/oauth/js/npm.js | 13 + .../templates/oauth/access_confirmation.html | 37 + .../templates/oauth/clientDetails.html | 48 + .../main/resources/templates/oauth/index.html | 23 + .../main/resources/templates/oauth/login.html | 38 + .../main/resources/vm/java/controller.java.vm | 115 + .../src/main/resources/vm/java/domain.java.vm | 105 + .../src/main/resources/vm/java/mapper.java.vm | 91 + .../main/resources/vm/java/service.java.vm | 61 + .../resources/vm/java/serviceImpl.java.vm | 169 + .../main/resources/vm/java/sub-domain.java.vm | 76 + .../src/main/resources/vm/js/api.js.vm | 44 + .../src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 476 ++ .../src/main/resources/vm/vue/index.vue.vm | 567 ++ .../src/main/resources/vm/xml/mapper.xml.vm | 135 + .../fastbee-system-service/pom.xml | 28 + .../com/fastbee/system/domain/SysCache.java | 81 + .../com/fastbee/system/domain/SysConfig.java | 120 + .../fastbee/system/domain/SysLogininfor.java | 156 + .../com/fastbee/system/domain/SysNotice.java | 111 + .../com/fastbee/system/domain/SysOperLog.java | 275 + .../com/fastbee/system/domain/SysPost.java | 133 + .../fastbee/system/domain/SysRoleDept.java | 51 + .../fastbee/system/domain/SysRoleMenu.java | 51 + .../fastbee/system/domain/SysUserOnline.java | 113 + .../fastbee/system/domain/SysUserPost.java | 51 + .../fastbee/system/domain/SysUserRole.java | 51 + .../com/fastbee/system/domain/vo/MetaVo.java | 106 + .../fastbee/system/domain/vo/RouterVo.java | 148 + .../system/mapper/SysConfigMapper.java | 76 + .../fastbee/system/mapper/SysDeptMapper.java | 118 + .../system/mapper/SysDictDataMapper.java | 95 + .../system/mapper/SysDictTypeMapper.java | 83 + .../system/mapper/SysLogininforMapper.java | 42 + .../fastbee/system/mapper/SysMenuMapper.java | 125 + .../system/mapper/SysNoticeMapper.java | 60 + .../system/mapper/SysOperLogMapper.java | 48 + .../fastbee/system/mapper/SysPostMapper.java | 99 + .../system/mapper/SysRoleDeptMapper.java | 44 + .../fastbee/system/mapper/SysRoleMapper.java | 107 + .../system/mapper/SysRoleMenuMapper.java | 44 + .../fastbee/system/mapper/SysUserMapper.java | 151 + .../system/mapper/SysUserPostMapper.java | 44 + .../system/mapper/SysUserRoleMapper.java | 62 + .../system/service/ISysConfigService.java | 89 + .../system/service/ISysDeptService.java | 124 + .../system/service/ISysDictDataService.java | 60 + .../system/service/ISysDictTypeService.java | 98 + .../system/service/ISysLogininforService.java | 40 + .../system/service/ISysMenuService.java | 144 + .../system/service/ISysNoticeService.java | 60 + .../system/service/ISysOperLogService.java | 48 + .../system/service/ISysPostService.java | 99 + .../system/service/ISysRoleService.java | 173 + .../system/service/ISysUserOnlineService.java | 48 + .../system/service/ISysUserService.java | 223 + .../service/impl/SysConfigServiceImpl.java | 232 + .../service/impl/SysDeptServiceImpl.java | 338 + .../service/impl/SysDictDataServiceImpl.java | 111 + .../service/impl/SysDictTypeServiceImpl.java | 223 + .../impl/SysLogininforServiceImpl.java | 65 + .../service/impl/SysMenuServiceImpl.java | 531 ++ .../service/impl/SysNoticeServiceImpl.java | 92 + .../service/impl/SysOperLogServiceImpl.java | 76 + .../service/impl/SysPostServiceImpl.java | 178 + .../service/impl/SysRoleServiceImpl.java | 424 + .../impl/SysUserOnlineServiceImpl.java | 96 + .../service/impl/SysUserServiceImpl.java | 571 ++ .../mapper/system/SysConfigMapper.xml | 117 + .../resources/mapper/system/SysDeptMapper.xml | 159 + .../mapper/system/SysDictDataMapper.xml | 124 + .../mapper/system/SysDictTypeMapper.xml | 105 + .../mapper/system/SysLogininforMapper.xml | 57 + .../resources/mapper/system/SysMenuMapper.xml | 202 + .../mapper/system/SysNoticeMapper.xml | 89 + .../mapper/system/SysOperLogMapper.xml | 83 + .../resources/mapper/system/SysPostMapper.xml | 122 + .../mapper/system/SysRoleDeptMapper.xml | 34 + .../resources/mapper/system/SysRoleMapper.xml | 152 + .../mapper/system/SysRoleMenuMapper.xml | 34 + .../resources/mapper/system/SysUserMapper.xml | 251 + .../mapper/system/SysUserPostMapper.xml | 34 + .../mapper/system/SysUserRoleMapper.xml | 44 + springboot/fastbee-service/pom.xml | 21 + springboot/fastbee.bat | 67 + springboot/fastbee.sh | 86 + springboot/pom.xml | 312 +- springboot/sql/fastbee2.0.sql | 2394 ++++++ springboot/sql/其他/clear-data.sql | 110 + vue/.env.development | 13 +- vue/.env.production | 12 +- vue/.env.staging | 10 +- vue/.eslintignore | 3 +- vue/.eslintrc.js | 39 +- vue/.gitignore | 1 - vue/.prettierignore | 4 + vue/.prettierrc.js | 10 + vue/bin/package.bat | 2 +- vue/package.json | 45 +- vue/public/index.html | 60 +- vue/src/App.vue | 17 +- vue/src/api/iot/device.js | 159 +- vue/src/api/iot/deviceLog.js | 9 + vue/src/api/iot/deviceuser.js | 35 +- vue/src/api/iot/eventLog.js | 45 + vue/src/api/iot/functionLog.js | 44 + vue/src/api/iot/model.js | 49 +- vue/src/api/iot/netty.js | 36 + vue/src/api/iot/point.js | 62 + vue/src/api/iot/product.js | 17 + vue/src/api/iot/protocol.js | 44 + vue/src/api/iot/runstatus.js | 29 + vue/src/api/iot/salve.js | 53 + vue/src/api/iot/temp.js | 62 + vue/src/api/iot/template.js | 9 + vue/src/api/iot/tool.js | 21 + vue/src/api/login.js | 97 +- vue/src/api/monitor/cache.js | 48 + vue/src/api/monitor/logininfor.js | 8 + vue/src/api/system/dept.js | 16 - vue/src/api/system/role.js | 10 +- vue/src/api/system/user.js | 28 +- vue/src/api/tool/ossConfig.js | 44 + vue/src/api/tool/ossDetail.js | 44 + vue/src/assets/bigScreen/img/top.png | Bin 9050 -> 9492 bytes vue/src/assets/icons/svg/arrow-left.svg | 1 + vue/src/assets/icons/svg/big.svg | 1 + vue/src/assets/icons/svg/channel.svg | 1 + vue/src/assets/icons/svg/live.svg | 1 + vue/src/assets/icons/svg/live1.svg | 1 + vue/src/assets/icons/svg/qrcode.svg | 1 + vue/src/assets/icons/svg/redis-list.svg | 2 + vue/src/assets/icons/svg/small.svg | 1 + vue/src/assets/icons/svg/validCode.svg | 2 +- vue/src/assets/icons/svg/video.svg | 1 + vue/src/assets/icons/svg/videotape.svg | 1 + vue/src/assets/images/gateway.png | Bin 0 -> 5156 bytes vue/src/assets/images/orange.svg | 39 + vue/src/assets/images/product.png | Bin 0 -> 10443 bytes vue/src/assets/images/qq.png | Bin 0 -> 7519 bytes vue/src/assets/images/video.png | Bin 0 -> 7223 bytes vue/src/assets/images/weChat.png | Bin 0 -> 8730 bytes vue/src/assets/images/zlm-logo.png | Bin 0 -> 49027 bytes vue/src/assets/styles/element-variables.scss | 2 +- vue/src/assets/styles/index.scss | 22 +- vue/src/assets/styles/ruoyi.scss | 31 +- vue/src/assets/styles/sidebar.scss | 4 + vue/src/assets/styles/transition.scss | 5 + vue/src/components/Codemirror/index.vue | 3 +- vue/src/components/Crontab/hour.vue | 4 +- vue/src/components/Crontab/index.vue | 2 +- vue/src/components/Crontab/week.vue | 2 +- vue/src/components/DictData/index.js | 30 +- vue/src/components/Editor/index.vue | 416 +- vue/src/components/FileUpload/index.vue | 57 +- vue/src/components/HeaderSearch/index.vue | 1 - vue/src/components/ImagePreview/index.vue | 90 + vue/src/components/ImageUpload/index.vue | 78 +- vue/src/components/Pagination/index.vue | 7 + vue/src/components/RightPanel/index.vue | 49 +- vue/src/components/RightToolbar/index.vue | 21 +- vue/src/components/TopNav/index.vue | 52 +- vue/src/directive/index.js | 2 + vue/src/directive/module/clipboard.js | 54 + vue/src/layout/components/AppMain.vue | 10 +- .../layout/components/IframeToggle/index.vue | 24 + vue/src/layout/components/InnerLink/index.vue | 62 +- vue/src/layout/components/Navbar.vue | 8 + vue/src/layout/components/Settings/index.vue | 140 +- vue/src/layout/components/Sidebar/Item.vue | 6 +- vue/src/layout/components/Sidebar/Logo.vue | 13 +- vue/src/layout/components/TagsView/index.vue | 6 + vue/src/layout/index.vue | 8 +- vue/src/lib/currency.js | 3 +- vue/src/main.js | 29 +- vue/src/permission.js | 30 +- vue/src/plugins/download.js | 21 +- vue/src/plugins/tab.js | 13 +- vue/src/router/index.js | 60 +- vue/src/settings.js | 2 +- vue/src/store/getters.js | 1 + vue/src/store/index.js | 2 + vue/src/store/modules/app.js | 12 +- vue/src/store/modules/dict.js | 50 + vue/src/store/modules/permission.js | 29 +- vue/src/store/modules/settings.js | 17 +- vue/src/store/modules/tagsView.js | 45 +- vue/src/store/modules/user.js | 169 +- vue/src/utils/auth.js | 13 + vue/src/utils/busEvent.js | 5 + vue/src/utils/dict/DictMeta.js | 2 +- vue/src/utils/generator/drawingDefault.js | 29 + vue/src/utils/generator/html.js | 4 +- vue/src/utils/generator/js.js | 2 +- vue/src/utils/index.js | 37 +- vue/src/utils/map.js | 2 +- vue/src/utils/mqttTool.js | 136 +- vue/src/utils/request.js | 93 +- vue/src/utils/ruoyi.js | 337 +- vue/src/utils/validate.js | 31 + vue/src/views/bigScreen/home.scss | 11 +- vue/src/views/bigScreen/home.vue | 143 +- .../views/bigScreen/indexs/center-bottom.vue | 319 +- vue/src/views/bigScreen/indexs/center-map.vue | 752 +- vue/src/views/bigScreen/indexs/index.vue | 193 +- .../views/bigScreen/indexs/left-bottom.vue | 322 +- .../views/bigScreen/indexs/left-center.vue | 321 +- vue/src/views/bigScreen/indexs/left-top.vue | 291 +- .../views/bigScreen/indexs/right-bottom.vue | 266 +- .../views/bigScreen/indexs/right-center.vue | 220 +- vue/src/views/bigScreen/indexs/right-top.vue | 349 +- vue/src/views/dashboard/BarChart.vue | 2 +- vue/src/views/dashboard/LineChart.vue | 2 +- vue/src/views/dashboard/PieChart.vue | 2 +- vue/src/views/dashboard/RaddarChart.vue | 2 +- vue/src/views/index.vue | 1949 +++-- vue/src/views/iot/business/index.vue | 19 + vue/src/views/iot/category/index.vue | 152 +- vue/src/views/iot/device/device-edit.vue | 1407 ++-- .../views/iot/device/device-functionlog.vue | 222 + vue/src/views/iot/device/device-log.vue | 143 +- vue/src/views/iot/device/device-monitor.vue | 296 + vue/src/views/iot/device/device-statistic.vue | 379 +- vue/src/views/iot/device/device-timer.vue | 1465 ++-- vue/src/views/iot/device/device-user.vue | 540 +- vue/src/views/iot/device/index.vue | 1292 ++-- vue/src/views/iot/device/product-list.vue | 4 + vue/src/views/iot/device/running-status.vue | 1353 ++-- vue/src/views/iot/group/index.vue | 533 +- vue/src/views/iot/netty/clients.vue | 324 + vue/src/views/iot/netty/mqtt.vue | 346 + vue/src/views/iot/news/index.vue | 357 +- vue/src/views/iot/newsCategory/index.vue | 157 +- vue/src/views/iot/product/index.vue | 71 +- .../views/iot/product/product-authorize.vue | 8 +- vue/src/views/iot/product/product-edit.vue | 497 +- .../iot/product/product-select-template.vue | 105 +- .../iot/product/product-things-model.vue | 1508 ++-- vue/src/views/iot/protocol/index.vue | 234 + vue/src/views/iot/template/index.vue | 1359 ++-- vue/src/views/iot/template/parameter.vue | 440 ++ vue/src/views/login.vue | 799 +- vue/src/views/monitor/cache/index.vue | 24 +- vue/src/views/monitor/cache/list.vue | 241 + vue/src/views/monitor/job/index.vue | 17 +- vue/src/views/monitor/job/log.vue | 10 +- vue/src/views/monitor/logininfor/index.vue | 36 +- vue/src/views/monitor/online/index.vue | 4 +- vue/src/views/monitor/operlog/index.vue | 9 +- vue/src/views/monitor/server/index.vue | 6 +- vue/src/views/register.vue | 668 +- vue/src/views/system/config/index.vue | 7 +- vue/src/views/system/dept/index.vue | 23 +- vue/src/views/system/dict/data.vue | 18 +- vue/src/views/system/dict/index.vue | 7 +- vue/src/views/system/menu/index.vue | 21 +- vue/src/views/system/notice/index.vue | 571 +- vue/src/views/system/post/index.vue | 6 +- vue/src/views/system/role/authUser.vue | 4 +- vue/src/views/system/role/index.vue | 30 +- vue/src/views/system/role/selectUser.vue | 4 +- vue/src/views/system/user/authRole.vue | 2 +- vue/src/views/system/user/index.vue | 41 +- vue/src/views/system/user/profile/index.vue | 389 +- .../views/system/user/profile/resetPwd.vue | 31 +- .../views/system/user/profile/userAvatar.vue | 33 +- .../views/system/user/profile/userInfo.vue | 2 +- vue/src/views/tool/build/CodeTypeDialog.vue | 4 +- vue/src/views/tool/build/RightPanel.vue | 2 +- vue/src/views/tool/build/TreeNodeDialog.vue | 4 +- vue/src/views/tool/build/index.vue | 8 +- vue/src/views/tool/gen/editTable.vue | 13 +- vue/src/views/tool/gen/importTable.vue | 4 +- vue/src/views/tool/gen/index.vue | 18 +- vue/vue.config.js | 143 +- 999 files changed, 115642 insertions(+), 10757 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 RoadMap.md create mode 100644 doc/CHANGELOG.md create mode 100644 doc/Git提交规范.md create mode 100644 doc/贡献者指南.md create mode 100644 docker/Dockerfile create mode 100644 docker/README.md create mode 100644 docker/data/docker-compose-emqx.yml create mode 100644 docker/data/emqx/etc/acl.conf create mode 100644 docker/data/emqx/etc/emqx.conf create mode 100644 docker/data/java/libtaos.so create mode 100644 docker/data/java/放置fastbee-admin.jar包.txt create mode 100644 docker/data/mysql/initdb/fastbee2.0.sql create mode 100644 docker/data/nginx/h5/放置移动端h5打包文件.txt create mode 100644 docker/data/nginx/nginx-emqx.conf create mode 100644 docker/data/nginx/ssl/fastbee.crt create mode 100644 docker/data/nginx/ssl/fastbee.key create mode 100644 docker/data/nginx/ssl/放置ssl证书.txt create mode 100644 docker/data/nginx/vue/放置前端打包文件.txt create mode 100644 docker/data/nginx/www/部署官网.txt create mode 100644 docker/data/tdengine/tdengine文件.txt create mode 100644 docker/settings.xml create mode 100644 docker/sources.list create mode 100644 sdk/合宙/air780e/lua/WeiMeiApp.lua create mode 100644 sdk/合宙/air780e/lua/WeiMeiComAuth.lua create mode 100644 sdk/合宙/air780e/lua/WeiMeiComInteraction.lua create mode 100644 sdk/合宙/air780e/lua/WuMeiTest.lua create mode 100644 sdk/合宙/air780e/lua/main.lua create mode 100644 sdk/合宙/air780e/lua/mainAir724.lua create mode 100644 sdk/合宙/air780e/lua/mainVscode.lua create mode 100644 springboot/fastbee-admin/pom.xml create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeApplication.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeServletInitializer.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CaptchaController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CommonController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/CacheController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/ServerController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysLogininforController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysOperlogController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysUserOnlineController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysConfigController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDeptController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictDataController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictTypeController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysIndexController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysLoginController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysMenuController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysPostController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysProfileController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRegisterController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRoleController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/SwaggerController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController2.java create mode 100644 springboot/fastbee-admin/src/main/java/com/fastbee/web/core/config/SwaggerConfig.java create mode 100644 springboot/fastbee-admin/src/main/resources/META-INF/spring-devtools.properties create mode 100644 springboot/fastbee-admin/src/main/resources/application-dev.yml create mode 100644 springboot/fastbee-admin/src/main/resources/application-prod.yml create mode 100644 springboot/fastbee-admin/src/main/resources/application.yml create mode 100644 springboot/fastbee-admin/src/main/resources/banner.txt create mode 100644 springboot/fastbee-admin/src/main/resources/i18n/messages.properties create mode 100644 springboot/fastbee-admin/src/main/resources/logback.xml create mode 100644 springboot/fastbee-admin/src/main/resources/mybatis/mybatis-config.xml create mode 100644 springboot/fastbee-common/pom.xml create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Anonymous.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataScope.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataSource.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DictFormat.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excel.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excels.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Log.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RateLimiter.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RepeatSubmit.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/SysProtocol.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/config/DeviceTask.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/config/RuoYiConfig.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/CacheConstants.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/Constants.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/FastBeeConstant.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/GenConstants.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/HttpStatus.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ProductAuthConstant.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ScheduleConstants.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/SipConstants.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/constant/UserConstants.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/controller/BaseController.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/AjaxResult.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseDO.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseEntity.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/CommonResult.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageParam.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageResult.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/R.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/SortingField.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TenantBaseDO.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeEntity.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeSelect.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDept.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictData.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysMenu.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysRole.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysUser.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindLoginBody.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindRegisterBody.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginBody.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginUser.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/RegisterBody.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DashDeviceTotalDto.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DeCodeBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/IdentityAndName.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReplyBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReport.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReportBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceStatusBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/InvokeReqDto.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MQSendMessageBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MessageReplyBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceData.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceDownMessage.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceFunctionMessage.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceMessage.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/InstructionsMessage.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/MqttBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/PropRead.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/ProtocolDto.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/SubDeviceMessage.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaReplyMessage.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeBo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeDelayTask.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/PageDomain.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableDataInfo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableSupport.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/Message.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/modbus/ModbusCode.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisCache.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyDefine.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyRegistry.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/CharsetKit.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/Convert.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/IntArrayValuable.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/KeyValue.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/StrFormatter.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/NeuronModel.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessStatus.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/CommonStatusEnum.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataEnum.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataSourceType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DeviceStatus.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ExceptionCode.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/FunctionReplyStatus.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/GlobalErrorCodeConstants.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/HttpMethod.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/IErrorCode.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/LimitType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ModbusDataType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OTAUpgrade.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OperatorType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ResultCode.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ServerType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/SocialPlatformType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ThingsModelType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/TopicType.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/UserStatus.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/enums/VerifyTypeEnum.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/DemoModeException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ErrorCode.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/GlobalException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServerException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceExceptionUtil.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/UtilException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/base/BaseException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileNameLengthLimitExceededException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileSizeLimitExceededException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/InvalidExtensionException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttAuthorizationException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttClientUserNameOrPassException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/job/TaskException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaExpireException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordNotMatchException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordRetryLimitExceedException.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/filter/PropertyPreExcludeFilter.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatableFilter.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatedlyRequestWrapper.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssFilter.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssHttpServletRequestWrapper.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Arith.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/BeanMapUtilByReflect.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/CaculateUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DateUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DictUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DigestUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/EncodeUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtil.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/LogUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MapUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Md5Utils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MessageUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/PageUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/SecurityUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ServletUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/StringUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Threads.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ValidationUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/VerifyCodeUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanValidators.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/collection/CollectionUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/DateUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/LocalDateTimeUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileTypeUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/ImageUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/MimeTypeUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC16Utils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC8Utils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/Topics.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsPost.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/ByteUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/NettyUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/EscapeUtil.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/HTMLFilter.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpHelper.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/AddressUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/IpUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/json/JsonUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/object/ObjectUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelHandlerAdapter.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelUtil.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/reflect/ReflectUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Base64.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Md5Utils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/spring/SpringUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sql/SqlUtil.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/IdUtils.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/Seq.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/UUID.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatAppResult.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginBody.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginResult.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatMiniProgramResult.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatPhoneInfo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatUserInfo.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/xss/Xss.java create mode 100644 springboot/fastbee-common/src/main/java/com/fastbee/common/xss/XssValidator.java create mode 100644 springboot/fastbee-framework/pom.xml create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataScopeAspect.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataSourceAspect.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/LogAspect.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/RateLimiterAspect.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ApplicationConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/CaptchaConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/DruidConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FastJson2JsonRedisSerializer.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FilterConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/KaptchaTextCreator.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/MyBatisConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/RedisConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/SecurityConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ServerConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ThreadPoolConfig.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/DruidProperties.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/PermitAllUrlProperties.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSource.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSourceContextHolder.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/RepeatSubmitInterceptor.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/impl/SameUrlDataInterceptor.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/AsyncManager.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/ShutdownManager.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/factory/AsyncFactory.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/LambdaQueryWrapperX.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/QueryWrapperX.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/mapper/BaseMapperX.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/utils/MyBatisUtils.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/AuthenticationContextHolder.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/PermissionContextHolder.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/filter/JwtAuthenticationTokenFilter.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/AuthenticationEntryPointImpl.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/LogoutSuccessHandlerImpl.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/Server.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Cpu.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Jvm.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Mem.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Sys.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/SysFile.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/exception/GlobalExceptionHandler.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/PermissionService.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysLoginService.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPasswordService.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPermissionService.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysRegisterService.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/TokenService.java create mode 100644 springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/UserDetailsServiceImpl.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/pom.xml create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/config/MqConfig.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/model/ReportDataBo.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttClientConfig.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttService.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttCallBack.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttClient.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/config/RedisConsumeConfig.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/DeviceOtherMsgConsumer.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/RedisChannelConsume.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/listen/DeviceOtherListen.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/producer/MessageProducer.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/queue/DeviceOtherQueue.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDataHandler.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDeviceReportMessageService.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IFunctionInvoke.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMessagePublishService.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMqttMessagePublish.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/DeviceOtherMsgHandler.java create mode 100644 springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/FunctionInvokeImpl.java create mode 100644 springboot/fastbee-gateway/gateway-boot/pom.xml create mode 100644 springboot/fastbee-gateway/gateway-boot/src/main/java/com/fastbee/gateway/boot/start/StartBoot.java create mode 100644 springboot/fastbee-gateway/pom.xml create mode 100644 springboot/fastbee-open-api/pom.xml create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/AuthResourceController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/CategoryController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceJobController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceLogController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceUserController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/EventLogController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/FunctionLogController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/GroupController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsCategoryController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/OauthClientDetailsController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductAuthorizeController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialLoginController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialPlatformController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelTemplateController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ToolController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/UserSocialController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/dashBoard/DashBoardController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/netty/NettyManagerController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/protocol/ProtocolController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/runtime/DeviceRuntimeController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/wechat/WeChatController.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/AbstractQuartzJob.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/CronUtils.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/JobInvokeUtil.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzDisallowConcurrentExecution.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzJobExecution.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/ScheduleUtils.java create mode 100644 springboot/fastbee-open-api/src/main/java/com/fastbee/data/service/impl/DeviceJobServiceImpl.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/pom.xml create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/config/GenConfig.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/controller/GenController.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTable.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTableColumn.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableColumnMapper.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableMapper.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableColumnServiceImpl.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableServiceImpl.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableColumnService.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableService.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/GenUtils.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityInitializer.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityUtils.java create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/generator.yml create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/controller.java.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/domain.java.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/mapper.java.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/service.java.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/sub-domain.java.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/js/api.js.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/sql/sql.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index.vue.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index.vue.vm create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/readme.txt create mode 100644 springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 springboot/fastbee-plugs/fastbee-quartz/pom.xml create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/config/ScheduleConfig.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobController.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobLogController.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJob.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJobLog.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobLogMapper.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobMapper.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobLogService.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobService.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobLogServiceImpl.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobServiceImpl.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/task/RyTask.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/AbstractQuartzJob.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/CronUtils.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/JobInvokeUtil.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzDisallowConcurrentExecution.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzJobExecution.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/ScheduleUtils.java create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml create mode 100644 springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml create mode 100644 springboot/fastbee-plugs/pom.xml create mode 100644 springboot/fastbee-protocol/fastbee-protocol-collect/pom.xml create mode 100644 springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/common/ProtocolDeCodeService.java create mode 100644 springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/json/JsonProtocolService.java create mode 100644 springboot/fastbee-protocol/pom.xml create mode 100644 springboot/fastbee-server/base-server/pom.xml create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/Delimiter.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/LengthField.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageDecoder.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageEncoder.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/AbstractHandlerMapping.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/DefaultHandlerMapping.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerInterceptor.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerMapping.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/SpringHandlerMapping.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Async.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/AsyncBatch.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Node.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/PakMapping.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/AsyncBatchHandler.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/BaseHandler.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/SyncHandler.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/model/Response.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/DeviceMsg.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/SessionKey.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/ISessionStore.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/impl/SessionStoreImpl.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Packet.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionListener.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionManager.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/AttributeUtils.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ClassUtils.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ConcurrentStorage.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/DeviceUtils.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Stopwatch.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Storage.java create mode 100644 springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/VirtualList.java create mode 100644 springboot/fastbee-server/boot-strap/pom.xml create mode 100644 springboot/fastbee-server/boot-strap/src/main/java/com/fastbee/bootstrap/mqtt/MQTTBootStrap.java create mode 100644 springboot/fastbee-server/iot-server-core/pom.xml create mode 100644 springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/Server.java create mode 100644 springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/config/NettyConfig.java create mode 100644 springboot/fastbee-server/mqtt-broker/pom.xml create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/annotation/Process.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/auth/AuthService.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/codec/WebSocketMqttCodec.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttConnect.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttDisConnect.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPingreq.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubAck.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRec.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRel.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubcomp.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPublish.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttSubscribe.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttUnsubscribe.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttHandler.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageAdapter.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageDelegate.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ClientManager.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/MqttRemoteManager.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ResponseManager.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/RetainMsgManager.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/SessionManger.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/WillMessageManager.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/ClientMessage.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/PushMessageBo.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/RetainMessage.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/Subscribe.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/WillMessage.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/MqttServer.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/WebSocketServer.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/IMessageStore.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/ISubscriptionService.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DataHandlerImpl.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DeviceReportMessageServiceImpl.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MessageStoreImpl.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MqttMessagePublishImpl.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/SubscriptionServiceImpl.java create mode 100644 springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/utils/MqttMessageUtils.java create mode 100644 springboot/fastbee-server/pom.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/pom.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Category.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Device.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceGroup.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceJob.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceLog.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceUser.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/EventLog.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/FunctionLog.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Group.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/News.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/NewsCategory.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/OauthClientDetails.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Product.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ProductAuthorize.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Protocol.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialPlatform.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialUser.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModelTemplate.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/UserSocialProfile.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTemp.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTempSalve.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/enums/DeviceType.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/CategoryMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceJobMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceLogMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/EventLogMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/FunctionLogMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/GroupMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsCategoryMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/OauthClientDetailsMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductAuthorizeMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProtocolMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialPlatformMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelTemplateMapper.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Action.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/AuthenticateInputModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/CategoryNews.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ChangeProductStatusModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DataResult.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceAllShortOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceGroupInput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttConnectVO.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttVO.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceNumberAndProductId.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateAlertLogVO.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateUserInput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceShortOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceStatistic.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/HistoryModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdAndName.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ImportThingsModelInput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MonitorModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttAuthenticationModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttClientConnectModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttInfoModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/NtpModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthenticateModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthorizeVO.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductCode.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserInput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Specs.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ArrayModelOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/BoolModelOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/Datatype.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/DecimalModelOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItem.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItemOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumModelOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/IntegerModelOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ReadOnlyModelOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/StringModelOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModelItemBase.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelPerm.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/EventDto.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/FunctionDto.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/PropertyDto.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsItems.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelShadow.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItem.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItemDto.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValuesOutput.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelsDto.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ValueItem.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/TriggerParameter.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/UserIdDeviceIdModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttMetrics.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttStat.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dto/DeviceRtDto.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/AuthRequestWrap.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/BindIdValue.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/LoginIdValue.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/WeChatLoginQrRes.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceSlavePoint.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceTemp.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/EnumClass.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SlaveIdAndId.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SyncModel.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/AuthorizationServerConfig.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/ResourceServerConfig.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/SpeakerApprovalHandler.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/ConfirmAccessController.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/LoginController.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/SpeakerController.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IAuthRequestFactory.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ICategoryService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceJobService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceLogService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceRuntimeService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceUserService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IEventLogService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IFunctionLogService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IGroupService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsCategoryService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IOauthClientDetailsService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductAuthorizeService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProtocolService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialLoginService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialPlatformService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelTemplateService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IToolService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IUserSocialProfileService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IDeviceCache.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IFirmwareCache.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/DeviceCacheImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/FirmwareCacheImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthRequestFactoryImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthStateRedisCache.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/CategoryServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceLogServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceRuntimeServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceUserServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/EventLogServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/FunctionLogServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/GroupServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsCategoryServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/OauthClientDetailsServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductAuthorizeServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProtocolServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialLoginServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialPlatformServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelTemplateServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ToolServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/UserSocialProfileServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/ILogService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/impl/MySqlLogServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/model/TdLogDto.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/AESUtils.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/SnowflakeIdWorker.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityInitializer.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityUtils.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxBindReqVO.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxCancelBindReqVO.java create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/CategoryMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceJobMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceLogMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceUserMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/EventLogMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/FunctionLogMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/GroupMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsCategoryMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/OauthClientDetailsMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductAuthorizeMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProtocolMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialPlatformMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelTemplateMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempSalveMapper.xml create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css.map create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css.map create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css.map create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.min.css create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.min.css.map create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/fonts/glyphicons-halflings-regular.eot create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/fonts/glyphicons-halflings-regular.svg create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/fonts/glyphicons-halflings-regular.ttf create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/fonts/glyphicons-halflings-regular.woff create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/fonts/glyphicons-halflings-regular.woff2 create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/js/bootstrap.js create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/js/bootstrap.min.js create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/js/npm.js create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/templates/oauth/access_confirmation.html create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/templates/oauth/clientDetails.html create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/templates/oauth/index.html create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/templates/oauth/login.html create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/java/controller.java.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/java/domain.java.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/java/mapper.java.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/java/service.java.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/java/sub-domain.java.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/js/api.js.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/sql/sql.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/vue/index.vue.vm create mode 100644 springboot/fastbee-service/fastbee-iot-service/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 springboot/fastbee-service/fastbee-system-service/pom.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysCache.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysConfig.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysLogininfor.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysNotice.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysOperLog.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysPost.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysRoleDept.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysRoleMenu.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysUserOnline.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysUserPost.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysUserRole.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/vo/MetaVo.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/vo/RouterVo.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysConfigMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysDeptMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysDictDataMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysDictTypeMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysLogininforMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysMenuMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysNoticeMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysOperLogMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysPostMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysRoleDeptMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysRoleMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysRoleMenuMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysUserMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysUserPostMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/mapper/SysUserRoleMapper.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysConfigService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysDeptService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysDictDataService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysDictTypeService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysLogininforService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysMenuService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysNoticeService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysOperLogService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysPostService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysRoleService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysUserOnlineService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/ISysUserService.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysConfigServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysDeptServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysDictDataServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysLogininforServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysMenuServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysNoticeServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysOperLogServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysPostServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysRoleServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysUserOnlineServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysUserServiceImpl.java create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysConfigMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysDeptMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysDictDataMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysDictTypeMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysLogininforMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysMenuMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysNoticeMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysOperLogMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysPostMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysRoleDeptMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysRoleMenuMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysUserPostMapper.xml create mode 100644 springboot/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysUserRoleMapper.xml create mode 100644 springboot/fastbee-service/pom.xml create mode 100644 springboot/fastbee.bat create mode 100644 springboot/fastbee.sh create mode 100644 springboot/sql/fastbee2.0.sql create mode 100644 springboot/sql/其他/clear-data.sql create mode 100644 vue/.prettierignore create mode 100644 vue/.prettierrc.js create mode 100644 vue/src/api/iot/eventLog.js create mode 100644 vue/src/api/iot/functionLog.js create mode 100644 vue/src/api/iot/netty.js create mode 100644 vue/src/api/iot/point.js create mode 100644 vue/src/api/iot/protocol.js create mode 100644 vue/src/api/iot/runstatus.js create mode 100644 vue/src/api/iot/salve.js create mode 100644 vue/src/api/iot/temp.js create mode 100644 vue/src/api/tool/ossConfig.js create mode 100644 vue/src/api/tool/ossDetail.js create mode 100644 vue/src/assets/icons/svg/arrow-left.svg create mode 100644 vue/src/assets/icons/svg/big.svg create mode 100644 vue/src/assets/icons/svg/channel.svg create mode 100644 vue/src/assets/icons/svg/live.svg create mode 100644 vue/src/assets/icons/svg/live1.svg create mode 100644 vue/src/assets/icons/svg/qrcode.svg create mode 100644 vue/src/assets/icons/svg/redis-list.svg create mode 100644 vue/src/assets/icons/svg/small.svg create mode 100644 vue/src/assets/icons/svg/video.svg create mode 100644 vue/src/assets/icons/svg/videotape.svg create mode 100644 vue/src/assets/images/gateway.png create mode 100644 vue/src/assets/images/orange.svg create mode 100644 vue/src/assets/images/product.png create mode 100644 vue/src/assets/images/qq.png create mode 100644 vue/src/assets/images/video.png create mode 100644 vue/src/assets/images/weChat.png create mode 100644 vue/src/assets/images/zlm-logo.png create mode 100644 vue/src/components/ImagePreview/index.vue create mode 100644 vue/src/directive/module/clipboard.js create mode 100644 vue/src/layout/components/IframeToggle/index.vue create mode 100644 vue/src/store/modules/dict.js create mode 100644 vue/src/utils/busEvent.js create mode 100644 vue/src/utils/generator/drawingDefault.js create mode 100644 vue/src/views/iot/business/index.vue create mode 100644 vue/src/views/iot/device/device-functionlog.vue create mode 100644 vue/src/views/iot/device/device-monitor.vue create mode 100644 vue/src/views/iot/netty/clients.vue create mode 100644 vue/src/views/iot/netty/mqtt.vue create mode 100644 vue/src/views/iot/protocol/index.vue create mode 100644 vue/src/views/iot/template/parameter.vue create mode 100644 vue/src/views/monitor/cache/list.vue diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..5ea51169 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,22 @@ + +## [v2.0.0] - 2024-01-31 + +### 新增功能 +- 支持netty mqtt broker ([#1]()) +- 支持多种编码协议管理([#2]()) +- 支持emqx5.0([#3]()) + +### 功能优化 +- 设备列表卡片优化,设备详情页面优化 +- 物模型功能优化 +- 产品管理功能优化 + +### 代码重构 +- java项目代码目录重新调整 +- 消息网关重构 + +### 其他事务 +- 新增Git提交规范([#Git提交规范](https://gitee.com/kerwincui/wumei-smart/blob/master/doc/Git%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83.md)) +- 新增贡献者指南([#贡献者指南](https://gitee.com/kerwincui/wumei-smart/blob/master/doc/%E8%B4%A1%E7%8C%AE%E8%80%85%E6%8C%87%E5%8D%97.md)) +- 新增功能规划([#功能规划](https://gitee.com/kerwincui/wumei-smart/blob/master/RoadMap.md)) +- 修改项目AGPL3协议商用授权说明 diff --git a/README.md b/README.md index c1372050..45236085 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,40 @@ 1. FastBee开源物联网平台,简单易用,更适合中小企业和个人学习使用。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 2. 系统后端采用Spring boot;前端采用Vue;消息服务器采用EMQX;移动端支持微信小程序、安卓、苹果和H5采用Uniapp;数据库采用Mysql、TDengine和Redis;设备端支持ESP32、ESP8266、树莓派、合宙等; - + ### 二、系统功能 -- 权限管理: 用户管理、部门管理、岗位管理、菜单管理、角色管理、字典和参数管理等 -- 系统监控: 操作日志、登录日志、系统日志、在线用户、服务监控、连接池监控、缓存监控等 -- 产品管理: 产品、产品物模型、产品分类、产品固件、设备授权码、自定义告警等 -- 设备管理: 设备控制、设备分组、设备定时、设备日志、监测统计、设备定位、设备分享、设备禁用、OTA升级、实时状态、影子模式、实时监测、加密认证等 -- EMQ管理: Mqtt客户端、监听器、消息主题、消息订阅、插件管理、规则引擎、资源 -- 硬件 SDK: 支持WIFI和MQTT连接、物模型响应、实时监测、定时上报数据、AES加密、NTP时间、AP配网等 -- 物模型管理: 属性(设备状态和监测数据),功能(执行特定任务),事件(设备主动上报给云端) -- 扩展模块: 智能音响(小度、天猫精灵、小爱同学)、web组态等 -- 其他功能:网关、TCP/Modbus/协议和netty-mqtt支持、视频监控、多租户、场景联动、数据可视化平台、统计、新闻资讯、通知公告、支持TDengine时序数据库 + +| 系统功能 | 功能说明 | 开源版本 | 商业版本 | +|:--------:|:-----------------------------------------------:|------|--------------| +| 产品管理 | 产品详情、产品物模型、产品分类、设备授权、产品固件 | 支持 | 支持 | +| 设备管理 | 设备详情、设备分组、设备日志、设备分享、设备实时控制、实时状态、数据监测 | 支持 | 支持 | +| 物模型管理 | 属性(设备状态和监测数据),功能(执行特定任务),事件(设备主动上报给云端) | 支持 | 支持 | +| MQTT接入 | emqx开源版、netty版本MqttBroker | 支持 | 支持 | +| 硬件 SDK | ESP-IDF、Arduino、RaspberryPi、合宙等平台设备接入 | 支持 | 支持 | +| 视频监控接入 | 基于GB/T28181协议支持主流厂商监控设备接入,直播、设备录制回放、 云端录像和云台控制 | 支持设备接入和直播 | 支持 | +| 多协议管理 | 硬件设备多种协议支持管理 | 支持JSON | 支持多种 | +| TCP接入 | 基于Netty搭建的TCP服务器 | 不支持 | 支持 | +| UDP接入 | 基于Netty搭建的UDP服务器 | 不支持 | 支持 | +| Modbus接入 | 透传Modbus/边缘网关接入Modbus设备 | 不支持 | 支持 | +| 采集点管理 | 网关设备管理子设备接入 | 不支持 | 支持 | +| OTA升级 | 固件在线升级 | 不支持 | 支持 | +| 设备模拟器调试 | Modbus设备在线调试 | 不支持 | 支持 | +| 数据大屏 | 数据大屏可视化,将图表或页面元素封装为基础组件,0代码即可完成业务需求。 | 不支持 | 支持 | +| 规则引擎-规则脚本 | 可视化规则引擎编写,支持js,java等脚本修改消息结构,处理设备上行/下行/上线/下线/数据解析/数据转换 | 不支持 | 支持 | +| 场景联动 | 基于规则引擎生成场景联动 | 不支持 | 支持 | +| 告警&&告警配置&&告警记录 | 告警: 设备告警/平台告警判定 告警配置: 基于规则引擎开发的平台告警判定 告警记录:设备告警记录入库 | 不支持 | 支持 | +| 通知渠道 &&通知面板&&通知日志 | 阿里云短信/腾讯云短信阿里云语言/腾讯云语音/QQ邮箱/163邮箱/微信小程序/企业微信群机器人/企业微信应用信息/钉钉消息通知/钉钉群机器人 | 不支持 | 支持 | +| 多租户 | 系统内租户的管理,独占一套系统配置,数据相互隔离。如:租户权限、过期时间、用户数量、企业信息等 | 不支持 | 支持 | +| 移动端app | 移动端(安卓 / 苹果 / 微信小程序) | 不支持 | 支持 | +| 云云对接 -智能音响(小度、天猫精灵、小爱同学) | 云云对接 | 不支持 | 额外付费模块 | +| web组态 | 自定义数据大屏/2D/3D | 不支持 | 额外付费模块 | +| 萤石云,海康sdk接入、AI SDK接入 | 视频接入 | 不支持 | 额外付费模块 | +| 数据存储 | 设备数据处理 | redis存储最后一条数据,不支持实时更新 | redis存储最新数据,实时更新/mysql存储系统数据/TDengine时序数据库存储设备数据 | +| 设备接入数/上行数据并发支持 | 设备接入数,以及设备数据并发量 | 支持小规模设备接入,同步处理数据 | 支持规模量大设备。消息队列削峰,线程池异步处理高并发数据 | +| 技术支持 | | 不支持 | 提供一定的技术支持/技术方案 | + + ![](https://oscimg.oschina.net/oscnet/up-a9a7fdaf40208becd26c2485783bc0f86e6.png) @@ -26,55 +48,63 @@ | ![](https://oscimg.oschina.net/oscnet/up-ad98a81677e5e68d660866770e3266ca4cf.png) | ![](https://oscimg.oschina.net/oscnet/up-68caf860d0659444e73f42717a03d2fdf72.png) | ![](https://oscimg.oschina.net/oscnet/up-cf690f6058042dccb567ff382ea9432ebab.png) |![](https://oscimg.oschina.net/oscnet/up-c4a7971510127324d6566dd6ea95d571483.jpg) | ![](https://oscimg.oschina.net/oscnet/up-4ce09be3599e3ff7ed91fe182572abd258b.jpg) | -### 三、技术栈 +### 三、技术栈 * 服务端 - - 相关技术:Spring boot、MyBatis、Spring Security、Jwt、Mysql、Redis、TDengine、EMQX、Netty等 - - 开发工具:IDEA +- 相关技术:Spring boot、MyBatis、Spring Security、Jwt、Mysql、Redis、TDengine、EMQX、Netty等 +- 开发工具:IDEA * Web端 - - 相关技术:ES6、Vue、Vuex、Vue-router、Vue-cli、Axios、Element-ui、Echart等 - - 开发工具:Visual Studio Code +- 相关技术:ES6、Vue、Vuex、Vue-router、Vue-cli、Axios、Element-ui、Echart等 +- 开发工具:Visual Studio Code * 移动端(微信小程序 / Android / Ios / H5) - - 相关技术:uniapp、[uView](https://www.uviewui.com/)、[uChart](https://www.ucharts.cn/) - - 开发工具:HBuilder +- 相关技术:uniapp、[uView](https://www.uviewui.com/)、[uChart](https://www.ucharts.cn/) +- 开发工具:HBuilder * 硬件端 - - 相关技术: ESP-IDF、Arduino、FreeRTOS、Python、Lua等 - - 开发工具:Visual Studio Code 和 Arduino等 +- 相关技术: ESP-IDF、Arduino、FreeRTOS、Python、Lua等 +- 开发工具:Visual Studio Code 和 Arduino等 ### 四、项目目录 -     spring-boot --------------- 后端
-     vue ----------------------- 前端
-     docker -------------------- docker部署文件
-     sdk ----------------------- 硬件SDK,已集成多种设备
+     app -------------------- 移动端(微信小程序 / Android / Ios / H5) 商业版开源
+     docker ---------------- docker部署文件
+     sdk -------------------- 硬件SDK,已集成多种设备
+     spring-boot ---------- 后端
+     vue -------------------- 前端
### 五、商用授权 项目采用AGPL3协议,可用于个人学习和使用,商业用途需要赞助项目,获得授权,并提供商业版本源码、可视化平台和移动端源码。赞助过的用户请下载商业版本源码。 - [授权详情>>](https://fastbee.cn/doc/pages/sponsor/)   [商业版本源码>>](https://fastbee.cn/doc/pages/sponsor/) -- [移动端源码>>](https://fastbee.cn/doc/pages/sponsor/)   [可视化平台源码>>](https://fastbee.cn/doc/pages/sponsor/) +- [移动端源码>>](https://fastbee.cn/doc/pages/sponsor/)   [可视化平台源码>>](https://fastbee.cn/doc/pages/sponsor/) +- 二开项目同样遵守AGPL3.0协议进行开源,可以向原作者申请授权 +- 如果商业项目想转闭源,可以向原作者申请或者购买闭源授权 +### 六、贡献代码 +- [贡献者指南>>](./doc/贡献者指南.md) +- [Git提交规范>>](./doc/Git提交规范.md) +- [功能规划>>](./RoadMap.md) -### 六、其他 +### 七、其他 1. QQ交流群:🚀946029159 🚀1073236354(已满) -2. 权限管理基于ruoyi-vue系统开发,Mqtt消息服务器使用EMQX4.0开源版 +2. 权限管理基于ruoyi-vue系统开发,Mqtt消息服务器使用EMQX5.0开源版 - * [在线演示](https://iot.fastbee.cn/) - * [项目使用文档](https://fastbee.cn/doc/) - * [若依权限管理系统文档](http://doc.ruoyi.vip/ruoyi-vue/) - * [EMQX4.0消息服务器文档](https://www.emqx.io/docs/zh/v4.0/) - * [uCharts高性能跨平台图表库](https://www.ucharts.cn) +* [开源版本在线演示](http://101.33.237.12/) +* [商业版本在线演示](https://iot.fastbee.cn/) +* [项目使用文档](https://fastbee.cn/doc/) +* [若依权限管理系统文档](http://doc.ruoyi.vip/ruoyi-vue/) +* [EMQX5.0消息服务器文档](https://www.emqx.io/docs/zh/v5.0/) +* [uCharts高性能跨平台图表库](https://www.ucharts.cn) 3. 项目贡献者(如有遗漏请联系作者): - - [小驿物联](https://gitee.com/iot-xiaoyi)、[CrazyDull](https://gitee.com/crazyDull)、[YBZX](https://github.com/YBZX)、 [CQAdu](https://gitee.com/iot.adu)、[孙阿龙](https://gitee.com/sunalong)、[xxmfl](https://gitee.com/xxmfl)、[董晓龙-3715687@qq.com](https://fastbee.cn/) - - [SXH](https://gitee.com/sixiaohu)、 [Redamancy_zxp](https://gitee.com/redamancy-zxp)、 [LEE](https://gitee.com/yueming188)、 [LemonTree](https://gitee.com/fishhunterplus)、 [Tang](https://gitee.com/mexiaotang)、 [Tang](https://gitee.com/mexiaotang)、[KUN](https://gitee.com/L_KUN_KUN) +- [小驿物联](https://gitee.com/iot-xiaoyi)、[CrazyDull](https://gitee.com/crazyDull)、[YBZX](https://github.com/YBZX)、 [CQAdu](https://gitee.com/iot.adu)、[孙阿龙](https://gitee.com/sunalong)、[xxmfl](https://gitee.com/xxmfl)、[董晓龙-3715687@qq.com](https://fastbee.cn/) +- [SXH](https://gitee.com/sixiaohu)、 [Redamancy_zxp](https://gitee.com/redamancy-zxp)、 [LEE](https://gitee.com/yueming188)、 [LemonTree](https://gitee.com/fishhunterplus)、 [Tang](https://gitee.com/mexiaotang)、 [Tang](https://gitee.com/mexiaotang)、[KUN](https://gitee.com/L_KUN_KUN) 4. 主要参与用户: - [Guanshubiao](https://gitee.com/guanshubiao):熟悉物联网开发,完善和优化系统的网关架构和部分功能等 - [帐篷](https://gitee.com/zhuangpengli):熟悉物联网开发,完善视频监控模块和部分协议等 - [JaminDeng](https://gitee.com/jamin-deng):熟悉物联网开发,完善平台前端设计可视化等 -### 七、部分图片 +### 八、部分图片 ![](https://oscimg.oschina.net/oscnet/up-972dea7b54eca705dcc8bf2fe0680b12c09.png) ![](https://oscimg.oschina.net/oscnet/up-6d89f1558797a9becf07c20f92c1407a13a.png) @@ -103,4 +133,3 @@ - diff --git a/RoadMap.md b/RoadMap.md new file mode 100644 index 00000000..bcfe1bae --- /dev/null +++ b/RoadMap.md @@ -0,0 +1,57 @@ +# 架构优化 +- 代码简化 +- 业务&协议解耦 +- 关键组件支持横向拓展 +- 网络协议支持横向拓展,包括:mqtt broker,tcp,coap,udp,sip等 +- 协议插件化 +- 编码脚本化 +- 业务代码模版化 +- 消息总线 + +# 功能优化 +- 网关/子网关:上线,绑定,拓扑,消息代理/透传/轮询等功能完善 +- 设备详情简化,运行状态,监测,历史记录等界面优化,组件可编辑 +- 设备OT能力完善,配合SDK完善设备产测,设备出厂配置,设备一键注网,设备批量上线,设备升级,设备维护&替换等流程 +- 设备IT能力完善,更方便对接联动第三方系统,打通数据烟囱,集成更多三方SDK +- 消息路由,消息流转,消息编解码,消息过滤更加灵活 + +# 功能拓展 +- 规则引擎 +- 组态 +- 可视化大屏 +- 视频监控协议 +- 视频分析,图形识别能力 +- coap协议 +- sip协议 +- snmp协议 +- tr069/tr369协议 +- plc对接 +- modbus rtu/ascii/tcp等协议 +- ai能力 +- gpt能力 + +# 设备SDK +- esp-idf框架搭建 +- 基于esp-aliyun编写fastbee相关mqtt接入示例 +- esp-modbus示例完善,增加mqtt透传,主站轮询指令下发等特性 +- esp-aliyun重构,升级esp-idf5.0 +- esp-fastbee组件模块开发 +- rt-thread,openwrt等os接入组件开发 +- 尝试适配更多硬件方案,rk,esp32,stm32,合宙等等 +- 免费帮10家不同类型设备厂商接入平台 + +# 文档完善 +- 新手入门任务 +- 各模块使用说明书 +- 调试方式文档 +- 二次开发说明书 +- 三方工具关键组件使用说明 +- 简化代码二发和部署流程 +- 交付方式优化:docker镜像,一键部署包等方式 + +# 社区建设 +- 发展一批Committer +- 规范issues和pr流程 +- 完善测试用例和测试流程 +- 完善自动化发布,代码静态检查,自动化测试等流程 +- 与行业伙伴共同打造5-8个垂直行业典型案例 \ No newline at end of file diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md new file mode 100644 index 00000000..5ea51169 --- /dev/null +++ b/doc/CHANGELOG.md @@ -0,0 +1,22 @@ + +## [v2.0.0] - 2024-01-31 + +### 新增功能 +- 支持netty mqtt broker ([#1]()) +- 支持多种编码协议管理([#2]()) +- 支持emqx5.0([#3]()) + +### 功能优化 +- 设备列表卡片优化,设备详情页面优化 +- 物模型功能优化 +- 产品管理功能优化 + +### 代码重构 +- java项目代码目录重新调整 +- 消息网关重构 + +### 其他事务 +- 新增Git提交规范([#Git提交规范](https://gitee.com/kerwincui/wumei-smart/blob/master/doc/Git%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83.md)) +- 新增贡献者指南([#贡献者指南](https://gitee.com/kerwincui/wumei-smart/blob/master/doc/%E8%B4%A1%E7%8C%AE%E8%80%85%E6%8C%87%E5%8D%97.md)) +- 新增功能规划([#功能规划](https://gitee.com/kerwincui/wumei-smart/blob/master/RoadMap.md)) +- 修改项目AGPL3协议商用授权说明 diff --git a/doc/Git提交规范.md b/doc/Git提交规范.md new file mode 100644 index 00000000..d4036165 --- /dev/null +++ b/doc/Git提交规范.md @@ -0,0 +1,63 @@ +# 一,conventional commit(约定式提交) +Conventional Commits 是一种用于给提交信息增加人机可读含义的规范。它提供了一组用于创建清晰的提交历史的简单规则。 +## 1.1 作用 +- 自动化生成 CHANGELOG +- 基于提交类型,自动决定语义化的版本变更 +- 向项目相关合作开发者发送变更信心 +- 触发自动化构建和部署流程 +- 给开发者提供一个更加结构化的提交历史,便于减低对项目做贡献的难度 +## 1.2 提交格式 +提交说明的结构如下: +(): +空行 +[可选的正文] +空行 +[可选的脚注] +### 1.2.1 Header +Header部分只有一行,包括三个字段: type(必需)、scope(必需)和subject(必需)。 + +#### (1)type 类型 +type用于说明 commit 的类别,只允许使用下面7个标识: +- feat:新功能(feature) +- fix:修补bug +- docs:文档(documentation) +- style: 格式(不影响代码运行的变动) +- refactor:重构(即不是新增功能,也不是修改bug的代码变动) +- test:增加测试 +- build:构建过程或辅助工具的变动 +#### (2)scope 范围 +scope用于说明 commit 影响的范围,比如指标模板、规则上下线等等,视项目不同而不同。 +#### (3)subject 主题 +subject是 commit 目的的简短描述,不超过50个字符。 +1. 以动词开头,使用第一人称现在时,比如change,而不是changed或changes +2. 第一个字母小写 +3. 结尾不加句号(.) +### 1.2.2 Body 正文 + Body 部分是对本次 commit 的详细描述,可以分成多行。 +1. 需要简要的列出各种正向或者反向的测试场景,测试通过,填pass。 +2. 增加修改人信息 + +## 1.3 例子 +### 1.3.1 feat例子 +``` +feat(规则上下线、构建、生效、仿真生效): 添加规则上下线功能 + +1. 规则上下线主流程,引擎正常订阅,fldl生成正常。 pass +2. 规则上下线,传入不存在的规则编号,异常提示。 pass + +提交人:xxx +``` +### 1.3.2 fix例子 +``` +fix(模型模块): 模型测试失败 + +1. 导入mar模型,包含衍生字段。 pass +2. 导入mar模型,不包含衍生字段。 pass + +提交人:xxx +``` +## 1.4 IDEA插件推荐 + +1. 安装路径:File->Settings->Plugins->Marketplace->搜索Conventional Commit,点击安装即可。 +2. 提交的时候点击中间的小红点创建提交消息,根据对话框提示填写相关信息即可生成规范的提交消息。 + diff --git a/doc/贡献者指南.md b/doc/贡献者指南.md new file mode 100644 index 00000000..8d931a0f --- /dev/null +++ b/doc/贡献者指南.md @@ -0,0 +1,69 @@ +> 非常欢迎参与项目贡献,我们致力于维护一个互相帮助,共同成长社区。 + +# 贡献方式 +在Fastbee 社区,贡献方式有很多: + +- 💻代码:可以帮助社区完成一些任务、编写新的feature或者是修复一些bug; +- ⚠️测试:可以来参与测试代码的编写,包括了单元测试、集成测试、e2e测试; +- ✅编译:构建或者辅助工具建议,包括:Docker,K8s,CI/CD,辅助调试工具等; +- 📖文档:可以编写或完善文档,来帮助用户更好地了解和使用 物联网平台; +- 🤔讨论:可以参与 Fastbee 新的feature的讨论,将您的想法跟 Fastbee 融合; +- 💬建议:也可以对项目或者社区提出一些建议,促进社区的良性发展; +- ❗疑问:问出一个好的问题,同样也可以促进项目发展,拓宽思考方向; + +> 即便是小到错别字的修正我们也都非常欢迎 :) + +# 提PR有以下注意点 +PR统一在Gitee平台上进行提交,如果你不知道如何提交PR,可以在Gitee平台里去学习。这里不作说明。 +- fork后切换到develop分支,请以这个分支为开发基准。 +- 所有的PR提交到develop分支,这个分支为开发分支。 +- 如果你作了功能性的变动,请带上你的测试用例,测试用例规范可以参考之前的测试用例。 +- 所有的PR必须关联至少一个issue,如果没有相关issue,请自行创建一个。 +- 正式提交PR之前,请确保所有的测试用例都通过。 +- Git提交消息,需要按照[Git提交规范](./Git提交规范.md)。 + +# 提交 Pull Request +1. 首先您需要 Fork 目标仓库 Fastbee repository. +2. 然后 用git命令 将代码下载到本地: + +``` + git clone https://gitee.com/zhuangpengli/FastBee +``` + +3. 下载完成后,请参考目标仓库README 文件对项目进行初始化。 +4. 接着,您可以参考如下命令进行代码的提交, 切换新的分支, 进行开发: + +``` +# 根据项目需要创建对应分支 +git checkout -b feat-xxx 或者 fix-xxx 等等 +``` + +5. 提交 commit , commit 描述信息需要符合[约定格式](./Git提交规范.md). + +``` +git add +git commit -m '[docs]feature: necessary instructions' +``` +6. 推送到远程仓库 +``` +git push origin feat-xxx +``` +7. 然后您就可以在 Gitee 上发起新的 PR (Pull Request)。 + +> 注意!!! PR 的标题需要符合我们的规范,并且在 PR 中写上必要的说明,来方便 Committer 和其他贡献者进行代码审查。等待PR代码被合并 + +> 在提交了 PR 后,Committer 或者社区的小伙伴们会对您提交的代码进行审查(Code Review),会提出一些修改建议,或者是进行一些讨论,请及时关注您的PR。 +若后续需要改动,不需要发起一个新的 PR,在原有的分支上提交 commit 并推送到远程仓库后,PR会自动更新。 + + +# 代码被合并后 +在代码被合并后,您就可以在本地和远程仓库删除这个开发分支了: +``` +git branch -d feat-xxx +git push origin --delete feat-xxx在主分支上, +``` +您可以执行以下操作来同步上游仓库: +``` +git remote add upstream https://gitee.com/zhuangpengli/FastBee.git +#Bind the remote warehouse, if it has been executed, it does not need to be executed againgit checkout master git pull upstream master +``` \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..eeff60a5 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,50 @@ +FROM ubuntu:20.04 as build + + +RUN export DEBIAN_FRONTEND=noninteractive &&\ + apt-get update && \ + apt-get install -y --no-install-recommends openjdk-8-jre-headless openjdk-8-jdk-headless git maven nodejs npm openssl && \ + mkdir -p /opt/fastbee/java /opt/fastbee/vue + + +RUN cd /home && \ + git clone "https://gitee.com/zhuangpengli/FastBee" && \ + cp /home/FastBee/docker/settings.xml /usr/share/maven/conf/ + +RUN cd /home/FastBee/vue && \ + npm install --registry=https://registry.npmmirror.com && \ + npm run build:prod && \ + cp -rf /home/FastBee/vue/dist/* /opt/fastbee/vue/ + +RUN cd /home/FastBee/springboot && \ + mvn clean package -Dmaven.test.skip=true && \ + cp -rf /home/FastBee/springboot/fastbee-admin/target/fastbee-admin.jar /opt/fastbee/java + + +FROM openjdk:8-jre + +EXPOSE 8080/tcp +EXPOSE 1883/tcp +EXPOSE 8083/tcp +EXPOSE 8888/tcp +EXPOSE 8889/tcp +EXPOSE 5061/udp + +ENV LC_ALL zh_CN.UTF-8 + +COPY --from=build /opt/fastbee/java /opt + +WORKDIR /opt + +CMD ["java", "-jar", "/server.jar"] + +FROM nginx:stable + +EXPOSE 80/tcp +EXPOSE 443/tcp + +ENV LC_ALL zh_CN.UTF-8 + +COPY --from=build /opt/fastbee/vue/* /usr/share/nginx/html +COPY ./data/nginx/ssl/* /usr/share/nginx/ssl +COPY ./data/nginx/nginx.conf /etc/nginx/nginx.conf \ No newline at end of file diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 00000000..82eca33f --- /dev/null +++ b/docker/README.md @@ -0,0 +1,39 @@ +## 1.clone本项目 +``` + git clone https://gitee.com/zhuangpengli/fastbee-docker.git + cd fastbee-docker + cp -rf ./data /var +``` +## 2.编译java包 +``` + git clone https://gitee.com/zhuangpengli/FastBee.git + cd FastBee/springboot + # 编译emqx版本 请修改fastbee-admin下面 application.yml + # server: + # broker: + # enabled: false + # openws: false + # 编译netty mqtt版本 保持默认配置 + mvn clean package -Dmaven.test.skip=true + cp ./fastbee-admin/target/fastbee-admin.jar /var/data/java/fastbee-admin.jar +``` + +## 3.打包前端目录 +``` + git clone https://gitee.com/zhuangpengli/FastBee.git + cd FastBee/vue + npm install + npm run build:prod + cp -rf ./dist/* /var/data/nginx/vue +``` + +## 4.启动项目 +``` + cd /var/data + setenforce 0 + chmod 777 -R /var/data + # 使用emqx版本mqtt broker输入该命令: + sudo cp -rf docker-compose-emqx.yml docker-compose.yml + # 使用netty mqtt则使用默认脚本直接启动 + docker-compose up -d +``` diff --git a/docker/data/docker-compose-emqx.yml b/docker/data/docker-compose-emqx.yml new file mode 100644 index 00000000..e33883c3 --- /dev/null +++ b/docker/data/docker-compose-emqx.yml @@ -0,0 +1,117 @@ +version: '2' + +networks: + network: + ipam: + driver: default + config: + - subnet: '177.7.0.0/16' + +services: + redis: + image: redis:7.0.0 + container_name: redis + ports: + - 6379:6379 + privileged: true + networks: + network: + ipv4_address: 177.7.0.10 + volumes: + - /var/data/redis:/usr/local/etc/redis + - /var/data/redis/data:/data + command: [ '-- requirepass fastbee', '-- appendonly yes' ] + + mysql: + image: mysql:5.7 + container_name: mysql + ports: + - 3306:3306 + privileged: true + networks: + network: + ipv4_address: 177.7.0.11 + volumes: + - /var/data/mysql/mysql:/var/lib/mysql + - /var/data/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf + - /var/data/mysql/initdb:/docker-entrypoint-initdb.d + environment: + MYSQL_DATABASE: fastbee + MYSQL_ROOT_PASSWORD: fastbee + command: + [ + 'mysqld', + '--character-set-server=utf8', + '--collation-server=utf8_unicode_ci', + '--default-time-zone=+8:00', + '--lower-case-table-names=1' + ] + + emqx: + image: emqx:5.1 + container_name: emqx + ports: + - 1883:1883 + - 8083:8083 + - 8084:8084 + - 18083:18083 + privileged: true + networks: + network: + ipv4_address: 177.7.0.12 + volumes: + - /etc/localtime:/etc/localtime + - /var/data/emqx/etc/emqx.conf:/opt/emqx/etc/emqx.conf + - /var/data/emqx/etc/acl.conf:/opt/emqx/etc/acl.conf + - /var/data/emqx/etc/log:/opt/emqx/log + - /var/data/emqx/data/:/opt/emqx/data + environment: + SET_CONTAINER_TIMEZONE: "true" + CONTAINER_TIMEZONE: Asia/Shanghai + + java: + image: openjdk:8-jre + container_name: java + ports: + - 8080:8080 + - 8888:8888 + - 8889:8889/udp + - 5061:5061/udp + privileged: true + networks: + network: + ipv4_address: 177.7.0.13 + depends_on: + - emqx + - redis + - mysql + - tdengine + volumes: + - /var/data/java/fastbee-admin.jar:/server.jar + - /var/data/java/libtaos.so:/usr/lib/libtaos.so + - /var/data/java/uploadPath:/uploadPath + - /var/data/java/logs:/logs + - /etc/localtime:/etc/localtime + environment: + TZ: Asia/Shanghai + entrypoint: java -jar /server.jar + + nginx: + image: nginx:stable + container_name: nginx + ports: + - 80:80 + - 443:443 + privileged: true + networks: + network: + ipv4_address: 177.7.0.15 + depends_on: + - java + volumes: + - /var/data/nginx/vue:/usr/share/nginx/html + - /var/data/nginx/h5:/usr/share/nginx/h5 + - /var/data/nginx/www:/usr/share/nginx/www + - /var/data/nginx/ssl:/usr/share/nginx/ssl + - /var/data/nginx/nginx-emqx.conf:/etc/nginx/nginx.conf + - /var/data/nginx:/var/log/nginx diff --git a/docker/data/docker-compose.yml b/docker/data/docker-compose.yml index 8e42ad9c..cdd92e22 100644 --- a/docker/data/docker-compose.yml +++ b/docker/data/docker-compose.yml @@ -17,11 +17,10 @@ services: networks: network: ipv4_address: 177.7.0.10 - restart: unless-stopped volumes: - /var/data/redis:/usr/local/etc/redis - /var/data/redis/data:/data - command: [ '-- requirepass wumei-smart', '-- appendonly yes' ] + command: [ '-- requirepass fastbee', '-- appendonly yes' ] mysql: image: mysql:5.7 @@ -32,14 +31,13 @@ services: networks: network: ipv4_address: 177.7.0.11 - restart: unless-stopped volumes: - /var/data/mysql/mysql:/var/lib/mysql - /var/data/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf - /var/data/mysql/initdb:/docker-entrypoint-initdb.d environment: - MYSQL_DATABASE: wumeismart - MYSQL_ROOT_PASSWORD: wumei-smart + MYSQL_DATABASE: fastbee + MYSQL_ROOT_PASSWORD: fastbee command: [ 'mysqld', @@ -49,48 +47,27 @@ services: '--lower-case-table-names=1' ] - emqx: - image: emqx/emqx:v4.0.0 - container_name: emqx - ports: - - 1883:1883 - - 8081:8081 - - 8083:8083 - - 8883:8883 - - 8084:8084 - - 18083:18083 - privileged: true - networks: - network: - ipv4_address: 177.7.0.12 - restart: unless-stopped - volumes: - - /etc/localtime:/etc/localtime - - /var/data/emqx/conf/emqx_auth_http.conf:/opt/emqx/etc/plugins/emqx_auth_http.conf - - /var/data/emqx/conf/emqx_web_hook.conf:/opt/emqx/etc/plugins/emqx_web_hook.conf - - /var/data/emqx/data/loaded_plugins:/opt/emqx/data/loaded_plugins - environment: - EMQX_ALLOW__ANONYMOUS: "false" - SET_CONTAINER_TIMEZONE: "true" - CONTAINER_TIMEZONE: Asia/Shanghai - java: image: openjdk:8-jre container_name: java ports: - 8080:8080 + - 1883:1883 + - 8083:8083 + - 8888:8888 + - 8889:8889/udp - 5061:5061/udp privileged: true networks: network: - ipv4_address: 177.7.0.13 + ipv4_address: 177.7.0.12 depends_on: - - emqx - redis - mysql - restart: unless-stopped + - tdengine volumes: - - /var/data/java/wumei-admin.jar:/server.jar + - /var/data/java/fastbee-admin.jar:/server.jar + - /var/data/java/libtaos.so:/usr/lib/libtaos.so - /var/data/java/uploadPath:/uploadPath - /var/data/java/logs:/logs - /etc/localtime:/etc/localtime @@ -103,17 +80,20 @@ services: container_name: nginx ports: - 80:80 - - 15060:15060/udp + - 443:443 privileged: true networks: network: - ipv4_address: 177.7.0.14 + ipv4_address: 177.7.0.13 depends_on: - java - restart: unless-stopped volumes: - - /var/data/nginx/html:/usr/share/nginx/html + - /var/data/nginx/vue:/usr/share/nginx/html + - /var/data/nginx/h5:/usr/share/nginx/h5 + - /var/data/nginx/www:/usr/share/nginx/www + - /var/data/nginx/ssl:/usr/share/nginx/ssl - /var/data/nginx/nginx.conf:/etc/nginx/nginx.conf - /var/data/nginx:/var/log/nginx + diff --git a/docker/data/emqx/etc/acl.conf b/docker/data/emqx/etc/acl.conf new file mode 100644 index 00000000..a64287a4 --- /dev/null +++ b/docker/data/emqx/etc/acl.conf @@ -0,0 +1,32 @@ +%%-------------------------------------------------------------------- +%% -type(ipaddr() :: {ipaddr, string()}). +%% +%% -type(ipaddrs() :: {ipaddrs, string()}). +%% +%% -type(username() :: {user | username, string()} | {user | username, {re, regex()}}). +%% +%% -type(clientid() :: {client | clientid, string()} | {client | clientid, {re, regex()}}). +%% +%% -type(who() :: ipaddr() | ipaddrs() |username() | clientid() | +%% {'and', [ipaddr() | ipaddrs()| username() | clientid()]} | +%% {'or', [ipaddr() | ipaddrs()| username() | clientid()]} | +%% all). +%% +%% -type(action() :: subscribe | publish | all). +%% +%% -type(topic_filters() :: string()). +%% +%% -type(topics() :: [topic_filters() | {eq, topic_filters()}]). +%% +%% -type(permission() :: allow | deny). +%% +%% -type(rule() :: {permission(), who(), access(), topics()} | {permission(), all}). +%%-------------------------------------------------------------------- + +{allow, {username, {re, "^dashboard$"}}, subscribe, ["$SYS/#"]}. + +{allow, {ipaddr, "127.0.0.1"}, all, ["$SYS/#", "#"]}. + +{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}. + +{allow, all}. diff --git a/docker/data/emqx/etc/emqx.conf b/docker/data/emqx/etc/emqx.conf new file mode 100644 index 00000000..a15f8c98 --- /dev/null +++ b/docker/data/emqx/etc/emqx.conf @@ -0,0 +1,92 @@ +## NOTE: +## This config file overrides data/configs/cluster.hocon, +## and is merged with environment variables which start with 'EMQX_' prefix. +## +## Config changes made from EMQX dashboard UI, management HTTP API, or CLI +## are stored in data/configs/cluster.hocon. +## To avoid confusion, please do not store the same configs in both files. +## +## See https://docs.emqx.com/en/enterprise/v5.0/configuration/configuration.html +## Configuration full example can be found in emqx.conf.example + +node { + name = "emqx@177.7.0.12" + cookie = "emqxsecretcookie" + data_dir = "data" +} + +cluster { + name = emqxcl + discovery_strategy = manual +} + + +dashboard { + listeners.http { + bind = 18083 + } + default_username = "admin" + default_password = "admin123" +} + +authorization { + deny_action = ignore + no_match = allow + cache = { enable = true } +} + + +## http 认证 +authentication = [ + { + mechanism = password_based + backend = http + enable = true + method = post + url = "http://java:8080/iot/tool/mqtt/authv5" + body { + clientid = "${clientid}" + username = "${username}" + password = "${password}" + peerhost = "${peerhost}" + } + headers { + "Content-Type" = "application/json" + "X-Request-Source" = "EMQX" + } + } +] + +# WebHook(匹配上线和下线规则后触发) +bridges { + webhook.fastbee_hook = + { + enable = true + connect_timeout = 15s + retry_interval = 60s + pool_type = random + pool_size = 8 + enable_pipelining = 100 + max_retries = 2 + request_timeout = 15s + method = post + url = "http://java:8080/iot/tool/mqtt/webhookv5" + body = "{\"clientid\" : \"${clientid}\",\"event\" : \"${event}\",\"peername\" : \"${peername}\"}" + headers = { accept = "application/json" "cache-control" = "no-cache" connection = "keep-alive" "content-type" = "application/json" "keep-alive" = "timeout=5"} + } +} + +# 规则(处理上线和下线) +rule_engine { + ignore_sys_message = true + jq_function_default_timeout = 10s + rules.fastbee_rule = + { + sql = "SELECT * FROM \"t/#\",\"$events/client_connected\", \"$events/client_disconnected\", \"$events/session_subscribed\"" + actions = ["webhook:fastbee_hook"] + enable = true + description = "处理设备上下线和订阅完主题的规则" + } +} + + diff --git a/docker/data/java/libtaos.so b/docker/data/java/libtaos.so new file mode 100644 index 0000000000000000000000000000000000000000..54eabf39663d97ce2b63b07ca52c32e8d6524c94 GIT binary patch literal 9743760 zcma&u2RPOLA3ywqgJbU*I#zb}R*t=8OOg??%1l|=vlODt%#2W0$Q}_Pdln(HluBE4 zzs~pf>At%D_kCa2{kpEl_xXIkKIdcQD~{{?4c9W%CL|z0{T(9INfiF%Gll+dg+ngT zmZT#Mg~Fi}P#E~0vG~915{tI~?f)iL z`+skf1PS4P`@i?$Px$*%4*qvv%EABc`L*4{(F!9zPSG*`H;u`&Ho+? zJ5uDn|F5?bxeY~&l)tafWIezc|1xMR75=;Oe`Z_Z|8Dr3e_x*|+=qYv{{PP3*K3Bn zzW=Ycb4==gFY#~w@1y&_j|n4OA_6+bmZ+okt^5{WbGjM7pVm_Mx~=APuj2rJCo#NZ z6!@C}HAI9DT0}%51x*k^sfYEDVH_ZIsv<%iiRz9zzHE$M>vhF&A*Yr-`ED=*I}r zl1`0>ah*1~D5cL>7q&bg@A;j?#V8u|F1gGP=5d#?3h-h{c_Z=HF zAqORfP-4pmN0ox!>CPkkAQ(z3F|Lbdyd?AmRX`pY$(w>oKoPev&XJ!pLtC+7oLz#^ zi4Ld|G)I8n(T6x3AFbo`jV)^lZV3zts?>0cmE9{+YnF_NfH#6Jl9A1;%)#&S-tYDu54gwuND`d^%Q(XCeYO z9*x5lqJ(K9a6{w{C_%IvH?8$eY+W0=PTT34wiM%yE@G)Gp0rYgsEFvK4E=<}N>(gU z4_3H^94q6agZ9JeF{28YF&=zce0(ToObM0^6Iq7A{N%?ts7cV85*`(dkU-&3SVmfh zIng-#tP@>WK~$8%Sl8Hg9ens}M5vY{E>MysXMU_eziCrbXQpH{#9#^0+(eWFV`(Tt zq6oC0sKo`^Q8g1R4?k;c!a}$9;~_^uQ&jE>n&&>PwiR=x0~04}0aYByA~u0Ff}EI6 zBtla?+YzO`%;SflP(Ur?Pz97~C?f(vcT5zIoHKdD`Da43F`^hkOpKbFCbusBGl(aW zzL%%xPFjr8(>h8m&YDLGHsZ>hbDWgzWY?m_u3eD3jP(VPSPf?&&q>hT?iDG2D zZ$hiXS|FF;g6196H$jP#5%P$pF$S=mOfc+ z0!9>JtvgnYz$gQ2WD)b5pY(pwacxan6qXi^qKu;BFJKd65K>Bwqr5H8)NEd_d5bh80AYs5XnMF&uYRHg;PV9;7GP890X&e2GS~U zlmkTsXiS0_%Eb8-0oqjFWZHyKm!C&HD;eE&EDAG6fFg5H_ll@fFGP(wWfKZ&^9kx> z*^cN%8ls~jBd{bD10C zSd9@SU?z-PZg$$j@o+~*(XuUIBKYX&N$4@@YGzSaQBSlk2CC7L5pd8Do21arB@vqv zM&i=Bxrs1j!oG|cGhW%6Dv220R89ikC{a2_90jTf8%2QT=Ejor5*|@lp=Hn~D8xvF zWQ)}Yjdz@Jqz;1~qi9lgYvi&oUyYbVa2%n=U$x4qF$IzPgeJi}Xy` zQ1oJCPuo_}bV_R2FXT7%*fr;4;wU``a9y>+r7p}%8)9ssPlh5ON1=%vP_?o8?lBB4K^j|w;C4K>elsc!7m;7qo2iavFhQxIY8=W@k(l=p7!(1Y0d2P_(OYVg z8dKVK`qYMubX~&YWg>}mTv@FqmH{0x#mDBasbykSN>3L(NyeciK`VIKHw(*(GSk)P zru}-ql#q`^qh$czsIe3jFZ@l9!J!BU&=$+&1cVWyC_y?B3$zRCD!f)g64Yb#3J#}7 zz^{-XPeh5M$6)+-yV%VnX?yOwVI&pxukXVbJVJUxbuuk^4K!9G0c(NId`8AWbBW%m zG)>WHLXDOdmwoKoM(S*uapv@0C@hXrJqdjlSL#;4$RHR)f+9y@gdY?*;3#8sX$c4k z9B>go9a7MKr%|f}nOzbd%yz8Jd<;Zb96DI?EIEdIkPwTa(xoRv(c>;uoh02l<%0e*%cN5Ld=o`ReK z^WY^|1WRBUtb%p$4!j5W`2e|#^pB9Ak^TkpEBFR}AiH0X```flL3RX$@O>=6|HwcJ zC;%m(0{DSX-2a9Fk_8+=&K!`OfD8Qnxq%zG#skTZ^#9$BLLGy%z&|@-=wknzC7??J z_%;qDhwSAc6@U^@1}fkLI0@8&CeQ}DKo1xK{Fp+T0ZVWi*n+db4%mb9z!|szH{bz0 zffu+4e1Jc=46cA65DY>=1c(IqiGqvz*Nl!9_l1s;N0&;S}i6KDqbd4gmMWGiR`9iR*JfL`zv^nrh;AI{IfAb1Xj!3%(& zQOI#H1*X9q_&YC={t9vtyavl)1+0P%@D{uSyI>D|0pGw+un+J*G!X+*fB|IS?~o&% z0!d0pDnJcr04<;gOn@1%09L>TH~@Y)k;M0-Nau#+MLHj(01!pa_{SYbx;T>3NXkIU z0ePSRlmLE|kyL@i0d=5>?6e^DfdMc?c1DmUz!X>kYj6hG0SDj+oWObD3|xRKxB%RN z2k-=p2=H?iG6)2N5D*Hkfk=R#SR~^h30@mORumk6SBfyUnB>u^t3&0Jy1N?X(iSHNx=|0f?K>)b? z&;APZpnuLG&?7)3hy`&V9wdUlbN!!w1NtqH2H^Yt|0WAE8{~p}ARiP0{1ibJgZrQq zlmq-cK(Z3D3OoX}pdK`UM$iPFfL72BIzT7r0^OhoJO%v#KhGcs!E-Q#?1mv1dt+U3?v1h0OejHL9=@O9AKo-aW1)vB{fRjKS;71Em8|VT9U3)!xK_CbLp&$%|1N=lF83`E!VnHIZ!(YD+{RVPQg-iz-;10M8 zvOo^V1$iJJ;HLmdd@qDv1d2fkxDQG}87K$%sf4Tnb>J~*0?ptF_&Y5~Z-eXrU7#1) zJ%b!T`g6!(@B)m1aqxF0q0jtto`pX5&v^m*OYjOTf!AOetb#XS18jk9@D_XkyWkV} zJA2T-fuG3kHj{x?LBXrz-sk^(Y7f$Z=PqJmBXXaOBy0?dFFZ~#tl z6z~E*zz>cA{0Kq{BV7dYIFJNV$W9hg9w;JbWk?lp65x=X2Ba3yM$Y(`tAliXNF#6x zm?1m-b#v&J;54#3^UpQ>^|NqxKz5Fh=YcEm0A2t;K9K$(0EB`ta1BI)C=d%0z;$o~ z+ybfKHo#9hWCqf+Aag-JC`5L}koQ3as6ux5`>LTo0=1wXJO=n_f@}e;pdECAF3<}G zz##ZL&!G z5AbscNdUhzAp}GK4gTMT81|$9^Urk(=+uA~+0h|M56OUZHYATgasW=i1+ah{@Bm(b zA3;bFAPyvf6p#V(KoKYd6@Z_Ukg7=k-v+*3!dVk&BYRy)eP9TT!6{$@@M8vP0W6WT z7367P3+#YBZ~*54ew>lK0O^Kw{N4k)7r2D%d?Edi?vG?3WDwGWA;Um8h(vZ#kTD<* zImbgLf+Xa89r7kf1-Fr12IO6k39>;RxCaUWeu^NA!F^B)$^d@KAs-<9e;fEY56+K3 zJ!nF%HA6lDt)LThgI>@F`oSO=0;6CIOoAye3+BNqumoNM{H#L00h?eO+2QwZp?~=2 z{1N&d_=fC$K>h^#;5V{6fII|5@H;O2@3}|;2H=MRk_u1*8bA;5!vM()SOGgY0yqH= z-~;?X00;qLAPU5R1i+6Zq%@ENia-e{gOflNz|*2AHJ}Cljt+D^U;vE%*&8GM6r?Gz z2DZq~4icUpMx95_e_xgha(0Eh0NjBWxCp#~FYp8YAP@wBU=Rwz0Di7Ph68vy^}mUR zi~;c=0oma%BtgFpl0gcxzYUp*^lZpHa1Z1oy8_4}q~Axf46+(A=O)Nz&2f$AkWH-`#Ap5{GFbJN5VK4$-fWI>aeF{t?yICaXAzy-5U=b{V zW$*^9feo+)-hy{v2mGD)(09Qn@EPoZuizWN&v(du@COi(!PixQ1|$Fjr~oaX1N49a z;D-^C2`~c|zzWy_2fz;(#JYmKg*D-NMD281n-EH$;$V zKmtes29N>#P(V@wYCwzZ=ph*a{0i&8VTEKvItL^t-~!x$2k?Tw!w+2$2mxUr2Jmwn zQUXWOUO^T?1$WEuaJRfIct;#^4k%1%Jm3x+Sm%HsB1f z1$F>Gj*w2k1-K$RH%JfQ2`&O(;0OFc00;zEz*P_oLclc;38FwWhyw}WI>1jdWZiDWmDPa&Uy0Wb)L!3!`B@H2_z6y!9R1#@5?;O7AG__}N1e-@icr3ciDVZ~zX$-yx)c&vifyFn|nD0BS%F7y&b20c_w1 z-~jmHgggqk0WaVK_z{2<1VYGJ7)cSx<46~Wlmt>h2FL;Y$U`asW#o+CsX#x0oKGSN zzbF51)F3s17IM~x)CC5>5Ey~KV~q4uNSZ*J0t;XXtbq-%1^BT;(jH0t&I$T?;0!JR z58wqZ0dL?B@DqsS709bd4}uH5Fu z!7(5Rgn$ST1!6!PNC6oj3-F@=sR)#S3OEUHKnv&s1Arf6BuyYqk!}uY1+05I%=aDnjERO@YbAId** zy2cFL>-lA=ImM<1Biu@+vjO7lnfgx$zTM`@+zWZBBA>)dDUc(Twe~Txs7R9IMqRaZ z5yOLfgc}LDS`-^4qzkFyT8HR)?hki+6Ml4>dgdtbIUO-^A3Jg7(&JuzM}k6c+JwY` z4p~3-r;jr|?=;Hi2%O&c7rv}-MOuG;W{N8B{Z{i{)1dFZ_dr+?V+O@FZ6=*!qS4Tb@=l>RkEOPet7OO2tao9L2*Qv*6di zcxk0CfBg)2CP%y1eiFHzd(Yw>+F9S*I?HNb)fc+^@(*zl1Nk|OzhR_EWyvRkyM_Tw(;QL}qZz_Cv3Npoa=|j|XJcPQ|(X z={(AOqcA*lDd||Kio+f5FRP44>926t7lx`Gm(G;V(mS4|s+`~cX`|bIaeG*au*hI^ zT$gX)?1SK4z9(W$*Mya%=3f!f#bJ(na{uOj*OM&S-6khT_}ReGoh9ihvr$Ee%hiUK zExPG3-V>K3f1W#V&MiWxPn_(R!MUcGrKU?Ka88$y9S)O_2dL)@kmTQUZ?Xv73-UA4 z=(M-r3g&%yYqRF28(G=SqhBUaA;9#AXpn_t+N#yEV5cX(BYWF~8OW zS)3hyL>ZH-W-V(TUNf2zc{%4=!jlp)I$jcdf8e40$Iwi<-Dpa2H!UXLs<_pSeS4>n_&_(|RfN@W@tv^We`bXm?XCEtF z^*X9|%VM$AmibVw)XYd>=}7@6=cbM=F6psN{SmqlTwbJ!N@}t+8#?2Dg@glx^3eOn z?VBk#WKNKrZy&VGVLX5EG9hWgN3&$hn{>r59F_evafIz{uIec2!(}1cuFDJ2jaR>lr_MOHRf`N-#F~^_Me9=CD&5!} zNgAIbi&67R^U@F*3RLH2;P-EmdsWME7HcFmM={E0h@XU6yTVSvND2+J!97??o+r2q?h^4=!=FY zWCmy2-!|ZoU$|Bw-u_y_nd?9zWB*yDc&-zd=+3(vw@E+dcy!7_>YuE8wE1n9H zAO+Q)Y28kOS8tBR`bLeO5a3dBVe>gZ^@H(@2K9MoMtS8sa?jnkxoj?ebGh=7qOT}? zK!@VKZckxWMy@YsN(H5g!?SU0tHJd-*XIFWhvW#V?mlOXVe**!BzrV7jA|iZgtRp9PQAvQ%r zUwYTfj)2blFf5c@Bz)BR!$8l{=l$wY?i(we>RL_*A_5f2dplisqGFvAkLQLzo)NpE zd*#e$sqf|CFk3bUE zBwxU4YfAUu`Y9b+QNZ-swp81s*Yj1-j|NQ_4w|_9Bh}%(IX=&amTO8?pYNoj8}-%; zbxTbbW#h;z4q7!_aTaWH60zO2L1P@#GNz+wt6Ms!%!$7)pgS^24?Qz%cBz6_NZ*|b z^`_MKuGVIo>N7aTJF?c&rd2oTeQTu6b0?n6G_^$GK8<$5oBNWdU*GVlBq!PoHqn^t zll3|vwXBtp?eJK#dHdCIm%C)x&_B-OcyHy7b8Ne45pfmdku!>!gFgHB;+;sMr#bVT z$(W}YlNy~Xfvaw5)`VdRKJ>=v;PcgC1s!Z`cn7}*8+v}{V(lOm``s`B{$ZnJ#2bUYayCCQVP3n z-dh55@kIjUt(}UPV29Y7aNWg>;g70Yy;}N4xt_K;7wduYw2fh_0dMGRn^2;_Zw5u_ zUz%Y-3vbwMF8UXCR}f!f=-(%NaJY0}wV-vq;>B1!*Nke)#)8gIuMV=8Pj}qtn9NiA z4ryvD#TZue;#elm2LIOgN(;Q5%)z5+`zj==M}3FnD|~Gp;`5t(hciycdN0*oB2~IU zd1~$2{?_-I6(YA&kEZQM^+$LgH*k5xu3oJFpg4ZqquUN{J~!yB<$InT+{PlJAnlEv+;kZwOY*=bC;%FR}fM zb6!U&VZPZr#qMjrVHeNUNX?lf&3%PS*b=wLN0PA8c4=V;4r#pah%bKqw0lpwQ%f;_ z<~*A1ZO~cyvhAFZ$%s>ALt?g<)N?{leJZth))lYtXz}gy28M^*8m3Lt`73r>RdL~6 zHdpGbMbsA3LOwn`-y~pf*et;Gb>FM#w25nK!C(vVHla+$kh#&Sq;{@Tb5#kz4PwkA~cUyZ)N0O@4RdzD{>^d)R;hK{V?ofM#qD$;h_f2 zlXjniatkWhEiGx2*^c+MZZaRo>DmZgxE7JAdRu2&mY<#^sCa^EE8#u??L|(DU2oxl zF|&xHys8hAS!aD;H%O^|3_MDE;!9!xbjOd4XSbu6C@DvBU!T8FL+B;#H93;a#Lebu z`QFomuJS}Po&EObqya}UOX9-g;aW6i`b+tVL|qQlj>0FFq7{Qp6Y38-*f@V&_aYuo zy8Fpad28kQeS@qoVV+Hr+Wjk5bhAP=sqBgB@VAW zKX7O{bxlwor+7S&VN6e0v1#}&c~JfBETa{VOu*JG5yszg+4Jc&p=V6`PQ2Z0>ehcY zPHR~xr>4KL8tGXyn;_+r%70hi6S$wC_FZzmS3Kv+vdp2Kc0D;^!@OcmN?P80;5cpi zW%YuQE!PSwWj+6pK3m$p`>Dar3Wgrt*gn}#NpYv8{N8xBO6;tk^G|f@3Hs0%R=*fc zBS+Ne9*cz0oFRUwn8ZnHUVrlQ0Wl7HNO#k6g&I@pHj_;`@5bqy*j7y<^Oc_Hb)6n> z;iaq|M~5Z-vMO1Xi4C`YmP;Cs3tT!Wl+u?hbtD_w)7z`n7We$=>s@?%KCS&Mm+7l! zt1CbCF3RYo!socHbEXfEJj)nK4I#B?Ki6KW;#ptldxGVHjke*v=TWsrMeHv5P8K7- zOY=E;ycLaOrtUJIe<$u~Z}O7yUh|5=(AnFb>iUlpZg}l4>Le0;fzQ>kdxL0!J__zL zamn*%3mu)zkG^5~)kn5%s<|5T1FpLZ_jTV<<_OCjAtk>3)bv_?S9rV0Y`N?cZ_Dre zmx)txAyK(R87F!e>T(RK{RX1(QwtrGFEfkiGlL`Bh4?5>!0We6fH^4m{J-zSdo-m znqWB1_h!S5`mXR`(s#}XZtRe0mv7zMyPpEn^WFH7QjoX&;&S#^Ff-`Cb<)Cye>13r?Uvk>z>@8F~M>%*%h z4xKx{TZ*WQwn~UfrX(E_*XBQe*EZHyn%MN{a(H&bVUfg|LWFOL87nkjRk!yd`mO8e zI*H;6HO?TSHo9MuooY)-u41QdJ&-^y`3xa(L#Sk)Zj!k^x;or&$A<5OUP89yyL{&g z)6Q1HBC|4!Kd;q4RNq(oOyM{5&E#0UUU@z}z2wV8g_j?41wS~Po;p7^BMX~GQl8MTb;48#N7%Kmq>rf+?d4X z(_<&rl0|rq?*8b-N5yPg8p7zrzI2l6xU9L5dzlY^h~2GbDrG!=ajoN()>0%5f1jn) zd7kz?fflJB3{(}vWpCoLI%_xD?i1dARA*MnsnBY2+V|mkt*Vv9vnmfs*@kT-PfD2E z;#S^`G@H4e?qw$pu55?=i6H(9juowAQWadw? zM9f;b`u3Pp+O8;VkUzW~r|8z)rxV!~{iCyRi=^=doog93@-Fid#&=DpvnR2S)QBv} zVaSTpqxUf2T?EsS{t4#c4;H_?BQE^m8RPTXY)_Kb5Dy(E$Cm4=lDbq`Je}cw+Hs6h zEw*~H)ySW^_5J0cZ!|xQOr;}L^-}gn!V-fFmu<*PbT-|nb=Zns!`LP?ac4j)Uo}$-i&yUJ&l=Pa@7Zx+IMf#W%AU-x%%?k#Fr;e(;1AmKXSNl&EcylcjMDOy<1=|UAz2x z)H?^ih#ziIu^My_WC*`5wlen!b}96oHe|9)eoT6g@?}a|bM~#7ZpTInx$tGVqfdlm zde@atF`-R4HkUm=@uq6MW^B9Go@{K+`|SOPw1Yjh5ciJ9J8B`%XL3H>&_@wT?ie;z zv0Izu7GGB$#91s01>RP3&AZAvb0&F>#hWtj@ZLasr*TRnQ9mCB*{M({ za+V9ppMJUQSI;N;F*9$|crQLDJ|LGVel75dN%50Dg9K7W)%m-vVR>;=;Y_VdGpJvs z>Vgl<4Nolgu~~@E-no=`rczqRC_dBi=;ihLY^EDYjau3n1Jz|@=i)CkcV}NBy_}~d z)^f)$NwoHPamiBt2VKpy@bpnF$CR9ha%mTGT%M+4+yk-w^;n7m+1nFeHBZ+c8GXO@ zBKpm%%TDilxhS|e%X?p?`xfWVek}2$6;`dMs3X8A8|@CHr|UBrD~>H0f7s7$KQl=4 zXo}(H8)+LW^Dc|KRjt{wZ*2C`+Jya%$+s2( zsz;K?s0)hU&70}fpOcC!Ws=|#O0rmtUuijIXc=#Dw|GlVgS=5__uWb}-`8(SxB=m5 z-RD0sI&QC)2n>E~Ha1?>Drv<|bUhq7cj!`k>lnc&550i9WY!$UUAg&3V$Th3C(jsP zA$WR|P&ZPs;3@28EOe^%-hK+ji6!5tdv?U(S;W(iC6m%`XnkMAjG7a3TID9YdTV^M zj)@g$+|w$mQlEIQQ0Vl%dTS@8jd@oq^l7Cfwe%C$C|YCkxjNvhBGgc`q=fZ-?Ac0?)2oKEnjAi-pe6(Cw)7)OZ|w2=H8D-liw0}iySmevL9X$ zaBBatfclj|VxU`NWOOAgviio+lMHOx+T*Ur^L#%tnQUe|yd8=7BII|C{T`13K6-HQdP8YAr*&iO%{5;gdF4~fCok#F6do96n2M!0C$_D8O}%!p zF*xH%&ZpPLzNL5k%P~0gSAmgVtfEU^=boZ0O&xCFf*$u9Q%5%;rlh) z+rKW+6b@Iq_F6F3!u`gm=Fv z_E^gM&!3c(3=cNQCR|kS_Wadcq^cB@9G!T%HjjMQWO$Ol=4kysX`O#ZXf>NkagvhR z%rLY4wTH*Di_K<6IM;$deXCLQxnzOPt{eZ_dHG&3RqvBMrRCbnv(9|Zb0E+a-(7wbpET>DB^%GWm?)tNW^`g>YQIf+ezVf{s(D@Ip6&wT1rtoq(L z*OE;!+G^g-(jnlXBrA=6H#={qAM@^FUVMeXpIpbsKBymBjC5C@lgv5CVHW>6B>v@N8|N8QDKX-ft>YZ&UemVD(Q>h`j`s7{V>gs_QcW8-e)ZD%h!tb}s>IXm>TO{Z5sUfcbd`}0wX2X`(g$1&?>o9(gg8B^A3Ke_x= zLu+~`q%YU)GKqZ3hh+Zx^}7O8ntAz07Q&1QzdIG(sQG!aLUokVUO3ZJz$Sx3M6xP# zSr@LK>9ObCTRdHF>ac40aGH?7V%C;+Hj>+gc*6>dHBUSi^kc=s>&*um>u$E_(|>L@ zMBfd(+B4%qmFrLO%^UXf(iREvxU(*!Pt-BrgNIU}zI^O7v)3c6fPJVgza9lE0$g+WSuKM^|SmEqjB46@aX0hs}`O7W& z$8yCVa$GnT*)zY(uU5oK!tmQ7M~`0TS;4Odaa{_*&nzbXobJxPp13HtuyEv%exb>p zqJr}i3!yw^lcv;Aoeqw>{pE=!J=2YCnz`)S(X^TqCv^or%x>>ox%ZwfgHMfaQRU+0 zmW=P-qzAfIYK`!5-uW#2^o;v;ulxtBw=wHc*QUfjol){_3FiGnT{tSDjkP}Rm*|Hn zW+NySoBlOAfx6KUcIBfopQx)NZ6pX2ZmU)`Io+v@8+;R@a!o*s)lH=!o-^X1v|VR)EOZ^BxF7V_!DH2Yva&VhKU8QO{W(fh*`==Znu_ld zYw-OX(MrVxwrM`jZ4{Yu@$5|&oL5R`jOs7Z(C`gz zgY-^DKCgOVZqkfS4=&9xSNn0sp|If0x}H}(Tn9ltN5tF77%TI4RX@r25hZHTm)rcA zjJ=X~b6seMZ*Sk$OL6w?hz!+El*}A6Y57B2fw-~)HA!yYju-0*c7Ke-AH900H#<%! ze3XE0nZa41UYDnG^>t^`vnw}d^|}+~?NxiBt3~BeQhSQlEvps(xU%qSr|c1r1c~&c z_K$&(-6mDov#W zA{XUj4g0kJ2pm*;&t$(=kDJyB&oLHX%^pzxamntV!*^LD@0QRM zC@o{0_xIIIcQI3CHlS`iWo{X_WE>p2Q+v~suAMcYAnn`rYVP-3?-EZ`wPuxlwqM`L zJAM1)Y30LJQW_hF4hjaj)~VB`2GvBzrE{$ctu_fxeH}V&{vd|a=9qtRGr!`~2F2ap z5kBiAUDb>P?t6UP33Nwq@Mv98nc*$E5aT4s6G0m=;+C9cHK_HVuKKq?`5=?x7YhIbA9D zK4VI@1QajZ&$v4EC}lAdH$8SaHGvMP)e$cgKcOzTW5$}z-Fb@vZNpD^?W+5oUv#=` z{x35H7BrV#6W+`XdNnY->kaQtNSoBSenIkKUR%wnbKf)4n|*ThgRb+dM;vGN-RX?f7b+`Yf3BR;J-mU|O%da_>h1kazgFE45;r6AG(e{Tc`dZhq$f zq48!gECSuUXv!|Tae_mMlX}|!VtuHKM#MVo6VaR;zpcpqx1%T@1XNOW(izivDU=Lb z99hV3?3k<|JN-MmoszdRe9mrBY>~X4eM-OYnds?HI{cY`Y81b9D86pz;~yerSCCd2 z;9H3+IvY0Nnh<2d_wIds`Hf35Ki`{PNsp3>ZQNv`7OQ@~Yf$U&^dKOSaC>fS^6m?# z!N-Z*qW#?ciNza9r5K8M0p3_iUdx+CGkYfWmx$8h*EdGAD=3e8GH(mh)svScXcgv@)gjhTV2qAnCauxi(ruIlPG~CkHm`O`a!~iR|~)&(qwEy*n}IC1WJ` z>%{n-(}mZr(=6R3xBGSbk+S`l9-Ch@Z2k2M4gz_%(vL)tT5KscuaTdd%*wbp%-rOZ z)>wO^n6yxeSw4MVXWqVW#>Ln@*oGr<;-Kxd2P4C%E&oqht6O2otNNbC_4x`vtwq;O zXltr+xN7?Bi*3B-Sk9Auk5j0Kc3-C~*=(LAn81|ylK ztI;P*_r>j5TkL>=;c)JDuPv`2tbX7$R+HcEV!!?M+|~qgvPXIw?`}u)e$V9X z_;JH^{W|$sRnev`>)Dy2?>y^r++^*BDmQYr1r3?{@}|j7AG_Qz*C(t$t{NB0LKxhr z-`nSW7+#b|lx|Gq%)BBh_U^6U;)}NR`bY`a+o%;CD zbopH>D|fOinZ|FFy2G>m*{m7$sWQ*8MO@!VqdOzv*%zz+=1=$e7d`SnUkFHQKKEJ) z!!w~VAT*kD!gGK2r``cWEq9t>b+es}g_qF5B=eu1`(kr%xV(GL?BuOwx}}&(P8Z1^ z37TM}^I?P6(S7hOh1e_!j(CKxgC_WFtWm32v0oZjd3h%NuBMF zDm${`?_^@grRQtA?xdh7=$|1(`zB5~gP4)qC&i|YXDRIS^G%A&pKiK3Q-2A<>r?qXG#Crqyqr{RY>TL(bV#goc{xO8P`eu%@NKPe>a9 zc3mx)s(~+Vmz#U0qa-^Vd`Q~gi;PKo={vOw$qR;%ihQ&vH;6pk=C`QH@S_`)5ur)9+wk&p17?DriJjno*wk8G;hkVBI>9?Re)^@6uo@rPUh*mR{>tv? zvQwmonySo{@_N$xSl&hYxbDJe`Z2q@3LSwc(rHMG6gqbF^;Lr@vWA0J!lFr;9eT_Z)gIt7P~X67ZX9ML zS$t>nYQ}gKB`f;Y=xA+FCp`U@6BW|LOO>9JA#}N-`r7FX#w6+@?+M(ytm!@jlN!=3 zV&VaEk%F~bOlNPuY>-MUiNOw6iPrT^#~ZYz6{GLM&Pd>#`prKtL;5Cp)6|u2ejxu{ zBHHuo;sutm_L@q9%oy=^;y=yzN-7SmD?)Aue$b0Q{q+=Qzd3ewGNrFo0_TsRws`qQgVnSKkX=$DH2FiGa1G}5WM!f1=MHE`@)3)mQE^5EZKOUQYvYTIZ zRc`V9usL0urol*mR&h_q&~vR7q2<%*Mi&ca1Kky4GebuPer-PLJYW0a!CRWaO74}9 zkU#f0^L)}a{r0BiNV8I=qq8QG?nvD{q^G+2#LJYlSifJYJl;L_kTL2xNB-3xY_wVi z6sHY|gD6$)d~VihKIpw+L!nz6JcG_O(7rlO<()6U$LIcAX|2L*EnvFdmaLSU8Ye71 zbggp*^Ry&AFLdu#ZE~H}W?!ZC-t-US9NU~W>|DHe)Gu>&FW<3iN>1NojsM=(Ry+Dik0-qr0{W1`JE?&sRi4&o;(_U z%tITJNpsLKN(%o&kZ8Zlbx(O7`5|=&CW$YuUSYdv8KU!+2Rn?#Qz3&%ON!!DV z1H9ub!H0VV--d@3o&N|#@0%ZL=4h&_Og7xexE0kA;OD{B|E*I`L*peSQ_ybdEzDD5 zUQ3Z>LWh;-0_#cpe4keD?)Du??Km>td-3E*%CkeGK^+$A=6T^;T&)wzV;Kb2L{q5D zdu&E|>+1AJFhIIp4hBJa1C0=)V?{6F9Cy3n4H zYibN{=Ze!Ic#g}Paj^e&ms#?d#WwZTCg*(WrgNTE^Pwl*YcxhAd9BaDf9#{?DqV2! z0cBE@T^k#h&@{dBspEJ(BkFmrPBL~jN9;tG6`i?_tq#rmKioIBNgU2Aji4GYKj23x zY>2m6i8PanW1HrTn?z23cD(vE{N#(Jr(I1-Y~-WD=T13FvG$OUeN8buOtTvl zKJh^4UFZf8b7SYNig~J&3V$5;sE@3XUZqi$aTBMABbhc}DfQe@eAOV;`}&c7)T_>n z5cg!>hc#maDzJO!{UqxAmymChH?P>R4Oa#xJDWKs*IrqjRkIW)7t9T9Ad3&*e3KqB zFCep`qQD_M@BNjDLrSddfRAd@=S02QQRPVN@TEB4+F9{_k8dta2S;zc82Dp0Jr+r7 zZJF!o*qZv|e&5Bewyt*@+A0;bHCJTMOeje`x!m;Q%dO{3QG8+@p!AE?MY`8a;QleWJr`4ZZ%{ZIoxqF!Y{1a@B3}_x-VRY_IrU>5RR!3;ZDO)%EHO)rZRGdCFauj*8!1r#`Ii zDsbGfmSve|wP#cRzvw#au&TP}?QazY6;x~#r9{QRR&21qZbe1Kz(mDv#TIN#u&@&q zyTR`6?t1Ke%*S`uy6^p7*Z2I+nLp6;Idf*snwd3wpM7?8>M_`BbMmTc6Urp)skkJQ zYjUsH(}j-=7!z9|jl0j%p9LcV^B%aiv~I^J*BKwiWbj_w_|M@@KHUpAH<(|ral4Fv zPLHqOJLf{Lq@I&EtSef*6@6n;F>TkHWvfIc4 zi(8&cx7{P+$fIVl;j@>uex2%m+SMb@cs;y%zi#1^{$Zis@z>h>cgZz9dzR*N-17H) z^v~WG$NX+@3r*bG#yjXt_@k%CE_%;<_^a;E##KVP<~>m9^wYVeTh3m$>upfIkF)1h zaoX1M+>p^7@8|p;@TJRpzXAR}DSvdBQhTS{twt{U_CB@W+%aEpuPxcuwBKO=u*c_q z<@(hyUdC?El)CclQ}ufe%f6`g_V_WKZ~d`v)u2+QCf90oYvKH6VRDHT@?#CL>?Dly}eZAB5=+j>n%jO&IpZs)b&F-119vHnR?d@rg2Dcwju=c%% z@p*5pb*qu?N*Bl6&5{#-uBf)SW9Fo{=N#J4-O}&*B(Ec7olo89(&TdUSG6AJ$Xnw< zo0N5{=UqR()tUN>9Kv?p?)7cv;bC)Iy_o&+-M9}Id-NzjtjW^`mkVFmyR6Bj{O8g= z3vXNQ-MB^e=bl&mSvh=uuUi2DvvRE5RO;Df*9CJHKF?gI*^x{Q&$f%$*{0gdd&cW7 zb^bO;eWa+%?%8p}r=|BO?l|;QUgv~nW#?u7Q?p99uKm(&8aU>|=DPPjU9NVx!Bn?r z6^AGMx$iXBd&Rei%XM!Z2}+sb`?G?5#zY)h`xig?YS-%A-M$5Qxjf(g z^lL#mXm~&G>{@RZ4{*GEs@064rThQPaQg6+V$~YHYcb>aj~3~Nd>wJV%w4y$TkmE5 zc;0P;eTuHL-+eD0+B@y)@FjMK4n}vlHgRgdI&>X5Rg{_LcY5Z{O|Tr)k=OD|!t7 z9T_9+Nybzyk5Bv_^r=br3N@3a7TSGb=Df^nnkGhFd+@RQm6A7Om5z6*mhI}#9{hFi zpkL$4ZE9co>s@!xbyYHso^~hCKQo)Z-7vXvxa(-YzF8JTd8HrLq{o1;u%0hU?B4gd zdEkzrbBh;VTC!)Aqzuh7g(r`jhayosN|^%OzUp^K9r}%4=Oew3BrnyU{uy zu-ZEBSH(IXV#A+V*{$nOx1rzP2481`Pj<0x|5Q%vTwOD7EzZkr#4S@>>-zmCTj#sH zt#jW|)_JkU)_H&p9%myC9iPfIE>`NtBhb2iZyWZnZ?LXE$HurfCt25@v_-C=vEt8d z8*x^*&~vw<-^E6~9ocMs-1}n0T7ECNTIczeTj!(lTj#}W_|shGYi-=~jjZz(G1mDc z$)hzp>ul6*BO7)?Y{Yqljk;ZFW4(0kZrz_{HtHeJMn5@cBR;9OTDLFvueBP7&Pmq! zl%4~z|Lqd3>zB5XUv>Ry zW|@Pf+><(SwuJI}S~=_bxop_qpWC|r0~^~Ze_!kRM{8NsFSxg<`rh6e|i+MZarV;!B(Y<*n2&enMs8~QtJ)KxDV`s!&v^49+m2OD+OE{An}uZ-6D`WWjx zlZ`&$W~0yVvXQU0@)#v+{$H{2Jw2C=b^6)Hy4!6dU&ohOANN@e>-?!a6v&#NQ8xBN zTH5gEd5Cp8lWnZubT+nYrvj|oNnvBXf41>G<%Ny-jGJNIzK@Ok=Cn}{e{8Jlgay{^ zKeEw(a@p9=QTM90mX}^nt?!>q6>d#`y^a0P%AKw2myNK_^SD{(jyC#jhK<(sFWA`c zb%?P(ugNz0TV@;mB*;b{!)r{I7Q57%`}iOs&Vi8 zz`=9+UHPN8vyR5EaZ->X(w4R4m4GXK9}n19_xM(lVmZBvW8Y?qb&mlpPK#Y2CHCyoyFrv3P`;4OzqphT81o<3pV=}u!_OZB^w z#~AR1=a4V;Yyc(Acc^hQ7?I8V02rUZWze7Y+C%duvj3!{T7U4&ZxDa=ObjLJ-r_o6 z?_hWnu(4S_u6V)Q($GXMlUKM0-Z4Z1D1zC^z0f3mO8@2**gr}AW_my0(ReZm^D^Uh zTlaZKW7S*COLj}NRME$m9F5R?;FTC3bq_LSKSf?7d^~yLV(_ksvSTK)P5+hq=t;pV z{i+LL$E@2o5;w({WJDfUQomXsaGwYHGf)p|>rg+z9sKMRbiA>gSOW=*s`Hcg+GF9iTtfPZBE9fcj0u z0Ts_TDNqkj$oC!wk6MBJn)>_JfqyG46A@`f{VIBU;V944D5Xh@ym%w_G4#*e1~=os zE&{wuZS)7cEBBB+1YR}{;})a+gsxPyP`hH)`#xnJfP@bqg6YEAP#`n?x{U%LSPA+%Gi zIQYSz=#%O>Xi5rg0bhFnmd$?qyc*U;a`6AIixexNpQfX`{(LJt{f}`@0;TFI-n*>^ zPl1gKl5Q2BJMEEQbKL0-!T(!_KGTi*h5Lic12Z)-`^H$VuanQ==Tz#ixC;H0K3I<} z$qPzB>g{Py_>U;by&9R{E%Ooo%G6&d|0@4?-+}*9mReeJzB>oI>(`TkjgtNt*C7`D zAtmG4VHEgwN36Tj)bB3~Q^g@m8PtPJN6Q*1JjG`OVo%0=eqXOK;0-3AZ``H+_}Spo z>mk3-$b;K~KbnmCL6qcPnKDgfKXfMQ(~O%}ICz9S5>rVt`X9@6v}iIc;9a@5>{jSs z%!Z1+z;U^|MO4)wqLtA^zFO$5x=7C#b7(R8e0d5KCM zNO>qe_=&52ZBIY%Zd38eYPkPuqj@9!SMFE36#89~u;n%5ylEf!DKF&9>_35w!^}7C z+QLQJNy)hFkH@%2>3;zkNcr<~1LE0*`h8iq8&Y7t1tGmD(7nVjL;z!=UJ$RNW=qDcJLEXW-u0{lEFwVpL!R?(e zFE8@G)xht%A&*aK=Ry#;2y>S;^_9(ODF9+${S4uiSTdF8KLKY%dTExo0-lSIt1=#eAOZ2-aah4A!GOY*$OS zN{G+Q{HQB4ZfTQX-(fuJr!vQF*9>tk$T)MlM!HMTf9ZhvA{uf}-@)J$oDjFqobP#e z@QGJY=PAhVYzBAU0Sg^CZj>xrmB*}`;3w6MYPud=i~<&Y&lnCnEjMG_{d6?VMDVkD z5a(j#dw0uy|HXdj6WHglMzoZNihr$Z@N*pNp`$EF#g`31oPW@vH{^|cupP0Z{+u$< zAJx`Ln>L@j5}FA9^bO`~*17*f@aL_IX?^oq#R(0;&##C7o#^Od?uVqG2Y#7+!A0mN z7|2U8`q`u^c!p6J*L;p`n)2XB_M<+d7@q>n%e`69Z$wKC;3DPm(nkN1_AJ-eZOnqO^YCp=(_UE4ffBZ^vI)>x0dD=q3^D43NKY2!uqw>bp4O9s2jM~>}(pS`?@Px(i(hj6y}9@<(UvQ zz^{bMKq5TsVhntUyaaLk%V`-G7D4~gRrqi27Y%3v{YZ;EKBx`-GA>vzfi(12+)(q{ zpdOAWQY?-B$2hPQe4EAo$tr0(O25lQ_&*-%#_?(3Bc7rUc#{`j4E`XU1Y9JHeCsms zuS485IY@stNZBa+(VbwY4D|>02KQQ#U6Tsr=X4*=Y3#PxF2{;vs-8FU_@^E93pIe9 zJsue~QO^ialF|*le;sV^TC<+hNLx_;-24Z5`2=<20pk;xEFTnU$^qsvJ`r;fpHTg- zJagbK?0DAl)#NhmcbWyhc|<?5Inc02Me)6~-W2K{VTRKKo5 zz9$Ym=RW9vAzw%TmssTYOL4?4l;3lQa9(fE!Hz?C5pBWD@1Tz0mzHJG+>iFtNtvm* z?Jt;G6LUQ-uMhq(1>!HePg>?*1$Sh>4I~eh^`i3VemF!EfATz&pnuyJbt21FOAoHE zLz@uKW8_noL*KKZrzWx+rX>&kKYAMdR@$bP%#qMfR6mG_n0dK;A3Ss8Vw#)V!K$LB z<~u<>@KPiR>6eDC{C6>eEcOH6B|(2~7Sux<{V92-N_+6%-_SqZ$@2^ZZ@5khOeBo_ zHRqcpw-l;~dKRye7OazfX|e856>{9MD(oys#=H;>dA?md_<-LY`t$0!hf11A*j4-; z)E5L1b33KJj;Z;kxap+1b4vY>(T{a?{D7MV@vPep>!E+~F-A0x4-A!ttn6ILAq68M zWv1o9IB@S&x%BG@+PQlT{QV5f$c+E^$KXqNT+W>DBKi}}I?qb`0n$d)xW2V8?hx`k z<-w~|2T#R$rMM3Mr8q2ip}tQ`hTM*{`TqWoa=#TnDRHd(TUUTg*ug$dM;RXGp zL5T1m@(U-xTjnXCNdfxP_aXS2P}CvYn6cv$_@#94)0=iqG)EqrTJ*{3`=EcQ9rg#* zv*nef7Y9^)9_>NBrDx(DXJfvRmoZ!dT{!vGa3$Nt)HB-Q|ZbBUD!Mw4AJSY(y zT}7T}G9CJ-Ux1tb7n%W{p)~4zBJEUT-*C@|aU~sE(y^{Gm(HkPmuLM1pMjmL38Elk zKD(^-67U1Q=o@qOyYdXIIPj*M{VLw7H5p@uYs1?ch^d!gF{f&vQ8iex?BO zSeN?W#XZ#@lJ6s)W}UxczJe{j@AyT-P7=3|-BQ8O{KMd@mm`n8Xn*ZI@ck3vzqEHP z$(-;0>G0fzc2-V+{tQ>dU)qb7RI+f?e2dKnZ$Tc|27C_l@|g8=pWClujSvTP1L+?< zp=V_4^(HuksWTOQL;$?$_D#;lgLApKTxXXGB3iJ@cDS{891DV)1>gB*(q+ z7UNdqd@t32ohsBJywh#y-#i6>BFWRA2M^=- z({bdf`+~3K?}_qKOUlOJr;ng+&#+L`_a`;4nHJlT7xKQ!OQpuhui3|PQ2(KY{)R;8 zANdFKjpev?)`9o&_0r@9`Q-iJb6TUWGBVD&*jG2yLj8QC{v$D~{5hu{xGAEZkE8lr0p!wf93gm%fZ*H6NW`H z(0+$FU~g2wo-#_Ral)$cEr^ERLJ0XD=!L->8R+id55o<(Z7};L9h%P9gFq zvX0bt(|jz@%`DzQxXs5j_Oyz&t|4=7p{NJ$e<-afg5lKrs z%j93R9@ko|ui~;{Qg(j1!G9@ZE#F3h&s_%p$B-|X2EOvi|IW9UtOI3d_V|Ct4Uk{`9z#N3Xg=61^cIO0%%{(q20r~J3$@hdZr^)|r%k%nH{PJ;NM zzZhz#xd!K%Af7*KV|j1^4v|XoceWbPRvVQDnI91{C--b82C~Cj@Fp* zQHRl#{+cuSw4JLkZ;at~Eyf9zd5`>?C-f(%2N{d3EOOH2Pyd7Nxfhtl3O54PabE5goH^}srj!TPWK z{+k!PU2SBf5BW*XH!=(6`+$6FH|Wn@;-Sez)=41iKU)2eEn=?IPtpdJ|KFZr3wvyW ze%siR8T>>kHotq;4{Y|Uyb#<@?2*2$q)RV z6+k|15%kAiL|&?rm+b)l+)W%4Se9~XLEw)*W4)AydE?9y@YGM-G+{e1V%hgb9g#*SVjf=_NIMPA z!A@=N(7cijg!0p89qMxp=e4#Z_`vB-+Rh~XSI#e*0`3wIKeKZ?)n+evQ+`jcNqx5` z;7{|y^WNlsr@`CSETG9ugu|HPgZhteCWRrA%(#^v1^vDQTs1fITipYEwG;9sZ3pkO z-YRaF35vw)zw#WuCaC|ch1+Vv=^7>dVCUaO={3hzSn5g|wTjQ;{K#WBexTA0@FFu% z|8DfNUoG%;!{DbZXDt)-xH*mS7TeQ^vCuED7V%s`{k|2zm-B&^mB|yzfQNj*_ULG8 zypciDr~KUZ7Y>$ZUQ#grg&F@nwBsacRr=#RU|=f!zf=?4^EUi1Mf;0dvY+t#2&zS% zFFpqPPK)4AOd1T}*bV$~e{2xWaom%f@1dr@qD&{)IZb z7W~fAf|?ZP2II6eC^fI2f3s^|mijK8z1RXtsPt!MUu zTQZ!ETNd;sbGx&Kb=c=17FH43uP=qF^f#r%cE>#LF<%6@ciJ3UGX?9)p8lj6iuhyJ z^6Xq5r~Sj<@js=-04cY?&eJ`p&*2>RO(b}aQLu1_yx&f6m(rLQs!pDJIRm^)Cyd)Z z1wQbh1MQ!H{|{ML?_{~DdA(W!eY3CjWM2)N0Q)6qr-KAm>F1k<^_8CW=ClpGd!V-- zu(kunb*=-R-2-ucOaF7yPw$c#cO`kN5zzlT5WEn1-&WwoBEhrJA4f@$^2bR%{99x^ zxpOh_bnD<}4c7lF(NWveMi$%6a}q#h=iNCJesVf(&REqMywMKSe|cb|5c^oRQ+YKx zNZv3R`hB7ix5MP^o1!0nu;?2PTEd@Ti~a4~^DjN9P6 zs1tXNJH?CojgXLKVtY58Jj(#^2m|@`AV0JR{1VT@d_?XW559S_rzSDXdrm1o zHExLpwi8K|gRF64IJ{Wg_@8 ze(#1?@~nF)Y~@e*B6qDRY1QIg9ej2m)vwK7BUEeLy?M z;=vQMV#KNBO~!!l7>D_q-)myS!RIaZ(3*d#pCkpW?C0xOL=$P(T8_&E6~CPs@hQ)B zy{|p^xT(%suOK$h#z!CUlr69xUvgfHGJ(u<+aC2SoiBk|C zGycO^R}V5vKt%8uc^tAh`TjG|A5a4sH|u0l2k?P0nYE@D^>6h9 zfB77Fc}$+j^-_K?*2`k@aL(&SM$D@S+%*2Mf1Wsr?cgrP=Pc{|Rf~+;f|%9f*d62A zg}Uq4k7*}CHdt!D1vbNeyna{ayAXWaA;kZf$s2>u&4~KEPdjT0f&X2E?bjgc$Cn5H z)CFAHxRxC3Gw+Iyj&0HuOgo*FV(z~ zr=!n&AwO{u{GT+apXTJ-7|(UwUiTp%B9u$)S8>f)5U>*=lT3n z23odzf~R}{J6{;*`kdFb+Gw2rabCv~p?~i+;x?Uj+I0hewjXh>LHr2M>{+Fg@y z+7FiYsCZI3*x!qPj80OPiVxs*H0bJvQRf(VtDo3Ut4{mg)xi6@V?C}S|7QsJoCa7g zN9q4x?uU=}f*mi$=WAW)#~y{9nY1&7<5v6+`Vr*n^j+m=BCT8O=i;1A!T8w*kbtUOFOQs!LyA)Ud-*t{d(Xd z`Ma3x)@u1FA6Ndb=I^a<$pd9ME8hH78ck#~p{1cec+Hg9j;x|Tm!-^| z27e;gTqzk&?#b#lLadh#`%8e z1pQMyPA$hsep?#YSat$@cW%^eh#3d=!wm({58I%8jbB-ze`+9rv?DF~hk+lP4E^)u z??-^I-z*asIYj=q3wZ8{D9oPp|5``zb^l3VMQ%}lb~*4{bJJ_Gj{3gy!Qb+_xrNj} zDD|xBB;7*9$D8q-E#Xz%y%PM9G-h;vbn`)VGzEB%yZt7Up+>IX<;6fyIjsROv@4{1;$Z}7J9dKdhx=haqo zvmQzYgJ-h1u4K?)*h#G}fe_Qgv#%n-iW_>ees+)@DaOVUv^Wqe4VNMaWOs|{NH#6jDr5;!LC}*kNT_I zgE!}O5a#xDnKTwP?x~xZwB`-QA;)g;6>YGt^RjO9N??_Kk=v-}!qg9&0v@^%{alub zmi+89{=PZ%>&47tDD#_ahd9@yoyqj)Y#z*4+P)S$NrW0V@CL>Wp`GUJ8@@chOWKQ; z+0&svi^pwbS!rp@KH1fxPqya%|E3M_b3OH4>3^+~;7d8~^C;Lq(j4>kp?<9(@bVon zuK@B1(cn3UK>s6oXLr=qGS{fO5ZgX`lJ)*+oc$I=Ow7yJ{__`=1Hm)$ zdu1Z+Uffpq2S}b;M!)vgf8~A%*P%bT2K*_?I4l%{%AYbkZW&Jf z{UgA$u14L;a?>(p3b@x6%vZv$CGRru?EKxoF?re*;J2C}zcL*yas9wMaDPwQwU$&p zz%TE{!fHuByX^v>>4QGmlKMI1rSiX$1M1MM+byyH6>p<%OeccT4dY~4@U;W5jz+NG zeoX*>ZSSr1C+WY2F}ox9#5L$MZ(ER9b2d8aOR zOk}gDWheVdH6HKUO&-BIT=ER#79j7G7VA2h>)N0E;#Jt6=7ao7TD3eM3BLL!B2$t4 zR3!M-5m?t>$(u@Am7ghtuw6dD_}}9CJsgO6W#zmsaXl7|chVL*(N5hiu#>-Uc1_Mx zzaaZq`zolDd(^)ajC^&o*dNOi06UxRBW^WVZ&Mn9A6p;?G(^nvb{@uo58sdZE~Wix zGQQexSzvLz=(&VT&DV+7F(KN9ao{-Zr$ya5a0hM@=UaFo<{L@-KfR!zr5O}AllxTw zubdKfF6q{CY&rM<^#x62B$WE9cMYSxAN0K!W1X7Yg_CQ+b3XUfnz9VF zluZL3%L_i782{(R!8dJ`0v3_YrIsZFz+L9#(69fJFXMbSaK56ZW!F~dzjj6*&F}Sd ztHJ*ui{I~N9)*6?ll=Pgk|r(RIj+NMjBDNprpYAem#%`i6{7zi*$>OSLO+!0Ye}37 z{rh8)cL}4GT@S%$c90zjkyo-lmHg-rUYO_INf~G<#(qA1HO3uFUV0()$7Dv|h^9a7 zWx=ZYna~0A>dXGQAPL-_=PO3g&Sv&Qzw4;0#pLCryp)C{Jnfm@q!lXs}I+EcU!|N|t4o084 z;O|Cf(3(>Xr_7HZW7|$SCnEF0NEo31p zAe~q1iw)kMl$OZMX6Y2RauS(XzXwFtaE&mSv8{XcubJtkuXT_nHU4LtX94^0Lz zKJR5=s(B4Ng8a@P|8N@ouS-F#Z*DgOXM^A6@rM$$pPBnhrKX{8pc)OMKxNGLuElY= zri@#=W>_!g{#ZWRnQ38X2iMWrQdmblId0=v__LYcyPJ|P7RS`Q20Ec~QZkQ2*&mjd zLw^XP{xb=S(m%xfqIwNupTtMyYmtTjT_d62Whm+`*c^8h_^j&S?a9|?0Uyl!#&jm1 zSr~lfdh`J)V=ad+gOBF^VR`ZlOTn+r^3=p!7Y@=-l%KmT{JhZz`m1-tpF_;A&sOl? z|6!)BX+PIg@M_!8ZyS=&JqhmSf%xYlca;XB#_eqJJ?`xi=!d0s*P7F*|K&P(g+{2) z7R*bky5O_AVx11BeoaZJvVYQIUh4J^Dqn^BI%v(%RQSMISqO^n>4M0((N3{h%8rZS zkc7&_rwn7il%L|pUGS6i=Ya0>E=E0z?dF1ku)lc|>U;?8XOgy{#@)#KmYCn;#+3xG z@Lx`?ISFYtGDd)>PYpX`IPP9&@M}CFC^PM!b^`Ci>lvl3Y55?HSB<-G6YNV{&{F0g zc!>zaxeNPtOb_s(chHe;aoivBzOr-m6BjN^PmMQDbpXFP3H3IVd3?75+;y_k-j?>9>A^yvs7w5=;BRJFwDk zlYftbeplY7QQDD~Biq5Vp7z$Sw~>!O0p2|q`o>yvH*r{vd-DtYH2Yg6>MzR*{Yum? za2EP+`-6X|iZ=#N13&v1^@Gt3V;t+;=K%U%7us3T75c|dcxYmNfBD%AarWl#BTS3o zKMeXmzQg_EaN6G~iB{{v-Qs$m<+Z>cMulii)6O<|sp3EBsx&T<0R7i6rb|K< zAI|GlGmBM@jz7_gin3(m_aFm}DnD;>HtLv*2-*^r6T-F|M>^TWugWE57YZ(9B1CJa5 zPx{c#q5I&M9{exQA%&#u$BoObHOH_X+K55LSC!77d2ia8*bV&jEX?Z&xr^Bc2BJ=y zklVF`egoe3tS0#rZZ|(Pkirl#k8_p`g??q;XU|=|DN?dCc;aR3PnzEci%4FSpS#MS zo?k)TNEHe0)eq|>H{+ar3V5cf7}wnYbc-dAM_wcyS~{|RYT3K%*KUkYd-e^-ZHT;i zzlAOxVW-N%OmCCs|*FL_q;D*hXJ-^p?JUIlN( z<1nRZr-PVP`U~!3KcNNr?m^&TybfXn`O`q~g*@-NJccp)ay_=~i+NR}{=8)9zn`98 z6P_+_96t(v`W<*>>d%p7sQmd;6ZIp@O3RXk;2*hNF#GN3Lg1t3IB7izua*kQ;CXp| zueqJNTNu39;j~)sGxK{a9Q?z456zJU!}yR6+_$2G=2`HMk=Px)VMt<{r~bn ze=^5SBMVCP!-3pSAT~CPfWFHK)NNndpVtC*?5sEr-q#>u};OXmm zYRxy)e_Rs$P(|pQ>-~0D@Vxxp;UM+*^Z=jr0{!6-c~?oC8n?f*OkAWp3)f#9Q#?0+ zpKVV4joc53;(gCbkjHbr2m2vz;+~fC8(}A+I^q`3dDTh{zKZ(;^{HQK9r)mPnD1LV zyz#LCczfQzs}A+gvK}rULcK|NwbWvN7`NX|zm~S9rD$>FYk|dn-GHjF|G*RLqCfQ; zwNm=BU&QOIlMyDP(m3e<`i?rxAoEdDqC9xLB;+ND{!bqderh2qe<}Nq57*t0!>AJn z#^>}+=!eCiAC`l8qYLYK7=M2>`^m;z(BHlu`sVs7Bw+pk2hYkPV()C{V~)(8V7wx9*?a=p5_L}Z45t~aK4oj zz^C!|5pz9mj|CsL2Jw;2mX_xWzz-||uTS2C@mzHrd;t0Q+tA;32IETEXelcj6cwMh z7RLeX8HZ|_&_89FYgsA(QR{uGMg3IY4m+QCKZGdiPoSNOjHkJdT)5uj>Z49NP(QmY zPvuXyK}gha=H)-;Yu-o{pqXET{$HP(LtAJ|JNNux=Vl`8^K?Ta>q+oaZjv~W(bSLj z2H&_7^f1xNOixf~kM0 z8P~PNc}nW*gYswi*?d}mi~cKpF)R3@Hi&aI@?7+@F!!sEldJm~C_4v^!Ov0TOZS2| z2}cC}r9WPW!QGdj-efvjN=p5x{^Q8~c{_4D#yKcG>_~ZQ8CD;5?tefZTTAX32!6OB z*6$pSn>iTvLoJR!JiZD2MeIKnX=hXn_yeBzUV`d+o+!uw0}1e{M1OqVHxcl zI|6<`3GV!=b!eA^)Oe$s6uk2Pc0Tk057tRO zuE&o-s84yRW1IG-l?YZybrz)NIB9&b^9#C`CFJTIj&c~1Evspi|P2-a6S&UZiq z@J2}ojdKgqquLErrw@@^i#+9PRFb|y`-*P8w9@PQ}Z;KdTK9?kjgWj!BypIs}KXMejT zZYVps_Bd!>o$)LoYKrffh;gsOyzxi2Q>tzYZii(KYxHRd{WScYw+r=y&Vj%2ET~B- z)_(yBud;tkJ@{Uvh5jq|`6&*5_eDBQK9G-I0^X#U1YD#o?ZnLjkBJ1AaA_&V{oWOq`JCFH z^s_iV{7lMNt(Q=qZycElA4up4JE3pgHK<8D_uGRnJm;*5E2d}MqW@9+URIj=zg9#4 zXmd|ZR@497E5UEBbJx5&c?{?E;1n8wna38Vq2FsT*6Ekj7@&X$_-NiYL)wLwL6g9j z^0-+u^0J4)AC`yaV2<0Y9Qc}j=u0V>m+Xtd>p11r7ADhT2 zO=Ox{Qps>i|G+%t#jL~eN5SJPzQ4OSM_wv%`$ad6np{VnxQ?X!v{c>(JC&+RgBAIu z|H|`;82<8nd`~K1u&@c7^{$Lfz{miADRD34z{(Bv0=W+?~ep54OvW)zyd{F6M z_s4n>x3zfo0zY{lmb0=?*53nOuwH(xcZ|HnMDV4R5E=7)j674oyRHJ4ve(k8BY5xS z(x^qA>A!MatOP{)lZW?T8bUs3KKLTuuUj@BT6XRP&)^P!rjZw5|NPGTN*!We>OF@3 z*F~kY=1G*J@kTZWYTV@=uprFyPvWnGSMw{X_1Do(m!aUd`l3%h<$74t#Irv2 z3q*rY;(a`1I4wn_4Ai()n(z*Ap9MP1># zZr}y(QO5y#)UPEAS@kP-i~YKdTcQ7S8tOlY{*SLj`!0^!LNNJ@W8iNcd^F!n`|UZe zzr*0jTK0jA%=^tdh+EH;_`n7BjrMWaQuL)AKlcK*`NMcT

CtQ^akH#qp~IY1B$TWh?k!i{s`O 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 z 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 z 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

&U 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 +sYu03_;n2}o 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

nv|%h1_-*o}jtP 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

gG;u|PlffrD! zyfNOzTRf&wMA#ISOG8G4n~VrEJ^;=js5c@E0~bW#=$jgowTcMj5)rJX8APzufCw}! zA`JR)&68Ht1I_Gs!f}tbV{m6y&Si%)`-7;17+bbR`%OsnaSp_PgQ9J_m z#>g-RU0uZRvyf1ZF;ZN3@THZPXV$YZpcY*LuqSou+O0}Ok*zLjUpuLcZCA9!dtWZ& zX+L0zdBkpW2*0Cmnpnai&VIg7Dip(XCNvsB1#&W6&uN#%>Xm}Ha0$WF6Tfg z+Q3iNd?da*`#wFj26u1I{piaXQ2fV*2E{ZVrbRF~cR}i9GaD03WD;#0Odm7bYz9J- z;}%i~)Ul$MT@|)c{JJxzsjZf;PIchzlil-_%g@4B&$L@l@CnocCD`FY$5(oGY(qu+ zV;iA3WSh|#Y}4Y{=J+2O+vMP$!Vu=UkNCCSLNsM}r*b~!Tx^z6*(|7KiAgoxI>(I( zI-0DJJNaa8bi@s>$!~%VM)-Y&YjISiSx=<2B->eu(e?j~C8K3Ol7>zEZ;JOn!ogn^ zaoUbJ&7;$>0NmlsWCeMxEx<92XYq&T!Jd>$`v-WFEDDX}AIr5gWyJfM@th_-p+Pw6 zl-#r*$Va}``7^p_%}ML$v`W=fS0W_X1|5YSnTr+9inv&7^4E2-9>?}w?_%8(lZ$na zA8CP$b&t7N_n3?IQFF0Q5%NZh&c*s;?_&M2T&y(>HcUiZthL|dWcgv}Vy*XeGIX)d z{Caod2Z4)q=Er*yKd!h~U;Vptal!c0Nvm8iQ&sv5q698hx{Ql;Pv~N;ZK2{~{ej^D z7wgO{p^Np0s!A@_dU?Eyb<$j{+y2lJ+x%8HFb?{m4U7dpU|@V4Nk34h{7e_?T~E+i z9ngRgAs6cx?Hw0u=cISBPCXpBShv5QagHzwU93X{NT%Hx$9WqK9CCaPp)K8AKVS~> z1;$Zu{NoKKvvl0!Y&^a4HIAp>I%`hP)3ucZJY7h46>#4jSHFA}@6=Wy&Z_Xv%&!sN znfbAbcbX~-hWksR ziAXZ4L=epQB1y%bDHBoxrLqoGleMmp`Y<84#jotM<_#y#(rREiq}pc5;57dW9;?y( zj?N}GLOO#TCnIdQwh%{9u9rW=aGm^XH)*E5<+}6k<_KM`-7`ivl9_rZ zB)EvMRhiz^%s_|_Yvt#iwWsd5fD)&G27{m*Q^|=TUe{2@tEb^{ivpv$Sn=;)099O2 zSY*r&qfea*v7-;tTh>$h(9YMphvPe!xrdWGPpe-xxlNVxUw1MyDt}1viG@||`0dfy z`xQ%j1ZEtO_P!$1`(Z&F-?q_ygQFm9HrkmqBV?4!oM0Eb;_R#Utk)W%yp2#_X9}_GZ_wogm?zHl0mhQ|3ioBrLsXN8P zs7O_Ne^RtBEF*<17OW(J3AchhV5Ps`B>Xo2=_s|0UxH>%X@vtLg3?6ue(+f-U4b+> zp8-gPPYpWyx_CeMTu4V|pn>-HjRUn`{O){_!VR@U{0NKpev{Ooc@`=y{P@3#sM@^C zaq|=3Y0>=ZjS?^)IUfPzcr)IcfMo@VXiZ4eq4AG5l0q;^Zc(qsW-{0KG75#qC?3lT zOlOx<%)$lmZ1tt8-Ni;Xhu(LA%5AIN#fM!O);5t2ty=FF7jvXMB7w@lG(8Dd{*6={_r7m}biT(#xtzx1VeK*2Hhw&0H z(daB`?~#)PAy8vClv3H**#9ymsH&t668kels5+Nyao9O>{-prUQLBnszuHBz)cmGoPn4MMa|13v%ILOuG>rMY8L4$ zeyJX+BY7+Q(O3NFzVb$xqp#S$@0=0N=qsMIkGxT~=qvud9)UcpCsB?V zf9I*e(Z$R+r|sp5!hOA+=-1eNy(#@9b6fOEj3os)&q*7pxeXziyGx%hIgi_WMp28g zt@y|}QT2(ib=0K`NWbLj+F_ zIue+h2^&*hw_x@*$?IffUG2ei*X^;ZUq#%;gKndXmb^v@vE^rEGr;-VWa7W@H#`&- zI;UH^h$9RSbdVh?t`)6Zb6OQtiX|4hyB>^nYSpfp1Y5P^L9S?9j-O_$=~QZ#hClQ3 zpkX`u!s5Gts$0PgsdEK=imf{j#!^S&g=4|*tiO2S`({t>Fk=7n7=5py;y);1F$J>}Nyh|5!&Zt!T>o0`sc z-F~UqbpEZzrY)nwez=J*N@<-+2B`-j^?<9^NNu#OkeXJsWqK~Xn4Mk)GWify+vjI= zDa|KUq>2z|z~WhgXjZ$X60!|+omQ!!vnAUmXTiv3>;ca=k4!;6-eScE_`^pLyO64r z^A6=ymy1I#X8=}BG|WV{<92vV(J%_qa=RLiC}HcKG>;Z?%jW+_3qNO{G>)yCZPi-B z!}Ulc;sDPmu^OUDd6kf)D^Yc9RzR0IMwf?;F8_GTKIwvscQ_yn@k%$jx@RMdZ3=Ve zSM)BD`IPP&aVP3sNfhJeGhA0z?69u9=RUeJ_6C}-5UU0&hIboNEIu)}X)OMC=*x@u z+-0M&@duWMKkqauWC=5OcJubYpZD9#agyXLAKPpgoZ$+|%g&w= z@zwUEGHO2mUu3bv$^7`gc8}Bzj-MuJyv$uO``M@yATzlq`TNcpo*v6-z?pC}Ym21EIS7$L+lt5cc5hLCw6RmbmpE$7+M|A$DAU{G zI;$SR;sG!@#nJ@_mkK@N#sv@+PU_~1C1u-q>~)m1<>rg;wG0zTl1aW?NjbmZOEA1J zdxB~jH>Zuq^0lY@;+`b{AErxV$81G#mcyot5_6wT5-VKv4e9M~s z^cc;))HO@xwa2G;rc~_M^XAW~1LMyhZZSet^QVqGwDA-2!iBuz&Y(%6DjSwm24CW?k$u*P5TT$V9>}7p+8|O9d~d= zHKG^xtt}D7c+n%4)r6ET`Sf|#a?y6~GV1h$!p`_Hv@xwQQP6(rN)vk$1gjq~L^r36 zTN@nHdamz(B@2DN-aoH6`t`RAiv5xMh-*bOA~r*?#GFVtk!!WYQ1&iI2B#IleRhi^ zmRWiyKIOVfk7mW$s_aJP4^c;rHK_9fbkY4mWoi}4u1Qj+qmVVpVwQ+0Qj8HJJ%+8D z2z$krTi2Ym#hgH+F|Q%=O7|KfZyLhA z;YKhGK|X1Ss%)kqD%ng!QL_-wb6KaUn8h;TDF*~zCu6;1urY8daIB;g8 z#`?_m<@;P^MJ~~i>mZ_sIxh%J8B}G&hAFx8uQR<#!?(kQMe2uW$#R&KXkl$i7W99= z^2!<5#$U~hH&gV1Vl$hj6PpG&s$Cd&aqdJov0W3mFf@UhVa8f~(o)=EoZCb*vEnt> zn5_ZoAjh$-2TKnE)6l!&q>NlI=zZJvIy~NbCJPVYHmyYz)qa+DOps~Bv63wpCQegP ziwv4%AtXHaGv52C6`$a5tSHM=&J8OrMr!gAIP+X_h@u!c@IXAgi)rd~Ni40n$?81q zH+*=0aB}cBsF57Q+4eJ)5lh^b&xbSZXVQ?n4~H79__WW#5yRF8@%Au4EKTMJPjT_q ze*gs~g%C1kPBLG}L~sJ>`P^KjKqYPTfIqCG>;>c4mN1=%lWpZ0ng=q&Ns&U$L*zNP%!;5x8>#R}0842J(9>$(eNy#D1@-vkv+Fz)TUP!rJS3io}I@BB0G zIYD7f%mCSAFVB^CTY-Ptosw|2ZJ_mU6>`}8$R`nBVpLM6Mq%SYcH^xwpX z>GIr^{51u(kI!)@Q-#h0vMJuD=)GV>avo5A+i&4BH&iMY0`^v1Xuk5&N;PiZ0Il>I zd$V@->RtX~y2Un6y=g}iJ;ER2-kos5GS!N-s3wXf^2JZN4l1}WU2d{t_}ueCJ5!NS z6Z1i@Q*7hG5X_^Z@2Hicv zL+HbJ&&kRe*z&Edq@_-F&P!+CXWCoi_gEtw5<|F*nkzb6ux%(>&=bQAkL%%4hTH3A z6s4c8-4Q3IhQ#^le*z`GN5y|~A4ZvAwot`Il+g1_c|MnC;e4sGpv>V@&p>96YL;Y| z+J!TdWY*3*QZYXxKkk<5?mEV1p!qVbtr`zEQDOw2BOXYd%#uy?xZ_Q%HEY7px%^$Q z82)DRZ&E~ttT_&b=^6}<|DEf%kMHcHo2ER?6m5=gGi*X5op4=ZuTi(WLFkjfE|V%T zvT-jn5Ns6kLr^vG;?nZAThQH8)H}@4D1Nr^EBSzc!?Q<24TW`uXxLv7V9sX*nM)dP zZ50dE@PP9prW4&-V6xesqL;hl{kquviu4xa!uXAoMm(3Hy~TGh^T;XVzzDZ^ta(m+ z$jvntl+9FdY~iS10S+qH0^6~1f4~aKe;)RE^yYf(gSZbN7W?!8fMcJ&{jd)u;pl*U zQt}%Z`}FIiC4YK!z&^b?ySKtVoYh-{XX7Hd7Cn88nNShNwX4i7ai8|VOan8S>1H<{ zYmRhMgAXYYc3M2N)pT4H4`CSsaMikF?5c{DckP}*FJ`NpuVaz5$s0TZWXgqZ;hS5)rJLG~RCz}eS+d&%#Fic^&HDPY-F*hL zY(UF5-kNm7g~^29S2HK|YX1=?YfxvUka^HKmnHN{DJ zN-w^u;swOwY^^ru{Lvfzm@<_m)G1p+Z4O#s2IH=L+D8s13Hzx7*n+Myykq_?+tHtC zUtRpT+0*;1A&Xi$h3lp!@Wf8W`|qcY{j^yrfr{!Am+Ys2&2{z(1bQq0yp>J30TD9o z_)7a@@m~2b!wjpX8E>zoK;%fz$6HqeQLJc}fZ&AI3*?*dJ}Ysv8*Osc$Wx~IQd9CB zd3@<_3;1hwPP0p=P?&znWK0o(@HX^YV#K`X7jnE+Lg#bglo>Ca@f8#4EvScd*DX#q zjBE{L!@Dhx-l&vqg@uN?yKbGuFU@-kp-9V?3^DXh_M!lG17+k zWrml~ftx!Z#I(kWq5`zAw2dUUR6Y&!BT%Vbs&J*>E`_)F76&@Dlo_XGx3+!ngZS9D z6OY5>Y0ba3$X-u>1t0rv33c?1o1LC%^*OPf?Y@n6Gc=bH)aA@WS>53=UYK{A;xjm` zX=iwB@)@klPGs9y#g|oOha!)90Up#a?{gOas;gt}te_BuOM`hr2wd5tjx`lT*KM<2=q^fixD;JKvnSZw{TfK;s-T*%itis|Rg@`EW~!=<@u@~~ zmhgDkrfnvi_-P93x7+C0&FGL*$$T`s-L*z6$mAXXol_2-hke1&dGzN&=f)EPRUPz+ z;xzA0c5^dBIuz(#LE$6$?HuZ6{8JK|#c}@dZ5m}b$Ij!`T}^nf_8b;?u)atR-jA`= zCe1%INnaL`bLz0^s8W39k~)M=3d-YFp@0&DvkepQOd8N0H?BDOhbqI-%O zS2S?1pHLDi?qjI6vGWN2&eN?wd*%mI;zsLBxXWK;E(F`m;p;NBsgrPwW+w5T|8nmY zM6hS)kG;?any;(BTywiAX$*KPJ0xw?Wl|4YI7M(C_Sj8< zC*Z|Z>2Kc{r29ksZ-q_$aAn)%&*^R`sEGLqPcrzW0{=omv~W~c7ui{mevlTQ04Dl? zK^E>vn}llWt;RC!#4^f#WYSahHb)VURJ)&x`^+>tmZdJPQyIjuix+=x7cc(Y=dexf z?(pgiM}kK!!m?R}EEs9mP;*I6k=wqh9c9(K5vy+dI;Kv;^nAKR&?EP+E#U8>U_$8c zFMl}R-ykdAZm3!cDW{R2We61mxj<&zFnvX4z=y0($M5O*IjC4R1sUmK3Ng;(iT-Yiq7Pz+6E<&WKZ8O^GyrOY<~9dDKn{_q6fGhZ+%n;iSf zw!pH9V+X*J{n$W87TNtEtOSd>#|x9hO#<4apfb>kpQAFrW4MSpM#b7B9A3*fB>bZc zgJc6tm05CudZ)qz0Ki#97tCdnbpk1c`&v)YFa>3}DW{&z2ux7Pfu@oZ`m6zsvvS}z zjBzFLQ4j}c$=X)8v-e)Z4PQE?ovhuu;EXZ&vQBwYBMD11-;O4nV$;w_j+fZ61Yz9+ zlR`C(X4)5<<5gL|MD0$TC|O_GOFkr|@gJ}BMOX&V;4;#w?0{~kbQQJmLp1}sbkt>Q zKc3%-Y&$_|YDtBaLA~%9ObNvAR`7ttj-0X7>9;dbnbF0*56R5BRwacS zCjE=sA?d6Y(<|+$;Uv=ZOyjdpw)*l|Uzq{T6(}b>3`g!lHkA$Ej@g zp9@E1b=2V|m7VcPE?E0~x3Ah0@VI!7=8@HjN5p%+MB){k3D(p(Uq1^|=X2=zCVbT$ zRzWsJ(@!PS_tEsPXnLCZ;U>=D@#&4p%+ty3zh+*LDkK~Jn9OZx(gyZ5b6FhX{BjQB zz<#@1SD3ux{$zUlsdB%nCON(vew)mFpeg)DRo``05f|C;Ofq+Mljbx#3P-3i+3ok5 z8p^h|pOv^b-v6^dB1j;D7o4)rUeI|we-G|Fioc6H5kos)rtQ%?Pl@+xs_X}sJMkko z&}1I+god8ybmVWIV~m=0V@3Wj+ot!!?I^d;I^}lk%`H-HpGLT~R{8&$^=IvRADrMY7LWQL+Yu6(ubD{jDe+XntE!@|oR= zl2yKs6(z%ktr^^#rO< z&DsP5PBfDjh%OVGmOenfLsQF@59=wZhRL#4zW^O@GN0PrC*x!Hb)8kPlnRcv8vv2` zebQbUY&3>d%9&JVl+J|>Z3L@o9dALF<%wJ3{nO>WoTf2Gp;+l{)H)yu!zK%a-u9o* zNv40}gdSG`vHF41tTTYK-4fvq`QUcNstSm5c_7oArUfdX#r6Nf4Ggs7Z$$a2F5BTP zoSn7EY|o^2qtq)m?;Zho-qNg59JhWU8rYg% zP(hPMfNyJSv(I(a8*6e|oHe5$+kLyTh-I2p-PP-BGCISVP?*emJ3F_@>@M_vSRl+oxTGN> zf`CFbe0qbu5NuT-`@Q4YLzawil!9A}?3#m>A@`>(GmLkuCjD38C!gTJdQ8{Z)PiOC z>CxB!u?B4u29|a{+jatxX6sT_PUcN-tI6yHNdU0D3CF)XGz2DU6#S$r*%(E+cUC1E zZIygSRkBf2$)Bl8HZD@~HI^)}TURmpj`uuOK}a$?5O7S$ZT=9#s(XE0CZu_WBM1kC z!_o%>EW2|GvK<3K>~Q)wO%j(`M!%S8L~=&@z$uc-8Hee@;TWS@tCBtoP^G4_DRO(I z=(h7C_y?qRtQR=H2G)1G+RZ}+>~3xSMb-6)lTAnfL3c6(K#d38u|I+Jv)iKr>)DMh z5?CL}1p@2$FN4xq^E`|2=f6TXzz&WlG#FyV=MGk1Z*o17ciMYN7R?iXXxS%`$7fj} z2IWXBJ91ZTXZ;bag@)ZOHSG<%fa#nS0ap9QXfEijWB!;$l|{x;pD}EJSbKy1y)UKJ z;&uFS_>An0py$dTi&K^)V-ip{Q z=B-#LDBQlI{o;1z83)#l(I`+3<<;HLq7mIlkdG(2u{>JhfV#1f`<;t(|D{jM%ds+H?EE5J0RdEzXtGcvSQDd1}}W;fdT(lQK0GpudBiUejKwU983oU z{BZ()z=}Oz;0KO4FyOnNH&EB#0Z=delYshI$AJO$81A$XQ}r;aOSZx2I`Z)ZSHC}6 z;(&0w?RL8Hx@a-i5bn-&*G;i_??#iUv*KM>a60jUDEwfp*;Yr&NfdgI4ND@i6~GS& zlDqawCq5gI;(>&bKQ)w#FQ7o_qd~h~#JU9;B#JYb@u=&@jOMT7<@k^|Gq>!Fz80yi z_kN-!Rv2xB1gOqz--PcUVm@z=RXrMd-2suRx6EX*c#h&%OdmfV{c*>u4ycKqU(iHN zpQ~lu5EtQr&9%{d2gC#4`YOPmHES`ajLu~nUzNpNpSHbEV%!$bq%t4HVF}6HMXvSd4>{U&G+aj4eOB z_msNm^JsVCL1=1La~D{1HDEFdM+{9_n8gM}mrXx*Kuu^`R(z9hq9S`c+YQ&bby}~eCuBXWzPI+~ z2k)(C*Xdm8qG){w-W6Zxo9fjWqCDW})P==vaY^owAAc3CQF2=2kJq+HYs}@RaNXX= z_70Rz9VjgsD4je|dhtN%gn`oW1EpgIN=FTpjuFm#Qc3Yzv&=7!x{* z9MOpl!V5vB_F@Oc%gnfc7=}4WbA#Nn?_AR&hS~6O80Nx1z%bSBSBsiJ1S7#-Cg+eX zk2t8-IP}GP`UGAiO4jdrBjjKH1W=q6|O+0*IMr zu$bR@9H}PyKd(&|L5^|5NCo_*76+rX+bVqO)kLbHtMTqzD$aygTD{Kad8^VxpXccH zhNLsP0vEzPM_bFPOx#SD;ysu0;4e%l&Q+qd?Va$f-{bC!I^i4gbZm)`amj(@1UpR} zNWK5eH>6+a9Hq%!j2b?eoX+Fk9Qj{EPAm|qRN{USg5;pgc4_z9PL&e)$o}j z7P-y|w1_edSgKA7S@1dLS8^yRlB3Dz_@%qhNv$X; zlB3V(c$Q!h-*Agh>JA(thEYouMjM;`_jZW`rQ`;dDkImR0y+3R1=b2}cw4mpl|9*YF z(s`a|@4fcgYp=cb+H0@9wg8v!djptU6a;S9B0*jA)92syyRUy~V?!=q%su~%M(_IZ z>ACfPIZamv9b+!i-G}TJ${$VnUY+>5!*bfRF@*Z5wLk&15UkqNhHR`_5*8FM#~i)W~%s@1~L<)SyYVf9D=xE1I}*6g_>q@ z4EtHpJsxO1@_Aq@|AqF}7xsuw2)Q@pmsBeIJo2Q+8+|JBWJ;r~>N{1=tsCSb9pxpC#^!i12@vsHtiz{WX?ep-njBnJO1c=4ARPPxSNrf)cUHkgd$#g#IFc zi9eO>_Bs%4Tq0bIE_g3WC%I%LL30$w{wt+m|s#iDg|ep?vAdN^XD5{6m`0SZ!yZ{P9;>hcrl-bO{EzuFZeG|_iM($y|HeT z4G<;PtC$gp&P}98A}~@I^DT^)7obdPB-p;-kS?i*y4`5vhD}W|eSaO0$rCnpv_q}~ z7Lslyiy9+80X)8lkiEWT9wO-TpLY?Y8v^jts%^J-lRzbxEdR00Xmx*cBv*R(`MpPg z8-;)Tt|VitUr7xdIZ!#j`9RiV#H6k6!|K`H|0wR+dYew;-eu2P>)LJt-o%(A= z%<9V>$=4H9+ z?s1hJou@c}R*+;Xan3VVB6Lr5%Nuhial{l(3T%AjF%;XgkFy$9Ai=rWvFq~U2O={u3Ue^wbxyI$#o4E<l%*wSi?tKa%(QR?uO$VuD$AF(pHkzm+ODaQ5PTIaLpyx=hoQMN3Z)3X{$-=&-DYR z;gTg6U6xy8ASp@O0BIa#zUtxz@?P^1V7}$3t1dp_sH;e0hQTel-yt@9G`B`MlulZS zG<1S7WyL3Z+r{WV-Y)v2_`JInXnmF|)Mh_ZQD~UnEn6Xn;U$p8)R+ckV)f-`OXi_} znFjMs*N?t)Z6s%A?*XqkjKPcoF2og^_mtyM$PiR)!!iQ$Mend(uuz0Ajg3)aUS3z> zt4Hb2$BCOVC!|KE*Tt3iOy9y<#0v0wjF!kQhV7FbfZ*OG&A1`g--~BP>=9uUqryy) zz|-gh5?ltL--*~@ucgOvf?ntzU z@N*SRmc(={EUrA}q73ts9j&of`(}eWFVCf>a63vXr=l-7_lg=q9KDE^Y9Wp`%xCC! zpL+k*QLn#6yT$DrXIGF{hvr@ep)5~@P!buJDgvcbA#}}%#T1SE)M%x9Xe-r8nM>dD z+RC?xR=Rs8&epha!V%E_c1oVH;{Sq@|F0mZQ&RFCsZ-{V=#;$rs)&+fyG=#O#+N}! z%TuA`1g?gz`&ifl8wHG;nvtJs%`<`9E$LlOZck& zFEZixKD|TIwMh$1knRmvMx?t}R_#elXlIe5R_TSC`qTcn|P?OllUQq?k5!ZD3m=KdbO;WFlUZxw%OI2GsU}m-e3Fd~8JH7T3w5z7 zTEb(qB6Gg1P;<=woadN$h~b0ER}`JmR|m5t>BmxA3%#qt6Z3LI`o1B32F6Q`a95?gmboMym)$aV z!*Xfcyl`5eF|~}Vt4rRdzaLHyG@cXLDB8C!qP2ZG>NQc_r3x_BA-%Hw+BqjwhB#yp z+L^}-T8&=apG%*^e;ypEkL9m2iVk{KMvICfVR{cM|3~Cq)_u|sE^Uw%ZsTHB{-*QH}O-xvIPs$Bs2mdX+h^@&;A;=sH%DeZl7`0_Q zeOeWW?!u#@LC2WOB*$F7*p=NlksWP?=eGTBty^qSI9Er}b#Hp}Yv{T%+FdhN80)fP z$Z`SpT|Q6m*LWGds7*)Eb%w1ZUTh7^d9(lN!!kQ6``}(7l+X?4A@6xH0!rGBHpGSP zSaFkys0Pnq)(l+1RyDGbPqDeG4<1$r)wJxcXq_WpBeA{p(Ny}DFL*ZY7s+S0 zgfTyQjbWy_vEMqw#oC9Ttk}Bn?BTHL!<+(rShpZBn04U0@b;M;4&@8S&=t@6L}XFb zXUuMoknrPjRfV2JOL{6f9;ZXSo%5HX2tF<$DZeEW9R` zgtEz`YLxGO!cbO+mL26HC>LXtNidZ8!ZaJBocvsk@@oy{%@ve4Pe9q)(lnH}lgRxc zCTV-?P-@xb5jkV$gnb=5_}Pwk`+tF}B9xN={zfG#U&f_A5)~-}DF;4nMcegunbe9f_U;4fUT?H(W z$;byj6QQ>0I4!8toY$}_=72T6!qd1+7_@j|K+w9>$c_G*vctibe+mWTGkdA}lm7et z4bt9z%X*-E<1e4(nB8hkK4LR2mrhmDWfIPfIOHT71rissmEi{NeQAPiVDz;fEF4B> zv}gMm@qH&}?@F&I|Fj`b4Cffzo1|D+O({oM32&M z{OPk?s`3p4$2Yu6BBM6-n_peFEjXMi?tXh~f6AQ+RqDAcpF&K79zaz^4SMS#%D-_* z(A2A0Y^W={Vlr#>IBP{9r(&kBIWtjPf|;Is%$cd0Cog1CB%TD^%VjYwGhY^q{mWa$ zVuaqClEqfM3>MqS`YvX%f2n4%wj_%k-2sdJ$XV=*?===%jw)Mz)i8}#CmB1xG>1Ja z-@e4qr2qc5=gZ@;k(a??U$Fy3fx|MPBCR^L{g!?RiLX<=b%_LIg!yH3(}tG2f=}&b z1QV)aLBYn`j5xB#IdbcpIIySft)9V512t*Jk77GVrOfeFy!y5?cEYQlQ-Guj zuObZ@DL71P4Q+aRhWG4v2>zl^zQ0z9yfh-sSsHvIsLQyfQV;4f=3pB6u`CH+g_|gd zuL7IqW8A=@|Ch}`mLHYMr0}OBh{}R3+Qk}WQmEap8DmG&n2Yk=0MAa=96Jkz?CQR* z9uf^RPtDc}f+_0q#};b1)DXpL8?)&4q204v0M%aFrG0!CMS$AE)>}42X2C`36eKSn zW7R=KDC-zB8!*8!!nS(ZXaVWe=#oNqn~OMVWqs+B|0T#0QA-ojMCCg#lR(+%Vv$GK ztk!+VEywOGv&z6f%x&DHyMKFjn?&ibsR7&4E0$=s$5j9bY`vyee318OcPy;Si1-tk zLKJp$tBO0q*|8g2AE&_b77l)Dxesyk^|lHcJvSH*Mo$*XCdo;(8Rn*+coT&fEx?uJ zarbe+zhI^TB81Lf71AzUXCMP%Z`@jfdhFTFp=S2%q_1#RdY1jzoe@dVIR5$pEME;I zVsKHpuwONpks+q?su#T((8%E9M-AhTnhw-aOmY^xkL!bEyKhgU^#$O7&5}^Krs-o5|YUQs@fiMU%EGH+z-RdVQdVl6jQ_n-o?GU(&i^KOd#E}ry^8t4p z$xJEoC2u>*cHwxUxGea~FFQQct3@~janonEtI&22AM$op3OSg+b`7GAaX(ElUDFSB z2kb)QZALC+GP)L|a9g8c?%{4DZ~C((>*Y-!5v<3`*d0nvLT}HVn9?eFjHngELMe?z zv)94$D(sTJym(FY>9c%d!NSfYlA@wHJu|~>4FpLK3`buF&1$fG0$be1#v^uu%}U|_ zsEu#$wn(7k`1`K#iJrtIsbzj8N0%VtmVkq8=px$yT!ss*@55TiY)|sRw*OYyfSVPt z)<;3$6ul^f-!AEn$DL8kLSHa=>03A-li;W0i~#A5zp46&0i3`gsv8Wa0q_o>wyo1J zNLiIODhrwV(LEysO%O@N4L6cyVC``84tHUC-#kyp!mcI6PB~;G>SrcA&iC0PhOlI| zZqHK9d{Tu4<{Jr|P{ZOmXLnzSfR{Izae&4B+kc*3^TwAF zU9CWZ$pO~9wDS5ISNpE0d~u4&UpgAMVnYI!*6~F{ve0jR86g?B4jC{zWWnPo8uy&a z2vhvKPGst+>49iYTW_TI^|EoaBILdGbY4Ti@>o=a?8@*R8Llj0KuO2&!f$+PVqs?y zW>FpMkN9QRbZ489r}mB4#(M|Nm=CinJ(L{v*foOusv%3PU)1cqr>Vg1^Kimsu%5@A zuV>|%66E4ohw|@xocVV~`vH5&F4w2yy~RkBOTuPRfnj4K_7^hSvNeViAvNmI^tSFGu!B)O!zcGN@qsiQ;pg# zw#?aZ13Kukz2T|ulMZNX&@$(p??VUu;=chNfG-Q{r?eo5`R_0Z_y;6T18&}s4n+hD zxtOATzx#O+XJ>;}w~xJ?LE8spCsA_H_Ju)v`hvfI(AvFc|ARr>d2Tdl?G`cdbUa|! zVnNu{2~yjcn9kP^|LjKGxEaK4wiKzI0}CbbB9+r3c(<=xNU=Q$QE3l*r8|#uspuoG zE);exjmRd_C`0T>yPqhq*iQ3VNPQ>jRM_P5e+=aP&f}~xtvTuY>?eriaJfeH5Xlv4 zZ@cpE9Gw@dz?7r&iiOeW9DPSLIsm= zRyIFOu#$;^LF%nP4`I>mgx#GG_9mXVD_K@@rh$Qc=liLK(Xv|li#S^QOSYf}hICI~ z4l#QML;Wm$_T|%1B1fUy0TKKu&-}|F#FrrC*;o9XggjUUrX=KH?~Vxh)wf54JnBDp zNJyW9BY}f_g{!Os1fhh02hPro3Zhno=3e;YLMJPfC?cHJuRft}YZVH{c?!aeM1`y_wv zN}M1qTeYT~n=LM_V^uYxFv|s2O*_aW_t32)x9&Vs>z-ty=8>x`-`H`y4PcSudZ}$c z8`ssiTXn~BSxc=Q)YG~TiH`h84od7KYx(TTfQ)LhvPCb1uqAD{^YafAb^Fr%ZFlj)0;`Xo$%|3tlra-6zhoPl+wOvGW=#TX?_Y z1?JygqEZ2fck$XNn)qfLd1B<~TO};w1(mOf$cUNBR~g?;3_!3p_L*69jQHswt1@xp zR`7WdB9%gw5Q!SjiTV{K5yP$l!78+)tGDj^hf1|gELBrgmu=`pvzA{>glGBaf(X56 zzfZolMpx+7?l*276F$XPa?Om|fCLJ8lDBdhm%1TjE?(;h7s!VG!Q}p z&u-@ohUX(mSQy}-Keaxup<&1pKI}FJdar;c@GO59AV*EiR=C%iRB6t7vgIZ?5q0Ak z7tcct!SrVV{Y$7R!~oP`fRuTV>~{^Lcb1Rd-R3uF!g-oyPx;g9pCyi?oe3E|YpPQq zT8bdyrKDo_%a&SRz0+Ky`+BfM9jaJ*w+)*J!;NiV$a0%#U%0C07jyu)mlXquTU$HW}_EW-?z%(0ur)J_zcZs&XxA8IV7cH+bCExAf-bG__{n4SM&ZyrZB2>;vt zy%KH0vIpCLT76U?2y=2X{rn@?H))=NG7#8`qRKW+kz8og20Hy8(kz-h=uj&i;zcbu z?Y~;BM3E*YF)^O=9IE|k`PY6bnr>51)nxBMKZ#?&cBEH4;>V)HPz&M4{XRGOMrjPs z7N39|TR{uTg(il4OP3|Vv@4HSn=M^H?r>Imzj$ucb|G_yw=?B zE@ls(&q;3|*qs^E59L*IKOZlswtSo1Pgx&^-1ozx5Fi2j$8qlal>6>PZr|Ro0KPNM zT2R)GL{@VIsN`&pbAE`N7KzueeJ)*}dM^E5$%;zmg~|+}QsonsdA23ev}E;7&Z1<@@QZg8)%9kivXF-$6 zcgD$QlH4r@Gq9Lm z!l6&C6XWB}VJ_hSDPcEj(>I?+?)*SPARJBwai`AUCF<0d0BCF9>Lsa7l8~r7CwAOH zd6%E~C265tvwp`J!CZ_>X2I#=nXhMnC+&0p5s{9gy&YRZhJ+u3~qpVAk8p zZuQoaaphXk&aC&)9vXJnJn$_0*kLpN(e#Q7NvSaY?8H_)7DX7J{;%zU*n#(lgAYX5 zn;-c%4GUu;Y;Me%IP};idc8Ef$K+0i4eMNeWJiZ|X|Y#+7%g_QYq77J11EQ%`hHL^ ze_sn4RoLBSHJWPSVx5V-=~aqit3&^(mX9*s4l^yoyGs9A9ANtm#|3n#{X`<|_;!C*xuR{$vO|^Cu2khG#kzULtG46!G`+_~M6@gj!HhVY zZfllwM@l3TGQKoG1nJpt8_K!w9q-!q58n!YGe}OmPua3>jkio+!$?Yv)_QyRp7$F@ z1~an#LY&&C+6@&|*27oQFS^k=9Alrat%MbDi3~dwX55#-(O{6_pN?DwY>`Bp> zD$1F{_mFg>b}o{1blUoH`fZu~U(|)X`C0vOJpV@b(O05p2ss33Or1v9sGl_cBEczE z((7X5rNQ!jnCZDbVlcar7Nnh}Kt?&-S4TYe9}BR-8_raGKiEuk`d1C0TO~ zmfr_x@|T0EZ}$_(@@=rmVTIo0g~md4!^X#0dh=R3(oL2r{h|zdp=2q1+=`YJ=tJpx zvcp@p)}{4ZsXd~pd&oqK-g#QiCR~8D)Wzt{dZA^yHoIUUyR>eKZ24S$VzGOF zCFTi8gLrpnfctfh52n<$N?}ag_%P3}=As|d8{+fsi|On>Cd-wqkbCnBZk=Sv%dQNg zVgNvTo(1`e;dv&{L-wpibXeN)-bWwLgee}Jsh*)%FJ%0C?@(E|&YG3E)+XI-efW)i zetB&;Ro!0~ir#vBSX*I~59{2KvmuiGF4r#ei zxdZw3Z9XCKR&S$prkeFWZ`PMzZ_R2sjb=4W*(^~KUY56>Rnneat(~Q!`HHPhuUO@4 z%woZAc^YuO`o?s^JCUpEL|xk-o~;8!a=#ks>)7Dx_HNOG( zxtamr)^H9kV~Bwp(|2nu!Mo~ZW9Op}Hm>F3nbz@Cy7PO0pzzBoI_g(KdeN3oK2&Cv zTHfc2>geE)x5HXjM@0*@C!OOn)--1SHw!tLjPA~E$rWb2Qb~$Ihfn@l`62UgIOnZK z{cpWCnwn1dG2>ClD;A**%W=f*OrD2Tj_27t!w1{&sDts5eI}o(CZi(qX&{gBCBI;` zkrja<5oDsM#B+)HxWL6vLtLif*1Q3xe}b~zB3oQ=3K;Rdn;|DT#bTi`jKU?Mf#Y|8 zEO0}T4}oV-nFh84E~UyA@PR`If0bZ+0VApFDc7k@CXiynax6g-r}p<}I~5h926rl` znA?@l!}gi$A*2pv$L0|bOU5<1ieyhULhce1a*J=%t&TVTe<%fsm><@B-OM@U+D>#} zqs7F?SWAkB>7@JLEY(7E~W3x$&&BwHyqaDojE$V-8QvWvSuEmOv z>W$AVq*1x{+k*nv0P4oM5z{ zb_ycoDVFb10ayT}-aY}TDuJaFCS-?-bO_fN%1#?80h9fOHItUf4!<-Q=Q6Bx{Pno( zmQ%H2U3Nn_o;vy-X@bsM3BGMuWjzUpxhYrU(lYTS79qdGL4M*jVAm%W)NbW0>P8i%(?RPAls~Qn9Itta0zI%g{ito@w5#wAdx@K=2Lp+WU z7%weMSSM*t8$s{HuhmRqU&MGXd;~eEu=3yYzJw*N2N0I*l)RV2N}$S zTl>!W_>~~{*8g@lp=icOEcDFV30(>7(Um?Y>`f={^KlsSg&4^gk(I9Z=A3Xxa z?@er*ulb8}`X^=?r?W8t#ReB+-?$Sk6b<;S|R+uB;U)wI;79|Q%6 zlITHBH znv&y6)_b9CMLkt&xin$L9p%XPC`Y1*X6iR!KIqE+zOD85e)IR~Y~-)mNBO!>x)frt zw)@-@hXepa{rJzj})JS+*EIZNhZP~`j)6W`NT8r_hh2<;Q5OPhX z-`hNIYfz2SogcSit*Z+QKur-3-1rls9+Y>N+_Qt1Bd<~ibM`VZu)^AGoJP!K^^=*L z?2EI`fg9d5DXsfNR5ww|g7Mn&dJWwLw%l7bj%cs5G|+{!~Fyt7$kN;q!@EmjS(TP@&EYg_cx z{5&MYxp13C8);^#BpEwJ-mOHjSyGL1@vvK4>*iGR>p8~NrXiwo-8p{7*6hkVTP0X> z_bkcuXO`S33hS=Q8L!x=m+F{*gekQ(l^4)IARQdmzqh^e234~~0j4SUITn955 ziWnLJR}iBIcYxS+zo{U0xUV^Nun$}Y%h%vO87;+)!lTtV*F)!^As=pK>@dM#`2)W; zu}#uIPH=wx2-g2dIgU=N_R&ErgZYfOvRwdJX_m!4q|P|_x;UJsrLY}UzDLc9{2-cG zmrI}~#$Io(`w*m7Qx`{Y1{Z1$RU57yUW4|Pc9_|gkHNE011iR>Adn7t!&W?(ds$pB# zDEL)=!N7coJ6}HdVR6In7_CLpAb!n2&E`)btb^nT6&a}|7bO^eKO;6$2aB6fJWVM6 z&{5pQQ9N2x`OU0eAgwpBpn4r6-8G~U$`Aj+#+Rvn7NDra*Q+qMDR z26QdDStU%L8V>qYpEkuKDMfQ<$FoS&=KO+TWR%8enJW9~EjW7IDlh`qE5%*SPNn9y zW`*twA5b2ePvNx`%tribAFQRseNDrKR!v0Z$`P&}hKQAI8qW8KnlVa$r{MhY51|$~ z2d}T-^7fKKgCUpD29iPpK9bNV!i{zZda+7qTrsaAH2&+L1__PVy^>CQtk*hir$S>N zEq#N~cyuR1V>i_igvL!?#~455YrKviG{V-EEmI?*F#yzf0c&GeB6O`J%!Gs>G!Tm1 zc#rj-8}AVv+<1@Z*l4!6jb^>yXrg1IS?@QR=-6nYW57g*ft^xxOr&p>=$M30JfjW3 z6JbW1yXQWqf@0z- zELyEHl#qzNyQJuN<_0>;C$%EOEUaSF9sB#Yv2^S|T5p@~i4QZ!R&^7cN?$kwPTE7Kmb*_{In%gxNGtmz|H-%&DH1uA4&zjcn33~pIR0!RKqJ#< zyrVhfZo(ie3&N62ZHsDUL3D_R=?-y2H#eHc1E;!@zK?Y(MzakcBP``rk7jE z-%gxd$?Z`k`M8q3R7rGmhy>$8gf+aRGht1A7bosR_sBZdp=ye6!s<0}muWnEpAI`T zI6Hjy0Aq)XskA)fR%3@gY-nE`XxHexrAtdG-eHwbjfj z^bP~byFPT*_m!1xrq}`Edq-Kb%KJzC^kccRHv+Y*0#%2(Xw{SuKQs|yk3;;Y7~=In z^n+CAJDp-O7cT76MEu0lG#@2Sp>m>@?Wn!igW0oh@b((3{>@3+XJHVseT5|_I<7=X zoY?xk?^VJ0l-<0^jKXHzFS;Xp6!6}LL>mwqp(=pbc zlP3to8pXC)yP#5M^9MlkWz{!xhxOeT*Y}luBPtyp>g%UPjJ*pL22lZ)3}E7YE%3sdFP13O)#wO~nX{bTX*&A1X9;!LvXtC>)y5B@ zxUA~OgUit9LahrYZA<*I%PJkGAUh5kYdWEE6KM7lT&7`iJ2xn&Rebs)1!^&OpOdqX zFI^e?`LO3YlU)Zi+gO3X_2&~68`8USH*W2v3VO2(q289iZK+&x^4*L1;XIumL6yxQ z(j^9{6=#R2YwwCKem@FHq>JCB<$2e7bQbH~B87@oy(=9e${u>Pt*TcYQX(nz>R|TE z;H&+;z^DPoOa>#!uJjsu_)6s%We;PekvYnNIJEBVy4ff_3{t~p2oY)#q2;4DOuuob zeIfg0?iyy|4OG*`Sv4 zO~a!JS(cbB+n{~;(r*La>|9;J-LMBddkXSlL$^5J$81}0i)70=#1Tqad=zoMQ%z^F zYJYxQEbW`G^`0|lNO~sM;O}y}j4B@%{-Sx|)Gw&yY4h@bJ)4dytWztbPhN2Dc?&`u z5qVO45@U={So`l4iQ?Pk@Ie$52hT+%?&Ha?t&C}FrjchZ6rnc#YvZkyxM531AdDk? zUCHk-zkU3!#1pVjA)?U{q!ek-Ev(?Pw~0m~ zu{oL|I%Sqi>z5>6pttvrV#M*Zb5$D{8=&YD!wQyW~h92#bCBa zEl2$D31n)IJ+{(ObEfK$8Fk7L-%5G98$9mVBcl3YSk&6Bn`)Y8`GX&fTk>X<)~8%) z-MnXmR@_+%mlrWjgaWz-%+RIlxm^aVV6v1>AVgmaO{Yaf?W-o>{3!Dh1#T>8~Ttr8H<$SGd^mn0&2!4GEU1fx2ppcBq zaraLw+ms-zlKM~r2{ld|Tr&J84yEFWAbo>~9XSW!LX6 zJ;5<-IIO@&>n^4W6RX4Cw#c+9nSvxU4leS`!KT$nTl4cqQH7hXpl!4k5>>-aBz z$`^Yb9GH^%GAr3A6$$V+hIbp6tW&WH(duWhX+b^nTVK_c*P(Wtp0z zX$1wK65$Xq#9Q4It;;%X%o}$^YDQTd2nz}YZLlk}UG$EDV831*@nF7`Z6+@$+D2oG zI0@{yY1OW!v5n|TxYo}u2MyQiFjHha{;b^Gi%1kK2XE6O69z-iERJJ{*_k<05XKR3 zr1Hgl164roJ-r@ihAvhrnYe&1Vb@#)!C;2iHxR>SpVbl1TA`I03la1g&HRyj+}G7^ zTOwkCHYc<7zpZR!k42%2Tf|ri!x~$)L$WIcC%5|McjEoCfAd-Ve?apYaCx5v^=D8S zGoAx8My)lmAx@Qr1hV4DiPu&745{U`kRtJZEtQ^}UAweBxRb3$=-J*a9%Tw@k)*+F zXiyGrr+GrktAa8W&|wTW_9OMK-e3ss{ru6|H>C$Xg3mE=AfNVu2DFU%cx#jjO)t#v zK5rULfq0*we->b{*-~hE;fmB1DXhEM{Lpq>Qa08*-$u6F-h9ig@NJiNDYI=|oEMhF z6C>$wQwV{H!myFtTMJZn0*4mS5K0w{q`=BjF;K|Q< zfY<(@f`vl~K?{R(W5GGH)Htvh zHYes}CnZJU8qevVv*2jykqJ73wG<97rX9W-s;C1IYr7d#QfHg5HInPVJ(@ zDuVpoUWN=-c8-1uW{K%FmMQH02IY>e3dD1p7sYdH#ER#t!3Qpv>?KEievWr{vh z+Dr1(K2jf`a2FJ2lAd||RD8vX&*c(iaAWKVmtg{wWNQU9m=({DAZ7p3g zdbsX!=MC15aq8jEcrbYJl@Q(T#;1aC*oi+995OO%H%unV4VM2X zCxE#>yzXCBmG$lq*y{ZOZ#~Iw`N35N+lOqkyvGLsU5|+qQNpvM&$rN=xLPIEjh>1F z@DIAAmm9Cl3=>|7kx7rSrQO|PRnF_5sV|AskkkIv=`1_pu92N^?}xyqedA@71-({j zVL_jya@86>uw%>H5q=jP5(}Gjhwo8^l_7L5%$Tp_ScQF}z5y&x{pAa<4#&+eydCGR zKY~1ZY%m9;YI$SbB;dOxfro{VXEWeWADjgKO$Xi@15XKfFTfw1MWY^S;J@+`|v3gDzh8YsuY$QUO=-Afw_J>F~pV4G}TK_0qi z>j~jmU+KKM(0L{q4Iv-WC{$Aq>DOVG9QhixJ5+gozTe9YmMMPNO#z8wIdgZg!4e&!rFfMQ z;*)EWBR?k*Wk|W|C%*5G<3SJGTZmx@3cr`c^?9C*ZA;X(d>+>48k_zpVIFHsD9Ll< zLjTPy@}WJ<7}KYIN^_`>(##y~ibM29zLo{-9U3ut$rEM1Ec$$pOwcy3@wumsJ{mpP z@(gA!<3&A&V%nwz{o~c>{GDG?tWf)^gW^Hd{7GfyN|=llDJ+?z-@;LF1X4I4pZstMWy_p!|Bu8!Zq&KRVDQ z1UNks@A$Pr0GfaPIL+UMO3F`uPQ4&(+f4jPF5DZ}Zr|cr{p2Ef8J~7jGhKI)YH)fr zzYieAAi4QnQm=P~*|=}4g45owSBWVVz;}a~D}epaM_qHWaB~GP#?KrwP0V~}(6NC@ ziztAyS@u-vVf754ai&foFivmGf|4!A>ZOpGjYc82qTVAB4!i9SS9YIt7es+J2ZBj? z_Q#DZ%8BLN)cZ*Ja!@{7{_MBHK_h~S>_9uIW^+}^?i}-4(|G>vvjLzuuig9aM%FRn z>PLqwrZP4XPEUIoEI~Uj=6CW`p;1NeIc;5G{PBvhjQz&(huXd^~`rbKXPR5aDBmM{r&1Hs)}fT-#*`3W?%R zqLb?PV^*Ux{&EFq60F1BS69mey&mhYIp&wpki|fWne5J1>sGol+Y^8Mtbgp~BYz^a zdF>CN6cw$x4LW2r#l<{>5z^;23VNYUpkT1bx;kjY5keym8wSbNs=L<7kHBWtHp}%H z{x4+Pd{#|RCMagN_)@!%%KB7%nHOg-rbER?aUAP#DNM2rkoS9uetMoinrkO7GN3%K z!5x|SX)aL$X(68nFDuN{rBc1XA zDv#F~8RSnCTQ)42>?B%zlK(hXByhkO5^OBh62`4=+=)Wv+|0AbM~OBn5!7ag9;ZFy zg)W8mQU*6f)ySk~f+jDK#1e5R|L~>6DNyG0{ap&3_7b_fFsbYW9F{EL?Y6T#CJeDJ zZK1MD^QTYSS>B;b2QzzNjBxZmWdmR*wOeEM*crg6a-ATc@;c>}X(p20MNYi#6e9rC zutQicl%mLKzI5;ZqUlv zj68&EySQT8kzJ%DfDGRQc?OF(8p$m78uA+myds&Rw0uvG4|)z~ZHqp-CfQRAd3aq7 z%5y@-LDL_R7p_=z_Y8PKDafTW|138AGP-rTb0hJe znrlZ)7j-0E{^EJ(@@*}vx>z0Uk%1;O#vbMACwTq4a5v}3)jk`lsS}`FU?+dYIKZ6} z%Kb5v*Ekdr?}YSy0HeDQg`c_>jrP`+sphvUaruw|lwzOXRb(M&;R4#YJh$O}s5aUaqR7BOL+>p$22~@cm4ZQNmexS-X?KySj-_`fH@?Nieeq8yWZ-7M<;_!&{9j%fz zJ_gIn-yBw(Q zP)bE!{^Cjhjqc7@s@kbFgH9!vHGGf7*0?g|%Mu2Em1hA8Y;@J@2|B=Q1xdCN!`E7l zapB|+PQ>e8!e+YPyKAe9vFnTBMqPU?UEdasj&N#Jd$Lxe#+m*yuwRxCvRgPwZ;-_~ zgXIF~B!X8if<^jdI%m#utFKDwdN-}0)b-x|JUd0&2jD6jGh&Mdp6M<9MN4g%z=|~F zYA@4F;*7hJ&G3=D&n#Xr+QeY~XO+gtl8msV2h-E!0X0~Dr)-vV1MKhS@1k$IVZ}D% zJs1JsXn10iWi87bS#v#?g&9iXZ82!4)DymWa=O!IOAXZS+-!XowUP|_CP9l99qEo| zyfj1=C1Ewc{mjU$FQtIQ+y3h69JhCEqX=!12ri-{^M_Ux394){A7wPEgmYm-=(I%<=X>AOysa~Ospgqv_e{FAVy!#Z?`z?x`U%3{{0h>C z=q;As(?(@p(a~>eF!~LaZ@*0)knUWB-p<&t#Tybv17xpg)watw;sJ8wRdmHYE|&W^Sipdc~Dm z-wkHFyh@QAdZup)(dv5(T}p8ZHO}^5-MN-sDN}Hkdh*E;nQcGqa)w4Q7tlqsJ75j~YO}Lh=18Zyw%qwQb5x zWYRB68pPK_R*$B8QH`V3@r_%>ak>0D`P$_2_h$G>4kz2d?DRytL5tzBkUS_P+G!6a zk;TTZAzh;_TnO1IaEv7SYqd2ma-?{Fst6Wlh0vqpUd3{7J{fP;NqkO^2m0xF5Jhi<=_Iwy}Hx`{gv) zoe>!fT1A`0KTl4zl>|6zHd`;YT=CpCQw0ZZ`@vt$`#QW?&u_}Mi8jv5!3mZ3UZYi^ z_WiZEFiBc!177mK45Ddo&PJ(#2HGFqX*h~i)O(Eo zDjV{Lr99=s)@0zDh2*j?afPQ?u6CP9of9@?rtLy5Z~6l57RPhMZ?urVaiiEd+Ayv@ z4UF5GU)FIizR_zQb?Nq=l1aBWva?WriuOIYlJXwD;k8;2Me}gP>1C1`fn%;!*Xt2i zj=Y6W91A0tkEJlVNXOS26n{5bhaTp`{K3Y!mf~Gj3%VD916vf!VazWS9}^kB`eRbV zGD0m&ja~tmaW=|&*n~mt)LcF8llQnnecEegnkMsca0G}cD-k|gX?Wy(BBtybGQsQrRh%O{UO44U2o`@la0A2Xe% zCPB9z4}Q7>x?Q1-uqo+w#h;UOgP9=T{{r2P<@WMPbX&9o{Wd|yAEWxiWMN}Eh|_bN zjH~HDrv3T{8)9yGi#FVhqYwtR8%(CmLR$wtPcGU##E*W5!*414igQz!4rU*#!+QO= ztT()n845Uzm)PHbCx*ua{p%fZ*MjV_XxcEaP)u99oK?=%!0m^j(tnES-M=YStFM9H z{2HJ3(@eFd-byHXhqL3#For5T+wVLpuy2(b0gX;EHEeg8ecH@cY% zFNJN>d$l_;_hXKO*2=*C>M6VVflxi}(?TQ&BX>QW&H&Y)jXi;w4I%VR&vQcB%Ib`BkqI211uh1(kQOv!5S*XkVufsbv@q zl4YdVNsxUSg9&<)a*rPH;NFOUhY;MU@*7sf-?>=LfJGY0oi?5Vu#64^EL)W8zO4iZ zL*apW0LbN^d@lEG_NDUEh?TT!m;Og*u!^W}h|Ia}PL<(pSU-hs|FN{B&)}Os4JuJd z+{RnbgRPZ=oqZHkBS-$ie+7Fr<5Q@{H0j(q){+6T4tCxZ6}VG4Mil88u;NO@{&aa1 zhYZY$`c$wVHZ(mdS?4|eQ4rJj)5lTrO+dL6Bj1_r>y%{%!CCEL|K{EOp}ys~f}xN{ zW$RRVwo+lD0H8-3rg1`jyJZ#8daWiu#5&i$rdOPX;?iy{X8j>LoNP2nuTac2%BagG z?oA)cx+I>IG7RD%Wn#wK50>Pcy;pG+K@h|KwZi4t)eup>h?6qd{TWi_(N`qcXjG12 zvXQmpMiw#9M_`~RLZMtUCYcOxJKIW)ZOZ>Iy`)|jpFw4{VgK5a)l2EG#@>&*x#@)>D)jf*Nm2< z5HRY`?3j0^QbSMbQ$3BS89gXO2i6JIFM>tyT=rjA98Vv%wf-vAe3Xhq@M%ORSt5zd zix|U>AuB&@wN&!?2Pq`%uUx`z|GCNMHue?D?dQe@RSUfLP2Z!A?joIJMHR6SMKVio zaeLZ6?{+fLosE()F1u`%iM^IFXC(?5Iitmimq~aSi&CzOQLz zS5Kb2dSgE7^+~lfn3+?oeC@&7+ZJ9uf(B;?77{wYuwWGh`@Evsn}n&=1chb`VkL9_ z$@JahR!KKehMOqX(#LCmxMTCFHzJ4Pva^&D+9oo7a#0d;t!$u*!$a>_a^t!p>TVyFGe1msUxRM3*M^;V{Dxy%Ry)TZ1PB zVW`Q$8OEhggxYOzNKQgjMhb0s9zURH_RVhg0H(p;MADRFLqi0F@jgHKpOY;D3gJ+3 z3uMb74pr@-bNnQN>qAtI)%`iQ{=Ya@7Y=^JA*%x>Hru`TZK^=bEjg5##=WHj)y<21 zT883K)ti?VyiyJ!AK$V`Z|uDJ8O(Q6Obm z;n!BK<)B>FTM1jNo5EgZocU5!IrRJ($0{VDWb56Mjnn%n5T;^N@?tfDArK!MCFUQ}ZgoP&y+g72CXyh8 z0TSw~T`JKYmfmx~u$T}I56TQ_q654e8_8o4`mzHqm9A|~CeL;P*yNS&SPQ#_4=ygg z&4)0=qCHN=zMn=NXS9>qPoqX-|M9RPsiUJB`(W!6qxDlX_WyQ8V(jY>D#JY<`;S+T z{nNgX#21icwz0oC5O!1%8>lD8PrQj*$T0RxlSc!ehGMk5-#&1L5qk$?zq)ywD`9$< z<`Y(zFDhnUv^Fzu{4v<*+AT4sj%`ZqOTBjOkN+B{j?tOwrFwnixfpnoMci8FRDB)b z>rBrvqplots;W5udCe1MJ}Qqy4hX}Ng@t+bjaGZ9Zx zVj$Ig5I@C~9m+0-duVLC%y!@Nm^s(naUdMfebRRxHjV0^*dQvuJ_mG|f}C8z5qM^# z#OM{<813OzEuw79{C1wvtsEx~Bocq*iBKR50u2tf!JG}sb_A89#U)9exJzdSupcv5 zR>Zm8`tn{%!XMahoQ!2R2Nkh@+wtTr2H9nS!*z&MoPq2_vM+perlN)?Z;9>4&N@21 zzpggbHhO%_^qbQw{5<6(jEe}HYH}}v+YY?N1CedhDq8I#YIh>Xo`MyhUg91{+p_@8bY+>CT zIRS+}K2H}i#VqpBX;uRv9M)E(1SpmK^vyV!(e3!AD*4KxGf5&?rL-<)a{02Ju1C5& zP`nu7O}NjPQ+!s4`zmQK%U96|`utocz8(+Olhd`Ybvo#yumY>zmxDMcl2QJ9Qik>_>VJH!AsVf0fgj3B|+)FTLC zSRQKU`-p^9QFA&-?sJj7{_OxT|7w}_sfl&&ca25+)MqB+CYtqs)e&1zfoG&?LJQO2lXDH8gm;BZv&^f+ zB=2y%le&R*0_np5o&(Y71qsJkOqY}v%jesaS;8UR@dH{w8kKtZWTcE-ELYo|Ua|2y zPA)9YC{=wmcAnR$ZH8$rTG6X=wW`cBT`^cbA1jFCO#>G<6c*5gCZS>gev>f(B-xBf zLl@^jJx-tbjGaq}(kWvzeLX-qCRI1`0uRztVtC(;^6Lmcx{ev&7dOP|ueJKZ9uCPl zCGop(7QaQK)?oP{R>b);LJAXL;&^iV)I zd)7#sPx@3B`9YP)gMk5N!plNU_ZdEPSOw2P*iE(8)kkh@6CxFB}pscv%piSym z-wJ@p*~A;A({K1BY0}Kh1dq$o8cGk+|YtoAQs=T2??r?Zz`+SlgVh4HJ`PUCk-6c{=uDk+QQ0w9Ds)ceNuQ3Ulb-5)U#GU3JzcACVE zj#ugA#ZDRUwf9A3cff$}VHM~MxR)>xW*2G;^riAFR z7=%IN!DCz;i^3rsZbWsF*`SrJSD##{ZX%|NzsNwP|G7aPkJwvq9#A%D#G%TuL`k3|94nUm#zF?~ya$5x|sK_u- zXnPb;Shq8itB1|ZBXQGp6ObdMo{8e)zvmr2a*+!?d9g>~S)iX!;Ui~yVh>}zEBkd- zBgROsIBGA8$mH_K#148)yyECdOl9RH1aMEO@jsL!QM>jyG!ao%)7QJ|EhCAWxTAIC zN*9J@Z+E$n?Ec#@45#@QIzvr8oNo9p8&2b?=E=iJb&U&+0~Nh}ha>X2 z$n+l%r%c1CPs8ZTYe(u?jP^_}8jYqU^2bjCjwtqP*I#IO5Vf}Wve!}HT#kilBf=CR z*#ad@SPtikZMO{>Go!E=L&!La-Z-)1Gp;tdxYddjQs{LF!4c#T&7bW*Gd zl#>vmvG`^|u(5c6B}2^lUw_f}rbkW!txehWjG>KiH9tlDkgo)zX#FYL*M1BLK2G#` zwT6wP`%*nf)mV02C}By*F{1Jt_)=E;2>G#L>1#Z_$I|13W0a}HmWw`*+(vDnB6f~y zF(_k-yvhAL0pM}jjm$>omPfV;5UJ|Om#%8`go*XU(5=R(datfj%eVgs?&ik_JfmYW$qVPDDBtOqn7Gc$vXzm6q= zc3ZsB#Fu<@>221qK_kC9$yIF_$rjy#)@C2!TS`=y*SVgpQ9NYotVPx}KJD#x1IeN>x!Bu)X^b5?dzXT$qUc&1Vx}!r(ES591kGgpy0)@?_TTi!&KqB_k*RJw9 z9LLuzIf!!ICw=o?6S%+s2?Fia7@p8~@L$5<3*sZVdOAd4L^RQ(0jC>glFBpeVTVes`wvsa6VjGd9q@{ehAn#O zb<)>eJ`IFEDgs>34InY3XY0{vEf?`jnyrsGP}9{T5nvjyt&cwQZ5t%y2r|>wM?;nM z(HeA@3F_(nD@|*$G9#~w#bmTb8V3BZX_;&FMBR-*&l#Qa=DsI9XQ^LQ`z(q^w8SVfc!|=9{&S-0q&MDx zH`gpx>nXX5C@LIa+P!tl{F=H@+wDHV6;<n^&7 z_fDEM;qqJAnb`R~9#;~(5V%ZN2E`B4^ER_Ln#v`ipj$@lJ)&b{0E=dmLF^Y6#& z49u;XLPkacX(f0<$bP>dD{yi9_#x?zn_e>0zRe#3A6m5|DEr$bHap3%pKS;J@>ig| zkE49YcMav!g!18_yz>eUY0+g2Q&j-D`$h?udTR|CM4!1?F2iJRLdd-^Rpf+`U2t3s|Zkc3+j`C@C zwN`KWC9Qs?x4Q2;*6O)x_3_79tNS2prfTG*J3s9cA&i6XQF2hFJ7+0LF76zi-V?J_ z>*rHu_7}IDfE0fph(M=IjieOs_sco{Yr=JmU*ubg{6 zg2`;;0xGjMS_AuXxY&*mAVS}&s{1pp$!m`H>ek$4t^MvG)x9;Y&KKuGF?nwG#e zC9I^0YZ}&;%ja?<9o`e_q?{!eG8sBH-Fao)ML~=mHU3}5qCcdbQN@&n04i-&f^hU4$yGk!*J0)3qu3?~~(rQgcu&8J;GnxgNsQ!4& zh8&SPWJbuJp0R?WCIuQ7RWYQgWXYn7M4itZygTBV{_zPpDq79UlZq}>(G|ag{R~Gr zrRpCYu_Wg#-}x?7jY-WA|IMN7@>y|}>5gMu_lr=A@}#@#BM>qsO>R)S;}Q^v0hu?W za#iD=?l{fSRA=f;wr;-bIBvo>!tA6w4&Y;qa-5yuJL!(UO;6UOo=K$dn(p`&=_;D; zxREL*B)2T)gJv0%2u$iWuXFW>XvV)bqGOiQ9bW_n8P)z-G^38^F8Hh-6|rQ`1aiEh zMiJA`iaCFtS<}UV{c=v^`jL@O1F=Gs<&;dITHA6BA12{auEM39?$~$7xRhgDrh&`$ zv+_R<_R|s??C!Qy3!g0${*#u~#Ca7L%VPTr{v17yO^h|rUw=zleF8w#7)JWQq zDr!}*9w>c4$?)6ecJ|e(_q7*lyJD61#bM4_$@Zr^_KMl9r%sX~(F+KRXZh6Lx+-;p zMuO&z?wlsPw$LGx!E^`|q^_%f#EOpmsgai5yi~gLNnQ)Kon48wwc55kRSb+xD7C!J zUvh?iva<`Vt4Qin(9TJHEhTZV{L{A3(aueiJ98}ABpd=ebT$B>Q5zzr8rxw-F;iU> z)wTBJHEaGq-mLNE-mKB{Az$|r{72*yV6h?-Q+D0tcI=c`Uky+xmf(V2w7Rfudv+J% zv6AjMdlJ9wVgV}>MQhWYM^_kV=41w{Bh?t_xCE*(+t?UUFTVbV5%0`(S7-4W*Hg^R zu1a_Q=H*fQY^U~;Nle6d=O9KX9?a(|zPzz{u4;^SDt3WH##}XH3b8O=#YyAoj(X2H zk(0)g74A?Z91vCa@XKr7S^vZ4S^P|zH+rFQ6iY90l!BN}9GW}kDhT-Q9Z0yh$?wwd zdrI&}6>GT^TJ6KHD$|4+1g?_U_6GM%;;NR##!-8?un~uOTPC(+4geU z^&6r6Q5<5-P;E=pH46pI8NQyS#v@IuYgrsQ4|xYbW)_7@EGWw$<9Pc zA4pHR8P>e$xhHz}=J(LYo$I{MbzJHQ-dpUQ&R)xQ96R{kr>?#u>h90_-dJ%{rb*nz zFC9w*V#{0U%`DME^gU+ajMlAXa`0ClaE#ZjeWFEj614t`^Tq4dvma$8mpYh6cAqo` zDqwWu1FYnl50L@rhumr-$UeaUFNlpwY|9GRBFncqBbqC;J48GT^ejT+s9)T4jw3q} zY&I}yuGb#zEh4fJUWZ=1t32a5Tg~XwU%mH-iOVeTZ#kuMW~TuFVN0H?dBQ%pOj1Q( z)ih?zrUYl0O|}@8!NoA85%$Zvno0HX41Rp~Wj6#<%v`toRD}RL>;tjqTKm?;m=b$o z&K@e`SIlP&SkLo7cos8)2=C66u%hwUFyHuIafXm9&v3;VLdLH19g&W3s5ffCK(vsb z+=BgRfmP<3EtSc(ob8YGhOc|D{oz21m|oJn0<9^OQ=#EN>s#DItdbh-bZ+~s`wgf? zBkw_lRUx2!Np@>^NArg;>ho6tyYMg@!$#{@(-e{ z1RO*!ft9EGKpDV0WTEwV@D6eDsj<#c4aO&Q$nDAxbTEbifNg8T!h_}YZptyjx-U~% zC6x4p>>7Hm+SZ=bS?K+8dNTJ07Fyzs&`oCUH&EL>Mwsyct)Jsy;TtXfSOFkNj-2>S z2UvWkE9_0kvs)eFTp#sxdc|8^VXX9LRd26!m##``)Z4rDSZ@!HTzS7nVLm^WJI6D}f>eV$8j-dIJ*t-{W-iRcZ1GCE3U?cq3m%;||?vJi$(;I`YplgmiWn{?WrHjjSDPhR8B|&x zjJug+ppa?A)ca;ZmN2Ufv#@08-h1wkAjapM82@&=5#z1jhZyJ1Fh<1*WeUkbbrs2R z^J^+BSn-0i;r?X-sYs5o9k4U!30xVBTBadbEkS%RA&l1j*=Z0OJ7;p!{$UByDq$=t zHidce_gG^`6IZcRdZbFSoO!ml(r0w~IFc-P6)N+HPan~7g^8PY8{3$1yO?p?F0MYE z07iUf5@sR>vxKX*E?&@As?)T*GCXTq?u&CzOLzWC!;PSzu@Jl2JEc^)dCSxspTz;A zjZcBIZOpz0`(-tU@bx|zNyyBy#suSMt!;Ue;WYMDjc~UA)vGdFZ!`jcPjqJ&KEw%B zUfAC#HxZTN7+!hVy@n|`B&i(SIPyLAX6P|B{~^{^BPDn>h4B5tf%sO@K)AY55!cCV z2}&@CT>*wGV~QN*%0)lf=ODz}Or}d8^D{&Pfa;GW`1onyY&Xhv2vXR~E@Wmi&=5UM zC2~`OirGBT=5(*~#Y(<4n9}H)-us_(Mz*YBHV2B&<)T;^+C>9l6E`4y&I`lOXk2%s z(a>6rQmUR?Og-jbZW#{T&obcPJKIp}&eikV7nGo1_>@+3cM$22xn$vGKWA(Hr@_Cs zSN^?)CXtq)e{9hU%3yh;?`!wP6TuAM3X6*BY9Jt>5H z%hUyTrWt#HzH7xQRfG+A9RLUdH(q$P1t=sH1)sR6C33Pl&<^U2e3G=s7wRT5PKu@X zue)0vLuBJGGZQF`h8PM*8n{=(utY2@^l?XQC;PG~vyjOo3aV!((hpC*(`OIMU=Xql zW*WgO6FLb6G|*%v>CQU@M!CcmZ&MW-#-4{0 zx+FEJu^!Jf)5vHj1vWg-4)s|I2r#Z$ZL6M&CC9F{&=M~KH~S@XFqkc~9Z1TJyjo4! zF$&u`4aA1y$6r3!OeT3}b*83O`8#iXjnGcKT6Za)G@XIK#%Ux8QpT6%x7|1F)yIbSh7zpuU{ECZB_k}CPE%VOh zhAYgRzsTl?&(X71wNy9I zh2=*e6axi8Kz@h_ShdjtO`CQbn};WhK`91BtX|-jA3{(Hq0%-jr5m7P#0n8B1g!dm zEfQ$epp|~#?{jA6d3Li&>%I5;`TXU_iMul!Wl!K#2e}jG4jnFs1??EERlRq2SDlVKNBM7n!GjSfU zwinOPwEOiakz9Jw`QES2@m^-b@BC2E!s8vViXvySF;7$&UOE}fYyfO_}Xv^DV z4qMDuqA;+$*7FW0;2eerg^Ob&Jn_qAcP+__n#8&EDppMWDGXD@*@;(X_&7V#X%vcf z6Nyr8;$t3i6Z}bPa{${RQF4Oy_`!Er0Qp$*T4$5#SDx52JW2HmH ztoIEBOwa!}W$Z^4f?z0PJs*>VVP&l2ufxgM$%qvnS;hwE?SL7g2!V386&sVZ=%>>nPZFm*Y3`WSrox78_cO!7ic2CutwZ z(JIA>M=yggwD@vdeiO=8uTgvg-~UgQEjC-Fx@-W22b?bZs77`pQFK`sxI7TiWrG5Y zI$~50e}dl!;sRFzV<^xC=liA9pg~b-EYnNyMWwR!c~q?T%oRT@PFRhtbiRS!Fr5n1`FrA&TY*hn}v-Q$M_>AT7_G(_Tbx zb;5*yNy1`5U=;Eb6_9u`8s9P9w~=2uJ$>%8mLO7nXh7@VcmN`fp!)KyQg?PX^qvuUz-4M4b5w`}pDo|(y5BGjXXL85^7m?{3 zu*AmpU>;*2?+rbG!Cz9G|B1pN-uN$37Iv~PU&BmL_bv;d!xBV~ifY*)xGfECHph2Z zPa*O=b{06~XB}YM6E!n;5Bu5ws46lxQw2IY?eQBP_fdSAj_gV3GQg(e6YGasEFOV` zdRIU`>6z4ERmyj?2Amn=_VwYSUBpX$7s9xgAATSdPiEplX>nK9E`q!A$1!Qr6i68q z%d!5NJ4HXBM$FMt3>KC zairST!G_CC*E;IT@pq7H!5Vsvq}h95&8e1fWGJIr)B+5IknDtvh(j*T8xf(90xoYv z-26og2tMl>ocUrkst6Ubes5LeabgxqK*;i+OIbRy^Q7rs-F-vjL#1hVsWRUDG7e!V z5fWv&ubW?$-150P6;hq1P$8@H9t+7gm!%dvimRyZUbIpXKKl`56V<@c zB1u_yBfp$wz8jV)7eKKP_mMV`J)7CayBgJG2@pXw84huHwQD1H>C~QsA|6m=P4>Q> zU+aMCwZqc}9$@N@Kgk{qKrTO~y8{C{L`q>%c*#wE{U%@D0PNP}n~r1kc92yGqM1~M z-w4RHdJrkuYp$WZ@J-CO4z`l8`M3YgSNAtrMsmg%{w<^xg*d+Ok1io5-@n0kaQ!7_ zKR?imF$21Ifl>o1O7^(gM&My|v;32RoFN%hE{2__gsWX1E`nbRYOgX?0uqLM*# zEe`(5O>5AnkR+#67+kK$<7>53%rpF4QHYk+EU&frCWa@Ef>&!X#D@;>hR+1)ks)#OJkZ6?^QFSBUUR9vLOO z73gF(xakN3qbzo}z{-f3PveE0BSGq_!kM~~gFJG{EToV?ieMS7RM+)FP{ILRL4U6k zGBFm9t?i3^*uK;e&ppGwh~suA8<>Lzb`tdb9fDHnfOcGR0At8YHh7G7y`@mOX24qs zDDJDVUu6WFgc0Gu>dH*k4%oN76O@;oY_I|i?j-0tI%SeBDdJ)&mSXei&qwdmFD5ra&O+L5oRLS{kufP+!}tE3 z8g!GH{8thFN%@Yk7O|muVa29h4>ywz)lr_vhvkWIZ||!dPwY&^QoLEk-8emo)HD7n zW)79VPI|aKJCMsl8iDV_O;qeBp!mj!ZMZ zzzVVWG&Aoz(P@S;XaDnQX2!C-Y35A5uB~vI@s0sbXs*aKvkyz;Pcyqvc#2LlL%5kh z-}RcmSM(m#e6xd|+2EP!;cU&V+g`W!3(WLwxEo+IHIKccICqFt4H)(Y{_JX0fxAnK z@%K-?mcN9jy)lq)Z+rxyU`P#_%gtt!P$|shi3&|n=4Q>epE!w#V2K;GFy7ppXJNd| zgU?*653w-X?})N~H&jB_v!(yOh0)GinnDZXr*dX(h=p*c)eu0?J)!nFSr za&Rze?r6OacN5nK_A>BZeJUQ;rS|Zo8INSZ8pqSnA_oYnSQCG0zFxV=NACa4vi|&g z(6)CfuJimiOQO|HM4NYo{`*Cx$KI)BEIVAs80u6e=fz$F`F042O;_+?*y=I|j9Q5& z3&5aX2A^aohIiW75y0i(ZyD+|R3BxiZfK8)^MX!uiPRDp77yDcOcrBP-uuQqvZfwu zc0AoMEYhenn;1*!NhdcU_$5|hWXzir%$vA2*%n|C7^J+KX%IxlGUTsh0qSEnwqZom9NMd97A2nxL!pzt+8p>_Z!K5vePtJ;R#;yw;_I4}G+>bgjzQveZ7yBqv3v~uwP|ja{RG6~QEsy91joKqoFnP-|rqX~l zxci^!NJ6%n9G4spobZ`D0s9T?$bhDwuJ=JlpR#+EhG+CiwtTys6pxVj@u@{fyiB_c zrEFYB#1sm=JVK?}T2M9XkoWYa7b20nT6&Y2FtasE!!b-Pq#-E%{ir4_O07KdO!>Hy z$91*3K)6=YlG15$6<4^0LN!l~oWSoi9#=D;fz%DXz%elE=e=JpoX-NCJN;U6rB^MM zjdaK7&5{MP-u}l5z5^JHy2>^t4HIlIkmN zNqzSZd6rZQW7$Hj81dDtZHY=89c4pDw8RKF+3F6ZZx~R@BcFu|q=9M^&Dk|kM1lO6CGr)>y9kIZu0W~_mH!OK&NU}XxAQHE zyLVFg@4J3yc=v`}j}g@t1-v^*{cj=f%phfg^6uBbSGlXo|5^JjN&_EFxbY%Eh;@i* zj7-XZ;8M9LSCiOX2)W8TV*lq{&HO%(tGDsQmpWAYSic#hKRj?)uCC7w;p)CnjXTNJ za7y3IMP%V1-PtMqv=?@Ut790qkv9hva5beSNXXTHcSIhcohUM;-_H#|HzLKU^go`` zZ|KS6-9B#@<=r2shl-ELKlTsd-DNy_G;~VmQWf4l6E5Q6iJRIdR;JvLJdQCK3?Px0 zD$L8gpVB$K+o@A5Lg`<40`^!ZFzPn;*f+Z^^Jvjj+Sj8#4-nV`Ji5ZyXY!7&;8^Db zd8@P-02Vt}KpSxM70brSGn`MuQfLE~LK~(epO|wOkqIpi3Vxs8exFvs?P{}|!=Gk1 zr%#Q<|H!?wJ^olPUiIdr)nFatXQQo-NgkS>3iN^Hvw z1gHE;`JI{Y^zWSPv5EaCNvb!x1VWcKU(n-tft?LVkY3FS0+GF5H7C(bHh7Z}n&veX z*@(enGi4T=BL>WSnX55}PxHE3$1R6ED#i)jjYuKp- zYxq)~iLF)kz4TEQIyHZ;yQY|Qm|JrCG7ODMi z9+vWwZ9uCHtdrnxApk@W?IGy1lQs(eHxFMB09FPAP!HSicO8B&L3%r`p;?lOpNoI= zY>fr%Fog)%iQgRn>`cXL@sAz{0N~72D%045?Q*cNeklu>z@cBt^8wPQbIkD=WSYBp z;;RM;im!H{8(#_SiLWOUH^x_X^XEDKjM+A-*T%y1Ah^0E>7RMZH1EY}{$g^Ex24q7 zZEtA1=)&`B83f+r4h66C-Uu#x1&)aHT9^ff2^323K!?JBj#Ylc5QY=2j0q5_yBM5d zi->pwCczz?_(FzIMCRQu2`Cf+JrePS=6qu}gnR$FZv5aZcu5Q`a z&%jU*#89v;n@CHDw=C1pa5j*8O|!`+^w&NGav4LT53uJ_dMZIBKN1=}6RIA9(a?eA zn|=6knunABOIFTCC2CfGk_%vl`$QLV1FG~PV(NCFLZW^F8q3*=@S+d>M-NeyQcPaV zmtt~965vThh7Z+%-RDn&Kmw5UaNvQhHI+!NLQ*Fhq1^{Z87uSZt}~Th_kJpVRM-3Q z@;wgx*1@s&;}@?+!Z8+VW>}k)BFk7i|FRae!fSBx>SWz?b6K!?{3eIVs3+=IT?&Vu zeT8s+I@yCMrH4-}_DWUSJ9({3y9z4Y`7Z?QnFo%CJh8|J9O13APb~Hx9i>>p)R_>9 zO{XexZ!T`IFTwFCd9;;EC3Kj4>`HY%v1G0xgOnI+RJ zI9nYYZ@y0>@L0TCI>18)xC32-grzUh}q-oUX~k(d1m~H8ZxKplk+6A>}NjWSc)@I;1ge9BzIK)w?e_L)`o& zxRR&b)I<5v9>924$* zS(wn*zlNF$T=Wy;Gbt3VZ}ZL??=|0m{`&H-s<9vRH<9Dhi z@L-vIrh`$USNTRW-d!0Og+eHpNPr(4$^+Mmo5xASy?ZMq|(H;vbeDa#cy_7LiWW>f> z_mj|=(!Iaot{93htQsxowP1kt3h6M6{RvyX4v@XPSNz2s!!_8Ilgo!TH^|Uxy2#!} zv&;MMZ14Xg#;6Wh9NRNj_~y&mF+CzL-HITG1b$*f;`qK-u451aNHR4sA~fZfew7I5 zHAuK>JyZe_9M3C`V~gUr@j{E^<)CzbjaJcQ6v5JP;P-QcE6MU?pLU<$EY_b);a2u% zzAk;~NM*(51ll}v*vY@wW}DAJDfw}({Kz)XkiXa)<@9s;#vqR9d6y1hVoKDy2bCZ&AG#G31Dj%C z=6_f=!*yc;iC{-uhYs>=aPOaF#LY$({Q*0=YH>bt(H70P)iEel=op+lM#dm3!5C!u zc)a<0sBKte?8v+rBa=NX4ya=_%!}d@j$ZAHUu$36e)t`X-qX+#C1Gu+Swxu8`$!pf zJrBdMWwz;V%3nt0L2u0a*`VoWd1)anq@=oT;*}Nh6>r_Z?a!SX)29Mdq&G6|=U@oC zkyQ0HHhn?M~x79f@b9+XVHPjTXOlJwAF= zHhwXh@SHSY%Zr5^ur;yU%!UOtvDhCZ{i9G?s9t@v5)?n6Rz&FnSP_*ULpzy?V?HCQ z?x)!74KlxyuE9RI4oGN2#`BO(j0f7$rCOJ)BrvtfNgf)D+}X`=(^zpsyeVg}VtW`w zzuc5a@`4T<>%kCGUA`gEaee*u<-uc4cxR%jgL#6o;Qp z7b;z%X=o*x*PzM5Zg`-$Siw)$IXT%gXSH#=^}mLSk&e+uV>26U8h8f*%XkYOuCk4D zcoq8Ro4~@9vheij!oovlf`u>q@*P}-&eXHRU^YbDYeQ2UjEjNR$ z`uIX@B`gG8os4R{G4+1 z=JfahRC|m7h`m)+SfZguIpsj&utq;o1!CK!SgqSX?1q$7yCy-QH4IP?iFFLZwFz)? z^6rO|>>B%qkA!zWq&Ls73v93c5!6KrRb#xcE1hgu=+^Cw$a$+t+AbmOe{zz;gyKjG zDG|~h)h(p$K^=S!SMocQjgmiB^D#_mG|6fg=OstumV`&_v_rP^AWc_M^#N|~OE<2K z#}_q1()gTkW_&Y|NM%YBHys@FM~`ANnbH&SfraaKmd8FRUa6> z2JVDG<#mmM-2@8_nCK3f`h{aNJ&l46A znH1Lr5MMb|)haKXScopxCg%vHa>|Z4T`ctH6gq5~H7y6DsK@&-gHcsXCQv%rU6M|A z!4U!xrL0l5MUj0EVSTB|&&C&g3iBy^ooig?% zA3N(+PMx&@0{>BgaW$4~x2Mm-yAe zo=QM3!3+`losxX!ONH=0T(c@0%P2Wdx2b?%xD$-)Ym)M3V5eAWL(86^h zC88eu=4~3LkFadA&2x~39>n_j5T(DEpCBK}ZprtU-q6=ZPFm`uss(^6ToLmLPooKV z7@Ln$t&#^k(*b8PvrvCcCst}A%J;%cXFR6;T}bm`iP7MC?L~T~^@&KS$)d zHNV>xj&fj*X7-?Px6#I!K0s;dxK+p`7eGW=<6WaNe73O#NJ0Fu)fTD`$t)}=%3DNz zruz@TN1IMIVKf5&Jlc=zH?;ql5Eg=jd(!JTLAHbZX~BYDl)lOG6>t5zp8FtZNDba# z+F07ZbQ=eCh#uDKg*GW%%z19-iy6H)e{DPH8-^5O8q5nRT$w<&+N{sh18$8<8%nrZ z`8p7u4jaG*AorDHDZlj5%W0V_vICg7D}W*MD`VwkD&uX(5fTG+cOKjGXdV%8(kgBt z1gB$DKsM}Mluv@maTg&E*m5ZXnlOxh13pXy+4nw(R!G(jfOR|q5MO96R78SqV8E9L zbOk_dYKHGc{G~6+_Mx$O@yvjN)9M|(He&Va<^;@MJzljgMn}aUhGMVjJ51Y1Y$H2L z>`C%V}oG6BFGDkUY z&Jm&-%wgf$9oP597v845XT}2jnmwCopVs*D+T`=_I_h8zido9>*xfIneoy+gL2VxXY~t%TW@%CchK)ki(mCFIVZ8 zuGYmXNIOf8f(buOhb)=G+D*RR*tuMCm13@u-(Mw+ z$(?4gU;leUvD|D^!-H&LYOEY@b!(N9fDWMyx28aDu%U_ zyE@1nG*Ckid=Pva4PoM)z@b;Ksp$1%C3qxstE41GLv$FGja2*^Grw^wRrOq4WLmoV z%8)F$KMo*Ns#;6weUd3ufd}b%N0`GD%a>2Jg!$P(o9{0~E-gc8EU`4i?Lg304!$Iw1;yQ~9*@@&Igt zsp7DPUDL_UCAr;1;B%h?GEx7L~WF2?i9`yLoozBLw1F(BJEu9w_$m|Jb4JFsLaIAfRNbwiG3a`{@zuh^|6XP z4HGH7G@MA+{LRjL-IyHhxs^rCr7`1C4JHGaD}X&6ryOO@4V+U+>KK2NjS0fMM0rJ- z#5mUek0T>Fb>ol)WXYKUff5eYVyq+X7VJfa5Mt$4-~^Wko-W%&tA;2~PHu{~eo?KT z9w(~_lEE7w5pdrj_El9X=Bo;@ZBan%d{J{w$z)dkd_UIAAMvj?wr zp#h*}9ap6!6>|tJr&X3Hz0j+~p6vH1*Y82h)N;&CveI3nos(ke9yE}o1;EIOYryOZ zH3@5J7hIcX-w*?RSSxkA^oS2v`qOunx4m$zL@w?5l7@mKUl22mmFQIvL^pRbiW5JS z%LbpXvV0+aY}=uJMqUxBT9g#gzOU_~LoH4dPOZ#Wa??gE%L$*>JI{lI{IwGd1)9GGvw&MpL# z3^ag|D41*RR&QyrT0tnn3Ex>*gbvMx7hV!hR<6j$7!%EK9N+uOl z0`p8Nfwq>pPDbfR^MTr!6T)$t*2;2NS-J+V_1c(YkxDcIqwDi9s%x~FP4fYX{Il}% z+nDM=xaI)J5&0lYbs#GgWOP0VQys`^1$h(eCWool##9ILoPw;(2VtrMd0s)jpAW)R z2g20~(4CzR!c+(H3k9jq2VtrM`IUm4kPpIC1A@VLBSrLYhZYP3*mWumi3Vi9hs9FZ z-?|2y+4Ng&;8%J1ZA^6_zfq7!^Ff&EK;BdkKOcmt4&;vta$P;jwyk%Hjx<9jOOd#y#z*1Ge6xlW>17> z+WNv8Igh2g#$YaMhjMOrYWpuw8nxZdkORrFYWvrbth!Omqmx;NRwuIJPxUZOC&2b= zvk9!TZ3XS<^5_Sw$%2(t=}Q->$p@=&)-($y8<(X&lPtX2vsk*J0uZ(QZn;=2m6In~ z%kOD~VnoO|1qV6PLIYR?Mh_&;Ml=WOi?`|}7e>j<2T8E>y#20_G`@^u7-4pc;HX{A z?Ay#)2a_NOqdytUhB?^qP$uG)6C4jsMRYG^#KjpYrPfQIgm7zwp%HZ3IPDA#2{9Q~ zoQZ=3#6>k6grm#FM&43dfNxcZZ&e|_dn&%_f|V$WtOU=19@y=X00-OGDqjOG5P7ir zEl3rWGWTCn9;88jLEmzNNQL4*pD=oqFwmpS3E^l(E8MLGaLfte%!_N5biz)w@U#Wb3!;q0w{jJ`&oWJH0DA2Yqt1h3_Jla83U5zwejS%sm^a& zf)8||`XfexktALlQ^OXyO3)U+SkNMKLOAZtD_l(h9CJdrO%86~0yyS`a6D|S^}YAg z{GKuga3UL}5&&xTjfQGKLau?nF;)2znZUS|^qQj~A)}#V-~d2e9j@fy#Su!fB2Zr0 z2$@h*qotZH@f}n{$PugJE=(Dt$jrc!NL)X|&ZMq-K9yb#wBH2UFQ5lyBGq z9xIs=t9OWL%4-W$ehl6sXMAg1utiLPWM_oLst%{Wk79;78Zwp^T@4)kuz?sMg2~ zcj4I%RNvCa@(0pzs;{X4Zb6<(3sv8Y0=RtD7pki20=QvR)fj*cqpBcZ4}fc`58iw< zzZ=X6`5$W1rwicnHEF2V?kIp8POp8j0M6*OB6`RLmFDRorWVmdKgErTkr6i(Dxy4w zX6jIf*nDY6)ev&Ts)o@++U8E^p&@`H>!G53v3e+7k*|k_0j3^e)=)jf)Oc|{bPBSd zbNEN~5Pzv2;;)_4LpNd{r%)->p|n*BI;*|G)b^nCga2FXX+vuc)&V`ECwNhs)uLh!KDIl9 zxo4mx zdAcJ{+E-(0&B`GJ5}}`APJmX*VWZkd2&DB7HZN5sC7X1i+2j_JUqX&9CYy9Ii9&V_ zdS0ZItU;UXLet=sn&C_PL;90B2{fz)4)}9Ej63)?FD#2cRa1VgcRJT|f@HdDFEg~# zQi~ zwLpTc@^U5API{2;;5^Q2t3%d|P4uyl-+9YhalC}f+p`OCtO#-Bfx0{#-`F+8QEDfl z3-PQline4Zo?1pvIVjByA=`%dz)E^xZ(3if-z52LOvazzBn~lDWCyx<=JTp-`VHCA zz7mUAQQV`jJ*OjB=;_tX%u0+pvST@HD@$QnYP9SEOCi}2(qSeXB}-BnB+2PZd3AM3 zbRXhmY(AM9IQ=^*x*8%8N)Zv7EN#wd1GLCX6TL^|(H4x!l}quVK@m^zZ2?hZ2HV*o zI{3L*3V)l0J?@s6%HG7cutc>~L?W!BFtRi|{^VXQjQ6#YUoy<3vhhBnO>IHAaS;Gw zixtd8pic|Nc?-t5s3AsLWzNEcV`h{~W}97zYvc&oX^=I8SXhP=TmBxwPYsQi%C8h((!pl->C;3WV4zu2khJqx`0a5FxZrnCw((KQWZ;Sf?3H zo|z?N1K8xvtV;R1vjPz}XM^{BtC)-O4P63AlTRkf7DD+=lexr-mm(*9iH`DYl4Oa@ z29W<`o0|=GLkKH5n{3nB0MT5dyll{ipkht-MBB3fqe9{fUy{nChIYO(-F&x6KtTkA z%E7jm5x%(mmxrR&%*3yMTzrOe5qJ>%0~eOCDGbzI9R|(Wh?v7@XfpK?2>)U0%2*ed z762{~Kr6&V9Nc9gC&Iadoec1B(UAPM{y)N!0YOSTPjz0=_`*ZOIT|O-e;~~W@6Yi& z7l&Wd{EpSpuce|GRZ5JxGcCTV&kBY=!)`87WRTOFFBVAYaVd#2@Y(G?#TrIRm#b`c zxEYqR8)s(cruhI$v60r9r+LdN-R<$!Tu?Jz-wK=NXIOZe-z;Td z9A_r{5zz?Po~}8>I(^q-7ZI_hSAcBurAmGG{gbFyH5GZp%-w6+r$vUVR5gUlM}&W!=$})nESuTF+e5``MaHYc8w#T+QV!il-X;%mFWQ z!-MbX#*MLg=GKfQV5gkxHTMi=gO}em8XlYAb}yV!V|GvXCQ|}BLHzzj_M-!OlNcqW z`lbz@-)xe{He&q;i}-MVz05}pM)68`e!%QY=TL}%5sMXtA;fF}o64M`;AQQY-x1=7#Emn4J6gC(}%DEe-L;8Z0EL$uEKr2?RJz0c~wEI|djOq%vfUl3@~1SHs*UKq2rJt5=s zuLoJOz0%2%NQ`nfr_w8gd=1cKrOlBhaYU=2i7ym3fuTfg@~+mu*wz1a)ZfVm2y^?n zN*1#fEcEF47P?@h@#x1md-UTgAd`zPsf&i$;EjQ4xPC*fR(QsSn%pYmnE^=d`qpj? zFeqs{!Vr}5_OIb`9$jwDWtvuQI3__4G2^4Ab zoQ&*i6wPVj_D9j2HaaDXoEg=Aee5DUBU$V9O!IyV zkvf8|TX~~!E0u{%_gl`!bYFcKhs?x92a5ch{%K72yJJ)^$OLUpNv@5z-uz+yXisl0 z2kTTf#TQ&t>kq7FaL;ZI5TXsYn%3=F&NFYAXIetf|L#GNq1clsSBa_sL0+tUcteAkEghI4Zmnlok~~OD-B@(x12&Y2P`C zye$NHeFMp>-<)pTJUYJU2~&(U4&y`I?bGw*}h(worbTs$J%w-te-Dg7bu2#w0 zV}FsnkM0M_yQ5usV06U%&2{Bqmbaqw-J$bIT2f=YM828%5Uxt{)mRU+OUZG`@nyNE zFd|S&h*_{pX^x*K0xXcYJ`*3d9A^5lYTU6b&Z3sdMLwoAtx00)j=GKd8X~S)Ufm4) z(@%)YXKd#lR3V!^j8%mK?vT&a@wYbW5A~P6Xs8ndpnXb#l`;gc0JH&@b zaMTHL1d-215t;DpNm84|LrzeQYBQ<%XrQ;(klhIb(l!KP*=ejG_014qe0&*pC7s`Q8` z{$hc^?MT8j6g;1YZGA0>&r<{WRPHq`0cZ7$5yQzM;y|gfop;Moyh}G~L?)=>Kv4uO z+S)|7py9iJ;2O3XCcg~}ILIA9Q#>0g6-%dVaJgJV6N*-wl(Y@1#6y!A1XQc+{@swM zK&CZ=PcN*3PW}*HtY;C5)5)i7a}THvO7UlJ__NRa#H|B?{B(8Ty|s)KG6zFsM4Tb- z1h_UiG#J`MUZw|(e&Xediy^MI&H^|8EQv4V&b9_2uehyO(IQ>SM_l}n{uopWJ3Yu ztlb1MH`jrMh+@cFL?6Uyy9g6P?$i__nsOB-M8iZxr#e!Dor}%s%tEv876`FZ>3xF7 z3hqdF%VhJ+(B zFW^q+3N=dmKWU#cBQ4L&$7b!W=kWUP9gA61Z`5gDIVh?s8+=i(oN2+_+`{vGvNJVH zAcT5@=zDXvO+YMnsJ-x1!pDM2)V)_>pl(Us?<#S|E5PtjatAP7UJXchGWwc@jOm(XFv#8DO1jtB^O`4M-j?qg zSHNA$fu>gbQYCtk?n1CfAA&t#=gJ~z6QbMGl8ZBqBXkw!x{1JGoAK7G@God~gJ6mu zH^~oIMP5g(sh=L)r{T(?AXEU=s6o7>uLfVnn9XB!eBq6>1mt0EE|^;=4)eERKxUII zloBHccVQ={XajD!ksds(;ha>azC))qz>`f_d#1d9AfPL~W;7mez@Jg;k{xB&!mBX& z>G+e$j`)*Zxc!8^jX#y#il6Lne=mmPu+1$%)%4mmTsSOSf;Lw5Wrks0_@EfeoX zYVitXS-Y4T6ystB|L7$5Ko;s&4zCt3hk+IiY?}4y^olts{lOd@$&q?|?87i+&NT&N zX(IPK%~;Zv^4S=0T0Ay;FI$}V%}Du=7nJ`iPm1T2-yP+L#c}}{rXKAj_+^@jw|r+L zKIZl8&wTd*^)L)0e+2&f#Q{`x~ z6PV#-e(`*(>ghIJ8|`LZEfxwBLVO`z{3BLI#d07tqniC+85WlDSJzG!4mKP>4D zo3weO{lFa&0Hb}cS%((yY$y&NY4}8O5OV_~o^=v4t)vHollEG1XjDjd8;QQ~>zume z0pkxQLHAGoxaj`N#)|HL^cd*=Hy68&=m^lf@uv~~*B!Gi)rrCiiU;r%(syb!Ub6Z2_>tmuW~)myef+^>tf@u$#4 z{@-w*|4i4F;!igY^d&Glz2?nmFuj8R#u^Usn*|N=oD(f$E&lBuFh1%s|0CQl*7we$ zB@IVv9mU+`?N~wh;;8RmKwV}X+St4*ed6%YhmI|^();8aKI;>YKA78PnW=B=X1(HF zaPq0w8m{jQ2?e!CuXS|s`g6G7)tPTHosIn<{0r(-FI?h$7yGf!vwa18b=_XWS{$A1 z#3|nnobp|Ijwd&Ebf(NIMNd=mCZTZI@%{$V2%b9G^)bti!(p&t;^@|0LbvotzG2Uk z_R}De=d;{|fUpZ)W#C!U=n`YF=n^CU=`Fw%U0;;W=0zX@s2|H+GHiQ6!J0zrw)fnj z?$z9KDzcim>un6BWB{i#9|9ZF6O2n;L?nYb3lzpFHe!5jR>mz9wA@FFf8VlH$%6|O z#y;_8fEda}VPFUF5Gv-rSA$A8Byr~!9ImlhhYDNdLNoYMv%x924-BeokQ9L*w!aa2 zqX=f0_qZQ|Y5pj_GF!-wc5i`t{`1~H6DDZEVuesy)wSLN-53~BFe|$ZM5})xmFrOc zf(i?f%`3#Xl@ZxrSqfUlpK9ZQ2U9M>JM4WnEkHS3Eh{GR`zJyz&R4Z~da0 zd|?5GNwIp(1-H1gY-p~%C^Gq05rm!buoW9DZxjKrv)<6Y+9|JCj@eonLO~-XGTAk} zg~PUee(l!n4ND?(+$+3iQs=ls3IyX&Zr&Qf5L+O3O%aUIhMj5lo9SknA7V+d{B|Yj zmR*FT(+&qozk%hEd$SIEGP`f1>f+@Ad|h5A3a5V((VaCw^`fn2@=g3}_z~;x#Xpft z5NG#@=E03%yabW!^F0W=BJYGj0@$;~L4X@yqpL zOmSZRaubKz@TE>dDPH%BW9S!xqBY}jVf+E{r%p!{XU$n@9@(t5qKwNcDXi&g4TY7_Hts35hx(j8(m{LUu$WSOl!5lZ!A*wAjyTYc!M{6Y< ziI2L@t=SB)POnhtGK^zOeLu^oR?JYD%H=#hR{|UvV7m+fo!OSV!377jOYrU-A?!Y6B66Z+a?VMtxbHILY3hU5b02k z!5l{W(PxI;1y^xULk0rxKpB0Bz+Bo+gmS{K*xdH~b zY8omzH&%ZSs(OY_D%*l5Q?|q}PHx+xPo>~VT?Pc<@nBR42bWQJCLjYj)Tw27M`!?% zUK-cP3s|ZsNZyJHuIIgF+^-;(*`^tzrNbe>Vj_YFuR$3jT9q%4J&DDn38fXZb=*N3smsK4H8BU=EdN_V`na*;#}kQ<#t_ zMEC8DEi9x6nsj;&O;OWhL(4P7aSOMWFGS(e#8Z>Kk^7+6fcMTo9={M8$8D zqqK^w*VYqh-e0Ve(MGjs8pI8?wYIu+*LBM)nWc{W*I(l}H)ypz99D$B-xJoL2XHue zr7s}W>9#_Dv4|VO^g?iGPCu*)xR)ulEmfd2OB%+dL~{eK34^8+o#g-K*;s9FLAeyN zXK<9%ymW+jmCSEp{oWmIVKaVx1&9=B=*c?95|ddi5~LulKgnC6OybAz%OqB~#6!Zw zeO)3PK^BtniCQNNK%2O~OZ<44i10B3d3cz3piAT-aMSuhE|GipCh=gG$RKZ%Sm_d> z9&IA~p(sI9*+lk36OS{$Kv_`-URz}`$|8&|@<#!52iejBPU^i}ktiFRZJPk916!BY@2)d@c%<;qY8kX~D z37!^M+*}bB^jk<&hsBO+nY_9Y*Nd4ZMPl4mn6hX!G2ogYMC-Bm>R;^KS|^FrFCa z%;+m^q=R&D#f+nA*hcc93mTzBbJkJ&R_jkp68lyuf=97jO9f>^!|*6P(6D2uqZ@WN zU09bmvIImWk(A2(WfDMTPD%0Br836}7Bo>x|4P}DK@X&5B7*sjt28CadU+G*2v25^ zP>4LNgi*7HYxKle&MF{OA-Vx0`A$35Tk1}PgPfC4O!tej%_s2#{{y!_AwP4o*-`#> zvDM8oZP{1ca2qBgH7~D(4fn9xa96#j=H__VaDToDBV*(mN~Bd#gRLle_zUArnl(bu z)C06|jd$w}#Kk7ka+@sW=i2e=FJ>p~)1pe4r?=3gEdLE|oy^nVdDF z$}koRJ4h&BtR=at8<~&_SBrB;TeitjW{J=zgKP~tL!a_%v=ts`lhg#zl~)+3&mwGB+Y?g`)*l>Us8hbMKI9jP$9;Q~ zoNY=00cpm-Wt-}T7?Wb)dTrMs!&X0k$?Lve-*(7`(hYec5 za%B;lMT=Y47};QNW@P1)qL`ICoj-g|esbaw@rrhVcs_We|<)vTbZ z4K}Npj)%4oY?2$>mfNi@H@YoXLTU=nQ0O`Ap3C~F@bdplajQn;%~>9XqzjF^A3Td> z9dB3#Aq5)}>W~_MYz{hi1715P`m@ot3>%e{KkLv9at6gD#h?= z-@FXqn`9~p*$p!m*2ygSsRy`|OSo@B?0}_v(Y)JF(M8g&7g=}Xc6WT)=LcW=9D2wH zF~zGl4hW6naR_ryx;SnwY7jok?}xwl&i0n%uk99Ey0JVq7Yi~nKT+W$<{8x7XS!55 zh-CI;5Iw2p7$@cAbzCHSZK8tHja@wN#GM}${2V;>FsKf@Homfl&{#INYhMFDaSE5Y zSc6I>DgB$M!?OFzt}Y2PqpV?iA0@r6G}uhNa1V)2EK$shT1@0fmR%&zuz}%~i0i6xTAP-u>^((mXTN&TGXo*B`ji`FZ1f=+gCH9mO+Ak-FZ(j`k#v@d9e`{p zF-A)apadi@8gQo*w$<@UF6siFu^it20ivr2GG3_m9GFx@yD8M&uzn!wjG8CY%RgG8YH46HZN$ z>~Q`unKr5d5((DH+ErO`FH9M``vb8nM0X7(F%mx0Lw3CeYfnY45S)werLZMrKj-mu zau9qQlzpl9X}ECXGu)T@5?M9;z7#h0%=o(x%p((S<_htey}*P=l?gR}5GFi=c&p&K zE5eRk5FJ1Ez^oS;k!5mVc9@q(IBGEf#;U#ENNde)u+6!@pc4K7^rrhP|tLy75}`eXvJKgRmV5U5(Sm&)G9+rwXN4h-W)$hWPTu3 zdL7$AN=!pHOo?o;$5mW_pa!#PW;UD%`Z(7O6oS&FrtooHl0sm!?vhig?i+>fd(nVo z1;h+ALdZf3>I}A=G$-FE@zt;dlU#|?L3|O9FQ#3qF)s3ubQg_7s*BPk2DNDxNQX2g zn*Fv<%bRF`11G!*qnPeU`h-RfwZCCWx<9t|l&d@yE9~k)%%c@er$8^jv;yB}V<)Vh z4!9N(Vb_8e{1~^P%)tDE-;S)^`0U2qe*{l`{zNQn*aUvl6(RtUm#W{s2(59&$2}j| z9BOr``2vTjmK0N^`kZ&RFUPm8NkNwFKb4}?y|!u|uc8v|6PW}COA)^Xdjh+Jk57=fYfw@6uo!n!Bj<2-EKSn zY)nUR@Rn8!1Q#H9K8cx_@Gm&i`&Eqxla!Xsd5UAb!|`O|NHZq0$CN!mlD{ZPwgUit zDaD^4eW{RS!!{*}v>x2_edu3alKXLw*gk7fdEhLd0*z97zko{!1*r5}xBMwp41WE4 zOQk2ifeJEvtk?ssZ_(E0YwL>u6O>BpphSA`q;Fv7wDcT<2SOG^XZEqVWQVHleHKe) zGg;XOTG>fj*(X_9CunameMGz#MzXS?Flmfe%fu6w?i+>bX)SiSYq)O3qB(bDd}S?V zyUPfyKeG}m>?I(02U0uD`nvU1>XOnQ{WFvzFpPydx z=UBFN6vAge1T#MToh8|PF5ku2pvPzKO#NN1Ei_3Bc&HRB)zX6_7)(+yjC|K#Oxt_q zOe-Hxp)oY|9oN*}+Ehq|2CNXos14UjQ~*^_0KMyy@5WGjZ%W)pR8PA-r3BB4BZ?zb z@{u#=$`7%+cvn9C85L4xu(TH7lb@9lx*mq_@&l_-A~SL3MiIyJfnBimV#C9%yH6m} z;MZ50T=7#8g;|I-#sRQ*A>~y?UUl>Es!IJvTw+1J(idykAGbL4##hyD1ZIIwb$dam z`f1|gDvOO}a-+pYoC#W_z3IbNKU}a~sSK`qLX2WBmLOk0i$BuAD4j$If~kKner|FQ z4`He8z@eY{>L?kiylD(#jIEAu0)OP=1I;5|C`TF0Ya;(`tqTEJ7_$j)#RFwUTVE&ZcPhBjZ@fPZ5SA{wbu=d<%*G7Qp8YX&dk{4bU_v_*fCH)c<71&V2O6FenaYjp+#Rc29Es(h ze3Ku=XfRizwm$sEf8pX=KV?qRcG2~wCJtUG2F6#~Z_F!j(wplJx`njtn$`qZ`b$`| zRE2L2Q~Qmwxjhxl-H?pks!A-y@GDvY7xaOurJVeRG5I~TgOIsi``Gg7oFZi{0XjgH zs5X4C4uiqiG4LSZslE7PYp`wsP0#%YRnz3;#<}4`Og*qld!{6N=loPqaSO|L_uy0H(gY(!OaBWX1F4d7XB>d{Sbw-%N;F^rymQWeeT^#eeF&;{`Do!% zZlE$LEBgcJc#NMe;EAvm;EQ(o+Ap)q96f_@JTRR<4aGE$k_Ea@ixz0eE5LNEo%QdonCYgz0se#}*q+KadivGXuBS}m|4a$#N2G*&qeLPs z!6aLPu}fiJ10*X(`*OMOh{JSKKlx3JFxrIn@@-a78 z{fQQtHU6we)(+9)bKp@$KvUBIu+^BoUW9MpBP#CDCXInN;MMoFAi!3JiS!G7({953 zW34`{8mBZ=Um;=gnmMM;QekFf4$;m)5>QfzU}UK{%39pqFE@WPeGT4%RN%9}+c5UC(YK4w%^c`IO38*e>6WanwOh+-D0n&{{FYHin{Tsow!Qn z5*!o=8Zy8)V=h?928T=Ng2e@!gw@cJ`~EGo3y(Lg!->hP5C6(6zI&FL@DbDp13EKx zfBX<$1dHe)QgktKB|sQn1A-L(foq4$M)x%iA2He2TE+BWKlmqP_-i5EW+e4FLTkBq z<9ZB4XV`Z91b!|S%1*If=7+0KMQGw+`z~p);b_CQ9AzN#1ODGa& z*wSUL^eibYh=c6#J6tG)V$WvqdjrhQ4M5TL5=QJW^621?@ z&E$C*X$?ui=Z<`^{G?(HJ)&>dHGIZ!u@VIBYR9RxnKaIKuKn zr^x`O(3%EncQI;Ke^PjFME8d(8SI$2{LmS5J>>KEM7v`Q*sq}$%!DXpX2HcD- z#w-N030=yQP{N#F&LCy!^YQFLGsjT_N z3{*3yd%YrDGyKN&e(id6ucyZQ0BczZc%Vq#&+T=z>DQH`Cap#fwjgO-Bxzi~dF2-A zI*P%7BiDH5W!9msZ7tH;e?(i`IPgTs_IPr}H}qs@=NTl4a% z^d&JKVc2tNoRcI_Z#l#_Z&o#@-5RiM3y{cxSk3uVn}+uN#sR;U{O<{mB+rC0g6=y~ z0;ZL8u0oJ;0Okyj&BVWTmTm(udcDF)KSnxZ0MHjzzNnmdULp4nzo23o$n9)0dNC4I zKEbU$;Uu*^r$G1j7;s2}NG)yz!)Ujc_ESPw$2izH?C78l1BrM?tFA~oC~>9aHBV%w zY<-c;Zme2_aD#FXOuA(ZTfJhRZQ0Wkb>ni?Y(AS9$HC8^pfg6RnQb`n>sV-)I&q$A zbpGgZYQhkTy%|Jx>^XlHsy5^&%H5X4mrfaCEZY*&d=hC>nk=FkIJB6Cl}>CDGR zH9Q^nGC&`Mf7F@k7@Y{3QwX_+YMr6n$6V_I)O9+GtJ|NLk6v&^aZ+t?goI#;E=jnL!8AhmuUZBkaI(JDB{N9)APyCKp z1$bGZ!WbLbM5WNQ}cwV9czDe(Ci^iF~{9Mw=^lN-%~=0KU*a(hS8In}|wpy=D1 zu-7($WWcwf&8u(qYFnmxSTruYI)8gO-Pjs$NUlr%R|(dU{{z84?HOP6Qvmo#4zCgY?%xlJ`J+d1 zg_bG34IkKl<29mqzmlpFCk3FX4f}33)rUEaW*Wa7InurUdIJM@UhLZVC%SGWecIfY zsp+^vC{xcqnjVEG(fYTK6~Sp|J*K`g)V}(ba{g=a`)vqS7HM_$*G=tDBVVz6%s}E? zQH)4(@2Smx7##fq7*h#vhRcT*3@?j7o9r?o7?0pLIfN1Xv_Xg7e#lnz$_-#jDNP*~ za$$>ZGPdVsT1LErOs!+R0gFE+eB@EFu#U%yW!gHv?doW;U{7itPsS!WVYs14o~@zI z)o{9j!f@-$CfApNnXnk+@kNcG8tjmWB%b-#h$NnZ4=ag%Fx5{Pg%R0bi$Wl-Bs4MM z6q~?hkbZ3nj+ zq|m@oj$Na!QGB&*J2V4@0Ye@CBIu^1p9k{<r(?cW969fIB-2FWfP}${neE1nvke9Cu7n z#~pMl!X5Nz2zMTCYJ3Q{9yc{U9J6;FZ^fRxq#Av+NxmhYve&;s0<-1OV)*W#A$z$o zgt*$K#)Yw2hxy58rX;&CBMbBcfYuZ{cJGvwuF1(~u#xl(rc}Sa&1@mTkL9+IwqU;X zl55kAYh$>KDX-4yL+VT*MTSKG$@s-GHyi8^XO3WU0Db{kPT>Oxd4dK6;07m)8zQp! zL!3=;bJn+cP{GVu1BJ3E2~k8ACO%Y%_NV(JFxC7&1d^0$PZPe15fe3d_ z!iVKfP{JEo}P4!RZL4tg|%I}bKBE)`AjpwkpDU|dP68Eag6H8o1UjJSvJFGrlJhmKHF zJYh9O$CTs~R#R|2=_i?DHO2Lk^2B6ZdwMRyJ`41OCp*ojOr@IWOgDClnuu0-^pFbo zMT)A4IDWB=RTFe>s+#yKg^WlSF-d+~B=2jc^DA5pKeJH93?qFCjx;GZ^nlg$wcXUD zpQE!o4!P!8$7VV3x%^~X=nO5CU@irh(=FHsTg;SWv~zxrEjmt%>Qs#Y5C%=2VxQO8 z3yxv8#+-@8#8R)}KCgZWBBR>zy2hQ;yxKNDdEb=eof7EqA_n5}EXa!G{~MbzC^J(J ze+R)TyHA#7?oxOTFhyjO&wx6y{^K<4X{lfT3>Iner>52M9+kDg6j}iEPhnBEmTQLm zL!LbGiAdaTKaq+*mb@=@RktfKbHox@_)SBJC75pX6&m>dxG2P&`0uoM=fB-zn`^OL zTkPA}7CDy3#G9K`nn1rYi~y9zu02Do#()n4h|VAM>(^ojQa9WOuzVb}e8=)}gDxK> zxybU-rbm{KUQ#@+@rBg3u%G*l!0r@VK+pi)qbkCJa^k0R5Cg3FXWuHZVtlt|klB7p zd@Sgo9Q0`*NqS8z_W?B=&)w<9?iiPx-MM{v@*$mk2D|#SE8?xs!Gj=!*a_zq5YBF_ zbi2IzXUxq^5Y9)8$G>0BD}mDzSkPsB_@AkUSQ>QUW*i0S+i0%8k)Q}rTb=z!E8qYT z*Fh^Yo4K^?j}Y~I9a3~rRpkBl70t>Unhh?#ExV@HMr?DJvgRe zD!o7y%;!M!7_!WTdw4qvAArRjK#!P3`SaN5g11bfmT}R{rrhVH`qXG!BOHsSx|1T+ z0g-CfRU?!mQ-1bo61tDkLL_vbCA7q8Pl0jP+6`ZNKB0H41^$SUzkDcvKC-;7_~sV3g&-D3rzmAYJsmJLQ?!*JD~;kmRVi30Iuok z{(G+#&rlCMJ46puLJtgj4O_kX0k3v5E@S9f;WtA>uH;^1f%DX{mLMJ{B@pYJy4 z>;rI4cEf|4$*#vuJ>9BxsGI+PYHMv_Thy03ZVMWCkSx&|VbIP92*UOoSVLeUQBR-8 zF#Sy>tW;dMxZdYksHZR(Cjm+aI8@-(_j$D&!TTN%x*K|p+lU;sBvX7+6Q;z6vKU%L%+ZV#Z&@oUQ^mi1TOKd3zq;6CGx z=3=hCc@N1PWzIuvoco;+uWGMx8>S}C)bL-|_5m|^ueXhfFXAP3jG+t{HuvDviCcDl zi$_q*va?r|cb`lLftYwW42LQiRWS~5qNRhHgAw3q9?+s+Aik0$q%TWe8p8C&Up+_* zOTUCO7Fv22mfqh8BrJBle2X!g@&+X*Km5us-R4R^cMwYdUX=vcUd@Je`T`xx*`ypp zBf>YhLTxOx)D)txa!dRYHqd8&cjI?pes{4B?eV8s0gkH1g7Z*8?t0|(!f#u~lE!~) z8@)DO^(*`b4x>B%yN$4kI@i0cP$S@LW;5ZhuQTZa?3jYlW@ zel_UfU`-$1jmLYADoB)b5jpCitp!q7(om^73KH2Tc?71s4N}w|$Llv*c4M)!r{Y>P z=r@$rdh^OQpse4xaoGHNUaPj-q}afQ>&e1sbdM7^v4(^Z^B%kBy20hn<;Ez1sEArFi3!T7LbMWKaC| zkD+4xK04Xsty%r{!6iL95_>oj2Vn|;>5W~8vlf-U0f@r8%A=%}I8C~}p&SN*nQm_9 zRxPgMML#pMOSEKdmtVi$mq5!R#kxH+F9j|_uN^_9408+;r^`t;|JhAyH~#)hK;zGu196>Kh%%Xf=5 zTUNBLatz`w>9xdOly65jwqgE?%{#Fu{P4(cF3BBVwBg~44B&=P^Gxh|JmUbFP%^S2 zeJR%x4m27{I8f6N&Q>xvi+S2wd25>>OzmF7onC#LSKA6{u?y6nyL&yLQ znQ%lOgM)U<|DYo}cuf|3D{#yu7=MH;`1(M-Zd8TKl5v*gp|Hj#)uTbQ8O94?kedDW zR-X72+az~|LUk%Ka)J|1d>#Ob3O~r+!zk&sa2=r`xtf{v>53awNby>zE?N?@#r?WZ zz0(OMb&^T#>Esjm{e&!ke*$?!KjDWMuV`h1?|vJdGL%PFG{$g_X7!RA$m-EjAT{3Q z)GWpvx!WGoo9iHb-MH2t*GYS|&p`S*Abp)eDu~-N;?HU9@N1vJ$#);O|Fb80@SV1S zQB*hmT|}f@3iL|hjs2g1EMVB8EXKqJDGT=qE`;RZ9b`zt>?Hqfz%atG>)u&B!VTHP z6bp3&$WNkl1;n&Ni_1a#uHeWmG5$xL?SGrh-j6y)Ax)rj8jom&QY{#}KNjz;JSHc?SEV#zpP;5Otgwh8pR z=AuoE90jWDh zEt^A0E1VEhs)`_IeV|EWq!7dtmZ6AeVWE$jLQdljBlGaXmo$t?`K5j9rp0nNK~(y! zH8`S!<-6e?e!6Q!>}3UKA}>&twt?fixJpAw4tIpSO@pdHa_Noqd162sjCtVq_B z8|FNW-@P2Nx62(`5*md;&I^PQ21RvO4;8ok%e*HiGx3Aph`M|ERj9j9C$*7WrJOT=T4J% z{&R-B)vNz6llM5DF3`xceDd!3TaedN@_uiFkoRk^fV}G}|9j+pgU13$-cN*LK188L z==+w@rRJ0MnHiBpe#$g@GzFbhpplZx|5?h_}aoyx4WhoE;pHY_b&w}V&0`w53>dipo zXI0|63g4CZuEKXUzR}H8HNGdM{OJiGmmrdQ4^H6Kr6OM#SJF-&qUNKwxqp&YFbiRC zLIPIttIMOyWEJzprQRBX^-!bn)3`LCA1gSG8k8^hb3vTaR#kL895_}xJDur zzQld$ZDKkMqIY@ctU%{RE^yZ+x0LWoYWz=}t+a4u!-Cch7Lli1GH?8lw8Xr+A!)Z1 zfxBW})eyMj=I%EnZSuTbX>sR<WUAohG9 zUqVY+8^T@`w+s|&W@`3jyMVoC92TG^Xi3VjZ^tw+ED79-sek521Scti8v%~#G98S; zy2G4%$>Gj^UQLpz!=!;yLZ7%@A3#!q z9wDb)W1Jrj!en~9${}zo5a_?01~q$0XzO|ewS+d?C<3i42tjXhpob82*GR?A zeZYn+B4-dD-H8S7j|KcI+S4Ib*VEHR%|#c$M_rkfEc0VqMi~^=y`{%e`7XlUV&Tw9 z5u6aR!$IBv$hQ9T6jbOxO5|+_MwB;$RA%ZOERQm=;25@4Zi^d!y^fqbetjG8j$h6A zaQqTpsT<^>Ut08E9fL}FZxngtyePN1{HK_2ggorjO)met$mg@l$*2qG3}y??vzdLl z@Ski6yLFfYsVB%O0wOHf$JITBIfoP}{O6Z!{S^RlzRdZX>kz`7@>b{(x@BG5U|jqR z|IP5h?5p!5hQoKf`xjxJ&dT9MP$JfUKBsNpyt9t|d&wD2g_|vWeL0-oI8zQA8zYxf zhnzenE{i{yZ_Pv*3=5ADN>{k2GICwrWbTt)dMs0qBMLDeA*I--;4iyDhpgbC!Ljj0 zXVJYRXDpq^B~#i7SSL9Tt8#d7=hB@yFtc{><$O=`%;Xqt86~^ zQ&czH?jU|nh#CXoRBUGIb%YRf?<@Cl$rR*^J48@0H~mM0;Envm(opP z=K4eu;;nb%ER(uMe^o&+o(9HEqWm+ZnZq{T`UMB_C_vh%3!=B7O`hQbd**NMV|Tq3 zDH?3vvIPEkdShy45`N=RiE8{Aq60YlqhPFmjpzX0N-3YMssp4p8GmwL<*+uapFkK- zGaC|*yt%EGI$*?dMh6fHrvr$&>HxWy!#8ztkc?QD)d3Wj3dh91?Ly1$->d`A3B?y( zjiH@4wfyphh=N#y533*)Pop5FgZ-* zf{>ae>l@v+f8QTP1#u}xg5eAdIUD$*507N{%-BxTUbc?)dS&l@#sAZIFV(6KN9E=! z^n~hzf5GfuXYF_#1B|TtaNv}O6$GJN2Y&)Ztok5GM19=pfL0U8s1E^RR5a`PiUYY9 zAfi4BDml+V%pnBT2O%Qr<48h?`nZG;R39IMFfCuG>f^@eM1710RB-o4s23>pR39n) z74^Y{c_&eJ{y_;C{TQRV*a_FM_HJm#`oRE#4W&*SSrJJiIHv`d zU>^d;|3CKL2RyE#>L1^};O@>% z+7o}eUwUE!d%~%p7$N$5Y2#a}?X#@y7OgF+wSBV(wcX;3u{MZZx58?gG|+*@cMdxM zTYz!5?ZG9N=8{ygxyL@JQxk!%wTdjwO!`ZxM4Qu5Rl`_JC|SBFr2B z_nLi#OJr-}iM+)1ymTr-jsVD1B!~@zCt$~igJ>U;&_VRzG%j>{!=aZfh7uaZT=zPY zU%X^&Y$X*BM@QJ}{p|H#>BN2v3-me}RjTTaAYzq|1xTZQ&bi9PHvOHSbr}7 z05foJH>M#yEeiJMN%AYn70;kkI)ADC^w4(Uijy%+Gq3H#osB`EjPU^KTau!Cr}daA za*LL`gDv(K9PHo#kZo+BFiVTB0V<;xHC9jO&K?Y^B^Y5ez>TR&&eH6LUd>MDqtUA| zJLV%Cf;fi30UQXU7e;@ulZ))s)P9JarZ3cJR%a-lvvJ%>BIjI}0rETtDGF}oQ_iv(uv z?V1&4oJUqBmQ+``dzsIzeTbjjAy`2pgNm1#{J^mX+wQYir4<;F-oYS7)(YY>==#A{ z@DhMDf=BBU&1=ES2{*7!foxntW*=&wSUTx$wzY44;g4>^gzAkRjMagJ#G2 zkk1C1SaH6Pxi=l&MCQ+}lw9FWI_hAuMAw13aDTn1&#fd?{!3;?MU4{OHi++FkxhVG zA|y7(xC2(xQpBP{L+-$C;tuR4Yzu9gC#bBw9u*2~K@3rH>~#;^bws@N(>O3&rMh&u zo4@JsX8y=MMM*fE7il#1>^9F6`b95Khq=ZGfavRHDMI^THi3bYkBbDN1^ABllkHs0d|Di=+rP%XA-Dyn!${rS55{+wQhYUppHa zOF9lZiM+iVPGALo3eJ1#HG3TD@MW&*0_Wtf;2>)1xKT+XdPxxgDU%d}Gg%G_7iXLR$ z>IjmCNbkE|8x)hW>*qOJu5r8#omQOuaQ(qNN^LTCm1#jeUc3pWfc!)J;#+Qj*DY1) zj4xE}B@>dWKuuiq4W>NYrf!tO%5nEE)CmbN=Y@AU8@~b$vuLg#6pP~?ZfoRe{5WrO zEm&GZVXvgnOomp#oJHN;OId}KYA+>;5IVSEz&#O+FIctB@n@Ks&>Kd~WgGAfk+nVj zi?%;2&T;NNL0T*KLiFY!&Ut!=RA@TRuQ_p^okEhJl%VTMT?-=GQNK&el8W76qG*^V z=vdJ8R?*?m3KF-1@Ei_ME~A$wHM6ga^p+6YOU%q(viGJ)N3{tQ+dGm)nTwAToqISu z(5F54X(OAR{!e8y#oBGlDZbhI~y-O=z>NP5@__4U?XaxF=`LvSEqtc3*N6@NCpjcW-7Nr#*4XrSr zlU7Y^;JaTnv=XfSv|@sx)gSbltG&=_{u`jx&wN=)tMN{J8)u@J7@$C-uj0+wDkDPz z_Bai-NJ)!fK&W;)v)e&pIBeEvRMU&7^cE|Rc24}?RBTN0*1*aZ+-P?MVYoRbAmu$s zNvcI+G$IT9B6OA+2zT`mXs~vwc`B7`CS<*`$3ELK{2Z7NXY$2v987b z?&6EPT1l0j`Ey@)Ey9cKu8zX)k_3Nub&Tw;j*;Efv4`%`?0Mbg%RZvJq(a+W9eeMt zvF4ZVGMTlz1o$4hOK9PCmnrIY7nBMJa7Q$(3SmUcf=(kjDp@nX?QO)c|k2KK~r^opbw z8CB|vC3EELrbb``&I(kUSEf0wFtxe@D6S&0K$LlZGgF+j!M2(NVS=-f*Gn3;DVfTf z|7GFvJiH=JAzTKrR#ZgkF}#K4w2kS%)z#+qyB1hehFlu4Thp0y{yGR`VA0gf;*%ne z$rQ>X}WLne#StKKB8iHMWYz4q9W83;)Cv8^1xiBn*4l97uS(7Jm$;PpJ_Z z6YxF~qihag%ehD~s~GV>8M%s~W<1PU&*<s7Fcwy-RXMN0)d0U`!2J;zjA@*SsKJ=2I+4QSQ}VE}5O;los1MOr2&{nmkh5_$IKo4I zHIRp18Es9}Y(lQKbZDm52yHVN!dJ}3)I4L|(CA?b(C1Zn?&EV&Egmae_mdOv76p^w z#8nBuJl*f4+L)f&XUA5oyXXaub=`G8m37^=pJCngbu6c(Hew>243jJt-nK;b3>cKMi$s(4C?qiuPPrRh@vwHq_`9SlK8_yAOd4ia z(6t%`)B=7w)M16oB|{X;K%#Vn#u&s?)!ZF*h%B2&=mXs{HeaIp2oywTR1{GDR)1Eh z2wCl6flEdGCGKXRi=ArZKpz0?0Z%YH@#9dCCN!U94!2r`QnF%PNh{H7Mx*Qlmt_hI zb&pc$2w$P0Slt$^2p*BSNPq`n;BXq`@**N;#0~~Jq9DLp6sx<}jTdvTPs4ew-KXIU z;>Bt>JmZw7kV=AI!+}sJR7i(MYB&&xqbj7DJx{~&Wgns8NQG9zfl+vG3h7w$i-uz| ztA-=M_n_ejEnE%96m>NmG|Q*qphX25jx64y2N?!p$3<7-Wk@Hb+VkaunWHV^fQ|Lg zFK5KfFNpLa`%#|b8)awE0ED0h3(@?G&X+l6Ds0Qy>y%e8d}yP#K;+~K zd=x@H_h(hBaG(ZBs10-H7H4Ce4(xod2AHKH!i@#@JActHt`-Fgx>cbls-QoKja-x` zBX`kZ(@~G=F_5e}KYC(R#Um_IV+)i_H{T%gh|ZKN1bjWY>RY*oyv{t_noWZ5UbvWmyK95wBO&h}@BUQO3tl z^=dOl5Xgi2Hd*%CoPfjj-b@H)+_bfB7t83p#Z;NMhB0qRvdtwE)^~q`2}^FbNS(Co zhcaPJxdRi{Ie!<1&M1C#eUAXajzn||i~#P@vt7UdJ0xje12evtWZ}1zAfArBWD{fXLeDlOWtD$FlE0_jiiBZR(^@ zn{dS8V2sRSER!gLV>=_(d!HOjM&r#v6315`ucp)o`*DadMQ-Ad4&r@7_)w)Ej$jmY z8?AOQl&Blz$_4C?_zl=$???OwoL|Fsab;u8u11Cgs&Wqr@RqszS^!ijG6{srktp33E8A){#}g{Pa1@RCYPwLHeiq(=9Y^p;~2yT z%ho7+6S#7ebI^xY!Ca_q+ zyo{@u(Ow&Tja$f2_>E!|M%@vDT(0o&XnP`!KCr-%-IY&b3XKBtkK*Cl|V8TFus9@8%7y_A=Jjvy2b4yd(PxH@jq!66_M; z=?npWfH_9JEY^1d0~|ITHCzDH$QdYXTryOf!P1n&ly;at$&!kMq!r4q>;7Ps1&%Vy zQi2c4;cR81x+>>0OjL8ygH*CpUbaMJ3PrV9IrW3uxo8*ZQkqQTxXkxdBO<8R5j{^n#FAjmLDKE?NWZ=BkXFuT8RkM4#q>m`+y0U zk_~~GT2Qnffyo)pj63BpZ>-%{3yHB~;A(0WsDmYeU$xI?NQDNdOtkkCwB>NJy<{$e zBAH}p1|pfv;Un}i@)CY&n7Nu0AD$zU))}Y(MU?$2UId-7guS`j1aNlMKQdY`7>!Lm z(*6RdeEMfx`jhAex_vbC2bMyA{0jYt4gEh${e<*~0UBX&sEU#P15WDOtSz-q+h*|L z8_I`I-z+D8e5Nlce2L8~lhe z8Zi)!Al&GH+czuNH#n%z4HZOi!ZH1DH*}LW_!5^Mh?czM>?a4^N++8aoo-Z$Rho9~-LTBd-7+`7<#Yx2Cq|JfBT+;r5+-A2UN0N5HlD6G`^GG|8HKf&V zKGF_k4QcHcA87}&hP3j{PuhX3A+7x~rp6BlX{Cstv;#s~Nw%aN$dR;?G-lEcUw<)VP6o;|MJ^<5unx8X%di#!-xpN5ldKHp}thbaVn{gCF)IWzkjE3&VuoHpq*Yle~bY+f2LVP4$EoP8kg12QvFwvcp= zHIQ-laUWJ>S(&!wOSOIh@}-A^0k0@m6nIH;?r?)n#XdoN0=@L|G1WIMX+b7nuGbeAG#DTj{^`q zrZY=$E)G$1aP2Yx+G7oDA zM&G4zo2I&@eLhgf5906$##Yudz}qd z0X`a;?Vo+yGl#fXzTMDe4YF70U~I8P?*;b}*#P~!-ERkUSj{g`EMSx(b0UV%QIv9_`;=o&rIj;0)YY}Cr77t|*HMvXmqs@mR zaP*aYA6ZCy3CU!S&}xbPQ~hkEzf-7!p3SqJMCAecc=5qElJGj?W9V56>}akkx_Q zX%c@nw+Pz=Z@_227F%iK)=lDm+VtEEY(3U;Q@?g{ZhFTAW`Ab~yjBCb13KU|5XhBx zOyUo2)Wv@;M^wQ8o``08!n<)XMW!rThs)oBwO_*Dvf3}=@4jC`M5#fa_WcuJ?k;R@ zVKca}>2Lr$dj;681BQn{_OpE2k58ZA)Bb#_!4sC@3$ZHgr0xtdJk%_6&$$4TIq$ce z;RdmnemFAbR~q$Ky2@4xq)W2@0wg?)%f6%!foxVE#%BlgVM6w|`cRtvH6GB+eWR06 z(<0eAT>)I)=tFVvgijfXd_YYL^)KM(mC>; z=mE=#G7`B#nDRpWs48;i(BN))$}PTc29VR;pUHxSDg{aG>?jp$GKf3{NOG|$D02mZ zDtMHUJZ9{%yP(_jgo11>oip6KN++-=&6Dl*mQ#?56 z@LV}^8O;a3a*SA_(1|jHiUxcYvDbp~ZZ2=@XM?Mj+6#FxmlJY76vuSt(o-xnl%Q_3 z`_V)=gTWGr^5m2hkM&Lv9_(wBJshU(=YkB606Axl2a-{wT(E;=8yD<;KCn3AosVhl zyG)8(5oeijFIQY#W#K`Y$RB?UJ)gkEn*&fCu-zE$Ym_AdI-6lK2c|f2>e}^n&jq9K z8w?NkgeI5dPQv?S@oeEn!xX(%xJo~lmE;b@=XJHx5j~+Pw3VZnFb1Zzcp#N2o@6cH zqj(v7j9vNx4gYkfI95%jhi)3e~f9X$cC!CqsBA{)h3<9=79;TTuvz zH4AMe5JR&7i0!Dbig!YQ#JVm3;J~_h=D~??2Uq}Mc64Kv?RkzX=_(}ZKn6QF4SKDw zVwbRP-r~TGITfq{!DCVp7}@mAM=g#XHOUsHmifU^hqm7 zBd@V8{sf|1vJY_0Zu1Hir0J>C(T7S9yWksz0(x13ZLCUMG*&2J$a1J9i_@Uqu}T41 zLx<~8yHu$pz{qu9liCf*WoReZ0z$@o@|uT@PB#_g01bh+2i`*1-_Lm@g=UdC%F;=Y zP~NRKER_9@Z~SpH$G}US?y^f!>YU>8$9m|N)JS4%K5e_ViVTFMe z#oECXkv3b9lc6L@ItD2(FEu^EF=>W zO>8AaLXl=bideqc&)1AYbEmi;C~!;k5;wQowq2l0X2(_O0`AqJK ze~drbqp?x}pgmGyuVej_$_%V;3}gL$$c+<#tlv0bZP7!6f`nLAluX=OHUUN;HlezB z!dzd}yIr4EnD>&P$c$^$(KBosABza{tp|xP??(nGFCwS=RhaXY!W^#@=6%9*G&D#i zyt4D;T`NlPHa_VI&Do?QN_y85UiOt&92Q7&CU_ml@8D1Z)j^Kj*>7NV36inr49PzB z-%6*mw9i7?XWsaud^R2Fva{2`b)wr!6(>+UOsgqv9F0sEM*_zWF7lioX&A0u1T0aOGYH z))?BFKlQtM&M0mD|Jl^98&PIJV7Oad1e2vVnPF4F=5V$~*g<3&j7a+kW67ZpVr1qp z_-sxC%h|f@P#LpsI<%Mnef1|d)d~bB{=hJ{fhO?cN?>osg{*iQ7%AAFM%Lo$g`r&h z>8VIXB-Ol}vcU>W*{fQ*br58d5Dg7bj9xrL-YI45jMf1FS?(6$Ra_xQj5e7^edZn*<*I>Q2e4}g4E$1m3Af|7AHV$=e?k1hYQrDC z(u9In{_vGn5WMn-uT%7uKPb-yq%3~{Q=WUX2MAZw)5&N@oa%8qBc}Ud^gnnO@4o3? zU$oowS!ZDsl394zo9^*gWV(OTk?Ee@J_H0S@Cyq@m3ifKk5|YTc8PohVE*D&+C1!5 zq>hK^Wd=ULT+e%8=s(zt6z~g{RW$4MnYSv*5M>4=Y3n5evdc)qFKHvs-N@Vx&HGvS zPUiOxd8c=T1%;c3q!Tq5V*a^PJ$hT|4P0vFn{ zgS4EuBG%!eTXKLV5%VE+UKO&&ddDT8|KOa4v5w&Gj=bxz$0O{fJIJfhQNS|_Sg07p z`o}*Ev5d@d*B4+#VTYj{ZEFL`fbLokh{OS{49(<%kw4^f!z?RFP!JSPXPUGUJj1H5 z0R-{Mt6>@5$o5tE#V{pN`AUArt0=o58k76T)5`Xw7hZXPgGAT!;S}zx1gqlalkbZi z_WhA$Y4e4i$sPvs(zv|Cap38-CJ5}Ec#w8vZozh1$An3N`a*A4vbj)?_xiYd<>(kC z-Z0plhSE8Z_Pr3bI0XWU%ez2_?xWp}qzM05>FtgPS_qAuw*;990|wTjFznP*G6on^ z0OO(}cmNH-qw5atl|5Y^r8hAdsZ0&62kI<=z9D~zeBPgHO3kE}PCv@UdY%_d*~2VJ z)+cNrvk5z?3gqI#iK9BeH9m)cu#>4Zoq0iKE^r8Q%5?A~vaxU_lZqGm=_rLj^&9ai zAJb||EDVHhddC(@E_fOfH{h5tzjl$=o0MZv-4I&5obNe=JHxh;Y%-ymIf&UWC_~&L zhcBG6$X|7=HdLJs#|*TIkeF|FTxznyR$T#llglO~=x2|UU^v+Sk~z)z3@x_a!m|Ta zB6NnZVL#Xo|H6HpA}h56AI1?VX?>w+z@ZjTG=$tyYxYyfuCG2d$cv%?5yV2j$m<|0 z;A=l#IomIYBui(XpFhBkkarBQXsb;`l;jq4`Q0g z54_rr#W-*AMVWcw!L>WpI~+GkW!8Q(pRHz5LYQkm&C#0NX=u;wXQ4ech_3fYBw5~v z7K5a#gSg0-hnRe4FjR;U1Kmq{7}PDrWxKg)-pLq5?|tL)A9X!Gc;r=#0S0Fxw-WG;tr!%`>7Z}*3#dMt5DQjzD1GrMSW+!_(wgad?i|~WQIminR z2j})V*W95z-;XF(aaTWulC-H zxc`eDbZl}Fd@3Rd_UI_zl0iCIV4UUEiz_l}cEU09t(Mb!Y5{CfP`ifOJ7^!wmCDj< z5AbFc#bXH9K~<1BxOKmCeDn)@fDkMSq1U-*Pt6~t+SmhCi3gPc;0fdH2YOH!cN+d; zMIQQqS}%R@MX$b2wkAE^a~kMfLY(cO!yrCk8#Rf{eYg%+h|-BS^kvVs3MOCU`U-$e zn>g?}p@<*^A!qqvrIrpZ6el0@^R^5Qy`No=xD_x+|W9>U`Pn__Ib2H4%oG z&8MYcZDLk&lpg}CB)T8+!dfa7K|&4Z4nYEBgC=+?j$4?MHQXO)8~_w(I)lMWN)}4L z=HICL$Cn{v5dbT1ve{V=3bpY%^_muFqfL;hjg8^W1;P}7+l(-C8tA>m1TYjqaaNek zIEJ{d3QArPhC2BGiU)RJ8yJdZve&Yp-Hc9wy|A@`1H+qxlSS{m3sJ4j>NOGc05L%2VbhMr#HjPY%Rv3-pQCytvHeEcD zK(@$=Bo4aemn`Y+T#Y)#YlVa9+1r4(G)qe*L*)>#iC(RZKXS0&wO!O~ZWMZ9n4=?; zSSDfy5UNo(XKItCvX%XC3oc&?uf6CO?VEE?pHx>k<3Ir8f5`4oh1O3!L$Sb&Wb6bu zKjGX1pBXH`qx0ZfcQ95#oj)XDQzw1#GBNPH{skC#{(UE13^xaB;U}_ra%~0vuEU7o zJe_UQbvsd;uyQ=A=DWE{qaJ&`F9U0Ms}*+|k7v-ptGl0Ts3c4zCj#**A; z+1URa2e1!ZuV=6p_VcK4V-6f%UR1RH8y;w`Xsv+Ykh96u)kNKZ$~Je$<&dvb-gK}GOVjY0 zw~T?H;!;gC=DXf$N60XEHps%%Y6VDW0&aN)>kcPQ=lX{Il$tsb&RvOdJ|Xte$ofGM zM2Rjj87JKElXLbr8Z-(k(QlPdh87GiP zi&?`X6AeX>R_V-kEI$$wSzDcakaQVb%~bs9x~XSd01uf{_GJshEylCN&AxkrZ8;>b z(BeC{5AIHj9T~N9!sO&jIjOyo4mZlX!N7q$PlOxrxmA+W;U@m3B^o=QG}3*^mGB)} z3wWhh9-$9qHf7%{_t%t(^eA z&tf7_P&hPqKAN8t8u>hTr+?1px$EFXPxY8a9rH(m+yN>#f!)z!k>z*;1zWR=C?rhI zfR~eMQeoD2__983PQC+7k(@6AZwvHCUd~97tUDy@g-tg5#zzKsuZ%cXgCoX|z(9Q2 z46+v?Bin>iKixd^Q?Sc+161f`glK5-7*tt4cUGXo-8uP;O$d+mI@f82A8jvY zZ$+ZEa;yk!fSsZMfyWfGbjC-EBJj{nK;Wuk2psyB5hxjnz&Sny9$^Hs5foTL1cr5F z$%u3*&?-Zn!d57tM0d%(xRb4Q;{PmG^x{1hootHI+j#`tkI64OhK?_Las=I1DP*Dh z?|2A*M6+wYjb=;qi^7io0rWpKG%xvj)ttP)!hF0z+K9DcZ20 zhb#@Z)=P-ufJ7r}OzeO{--_I=W^ug+o1VE-N3SH)p_P1}m5yFXj@z*mF)40P%D{*G zu-ZU6Q-Tpe=%#9f7L)BBHW(#l$O+}w$MMjJ@(Um(^*QS9{AZXH=BlkyAI^0HR$#6Z+ z-{EBS`=-15pByCXcXD#HQJG?cE1;HiV8w@q)U^5M`{5J2Ngk{=xqd5g;#rh)Q$oS{ z`#JF^G^qni8&=At%^}cd<6nd@y+eiREf5svwkHU7?JLAR9o`9M0K;Gh zDiz-88nW-)E!2TPrV^KjWR{u=(zJ>SCtjbA5UT0tXCRkP!bw8H+l*!ER!ir)5SG5_o-=7ZU6oPBzf%y<522wcA*|QTEp3Hq4 zS4&4}sXHC2Bu36X;XW(|$44W4lC_uKf>CTOm<&HwWa&j7x+gTFF@6#1%!U6eI9me> zCLRAAfDys8+{VZ!gSjwinG^p#Can4{)){mf`rMZ?r{RA0#c>+8a$fUvRNH*RTi~@O zXKRX3z(q~El!2_o8YCrR&Wp0U;0YltWgkTYElC>|=3A03mv>l_c6`!Uk~XcdmZaeGbp^{VSNvW}mTz2|PAQ7AynR!*{6ONR$kQF|wL zXV73y%xGw9M0a=~v6kXrxYfVI^Ea$$kX2fTS^~K2N`^%CQqoU9xVq3X`deTg%f6q| z%#;#$KhX~#{f2yQ0h;x|I-mx}lW-|H3e}@#{4;in3g}=;{C$48XmP+;f?cDETpomL zwXlQ~hDhE`wm_hF4B;9;QC3x>SK{xa6|nVmw!aJj5g5H9sk@ahQqB$-ZmOaygsQ8z zAmY`+~6&>ZaHHgzAncp)f-(NR)-b-=^X~k)@_;p8*@Z;BhV=_@`s*QT(E*p?sF;G z8llj1n`xwQnKd?;n+!}cRF!3@|B&`xYxBA|7sS}=N0SvidVvEwS=Wj&Ly;#Oc$$Xr z>ViGBaI~CJN62ld*6gV^_PnBV5 zj$y7Jq%I3BXogHFcUQ?zb0vNfsj2vjTeE}sS)4HUMTEg(a;r|kNY!hNw4rfr&8$Woi*A>KcK;W@d5{FFX~oVqdJQ#~12ImZOP^ zA?%i?>>#$#V!ajQNO_fk=zXa2e*owA3g?@fzX~>RF@mv!wW|p8L+TiLC0B36x+;Jg z4q-l{=RZha3`uwfISol+4!INqNyg`9e;{Wv>9I^%x%}?aSh<`An;gtQFPtMQmlfw> z<#I&}8kkDWV)Iix`6}qTnuZwN66wqZa1u&3ORl8!swx$~gym6HgX#N{Pi@8UIV!|% zvU&s+$8G_!t5)nzQ|w+^4(uL>DQXYcO=kOn-F$B|z7UWT zZ&zi`d~ks|@f-0$@17AQ5A^*2LLmSrstl%jteS!m>(s6vsO2EC3#~gWr;6SZTq=&y zIKXMk&9APD`wYy1DE42AQ(PMNfiF>3hta6&-4vpz>YeiPQkL`h*;DVn2E%6&W_jHn zs?VM^#bSRQoE_2bkhWWYj3d8k!}Kw?K~F>Otr?5Cus}1EdizTK1=NH4Dd+!vZaHO4 zYHRHSpIvb78Kxj20jZ*nBg{sD-q(!^z6_hd)yBnGSo zB()5v9;<>poq1|Q(QdiOdYffCG1@)m*F!#Xaooya%a(e$v!O-KM_$W|5{^*7)j4Z)02Uf;yhxR$qro=n1ff_$=<3H4cJj zSCMhI0nuPpmOeQN9X!gqDT5z|4_58x_Au4hiSVP?nJdzYdnKN?y)&>8NKy3xFE&A2!@qE&e}!{hkH2b} zEVrU(y{7mk?!$=ww-x>475(2W1Nxm!0)y3bR-&-GAipby52MfMcFw#OCd(oXc{wLw z1B!i%*N|2;1pmS<{)YVWm;Q#Bd9}uC$0+ma85f{Uw`rTsKSR3Y#Iw+*=dX9$ln#-l z)ORo|mt*>-NWBs^dkrBdrSnPf6UY*Lh@cVBi}aA7jGs4k&NCnM=%#%5^N2a`^gh6F z?}cRv%z2dtDz@Gsg1t4knfLAo#wxkb{+E=_pE(3bav7#~%I{}R9P1z*+te|c2#;w7 zydEwkMY?_%@vr6L3T?vIXxeaZ(w##Bn9DWYCcJy>P0;dtnZ!Tz8*PFjP@xDErD3Jg z@H?}{L_^GhW250O;o@avT^{qi)oJj!TR~wv4d!v1K-$AJ_~=)P_RR&{;YeEf(uT*N zj?i`tOZ*GB`G@84J0!RATL}7s42A5udED_-Jx30GOSPo2OsYF? zF52khxO=HQf=ws0dDV}FRp*l`b)Sof)V+BLr0(i#C9@Iv9UgCWgSYT6+~Mb~N481s z0^V}3E{2u;syD5eN0;N`nmM&0*Awe_&o{pmdwo7pRyA zy-Eb|ZhR)qw+dZnX-0_HbY|!uZbt6j2e9$!)>w@iVJ0YgV8dLb163r$V)&&67BdY! z6R}}fds-w}`i-N(5b)FDcs{{=f{ihfoOTtz?4Ni7OZ(Kcr5_PG-vV-rl9TzyW~e*j z8Jbk19bjUk4eNV`pp!^s((jq4NasX2<4a0w(hv+X8CD7MR7w}Afq7M&Za_~S$b414d?A0nem5V(MZ&75um&+GU08CPK??43sgpiJ`!s0##yVg}3v246IVLHK zBvs_@a;b%ul}FF>aINX^;nC5+I&iuGC(>{#VIa5GWCXH#8LyX&&oSIAGd`F5sMN!- ziINWuq`QpR!mj{*fw+HznRtJLmoozI#U9@ECh0^ZF*rXCX<$#e-0msA6X*VvT^80X zJe#g%8H!I_W-sOLuHY73b2?QoPiwuojnpl>XyA zM4$lNppN-hU0$37aLC*%ne~7ISUFBi8J;&e?I-+VS^0h~evezc7aq0g_)H>#|FSnp zuS;ooJi>s-FGUP^-Aqo#^+zVBUP&np`S3U$IV4$jXXOzV`$ck@Tj@JY>ylFWX^96G zCi-Nw%~lkrx+oqA6l0PL8_%|3b0xvqaHgm5LBi z=tzD5^9@Xww)s&R&bIj>=vT#?->%Kq9}#bQejPQtX^D7;=Hd@7TFhc=DtZaJ>R=C7 zr{N7HxG9AL0o_5lApl8OIIvqvZ|Bn4Mc>oh~HS=yrKUH1Ct&0w$F1#0Qfq?9m) z)9`hzNs*%ANAMHq$wKJ1FNOg&l3LK{LjM+^=RV>!Qv^2r-Af~0Rkg?BeNG-o>DaUa zo96;s0${kj8RYRgc0Mj|MuM{;Dw}AfLx&gZShzh;dxBqV#}Y#z`p2;C*rD&TV`l>t znjOfVud57>3h~%(=9eON^LV4=kRNNnJsU~s_#FHtsC0aWd4g`#heu(gpNH@Xrn8qL zKLT+G#NC@xZYs8KVsc`B1byHPp6`quZvqr#;g4$o$Huf{^e7_nH#YZ;_bf#1Vupeh4@X>wy;xdU)xq!eeZ>D)F#$MlUY7MiLI2 zX(vZg^Wm+0H?v^@#iGeL>%f+Cq9=13)?zuh$_ud~>Ftn7V6GiPCNRZIKVk3w6UuZo z=3C8F(w7dLQL|)850=Pu=6Y*oSEd6O`UpIZmik$o+1?tMbfD@z@2MgRUT2L1^L)wo z>TD(R+%>(Bd6pz+AXf`$uq3r2pLwuS(?(*hZh@PbcmUgGFHK~YB%Vn;1#Ws{k&l~h z1`Tbs_k^bMJcASen~!M>A5r7?RTdp$ZPK4{{SiJ|fs~?r#1DCV#DsALob#x2 zhQIMQabG3@_h)TSn`<+_WiEP)1q}<8UJtQgPd3g% zPp^}AXdSi>sl0OSS=1HdwO|pO}eXkF=H!WjAn^ws$ zR(elV@Q1qK-wW{R_>+*YiY45jxT>@{f)c!kO02vmBj zd_h!Rfo*5G8&EGMk6S-zTlX{cTRI*>F;<^D2V`00gZV)NlfoAP5?QI7$L^!!;It1g zr)^oag8r}zdO1MH1T?88n1v?Hm4wS%VuF@O&WgE`;B459$uN5=%$KS&!rk#knb1lf z#<;Y-N1buIycg(HHB3mB9_p*|G7x~tSUXJ-DP!NtoUK?W+PBHF zW3F$QI9gzJ``x>M-sFXe2f5k1Y+>THg%HE!(=wpC7`vLO1&=SVjeVYbXKLoRwNYHo zR;(2-EUmCJ23)cZll>EW722Z{yKm-)AD<%b+Fuao^{vX@8Ib?DpK`*IqkBRV1KA5y z_sj##h3Uy}5ikb!j6iPoTQBvof_cz6qiIc4U0JNBf6c8HZ!#OLr*HhWzo-AJ#{I`Voh<$NJM!h?59GaIR@;A`$i*MdwW8t| zUw3ggiZweQx*~tDQ2!I|h>eNh^JMhYxsu>)cnwot_GYopmcGBB`eSVMe#^jj-Y?Z3 z>sCKstFJ_5&enQ5Rl^vi)+yYOT>9q&-8MN5@70PPmNa+{tP)_;F2)aAx#00Rwo%Wc z-?HN+yDUZgpc#9Kps)3Veo6#U>6I4rK?=Ieg8s4#I!Vw!^483L&@h|S(k1Z(4>a%3 zDLur3?M1sGvVVpj!T4|&>}=W8EB(hbx4pIR1xJ!D$@&{8kCW5-`O(f$4FYPxGpE=# zzoh$WECJ{L77^j`)p$$CBlwH=K=u&Ly7RH=qE?E>`DIcgSu!z+aj?}8IbgQ~X zt70+e_XtYSED+$|T8*T1d>&^Zy*bIPt`gP7 z1SpPe5cWK&=ki-)f~L!tLZ`Ws=4_aT^@wLo!;x6n$R=1D*{fT@^r?$8A6t0A!VBH# z{Fo47&E;`h&y35f1mvDyIF|9uJajAim<8sKkHRBJjJvS3r!$XnIm8fA^06d}i31;F z-SY7i>cn_Q40}m7ZtH%#Zn3(>gsgyQPev`5p%%{;tYv6@*6;~{4fMq{X8=Zlx^R`#aBXv zjjx0XAK>YgU=sf`dlFeXgxEXH7ZNIOd@5oU2{JH5-l_-jQ4sP5;xqBv%y;jDWWYt| zqX8%f6NX>8{N~ZVV{l1R7w<6x+J2!@d=xD8%xWw=go^-&#yi&?4%uS^dzlf06&$Xv z%4-OM5CHN||BU%HJgiL!Rm{b$f)5cJbkcHvk1c2BCwRn-AJd`bq^8NZ!k=*kGyd4i zxWbol8Gd-NX2AYnY#@kX_wEAGaTg&J5gj5fasO5LIb5v~ zScm(ho(rrw1bRdZX8Fz&>BN&dsbQu}KFi*V{l$vQv?eUpN*cq^Pr|!#E!3AT@6?ln#)<3&ya6ZX}UI@bZ`TqzyEq!9>kky~s&F%6%XgYDxd9#zIQHYMwF#A+O| zTBun4^;p4b4Uo%x`SWJG%IpcQA6!jEC(+e{nbE(cgX4nf_+~Q|XXg@<8n4tE%r9g} z*Le{kB*2k=3qI_k;;7FFP|`_>`8cU$TzWeILXsvUriyy`x=HJthF>r#waqqhqW%FMkxvIy&r2`cPGU>0{z1$CoNyTha1N`84fa(s{2;PxT*Sv`{x;HVg{R)h-ZX2`V;FO?*?6{>_iI^^hK98B7|%9 z2T-WBrm`pkn7FXVSkr*kBtIG{4c2ZRP3{qwgv{+fA5r5eZjCr!$5YsDt+H$7#9x!X z+2`eQ(6w0@!#`NOLtPP^$nZ7agcq1SqQZ zzNM605xU@$qhdsb6UWS)I~6tz`ST~DECJa7S(zypP?>H+5~dv6YjY*R+4vbuT-hKt z?IcjA((aOuLfUCZfoxQvdg8YN7JhEyPf~`E>~@;5u^RT@E`Eaiy_ ztf0ZTt8tQ!nGm(J3Xd%2+(+_Ktf=SySCUwNU92m?bkO5@Zou6m?_9pHzr;Fr?Qt^T zpFGO){;y&bpFG992tW+aIq{%!0P7Knwr}kLrdoM*ocQxZHPt+X95Rah+h2*-S0=!5 zJFs68X9i)uWV5h0oX(tk_II{Dh)oom5J`O*%()}+>&*OfxS`aJGO;fH4P3=DnSY(+ zHH?G#5Au$|{Cms*GMIyIgI?c&2BF_}XTQicC<4i50^>0ceTPhxbNeZtj4?d}sg+6z zw(5cKHF&mUrvQfS-#C^B92R>ZitJ46l_+kF!6Z*M+xj8p!1G#KQ8>Pa)Yu}_;NQSi zTuu*6%%?`5yn`CMt!R7wNZY-G>kTz>E0Y39ho=&ra+NjuTYb~7z}_B8$!6Az&{KNM zKPD3>M@kEl5q4>=Bsd%H8a8ZzI0SURa6_8k1kY&KTW1zmlzM_GfqGI{ZkMg>c(@i;R@%Pui_<7<(Q9VyDG;CoKZ_~b7ZXUjev7QcMfqN@zC6z zTaAF3au028r6k?lox4yTzT2HU8{cpfYi@}xb*g=MzkN8-KFq*F2_bVby#q66=fgU= zEk9hw*6o;AGS7Y5*X$K&c885%kXTwI78{Puo0E;udGJC7>sRtuQqR;oXHs8IbYM}z8@ai(CnudM-yOfEP3Km+2;-wf<8sW9(;8}R{F9~WisF(Y04 zwGew*=Ix)cUHk%xr?;p^BcHv@rY6$aa81VgB} zh-r<1NP32Xb9Oj!y>dd*C!6%iOn*iR$oyp{y^QI*y!0t1eG1dX-HS^Hx{YaQRFFcR zhjZ9@af55aMiZ)HiAIHl{*)-&Oh0tajwtqm8CaFB(q^?jcSrPMlUQjID-m5NiW?Z1 zlT$Z;B{!cj6C?08B3jc-5p9rM^TNYXhKuAifI_j{k)wwfk!-52x%R1Q469!H{v{ZE zZ)tmhvJcSRKn2$d-0QdE*kdJFTb+QZLgP{tWW-tuzGrYI6Qc-nPWv$!3mlXVKL!#7 zvecH6HP{#dbLl+%r_V|bHX7vP_A>4{kbjKh~NT*DSb)bv)A2j!*XQ2d*>qX2yk^m zfvIQ(=9kre#XdTx~N!9@DGDOD(<)4B540Ao&yr?1; zehkKn{<-1DoDE%c?vc|V>CAiJ7+3_C08z-5RvPb%#I40BB|-)?yJI! zDx9wg?~xS5C$YUSH@8x&A_TI}gZBs? zLwp5(0WTD!H~RKxxCVy*VbM61-N@Qa7bgida@c4UmVg)~*>ze4;+h8$ezR!aB4ZWA zuib0j)bt8f&q3%w=28xh#Hp3Z@Mgq5Ow?@l&1rPCE!mL_-4BJX)mOwsMkh`gcga9m(isG!eq} z;Z9PO!|J^^VaGqb1#f{Y@5tCg6L3{dIb-F4sc>?$*ymflM06Qwhu+(JdT6$iwo!6+UJZ-I2# zGB3Q@+3;~J0Fb0#Yd-@*Qa5P((m4rjynu@hNe zcU!>Y#({q&C?Cmu%en?R0Ry7cSLj-PY*v8ywZuRI1zko(jEelnmuPX4|r_WBqwJI2T zF*dTz`V6HA@&^;2^{9a^K@c+QvaEg|^nHH?v+lg`D_6iNRPIR5o(@o&hR~R}2}G`Q zCk`kJjQ}BHEj!YD!vSCHOBru)D*DBVx>fxV%^sNx?F(X4tPWp@FY0{7)M>t4G_nlx zaU>7p3;scWM}T^rM^RSiQMq!IY9nS>s0G`f$Dn!%EA0xqc!Je{N+ao+i?HROTnVqz z#WVxs|Ddy>6XPD^;srg&?`D2iESw>KA;$e&=$;#{;QTCr0^VKlc3;Uixmh7U5?l1pC^bBzv% zGPuYQFC}WfOH^z@%G%)cBcQH7uj+cwG+7(mcreuUWf;~dXF6kKx&2x01ub`-mb;$i z-l^pZ>cdo7Y0xtY;7hV&T?ijhr`&wWrIolw1tA$QxY1wf%opm6rsA5eyU9z%;*muX zDW0G6>nX5j_ryPoL~x&mgGvVRRE-qUHr32;MutQ`A=i>I1q&mi(ELD+oy(C3v25lt zISUCHkPbHh7mVjd`H6d>yH+DV)4aO4S8gzXCmNz{-+<`6mm*tF{1RsN0@!*nyV4Rx zR^XU0w~$W*<~<|7KA5;or2=Ur+O-?WB;l6qpTy|pwwE%aSt3b!Vxz%0V_4+CGswgS z_+&?8GTbmP+<0YqOoE4$NOUYs6NWnIFfc|r_9wXhJ3tufd+*}<55}38v;xD%)G)^- z3Ite#geuk3rMvHD_g#W;B(H%1Fs*X7Wpi%Av}#<_n8U0FI$(3G?;;7YsrvyDi?*RO zIG02h#U!vR=DP-6&_IplihvVixILm#nL5B|_?I8P>Zt_GS`6;#qKYTVrv@{WFp$Zz zP(z#9dxnD^g<%dRNTz^;CYkEph8q}-dxUX)A&fPE1|No6{LB+d*6yzXS@g|`{|tRx z&_v5E+SG2-RE{b9%MU>Hw?;HookcA5#?sUbI(B4J{b)MzgZGA5pFyl2h~Z!U)jQ_^ zF~e;+(Au&m#*Rky+i)69elq6BTV_b}Ga203P|D8|-Z>y!I#(V77X5&-=pz-vqRv5J z(T^_!bEU(r;5C?{86S9_5WDs``^Fv+E`J|EEL0HJD~SF|fOr={xEPXSvrD}cRf^EO z7Vcg0N-ppp_GK?e7PH;-)Vl%rLkjq01^j&i-l6MX$$vZYC&C+nY8z2CA?C8YCp{Ui z7n3CcOCY*SJ_6W!r@R$)YME%0nB?0BsAeKVE0Ad=GDqJo_>P{rhwDsBWMk&=0i#OQ zM#;ftXDnQgF;_n?ywTbCNzg8m(iVR@YD9VN92*hU5alFGlqTpt7mPt;_zIZAm zfVAn#2z(*REv!nwLLrRkbY^3{yO_6zh>M2s0BNz$)GuR81aqH=qzD$!=`gKI=m}cw@FQjq6UNG%t2E-eC;TgdYsZ{} z4hTPutCS#I0@+D!HFLwy)nR$~98XfXtK4?>5{t|YKkYO;F2m`$Sf(Tqe#`*oePK?+ zd;l}rWcCO=Vfge9#YuV1M&MH8T9)h*SxW5a_;@M=bQzD2-~q~ec%UTq`9Z7-2EmYn^I%fB zF2@xev^X?wUU-*tT_4_sUPIZVgkD3aIT3!vP>&k3Q14t!XPwPTy>FBY^^SuElsV)K zQtuTHeN+u@A@zm|6N^#rgNV=rO;e~hRS+nIRg`+Kc+`8PfO;%njCumM81>4p*#q@n z0rg%1wO;X2ZwT)o%wx{RhlF}hV`a?{so`DFS&s%2OE-|E-w&2XsJ&4co2OT~D1FX! z9m+V@{pAf=m*!iqIz;^{Nl?;sc(w%hN_W7|a+hAzXu+tT{=7&e1slViNVPdw^H%YtcVD=9I{umu3Rlv9aJO$R%FxbVSzl1q+#F*28f301$r>VH?xq8yq-%O06KH0y2m08k0eWfDDT)MTfV>9 zGrSvuLaNL3tTa+Kd#70I1e%<>#39LqhD%GN=1|_tTmuCup+ON6avcRytI+frNR??O zk)l$K)LBTKgVYs#O{7+7Y6z(jq^{Of&cVoAEyPP81ZrYwBi>iweH8?H6W&|!z8ddq z@ZO4d%tuZ2?1p4xqx1%>%n9mxO--8GqN&|T?L}&iG=;b@KzW;jiL41H+k&b8ZgJL*TFV~LpF&*zWiRpN+{j43+*^TdFWg_SG z&xcrPUM#H^N+Td4n5NzIB5o9_7jVph2OiufifF9%GW;?oka4wagbX@(c@}lc zpv2rF1tw5iOT>rSf>es#i|u=T(>P+<8-%U#p(IO6=%x@pg~feLDuBk%I_F9KYp>1f z{)E)X#^^HscT>@r5}t}rowU1D8q>co8k77m8`C9h=%a13(w0|Z_Q^7s)ItYTE>5P{ zg-a9_oZp<~@g0v2olBIzxd=dUJ}4&r2q|UwVXnM88;%8pWSoI4Axp6ZucJVNU`7mN z4U!2*B}U9ZmH>YICfHA{W&6pSXg`1E#VN_0jpsv|2Qf{HI*?{)-t-kQdVAS0$ zJq-zOdISu?JpxNHVA~67@3;b{+V&D-vl(k4A>l8vuS*GD2@I;>}p)@%W;_UIz^SmS0Bl^YnCtB~*Ol5Z*UJu@CVc4c;}_%GLS zn2c9oQ~-+9I?`K1x1lj9iz|SOh5;|5#kptMqLsMF3lL#Fw{r4Vkno)!(U$)B>Qew2J=}^fBdowO4nJ97#6Y5Z!yDXDun+6a;TWoyD1;A zjdn0?G1z%BILr-ix%?S!)nJfVd9jO1{{-2p&fk_fkejt;TSi8@?AUa0O8VCw@<~Lq z5%c-`F^gizuzn}yySF7Xi|Ycj>w+7oL?bud#_bZz(B2+H6(ssl?quYIw?GI-^*9Rn z$WyI|eU#3;pZ>Lp9ZZInUnReg+bjo^ahv-6=B9P5FW}KWczHt5wKGs`aE7c^Wc^VN zIKGtuPD-USFJX!8twUA;J^+=Y)9~#H|2Lz=%4c>fQPMR{#JO_^civd!w!9)OppLoQ zIr}3~?PZO!f|oA)-B-EKjTU7967Dr7LN_0=VbRNaBFQzYOd%V`dICoMB<#2!4SQJQ zsmGh5i0dZ@jIZky~x+5nq8%*|-0o)>Qep zQLDpMf>>38H5XNy8cbaMCsgRLKXEP2XY9wlS3knBZfw;Dv)9-fT|b&V(e^*6rUI=D z<_=d{jMm{nU_oiiE|zc_Q7C`eopi zwsVG+_MW7d-EIRJqHVC4XdA+J+~A!4>kUUeBZBRxP4F3as@>p|3Rg?;-#t04)zaWc9$0`mMZ!QDn2b~SKV>u?2cP~q5 zMJ|}6#AuVan+AXl&GF1)Fz*Xq}~B zd-zldPL`Yio~yx!Wyd@B!E+6yM9v~~$*DgDpg=H=_I<6I$8mECLY4DmfukX`E zFc4?RJs|;FhDMe?@wC6m9ru9+AY0Oz15;27wLvI^*7^(Gl2@qvK8!gj^b8y$EZSv6 z+lk*TL@tK9JF>oM`oV|Xan9DE{3?&nt5Vh{S4eF_^F0=Q`FH*%idH|zhv?Yo%UE(g z`aY|#mcBeYZSXyg?$7j2Hgc%j8n5Q|BC7L)*x!9R#8T7HjKb)b%AnwceaJJsf-}iGE z4|U(+pQGedpfPR8fzEJmq9Pv&a1Y8>)7VQPp+rl}D*6%1K z4=hN!XxA!$SAd#mKEZ8~-QxGytBWR>@+9|>f{O(3sOf_Rh?}h9G7CLSU1rUdf~bln zp>Hdy1Eh}aD2cftcu2)cSaGyG627+Ttug1#g9DvsW0wJ@?IZqnFn$(XJbZ8<(>@Cp zVqTYen1Nr_3G5~PAUsES8*Rwg?wd}FPK&!Q*?YCM zC;$f7Z6~v5AJ+MD0E!p2EOZ(SCB5=#gMR9dXy3yFQutjwAhIXA<*HZl!ZFX5)bDeS zw{bfquBOq-WCKxFTgO0oa_$W8gw+&!7A+?#(T{5k-)|mgO3-OIrY35J;R6w?d(3gJ zsRLhP^Vu~Yr%IQmzspKsl6!vpR^!0?)hbQW=sOc%_~RbfG{k48^f>K|qp@ zHc5y{3kpcmfhLJqOGoho&h!w1Ibbp@*@xCK=>^hI{8VlB-MiPB?7uSKSYd2C*h9 zehe1*7|7m>k0>KLP($~ci|n&12kU$NGpA1Os5`rMfB%-kL(It5) z0?~ETQ5nJnGtC>Idm#5-LyJ{Ogz3n$N@8KfeNqU-GGWzh01WHJ?ZC?Ljmvky_}Pa& zlwSiB0-9gsTt_iOkUbK%3rnY(f#lNXprQ6jMIhw$2SPAOe@hlx*UeRk=-vEaUz3rq zmpzaecqck0ygKt`sPl`mmxsW}D){cUvv*ee7! zHT_9Y1|=8jt%JXXDVc&k+zS>lqqBnFO;co`x}=>&(i$J|g5@q`^AKqZN2;OZ(x(YR zownoOl$L`x^Y<$2KIaqu)kgRy`Y7`YK#PdiB`V^m=vE|@1S~(2p;h=-1+m)eYzw!m zJFHzA+s~D9OcOU=CNa4r7c}>rN>|*4(!J#I8`S3x5c3gy`cfA`6KDxe5@4tSotcIN zfUyk}&p>*(M;2G3iERlSu1WA>^`%V;WyF=I9J!dEdcxZ{-Sr7c#j+Gyj;01VKkdYa z0e(QYwk}D9w*m7ebZv_s-RWPN*lv1v@&d*Zh$4n&cw6=qtQJ5uv{R@iO#UvgYAg3) zk*?jf^$O0Q;l3O+5$2`IWar2+!bueDL~lkr4{!F(!=W$Pc^GZQJlsumvsdXlcQmLl zQJLAYTO1KkflQfT-BB^Y8gk}*ctspU-Imu7h_nS(5Y*i==Ta0uYbJ8e6Uh8H=R11Q z?FF#T%LC}K3^)w?H}1UL>zkLSLXUF~OHZOwXXa&$-TZl368!TrjI)LFa%SYb45@7= z+7a`zX3v|Kec4CM%Tl48XK`J}-sa`8=9hWdWY&3EfbU^m7FxLTvMK7$%V?HwUPg-w z=4EnwBw5D8rr5S9d9ZO@_Dxk{^1D8eeL?yfjNvqNX^v6Z53J<%_z>LwaOm9aacF;L zn?F_hsTX}cUV|6g?3+yDzrUL^Uhv0 zv9abir^rRk(;gS#d+2eYh1=t%9=FHQEMJeKMFl<1lLvA+bFNf2tX1~7qns*EK@w2G zi8JU6+c1H5Ltp6T@xYB=fk9ozy-y6vj4nH{eVh`mg2SbizLcGq$@3yxY)9ZNcT)V{ z5bU!~@d@_Om<0RpKmT?J_Rnz3UlazvVBhdRC)f|!gJ6dvQodmS-PMzxsmL@Bb&> z_t5YEop{$1sc(;jzkCc5{ziC8?n%P`5vL}Ngm*C+QRVyO6|KVP> zEZf+5UyyfLmXH6lu`GY3txME4k2fOS7#4Zb5$+hpH5YC|^W8!JSrI$?s z89t2Vlr*>%2~bg7a+$c zrswld$OFbTBq-ghW%)y|MxLzkcqs-CapdXC&m-aav>ZUdqn)3@O^7T=cKY}_A)bLK zO=gb0lkcJJ9{CK^WHVbr@&$Q1ko@A3k3a*pUqq51fIPe4`47^`2XI=Bch|PDyzIHT zBrMi-XZh=v5zR`!0UgIzsd3+fvCtnk`@WC40wT7v9&7uSMDzx%6dSR&uh+GG(+Kgv z1B0;bgn!JHXD=7xT=T-@@e}(_y_XxS_OrW1df66_OuF=z^4gzV9xFV&R{#K)%nE;N z$gt_f-F^Uwo2!d**btgvL-;Xl2=!Q1H73ytl=W-~zntl+nm^9cv~NM9DzPCP3L8RG za;X&4fpqyrWFTop2Y$OzqLB?#d;JYQJ3-}Vm=hgLXJgn2E=NGDbFogKHo|n&tJy9j`$A$tIN309_@~;ZRUpTz1imuTp?rYzqHS_$_VAS z^DpB{+=XOOtKaDMIU3&HM*GSozxNH_3-R)Q!xugEKW<;)oej_ved{Z@?rcMhFctb3 z!^PP`JCk}8f!q=8H$0%KFJzFb_ddQm zhkygL<_4~U%TsCUE?47)ClwS3q+KOx(0b=QWwhSg`mEO5jQKG8UF5?oDKl3_bevHw z)Mm>KZKmsMp(z~`lF=#&fR5&cIT(r2OyRe7cvCpNp&;U3z;TVD3ucHyUWVZ)DJAc1 zIEDssm;vqq*}4Rw_Rtlut4BYW#}YgzKWY(fI>J=GgUaB}mk@)uS!g+G4R0e|uD!=k z7a)<&{053eQM%;lrjWXo&7srH-Lvr*$AD+ZPpS$(qBF*M#BYS!7-t!1Z>L$~6FK7R3U8X0e(*0jXhVCk%JI%oxLgGoI* z?K=F3S0*ZDgGK5zuPOitXNz8_mTl-u{1ZhKKCpm`QsTo3UGqSV4Tu9$fy|jaP?wNT zwvl#6@pD)46FZv!%*pH;qqr{ZMsnWe>CHSas#-NUAgX3yJ{@ns*eDI*oyO&Pk` z?PXJDtodbA#$?t_83DcronL6-ZpxUV?xqZy<=d1&i$-qB%&6~T|EY(J5hfM5*_3@s zmnSjaehnIg=KFu_eG7QpMb-DFblbGFY(S855BG8}O0lIBQebhxMgtNp$faDY1wkt8 zwp^MvkVdjB3*k};QZOiB6p#o7LVz|cwF!v2NRY_#e%T`>W+JLmZi+H$|?=BgetS12Dq$HZQ@ZC#4Biw^V*H9HF}Sg*UDqW;wc(dO)`Ww7>m)Bsy+&D` zKI%|lc;ktW^~uVBF43bvvKRA`AP1M%HkL>^KSH;W{u7>r#17F2?* z7EJ7g2d0rVAgCFE2hBgS>}Z|ZLoG5Ya8m%s&@{P=BXZM$qK(+84c6hbexs!u=-{Js zda3@g%PFq@(XtV*_^*A&Drbbq!-hC&6nCKbsu`u4^iK)Cz^G$ z!9I9*hi`jJ?cXnfS-4o+V=|6$Gk)ohK{N|>CgWT{q##jOs z<<cto7$zMZJw!86Mjpz6K|199%{L+$t3VS&=!y@7uTtOJz zS2B&Kqc(zyp~AlAvMl#1u_9&|&PvEvk9D2ih~?n;*23RH9^u;g9YMJwlOMbsl^7p2 z;ZvYbU45L@)&Cmxjg>lfDIDE0)IIl7L^HJZEP0dvf{fc8*@jy04Vmo{1^`dt?0fUCe(K)@|F5ap^Yv}YzxJznvY079?L z-PO2`yJor}dZr&T1IkLy?pr-2VUY3lUznbGv(NU-E4$mC$-87^&#*fdm%zE)!dYhF z+~vYaxp3}t;izyd>5kFDaD_#9X7U|yG3PVsipW!q?+mXm28+HYgHWrva$!T%ZfhGOK-T}8MpN51^|W{7=uoQ7|!IyXff6JQnJQ(57muF zGqWtPWK7=((SYSssXW>DLt1z?z%>`=pbFA8%tJXK7aD!`C=^Qr3>fT3(2g{z-`Ne8 z9k<+*+NE?$B2y(!V=hiu+++Od3o6^Lmi3zom~#$rOD7f!_GYF`#N80bW;Je&%P+Uk z?R5u#xr9xldIl_c-xpeM(|!?1yNYQRk$(;-B1I^afLl1Py)fFngfjftz1mx>b|RSj z2NK4kP`JI0@1?)b(&_14E=NBNUIBRRgMQ~lxo`^FUhputD{w3nqMxVhUJ9<`!@(&`66B`g0M6b)esbx*z zVhhLITv@>Nd@pgc7wb}SGWX86MmsTKM4qYv6bF)R+#EgE`VtI+g>kO;`m%*9U>?Mw z);h({;W7y4IFIxNacpxRUl1p3KZPJAzC=$xk$~vrC7Jd7pvvo|3b|jz#$T@_u=6-gmmY7Y{VaxCsgT_vXA{y=a1AK|d zEDvODy+SjpF%rdNJ7>?JK5IYvhzLnN#97p5kxnCc;4Eq%Mlzm&0h8(*2-(7!Cffvw zHAV29mD>q&Qayym%+v{B15AeLQzytTZ&FVsAefu5L)8|2rn%{vP=d!oScLN;jL6vM zNc3U}0H?rbge38?{4DIn8(w%S0olRLxC~`Y4qj+<6vUS8BCj^T2Mapf4qIG3MH`4MgNMV+lt?a1BCQvG68(=QrQ^vhcF z*0z3~acf)W@W;EhJ3mFZT$VMM+F?VABSVE*s{>8%-~fjvPpzvR=)kVTns6u~RN#|L zZC)IlHBie{tPKCo>KoaPn>l?&c3k6LV~=2dT)xsj&~A2=a5l zTzj6bXJoTkNBrqP=+IzCp)NU+-7-}|k?Zf2vwzWMPzeJ*J{HMsYwN~V6=+DY{Z|)D zr^yE{&p&1Nt zdyW`7V=F;Z{s(wd+&Dnte~V+utE%%qLn=@bTd**bOy^5*v?e9I4c1$Pqx|9CJ3TGs z5KY4R?S97EH{*APQjMwar6;YnvSJ6`AIZ_M9d!1V=VV+&T3Mw+z(VWh2L%Dh46pWo zV%Z?#!?c1*47CkyQ_|e&1qwX}{Q%`KEc%_F$#-}MgD37SjUQ)=sMiXm0Q)$#(_g=< zXbbT(ZMyY`N3FV(>J{hyOsqYFmYm(pMpp!?NGm!-wDYir*Ei z8v4&x@vASzZv)f`koI&JzYDi#2a%wq8}L_S&1g0IHRyNOiKbKl8rIA~cM#oL7*&*g zv()(xT;%M%d|ytLeHsJu!5EmSO-$3a8S^Mt!O1CQKLS>}!Km*SI2 zd=52Te}Ag6M;?oaCEtaEoiiI!rY-tI=o&v%wF5VihF`hO6LUDs8h&2FkPz2DXBK0B z{h5^!e;5xLK{-%3FBQE%xti6(4s36$qesp8;!z{a*M~I-@iVpmh1Ze z)*wwUmoR90@3V%ccXeBurpDO?ZU<^JHDL}~u+V%1K{zTB0Xe1lb@PpAIlPIsO_KJ( z!~#uxL*nzyfEY1yid^~-4~~wGABw+Y;|JjHcJW&Lt&Z=CzhmM%;%^Nfp!PkaSYw{W z!_$gtk2MW82RC8Q%EI_dS;Cs;LY@enF&X1T`esBUD3exB*W=lKo`A(E=gn1dTy?Q| zWP&OKVj;{JJIaP3I!OZ-C+kSh@m=#BU)GmD zMU_mZMxG=Ih@?$C)F#RhE=}FeOVvB7{6%?3383X573d`!0Q*}vO$MF6m@$9nC{BZg zI!&RHl-v5ug~`#}d$^_aTeiq44~K7hNg(L&$J{K8($3nXRVoqgu?{(r6Oo_WUCbw5SG zb{*xguj@v!>%Q-H9aFuovx%nbD6}DcZ4cN~({)Vsy3Qt=u7iB{y3VGVu0xvJbvDU# zUDoR$n_{}IH04gW>#{!jldiE*w(FjO;$*vSrF@rkU3pPqYjB@*~CEC*;I3V1--buuCs}InWFx#vuWG7 zX>QlqBr0`eZLjNW3eWRbNcnD`HP`uvj&$92w(CMrvuxLml<&g_uB1O*d6CMa4NmJi z+AxO0kF8K>i1VsJKaT&IBpg0)g&D0wjM3Xa(HMOOGz)a}Ezsay@p?T1wxcVJ(R=#r zL!TAKC=xHw9;q}&k$RGs>UFdXDJ1d%6Of{Oj3UikQCv1gkwmSX#k`KT0L`7Cr75@f z*=sq<2b%5ZoiWSUj^0haO-Gj(sXR8%AxeRc@Ws5N2^ zzF+2Gn#BW5GU6#8ll%kAY0D(tD#)QqMhEgK?F+{7h&9cve2lo;>dTC{#6;l29LYc( zsoU5&36_3bI=>P*FvQOSI@f`_S$A7MkEP{rSH3 zbb0N`*!D0^+mn&@bb0N`NP8He?a9c69bMXW!jU$ zlTi|q_GH=-7{DVcnFK9wgV1Wg>R657vYzB<83mHMa4(#dnhuHGdjtC;JvqM|{gs}6 z7rA9GT|s97-(5+&#QsdF zgqe~K==W|}1l02K&jd9CG+5B@Ri}pe`|A+~b z_83cNJ-tWh%5C2>9F#5Wi}>+TM7~Gm%0~OHNIH_z1^;MVhRH%XkfU;fK(f3DNR-~& zAd-XKjUED$pK-I&(Ux(u9^;nL@-XzJOUqhztXcN^7&m8W=`n83($dGfIZI2AeRGzU zhG}z_mTuV4Qur7Y*beiBN6Vbj@_h&kKP__s3gke+9B7#nS_=1*mM@{umD^gP0TOBX z6e9h!914*ygXee$eSvwy!drC9;ZXSSl&u2xkYe!@nZS}6bv17g@xU2 za&thn_FXkvk_tO-;K;tYzpTSxX3!JUIf9y7a4_ShctLRgCggK z2ayllBEO5OH%7{cb{+c69V2n}qi>Ah)_V)1Xo+UVi5G8(#)07yt(Z4NGsDHpZHUG( z;u5WxH$;<>Gn^(Cg=jiK7@`%0XgWcllZ&#o)irFQ73CQNv>EUp|hZa}W6>J^AXN%FtPb zALqG0=+Hs-x>1t-3M$NAWrVS+dS8tT^s%9{%fO~&jVntg2cEeo0eCwAr2byX*ML? z_)mGcaJBOlIHhP~W)j5ML|r8iF4j3?g9M~HKm9;*r-t14V zY-TyP4_n#%&qsXYw}^lpzZ7n;8i=ZAl`~IY_`g=!yx8BKvwiLH&DsCYD4R?B@^_Dd z(Gfiw%HN7F8BCFz-@tl;pU@67y0jRkc6h_XzTUnDfeO9-zo;D^`>0=|G1}pQi1ceT z*?>kfgm(A=LfCTiRNSLaln`@Cpw@|~DQ1qI;}b#4Y2 z&Z=`!`L>p4ST~@?=T}3fE6Wc@{gN4A*y`81H$>G~It=xTfD6M{ziup8$N}|>CmE6n zY&kYMVj0^YEpzuXwvyPgu@0&Z*8A!hE~VF$D{gD5;=5qRTcZ}XHQ_}xt*wD+t)SXY zjwUr|J&rN0t*LBUTkxQdy)Qw)vUkSQc5+tRVVs(xa$<_gSZ$H(X`0p;p>~m+n4&UV zvoW!ri8eq}RK{#EOK5>>miuqWqXpLYVixsUA%*SO#YXtKc zt!Ry4hP{f`235llD^jUIzGdTLHljbNM5ksj6P>Mk6kltYLftB4gNnD8md*N;M; z$_Pj#;bVyONH{bk($cbbF~HtM%ihJI*?ZGUm%TTDLzTT>#~0aqv>3A1jEc0LiI|~T z`R*V1I_72sY{v-OdQ)}IT3!r0TLVQdZ!9kqW3J^TXDu&AxOusa<%M$1wY=o4<%O}s zGFRoq@}lz4SYC2sc~N-?%S%oyFUqLHvE}5%@`C&>s_X%*6UxQP!WEY8h096m>I7UR zMU0zGZuk$0#X(D}#o_Z_p<_h+45!czULl<*Oa1g-u5nlUK0lJJxN2+<#W*0!UhVYt z|BDFN{?DoGN0+#66N|a6Sz(W{d=KJLic?xfDEa~*_B0^8Xm0+ML%7UBDBFKFSOnrL z!#K!;;cZ@WQ+css!FkFeR~dp_QjB(hEdvfDi}zqN{IQkG{|IA`bifowQxt4h;?}a5 zCn`&~M$2h%u_^6slnU~+#(}kJ48Y1YA6BvKf(m8JEqT^$My6-=Wf9%f-Btg|_dT`r zr}Dk^U3G4vm+!+;LeewlY#+4QerV-IAaN_WRh$IyImq2=QUt&15p#ufGJ@;@)vZ~) ztht}WZRR0xR$v&tbdPTstwdle!>DP9VYH}hEAJG`z@@{esq!!?hcMbg2n-jpk-;Jm zPgW|2@w{Or(d+DZ5fGJ!Q8|R`++h$LMokrmQF-|pZu!74YN|Ah%1c|H6K}`}@)d?c zd0BG^C>Ja%9wa40u*}=XD$KdEVFWfDn7>cOG4XL2e12sHFGJ+Ng~1QJ+sEL$BJc?q zyj;S4Tm~a<~Du_S2vh+<@2mwhgih#}| zf%wWW%=t)eRCyYYfEca>|C=j;gA%;5B2-QXbAQmV6ru9c-!`=erSRfmN$|-P%T`i^ z$^>WreXRW|ifOC5-1l8i5qdzrt$hwI`12|j6$vk1g=O=Ch57{_)GryRAIoX6@^BhL zAu4NjV7^E;ZA>P3DeWLl2rW$;!|_r0J0fubT=Pfr+o?)?h4G1rj7e-CONDosgBv+g za+-9oFdq?B8c~Dw^I+lYZoap_F8L-%G`tPMuW3ZJL`(-%d3Y~;<6JoZLh;>Y$y?Y31?Nf*$CrajpOFZ-Vg=2>6&1YAy8}m$N5b81B98=(IZTcO4H7u= z>oN43uW_Sv4(e(6j5}#9*dE6sHsKc4P1B+q7QVvFxU3=BKzA}Kui>LLSDmQ+ zjM&3OOkj;JzLSVA{WYMn@Fam8?B8+aCX52-#3IlX4GNeN4%1Uog?#B#s4T<2OVRH? zkwsPZ38Lrwcz&NpA3|4A_DCTJKF0lHXJkC~cIOBI5 zM;mpLVr^)1Y=YbH`49(Ev&4We>x5l3UtNv#ad{q(o7^wyOFf(79h|`_A+mZliD%s~ zKAkF<+U$6{8s@q~qMMSdSG~PgRp#Zv*3(a+Le+^4`D3itqnVMB$l!TRKHQIE18t|PF~ z>4qZu!Ndc9_&S1alq*p-Bsw_%Q~X8*sEJ~N-b;9;6apzTExK;uJ-oR=MW+yrpdjr) zc1BY&QmXoszzgo8JO{B*ZOnaV4v-^Io9S9FfzD{FSjrpJINp!Wfuq{MyODDRXSRcD z{b&)ma%7g|rkMqDtDzcibRL42qTmH&(YCmbP+VCRnz718n+?LlE{nGm@gH1iPL;h{2eQM8PID8BIipcPR>0dztn-u}DrpRty;K;qAkUAFc& z-^1NWxGv=?P6L1rS-W8oWoxz_L-j$5tMufvZx%Un*)15VprmH-Do+DsNE0(7r0et0Zg% zmC}hGuoLvW`e2Pgj?WZFD=N2IGb^F#b^l+GB_z%Bbo4 z+f#_FC{(EO`VlR_^NG?I!j&LFaxJE-D^QE*7*4FKfZ?W(RC4=7dkv3NdIWZ7BKEO= z8p0e~|6$82%tgw%Iaq|#)29$Nd&JrJBVLg8VHLrmX3Q}Q@9}V(O;Nyc*^TrbovnNH z&b=P84(91@%+p=$!!ETo?*_WSnV$KXgQr(rG?7gvlkRJ_<-qTbEa62wEtd^c$;Hd3 z+M6u4S~k)mxA3ILUyMfd{y}@@w<+nF`RE|$>ZgPaD^?HjQxol`_`H&xdjLVasUU7s z5ML&UqX7cDBg%?Bq|5526HA)JNx{{lv{~ZX_!|J|<(>#e$8idCFT(uelS7~dGFkZq z0a#LtR|C5tSCZ=C5CB4U@;Beh#vULb2r%*NoCw)=w$7&A_#%&-$y0*$$Z&Q&LKJ*8 z%rGk;wOMXfy~uF49HK-r3KV+wo;xrnGEs_U>?J&tJj`$zk1HQM3e?nRY+blf%sd=B zuuxzFi<+PBuQAlB4via@%k$-nzHw-N302+!xC4 zicMJ_-N&Vy?iF&~W)@?Or3${-C*-4IMvkE zpxlW3Jum}Udbs^3fUY>$#+%0s)8lyV5V;!x=0$)24FKV5E(AqMu{cbAwvNFBDZd-a zo9mS5Z^R}*V6kdSB*3;!$ z`G$@3$Vzm89w&@4?&sPaP;#nBjS(QH+n2nqy%KN3@v8);pIWXEIGY*@hN$JGV&ujo zYIB2$MMFX%W0WMi0;C#k2fv=lF@A0tCSJA*d~3&9DE~GPA=!XoO?Vav41j3=_Vt}^ z?5P?nRl#?hlA@-u$o!Ku1<RoND4SZ z5~BvhK-FhbFAk1;bSMxMY3IEV`EcZ>*Y*7{d+}+@#s}zJE7XMbfdnuV77;Nm7pui48Kyg41fVsikAnKWPNLRX zWGKIic<_EiEHx^Y`bu>y3BBU9>U?A?^%Jp*^;f&~BboKDm&(?Eg8GeD8QNdoj;euF z<2p7x`LZm{d67!h%PO3pnn?o`#c~|@?su%(BLgpS`<*Ds0_9z~C)#$D&<4tL)r)4` z&rY8j&5C(~ojNtTK5|o|-n3-XsLt{G5UeA)pvn13joPWsp+AjP0m}uqFSt}dWks`8 z*z_q}r_;C&5V*|bRSBlbCRV}kL!#?(k0Gz?vuhG2Xcgd$kFMfYTg3)j1rVgl3Lr38 zlR1oOheKE{r^E=yWG5ZHEs_~uS5qL@YYK}%dWc;~5+|6X*o0uA30@&)kwOy+pTZFb zHWfsWMZmPbbJ4qQYV_HKZ?V^rQ5R$WCOd30PA*u=_2Qx=h0*VPSFbummf({OfBu`b z$|ajVOeO}CjhnEz#tl6ma%DeQm2nr(b(9Lp#2P?^i%{K2y?KB=IVDw(X@O)8W6ns0 zB9E>HS}lDTMP`uK;)+V@=`5QPD<8d#I#4e8E69`kmQ%A{&s2b`OEs?7R^Roy%9;MC zNCP7x^7PZI%T2y@w+`=eZg$p~PSqK#uCE$U39IpQ=tO=}$m%jKa z%xE0w25Mq`y6VrMTM=bC#5$N>M8Y`_zs&|kbFN)xFqz<$Fjb2V!Qb#=wS0PxWV);z zjQMZCDxAzaWESm(zuPT_K^IN;R)qKt(cV$mn+agx@XJsy$h4q>Mo`~CM5x`}1R6|Y z0uw*)?dx;6x?~f|=|QU8{IPQ5PM)Sf_~HQ3Z}BI*_#2XkIxJfb^DX8mwcv#>M+FOZ zk)Wo_x)A-_3bi2A zi%Xw4m5I${yz?El(;ijzXbR6h@heWL*$JUq{a!4Ql zosX#Dgz5tKUDypG141@{(&!K&i`NNEi)PolcD6$xr^~9-C z=9fUFJfEf0lb1G&O8Fo7ad!DJm*W`%$e*XSM-&C0LN^z+4}6M=LdG%noM4b1Lt|F{ zvnFp~XlG<-ukGg0robX34DEF~99QUYbdZ35yk1IC`yx^MrlR)2VnOXpqP7T@0_Jr$ z2hRDKjOQXE%LjYkZ~TMZgI;U_^vf0cGKIb^q1OUBwNSElmbgN|jpz_JW!}jV@JZQ- za_*tZKM;sHR5?hIN7pRRy)T=uQ3b+HdlGf%X;Sx8x2E~r{Ib@e)uzCK)hlHVUrHJ% z$0dN`oxh(ABWF_df~Lc9(90ISZHw5AGa-Wb7z-qDWJsfUUz0=)``~336Pa7aZ9+Sl zJd0zqLg*0gg33g0YKNJNUEr>AWxk;niuGF#Eo0Ms{Ze)_!?TNg{qiURwqN?x<*tv6 zYd6;!=XW3P!*nE50rH5uH6#4)<9#}}sQb7Zr~^)YLO1t74sS9*e}HCg6#Y^A0`B7o zLD-|NcIdli>~eh6#->JdqDeC}fuW{q=#P0`N(Cs06(gXg9)y{R!_i@iZ2(-iujDCK z&BEEtX5-XnvLO*Yc~@-n`+$I%SMHBd1eS~xxV-`C36U%3#Y^ZNT~vsyn~ z&M5Pe{yl)WBlcwkDsqOocEQIP)=S#Y9M((P#~;>9+H!^Ul6J$!OIjEO^U&>RrspM% zBV1sh@rw}Y_mUp!2p864%3hq&juc29qluUF?uhi}G74*NPCZgZH#tuZ0elRuT);_B znF?HaWi`3-xR1q^lU)GAV z9mq%{N3w{E)l$S#>shs+2Kg9Q$Aw4KnO_aE-dxl{ke);wh*-03Xkx{q(qd2n<_thc ziyWmz4$>m0(n3HYTBOC<7|6XZDrGYZgtE6@1(ol}hj)xZ!@bRfxde8Zs$GL~pbCxzXefd^hH6v?!0QNjs8OC;8pJo?;fZg_VmE}4 zn>U_^G`6O0{5JCGwFDQ1lZ&7aHRi-ZoNOe&MKf&QubsksTX6C|J_l5r3aatqTwZBk zhwwoXPOf!}vyK1=oVmv(lh|^*fkQMsB3$-NpBj$ zn^}8BEyKvMd7~dusgOKJY(8zF{9=r~|M+eLg(YLUO-LfG%8k(mkzjcCC6>Or?rC;4 zR+WE-7YcrwdWl|(^GrCQ;2$M&pU;vr}i?cM(U|OH-Iq{JcX#I_EfqXHBwLQ*&||lY7Ze% zBjwaymY|{iHPIf0K%+5P;S&pbBt&jLPtCC=5vyii9SuTY(R`;832WxG5~=7B>9dFl z5~)4zBT@?j6^P`XJM)O-o;&l=$vt=Gk;*-HW(ee-J9EQEqmmgBde96A5Kp5r=gtmA zq+g>d2K1mJhy>YT&YcORsZsp_Ok8&E>_tTSHL9T?`Oom_xii~Aa_-D@Q1ME1kX$kJs;nLlGkH$|=Nc{WOpu>7&WQ6qO!EXul zy9j+Dpc_LdaDuv9HxhTTueV0gKMEUUVY!9L8v_NlYq8ZpXA!j>Gh02r;j}<+hF9_U zBiyB+SVh`?h>|VQbyQ9UIN4A;_gi~7R9M{zwfJJ2L@eMCFQNymf$^3(0>&RWV?czz za4#pD4dzlsWCAF#I_4FgP|<*zV%4dIHdAB7aC2TfM9wS5GJ!@YxQ(aB-+TqAcAipg z^<_e}+vkC5Cx2J412}Q4VFNKkh{bqYz09oWGl^<4->|LUpiUnLJdE;5Di)9yaDRd& z44bfPoZAzow{v9xNu!Y#0b`q)EfT$O{rlo)^JInh7BH~9AH*Tf~KmTV;xnsXdhoF zycpV%C?hqrTJ+J#RTR6ILvBa@v5SuL<=<}cB%A*umz4@j?8J~J;uWEuDMi!j>o#^{ zf{i7g|Vi!f0T!75_0xDh0 z^eK|`@d5!^@D8oKRoEfl`-9FmRuXfHNZQ>fW7=pT&erFKcCtfTp`a_Hbr~g(sX<%pNM@WYXA^oeK z183F~nnZB79st!3$w7@yer=e|W@nkUV!S{)-ZB#kTZL{oa|0JKkiqio?IF^?$>?w^%ncb|f{|l%5&$GlgyDA~N7>j82HrA(POprykeA)#umf7| z+S|eu3C2P$nxJPL?-)Y==%}cFbPS5J9sUua z+Y4pH+a3bWCEiF%J3~CVXWAoPrzM`=KaIho60Fk_&u4$xKH6!C$5`KXLZ>Ajl~Z@v zbz0(y%4#iRedU%h`nbrj?G)m3BME_^O1 zQaX^xpYA~Fv;!%p3KnHNbe?|ajt?*&d48C=`~@&MR2WPBaGJw0qrEF6&3qqw6tT#n zzWf1VdXZ6us|;k8mOzr5+u?%__g2uynDHX&Q8*$gTtG{9*KBa-T#*^?&aq~LJ+T!R zOQp@*PhED-j3sAGfMZInDerFP3N*HI#$Rc5@({BD&e*9m9~u+Q?1-h*%$iM3h)(Rx zHLFP9?-|sLCxSpX{NpZ?Ov3j-s`dU}CEWQJ3AVccY3Hq*pq94s$uce&^Gon2B|+6f zyN$AS?|0Z9On7wPq{FQhO03)HWAtv-_rCg=)o8J4o}V%8llx~rOIw(Up*DxNV@xHl z{T(j9QaPTJmRHmShBSk^<%Pg9AR4StBzK^|{6j&CftMoK*X~1!UwnA{%RfEoOM-N|yGUgFF ziH6o9rXS(q>gxrZ0ka;P3X8(0p^SR@0UToG&-gDOmdjRN25^L%qh|ax`96GL z0S_mH57SVzFY=vB*t;ApEq!1zDuAl@i{^BJFBD#UhFi;9-|%XA0pHf!@VD{}Z$sW! z3sA-hP_AP^&=WRAq!;rio4V~JAG!HnnfYA|V41iHF>bw=`RYB*SMNEt-a~A?;9z@G z@9|XS%Wmo|Ow_Ey+c6zP=D|EqE4jG5iD7Fg{d0U<8oVsupaIt^LIV+#Y<^)DqS);? z6QUCCOzpL$0!#PSa;yP=WD^a!qU#Ys-(_|6gr5w7D4R~l=n*zW&-Jiek6|^{tqlTL z+?D9bOfWBc=Bw4z@5?{Sy^f!d%yERKNBDm zIAO?gu|_J#s)y?U1jr$A?5@gFR|q#~23II+9)Nl@01CNS)v{zmT`IaP*0Exc(+9Fu z3o5q8DaLQRa2!|fey8nDYGtUM%lFi&=)^uQb}s&nz@b~7>^K|)$=wp|gCkPkwCJ*h zy(?(yUy11~QUi>VpT7#%It7 zXvu7d<#~UK7|OL9U;3?dBj|$e;<_ApP?Wry>8(Xx<3G3@w*R~wze`0a*0TD-GEfaU zZ3-iYGEj`zP4H>r4?+z)Xi$C`Hp%jvRj%xJ4xp`D2%9rJLuB|JEAU(eL#P#@$-Y+C zNWHe-fj0BS`0Elu3DC|Ycgff;t!nB3f476b+wihg^US2oIi<#>RJ0@VWb+$nC7$_Q zVm1nz$#eU`QBG&!W;9{~X3tAPTM}(Ek}scB_&Pd@8{Jxnik@)5L_H8mh# zA21^5xPXpNLlAHpCZy_nVtA6)z``&EAucn8f=FToIrfQ8nt2;l;=kUU4}Q{S}IZYk>zjtv}iYfT4UAe^OYXQX4U# z!~%5}bSLD?&A}6gGWF&l>#*~;BJx!9S+%xxsC56E=5)}M9HjNQ$jU)}VpS-Q)l1}d z*n)-I=(9+0E(u){nvr~eMzXkKCsa->$MJlyHmj&*d1&>UnUfL7Qof{PRroCS&X5A4 zYE8lDB;tNqgcTwgw+OE|zLkgMX*ln6)9%!*>bqqm4#@`-XImnF@dJ;@=E2CqL_N&n zomG*=XeuPTcx=Kc%P4goMx76%&V?Ch_?b|g8a_sUzw;OsL*u`OIB;t4X}%Az-Q>;_ zb(o2=7)U5dn`k}xnxncFBHlfp+()qQ{eXQ=nq_f&I0h&oli^_rjb^?AhMkct;rB0` zhjzk%6>{ca$zZ6C&Zk_dn>B|vnp4Rm3XTR|ylcP40=)3)`2W+PM0JhuybFf~qAlhtZw z2?bKkZGv9Ev#->)$sa4-xoPN1=beK}ML2wSvqu-H=Bef>s7AWuQ1H@cqQ*pYkVepP>Li?Qmkg-l^r0(Q$_jA(dC0jYSV6{}w;Dhp zm^ue&u}(hGCqGMj$CZ<6Zt}k#t zO15UTu1b)f#-rXr$eKAQ{{Dpt!0nPg?UERPmQugJbv9xRip&s8HA{Ait-mPd{%D|> zxd#X^c>u{iwR3s%QqAyej8=1ZZg1g%#2 zLH(0%me^*El^?_&g9?%uQLP#un}AO?%?zJs;6dCXmBCuT`Z3K-6?7suEFe26#*wF* zIiGV89JzTegaCL;q4Ybm;A^DK70LYCV{UW%TW0|xiI^{v)NbqPbCX)iMBT60#;Eqm z)^^6F%nwR%oVRu$(nrt*T0^I1Rq}Kq%ZXt3cyGM1c!u7a&5 zG;RdE>op(QYscFPTUMgETb$Rg0s6xodxCA**xO9Al{faf=+Be1V^13hR4a`=)$B#E z-zKiztzG^`#%6mhlmuOeJSAH|&uP}Qki{LfhMpvn8MRN)B`euFR{<-Se&_ZSko4#= z5+-{DwToN3nK!LPlC3>bQip3w()^2}OCBXdv1=)uSg+xoj;RtGx#=I=F7b(gevv-p z62ul!Kt5ewX=Vbt=-b}|Be$L{mD^DyX(_5B{+eWhG2;!o{c|jH2{<;L!^dgR2v12C zaa;_eB0c$!UxDDpu20BWRRmfx*<0EWc}zN5$rC~_OIJkzSUpa0uhjI7f!~4%h!yg= zRO}--mx==dJgq+>#Qjv<@26O=sm5X3$}vO5I@#JLMNK?;!hE(HO#SIVaUoSDW|22KZ@6JhB1wUf7L~?&yJIg{dm~I|$Yx)eI8olT~qgcdhUF^LUC z?|e4^V8`A`rE-&fefuyjSwx#+bq&U1yz^qA-yjOgy#6}+o$qKP^ECKq{z3q@^dURu ze2hY@IB-K2R~$m_IwEWw$~>L1UkojSv;(!>Mf`fJU-|L*MGiAtexUBy`}`NTZ@B$r;wzp|mw z@*KZIi;go!bZ=RjK6XT^m5EQ+0s@GP-AvT3vqu3Os;O0Kj!(4`GAF9kQrW1u@I?q| zsZ`I+r6-SJ6OzAH06zhMWV9{S*rpZpu;on{M})!$=V3wmHy9*v+U6PnaJR!QBQ)I( zvsK41hPX7tzj@XAiyxCpKLeYwCe?J)%nSQtDWS^Ds{T`wf5(&a`ivCX`SsInJGU`t zM%${QH{~w{Mk%1_5veNEAG+}JORt=Rb63aIuB{t|L(6ScfKyVUKT4%JlwXEFZuJdQ zQqgwk7Z>-b$u47uK4ypwFlXq(z)97kqQ65S6e6aN-OkGDzno^V`?|1oo7QECS62r! z^3-U16YgdRq6**OLxJN6;z+ZJmTQT&bBYqe*VUn5Z7sFm zS&bPQJ9O|Sh$1J9Z7r*3lu=IHaVPgQSh^hsM<6g?0oplAr5k2QQwC6zGAv9dlW#|E zjCAGJ50@&pN~e0n5<=fGd_vz5AoLxPn??*l=&@zJlrKW7?2mR-CR#@c(RuU$R6SgnDI()-wdr&P8sQX#HBCB6oHSpJ*KcqIC>Sv~t#Vseq}? z-NmFJ;BKZkuHhFFD}izH?^x;y?fuR0i>f|-W_tY6FYXbdSV)gg;Y$^z8}X$);oQzC zU`-9Bn2LvbXsrEFj`a$B4O4$$#AjXPC=W_f`<=J3iZNY;oVc%G=q}3DTa+4slIVizqNeitnZbkQ>HBDZ})d<-tywd<-^kUX41JLZCZNm%P(vEzOz zS_vcG>QQB*m%j9qXSj`=hc${v^Vh^=Yy~^JxeEZha3NG9I@LD^$pp5eG~P@>2l@eN zp_aiBk=6_lER}7Pob%78l)vEhuFnUpBkerooiLHH*-VEDy7TP3rSJ87=`f@Q;BLA^znb>2&h9%6}>>;QwFzRCsCQiUPlCSW2 z&TXRPB8RKwekLxX&cW7P`l>3~HBLB$kbF7$0ioP?F*}bAp@7wbi#7xdWDwbaVEUbR zxJaJ*{1x}&+#e)h>}&3pZmp~)s27W$NEAfxmFvUPlan#9dV2ahr$B*y?h=?vcsfaU z@3s@m0L_{B*E^m6)n0me?CEb@d|~apOV9sS3^vjvJU^bUl{9J+uW478?y%Z}=CWq3=subC92bW!?l}>@EU^Hu3qIegG_3X1VSe;V?pC zvJUQdMm;1nSkej1Gy}!LdC)zuZKt6S^RA2FTz>&jr`EI)`fiUQ)!ln1CM0H{v^>5mw^{D5u%AQxXt zkN8QIXfY4~n^Ca(BL;In*hwB($aYQw*if-xxq0DXD<&DY_i_qWf5d9z2m6{>Lxh)8 z@G|pT&{EALGsxZgCdTr0VkkpB&5_!^{16-e%K?uMv*;QidEo{(@jO#pu_&0>5oqZ>ZpcF z;0>u7hEi$$X=R$fj!v37%Gv%&jQvVoJs|+PRzd4eE7Sa-qX3=141hfNZN!tD?~PdQ z9U{YQ(k0nCF#vy(!q*>3^TU7Zu8OGt3qrUO>Qe%s>lC#9v@*>P`bL1xKgJyZB@M`b zL{QLtI)HX80J}k9>rX4w{ICzNjP^-Gpgk)9dbWbrAMu3sgMJ0}jQqb;XEs9RV50qn zGC4EJYuJIxS9^Lf6E$X>QgJ)9v@lk`Y5VXxYizSD6-^rcW4GgdbG_QGce$!>hUky z=C34yO7i!3q)asrf*crx=Xed9gc15h+bSb?64NU*3~n%1v_(5n8~#N*{I!i{Z9Md@ zg@dSed4;=C82_SO{=zT91X4zi_>@YZu-G?qI#s}W{EPPZK`r(`frgmMEttSG4mHXJ zlK~j~iw^j~O!2^ofSx5%RRy-C(@EDo$7r;<*;Wz|%=F5zxaLp^{zbF?N?w5>$89zR z&Egt2h&?v?Gbjnh`1zO$m<3w|So{m>U<(zjh^P`Z>{fVQxN2A@q3SuGp*7I&lMtRm zw#%1s-YD0cKMkW-ovgPP9KrHfYyrWA90XR-KYxxg4}tiSCx)@gRPEy z!IoTUK=c6w{sp-*PxFk6jv4TA14qY-z#&^2I2pjfzaU%Q=fUx*Be-tR-||Jc4#^Vt z5S5LlCRJFZCi14KDTkWyFUXsp^J?M-7kG1$R||P_ajh5ThKca5h*%qQd1`Zoq(Rvwy?-@`-i)yEKEpv1EDxKc$RJi?^=p zj>ZZ^c4t~yl&iRuexY^AR)=vd&+&)1Sd6F&HRrd{nTc_!rBV|wXppS^04r0Alrx7N z;5LD*cWr)-dG+K4lamcc*-~}27!_m$#;>iL%T>F9Fu@NnwR8X(u!%I!%YbI1Db@Jn zY)jogiH#;L3?EKiEuQ#%VT<}CLh7ScYgdx^&ba4FvQIH3Q+1PC`gmVHmXv?9e!&*z zEQR^E)fHj(JX->@E|y+e1k$p+eL6(asc%fWmC@=a{l{al-oA{JpN;Kz_N3P6Z_Gqp z1hNUv-sA{>VnZwyzUW^k$fX{<27+^$P*6^>$Y*MvrMFye7@jQIlh|Ns6{^ynIwSe_ z8Qfyw#Tbo1D*10%1D4@K(07iRk7{8}l@K^Ju#s91>Kkrs*$7*Jy?~w%hfY2RFi6ho zCk*1;y%QrZ3<@$X60^~S`##Vn@LrM=oM}+8;8fo4yvwsFKuWgL057%ERm`|U@^`W! zL~KX1g7ox*U0iQY6t+0;LtROQFub=ko7a3?4C{blHknxG^CrYiQgw4xFwi4yfOp?v zIN;{9%kZ}kh|aUrg1nOX95s zocH`FJa>aU3E~NHRl7Be$CP3`iBuIQO*Si4HyaX9%q!Vc-KDa_1}f=bH|e0yiC43G z`DBSh0v6^#{wakNgl;2`KV5PS0v{eg!0^O1bPKqr#FGb6x=rE(thaJjP}Pf zXg*xm(zGrl*Guj|ysuHb|9Q0FeJ=6t{faOo%Eu%{Ibzz z`<<)c8RccFkp`5uT@LRL)oy7dB_yn!Y$$n0sFHK{X!eUqFLlESLuSiV<4Y_BqDg^< zs~Adw)D%Hr4u%0M=xcZjW*?XRYr*~?Wdioq4?%X)-LXQ;AqE||9f2)}q=Q0^i(lz4 z;iOn0(vOl?Rnz0&m;!G2iE_jDj}o@3oeXZc5bS3PQzMcWpiy1Fvl8Av=Fyn=E;{8L zcp67NZZ`ffIYMH1K_zyOS+@>_Q$E~cFsA{2q7^{?k?Y{{4s2lY&I%b2S)d&l5HF(^ zb2A#YQ6^~S8Z=XM%~LQ;uddcT6k&d+>K2lJrgjq zsfL9HwDd(b*|5;NDwB{Xy?kN;%4lN_V&Sj!ilWav8G*+xQs+2u7TVo93;l*Go0c^b zJsZEsVa#rRD)0&umC93M>H2lOFzH}U7J=}y6952nE```+4A@>##nY4XpOIes;Irtp zM<9RICreb2d(|DP=z+w@ODERN=%FsgF`)3_uXqEAwNYNNV+HFV70GC=P8~aMzW-e9%2nap+y{GHf_}lo)8SD~pJ}*&8?97)D zI3tTVT`OiQO!TxwZt^pm(9&1qkq2{THO^|v ztvrmyge)vHf>7l3?DXUZ70S+pa*0BLtG_XWCiVakavb`<*51(*B9YchK)XU!yHr`S zR(}iQ%%y?q8(w2USZpk5Zx+$4Vkpu|9~J-tvPYRQj<5G{`kvQ#Zh>5S4-d_}hclbn z)fkmfl*6Acswz4H>*FPxEeN@aE-R{Zc+=mQBiYZFtk|Wc3iKIA8U^|ee5hD>AA4$4 zpxs0KddR_6+}>vDkuKx4Qp%pUeO;)J23hJ4qDK59$%{hrM=?Zu$8!!%PyXx?(s2i( zT4(bYr6{is=YK*Hafbu!e&#zVNMZ4xv)eVn1C4<{ne!H_VQ`hS6&Hpvqw$dPVxBG!HeA=G=C zRMd&qKsr+Dn<$`*G2j~?+X*gYa8H8Q|AtcBjeyvq$L0Xeb*ebRfa(q!X7(oKH_zc}5e7)EJvs?p*iFvGtPJ_kj{d7^L> zeAP=mi(Ppq{UqF3cm9}W53$)U^S?M&bw1`%QP~l*zc?oz^Wz%4?oq^Jt zWLALg1CjR2V}WvqnJGPMOttG{AymLEUTD2>1$iCa-+Qwn^3FtQ{Ujptn65A|7l>N5 z!LL@$pTZsm8T6uC;K^(ayquS`36)IM_+e7bWs2P8_X2f+i=e}k#R-5~BYQ}Gm zL?o;-3G-s9oep5tuqXleFVp}wQ^&+T2V(Z7M~E}+LSX{M8Wg@8%v^wxIsEotT(sjb zG7DB-W%q-GC6ztR0;o(YI#DY+iWPzQA?G(2xD`!gSC06SFAO!EBb!)A;$@GU#Qr*J zsN@u;O>x(UJ95tsf+;VrQ@z9I22yKG>&!bNs2$@bOk=mr>FHgLfoEiSkfSsZ3rLxsU0 zjlqOCsrek*Ln%+mo{`oQp%I!~F_v0^RfU9&v;QJL6r}&O+l5-k{P%j{S+)_R(<~+) zq>ad;5wlDqvU+uGmdRta5m_Nq#rHCiscDYj3o4=I`bes6$^}ru+;Jeo4w)R+j`F7; zdN+YkvN$U+Jfw?W@TKr#58h>lhr*bLcpZalL$| z_B(iw(294m8voTczqlf9=r*WlN%VtQGA$@ocLwh#7$~OFz0yw)9IcS0Mz>A3oacw@ zqJ@Dr83PSU>Q5->fY`|k4PvRC4*3sBxz(f`>ZRQG2T5r%DLZ&6kvApf5|c7`tqX1X zTawafQhtw=O41T2+zyv1Lz}~p+ojDkWijF7%e_21`19(*+WyoI^=D z+;I%Dj-QA~UdiJ|4{^saZzi@x*PDqg(dB01A|#l-B55aX1eINpWcy@iEV=Vbl>Txl z@j6^e{6)7v^e$q5e>{1Bj}d>2fWJS$hxT?i_by`7CtmzI%cSN#0^XVB-bHM>#>@Sn z$sP0EFy-DwEWPwmO%?cZPm?lpR@h)P!LT*G2 zxU`E*|0HC4;Q;V?b)uFP=upf+cmjEj3o)?GhQn&X)7I8BLr}Dp+HT;e0#50~blDA} zaOEmi1N`=x@PPTvm|vNZke)MPhres1MFeU>)4 zWi3t1LRVGeWJAkf-Tcu#G*}g`0NR~YAn>mm_;g|I*^Rg^S1$hWaFLf?x~IxQuC5U~ zOO7wo9NgtbK0io&5j*w_{iB6BqEcgca1l5%tA z%%ofgm#UwXYMe4B`2>%`&4H6Eet^OR>|m?=R%swDGHRos0(GobWC4CrJSvK1>0*-OD~9}!n4<_Ce96Hj`uEYx2@u7&ge<(gM>dP z8FhHf1zK`n**tvc_-Ft~7I%4g%VikAU+a(FggP;+b%YWJM^-*ZrU9MAk1vh0EU709 zyLHXbYbU-s8jAG<)BNx6?Q8z;7hy+=MU)rWPHv~`h2uDv{BKah9Rr=x(k6(9M00ZK zLLpe1E_%33io9ONxc^g<evQts*m zJzef<_ij@n3{E@Op!)vqK2)b%!-=8;2(cwYbD+%59tX}w6O;qVniV;4Pf)&m*-Bz; zKu>y0s!6h>`a52|d$Fx?9qwAo_+DAMS_T&_PH@4gJJPf-1)(cao~vZNa3Jzzrl`!8ooWO5Ub6_LpEttsL@61KrLZtjRwDUAeN;IJ&w5lv}Vs$Jl-(SEUBnDZ0Q!6m)ZCS-M$vr+p??qYD_>(gr|jFk>HD<4YxDN6g7ptO@k>0W>rlumO|I?{*I zWQ$Vaa{xO?DxLtH*meL^JEH@yr|s8Y@k6wjfbb=3AOrp!Cxux?>5!ucoc z47z0+z#jvc7yGy+M7?k|cw{+Mx@ZOOodH+d_!iU_dFo<4JB?2(3~m!y(uHq)EFQ~? zJ!a=8fsb1TN5;29(s(j=`KZKkM8?Hq0JH16SOC3; z6;DMVU-bd`wgED_1V{^j*qdo90@=X_#HG_b` zewh0@N$_L>0}DCRIN$j71#HQp z(e$)kIR$^52bQt=@VDllg#HbGgFo0YbEV~?AoGgBbFa>IKug^C#5KIp_`TOU6N zi6cy6T8!D2o@c}bMWNv&poomGU5VNn#Bn{}vNQI=o^>kt&@KFi-1emr)S&onX#Xloy$#;y>>M2REm5tqMbw zUfv_ts2fl$sOw)*TdwPyirm&TZy}=Lkiz90Zrja177-g{NQg#%E|qu+N_aGSm2RjHF_gLxTIF#pWGk zF?H$oR_~mNx}?4NQQEW|^wTyZyIt|UU8Uk&P}e+z&On^4xp5bV3yO-a!%#c!OPe%* zegOFg&-RdiR9qgycfaT%uWCAwe+ROSM*zZ2l1k(`s@VYE<*PfXr)V3xYHSfPko(u{6joy4B;Txh?u?0JCvE%yvRLxa8HKA3=?s3qQ%__=f>krw40%s0~A0 zj(^?8*`$0@uS-lm(TORnWMqRNJO2Cxk$=l5ILwuY>7_ilEiHd~Kh7C)=wxl{I>c7# zmA9BALr#`b2yQd|t;>;un9$nR$N7cp4f{+CK6x~pi7Ck@{43X1Vs8LjQE+28Dwa;0 zqv9+U!$}?ad9DXP?yX%S{G5x9z}omCt`N(i#nMZqJT8qj1L6RT!=&I+DSJ{-OGzP3 z#~oz?Hr2WYRZl+*1YB^!bZV)Q7CyN*o$i2IrgB$-hf8t(jzuFmrQKXC|sq{BE@i*-N!+2 zw-N*s+vlSYf9?6>EJ2KBF!a_hA!qLg!AFmO2ovL!7_(X$X5x+S_6vhi^+y3SrjR~6hv}x20 z=Avy~fZv&HT;`X~SOBfyC|1w6UvY`R*BDxwIzxO;v%U{tI@R+s6iZ&GO5Cj-D1mLc zg^80i=l;xvE3FJY`eJEyYh_ukQ(twCf=t0%CCCSN^pX6*O-0*;Czw(4o@;8wuN7h7EP;Kcnb(G`r zFot6#JPsC*fMreb@z*si6Y1J|5k@@_X^OOx_wkqlW&=b#Tb0-!otbf!4Ce~fMo|_o8OMD`d~D_Rt+8>J7{$bnno4)14rzV*SDdb!r5Bgd0e*W zNXc+GM#LD)Q4t;RxEY_eBL`@}W0k6#eQ8IOzc^!11$65R-q+vUjC{D7gn9b_fJid%I4CWtK8ZU~pzJZ{2__b?6F&2rXyNNwMJL$sCUm1~jNp(gK zJA;<(u^x2jGM!u!g;8!Dn1dcd>!f*-`-coVoM@R z6w{OMtQIXghaczKz0jvJ+;=V;?lVyJY1p(b8Maj+Z9wpR&%5Un(3-iP2P>zZo@8RV zU*5pV;FCA!LT>^?(l-~~MtMWY-7|!|SstcjSUyH11M*Wc;H(**c~Z&H+nzaKJ4_xih8Yeq~Qf4l8vnxicR{?yhFH z=+NZ8(uM!=$(_1Q z9E3T88XMTj%KggB^3i-o0kvEN)N)rqojwWzYJ1EF5K#ZzMg-LHBO#z(=lWgb0|iu2 zK3D-&GHOLYA!pE7avCfUuC6ypbUo@@$;NE5ejRFncfGNaJbEeRXrVmI`uq?(Oi{aIT;2AabCvN;Y16?5Xr2V!)8=N%GSvBg8;6N zqqyk+pKPbP#Udion1{dV5Vo5LC*-pskj=ca{h=$BRqvf8X@{;FoC%U z&*t0!eY88-`0&v4!*R6vb728AK<|-8P|INNtJ~I ziaJQ`@ltaxHD!eXz|BHj?HqD<&h3Gol%+G`gyOQiS#skzkVzLsi}4904v1fZzX!%I z!rz1A=i=|g_$>TAG=4h%ZXchCzdOWF#^1f-b@;nS{22VLjUR=-d&UpP-$;BS{%#lF z2Y>gD?~cFw#6OL{`^IbVcRxzqhxd=PMp(6-^ulsy0S--L0u0CJy741?@gw35ZoEJL zi1-vY-k(1luXW?cMq1C%Jx#3x;gd9+3(O)q(}Hj^YqFoVQ6xph12}X^C%R;eAuqqB z5}jyr)mR=K>Sb$@h}{s8vs2NCq_1e3Hb?tg*q!`JV-FM8UF@_dWejAM%@MZbIqB< z%nSzs7Ba*(A=D+9&^4nEsTMPa;YKQ_MRM>gl}z~sZoP_ricXR@N~7+IZGNB7Es8VU ztYwXs$2KERX8hUr*lPBrxTPeJ{T*4jRHPK3FDuQ?SFuoACBh>6_e-<4Z#Db9rP$ENeF3 zlL%J6N5}Vb<44CQxbb7<7?&Bo3Hod2Vj`=-TFtR!n{e^zE`nt}zjuI(5BeWRrJvJ( z<$fO%K;>SO@qdmg#}19kkpWc9ogmr~{~aA9h6U}QZt0+(sUWB@8eolm<&V;$R10}lslA9&6zFFyQ$QY5_L=yMvk~=OfWQ1NDSo%RQT99 zk|}Rw#cOdBgA9Z5O7sFVEXs^ zs3Vm43FCrM1rOtv;Vx&uy$+BnK3`r%M5=gcD^n;TCzQi?(bn)gqyzXQcHqOiB#s`k3TdN< z8iTS{%X7^%bSYWV?s@}IaZLo_|VAm5$@aTPaD6zYQWG#)w=XRR5y{3(o6R!CKRnYb5 ztKZ!?W;F*_E11NwCQ(=MoR7S;cT`wlDOHOmBCXa-`;AFMyM+^=Z*nwoJ~83Q5@Qe` zZA_f2WZH1t(2ndwrL)Gsu;DX;>27(Gj@@&ieVv@H9(MhF0x&~lEg@o&6qh*yEzo-(B8MFZZLVylE!Fc1CdWC8~ z)O;8s945>MQ->HevWBkPkMq;@CREuHT?5~uHFCCnU_mpAqGro5x(3IZR~W{Zqf)iZpJ} zdRXu64^!X#8jC9fxT2E+QE82q z)>LhqT5RvKw5CcWwkZGa_net~XE)2k{`>oU3JQDg+?g}yoH=vm%$YMYZKbF=SmwL@ z<8@khAjFc%F#A}=EIeTV0vI^Egha(tgDbzQk_NOuS=zrTqE~|4<|Ky{?ruvKOUoet zow^H0iid=S`7CLd<>a%9pwhw%iq?!XNn(?KzM7j#30z*IIQ~OliRwEinHJEMLGfza z&jHFc=Y&au3;I|rFG-z?LPA>FhC*TUprUWvieyMC&0b}{g;-N#86FtgswtOlk}3^T z3p4SL&4XHog|+l0WDAICG#fu0)^-7kL8sX6Qgb@r!6DFghIwQ>K11D^jOQ6cgXf_$ zIB(MQS-ihlp2u+vmMOY^Deo6!6`X@oie7@+T@0!@8WJPR;?eGR5EuKZ-27#BDQGq% zkJ98E^9cKO0%_H%WP`(z0#Q_T+JBv)t5TyXzoT|G?|_-QAvc`CfpK;oRu5w3N0QRQ zO4A?#9RM~n%t6wE9QbsB#zF?TR)Q^^+*sjtHdQTcinr$Zk}*2xMYkl!qI#-qMz>U- zfju{^a8hIH1*`WeJPb+}mXW;SWdV~jfoO?UbEeMrV9y87*5eP&VuC~fUl?SlN zv}a#!{XNOLF#L7${@^lhquLWfu~d*{oId{eJ7Wb%b`ClG?c&Oj;*T&|z~M$m4B2G3 zL^91G5BQpQ5a!G5M>&^WO$O3v!~BL1keL>O9^m*Gth`d&ib zcpUTqMpmF&xjJPmsX!zIWstrgf_S84d_kVD@Uo~L6rzGer@+!JLxJ=FNQyT8#@pR6 zqt}iV3XwP0nEp$JZ4$IdIf&x|KMvnA%WFT-D!O@i*?=0x-r{>ZYD@cF2ZAsCbFmJgvPW^H=*f7bihFQ?M;>fQXjVb1fvk!(ubf@w{+v&-3le52gY}N z(`~#}!bh~Y-iC@LP?Fq}7vFb+?#k;C;J)`p$G}qZ0X<1~KH3eC+&jFa9Sw6~7ELMF z5pg*6adYCysDh|kuIIP6lzDU2~ z7v&ZIR9V^AR>B9|9Bhy{0i!kcKFc6I}H+1NRK}Nt1q_s=IWP&^n(0+ZhynBojmgPA87OUr^iL9@q#W`}aIF%09q2^_P{$%kjI z9T92!%0THLZ~PIxG&SzDKaGg^OZwJrUfu&{stajQLOL!+0|~Y8gK=(-&L!_{M^>PK z40ZB|b~$Dj6IqP#3dtp(x%W=AAgm7HWb`9Gp$5Ex}CUK>6`2rF%V=%LDyT1!;| zUaC%3T3=hKfo{khuM83E;z#e^Zp|}>F?)*qm@rR^=9!Nl34X<7Q#@hhy3~`d<2U|6 zJ+Tl*EQBEwCGTF^)d38qIWPj7yS}zGQhk)-L3a?$xbqh!OZgUV`K~P527RoAHz7I!m8A{Y{zS5pI%WGx9P_ zi@_w+IN8Bq8s4Ydnx{!osdVmY5(bRST!;k2S-cKSJ2%AR1h9a3{W8LFU7tY{lvR|P_0r>1`1x~76)W`dA%(iD|508N0tR9 z%Tr;N;XxK-5dM&rdo(Tj(7_-?0gJw7N>2+*j|@xeRc)w$FNsm+Je{OQ_>=wL+NlSYYOua}R0C)f0Q3B?IwNytrma6)}Hg6*8Y%b!S_AmQezLmNf z=5{wfojbgLmAey(*Px&P^Z0A2f&n{Cvd(AtdXFvQM^z4}*nx=CKDx4m`DYJ0I zM{bU5{ps%k>SqdSKLyoFP&)xs779?X0Ljf<(a4^J$~~4?ttI~Ywp9KkOT7L8Do+i& zhM&9i^Dp&t6F>hLpK;Ie8c#%{Ne)4`F1R`CrxQ0%c6uee#fwBz=Bc=)xMK}x6t&1t zsu@4|bFh@`?P?>6fj{u<_s9z=6{r-+hSOlDf?Zw^iwzpkS4t?Cn9h zZv93SlDtNgTWS7|qOv>4<0c?(JZn3Yt;Bs5W)qNZ9?CWNufW_a&|?%>S9(tM+U1ZE zb`KSzHJBf$Xo{Bf1ColMT1x`9!Z_f34R>YB`6LKVTO(UH))aB;#v0kWfkWmPqDAR~ zRA6CACR!8Gbg!ZP+y1Iex9eNdvcEzL`WrD@GbJDi7)&XQaHOY(J;D+jw8S5OD)1~0M4Q(cxWyvkNcm(p)2oX`Sdo&oDXHdi7E2c2+kCQe_f3Ca z9{_UCihZ2Bqs&>ctzcj1$W{!PJKE4EpumITQiDsqsYg%j=JXp3q6L}uTmQIjbH;?e zU>yVfw8lEkh6|k7aAunVpOhA>lVmx5*w&NOG-Ml~J3?t3FdP45t})pNyrkw37Ya(W za082HG-@*oWyU%Mc166s@>Qzk@RS<;HjGFjwdv2c=@fzbcENStuKjU+516=sQ2IRj z-U-{ml^u*}#C89g97e79I~YZusS5@wn4T|iGho4<{c5j1&Vn3NP2*Fb?XBLU6TI-=Jt}T*46~N$fS!IcwUvA!{Ss}`p!D5>Qxz!}C z$?B~ZlCI8=!F)d?U^~!UNv8_(nJ(#|nOk9RzY2YstO6%#!NxbD^Hw!g9%bDQ+X1Ko zeQ)CM+-gF)DnQ1>kp|p3i8<>_DBa$&KIl?!@do}ouNVI&^qfWv1w1Pcr#AA`I+$_? zMn}ncgV9kF>Y}5nnxmsGnI9eXjYZK>*R@AS)pSKi)%G|ehTQPWYi#6_<>Wl6ptOD& ztAJ|YE?@J_iY%t)F=quVaROxn{ZRm5Xw;U{w`2?7oZZoFWIK)^X)FV_w3gD12jPkK zAA|~wu@@c3kczi*{ABLN*QAuF@B8viINV8+lk*6}djqjX`dGiJ#FMlvw7!7@lgpbo zlCWsp$|cVhQ_}+_y;O4OXHV{HP9#&qHId(3KjNKb2pDf9f3T*nZ2{$W&qc_F?gZ## z@Z_F5c*hZ-dCp60N3-3?`hM-f#+X00W0X79dxZm?oU}xjZg+59p2Pd&9p0~&E3;p&hOKg2_LG6JAjI~*Z;F9dOzg7#DQgo zSNisCHY6>@=sUF8aUI)39|EGcgTSnK=C@7Y6=;*sOyKf;F*V9PexRH>kO%miNj*pc zZ&X!7?)PzcUm2hVm1ueIrz0aM%1*KR_5@88Io3;0y-N5XC}OsI?|RrBZe#}Ej@p{{;?OjIe6 z?zZkx3~salp(M=}-d5`1naI(t8;-W^4PIDd5KD4A1-Augw*5vipS4;rpM+NOC;v&B zCjhB;2SG?={z8M z62Jo*J|1o#acBhXFO!4jka^rKd>j!z(#$d$Xw#WT8foT{mXvus(LSP%$>bN?sUvoQ zeC~){Xnv>3FIEZQP!xg3Xqp@7bn_a_tqaVnF<-m>^I)Wa<@MKb?17A3Gtg<6@?gRP z8C_lmBy_ej0}fCQ*(igxLWIV^;$eA=+$unh(3gO>NM>enxew=afDXh0o(!2zQFO<# z_2jI9)abvf=#F9QJ=tSK7f4^t9SB%*;j%R;VLcw}v_HYN>e1h9k!JVt%o+Y>v z3vNqP-Nb@o^*~>0!OL0jwLgSZeFve8c~nJTi1)PwFjXjJ?UA&dLYVAFpe?O({&~W@ zRbj$YL61mKI^?r#C$cp2_AcdIk#KAnp^j3h-%_aW;>SN2P@9>TJ_7&r{-_GmMf^BXhUA1z3GbC$%5!d~%Ql~2!jUz|) zt&jH>8J-z|Eb78FMzfw1=?$=9H|<6z!p>kWQ(zsv?jw*l6&+LV0K5}yYx}wq{Lst7 z$@@w0S-%rb+WguwSh=tJ0C^$(K(qx2!=0fR8orpD{l3MsdQ=Ip%s)`ZQ!OCD=iSNX z!E7FIPAr#hgp)SX^G8;C%`#^vu1i{3o1nd9k-2agsZCrPR$`h-j1)`PvBmi(EiKL` zeuy=-iYUnAqTNlkO-*~4r>Vj816XY`g>+?)XhlpmS{0_sK9dP0#p5SjZT@GNx{H>< zR+pw04Fu=P&R%VQWflz>Dl@AP9d*UXjD=we0F_|s$0=b1ZuUssrH)H%CV$QUGU9AV z4%&}1)fOl@yZFFp?Y?9)#hfZu<6uOXIupe_*@g?_vYQp_oy=vTWlo51nDr9NhQi{( zs_JfvzvH+#;ylKqxzwun@6j{KZQ8O>YodHid-Ncf>Yb+MnaB*V$ihG$9PTylWC)hO z&z?eoCgW023LE;y9YMrQPeO#Dht39=G_r=w93#GF&;6SVRzcX`(HIeq9Hx@Ae}j(U zfRXk`LNgG8+4X(_7&U(VKkj69Xais;D>oa!324Zw^#Vq9&i(rt)B$B!MtT4?kIh99 z$xHw^LZEq;r4a0P&uDyWMBs>@vtA^}TULUx+Usp<9Ejg7vo$8s<>IAD)GyazF>ajWj&Wuj$5fNd*3+8!t9b7FIIS#t*@S z=uf{{ha>f93k5k!6Da|Jb&s~8%q#pytL#bNy85}2l4Bg3mR4nePQx$F5T4lum?Y;- z3ISuf1y*2R@f}L;Du=@F$m^0|U4}LjHgrh|XexqgRNq>1?Y_ zLBxe=wX`@0Q4KEm3yL-g57c#Nqk96bBg#qd%1LU57Db(HAt<78lBtC7%FL!@W>PP? zVY@1anuVv5Hg?rbjkYjEYU#;9&bDi$jbT@TXeMAF=ZPj-J?)o|49if>rAA-%l6I&i zV*dt$lHZ{aI4AgIZw{*@z%RdqidI4DCu>XK9JST=>`gBM^q`bruK#(}TBpZDYc->Q ze#4kaaSSt7%1l(sx%x{1Kqj0gfqYy7OVu#$Hocf)k5^=vi3~9NIl^%0#xREQ;2jwcU_FWv z%c$KbN~ybQsnyn&HdHcd70%r0r?ES&0 zB_|CO(eeiY@YtW#lH<=o-L!GvCgkVC6~ggvwu9r}d)-BySV^F|!R+;sikS+8xj73) zA!@|g_{K;wWb0Wxc;R3}-&3mU9c6=rVPCz6Arf2}f=0r~ z`#4U$s2!J{b1#dJJ_z#qE4d^DNHNz!L!<0iu&>Bk-g6 zUAdM5=mU%53`?{toG;a(s}#E9E?GAX6mp6Ee4T?d*)C4+Z5(f^wZ!4y$>1l9K>kkB zMD03LXiC!W75(~k zxxP8D@P3UMMp66;enT7L$|ZSXGy{i1y4LIahRDjkJVqsef_Q<>cANkSt7c^g(Z3@A zhdd<)Ds`&y%?I^fq8T&2ik|@Axn?r*Z5jBe0C+q0jK@msRVVYclv`aYK0m1H16cbY zG1C}S1syYSt2M3ABAQ1S2j+0jH~}=@i~$PAW3G}4{QEU)_Dkvb!!EN^U}ZkDr@3G) z2TRF8nr_R{A0qy#$dilPZn+r_3^EwRc1v8*ixTZv`#`4;&A@+()#UOs57KXg4442E zK=(y_H?l!d{ugdu9~*x{r0!WL!8Wl~QlsC6M-9`?>`x(ecdS-fPR4fgRwd(46m`|N z59KYA6l^h@ptogq++?k&cvD(bLcly!b!Zz$AaKj#?LiKR~X$H8>^~(r#K(vt?sBxJi_{Lir&4l$NVOO?+VAH5j8sr^R^sl+qHd7{1QIrH z?A{`Nr{&>C5eEnrYUv<^SI27eNf6Y+esnSO*t=5!L?X0ggQz?Xk-fO`7{yUGMOKC3_V?j-WUEhz`*BvUGqPNS%SH zbJJ4&3a)pmkIS@!&`BL5UD;F}cIA5p3ZL6EDT^r7^3FA<;}8wG>}hVm4Hr-9V^6h{`2Mjkf`<`Bck?n-KW(?$QApU)6tlp8scqugpu{<>w;A@Yd+`3u`ZnvfPlYPX+*Q%Dg0ChI2CUck-s zt7e?HrA&!romw8!;*Ei)W+vdn9F}huKDGmSFslW)*DS#8r+!t7sj|(g#fnj38)(y z`TS0?``J)#;JMlCcRDUCZ7iz~(NVMPQa?ohX`7~9>Z^;TOWlbd|L6{O8X?QOeVQ14 zrq@`R6YUjt{V7FOHUq5$3UTg-*h{SCeywHX^HR&ztYtN3A?AYDK&Ck?23;u7J_B6v z=rc8kB;#|@b;g5+j#fZ_K%u|#6M=ptpm&p-G8pR3mLllIj2ke_&GiLXGo z-lX8YS0Pd6{3U4UH?^Uk|B*<=XtcLK39Tn35h5*ejYgqE`Az>)G#)U+JOqmk(hMYA zs(2V!WWT@=aC}od4%#S4`iXvUK7t9y<`WAXRMT1_K(r!myOSO&4(zWoA3;t)W3V3C zXq}dsCJN9R>M@HNvJDHT#RN&cIx9m<)=dW$1ark3iIwZHW0I~10BdHttyxjQbks=F z*i|=b^Mb?ee-F8RtUe3P?{~Q?=jE{9x?KxOZdjuTb85}0NH0LQJ8%EEUYMW^v6{mVsCxdqXn*4s3L<>K%BkYF}s8q%7@lXF3=AJA-LI z1P7hb*o)HK_o5dWd$9+CXY55qk@~=h=UzY&t`gA!PVlA)-U6hW9)|RE#6QFeNxYB9 zOH~GsBH7o;{g#kKa*Y#Sa}+dEhjP)C=}7IGQXaZQXX5L{FSY9*Lx)UPTU)s@{Fvy<%Z+#74Y zjKwlzy|h^{-I2acpge3hU+uaZ$mFO z=>uverQ?g(Mji2I*-k8)tZL@8Y-QhmN3HUzo*xx|K6?;2`>ZJ?Y;94tZhBkT8f_q^ z^|-e)8DDfl{Q22k+2a8Pij8EUJw>toZ4;(WI9rh9T?B>PHbu$XQ_1`B|AM@qqH(2& zos@Os4O36*PHqQRk6lY>TgH24@cfw`k6N!q#~RfI4XT2WS4=b*gUCBZav3*2m8Rw$ z3MYrg4+7a{WBM7G*ilAK1A5>ALvvaWSc^6DYLIAcyl%Dex{Zz3ZEQRrLu0E~3tw?f zF9Nzd;?L2>>+|9-)zvT`PNlRADthfdQqc zGq)O1qC^YU9)^ScBoaZoFcl|Kh5;f%&vaqfj20#Ygqq5%n~K)rCQ1rH5wu6!!`eho zE|4Z#f|l}6Z<8hpv}`bKE^nox=hps6^(l#D@yrWPj$l6DQ-t~t_jkehVZbiA`xGYc z;{68PNbUZtw*7MaX#3pyYpmwU*fdj_Kz8>8>=vIk*!_}jHWhbxQFQ{f4RLDY(nOz! z4qm+B0^(31=Q7B}mRF!AiNE-IP-RI_W!}+jF&Tv=LX&nKhDNnq>{3jXEctVcG^!Om z!8m|10Ot7tG$i>dVvC!i03dgXe6l@H_fnkIr8&rGRe=2Pk$3Fo7TRE6!e71y( z1ly zsDWzqx|y6+Lus^iD+3}=2?Kr$S@oZIL50+CpQ^|>5e*m+C925Q59i!sFtq^4`&3q+3_b!r#bnGy2jDfFvAQyn>Bii5RGWV-lRHP0u|PFEVXKC z^wB?%-kf+6z45A+9kjin+GK`u{{$4YXvVW21*`KWbz zjf^?BXqreECh>C8;UOrE7|<}Av8%p4BRS9cs7vl92B)8$&JoD$T6CB7yW~hO4KJ!+ zHU?F3aUVaMGw;cWV#>_pCs>!X7A&3`s<$eCeu>NBq*(%4G9VU-rJ8vShyUn5cTr!LSYnc@ZD6PQ*0B$c3B-tj4+bn;C~tJpD{}9x&vuW*%?>lkGg< zDYj#3+!FjKV&B#kI=DX4e)@51Jl?G~83x-DI1Z>*aMoYo+g&+=R)FPSU^;Dma z>i<3=tez7CnWY!MEva4y@>Y25GBqgEZgg~j!~0m~6#9U}DFF^c3=Vdod=bSM%rW7H zumY+UYG^9XY%i)l82{>osuvQ__Mi&Ixep1w@1ZWg5Bv)KmWJ^<s?<~&r3Ff9Ez?hrzmNRVGoA25e^agL!48yVW zWvHPQHT4uQr!sxgp|O6X<02##O>gJd3soG)uj6#06VtfOTL<=x0hVLa0i1Efbru@M zAa3XyyvkIr=38Wj(=TROC%ZsI?7=M&kY&g!1g6vUxvJF|>ylNg)r4E51iTGk$Oaf# zy4B`?k_WR$QVl)S$BNNbUF=_n&J`HXzBOyDTQxLqvH6byVZ8v^mo>X=n`tOs)h0hd4uqlJaKJw&Y!c5jnvOhCYKOBk!WaJrRLZJJOh5`u$F~*sEzVt!epcnct zKP9EjEK7U?tB|gezp2H3BtAOn>2#xqb;AA+OgFQ!1P?Khm;vddk-tb;aR?OG8~|?M zEA4Ymd3vRy>w=2DV=5v&gW!8^Xs=mhCsjJ}NsT*;=5ZuN1JxRbG-DjN}q66TMkW(g+CgWS;o zM)_fBr7LgJAuE$W0kVOwSW0{sk;AK!Mc#n=cpv=weJ8{>&1ws~dHwoI2voOMvj$FC z%oZlJBf=9GR#DLN#1G#fp0lzzaiwJ~#}2yC_h4SlXq@piK$A)zf={gYHP~ zfvlQ#u&*^=mu-C{HEV*I24z5dz`Az|u?|55qR2SxvNr5T!xoF=1dJ98U(`7z+&}## z0%HOWo877d^p(=^3+^MBCHJBu7oG>pbuKss3$6VnDXUg6;4sF4`}1!99%OCVdlU!^I8am( z)#Pz|4LKU+9s%eZpDo@oQ1sDkk=!dDWVNAyiQHWKgIl0wk}GqYHnvs zL|4Q=OKNoGFumUf1z^!K;8f{=a>-J!4A=qM@NYE)eIRp@D zL5@OW*Sd&j|0x70Uw(&9;*@nz>rR6rbw=g_B_OmLL3FpQJt3=C-FtOyXTQw4o%r94#zIbYajJ<8KP~K!n3c zFM%O*H#(_0a(Jj71vE%W(T?r$256c+ora&e%~!Ul8qnYU5f6G@%ic%NwQy%`bZ(XQ zjV`y(beTQ_W*~Qtk=u;1HPpPe=MU`1b}TR#76s5f1a|c=p&)XV3G*vn*!smI7kz}Y zhlys*dJ%e1o4AltqrZ8tXo%n8#~%Z8&qkEUs)w+CLq6;K01*4=1O>6|I$}eLK&A-` zF$gd+7betS>K7xB zPO?geMOrvHV+R+&5pN+V#0DawWM!Z3ataEXPDO(gc5O1gR3`qNk(sSU_+%ds#@fs-`;YCO=~jy{Ja01Op# zYUw_`Z8q)Y3f3`R>zJo?e4TYXpmp>nuqhsIGSKi6M+9%#OPbab%$;YXIOe@n zB-jx&us~BdKr39j^N_7h7GWged!!d z6C4j=Y}50dM?agACO8sY@^5*-b_&KyZUBQ*LmLep2-)kzFo-D3u2As+1>XvdTKYVI zLe>_dE84@ra`wt&r7U*K#&Q+T@-oz*8_O@GD~FR6Myc2pWL{E@dU~<1uTCF*j}x?B zGeZ!^K1~H#mF+JSWX|l01mYjYgzi2Vy2Wed9R@B%Kq4^CxLbHJ4L_}@D&l{P#Ws18 zC0q%kK)veWfpTUZJ;=3$xliD>IK>THCD=Z_L36~=qx*SXWN(Jq%la-Lz&X`Lm?+ta zJ_<{QCyL`y;{D9-`_Xiz81FU)Qp=_vm~xPx;rNUIJ$geq@sr7l@9wEN0K4+C=Mc2! zPW#gtBw@Vc2@PN{-^6`Waj$&tK@t3=!s*l{Y+xCEZl$)Y;zY!Ct5YW~UG%yhkh|qO zHR2ZCE!Roc`P*O|t6yI#a};;hUxu2{vZM&>6O3aJ_HyEaI??k3{%Tn#_oK*dGnW+3 z37BJ^c5;oPSOIovAmY~eaIY--zB0PoqBUC33eS4~nse5>V6IN;dxV1&Q~Z_4B)R&H z&%k36!qMcDT0pt?6+MeD-RL;Nh11#qDEGdiFS78~?<=CyISGF-s%l)qC5bgS{S+y! zI$-S2fTZ}s=nK?`CT-dOa44sSi)2p1SVL(MeF-Q+(&0){51jgu*&|Tgs7{U9ZZ-DK z9sdHpA~u{&;$8x&9t$sEpsnf$eXMG=RP_@6MbLc!i>0KxWp@h)p>NcN1gy5jB!$ry zK1Tf<>^Cm}MG}Z%$oZ<&A>Au`KArVK3!s7j0{;@i7k>j%&~Ff2DB}yT#PfXK`8%Hk z%=?h}U;)YpDS9K?q(0sSM-TSny>ruJ_3_nsUOg5^6y3>X&H8vJ-aE&}*F^7Jj1j_W z={f6(Pr{RhZ*TFj$eL&4c0eIuy-ioYAq3VaHEZS7Lz0awm1r@Oqp;_v{Sy(P=; z2_&-{jDrBunCJ`hq?V-A5)7uJ?%+XQ=2J?JvJlk7=$`u=;2KQp5c}vgPC^w)`B$nZ z_uu4Nm?yhw(v9PZHY@)C|Jb5ccL|ZF;hRl5TA=Z`6o-tIK#DJlu4rUl_}|j9@=1U= zdc8p9M|u8?6$VA`+(gqO-8cq-xlJV?b$hl87B~Q5De@w~SK;iZa2U{vDW)z?_kcld1ZA4} zguvedSh7h*4^Kb_KuS(35r9DIgYT}}JoaZ|S$~Ce+{UR#YV^13g^r6GLB~lL40s;x zaOV(i#WKXuE>@KZc<@;6TlB$hA$>jj|Ja{J??bRv00+e4qdGOopQm5rdQi3TLUOqd zZl;0q!*iP+ZV!x8X)_oKYK-)$)s~kzutc>EF+JE?-$K*0eNU-O-7ZvKibnG&(L7-*{qp+*&-so;@>2{oN1SFh2lWB z_4T#uORJ~g-`%P&!oPb|S8;_+Jr^b*VcI{8yauFnpmo}wRZ>>X5mNqycJuGXyhhl@ znCRKY8waZ@yB}uZei0E0XEuIx?uF=%VhRTg4h2yAUytc1=s$)b5o}-ON;|tInp^i< zlTmnvO^1&r$oq_~EU{)5ra+f8RxRh5*cXkhz)0hw~GivtoPPQ&6U8+pSp?? zMa#I|C<(~1Ru2ec5U&9gyE7)Rwmlgep;|P|B_`752Fch1IQR>}h_^-?dG&xM@QgaF z=nGzA3@pWd7Xa4tT{(S2F*w=qt5^mW+64CVoI5g3#j29z7dfl)5#W;*4;qnEZGe+Y zIN26#xhw@c?Ig%IvbiFzt8@V)^Gq|0f1#J4a;~ZK>aN(yQ4+;1ZXlq`MA~7(#Fe%# zjA*Tx1c5u`C$_k&!vOE9J^u1T074VYMw6fNC7rNx)51w8fC&{f9T-s8Eu3RN+I=79 zLbyr=PArmH?1(z)JF0`CRAGS1EWGrp_G7W`4;iLj(KmUjIMw4p zalh#aR9*j)uK(qm19xF9E>N`;`c?=%rKnX&TBM!hl=XssYxIQ}u69Hd#Lb7d)E|ci z5y@I)I@5u?U5eJd#6ZSv@=%j(kBtzy{tNMw3Mo(q?i)ekL1E&utj#$xOk7|R(fs8U z2OrZG?QOQ!?=l)rkU@?lw5HC|ft;3D5|q#+%8|OndQgn#U&_Mvo1C?vKXt@AD4i1c zg@0G#xf|)&Qneb7J|6qLs;-WBx+ooA10jpZ{#tIG;`d(Sc;$UGoH`jqRQ);jSoWZv zn}!9Tal!LIycA*I8=WhLDf`rOMn=Im2@BV)+gw-Mfq4gkNZ0WB)mSGJ{t71r&bKw6 zx}8r);}hnt9>QU@x8X0B=^UGQ%9p|GDupj(ubOD9(M+_c6udQ93O$b};4wA*aW|eEVP)Y@RAiNMWS@ za;9j*dv1lz^B@PIR2AHsWUHVuNKsh;u#2QOEReIIj12CDHSe6ZDkrJj1Hg;3IgSEX z-2Y2M+VBE+<}TH|hq+K-GxhOnB5HOXKn0dTYoXU+->>O?k^uuG!2Sy&WM$drw7F!} z<8YhVtfv9G6kLUZ_7mV-0rMS0Tc9aRQKuq;>?rCwqF#I76b&X!$cb?V*{I<31u&lu z^6BKnd@FM^g0{3jJIq+dmXwV3?bG?~7I@!GL0NdTHH_iMcvx^uP%s&bxi!R?aYUFg z=41?9>cn{@Gk*9tOIxte%5VMe&U_`zSnfcqbgQl;#K*#nl}^SI5W&R$;mj` z%{ZAE&k8e6b}|lkGY)6QL&A*1nb9`yob`;dfYRgTg5Kh_v@gtUf?lc%Z@ANncM|5Q zKupTJkqTXhCl=NFAbiXi>|)K*o24fe--4c0IR_rQM!FmX$<#c~)@8(gQEs2`-uy7} zOhS_r$wq=U9qu@cc%GC@%D-63YJ3=zQj;qgI|X~V5Oz@<-(PJCZkfb_zQDj&SUiXE ziw)3yRIz#)KT^LR$DppL6(MLKbDqGCH!;66~cQ=`cLL-r}jJ&Oj~BAQK!}V>qtJ6ix}O zdlKmt-bx<)2esB>u)tL8fAE2qQm522lA1XNkMu51+`L%%izD8!hb8UTuLX6mney2@ zMv#opCo9fD1sHAVx?#kwR=#L4kqRn^ne++X%F}6FTKIoLjA=gXKj`5Rb%c#TUWL~* zhw$J4vyxDcr8+V1=VQGgAH??s#DsQa7GIX-zZ5v@So-#m8nQr$zR4f_0ZX{|CU9e3UPnbDX@N;B zZZ5I;?LBC0l%%w0eNPGSYxoIkf&>O|*4;#+%%Qu*=kBY5NOS*d0AGeGv4motWKLOJ zE_njstngkw9mi{k+5gE5>7EDNWIMu%V%`gvV96r($W&CGNMVJCVy737LSnu^lPG#nZ!JRUuAC*0EM(3%-wBljT)*Um)cD;gxXTATKk1G9=b-P zUm|ZHsF6t;de6Y<3+=Lbx@JgP@=8-Ci}&9rmt};lEYn&_(VssV!8`?7Hb7bSevM_> z;1)J)ZM&r?R$Jl0wv!{NOqyY(!Y?16!^%^Wf?P%A`4iYGxNn5;`uD^Jar-BWFBjB= zuxP_m*bSl5i-KKOlUJy^_^Y|-2hDvwkj6~u^=gazgzw=-%qiSbL1QU3uhMN|=|i`^ z-mjG#kC6h!-CqnDd0f(zEnX$54(p7l9iVl;5Y+uTER6h4GER(;Ep(E@a&H4Hp5)X& zC8+=8pniK@Af@JX@8t?B^j$y!TsR`Y82Yg#{twk>XySK<) zA|GHKq)$|H99MBP{*#X@<}oEH-5y(%cSi!#)wIXlI7Ll^CV6IWW!3<6)bo=mYKf#w zE21l8lW26sVwOYBIg(RkNV>?xvvIU*h1aV+_9EbOD$LN-xa)wRj$U`pQ;7jLr2!!e zPrPM^no__H$$m@Naw6Gs z+s*4X<3u%oymh?SwvJC;f+2{`qbiINHC^KanPMw&`d)#dhqgpTB_yAghDiQzjqtC( zTSzHa1Dd8s0!#L38NQ_d8jBg0^CI)ke!*4nPV*}~LC2HAVyxB-)v;Xy0&9`gm#lWc zVf0s!AH82#kVv&MhybJs;;F^c!>(~nWTFgjXp+}W_;ZK<0p|%px6SU+oZYoKTiTo* z)|?&EoE_Ax0cucgT^#OE4Ib*-OV}Dut4l$~LCz2An0N~Zji{W-(sYUm84ns19MEs(*E$3n6w)^t@`tpvpP4>bVx|f63s_gAPZ(1 zlQGj+fZ5Ibd}~uDd2saCwnyYZ4yar@1@-c!yD)~e{TW1}@1Ayp2H*)pGLyhnpq|^Ag{==OzT^dbv!c%lurf@w`>82%X4tJQgN6P;Bc$r(7GHJ zMTCgFbx(-Yvnx>ZDLFN#{hM!uE{s24U;BKddNy`>5>1u&+aT|JldYds2COyw39KR}NZx60Lw6Oz&_Zw}TJ7Pi~F^94!N-`vjn zHH%b;zQ{#963X{vtSt1h30$IP3W+d&1XvJl7|6v3?iw_qy-S%$NvjRww?MofhD>3Y z-T9lg$;vP`Wj-QQ?M?FJ5C=@I5S?v_@#xOqEU(@9Gdv`pH=7xafdLUCp_GFxEii z)MyMa_mc@~Sl=}E-u#Tl4i*xopdwVWM^H^Us*!TB(#$7lD-$6O(2q(d1>CPFK#U_^ zbEWE19KSh|Phit!P;|%u>@Z%UekhCh+RSs>>|Av(OXxBqaH^wCg4aHQSR64R-hs1L z>!=g>sFQ~3VyL~gQwS(E`hsbK_p6Xo|F1U~lea{h}zT~1O6tv;!u+At2slt1OX5RS~-s^$UdM0pFqqP;t z>Y(@rqapi^E|IJ)qRzoO=BXSVN9dnSO(gA*RE zpJW{yB>EiQhykMi;@txcfG!e^`X8PGO0E4DT%J#sYxaDL+GLw%k^o4t&Q1X-mBB=Yb@uos5GZOI~OP&_7=5;D^N(SVqN{Xm{w_ zTn*olw$Kl;HpXBP2~7&MC5dX1_*_<7M|MI&6NWOrqdgE5!3_+CY+R%zyx=0bY!^}9 zrKazL!E~Xm?-p34SvncJf}@uYy;H=|t%zfceNV^AKosQPSxX+M68!I4hsF*hk;E3u zI1Rn10`ZyD6YsG$@hxf`3J4#{ceE(JWaZh$eZZ2^Pn1P0&tq8;i#AE5wxo9BT$n(4 zh}KeMYf45ALp&$0P*^JCwiP@!9&u4KY+2=wXG5*8om*TDXXTs7CqnEBU z2fl+zl*_OqzG56XL9VCM2 z7Zk%guCN+&ej_9$t`G@kk^{yy6=OMIK2SY(QUK-xfH7F3A-Rr2)TkWJLO_VT2J1K^ zEq|ateW5eZmq8msMRR(Jp(_X=8jV4;?P>4_d zBX&X`u^I*QRqX@>{y=4Br-Am12Zt;q?HD$t!B1s+z``Sy_ERpmEWCu1bmj)!dv66h zhpe~~jpZ*s*Wwl9s!2^o#;EN=?=IMuIp|?MKr5(&TM65x*tf9@o&8CLB4;=37V0n{ zjs$J`-%$k#-suW-U$&by_A2=z{YvT;iLvei1PAmNDWr zZ%9iwUWvqg@fj{c`auNli=|AEMH_Ripj`wQo&5$-@X}iS>B)7QmybbS-LLV(CBVkh z$kF;`;z6(3TXXJrC7c%#dTHc6^FtI$O5GUHv}R7SQ^WTC)8@@4bhKjyyv-5+SX3fI ziU~=r90|Vzfp^4?MIV(%#Zqn^m-k?T^cR`56qgJN*$drW+_y8|am0-T+lpPh4+%?+ z``|Lm+o89Uw_0hQLA*cg+q~AL0UT|(oqV&ho-Dpss;TdxXYg>5l~_5v3%4*CjVks2 z9BK;n-V)S%|D3Q*TN!NyfdQ!;bfs+@Fc`}-mNC^ul^VVLj~pY@eiMW$Y)m&q2dYZb3|FSY#GR2Sk^7UD&E1+Vol=hj^=69sNfh&HTJzH~#C z^ddj@|Cb|xkxv+tjzv$R<@+zRK-=eO_NPW)c8PFhAdv7sgzPXY^uR~}pc#z-UT4h~ zgx{k^VlSES_|K7_TZUvsUXn`S>V|KK9ToT%e>_m>rzJ{p$jCcSJX$Yp@)$HK+T_nb zLd7=%+FibqHZW6<=a$Kj74+j^g+b7Zt)P#krc}-g*HdhFbIserCk}PJg!F92jh@_awpS^Kio;V zkYD}VOn0jvpw-s|)&G6At^RAd)n_Ltzk1*nySh`IS*GDq*x`|?>ES@#T0$h@VAbEW zKM|&L!nQ0BdVhod@>!6P!u5(=!%_vl%^0p?G=pyMixlW5(_&g2wY+q$N7-FRW=?3QsUmUe;g%T$WdH(|6W(Pw&(F+2`C!={5 zY{|1Nb#{Wmolu3pQnt@W-Rg{vHqeFC5no=^5nn+q--%gBE9PFv(QRHQ=_|tbcr*JD zq;_-HZw=z=mUAB3lb5&xwtjrMw%_OQxI!LlCa>VY?!Wb_$VIyX7t-5x28bj&&hHbK zvYyn?1vI#O5IM-G{<{a)V!_E>1j*T$z7ZB)Aj9ky-FXHGNs$_4kYa12jkJ%Losf3` zWeq^4mF~YcPmqV6gsub&Oi#K3m@`dFr$%2X>q}{WhOBxcE2Qi}XicF)_LJ@kq9l1I z7*VPZ_GKq1n!!%cgF$Eocc-A-jhH`3Ql1&Gw?o`Zbs(;V&I7M%Zhsn^Q7;dvj{puh znfCvtxGci^B9dWJNEhFLXa32;(Na9seE1wboM}GTlj_|0Bp3#F z4|S;UE+zgK)K$vYsp;5okvu-_txt(mbN8+05ofK{BE&7wzGY}4bo{u#q73O=#Q@sQ z&Ak8OhwH3mX$U?V8z)h`5MO&lHz=y_8y~%s10R;wjf*3ZD!$=~ z5s~D;0SWlpQpK0!1z|p$djLSB8Fd{EcWd@)Nx<6^=zdvl+%}(u&Hh)hsv|RgTj)B> zQ?tj0+5C411^#kd&cBt4mfj*;dD3R8oRsCyTelllga4t1ELu6Cq zMm-6u`jHESAs`w}%bOrpVFyl^9540*7P(!EEYTuS7P-bLl4@$FhGj`_i0~WnE8iEP zkV9|4L`K*1$OwCtU8?xEzpOxILkFPCf0cQY#b4%6YV;ed#m*{sdQqFoZ16CUsLp(q z_~TJ?A)?WA;<17lrTvVc2RRV>AP!1jPgoFbZ92Ay3Xf})lHZ~6$D<@f;;|^^TK*zx z9%4kS$iM|DUdVVKPMmlIDsXlQ;AB3)lTBbVT>m5RG^0Gd{Bdc9EPnhwCeeE76E=Yp z#WSuR0dND!I&=T`%qR|JDgGs-a9j;Wz!`*AMriLVwA~ciGD7P-AKOvq)UG|GNM=+Y zFG99n&Bk+g(e`gL+hZo%FBIAv%=UN9)}h&c&TO|J8~Z|$o{7koB#OVnRFx>=5URD& z2JW?GmA{BY@B9UxSsgB+sv=kQ@sR z7(hQq3D*0Nd=Tl0ur$uEefX5f>FC3$(T9-qJT1u9%}j*=xh?Y!mJ>|NWcSpAw3HuLoF9A$v`d*+yI!QkpHsX355Qk` zOM0yL%M80rjlM+dozHr|fO>gMfaUOy;A3M|*yXngy!B0Up26ZrYw>-xcnOQYQ6*^m zXeS@DjMt5hqT3EG3*}WbF%m-{-j1{NsDc~;>A#EoN+<1r2PYNWv@Kv zYN;Mg<9@fw(y&LfbJ{~r0RD{!rN(Fj<5=g^ZeZ`c4eN*KZg7Sd&`)DuQPBg2kFspC z_#XTuYd2ur^%1J2vUZk>?s?Ax-AOndCDnQi_o!_d_&YBLz$+B^(emR!E_ESqg3C4} zt(+Xi!9%!L4RIjjVQXM9jz*n5>kxo7b5MhJl8W;y&a0@ZIQN{yob}V7*Am{cZZObWyoUeI>moBlLL1xV zeO@PiTj;hrxGxwrCK^ zGx?{8zo-W!)W#Ncvg|^9QTaG#nOrc-t|rUg%rdTEmSU4-BaY_C>|HPmXP2yK4YO># zp%5;}Az6OJENcp8flNu3yP4%j1+!SM*R{-Ycfl-!4U`14Tw5>;50oOh2Qy2eU>45G zm}LO799%HV=S-GAz~;&fD3}FDyb6@1%<_lp@zSr2K5w!-z${A(W{H|CGnnN8%_7}J zcJYRdzT9SL$KjKx%L!4k3dYm-J^L^7v1nU7FS$Wsh3ne`f*X$^YwTKJRHvetst zZ%O@TR99x>bwa0L=vJKhz4IY}pgP7@rrOU|BbbPPNvoB2+T%)6qM|1P&W;B&X2%1^J!L;XKjB`Cvnb2(ME+>9!d`Bf&I zR_>28!7R6`?R)|_&jt0AYp8haw~Nr}n1*MKDLE=jxCjg^P0w=J*?5!6t+EGy&!U7YvUf>|NhToFd5l(^sh|)RCtzrhNcyXG;CPxZY zEa`9-wN)WxEVo1EL&uT+?JJ6^+V{f&Z@4&nu^fy_5Ta-|}e zA(Yxom-8XVOnAZha0JEPmUz_pP(XtWSFELD_+Od<)UR_3d`4~!Gdy_xVgNeG0VF6T zQXx1;yN39VCQ#gtnh69y_C?Lp6d)uPHiR=GDswyOcLG zK9>=sH~dHI8c?XNgKS+pxph^BbUA~m%r12%I}GtgnXW5BR^+z7^I@xIVkYI}lxBg! z3O5zJk;c}O>Sc0^`$4KPAuN_L)Y!B(7kQmuQuuF5E_X}b@0h_yv|~QfuO!lRLY?*- z+>)*VeMAh+nO~A=w&WRZ$%oxKBN)H)OES%tEOkrHcT3hm6tyJo9JU-n8cVhTLbx~L zn~#83gA(a>S{#@HEO5a@iu;3MT7NJH=Yd(|f}tkPr$e-};d%l~-9dY`IweCT)Xr3I z9{0^zf>KS9kK|2eEx9ujzST(ZMV(9r{Cb#9UEJHP>-nG->8kCzoVinH&PFZ@1+;RsamvYY{6I zK$xc#Y2BOw-4hl~@;2b1Gw6e$D#nq?5W-0IAoDKAju$`uyNZbS1{@cq5_T&&aiCK` z4!Uj1ASOopn^+>jhTW~`_F*9gaG)u_6hAawBboc0?9TXwy$qf*%1dc~y=d51#6M-*ULJvEx~JiLJBH< zh7!}%N&)At9`|S{1xclVC)aqOE2$JDl>!fRd7vw)6eN`b4|I8;E2$JDl>!fRd7vw) z6eLqZfd{%g(3PAg6rlNqkV?>$n4TGNY1o`QD%UF!6Yd#Buw!ujsf%}fuD|t7a((p< zB+6TbetXVb%_11)i7-r?1)?sVy3@?8Qurc!?E)5{0=1Q@ku*0)AvOz znKE66@f|~}cb&H*GCg;mFz_nsmxVi!s9#vM<8%FPiOw_glO03Y|AgzptR1|g8jgEn zFNGfXmPg5d?O=M{**iYhAG@4fU%CUSn2nV?KGzSMLaxh%cLy;X=bW|Uaow(Z>tRa9 zm9T^G`wM68c>I=?3-xR47{lhm@jD=s^L)uYSU_oN)R5vGgX_nAeaGkeH3-CRYFxJi z4V&$!hg_Gn$p1!PZik$7h@CVl$;tm()9=Pa$ju$q;C>2mKITA4%kckp2l>BF3)!Bt zigDMug;p_EhuMQ`E>*I)(wnmyGYZjPmJ9z!VyEi^SQp3~8{(BPEXUZ1)1=2*6l8%q z4`;Jzosanq*uR>^8cL4xkCk``fHp~7Y~A>lvlg`lNC(SKSf>z{DVjya{fC!ILQZ@s z9yX|OB9CTSj1-KpWS13?haDspVssI*_TaUC30{#SbW2j!zb* zMqJ2;WSxA#A=8p=-bnr=Q~D!`?$+wT7XYe)?1+``6hOB@GAg$!%cN@M$@!HE3&Y+Q zR9~*ukJ0M&r;&+n^>;ycS{gza`K!^g&gra1pXeYFlzNf8Ys23#K44Zt7^yTYHl#@K zIom_>GI)A-n0^5g5;oujv`EwibcIy{{GJ!7%XkQF0Of^58R)XR6HT)D#IP2uLVujQ zzUK zPR8zm=LnX-{seC5HtG*?y~y+8q528?kv~j488A6!S*Dpyt~V222XbX*pXBi3vs2cN zkS~{eb%$t-(lL zRkhsz7K|dMjPOEKh}T%Dm`qYk^hXk1OrAT3-OddBp#rT#Rkk63+KbffQ0uZZw*t=* zzvC3A_AP6z%dmCR0y4pVPJ2mUSiesC_C8J-wz1ph+wO*p%*s&(A}0N6*?mk{3wYg^ zs|s#AF=RkaK;2a5gHeHIe7;M=k*psoZ}$a7B&5Ub3j88nAv45*z4ZW}o)bd!wjhX; zwfU!M^XpF|6W!)tG%;kt_6y?WsC_xC6eEalpA8^+qoFH^(-o7Mii!R-GSS845W%FM zAZ|RqFrlIs*`}sbYb@lPYKI(Eod)9nnN53Mh+v*I%XYEYNetMp4kmV6ivb&)156@O zjW%S6tWil~L0}uDX#0Ck-WJToV*?HX!F-rj*@^~3%$(XMhZyKb0eYtT-vD4n9KW{$ z0FDU(=me;6KVW<13<)_=aEQwDP7dPhr01DHy*&c`LI|LdW>c1%2}7e#gZ4gHY=ic! zQ9WlJ%W!vP9&Bd}Fvoc8eo!b|LFW`zn;RIJITf+*LFF9xH2AJ@rfeZLNKx~Rr_y(^ z93PH$b&u($zcM6X%neQVFE|{@ooZJe00=930&oF^oouBt+9vQHNWWgj`;txR?}IRC0su`Le^d;v91Y!v$sFW&KNt1I!=t z{+6qT`;KD;PD6$bClV{eCPE{-oP3gIf<9w%y3LlR2@krZL}RJM$gm_}q~Bh<7qHF8 zG=>=yFcSe_aORmVEa8Zl@X}c!kJ4Gsu0(G**v&`*(BVTRF_F5Zghv}+6UqOt;zdHy zohtHZ489J3=zd#ZX8wfanbG~2iTd*i%P&>qlu|DYwh$1P%thfBFblEbI5kO|3W_;f zELhqUC!!pu8kq)_CWM*{j=;@nXh*EV21)x9WQLh1H~Fp6eyotnCTN=jT!WaRlfEo% zSt?^uPIYXG#Y}g(oA!UtspqzMG*PP)=?Qd$yan;qY7S%$b#eyZj1-w&p<5du{A0o< z%rQ$|b3XhVaGRatIcgUXxDXM@_w`PWU^Z)oH}xQGA1je+ApYYpG7i3pW1W%(Z51;l zrXG-1^i0=XY|C#rI;6ROd1t<*(*fcu=Mhy4fILCTpV5BL0j`5e05C_tq!z16DK;E|;-7GBDA*RcoTeu(M zSLBtlw&*!qEpB@j8Qm?BmVH00JOIj34T752 zNKI~E$u%uea=r{)1^3)wvrVS+h&=c(*Rb1xIWpHm+ke$0+YIFC%*%eUU(UdWb~t)H->PGM)D9}eA~il|Zy>_QZw#qtO+&GbsN02TT3qD!_8+;9iN0-1Fkr`K%{ z@Q4e1JGLVZf6@x-_H9Q@?8+{*wVB3j46#AGh=r!xB13Nr6Z>}_$;yq8#SKqboUCxq zS;wz=okt5`fS2(GY~wW@X6)fNJ)$NjslRh(<}Rd1OQo7zgEx0<$~=8YKo+ziTPJgW zP7-R2WaflP!H^<(r{#Zuc2=Ewrt_t6|2o{w;Y@BxB!_4mNrJj_`%`RK0ZDYpV}JV9 z!2wM<-kChWBp~QNe;K+RfNyaCv$OO=(DauFU10sp#bX^PA({O<#<^RC^0$LRB6CNx zHO`m9bJrg`IfAmX8{3GCP1J$5-pO7Npp`ULjCOn;?-Vn>bUQ3rHAX#a3*(SHbs;%Q zxHL1!0a7SOP<+cZlx9{P81ib%`2tXd>M70CIzS5L2#RmHhSJO!2Z%AE#TJ#Bm+h}P z`?!;5mm+GQ1+r=xC0p2YbppCesa`+n@dKezO*A(<#ez;4%<`T&AOxy2M)41+B+6uQ zf37^);j5n@U+a_?qQjADJJpu>7V;}yIKrvasIVNCu#dmLe~A14Z{2gqCH0Y%Z%^Id zcItNc2IJU*$EmWXk%`0m~gOSeSKZ}%%m%;1oivs^I!hRjBtje$heN8gy;DLME2uFB%m0aUW5D_1-NUzo(x2}ga;zYRWg)xxvDY?8#;UBv@X_r7IL85Kd|uk+d(V^>C~+Kw%44Rq zm4(%OMXLFk?J`C_g0&T0ZRV_}&Eehv6l#kKkl$0XKloCC_Rja+{~C@xTTQ|CR)8{^ zJyr-{J~tb-1@QABnU&iE@R)4@#Kh1x&*o7DNY2Ob-95KK@}VKXXSWC7z1so^ca_EP zlI;N)+ZI6hH!Q%R+XL|ZJ+?tIT&Wh|Pe*PC4>UV!!KF==9-I2oN;!YIuc5w)JupGFpI!$4r6UAaA|ea%HJ zKUR}MlRHypjywmStlv6lI`rJG-Y|cg^jx4BdnIE^e;QfLrRRPIbmg-;e{{JCWAXN| z+W6DDw~5+v^>XznYWma2Vr}Iit3N)l0BZSC@D5|GtQG&CX7!$mX6H8P`P=6N)h?w+ ze;QfLrDs$jdh%I4)S*Xa7-kuv-$dz8aMJ~Z>x9J7Od>xtEMV?i(fywT3h*<({<#j= zoR~I9EiIK?&uqu&0wD97Xsin|7lLt}-sXboN9o6~T|lXLj6h9fIU+|ulQ{|cJBXso z{6@3%n|#Qu#vaEGof{Urn8m*D78BudSSV9MX9~mbIi49dPp}#;3`g9W9;y8zy)`Bt zq{A=UU%1pR(y>^7gq#;Sg)!OE{#cj*nW6tbD4C@_taZ!u&#p`49@_Xp(ymApTqVJb zQrmd5u*}?u&(C4HR_#&db7b9**DE}!v@5=0yVu>1K=5DgZ>P{hGzH* zg&*@snbiro|2L!)!j=#lm|x5W^?qbA_p2|W9(}_=Hn5?7Y!G*Ra5g-oZca_W1{1Gh zO8AQ1)f&zV7d%kU(g+2aZYVf3Ou;nx+UnF^Br3<6RGLE7TK1JYO0u|k8DszG&Z za6vj(ov127VW6R7y4jvyG!X8pvGW;TiUz{VcMvv=RW|6)AZ)k^E98YApr+4;|D%EM@YFyy z{MQD;dvtNXEMS8f2$>Qd2!DHmkRn_#JPJM~pFt>C36G;tE_2F| zl7v0F|8)8#qfXI4_zQ0HavDn&B>fo#q-7Yw3t8AB%T!$g

s6Ia*~behF-5;rvjU ze!CEK{XRegQ^XQ~Nm0rU^oGnSUFk>Hjq=`!?5E^^uOD4*$a`1Opq=@oDf0P%LB7Z7;5FCY`p-uSI zZ}4$Q`PA+|Cg3xuLpf8-j=O(<`F`r#hvGA+XLlC{epPYKf&RBpokkCQ9Pr)687vY0 zvZO2JVoN)|@|PuZ&I=HXTOE8RvvDK(n75pN<&&NJ>+>@(6xWWyhi)qf{MHKm#{C5N z^9X#)Ukaw$vnVRx3XZbqc3O0$7QK)~>rm8yhR@Shl_Z_cW{Ln&25+$;e{kuLsZcNmHObbrhNH!?lZac=UPL-!gBKGjCO z2N~1Ip4auA$!ASId-8WDe{bODzh!?Czy0k-|FEZg@3Xc7-*WvupWW!w{K<}6e|YF? zvp@M3*p6M3{0wT|TihVsdi}nM-7We2B6R3$v-39gii$2Diydvw;yvXfBa6!9Cp!v1 z;m?%z$!AJgQbBA?%A@?Oi4TqB8{hNK6ZyoZaq$XEHRfUsqL}TMU3pRM_ve(K zmt1z~r59gXe$jc~hmomb8E4T9{Nx*F;_s#9d+aqU-*_$_FWX~H<1GC8Z2`ygJ}f|P zrXtmqzx?QM)hJg0z%#xPI}6{Xt3iG{p?CtJG#H{+-%CD#jjIAswvoBZu9XZ~-&;8a ztZ@~oEUrA$`ZzePz^#EEN@L!r5?;wk40|raurAGo>kX*z_lRF%itQntD@(38?xJ%p zzOd$k^O8^1o>zX#^l9anC7p_-gDKOB+V9t%cj0*#)h3;qvNiaSypoi`epk9aN^q5r zBaekFEUQ$ZU%QX!$C|?+^r`g)BBTskB+Me~AqRb7k=zL$M)1k!LB4rhwTDXK9+1Lm ze0HOg_>&!X8M^T!iX$eHehDuhF9m7ju~-D|yZ$1m6?JQzn)F2RH{O&@RSi=$uk!!m!pHi12JM)(FRLojh zG87Qt`FZT$p#ta^T~Nhu;L69q-zyiwZorSbn3X2WC&8-$luzN`90@(2=1R-iHh!sj zkT#DD+Pq8KY{HMWws*L-@1r%XA6wdKz}GE4f0#$B%*({*E$3gtfB6xvq-ej;q7*Wc z?sBrgT_l((1@*&*|rcA<7BqVzTkSMyijp( zG+a2wZ~Zyi|APY-1mD0BuJPN@${m=FuVD-=Y>VMo0prjig83=z_OdpWi0k(hi5ShH zg6z*{H#(X>*>Ue35@KKPcrh>p30UC{x4i*Y zs9jg3+g+|ezl5>hJMCki63{Ea3iT(kG1S692^fl+4mp3T=U1L7v60$cLr6F4T}*7) zsAoXOc_QwlXzgyciVGa{D@^HCqmmOkV>kR>T#x9~-2~NG!?OToP2(@o;CF!aI3~N% zz4?-7m%+F)p|}xXM7m!8|HPDsu-~qi`WI4er{K3dUZvJpm(8Z zg`qq-Puh}*qTw}gm>`Ll--h}w>pLs;dx?Moa88| z?EEfzwyKI26gD8aDYjqY{Y|m5Z4U>+n__3I+X!q1qI=$aKfD0(6i zE*rKfiSKgs?8Xw4q{LY(B`GO>ELf9D9s+|@32#Q@-SmK;?l9v6Kj2=yfkaYcb^KQR z<^%}Cq)o9AAdI0>%fSJa?vQ6tX_prQuG}PvN~NpqGk`TL6x&X-m^e}u}|aU7}B_0J4kTLqEn>YhyY$e>dXV$^jb z1;2@2{C49PE@Gk=ZD8IYZAC!im6s1|=kVJDV41Gc1EHd?I*fy z`{ihZf(&UwV~?SpV0VFGygT{43f2(?DAqnxGO9KNtg(!3ill!f?M zzIk{`cz`|8efcmxclSgkNlT50j}6!DwRJ04w~qyTS+`H?_G;ZeTerfR!Fe0oh`Y0# zlZ5`>US7O;$}|QQ7I5PgPU8i52;MOTS@0{30h$s0nbmmzv6; z!FYEO=OW2-exF?V#!$IjG|}eD{KU2bvPlD)NwIGOawH<V=$=J!YZcz=A}7eJo~bFcS%#;8KgeS{U2f8cbyoD$ZACt9BoiDo`E(~LB!8EH~8 z((G3;_Smh4Aox10qr$aY0p_$3f2?h`=yk|w+sP17%h_WB-a1*ho*18zWF zS2A7S6^S*h5fUXl+P=i6>H1G2*Bp;lJoGc(t^U;FoqoFvCJNwFT@u|_anwn4BYZZn zs5qltJb2hMZLn;%lIR8;V9kJjg38PUP&!U}PE~~@n4fqlR52#?f&BbU1tM<|U7Z4= z86ukMZ}QXinMmDMvtsY&3TI$mga$IC-U(=c&!Bl@u5McZ8136@bfhrOltDtgoEWDr z*UF=Vj3jtmmPjFY<>gZIBG&vw!tK&xy04_}BDT&}#+rvDWbv$(@5Qd!_AV5k6+2b@ zk6+63K^>P$Ll?54M@>Vh%sS|a6>TfFxhgjIEQjL4JXXjjTEJHrCUN=NP`nLxxz$2Z z&IH4OHhZ9$R3Xut^9h=wNa1YGyGS874r8{^ih?+HIc-6#Xe+>qzy+W}on@S}5ge!d zPGMC!j`?F7Ym^cX<6ZzT-!l~V0tqtMp%Q#B2wvc606?@9^eJqKUEczTS*p5)xwgHo zpy*i~QOhbxK7rBX0E`)xwnb9$JQO=?t$Ho@bzw!X3p* zM%S8*N&<>V;aX(kp)v&}iyn#MR>{64&rq`MSRO^<<%N^Aus8kIx%{t zFWgv?uHP8B^4@%+7qpG^RGL0u+j~QOXxr?(f5xDlbv^|bHPK63h7MuNdgtEfkHj0x zfF!_;9{Iz`5jT?VMgX&RKfLcJ@93Zp7l~v2YuRpC|5^h-dIcVI!Q=+4z6p{r0LN4y z+-8P%H@d@lY|L4;^6fDtoiFt{@NT0kaZx-Yw$a&ma3kmEJQ<;PxSy}XfBNA^QtBMk zlu}nAIUkuRWulY5&lko?;m;offAy&j(8v3r6U#->g>Oz)fHdymM$C~l~PEaJ$~de zE~?|ODT7$M$u&iZ-Zk-EA}kkM!l_)MH&aCe)*D+A-)>?_9hu|F)mw>Pr)p@=PVycv zTZXMWk#t`)b|P3RSz2(kzEO_6*izQ+oh6^}ARzo^IzV=+W-{B2k5n(Lm$VZ=%fnEY z8>mMw8x=r3o4Y&E$eQ>!Bc@UXD%FRAD_*bR&P4GWY{qgN^dVhP?+sujkiR;1G2Jv z82AR^WmIpCGV^J<1BjDZ5T}V!B9CrL9^pFHKmt!ZS7p5f*us^rWD~uJ0FOl8evrG^ zl1M|YZfm^lDJ2nCcZ8sD929o-o} z%i%!@Hzfq;;Xa(-G;mUN8gjA5M?wClsBzx!We4#Zf&_7B)(f>LD5U%%*=}aJpJJ+z zI3he&SjI-zu=nu&!GkVUYAG}8USuA3Dm{KZnL zi0}^rTCv{W_Q8He7QiTod2jif7HnR>E+9r*(61j4nkbWbHD&3JA+q@_`Xa=D!;(9+ zllt$TJQTVFJ-QNlRM{I_dfYa#rT^sPan3W-ve9ve08y-def$(!j%@Dq6`?7EcXmo{ zYtyy=wWeRI_`Iei2Bb0|y@20kMkXW+gsp||)p@3-$`t;ly5DsFU1Rbr4M(>tV zlbwJ1omALP4)Z(t_p928onLR1F^+8}je#U-ea1cf-7w=|{caK3IIn^!Fs1<;8V3{< zqOo8;!I@K}XBKNfOgqR!U~;m)XZQ|pX@J2l=|J-n8*;V#erZ8UW-AVWr4#Sd{P($$ z35oaT-o(cubSUqE9DV^h#||jyqXT}72eMQy^5Y-@P8nY=>1t?S-_bC*eFw|nd4CYv zV+hK7SDYG&ST88OvD~TO=q5Hs>BKk*`i=+}*@0?j%(sL&>H5A%-Kprm{p>&nC*i#X z)+Z3SpGmF}IJf$J8Hm1T!Kv}V+4PE)F^p`{b4{D2z^MZ7r^>rq`92i3&zGpfZ8L9- zv{*fWW`qXOX@I_;T&3&1NG(8ycpb>>qzGB`!?P3tc19QS@AA%`lz3O5bumI$``t{n z-GF!zSoRR{=%qPz8{n0Bk-C_h*nlF{uTrI7en8%9$Egn)TMCZI z;D#^*WOWF|1U%SLa{KXM1V}GfZTy-g-bL#y4~7py z!?-`Kz?2~AROV2o3nc8tZ-@GausgV2RbbrsZ3@pu<}oo$aHdq1OAojmOUD~Xe>EDT zjpJh{@Be*bIw|Jlfi=JN<7`SgeeQ4v7iq?aCbP8KTzlQasi6Mqe}E?sV(pbOAyH< zdQ$a0Thtzozh~E0;BQIoe)t=$-4lOLsof2KPp=(?ztd~C$KUVNZiBydwOiuvNp#Wt z2C*05RoDTMwm(1&j(ZLgtT59PB#i0$T%>k;)=9dW!kIRS1repmRgxceWJuy`z^&$f zLCSpM9#E7**bJVG0`FQe%;6ch!$Ibvssk>#lhN{YW_RP=!+SZNF+eh3qHU;_(!CQV z7)K6cNGg{h(wil_lS%eAv$WJ^E|!xd7EXIp(H2Drh)^J~e8pW%Y~G5{{RxPWw4!U7 zZ7x?zr#gvyP_C6K^V*4mO>1mPYFjt}u+G~sOD%QX+@u@b<&3~M9SwQ`^5|w5lR!B> zn!yrAIaJ|y+}^0hOJ!CyPI*b}iuC%b_9~DPif?b0ymmexcoM>!`>SB(AZh70dehIA zWQduCQfEB5Ow|zv)>Bt@M{|8qK$lB*56f=TNG8RWOeslszqwUMW(o%p;#3`!!;`a8 zi;M}1ENvRDZcq*rt|6@D%A6&q^uybDB;t+ZHQqoVzEP1{;W*5REzJQ1?=j3yNp`k! z7=A(bkw~u@fo+45E-Mj~ofJQ&r@{(0YH(+bu!2Iy0{ogD>2j#fD3C!BF0T;pBfCVDeJLC|YYiRfP)njihLvCcTNce1_*HG*lGK`T7TiU}+@|JqE?< za{Y9f+E{$ebj7a_H%N5Phw!F#Wy0URCjJebeEGxrOmq%9*1^m`vz^M8{zMWM z#e>m@TyH5R+ei0+ZzLvpa>jCtw+vX;LeB5Q>ut5dxmO$ud=>x$PtHu(B+LQndXAhv`* zK>X@%03WI&sF zZzg7X0D(a%3&QgN0q&vCk8(ooMwfNUfCivBpmoTt3V@m3iglk;Eh2(>?^*<`+-Rn# z#uA)939Y)BSpgj?>%B=xO})1Xf=kXFE8;RNFBjV2Pt(3pQOzZZ!7Qp999W>reVKW!=0Li(K&Oy z>Qm>k6dz#p5aK&(hzXXZqBKKjq*q)fDT0^S((1Latwt4rL~=CCKm{j;Rq%ZZFVfe< zPmwlaOR76EO*7GCYy}Lu8@>9(U@pVW^;=3-q9ffs1kwg?ik2tE=~@q+AHL`u2F5~L zm=J0Kv+~%|TL@Ha>9dg3UiTISxUM(p*7t?y;AIwnb1NW&B@QYArZM8bY1DyXZ?u`x zHfaWWtwoByTODRup(^ALV5%V#mU&i)o+`CMH2E3Jt)Kjw+`_r`6q}{6{F;*s6AfpY zuOKraU#){0sjxp~9GFmL<;KuQIv2?T02r5(0K;#jiJE1&2DVTo9m`Rz8pp84&S-!L4cbgMgOy!_PA z;b=8<=OBZxLrtITe1zTLLgn#WjgG7si#7m)YU%|ofGoY5JO9*6Y=_{aSb}~;wi2o- zL&QB;D`4BmwH`-KzKepSyd+u3P{NGhv4+p2p`uazYK(1#w@f;yxeW+{KwiVk{fbh? z>Fk$}1|Tq|NB0xt zfE6uhP(tPfZuIEqAQWPD|B2975BC(MFl$|QE6r_o+=gMY1!!+bvDXW+CHNtSZH?f| zK3iwy#r;wY@lpy5^##6=l*q@&+oZhk#J-_4)l5qRP}1AJ_H&2wDN@d6qAVrUzPhp{ z100Xn=mh6mLurMg-^Oli8}K*~f&i{ZzbR=tj-3P~#pQc$s8!a5zmt6&K&;5qdT3*4 z$Ss#4*LpEBSRKj=)Q3x^2sU=CBZYlqo5v2-dESRnwFJ;Y$;zvT}ZfQ^+kG)z&_J zcrWb}E__H8z5((|)2<10Z5Slb1y%D<2>&@HZJWK3-DToE^z&GZuqVGAu03$zB{3qCM!s`id0JRGn&G$FX## ziZhBbd zp<_!DnZ2OCs-)aSM3CCjvxQNKRG=*>XiL&PI|Ypy4fo7BhT@M_sxw%M5T&qmn+fX2 z8aOjy33c@AwpWVpE;zxgr+TmkXKKutDNUtwv#@Q^`3d)e3vIlB9*e*R@P;FC`41`$AdWi2nQ7z-C}uZ6f8)fk~=E z1*K<}Y8ZW0N?|70a>C!gR$$Cgg58Y0IIO$JXw$ud0`Y;g(- zysqJ(k4AN26Ef6`VHIs-py0%mxg4xWcWT-HPG4FDZ?WKl0SV;)%cztNtOgTdl4&!fX)E$qYUs2dwff3)JP3CIUY*ThY}x5 zA$sAp%83@B%*Pg>=>VvGJIHw9&r0k*gs@D!mCLR}W=&WXYrI9N5AkYZM4H_}D2^Dv zs_ts(nqy|H@duI>y+-=gmAhkYQTbR^^iPu~>*Q{mP6On0DeQYL&q67LWN&?BA^Z*8 zO0?3q0v8BDmz??V$nAK7>>`9$$ z;W^ERXN-ZzwGm#>IwR9F>Xc60Zrl@2GX{d_r6FMY(c;B;e_AA@uuqH6J~gy>tlBQFZJ8XNS{PzCZj`lcB?4im-!X%>K7X-o~ zSh9qGr7a_B#F6oVi9>23+O&EaRgjo?v`++xor~P;zdz#P2SAI1#ip^SE86WVT{(v( zC|x(2gZZ#Q3d%>fDjvLe_65^t=E|~9fn{Y*3@shr&S9i*&`_aDw?Txn0nRC*HMPUr zab0Gru#GJNg%K_ATgAb5?Dmn8+q2{w>VkT~Qoz&nV8n2hqf!175aaPl^pIkWIZdH5 z9>)1RU2*W`({BYTK)wL(s3&R4mjhsrgj%T&tYjSrHbMtsM7u5 z?)qx^vPJD7$OZMdND;knB0FcV(#1V{fg!ikZ+B!41zRo*5h?Cfo6`-adlCoQSmP?i z;K)HR*gJ&5Eihox{EB~B3~s=bEQ|qoMYs`_K$8Og7va=Z{zW*wd{hxmoltKt|Fgky z8Xdw3{R5|whJ0=l$2X8@8zB)4>rIaK8&&_C2Vcmg}>(7eUz!VAYtKPS` zyNeZfS4L2K1jKa5@e@ZjcKRX&Hyv4o;Je=df^YqFa0HK1Bz_`D1j~*>Y za~B`X4UY?$-T8QYD^Nzb<;P~c;+P7&fhu&we=KJ;PrV)y80Zy<%ULK2AZ0wf8!o_3 za>0Qs%9x0bxY|`nYav>ar;!P*6Jdmn;VVkooQctE&NLM@@)>Ot)@#7`XroKCd%?_Y zft0Y(aKU{6?47XaZr|{6{V`;PCZEb!N*so$1BNIE2e}chPrr2_^CA4n{FVbs@{!xm!mFvU) z!B7kK>`hj(4zXZ+H^7O?N3a3N%!MBU{nPd9BXfAHsDrzK*2m^+h%kC}2!OK!06Nie z*90@{jl>)3(aZuUnUYLZpz78$62R$*T&S_bB79;+sQJ=AEm%KeBp1^W_1ZSxO3)Bk zG@xy-CRfNqBg-9nv4$P38pbDrpmVSkw$dx397LZK1zYKjny{)aPHE}`FH9mVHVyGi!QX<*lTHZ(Ia76?!w_(pqn=BkplxYuzapPC4hqi4hq`ILw7KF zFwh~_t?Ul_>~BEwizg3HWz=Xf7$^#eI{K+5cmZ54&mm|x*7U?cFO%fsv{)3j%fmVN z2W2c1tV+REh#xi!-uoD&%ZqMQI2yuCsSKCRxidB~)I-0{t+etT;W8Aq21W;#z zyrZMrbC`lKbWjlX`M?LkZ4&p4MpD+}(Lmn&3@)Jnm_4r-H-h;m4|Ha&2THnkt?UR$I%(yOg$UeKv>YgEbl>C(wwz_k_R~ z{r0#(!>rTxO-WO=+2=i@+0SjXn!OMU?oW*c)4W3&n$ocm{rD^8N!`5?cypLgQVdyU zl!_{*EN0gl{X`saXLc~p>yu4Beej}mJVe!^rH|ra8hC<6kmU_@vPkUqcF9-A&V}OegfbN2!cx)I5WVd3|yCS7FXdX9G=%J<0KP~x6@d| zVz|3NerS&y=L9L@GGt?oi^%?LV-s?gO$CjOROh{?t^>H5ftneu$)7dxBNm`pJ{D~O zGaYf^LW_&gNvh6@Bvtor$s@cnbO;7W8JF8+BwaSlG!i@VXdO;KAcL>6-^&y!^V7!r z)!@)55VFoM1rZ{%$7^IM^*H!XxKGQV!$t*bV?AHP93j(qF?)8SD-KcF;u8O~*pjSC zzU%PtF#J;~WSu^D5h?6@=&Ro~(pO%v(pR{j{rkxMNRjh-miPYtI&REzL?@MW;@ZU; zFK1GEIU$BN4AlabMs0ihG=fIYL8cr1+QaZJWUX|s0{V0sQ$#DhoIjD;IKujp;AU%> zZb1?v6)-8YDYm)Q5838E_$Rcq4g|WhA|Mb(TSdyvuzTcQ0h<-LE0;*wVmkQ|j&<)C zI`#eC(rIO@&?!Wi7uJWs%zG6;xd+l8{dx$BDR|!u^$+^}=wQNF+^?F3-`Gymey7t0 zbb1ClZGzGkt*ch!x(baU1WRY>jY*jMqAjUhEt9>dV1w){ZH86kpwh0%@p3$)NVHmD zOm~+-&_*#&7XP@5HKK#-xme%TbVzuj9jc218M&=EG&k#ZN0x=XmCb!QYRxj-Q6Yn+ zL=$w_d>$T*nKNX$tSra3+l}a7i~(HXNwleL5T{F@7u1c$h^Oc%NI%y72f0F;CJ8$V zS%;yA*F~dE8w+ALJTLFjOAhi4b*$ksk&r~&RCi8X>LNNdRl`$An@uF~I}<7nT3C-K z2Iys$&j`9Vk9^(v@jN8z_!=JYCZEX*%KYP{55$qq~O5h0nm# zPn&-7G;vE`#IPzu#*hDIh4C=#J;W@ds-SCC(R-u~8FgX}zcL8_mynrq!&g8?cMBJT zzweiUUt__4aDxTEj-h;juTqe|UflJ>J@e}Cfu5&g4flZ^>H2$MR<1XUAv3Kb9c#D& zsj{sU(k9N{BUo)mZG0FeRl5})AOfj6GD1Yp{R#HYbsc=)L<7!dnVuJJv5CG|_FO39PkX7IRPWa?2AK|AniI-n3-- zF1JQv?pU}_0eAt;`?IxMi=gd9ci2~yA3 zp>EVr2r!8%R{0derds+-qVUl3_E&}2phEFl+#}d+H~3l{tWG%S8G+LGp+Pz_MSe}N zxrfnn4^wjt?D%z4-SCFOn{5AueI_PL_5)!mC7VzU+R3&)+rB^i4vUj4jud>q(g9ACwlM#9EVG1YqPVxCrFtDj` zG!!4`C-5JW6grPU05CH=*|ZKfK07U&79@9;Gp%YkKx^JR0PUi|>UX$_`F6b- z9*c4qcj08`z+_u!PnK5Py7?TGryr*gKN*f^TBz5*ZlS*S=O7BKWI8dwqzL`ogv9*V z{3AsB^a3-=rjA+vLIBuGZ|z!agS;-_59NsQVcse03l^pVDeevO6Sf?RQ4YHlG@&YP zx^|j4J2Wr;?CC^I7j1V@bl0=vKmq?Td^D6P@-08YzBaQyHE&}RbqF>I4!X0r7JvKO zqQT~E!|Fht!RBqnlQlL9b>U1@_oHx1B&T*{mI&$c5AG~t*5{qwky#ej>PpgYjLGnB zMy+lak0sm8`PgOuDV(N_M>TdL&a5;b`zcJ?P}3+hRDu-_#YkpwI>Tfe7@j8D)P7UG z)37bYZ6x_1$)mdXD7G8RfAC^|&Yh9pwSY@(?+LUQLN0vHRy>AH*F(aGIx<7Z5h)TsLRaKcdN?knTJxsS8ZA34XwhRaZ_zH+ImhC&LO-U4fb}rsdnT5Lu_GYQP@Zxt<5Cfkhi5W zvfG8jPK5C}(o35_tBQ^R{b@P6e2fz4v@2nM%2>n>72HcCAyN2M5)xIRo5nHhZx6m=tNEpEilK!@Vx!BpUw3z5QJ zWLawt8*waz>UL(8SnkU(o1tw6RxIQsqkSK&psjL5n`}6UQ6@wR6b=7i$Ai?$$HEV3Px)mnTn}o{vvlDe^1(0qVtMGQ2MU*MKkhg@v9t52TZ`4b_ zNz23*^WHEhE+zzTnut}kt~if}I&^Tw*{OaqpIC=3NroJRw`)z}%e z^9pPZa}r49-oJ2k;FnT0+BDkt17i)R8YsDO41pcC)8*3N!%q!)-vRMzKt;XGqhp$X zyvsBWvPPExH@KnGB$Ok^unv$uByLl6`e|<6lc!Cu#Jxk}C(d4PyxYfLwtiwgR;uAA zRuq1x*mc3rgVdI?e-7#B<29k5iRAp;6f;oMEOa3ZrC`q>*lYnL<^2egC92d9kE!L;>p@80pKeD&;&ke z&-0dI|BNi>Uc~qa?k7-~TgQZ>8+S_;6Wws@*0E)H?x%<68>d-3&iC=?!BR0jcZe9o zEqa#en1Rm`B62veEpxw1+o;Bgml4A7Kmx$xYXHAgJ{<5yt4dJNW`yJ5fv7{hW4cW*G7Pmnc)4(F&O+vy5%K{Yz$Kf~*o z9SsY7yq-V`x;3+MAFu5#UdO&*SrH521tG5?Alz>Au;GbGD_Tqi+FCFi+5s~8@ToeC zp5iR|g^PTqzhNQ5JBITqp#m;)_#LDh3LgDTD5h(}JV-}2y{%M~5#!QV4R5Y{-r{fq zc6+O4h;XmPB;G~{?P|1Rc8i*|Vd}u4I@iZ&El1T6jEY_t>f7#!y(rZ8&bIF@{k~s> zV*ngD=5tbRLY^{&KkygMP<1%Jc{R|Rj4sB6y1>3m*~+`Mb|HINpzRz@y8mFXyko7! z@;uWMVJ{$*|M@6_WL&u0T!df8o+5EMjchZNw_edH% z8|?Kl^eMAI%ze(%Ct-kK|IZ-47|^;?vhRhvzyt;TwYU18!HD{aK0is#Q<+_JlYSf z1ZxX>O0FG!t5*x7FMh=^`r~IUB6D2~<>>TKztikCL(n@80gp8c(HFK4 z2zD6WSIE0t*X>qrKqVd8rK_p7tEAu62z13`Jh27bdyG!^PjpX6Y=~ulAw*$c^tls# zx&Vm+==)RLRN#SGV2A-qr)-qY~@n>s(U_!x`TuTjfIf4c#A2N?9DGL^AXczkp{&y;tu zUc#&zbR*;2J9*2jrC9fs3qB4qb*)b92xAxMM49CJI*UiNFB-h zCGxNfh3)sRmSL7@{j4ikOe5w9ao}L^jPO;i4`DKo`OGjA!DpP^tz(SxFnc2JfrovU z4$)+a2rl?{>KcHeK;&e({?Ol(HofnrxakT-F>Y^OMFnbrEMyc`!RmRW0;|C)JjyK7 z?)8_m7}bV0SxMu_Ip-!M7sXh69`fN&Z>+E`sa_gGk)pc6B=8J%tl@4|0lwp&BOF!= z-u+N^b?@MDYzV(9M>j6#M#Fs?y4e~l=iu_GdEZWzp=3HYQuPH{6KobP4<0XAWs^LP zin%&X+WKq_VHC4c2bZm9cfJLIKa@Zt@2@fKvk@c}S)MLTb~^EBf{<6yU)tZ*R zNch6zD&ahe1>_&b(ox#e9lJ&vi&zx+0fwOSeW{F$f--LsdN9?UC7 zaVzGsmn(lz=5&1c_R5d9bUIe{jp5*?HN+jCzmMuv0q09N#jtAt};mZ!-4C z2=0t}Eb!t&U7l&WL^V{!#@BhPSXHjLV%6cv35h-#6O)}76W8gOIQMB86Yqxa?qy~L zy9ngYb~KdE&F)P{N`lMH%YY<7qg9yQjt(Lpb~ymOH@0#}2@r@i_9$ym$UlMm*-wOy zOiD2qEPk%jCdKFQ{l`D_-)rO@D~*bZfAi}e;dfN2z*sFwc`1U1DH46jXbYcE;3rT| zh+(cY5DmCi0y-jL(N;-U@w^XyyNG8zXT@`?d8jS7i!f}~#|Brtgrt0;5AEaL@B^=T zUF>8mIW6Bfu!)EdL-&u9@4*gZAX}hum@c%z7m+tcn z#&)3{cy}f~i4a0Lo-AH@OOm=8uE0)$&6&nDV2&-3pZ>nc7@%0pbqs9XYZC7vx_}+t zSDpdkI$=u{I=XmA_;0?Cb@TGY*n#oaK@PzkZGE;`iylI?V)-|21j*v&A}_UG!|bFg?b(Cf!T z6)}!;B#utJj2m8@uW5ilq92PS+R=XeX!AAV~=x(n-Mg{0rUqV2D~5Gq-H0aQ4f9{uMQ zJ|SWaJNUKQq>Pvs(?F(7GNbLVbAbpvD%C@j3Iq2qI07OF6MW!?5I7V0A}ETnzX(c=R!Yq7-|*=@{5&e$S&_6WnH7f18vAKyt?W$= z@#-WuL_8fmPP8x{=fn6MrU_#A3oTGyH+oVLBxf%R>n)Gf@6xZ|EsFa6cL|{y(C?16 z-ehRLpnqK2D|4eA*Mtf3!75{1lp?3#+N5Sc>(tNZ$+qg0lbwr6 z6~2_tiO@7B%Qfs-P9hT?pS(kI3~@!Cs=y!b9!ztRPND^Uw?yi=wSJ0#u9y2!Z})@g z3#4(+eu$-%po=ld6**k(&vviE+Ozk!J7Cdy+sWpX^R$rHTLr(zdCk#tlZ6lAqC?nP z^72g&srBqh7U#FHyWCUH~O2$^K+%RuV{A<#t zy)0;?s}~V9BcP+-jClA#V$Fa-3s!Z@<=2gu!&!?p&I4J1_EC{yx%vi7WI%>pB{$%& zA;ZIK3>lW=LD9Wz4#@E5+Xs;0w`V9B6b5{*9Alry{nO6~x3 z{_;D6&O3NebnZc1z>5t;XX6Y-C!c60P(6EEn!44^yi0NA8(VP3gm^yC*$2?46U`;q zlXz5O;oNn$Ec3QTo~6lV%y5+^onnc=EpW-LHs7^Fi)3MI(iy@Z?9hR@vocch-p{x~ z;o1!$NUEACS=l6~8%2V1F=7?WGna6-noS<4GDDLm;*$dl0q(-1M3Q3j=VL;hPuxLN z3r~pEwy@pN4_g33fYP}#pLvlV(F8Z8>zg81UI5;7{@dqGtYI!%^B%_WMVVEe2ZvM6 zwMKsldlNA1PN@=Nm>*O=Wwqhik$6y^^AkSPISTYK!;L^D$ zX=qV<9w1o#sZWdAE4*Jd8#sjdvM&79o!Cf9APO`R-*%YW0Z_IGfyl`_7P1Azo<4%EAU=sXyNK%|fAT&}HZ*Fl z7=~*{TM)>f4_69Nu{awqCx95*dLy;uVK1}0m~B6iXVKKXMm4~+zxM+%r(rVY8;xW@ zhE{-{6cBaQ79lcR`YSd7lt{GdU28C4g3NAGGVJwkV^Lc5l%@KWj0) z#nZ697$nPx2HV9Lj}cNY+yySH+i4!48|ZyWd^jW*xA#RK{?O-ptl>5t3oR_SNS+dQ z1v(ePPV}L8?_wDLb5I2i-sV{2)9BYb=~fzqbl;A3Y~blYEzKi}M& z{oRN8Cd>zjl?SoF_#Avl9x3U-56PKB?&Nl%Fg{~85{cp-p~44e2=7-0kN5H%VbUH+GEuD-G;9clMKZj%OG<7%x-NJ7$#Q_PL&61s&#K}tDn|BL!n%BgKNfCDuQN(91 z-9|nnn^)+J5Bo=cPCO{PnApj-UbGi4lS!NdY=Ow-n~D+pE^JhQ*bK=X46(P`4PyVo zgMjQk0H<9jRy$IA#CIEhizGAQ@jihz^uxIez5t!9d?EvIV3~9>w>yUTqRCtff(!O2 z)cMf36|;R_MFmIBA7nDeK^kb?_0M9oZh)-{(3&T?gP|3(Xzk{swGPghcl1EmNBgih z5q6o+33++rYybJ&=|CWzXo54{bW~!#%;&(8ymvIxE!MyNo}J5?&!d~xc-%{8hvX!t zX+!iU@BMKWYE#Y3oxkJx0xyqZ0n^H9oWwc8A%J^Zv`%OyN1f1_+#+g;wq7-pC%CX| zeUwO5Y<@;2bPI`VVU=1v17I-O>{JJ|1x+wY5lrX~K8wRjhF_|`@?!93^SeHOaQPBi z^Imt2QCf(oh)(E!5Azc+ZLL%(W|}`JT)V`G<19R=IF6o;k#IjWt#i6buqmPnEjp*e zoP~2bTqzR0Gyq1F`^=(#PaULR^(Bt5o&IyN?exAMQcyFX;%0MZ4}_3ej-A&1g}bxB z`7BBriqy^q5dV0`r%3Hp-itRHYFt0ZQe!oYOhAnlQv7qMu@dlz)tTV~wjH{YnH{1< z3uR_!X6rN=vH1u4Gdr@Vw!%A60N6GhmfD{b)ESY;?r#qVXhylga0o;3Y~?wQe)Cq- zD4Wa7G47RfMG>XFq>b@&zi;&2e<=2J+qoUE4{3jrG$nO>sllkx$7mvi|I1wVmFT;_ z%Ud={T|$@6}ar%SeLyj1fJb2H!%d>GAjvhJ#Ho8&hvo1P7-KveRsW#%ug;c znfBXc#qRpP%m_&1U4AXtq$meDr+4NKj-;y??12-|qRn`tY zKOXwmWTY1BC(((+AhD&D%^1s_7XbdeNtE5y>H5`?Yt6@> zd27V1d}0~t{iHaSS)5YHR>BinjYTL_S_{3#!pEL)PP%7d^sn35O+1Da=OcJ!pMjyGO4~eU zIs5cE;10a99&V#N+;qaI;pyHe1PR2Sf03azadFW_6}yP`hShiT+l0-iuW!ZvYCCIr z#CCQXIs=`>1?R53557eMgKef_r$L0`Jw>NOZT(4XSl8?%mg6iC2gf5=J@3`4f$1(M zC2kO%C4lJ+FRlfXW%%VhnrIv=`P`!zUSz4VfWPGfekWoNtdEmJyOl_nZoJgaGP;i{ z*4?;Mzh2_=olfQ2X*ehVApmaNVGmG6Ikr_`1Zv#cN&*z@w$=cCPP9v1?#Geuvw&dL z2rppQ2|#xXDi5V#RTW#)Q+6PQeChxg))2#Ur5NO(*R9-Gd{4zsAp;@|o7*gZmY{h~ zJ+P6*r~6E*>0p|vWNt^_oH*~sQ(8adONcUSjzoKyuz^j`qz?UA%O7Z0r|=H-<1;`Q z5~vl=uqfC>Xm;q}xDaMyq&JJrst}~?LA2sAp{l=32h?z=$m4^#4r^e8NzK{L|`_7=rac`hWuqRW3 zgEjLxx?Qtnx_*A-N?tBLNBYy1oS6oZejrtD4D0Q;rGn907coD9aei5PaJ@t!#dL;wE~-)&4JWXziT-WX8Dtp!iGPa>skWd9AvxN z;CFTVcNK4R($+0}l^w1vx-YC1EZINNfIzRCXwdC_a9Ot*VnLu9H|fZ+3X@nTu~2;H zg|P-TVbLf57EtO3gM)iBj8#A>S1MRa)i-UHyCmQa1>9?fUJLieJZQQ1%Gnl+LKS}-bP^E>NyPAnYE(xq$w(4X{Y{3NOli-;vdKhxf2jNl@hcqjeXg~KfiaT5CKNop9>Hwj!gk@{C$sXI zoG0D~D9d2^7+hHAK$;pyvtuoXDB?s!5s!zQ&VEy63T|kuK`&hmU~!|zNwxxX@54q^ z-utx`m0y1cGmbXUFTI@2M`D>f@se*G#TWdOJ)Ew*Qs8kovLr`k;8*TT@LlK@lz~+p z3c8FX{9jy>5g#h;h19P%e7I|IrMy&6y0jW$@Nbk-Np~?@4-el%EH3-_xcvD{p(9ID z>i75v!|mOm;+F!oSEM|GsK0=<(^mrPy}uIpLBMK&DG_aKy5Exc+r?nHeE@6guL71{ z;PxZXszJI_59jk~_1(_{YD){$C#@E!N3l?Ci4IzQ@F7;ou1sbZRgidw8S2XZ6!2ow zNv#wP2OiN2hr%P8YWXE2x7L@Nlblt4JEF(J7LDZaDkkMOx_*knCt_2gj5tD(-dL6<(3R+l%~*d6el|X2o-`%fYG;JoRhF1h44iGAf?t`wPla+PwAPz`BYZ zeFBwbq$td=c_vdWn-#E?xF6Q$uo_&WC+s@{36#Ox?_|Hx)qe?O9VA zr4Jb4Ipsdfr{OcuKzccCL!@?RTNN!o(Ta?`v=qTVW7;a|BW+`M>;L;2Yub1x_;|Q@ z9XM+gHf;X3k@0B5yAbh=BtL7-GwS#d0UIt1g{Zj?g$@`h4t31L;K59JMjC;fs>eG!oGQq4 z&~h^atAbx~sGtQq*x(|K?;j`N$|gSO38_XcPv+4y`cq?J2?s3>1XAMsM zT>VQc*oR=PS{uZYDmvkf2qex}Fa^ISSCE4}Wtu9y>_bYaDOJHL4B4^@7%f%C8ov5; zeOTs}aZ7r-d{>Ri}%Xap0XjJnlL zD=5^2%-K)mq{*%rPy(7_OXVUL_>b@^0kyk`n1lV0mqnz7q^g#qrl2ktP&Z-HM(>lv z3rCobK@5U*_|5F3iRhn1YZ%_1^#T?#@`(mQR`|K^ZVb8`(#(xP zXUaSfbNKlY2`DUk)u&c%t#=1D(Mas=6ozCNdyC!-^AnKHmEy&u^QX$k-eXwzrf-q{ zbP^7a^z4#OG+-H|;iyJRer*0J@TC0hxK_L)$D(grruJa3OkgRBp8uml6%;4}RRm)8 zG^;&5Jd*zI9~2eFzfX!S)o*;d(Jo1L7t6Yyu?&njh^Z>tRkQ+Ni>cV?!@mpQ7mF%d zT|D3(3=2}Ulc)j?O&4J6O4^89tl=V&98YvKg}=z|RUP%r{H4E+_Mr#{K43A2A6?+1 z9ZdhRk4T2e<<;|iwBstDL6lKypm3A@P!OAvWFONBuLQ3M?~R&(Q-$+ukZmLTS29BZ z!)BaLPOJt644O8Iq~Cs$Y$>vPh(`JL@d>O_u}`Ct60_GA)LO`eMrOjzB}sy10zkAe zHvb9%IJ(y>0VlZu34qD2fo&yS1-kNX!>pt6pmyS-%HoLVVEmxNVsSqGE8?uo_#ATI zKUPsPcfaVURTqB8ri| zt{VqOWle)phy)Oh?6&uWxXDrGW1NXzu^GZ}E%HS?N1(q8HVY$N)O|U?1;Iw%q7~&sTF$E1vZy5Lj`=o@!gKt~Wz z8wkQ^BNyh4I}rs#k&|iS)0${e4TdJ|4B?2Zj(529M!pc!DNgb-j%QGd#(8L)p;m@g zV>f9?J~}1@w++s@GdTJpK)KrM#X67J>iZBf5nF8tA_%?l5|L(T^%U71gVCSEzyrWX zOx#vJV&jju9I(Kq`>=)UVT|O3l`@>$9Z9>vZ-R&LBT-U9+jqWr?#==Y{mc1U@4gg>2R0+W3A=dC$SY+=pY_bvJ{fNO3-T`HZC*pf2>`VaQPo%a# z=GAGyT6V@Dc8f?cq<)9He{Kl-_d6`Se@QA~3m1zMg4+V&Kt&7B5*7r~L-z%$&wKh$ z2?_>p*)hW-RlA1aK3G}_^Y{Z8kO0iy7um26W@W~w<+m(sC-|@(1K0|$D|MDiMGb^~ z6TRLi@8;q`I1#>9>}uOt>$mgCw*j*o9VtiwjS}%gGKkHlz#TX#vfF0y%`C;&L<@d1 z*a*qZU5N+be^Q#TQq^WT;Ks+I7{3vg19;$`VvGgZeB$wN3OElZtVLF43O9Vp4N&vs z@740RPX6+f7Gh}nFRWk6?QY?{Pf(RAr+%%hpyiy(C$WOo2Dm!H)<;)|+W?;~q}ut? z_mhaB7F(eo>;_#yP<9CB5NmP$2>iefX!;2loYCqVShm%PMHdDaF7YA?oSXavEf&}& z#sQ@dydGjLH<^K;MUj-ppkV%58CU*b{V`}W`cav~0s9rLXbCO!U@IfQ^&nH8A3>P` zNkSP)ojIv86tN8y(`7>W#sWr{as@)jzF;)r{MSqCjLS$=eewMMZR=9(;~ zKHQdmx%jAn*74clg0tD+>kDmz@!5Vs1N2r|lV{#1U}=Dz6tn!4T}&yob`x6bu^XtN zcED9Hyo3Ce$E=lAlK23ZbT_Tq=9ym{~Kt3mvZ zS5PVT!(77HLIjI+VO_;JNCxVGl$pW^WQT=FA3?sPnZ*FVFL=hEX& z*SAILSn5ues@GD7XsN4N>O7Q+t*FFlj_P}$$gOA}GMM-N1#!V14|z3g8xEC5*Ih`% z|H{^7DK=*=M57iWeNFsY$~|{v+=F{br37D>RJUZBu48$rT-}B{(VFdRK9#{E|CwA! zep8FSc7o%xxgW%Cf)nU|2k1~1nb@-%&U2|qU8vsVSMOg!WRA)|NNqHVyA+%z!ZSz- z41#QYh-Sq{`F&#nr_(JeVI` zFIuU;Vs^-O)3e~VVM#qrr)~d%q;^57njr>vK&o0S3GM<3^rBJ_pH#q5;vap3)cwOJ5x5r4qjgB+ z3OD$CVdR(W$ngL#Q?ZaXA<=c|?vTtbxvsJfSt`rBQ^(Ap+=E4KR^sR@+l$tLq=q|-K3HgQ*YLYGD1G@d&BCI2 zYD~z7QjjBO$ngpzb)cKbp*-moz$^!OH((ffe_Q2!a9-XhmW>vxo-#bquB1GMopJt9 zQ)LZke{-p3t^;)Kz!E@0N1qNe`W$Xv0n2CV=yRal&O!!e2MeS zrPHVfiCeE0qFCbCW~sEPN<7Al+%OW|0&(5-_(A+(1X|{mmF$TBdUjKYz$eqNM48pw z2u5~u9XSIM)oU{{>cZ~x_M44t1#Ms$0)9N(hP!kkxZt$}o6ORQUNVg-ICS?W9Ot!2 zj;%;^Fc)OUnmn&O;(-X>edJ%93!2)CcFz481Xa3vUjRP9UbHi&v1htov=j9&+WB$r zT>qAx6ZWNqSAv$+dS{Q`kptVdJUG}E>gbd0wIjmCI^ww(->cJdGlq#VRITi|Pn%?z zH~~ps#hBn;o%F^s0N*zYL&$`s@yM)MNpHGr!YGr5oigT(F*!#tN9=YVhEW3+7gR^F z)JIFS{s^fb0TsY!{+HZ8ncVj#vyD;AaZ{b-Mtb$AVCAsPssEIXJ!p!rW^wA}r%n?~ zGq1_ywQ3$zM7JhVPdFY_C!N0mC?S?YK*yD2A~f97!(Zde(*c4+_oH$DYFKt36`eWDc;;=$i2JC zm|!we>yRACbo{&o{YY&yA^9d{g_(atUS@tz-z*(P58_P93s@1v#Bq}$wWT7Ays zys0^E6T8bEU*cr=kUVD|t6ra>a3a-Tv*t4lv#^xUIXsWT zsP3;xn^k|EsX86b#~HMe=pu+y3?OG3KzzLSH5rplMi}pHiT7CqG&^qk0`=PQxjR;j7yYnSF3$U^K>HRJjqG z7$okx59U?GKRmM2&tUcUVW{3GNPa-&BY3=_eoEQ)0}m^;o}SQ81a2`Izcv|01Y&n$ zPPe)=@FZrUzjlmsZMdz!vNe-TxIf-Bg;A1(c@AEd7xkM~h4!qM%wmxZI-*&QBr zOuT&^9@;;F?9e zA(&8samMjw@O_T-sQcQddDmfUjVu^Uu-;enisfMdk1GOD7F%w!Fjn|5K8F=-fwr)h z&g|L|ACk+N5#Htz1uT=Voq(^0oQQC70<)%dgtKRhm(Ig&#+|sn_}YIVa;~A{ZVa!b z;9z&s-QmYi#3Ohu*H=b{B#PRNt0hG7(;E|=VCcJwmLw@umwx;%C zQHmq#4H+R`AAY>_Nb;XuVY_81^Wo*az(YLZhyoNk1IT7zsP0mEMu~e;tQI{G(3!*4 zwbQ&Ku#6<6e21qifGGEBT>cxSnmRe0_y}H z)^&*FD%%gzIkpnA%n-8i2ZY!J1qr5^*+Lp~al%%s(RHCOUMmGu1$(lB{VXO20g2aP z(~5xY((`dh;%6YA0ob=oal2R~B=)X1U|)v^0oL2qg57hKjr?E%yBc>A(1PK6V0tj0 zVDVcz=RA{K`B&L#RI&*Ikxt|w%}DOFl9QaU>e8po3-E%G&N38;$)$YeG~q3yE}Cd) zi!3dXRmDpm?a)LM`rw_T4sLpv>o~urlT~iO!W@I^0afMpg3>Q5I5u1`d^;!i=`bE& z=Grl0-o|c$ak=jBS{&zUsIzFi{A4TegY9o)`IeR^$Uw*0UPSmZ8ZD`vvuG|s?_yPSWMZdN*U&2H(%tbit1 zd@@IMoVeJTbk()d^m1uspOK8Bn=`pmvO) z9-2~lZ|TT@99(n9+HX)PWh*_+dAO~VXhA8QO}0(9*ize`AC!V2gX#N*kkOHSNwz+O zS$61!qN*@!X1jskM-z(AA)V#;78jyzcg^SynvwTDE0gY|6hkd~fr6>WYkjWS7tEh2 z%t*rc{=5;!ms`zXe21sS__pE4+cJiB{vUhq9v)S7^^Z@0k$~dFYw?b)TJVZiya6Ss zN5?7_FQ~O%OQl++rJ7Mx5~4#i(_xgh(8gLTDr!{JSh>Uqm;feGQAfd=T3V+T^^B8h z1S+vo`F%cX?S0Of$poQq-|zGLg0d+oJvCZkyC7&Bg=8UJ>>WSql{ zf7uxs+hj=}bTpKGhMKC23lRcKG)GUYp=!h`JyH>f(j`&Jb9YL-iSyU(JC4vt*hkem znW844S#C+gxR)D<7>w_Z01ejX$O<+Pc%m>9_wS|#t)2l4FH;Q1D264(a3nF*0$|70 z1Z&=e#pH#hG*UAbZxR+(9z|*xT>(;5UlddBOZ@pSgN0C!(?FBG**IeHW5wdR+mug0 z#$7l_u#hGen0n^4bJA(>CD~{t`9qbYDNv7G^?t5;t6qP-!3PVI0lO3`QLFzu;-IPn zww=Jk+&8Ff49I4W9>&R(F`R6$tYY6_b{^3pVu!AbvNMcqE*G8n8Q9zOJb|W0yjm@^ zE(6K#OFI!Ml#e$L?urjBft5^$D!3CA&=F5el;vnLQ7d1>F~FSk;F{*?he&~jj}YdmsFz+A6?{f{amgU%_-M=qEP{0Su?9*4~TzWD18XsW9d^8 zT*A#i^e^ZG#!7Yx?~(dnUFdZ}w{=nyWVk|r>0kPd<9;iODyM|KG= z+%hZZI#f|dxVbM~Or%6+H=|{-k02E7Bh*ZoJrK3xJeu|+eFQT~AHjTHAEB2s*jnbI zmSSe{Gx~7`7i$(-(ldEi#1YO6{aG!qu%Qjvi#;z8QoX z7eqYz6PYDhzEc9Or1%xm(DjLRwdyEp37Unto2L6N%VCYB$wk8;Ai$61H;l1w#Q-9! zSGmqjyi!pBI8dCpM~S=G0AeG9-*POGVJ?_}A)ve(8H|#3A(=|nn@QR8CoE}m!vr|R zObXZE;ZwD-9ouXM(5i_?sG?~5|JOFP|4x|%RSeZf{2#Ud%YAzPx7$C~-D#IN>_2P& zf@*K=|5Y@FrngM{zggS=Eo}c`5mjFMe}H-4Htk>YHZbo!lGh5q*{Di8^g*1H|DUw~ zTLbNXsolFMsjI-9gD{qsZJuIujK*#4YnQgNcRebjW@k^v@J325f9T;0d#6!_>@N zmdG6xZSJ|7@*5_hXvZv#*$&?H40!cfv|;kIbj&PaJ7#dq`mZuC+V0cdZe5luE)fn1 zBBoX1+*W6{Es6d(a71xhMP6^eY8P4$D@PS>^x@MP6UXTa)s=d7-QJP1C@x}Gc}DfISy;%2;XLb|@t%^BMcujHTe)k+ow7c$zdT8QHIYidx{&GK*f}HH$s8Lv1 z6P3uV$s%!<>uAe~qC{NDlx`MY3gZo?bdw5hfMQwh!05UO=MRuS%~HoxLkwmp@^cgk zQse85tiB^7sIcH~oBPL4JbQstt5`|)e*EW4fw`&H#WZX$?CUl+nC8BPJgQ#7bxT3@ z!bq)h0CGXoAlNw04&d5x;R6L%#t3$kK*aYHxL_`DHQ|B6$uDov zy-i_P?YuOd^jYhuqS=LXOTYlJ|WrLWx)Z?p8R%;P7h7q|t~qp?fJ4$C6C$6akX zsJ_Gv07N=j`Z(CHSMwbp23r;vR3JEIXWFa7*!!QeHx0IhZ-3rPTWEl8e|~R3x7ngl zX+!idr%vW(FtIY|rl0H+niLtDULUy(lS7tU|7}ZhS&I+5G=XSM_;SGvHNPxPzZ`;- z>CR8DMbihLLhk#R!pYg|mVkHOO4)Agl*w}!VB=#MxQyt%#-&e9;QC8h=L#){VUXZW zn>$ixNVVgMaeDqwzg7N}ppQGt{rjTYZI}k&iQx2!04+?kW!;@!Gvy>=uVUcmVXRJRdjx^ZOnwqG1J378KyOG z>Q>)qVuhq9u518)jJy~bxV&0njLpSQmbwo8(>4 zvtU0j1Ly<(DXc|yG;kQ>9JdX0$bER+W(8q0R*YYP3Wm`0Tnj@XPmviMSp>ezZ6Vm? z!4-ayZw@zJn5(+;OdybVU=|L5&$- zFj!o1os@tuvveb|ff2Cvu9mBR<2Sg|qF5h;7UeG}_>O$F?Tf1cFdJmn)2H^B35^sR zamXaw)LLW?uDF|oC=KH>h2D}0oZ5q+u7s^=lU{*10@rH!HI}gVIf(w;$=&AEN^Uc) z8kr#tKBb+3xwzUwlA*br{$)F|7>>O5yU$`B2xO%hbWURylz~dx;E#bCtseD96V=X) zhYD*qrya|OKry=<|5;$1gDF;9oz0-(o;uV9^>&*5+9+qy+H2N})}n-HZLO$XZ9wg6 zRbOkNQMI9%sGU4r;@6P|Y}NtQ4hD1B=B17i8+uS=E=Th{5<3byP&-eltpe-7w$9eM zs1ca434}Nz<}+ zTaH=1*wzkSUHnG3KJ&QP&G?jwMxI7Rl87}w$M#7gxsHh$FOjE~V)eLqR(~j1`ri$Z29#9a4<$bo9rusMzRDu?6PgS0V{iN5jel}dPogG&XcFhI5>Tpv# z_7tP}HXP99bEP6YQCL?@=+KAatKfU$0A^)bY#B)M;{A?mD}}dk{Z>prVA6v z8w56_$A+{ZdIs+zwe%Y0spcM`kgJO$GgA6o42UBY89BZ;j&fX6n2-8W6a!QEb@#F2 z1x12NiMFrXkS{)YO-X!m8X^O7t0H#~P$`<%88?ez-CA{O2#%8~x1C!auK&gnOhwq- z1J}2ZFPkgQIdY^&)jedgIbOLLC;zBS@ML7NikfOB!6inb3{yh2T6~9|Wi(s?saBJegcmykHMp$4WlMaS6_w zLuF$4)k9LcjI9-Z z-F>ilLB9fH$ZkQtxRXIMSO=D`LmREy39#8#@A^KPgIK0DB@W0+!>Gaogi9Bo4-8lk zxl8GT>F9*(0vFWK*I9_SU%jF4i!(@HS7AQVx3$8ryUU9g^eZs*{TBH+We}g-1^POn z@0Fmhi+Z0@`Z{2FhmkB7q*NVsmNC9?%^H*K~Taq+rQ8=#`ci=ycA&6=n7W8esAl%NB~9p5skDexCD4aNms^c4j;93+D~ z7|>>wWxE-*u!4fvS;>2*xzWVv7gccb);)LaQ`3N#R-Fmo(#;S)$e5iWydXO961_Rqq9 zktvew0?EJ;1RMuARK}Cbm`GMZp{gp4tW}{Dmggs(jTjy*Z~5qe5{?%ThC-l4ypOGc zfww|Sd2=apgVfxie5=|KZ_>ECa(ndzQ*1dx{CC)H-Y?HXeBbrEXnTPic^gPV&hY!AbrrDu$DM!G+=^ zAA%&e>0NJOknxeZ+iyZ9F>bBzA`ii)WZV4EBwP&O$HL=^SFQ_1?mC`9R-NEJT->k> z3@VhXMDB!gHsaghQ0zeM6|9kX2$M2mB*f#Iu^#$Zjiwfv!E5TWXHzK7M)5D#PQ%nI zAE7<#)Sj5Z<~pQo^ipU^vGdwG;W&)9pB!?49fQGawA4)L>b+p(?vX%3(AEu7M13M0 zPE!tc3^uF;^8jd}v;nw3_!QIaB_|*g_7P5eS*%3r*j+RQ)oDt}8}v>wta`>2v4Bw~ zAFxEclgO1jTC4VHElz|p7^;{M**bdgQ^bbMC1!Mjd3(6T}O-Gp$_rFS&V(lJjyR8z;5iJc4O!B#cqtpk9+%{38vER ze-n3)x?I}v!VvuDKEQ2i?EZtMiPMqY-W-sf(~+6Pdk$rO#*n}vJ?ajjSRT$6(}gv_ zc`{&1XPKj=@0O;e(R)5;P_B&Wo|B?VsZlw;h%tg(-BJ0=<|f2yYS;a z^NvIWH7}!*Z(P*{pnNZ5XWnH4T|`bNK~F0n74GL2ne;#*Ze12?_>8jSON9Ur#o?CK z2uG-ZIe7)9n~syw2(7+MPwOioixj&Pm)|(md%<-tz&6*<$JZ9%*;QTFfA|$d+;*Df zzw2YH{5SJloC5Kv&}U0oX#jYOu3Laan0vgzBJwnBGJPhBS8QdY9L2yq7Ez^4reAy+ zUcmqaW66mL^TC^L)o`c0m`76orux)46`1q5yTB< zHzW2MZ=xTDdW@Giv`p>Jm>dyk09TSB>|n0CNJY&>~xOBnoF*uYa zzqFx;!Rw|9W&h{j754vfJlH?^ZOn5BlZ(KSm`$-d4g-tH_cclww1OcFY~#AYXUUqP z+-3tcJWChN&}}k+SIk(dpog{a5Jc5X=0Nil4qhg^+L#eI5Yu7QOz25j&{lhji4jn} zXr>s-XTX4_+m$EppDjFj9ISD__eZfS02-nWqCiJU?~eF*{AUzr6)rs zR4Uf-i`PYUT_T?M;XVBT4vfQ}3`iP;3>lDATnR`byL835`j}t*AuUcTT`#-eV6T#l zDWJH`-!7I*7$EF93QGy7KRKgC5{I%{bTYI^ft{}9A8~c2Py!h*XI5mbI%D%3n_Ax621!3KOPvEuF+!BF|jMy zAM$B>N=0_eI1$;G_;DXuBO(JwWUr4ggTnz`l5|lGDk#$w+i8{Rt7i^8TOY($AkZ!o zfhVCSP3#xols|KpATW~%9PA-rVGB?YSCaOi4zWE5s)bDm!LVfn>W>I@sY3m}LOqU9 zUtcX`A+I&x3N_;!ZenLDAcKWqivp00a@q&U9*N%S1e4cp3ODC>840lj`d_E(MiSit zT$&hc0?|v()P@2q-QkKJGPA$5OD|01z5}4rXmIUpKiUw-5wl$9%Ktn7IZ_^9o~FM*IU= zos*y>1QAijG$;RX*s;kEtD=#yv?fGZsToPYii^Yl&W`Ag1q6K>-1x^Fs>;*#&;!&6 z){W@cyTx3_0xdj{wSB6!y>*7v)__XgGqg6*SdLbqwQ?{Fz_+PRQ_rBY7SQ~HTbrVd2twP%}>MrwmINWPj zT!Iy+?@iAGaUg2%#o$=emrB-`Q6Vc#vaU~)iHs?6dPZ#b9kNlzZ|IZ zvPQ8`^&E2o7G1Ohr|wi}V?3*t7`F~pU{K9QY1+jetSPEBU86NUPJI5d zDu~Y~sJ!V6&2@_AdX%{qGnXJB1{sK`S|_IrK9v?bDVNK4Io?F(A2EdX#8renzh*_> z)r#IZRoL?g>T}QbD(aQ+GhzOHRTv&LMTv21e2ULw73OG+o3sj&+0BjqEjX3sKwi%a!XTe2*aXaoX z#HH{EWHcg#n70-P*BSEecJXA}jr|!)XNQxxJRCnhnP=pz9O*PyLMblAkj5N8O27-@J~)h04q?!OGObdEb6Kdm9czl%v;a`d@Atk2(+H1tWkJ0K zSl-@Sy;Zi}V|q|_wpT9@Dy;W!dord)j3YA#!g=

j)sXL^Bm$*6<>l2Vyu;|5!26 zl>7h^RClD4sYK|dGL7yAF`Wn26N%%%8)pQi{5BZiKZ8|JaWhGlml1>Y+amNOZ6yalSGY2=$A`=C!52Q&up<#$)9QQzwy$9npf1|<#N+xe zy6HVGm41Uu4+m1SV&C#y4^)I{SgsjBtyuLNYIghR(Y9UU>?WWlI8Q6J$B8bN+3vne zZJEi4;{$Q>Ry;F2!A=ey8>R|aydOR!-WUJ@Vjw_&*#q&}hd~ggfPm=}&y4cGpniba zp;s_Z7lL5{?&_ET|TJ2}Ynt{F$Y~Oh0nm&=ccZA&VgrF6tr43cRk$;j8MfoIn zll)re6F@1cVr(nGg;M7e#D_oWiBH!DmJ3qspg=K?7i=l1aI5C*lM6SERt&+=C>T1f zOQhhjw>5Q4DpPF#((fOJHFzxCd5iRf) z=f6rnb2Da~mi@MniW=^g#jq7E$W!ciGraRl9! zNbN`HjPV2*89cG;6&TCkr!*9UHul#l#J*H1!sv`wb_$G6z<5MpbOHtsQZhReQ{k!r zj5uL{6aDBoPCbw`Pv6I*_k5ERpwUJXExGV>n?(!Pg{B?=TBlFPY_FkiXdrKQKdxxU zzx-yEcvdXNC!-vhdOosugEKzq9chc3av6&zf_!Ek3@ zAbU6Ta9eTc1P;$*u?tyG8~_wJ7@*$`0L|iL`q=I%uX{^mrK*fI$|g5#v~zIlPt+hSk4u z;0q-sp=$Tp_hGy>84f8s-JT_i&yx7yOFaOx0TD37Q33`soXs2#3P6q5tn+&j&+Wf@ zG+fS;XeTh<8ztUv1WE4r7NW=wgd7o&_i+QPICD(xGJVZ&4hj0e$^?=FF3xXsd0o_( zI0XO8JUo0hA=h$~U#wPZr!m#$Db?g_>ip0u5 z780Jyte@%=2!`fs7uc3WWA!T4jY5DB zV4HYqRvq5pyxo6;EmOgRrfZcgzdK3T@-BYdAuse`OA2Qudl-@}rNS0i*di<$e-K&1 zPx(x!#lHT0-6@nhkh7CA_tz}*15+j~bw{wKgbd%8HVk3;_fW{>p( z?1BFT*d@IHJAWI1eI`6Z_ZKoc838b+X=^G&oBd30{{7%@h%ofydm%eJv8Vs5WYeRb zN1y7Yo~mB!nXwJ^Y!rI>`Sgs*s|Ty{HlooC{5xpri|0a84*XB5So>s<6jQ~c@AXo} zG8~TgRooII*u?31BbA%;s^E@b*xfdFDi+>h5}9uWDt^&_Qp;||YuUBeTGr!~iLaui zheV#7A7s}cmB>^`9ZTUhM9L_X{Jpj_x1p9E96LR)mNLt+)4J7MV(YPVHF>*)z7edb zOoqhl_Bg+Q*r8d)fERFn7P>p)iDNG)CVGB_&t-vhiEsKNu6!#l)*4Q&m_0fOPUgl- z^i5_f%v6t%2xNvp*07J~!i-|H$DRb!e=x9|7R0);fiK_`p=$TSzbKcf7*SnzL3@h= zxYi+GX6mfuxebXy)(oR3*(T2fP7e=cUuUQQlX!mox=_VIlH#8Z;(}#1+{Y}{NP>YC8{0NG$EU=yvfMwd| z?>sIp;K$uZF`~eX=cgFJ z^J94Lhb%Twi(R3`may2m#Ue7~6|CXz$nrQ<48{0pVC+i|qA{r5RtYaW6cX_J5&W(S zzC^)S5PXe-@4`jLq*6K6jF6%aFrQZSOe{}p>7PkbUW{Q2E_)z2Z!z#)ShwLr^ieb> z>jh4^B*5o9D0}@QSZHf#loUr}D$ppXRqhACt)ya4f^NZCd3n9c66snj2Tx7t#0q1I zuKPLgFvQ0G#WO+dgrr`9e*$mEM`Rm-|9(4w|8jeQkKGR7Beoa#I=ELpsfI0Z^o8N- zKkN#BVWavFdoGYsz(!9Z0jHx0;ane5fN6jRamf7>*iTMqoeHh}S%H=>FNKKvX}1fp zN(EIEu>-dov7@$z*dO3r`E)ABVgYuU&M=83Eo7tB-GDnY3$bM%g3l>xtz{FSbV6$# zfs)T5h1BK_+cre{^o~gXZAWBDgya-QWG>t@pPrz#=r$fG=;~r4oCymj!-$kxj-Y#V z3l72Yp?F-8{=;L7ns`7uSs`ITGW$`}*45c+b0gb~&=;Tdj!+gs;B80f8HH3Fp(;3K z`JmhlkzJg11>+xjPV4xA>SVlkqfVoC4yu#e6i}zJ#FLs63_b6=G2qn=x8V%JUR$Kn zwZ$uKg9jlx%==k181kIez9-Wlt0#_Bl+~dQMn*L0x(a2$|)+ z@d10w@X4Qzh1bLBj5c>?o_L98uft94qY2N6znR+O_=DMNwc^H@75^L?a*yPsp(*p_vdx9xm|Vb?UQ9YRW5WVYZre!Lh4Gi^X7SG7VAtg;a6O)RKMZZ8 zZt)Cxiq5ajD-T>7avyvNxi;i{u69nq)d>Ic0tPM_jz-Km{6opkh@kZEJo)SML(S11 zdmLtu_W0l>SC=nmc|-@6^Md!kgq;zuphr+7`{2N>t`n6JAF$UPL@x)fqO7UVAvkiSTt!(+|~3hE3@q>E04Jo3MNeo#CB5xWGk(Q3*P`6)rdmPW=gpR zI|b07I*`;sokcC-^6@_T-_Z&<77a(ycKnvKx8$-^#ceX2=tE6YCdSti4Dyj=tBC6rB>$ePj1H}LbL>Fd^^J$sZ ziylOOw~cymya3yZ9-Mu!A-e$&O7;^gR1buII5t$y+~e#nIC&{&`S-Pv=x4C1BAU9Y z>-%Fb$qRol>|ufopB({a4OM3S994i>AL7Sd^r$e)biXuyA<>(g4?u{ag@xpd>C}h` zTBwDEZqq`{jM??!jQ|_!inR2>gf5)5c;&{>bQZsz#pRN()QCN`_&qFsGK%}YD0C1D zj(VLy!HQp6Bh2sytr2$#3SUgm^TKawqGk0XIWz=^>e~BezQL^6rUV@QA}K7vlp}Ux zX&Rftk?n1>+rEXk=E%iY0FFeyzmdK2`T9ccM z4p$t-6dWsApaNYmOlg{fb42ga4bc#!4l)Yx^f#;mJPtn#hM+8WuBlGRLUrzUyy|cV z2HTgc>kg+S9qme}61bBs+zUOp=MpXp(QuMccmY!Rx2j)?B_W=ZHQbYtw*))wEx|re z8QfK_WOqe3L7ePhIU5C@K~4BaCg2x)JJ>TEVkqE|h3pwD1xKQx_&q~Na``=jSt%dT57mnL$`nvS}=r*dL^8-C&ppLt^hCu^jXiAnjM9M?HE@zNOyBc5N| z`pUj;>)R3aVV<}|bp0u~QBB_`CsHF0MHaNLdr`!_V4m4oS?+U zUtLXhLT?RQP~4sPkdjPtRQhRe`=6acJ}-J(XFCZ@ zERD*Ht=t`l*jddey!LQVBolTBKQ(}D*t=>4%(@&zzjL}rbY#X|nnj?hJpT+O@@aok zGF#fEiR^8OzU%-?^ij*OH|!LGYOCRSwJHR!;^Z7AT2bifwC0dnsZ&!RlWTz9$RK*_ zOND{}dZY5t+c^(CJ)Pf^&M&}akx56iusx@b+_SlHNC#+yuUwu z@5&+EWVPv|Xv@F)^QonK4EIxEh=%ihQ@i)IAaUGcG*K3L3ThnQ<21ij;tDOpQ?5|e zM`@$xS{t#a>l_w1BhW@4gw6_kuJhRQqb2T^>ZPOz+S9s2fSU3Xpq#Z9Iy+U~2&9!k z$L%$E;Yz6{o`FkPabaXpikwW!9eJnX3M&){i1HlC3rh+>vD$OSjt?66V=Z>C?PrDe z((`KItCtcgFnnHIS|QlOA-?nye8dTG#2dq+zt)Al^Aj-%D7DfgORLld<6x1xLkt`zt*0QB5s`FP#7 zF*h-Oyw*jVDUK}=gtAV+&$-BtdnXJsG6V!gSVJRs1#sRInfSE<>Sw^hmK@GUp%@V9 zz?=wgrRfQx0sm)TVQCp~bZ>*Z?X$EF#p*0e7hzMW(IT(++0>C}Nwm{JDrr}}QkjON zk_G6Xo1Rg*b?qaSya@eu_ti?KK=>+dE1YI9qaAfNBU!w94&C%cT$*!1=W?jCdiKZ( z5klAp>DCu`>{#cI=d3yZTq>|$T(77`5+@>*1fGP6t^^2DBgQJa2N2!K_knOMy#==* z1<|R<;_{)B4&E|drizS~O*z3bj-Fd;T-qO@eenx;<$AM_ZS%&rEQZw;(qd{VrBR^o z)RqvL!T1#vv~{d+PJZACLrxl(WV9+#)SdRWEx14D z=-{G30%?(w(VTbDr8KpwQ1?M@G{&1y+C3cu2IwgAng%ILkoJfD&i+X#2@eV&j_F%P zPexC@V7j)Pl+vF}rf4bhyvhSC%HP||qI^Cl@PM+>!7AU_!U7odhY@APF?JF{hyIn_O;P_)R6D$n5TF(ofi9DA zxS>56MY9yr^W-(v*CUbFAIDfOT##Hy!1=@M>1e$ox^o6wKAg2k_%Ot)Q5(}f!FNNd z-<(tipx}?#Ih8$x97={Smb!(2$PAe>-3GB8>>*r4Y(p)&4}Q&}d*4D8o4v@?*ah@r z=As`(O*^t`!?IpX&_&Al2fyvNk;_ci=20(Pt(F|<&;W4ZR4P|8#lm?ywi;GIc>B*i zEwWvhrIV3M;NbJTb?I9eR83y$FDQgsm|&Fz6*wN?UkJ7?qvnl|E*@R+KqECj73Sls zT`N~)q%jfFSu$Fwgi9QmF-{A0qfdhZg`1&ze)sfC$!T3f#G<_}YPcnF)E<_^K_D^v zr5GDt2BUGLF4cAV<*Ml4oasdx#Aoi0?xQKmQmGMr!7encFkrh!)sY|JGJ`9f4OlJ0 z8IHB|>S>@FwgspAtW>m|ztJRHfgJ>dSC8_Vz}WGSP`6sG1u#D%o(nwO&%x{>#4|(- ztKKs-M6{zYPu;-|1Yp|S4{-@n4rg+3s*5a_M*ky(1ZBYG4Q|Fmij6_&4QKyXan2pOiM!P$tT?jb+Wt9j04`!+e38h>mQ_NQQGQzL$dmAItf-v~VeVx#B3 zvOk-Jl)Oo+A0aU7QG;$13nRE3CNkpzVvNkK<>!~=4vH)af4O!nX95nz<3@Rm)KnwS z3&-F;_ln!4G8Aq;U-j$NTnQ=*A2m{y5q?v}DTJraRrq)`G+z-1NG_|0GDdM=g++?9 zcC#9o#H_r40Cfr2Up;)r!~P1dMFqmYg|gADRLvYws^v%nV%j^;t(%iC=H!BqTs82M zlf2f1s|Kd7F#+wPmNO#;{o%<_VV{yQl0A=-HM%!SX2{CvH#dE(Fj%IwVbGJ?F80`QiWm*wjP@Q)`r6#Go)JGRdvImH$4@L=d zSaf1M8#jvN$6?;W84{jMheM_)hVT)Jac~#URAWU0H3>=DfA8wO$N<4fieI;x76X%-G>-6#l~}-U{IK}T)wSb?DMqjzxP~6jpwSfc*aR09ErLh%<0D>ZXgqeZ94kVI z7T!OjRUPX66X9;WvYky~BR}C23NZZA@v5XWqvuJ%=y?3V9H;|`nEeS%HjVGMk{u@{ zVOJZDCG1kWISS@kTHO9+R!{fhD$u}*h%2ihk6JF`nbD(RVQiUj=AxFl7P))bm~c!x zs6ba#^DAXpthJX|4FsGD|1b>)mu z#SQ@E%EHkM1Xi281x)5mG3O4BCI>mpe)JiMma(=YN)lFT^y?ljFV8o)$Oy%$%l@4D zDQ8-imq{-#QRv;^vNheTs>{NFaR)%TU(Ax?bzmS*n5dJByz$12orA0&^Itd{;`+ z8PA*47>Zg&5N{5$f_N1Z`qU*UoPSk8yHuj1ZhbbR?oW?Zyn>@{WROvJpinpq)$w)X zc`0Rd!*gi{L8}F&V?Fgg2`Jf7H^G%c3DUr?S=t@RZ`O8)kKU+To^{-b{ASdRL>YBA zOUsoACr8~#CcQ8m{2^E~>TVW_q39fSuK=^`sQcZWMBcxRKx#W;(12oWR}J{B!*3&g z@vI&Uhr#-ioPZDc!(b#pa4-@3eIZa9`Mirh*XlQ?PHum%!y75DL(gA_xx#DdKxnlc z`0cRGc@-yJ3fzaGZv>1rJK*|4yYSV{P`z+H=nQ>b75zVShU!62ITk6=8M=F;IzwHU z(FX4N35>X+Ti=(_&XY6y>P-v81)TFEMtAPSuO^hbPGmq9rCgX(@v=B3$fN!(Vl>CPE1IcL`7W@i-ybyxEO5@sTfNk%8 z!K7C5%)3>myGGBTVQ?i;G@9xps3g~e6{#|tw6 zUvNLf!~Hbg9+#%vY^B&^8hzrDy0uyoZ7DyT+3Y^F;Q;D9tGu~4G z{<$bzJA|D^-Ocy~GSFuoRyN?*#d|vt)HaeF zv=&k|4&qChA}V_7t5!wf`gf!=E0>cg%jBZuRSS6jC3$@?lV#8gT}`ybyt!X=)qv zq|I3%i=o;aNduhE0f!Cto>K;6O~(Q}Jssn=r0`JShPi>7`vs-Z+1Ih?>U=I9ONPTl z8#!Z-l`R3J~mS zqX55$k9!Jf@eI8kwzNYa1;3?rA3?%xOH1uB#p>w%utz^9+ESyBW3{)@nOUJtx1AHm zobN~gIS-fPeO%6e00oobgC(WSo%5KWh8`(=yVR;44`*4SCE|MhSkj@o{z8?AMd(ux zp-!D2X~&3>&Gx?6fS8LxX!cMdmKr^i32*DD6p*7=i(cyTq%;%+-Uu-EloPCf=T@M` zZjY+mj@~mtgD11BjBUIj*~6<2_m$>IEiPCukaTqn=fMq;Hh!{)?r4K9TEYn!V$sV+ ztAW*%-unl6-x#HWuLuR8wTwHWooR+!pz)q9r%`Z=Kwp8_(jwH8- zd9Uo>h^XZj7!W`%dQcr=UP<@`8rVAVQ_Ds0430u9gO6@xaR?g;HcMsl$gRkmCyjKz zwAJlt6SlLyo4bnD$7^?qRfZ2Zss&fIY_>J+uCLo!Poii&8fB$V1Tw*Qsk94s_jTLa z_QW?y*v|U?hT*tTrT`y{(RHH{n4#;2?UUD)MeFIEE?b*N*LK$T82Y@PboH(uUVTN&<5QJa~wIpg^x4&cx3za<_ONQ`57QDBRt0}VAk@Q{X6K4dx{l%1#o$^ZWX|u0e$I~ou89XN!P7=^0}MO-In+|5Ff}f zP^?e(c9UxI8V>waGOh;)x;I3s20gqZZ?ZkV1*wA`lV_g?r{-t9C6KksWc9ePn^%AL zcCz6HpAC8~0Q>+fA{KwZ>BiD}nrAG0ibU?Lge${CGVGzosqms5_6a5X^`Xa?3O|My zgqF9^d~zess6LU|&DnA4m`Or46GqttSk=)XNg8I7lA+P4Op@dnK^d==Ma7Ks0|$D5 z@Gm^G4$0m%ok<^>B!(O``xXR)Xj5#U>qj_|^hjw$L%2V@1L1B!Y`=g-xZ?}RGK zsw@8-sxa1(Yg;7Mm!&rF0$r?`n&SQ3ydOR9LLo7mNG6(>dIaiE{NbCr1RG`u^=$xM==f9z!B?Vywtf;@(+ zjK~i_F8e&s-ki~5@cmm9Dq{eW7-TV4z3%L@=~?#boPR9QI) z*j50R!_T9rO8yx-^WzW!SpBRL#Ml-g5$8I->F%e_NQeaWNLh!4Nm zn-R6cHt!vBlQ-B#&E16;p;aS{9&5nv!g}m3oEwaRVOL?Bvl0a2FxGbcS*1U+KD5kGs_I;{qZ6Fvk(#qmW3C)DA*H+oNwIIypQyuZZvFLp;}JngUIM^aGU9>eq&6r% z;NaRY{I6GWu9SQ$HD9CVt92MDHC0vI8>pn>uIkF=-d2`UK#44KmLtG6=z4cct@FNl z8-qoYway2v&W9N9tU?5qaaW7Uas>L`7nZ;6?(hoYRhVS(zGIyVBD6plNP|?Y*1)Px z*prb?{SDmLQy)DHZ=7A$NT-K*Y7||&xh%(^ZDKuYa5p_|=Z8uvO0hC5djYs+<`lD6 zqX{cF%8^=}W3|o-Ws~7-X>FZz3y zE}FZ@9=wc*77kqoL72d5?q|YgF7NwU7o&-Gv)8Z<;UO8qbdPcTfGV?f=T1_t08f)`SW#$Lh^SnR)HGn=*|!?W@|57<17e9 z!Q&yM39dLE8IAKE%T0f*jJ1^H6o;KH@K`&sQ8$Jb?`i;srHjo4m^xUzSv@RXe*b8vVGW%q=EftrqVmPBfffDm(|<*hL`0`qWU>*{VCf=AI~CfKn% z+6@ee5g~wtvIh&O2Fc0k5kF_W;Xza7M#usdf@HiN`y&kv=(ar2c zigD*er!h7dEq^3_VTl?_a#d=H*fPGV=n_+Oi79%D7X6hi+FpTc8_C)Z?7iXf;_Y}| zg=bi>uLoo>je#&RiV5HR-qw_KZPzTzVd2o$O1vW zphjcqZmaXo!L81pFNc&Efk1Gsyow&eFFu2Z&ojATCptOIJLr_sJ!vV=zz1?P!=}3UO8Y7YMW6h(0O>*+A|5O$ z%aOZG>F-Nvo}GdsdJbx893o@P6k{r?X>%9Wi?-tx@!r8yG zp0w@{Y(W`pK{spxz)FR9mKO5prQ49{c4Wd_+w5k4uI;wYS!8Eo=~UT=yl@JB3WO2G zrUImTys4>U)};Oz4h`XjV~Lu%`o+(lHieaI`dwLm2o~I6M~5jPAk7i7HAH2rwf*5O zsjXgX6U;>_a|~wkL92P;HL1pA^{Z*CnTgV9H&CTHU3e5*{@f5IB;MW-eWI;q7E-~R zP;w5RqREutni9)zB!4va9wh`)e5t^T%y`xZ8BHy0K*^+Jc#cQ^LGG7fvr#k|zJE|T z78dBTgR}7dbXj>w+yXh`{1EjvgNLBlL>9i8*(-a3K&V>}4f3pOzl0+(0^xEaX?@-{YqRv{u}rM3>;E80BG6 zf+x=sf}h$+3FgvRM4rRHmv@v<+LXD;IYi=&#HSvW_jeg8SK>jb+zC`#cFVMJqGmSv z;}gC&e6|4L53SB4d^TQ_TBKl}{XHzf@aAE(mFcZ7QZd9qbtux`v)#)CrZ#qY#Be%q zj^_f@>P033tyo52#w>Lkvt$j+^%nr~9+TtcFaa_%QqWEVM$34E~RTUUo*EE>n z9HqdD`Z=Kj#0%J?e`+R+WX@Gg>k^T67w9P+L-+uwbr2I5}e`BD@ ze;wYzoSk|9LHLF~CY578&hSX8v)Pp8m=CG_CAEKllb4H)$X-dk=iesp?nnj1T`V5` zG?&)1qpjy-6^+*OmoH4&4ox-nd}&gbYpT|Bw5?}8Qc=${mcHL=XFwgV#fxYJuq@#aFx;|3c_@dAlEQfz%PlZCu=R56Zh6230pXqBp5BZm>NA9QIx4$4s zimvHn#BrYY?KVqNvk^${c<uj2B}8c!t>j&7bx*yDiM|rmnVk{uCjayx|N^hpxVA z9fimM&M04qX&a-*5(O1v@g)jlvH>9;gBL4AhV=h$iNgQN5`~^Ze82jt_e5ae;^s!=v| zhl-=^WB&^Dkc8`FRy9zEB?Ex9&JJ;$rny3+!ZA)i2*m!etC=dTPv@?h`HAnGAn7@M zve>}cN{MzmU&4Mx@whEed;i#vZS7$m0i?B?=@_*G1{2iYe#;>KZ$pYCUy$u3dkezA zoD9qDCiTjmAoLnK>hVS$!)=r?fe2Y*T)JQo06#bqb6TAZxbS_#280qasMUJk4^E{I zy%Acn0qvp`R~KZT?JKP1QM7X9(^`f{OYmQ&1fbx1Oh*PR-|(V*sc_@EfEjxNFV>8i z5GR7m%Wc&8d;?yCpZsEHB2U5>(boQ!=jG4@FYnx9O0 z>c)h;+=Af=f!qdIDd$xqfoav<{XBx7LiW(3IZ*U+cmfcY%b-vdhoim}UMu#|3W6uV zD2zuN5tY8p0Pt1XE_D5|5RjYLQx0ZQ;fx+% zY|*2%=uiX=OoNrE-W%B6E~g&^6L(s{p>O^UfuT6Iz#HU3df~S>jX`gKX{Olzc)Mo9 zm=G)po_@1Yo+O~5^F*l;um25gI2oRYA{*XDv0NK{HJ^nKogy zmzU{e07a%`xCFUTt9C&+&?Gz*U%UjP1{;Kd;Uhj96G{$8o>2hFGfcy`!b8{Q8orv< zK!=liJc993;`K?9q3ux&bn)5gc7LurXMVNb&{z>g>2WB{h#F5gI05gM!f#g&VER6M zlzjCfYI}T=F>$3GL6>mDT`+}w4abxQ7)V0h^m#ti{&`UUBwu}~FIlJy@t{yI15^>N ziboTldmj6{j7h((b2zm+vD8HnE3t4LLs^MA9eio8t;yiGz{IyYb3?7p1NeKeq}6$- zPpdPpZ>#fgzgFjwaI5p^4y{go|5oR*(pKm3fvwIHJGDCVBdyMpySF+|?ceG=J*rKP zI_iQH+Tqh zAU`w1@-wTS{LF^=M$S6eGyE_d0sI^A_YCm=1Mq(q_%8td3xWS4;J+C7Hx6iZo&ya{ z_@AREvW99Id0McCdzGl!37^_(x{=Dt zaaiGCB;W}eve{6W-5(`eYu59%wPpi<+G;{38^W_JfjNUA_(@8kL`^?DXCGpp*H$ys z`ZGpA`b)_`QP64;gV#~fD46A%+Hwbcyg6aM9fL?cVJRJ?0Uw63WfiRNU*gyc$!WHFHl zaZ%#Yy5tP8GgxDHcM7?^48Vn8qjix*r-mCS96#&yNd;dQ%^|Q81Y~5~@>+R_OI?0V z1T?o+Gz`Us7phiqQHYWpj>6G`%_Rz<2a*DDT1R1eLejm|Kt;J-Rr({fWz0Mi6Qp2R znPC`|PA~^POo|R5*ZI^|Q);qge?+t2R&#=RM=flwGzed*=WJrV=sCer&m~K*dM>%3 z=U%SjdM??Z=U%p=dd^(4Kq-Hrg@gH%s2R_nr2cqXD2Y}JFG3DbP0J8%TAh}_?`l?mwjt--dSu6 zjjoM5;t!mDqW#Q$T{&xYD2=U^rdBv>29acpTS1StTS3R%?Kyh4b#hG`90#`7#KKdB zTXQG`Iu0}f1&%|ToF0lY?0oortDO&z^s}80pKa&EXWRMk+3S2(b>(+HYKFpZS$|4q zHXoHt!OrI&Z=25NEj(!FbLfw3=cD6CHBSggl*Gm)Ye*=Rfpu#eApMv*^F=QcNiQ~# z&wh{JjU~>F;np*1`FBAI`@Ia6UeS^Wnnz$in&f2u?>1PDUp>?tj2} z`WVjBC!^Y&x#BrF^Tcg(>cwYr=8MDRG>Et4ED%@8X%s)nS)xu-vpPvD)k$hsCuvm} z(!er0GPliH0|fEYLH4#eYo%v3#}djsyEtF!z9ENk-}r?2tZM!y#pI3@s$;NFLFxx+ zw>kyPVpb^HRPqfyT0&3o)3XEPnMiHT#rOgp;g8zsOl{5ggK5cAYvv|u=qc(k#e|rx z0m9WwStwL7Kp$|618}S5=Nzu-mIE9CSYSOZ2OOLB{EhS8W%hkK|sZ|?g6s0EoO z`ME}zTw-zpaB4j`yJ014b`2&8TOKhDBlqpNh#Ds63ZSVHuh=IpEJfngl1TYPW?lm; zmMeiHA_6bXzRj+x;IJ+^#1fiHo)3`7O&KO#-;}tAvmiu-REvw&4;PSc+c>p4d zhT{tP{ImhDCDzxLWjTph2p9w1(~1LzIqnI&6j!e(>@KJa5bin<*NJDj*r5>es6Mfi zgOJ%cw-@CcEOB^#&bN=_3Tu%C{o%(x4m#?$N`auQELm-AJ5g4^4{2%**JIdwn&QVB1o&;A^UAaf`-gqc%2 zQMC&5GNWk6UD;yVL2$xwSe9_IGpHSxN`atu{5@^7BZ&v?Ni&yQ?T9D^k(nQeX7~r7 z7PNM9&#aCp5Qu5Qwa$8wvp(Go*FBz@juQg-3WLm6HeoZCO>f|4fQg?XMg{agRj=pm zBqiU6@yyim77CV zrAn1-*6E0qb9N?v4PLN!LrD)}^+GSu5_&t#GMYA=oTT4#JmqG10Hae42sJs! z<>6Ku#7z+U4ETVBIN-)Z441%YY`}_cWi@(?xlrljEkz%A6g_tdj>ow{V4w;(7FgAbkQyw=Blvri z{*|nz#;>%iHisTWDEoCdY)NN6hY{9o0H$z51X)b>RCa`>?g#W0=<;YIEie9I)DOMJ zkpFPW6G?o|p?4r3!Q&qW`;sp*vqLjapudC#n@@&4zhJ2djozOxSAc&x<^9Ue^Itf zi7bV*y2hl&_eU@}y1b>kuUu$2Y&kpoN3w5fK0;_j{zgK8`~7Gr$1O;WTQB}7Y|f)C znSK}@E^;0j0Dup3M@wCD!tCh8H=`}@^^KmGj>I29XU%kJBDHYlko)1ezui`yV&F@eIlmEGb{k z?a-&;Sg73Ct%BTHKuVp_iR~a7#ap5&uug4OUw~khC4%U|d5AvRE27VXuP6l$O?Whb zXk%}P-uI9}w0Dr#3djk}kcViaLG)sPV3kCa_F7Ms%;2{@?#zdwoj=l<9hv#&W_I7R z?`iqy0Pr|dGAxZPmyw!Jz)Z@W5WZTZ?;*F~L90+)q+hgen@G7Ap8VZbk>2niI5m1J zBE8{k^D&Q0R-DJ8IIB}G)k+UkpF4L}Zm(InJ!j>1o0Th@l^ZlGH*i)iaC$lNf!^79 zCZ^UH`#Qt_cOIazN1m2UUnq8=bH5|b_OqtCa|%p#eIhmwrn;`cRL3jlsg3^EOR&)+ zp`EbN`{NlldJ=xzKBH)(=Xo~zC1!yz)Z}98!Mr>)(Y&Nj0-7=+|CXSMJU}y>^2@T1 zyNNl9$FS2Vz6)wkx&j+?av2UfSrA9cAJ`_8LA9vV^ z#G~N+YaDuKS`CN8T^tQ_!3CCqfnV$5nf_>MwayoK`2q~h3yMp(w659hi;WhMrHvg zHW8bFX~L=SB??+`(wSimLBd(k=FDSTvXaKHG^AGNezx3Ns9mPbsb^Ekwjd)dYtWg2 za-}&X%X5g>LqTv*JnHqgL}$@f=a-`}OgtR{xub564bjLFr;G2ArSK5o10L)s=Ix)(ONA?zMSne`why%h7B~(kD6#rcGiF+dJJ)hvOm5mY6V4B&g9e z@h~2$?GsrPyC19A=ON@p5utwQPMiA%qPO_;K>jD7*5)q4ryLG@6gbj1EU?bKf>v7! ziOG28!+UA+7i76qTI2yYIS$_iG>>#hMV2Ft=VgQj?E=McAfXYJdoA{o?xvbkrV_&6_12$8F2p6`~ zBe1B+Yp39HEKUD%6*Rq@m4cd8R(B>mwC+T+_GTmoINfol z6a4KQ>2ytd0SZ;L(XR?L`i&Ssv;0-vsIJ?KT3mtV+n9(gfI+D*XuHT)&nAiAMqq+y z8MIz^-I=H)9Ai}k^do4(+S!}-{!0$^>RxgHaTkB*vs!a z#7l0peJFk9<hA3U2CP}`M6%~bs?PV_ML0DMOaV=Gg;KGi9kikt^M-UpwxGIlf!bago?1v_k+UF9 z+q;mqchz>3LJ`Pa^$VLrfy_z(TUhHno8=NrJU?rjBxSeIzH~yj#PYhdN1e1sYo>jV zIjrS$1X5-P!qOx^5uv;v4=~*Z##*-83pw}>~mmeV(ccGuU4yk7#HFp$5R40~p zjkUB0H+Zc}%xv|q*}B$b*=d63=qch(JB$Ff@6Lg zK;aow7X~#$gSr-BV-QH;t+n#PnS2sMX1~SLLe;0q*hT~oRfCsmPB)4ccU=v_K*Fh!MjYKP(Iav&-5>aSC`~J)mY<{>CsC1ASUXZm_`|I0>N?fzm`JxY_ ztra*Vbu$Aah_N!p(g!h?>%R?pz94|wGT@Mhq`<@{=#Vs~Z~cl4MjkL&;xC(XyMZ@f z#M?^}oYeye6KeNHtHU8-7ZHAA>rHf@Fu_{z9g)5xI0Pa{^|F=uu90nr;c(+GS@q`J zL8xEvaYT+O7%7iK50$}g(?pAseD~Sg&Lb*@d)YU)$|J_1it)&H=Y>3q2%^Fx4&_19 zf0IXjx5lH{zxZk%3CY)v3-D+NB}5|up`bs;eOKRhx2%s`OwGJ>My-3F9y1-wz8Uv1F4`>Yu0mxcL~o|8{jSoO_*o^~1TSjrUi-`J4$*ufszl z+ok)_X$VmBDa(C~)D}4?3-bHCe(%j7-U|ejhxa(Do1%WQMSU1iN0b)#v3aQT zm?nb6p+tL)>Vr$%6bWY|n>;_XmhaU^you}`iu0KUXRd(#naNI^1v7%ti2t##U~MfL zaPn9oMo~U059N}cDEnKo*ESl4??S9aBW`vK!}A+%P%S<{>}XOnQq>%VRi-jvalg}b z%dOs{rx;rnt77!~iKiGpd(D>y72~!yf($-SzIqI%TS&!t4sc}V;uSooV!UyxRg4>Z zQw;J;P`hbgGMUOkQ8!~0JPvpt*&exr9SD$E`>K!BwPZK4lm*N5rXDMx$S_}KmST>8 z@vsl5$2Tki14)3WN0~=}JufGy9$X!b1KJAJgY%HU_i%$R)gwlHqg-{Z3Z|N|_e(}I zMg=ruk34KYTt%WiY|-rDg0tR^;1yQSEi$bC7!Rr<7o1Y4B0~x-$FmpFlx~byZVY+K zuzsN`!zP^YVXVXt1qJDJE2s<=P*$Ivr{yDPm0>>Mh%zk0gDS(yldUooT8RyjL$Q`Y zr5}Z-Ut*wX(?3#z`x|a)8 z0Jl!z+DHEevvV!NpDeJNOfyV$xRN#3$s0y@{TNSvez#inuyH^!3E$dCR8><3S$W?5eiM-H7u~_@j zn;I;Jy84(W1W+$(FyG?;#UHF1lz8}?t!=iq*q@;X`c&OmXhb~x&Vq|^(Q5WLI8zg* zdN>Q3epfNz#Uk3!FAwEEwttm2oNDp@8}UZ%A@__i+oTN-p5N0T{OuXlh7Yht&=`dC z1O;CkCPK-5o{q>z&}zfIfFs)QBpwv2XW_ZXQ}%zP4J*-vdT7JqZPJFvpt(Ngw+f(M zwBh#_|9>=CZP+l{;=kS6P-bw>(}u+b+VI8lBHHj7^vFlKz4fcK;W&%;YT_;0FcNrg zgKe07ZclAk{j_RB$5oy-ID&$&4HNPZ{ANCaRvS`)Bie939u%vG;jpMS6#5F=Wg8Zu z3FT{pte@Hz+i)*5*Jtfy0o02&%(D2u`;^s&_eWa%7fFlvJjwk$+rT|rMNC6qgR-v- zM7cm2K5j0e3|Xj=kMZ*>ze*W~S+rY;wkX4qK)XO0&WqmGc~KdxR$^)WCkUn|7S6>_ zaKMjaKM^BlDn}IiU^XXF)4;c6jg&~1mtvJ`BU0i^nI7UfzVazqzVC^WHFDPsVN*CP zSgZbEv#;iw0%y>G0?)!Fd33H`kw<4r@IarqWg%+}_T)E%Oi{BFp0xCS`=kK9*`IQ5 zN^4TbE^_xP?3q%jW+jKP&5=wJ{=FM+70jUHPQs!bTyTQ%)R_R7;Fb^N2iNX=&tvbq zgYY#~BhZk!86jL%a&9F>nRZqKfQQ*eH0plt}ffF?gP(get|Hl={_dsy&BrM@c zh6aT~TdET)RFzKI8(H6B{}&z((`8%XME4}g3t*p~feIjyWI(nDL;HOl-qg}lw!!nM zj)EXXqLZGm620yO%hLx$qXahlU$cHI{E)!Zor=>;-F}}tXQ^pe9G(U6NkR_ z4WE4rx5kItU=}Q+$7>GqKaD2hBmbae@=RF_BM}aJ{2}I*7U#0ZEm!vh&Z?=+g0yGO z7{+zcj3w|R>-M@$&?k-oBtQDTj~Tgr-5^N=H-$NT?tg7bfcthlziS@$>t4uH2~`^2g)b8<)J$C_ z-)N&O##cb!eSRO)3&ugy^j9D%7~fZKF@9)70Aq=WT3%tG(L39Bn%oQ9pID~4QH1St zn~JdgUg)?_#AGS$DNRwfXDtyodPMvc{4D5CATN*YCW4(!Ln!DM5x;E7gvES@fA<`4 zk}U<$PaeBoK3JB#BG?<5QKw4ir{Y|@$c)=fD%byEGT+$9Ghv4iAeI;bpzK2^*u#h& zpZzOF=Dv%Z8CGC&{}rpVf(l*ITt zv}7>&%ENv)MrQ7h$ndQEk(UD7_q)8RQ3Ltq1w5#0%;P~mT{r9{eGgViZ?tFF?uI(& zfp1dhv_D7%UY+IMfZr^oI5p9HDi%QFTx(1)V8P`E1lR?S>}lvW3Q!r8k4nBcc0~Sa zTI_Q#j^xNfl zfl}~hp*-fF{?9Eqr+b45IOcsS`&2)jBbDWSTK}-+vAh*m{Bo_g1c1dW zd9Dg~AmR*?+!YjR?qX=gQ=*A#uTI1JGIVo(ae?}P1Z@NJz_;G+h;QXFI(#le_G zeW98(l8qw=|05iE234Y+zX0DAy;8aR>+_61H;$2$1pK*hu7P>z&y|27+IS=V@HHjS zSiB3t^z5Fp-nXU$HPE-Biy_bI%1sWuqQu8X&^~rgzwvlKy=gk7Ej6`0Y-@VBZ(dDz zu%`L+?tJJdkqkS6Wt;mVoGeZZhL82oe%S+d5rHMcd-2nAM_pAh@u-R`e;Q4cPHHPJ zy#aR5Bj^BBgN$kR4}#G1fZ-kog+(T^7UEj{G(M(A{D0KFdz{tN{y)B_dS@z~JyPU8 zD7q^|(Xhj2N5h06a>*?mw@zm^hZ?EOB<(?mK{Re3gXleW z*oemEqwn+iT5G*8dnV=k`~LIm!R+^Yz1MoJ=X$Nz>$PsLwblZB0S^>kPGA>D$4Cvo zOMP-aWz&>Yz2B;z+ThKVNRuX73!m2rn&E7pg@pPq- zbNq!untkq;<3%xRo`B&DO5PTWgK_-D&gGBKA~*fr8! zPo;!lO84tU(dL{bxk}f(YB_&G;aSZf0C~Mr4}%jawRzp zI)!6>5rEdpYN-@5HH@G_p%R9M1S%3(NvK+x7fbDkQ$lKpAN=GPi`4}`=--EuD8oUt z1HIpB_*DgY6eSSg6dXDHWE|Qvgh<)JxpyxRn_c}d7TwXnnSwyTcQ?<7wWM75%d!JL zi)+$HFTxjC2=sM3nZE9KP%>=_W^T;>8THkoH~wi6y}=LrL~jjy9Ioi?tv)%Eu8^84 zA!n+V^CuLaj%X7ZAd0giX`u+SU)z-j=J$cq6TbBgWka}&4wX^1XCP!ALi9;l{i*P& z;s1FEC~RxhQ;N=}zqZX$AHmW}y-g>^69u`HPQ>`A#F~$;SYLC#5Gh1h%b}v}HS!&2 z86e0N>sBZWs6nhXq7RKxpYrVCopUJ)YmImh%UyaJOipie@Y1epO%@Ahkj|l_DNZ zEH;Ev%WzSJBa}ijf(rEnS4v?k5&=~pYSiygAu6iy15B+gWfG#Qjjmw?73w1@fi*%R zK$L6&(Gece`-LdOp$V6OLHwrp=c6ZqHH^iTKTluDe9%*sB_K~0dJG3WbTMoAP1TJ@ zFC__7UN|{g%4iEGM$7%mqh*zX!hHVzs1=+7zM4wL+;o_?jF01|-w%S$A`Cw!rME>9U9i4DFZ}vg`UI0o;8L0=?OZQnrbh@74*cc^Ihut+&(>c0ms7CX;E~# z!|KpNc7~tRp|W`i_O>qvqK&n?g69LH*tEA+ic?j-HWVHcU5ob^u9;rS&npV?ht>Pt z?;GeY6`Q;III9^}K(cUq)@LAtK+pP_`+Ys@2l1kN*49k)3pCHe)%$s9cgN5PWj33w zQdZ^Q2(pnr8cH3>N5zC!v@&D0tUdleekKnPvTkL?W#m3?v~T6=*ZXw!y@m%>efJ%J z>ceD7%iYqgvc5oX!^M`AFezpmZ0iT*VB?~Y58JY5{n&01vVVl_e1mO>i!IM!%Tw6K z__1ZhT(^%cmV?b6;qk0b0M}2VN`HhaeXr)(op?|@yBxA3JiAgbxcUhl3Rh3~16+#+ zw&mFpAJ1k%O+4j0dz;t>8f?GZW3c_VkH+?n7u&6U6Fk4 z5mM)I?kmWbhi)0#b8o3U6`bL^4|t@*c>#eT*N}54fXT%pP~S>PD@G?=E$4$NU1}p_ zGX{`hys=4vQfvCaharn~b^y(1rsyBcK~Jf$v|E9 zT6CAj^bj5to%nt@(+#BzbTH>&g4u0cBAEYZXw$%OUxgUYiwkLRo3z1&@83s4SWdPd z6a5J9Z4GYa&osF34KxO~!JS~*A$(H-G%a9olR)cEWlYD5Hn=#Dznv=FzaOhm1RfZ* zamABDoGOI?L1;K0?e216#*Z7ewA`h%s9mCO9GF9tR8>Kx@93jx)+}p;n{5R0MdS@Y39M~5a& ziaDFnLTW!|&wmmV#^SNuj9+jQn+IUUd4C#?&DCcEbB^B^Y;I;$_i<~2sqXW^o~0Ph zhF07lT4OcOQ)9x3m`pMgR`3B%mcynDPb+3lJ!^ExSy+NGO7x??SV!Xx=oqBJf&ZiM zk~)<1Wekd1#O7;Zz{Zj+GswV|h?gA!JUXB}q=)dWE0`&7L8cLhW0;dsCxbi47+OxJbku${o7rE5#190SK0z`_1wjvGSOE^M{mM?cfg_2O6@{;v zwzYbL4V~LT9~(+=4+=~xde2kOIJ5`+^2ZIne+`_u|2h1oJ0hfW}*qp*J0`%FX)RakZbGlq}~9M;Q)!87VbzgX)xrJNlE% z+3k82a_LFqM1NQIv#P^{>FetO#Ww=2ux*1!kZDB$+XOJlaR_3vapUV_qV7 z`PV}_8g{K)J=mg>zyWwEdO*MMmYWcJ1^j|#YwPp-)Qj{y0-^)$#|=-(QfCF4pe-+T z26iU}zpEG|I&i<;mbU^`nUju3>N%xUn?!8Mt+wr zQx0-aTM`VL% zhZpIrWv&;sEZs=&6*}~8OyU+%JYjtVl-Uxo`RwgZ!2YWXK-g9cfH^$lEo-PDq=fmi z4wg`w&(UVQmR@?YUkgVeTPv7s=Vms?s?u9V<$9@#$m43=+bBh*Pl4G=lsq zW|&1~S@^a~@*(bdQhqx>*?8CHpOd9oNo|*4>rfWWtZbN4hldOJnD2{h)XQQk6q6)N zXw{jI+RTH1PCTcJYu*Uvg7@^Bg*JFZWDdQfua57ZL z)awAePn37*T*;`t&^VU$a6P@g*jZJE7P2x=;!v_V7weC@r1@M&0_&DWke@45`(-vr zD0y)nQfwV8lA2Q8ce)k=CApDK++GT|et&hGMF*_treMiop1E4=GQdZ33}|j=MJVwB zkANsp7fLkz5+f_rIQdiZbn!2rAjhWEYr7DqL^Slg;Pl}f5eA+Sc3r$$1r5n9Xm{H^1ZodS%;)3v60n-;nM{`psfD7778-1YsGd@GNzgHD_E3%96ODG47`C-BxSX^ z^RF9J)0-n8YGAxhL>sdFvpe>FiyIX#KM zRhEX|cvPK(j2d10B^j7d*CNNpF1YDhO*-UaPO0FWgup-zLiRL{DQ=hxM17}hwu?kd zs?iPg+YT0AuO_Ij-T*`?Pd9=D0S^?eITRh)c1#E(V@C3QQROCONgo@DAtE`KRk{SV z)aX%0e&ZXy83~hLybA})dZ>?hp?=vtj3P=+iB}pzp%wgiYQ9z$r3PXHRINaJTuvaO z&O+&QpyLdw#p;#0XCD1Wk!6Ut$ny2OYLf-U*_#e0tS(WU_l!kytr5EJ_~>N|2AL8T z@RPA*f$YJXI5b}7d{BsY=t$)6w6Buh7vQPQ8y$ABdyTt%MDi`FX> z7Cc_jJ-ehO(r1OWSi+}-)&etkeriAwq{aXe_tiejC+cHz(I!auT!k(gK1@EeVn!?! zL9cob_A+OdZ*s8WRx!kRpmhT#9F_BAA)>(nJrv;>v=~Q>pj@R+HvI3dBcrWlaNnAf zd3sJR>6x%+ND`#`sdIvl?mKh*Tm)J18%q|1pUM7T;vVE|*zDoPX0cYa*StN{&(6s# z%mt9G>X+wb9l1DWE0-Dy8lB#FL}l99pBB>YwSHs-f^U7ypVU-LF!L*yn!eZv?L>05 za}vfb;H)<4JDKEVTeL-nb0HU1b~Ii)N5ZAZwbE!E$~ldJ!Ng18W1e#xIt;O-b+yX% zQvQgsQ1%%LXcupy7$_OdU^s6e26w6>LtS)#?NA|=N zXh^d|5qJv(fCi-AY+@JMY91jl%HTC^t>v>FDI|+ZPz@M5^hWS<9qjhLH|^q|tL4qb zR2V=dVH{v=9ea2Lrk3XYvY@DzBqLi~7KL-77Vk73Dj`8;(`>|@asFvt7b ziX9b&?x5gx^k;5d#O2!L^6~K4$gO9LLvG}_gsZv^Qmev`;-d6ixZ+%fByb>+pHyNp z-o{|!F4g_v!@z)4uj&VP53S(k!C-_+x$+Y*D^|%`Qr7!wR{o+GLf7hC*eA(&FH}Fc4eMgT#TxH(I`usMt z2!z(!dS0UI1zsf$Ja2;r;BMpO(%?F|9E9ddgrS9w&p5~)sKEElJUUcf#P*4fAoxLU zAF{0*zydqc8y6CYp-_P4ZPU1w}c{6lHI>DCc&h1gaKcC(hB~*&Qg) z;TSj-uR~z1c#eU_^C%*VdZ;hqWmxCN>e+)p>FhaH^Cp)C`wwtgFmof__;c))-D@wD zOKXGF;BN9hyc-;9T=nbTjp~;f2KB4!nzX*egQ|&n%6^C$0ldB=rK;bvgZ%jtqJ-Ic zeYiudeD(NKV0?IfcYS4wItZOxa_HP2pffp#PA5ZWu}kO2ymtH#3i`V&F{3N=m6Ror z3O1Hta}T%On0BnQTVE@NxXm%EW>ABTtoj6n)zVIzyQCbtr z5C;z-IsVR0@fGa@Q=+cxi%X_RLrp*(fj0)Kw?TG|LX{vYh+c9f)?Je%n<~2FAR}S7gLLNjDk)H&ZC!*9 zBjqJLyDxeaXcMJSfII?@cCn&?;L&xmlND4|Wt@OC&WUJ_VmVDzXPi@{m^=E+(PwZ= z?E?DM;r1Zx3&HI{{96;jUq82-hSi0aSUrJr5*%=8TvIhY@FR6MDcJ#@q#fjMrxymG z0`x}D3g;O;yh)e(&{c+PtC(EZsQNq{K?8{M7*G zaybi4g{14*vjaz!Sxm0`{+SqNxp8p}2fR92UgM;6Xvomjkq+Q^%|vD!AlUo9T|=82 z>z#dY_YFUKSl;+;8(2Pu;Wfnm1eReMOSTP`+4s6wCg39kiI9{a?T$AFs<$1})(LQc z=-u?A(Ah~I%P#cwh=+avy6%TLXTY0E`X$}*S@ca6Lrm8Du2amLjW9eEpcaP) z$F>erG$52!xcLSFeN_O;UnvdKd-(M8-E`4MF4=u_E{}C@o6CRPTrPKWQT`Z-MIe<- zoCDt5DgIrWoHc7!vSIUAsZL$%Tdm~EWJ7)HJ~DG|T`Ycw)_q_d3bz#9aWz8^91jk6 zWpB)iBK>d7OXg{8a_HFP)cmo@$p!fBjo(82_De^G78P|RM@6MUrv=Sx5=%4I2$cyO z?A50?@bR3kZYHr83-!O)3im15JC>ZBA6t6$CD#>RdCjGTu@@#?e&r?njA;%G&tmvK z9?z4RabaN~ zal+{HMxU>z2(YCKmyoj+`ssJr$ocpiOV-SlpA@fH8mq3(8kX2tcyqXadDdrL6TG*K2NzhUVibiHZY(%|`znqWy1t8k zD8tH`)vH22Vq(d9_68LXajq@F`|dg&7Qh?unkiSGxgL(!dohMljl#2VjZ)_ZHUAgZ z4EwH-kke79-4!u7^~|UHaFrAjYfd%ljpfAKO?*q$4Bh;@;@t}sqI~Oqh&>rg{-SL> zWT_F+-Lb2~A(t&-+;2sW;Zy+mQE$qQzjZLRCeeToQZLTXw>DrjSC6Dk2pdhAl&@UI zl!xQ6=4Zm_RI0v~V3}DxVVV=i`eEAz;BsH~=y9V@9T!d3k50DAZ7r$cU)T6-Pa!%@ za3n3n;Sk6VTe=7l4(3u^>}l!%x~zQFV6T&;Zz`x?z||~I65#SvOjhxD+2|E+_kBVyr7R%IRm7AJ4F?QQTc!ZLxN`8X)=|eFG|3-%4YC$xc1a|`Ynaf#Bc39&>fnqUq8sh~V^}L^ft%Mi#06&WB z)x5)0bTTk00}-Lo@J~Gq*~|3n(52HiNz3KY&#y%;K64{8bGG&6%s;R-k56-L&GE|Y z!2L$qnrC!6ZEI$znEH4@Ybd@dTeJ9fV{6J@6T$3&`=Xsq%gwuB0iHH0 zX5fi;3^S}{5&ozvhh<_}-^0n%RM9!HYaGPmHl|c6%cs1z$mroSkufA!DQ65l$SNV7 zS0#CMtXj^D!WAX9yo)>vp}CMh(t$kk9kgs~7^_=aBgrAjX0Q~)Q9oKnCfX{&jXU=U z|HuTn9-e&^YH52iYUtB8qm42k3{Eh`_VCs6WJ@(lzeuBmzigD`=l^A+w0y=N2ukI3 zuAuBSUBxqklF;e2pq!y%8bR3sUzMPIJjV#iNof(3YJO6J(jPO&EjMxE5$y^}=C&(y z-dF94lr~YvAG9m-qux}zGL7Q{v@7_aEjGc7^fKu1HqWuCPIHk~^{OA}H8({0*TosesKk&x)Anh(b;q4N}mNz&mX= zlIPm&@AnPb?9cEXwAtCK{Wg0gzt;$57-K?KHv2P30ByE>5t}_%QKHRO(V&>iwqOs0 zbwr_Svk%52Z1y1h*w%jdt88{3iD7K^+c+sfp?7UIvtfNm0}CNl?p^1Cd^>h`F&fmi zbLu_SbjEECh|9#rDQ|3W*T66XaJrhYDv!UoKw$$H=6MHnkF4|CCgiJTC{}V>;C+z*D6IF zUA`51i#OPbwM5RO*p7jnH`Iw)U`fQfj3nIT`O=fG%o zBpl1H^j`lk`C~|~qvAa4{y3RE3lC({XE4VaFp#Ne}$>| zt<&!f`nOU4HtFAH{%YU-baWoyP*rn7Wn5LCi!+oUP};-qbQulfqpYb^_>2rDL55auI*LA zXWn#{8os;jvzv3U(?`OQ<>~M~OGf9(?P0Sk=vBJArf{-dI@^xU<5Bug%@~ajdHjGS z%vjR;sUIF~YsM9-F%btB>u-D$y>Scl9)`{`@XtVGtU9Iwwgc_*c{rSXkzKmLj!Q8y zaA5h>{qEKsh$n25GE&v%+LQC`^4T%F7`?OTTpfK+S%~o1cNue234?2y*T73ptAld> z#YyMzQyIuh6J(ig8eI|`;U})n%yfiVahKwULS(S1VIv81Z7`fron&0Q!D`APC7w`C z@HEaI8Qm18>)^S6^>gMFzL7Il{FCkQ<)pBA7n4Z#2cCk=U5`PwYG&E5{vL_a_ z%lp~AZaYwzeFT!)AzbWfRU!cMF!)=vp(8E}xaC*&_N+?~z<&w`Qi71^T2oNDffkbm z>}_qpI6i~PKNf(xt=zh|k?2_@f=`+kOQqK&@4#1-^M9}Mm;YP7CElGxGlgwUK(tmE(XtLjo5o4=-r-yCL|GAYKM6^dSa{wA&u~bXA&_DPOV21R zEu}$rCwjor3T}5PzSfWLXue7PybGl1kOj(_BQ#%9B^@y`;?;^Bm>S!utc8e05LN~D z?pqJaTdD*H^jkG})@3QlM|s5@HNoZ3n4>1;!G)sc2W2Nm5>A0^2P9!SHYHhyx$q#6 zsPs_FUlEUOM!?!TfDRK5cBh6PdDHHpm%@lDn&I5RL9A_keI-i(5xC<8z9S}{yD5EY z6&rZF zZouIjfSD0}y+Ec!lEB6Dw{l+I3Cxk+xTuw54z-mj9fCHX0g!l59v!6^QC^MJe~R5s z4REFC|5oxfT=R`9ZzUceM1Pw;KbIe=qR#+Bv0(Hv4}^HNw8@7A(by}-v6gyxON+-9|GZo_v)!#s6=>pO~#wVeMKA$Wy z##=AS#yVePdQj?XK3rBLjrG~zb?;8DVSP@bn>8?*2Hpwqr5q#OavZh+6R{n42vxeb z+$yIaFdwFUWg+Ggdn-o6G_7|r@%~)pAIo?)uV@qBdP&BEsgzL5E959U3}9hc9o($Y zn(+v>s&T^wn5V6}%G{z|-W(LN60ndLH|4a>KvhezbMkOe*bLq&P)qmV=ccoHkT0!y zIKDsC{f7iZZ=4dn6RJh@VhD1c#Nfn@+96Iq)LK@&?o8=7)KP&7k@JPHdF!oKb5fIZ(60>I@O|v7S_FJYG?FT}Xoc#=AQ+1WL3u0%QJxwiun6(nv z(#w#G+ZnHUQJF)y>gDYp#g-lE_a~qH@3-o);P;P~&Q*^+uRZZp#Ow2LU2UhT@&(~*Z6*ffeAOGpkYk8Q(Gj5(@+&nODJ{UKzd%KLI z&rT4VzOn=bFP&!}Hzz-->t+6|u^q+>8&r6`lh10Nk4b$r94yH9v&I$#V-)BZ9kv=n zLuZ$!s2T`E7snjFIR!CfejC%2$b6^BS!WCl~eswEE&!dRk!XAjA}a zn5dPBvTmXsRiaJEsmHKmjzY=mi#K&ev^)+U+A9xRB(F^4vQ=HTuS`ANGFbyw-*m$E zm8rK|romso@aCD@SEfC^GHvT8v0xMG9Mm4BU_kZwd7gZ+9r%$4QBITZHXfdKb)s1}#Z63?i#iviA zgrc>cYG{^IpT?bi-T^FAwDm7OeG(-U%?+qJb?J-|V|G#Hf!4aZ)LwbCTChA1f7{r9 z`^uw52<5R(>v^26qivN(vm50ZJY%=>4&09Nc&g4ajp#I}_x6=Zs|Ctrefi%{_ualS zX%S)_4QOo`wS9G@%@@lw?fU`Uwy#WD)lnwv>z-#vx35fEEm%*#?y~0@+gB!Sl3Aww za|(D5+jhvEHeZyx_d8s3>GqXLt2*oH+W)*eCAUn6L|YG`{bz%OTJ;Itiq#fdHZ)3| zTqQarx(Nx~*qUD~#f&buOjV`8+@EfZ4vA)wz>V!woBb}h?AZD96^|3BU=7`P40+6q$ct-WTk7lXEb ztC&3{9-KaCAk5z%%7~Uf%E%s*`rz0TO8Qo1#4|-!>-2~A*#>T{MdbB8kDqpA4sNs$ z-F)(@_$Lzb@p~``MBUj)HkyTQL21>sP8s>vmI22q-01%(*+z@dtzCJg!8z-rD^6F) z-A)!7gKq6=8nLI(zY-RJJO^KteCJ??X8M}!m(QAT$u{w82_WCEKIDhV+r+QsmiVi> z6-eg;r*;_aY>QuO9PuCY&_AxXeEF*K8BNmIUH2-0dCA&rojufd5*CiGSm= z-_O}5|Fz~(<{#WC|Kx4r*EWOlQ!(=?^zXMJKib+6|LfgfIcA&qwJg)PzxejL0o%l{ zwUGS3X3(^r0sJx=frZM-u-nnIV;ntTf(9c@K9z3D!)&B}&38ZKW9y*r!;bEU9Wi6U z58gg6u3jeN4ptiSDmqt{J9#rsjoH?_=XkS$Bk=yk`TohjCGyow{-t^y_;)??7r}#? z^c?jLX8tfj47K#fy2DE`JUNX#;14X3mBcu+xjHACia<6cIoW(YMQ8Iq9#l5(zHPG6 zhdj0}WmfL|%J3)D{0e57ur3EasZ%%d!9N@)#FNC5@VgdVY&=^zA*t49d3+SU?HTw+ zPPfJ|i^o-3PN49Gr+tJIFCkl$=-vrI#yxeOpK%rP)nnYjrbIiqCF+P0`3Uop9-Rx& zJhPunL2+wm0rEqJ9vl;~H(@8dh`l9ZaPf8$Kl>MNTdEATs=7j#d%M2Er5D91wTjBJ zyPumD__iAwm=H-dW!V82c*8I!JGdu!MDlrr$9s&Kj=(EZ;a9stTSban-N}_gOs-(_ zvAUibDL6?8X5)VVWC^=*#{%BDQLO^U-}9?XCb!x#spyzJS*i;IdQ>y3GcRk0!VBxU z=#2SB8Sb~@tC|4gX(K`p(V;!|iTOCpgaIZzWKJbfLZD$>jIG{~XB-HD!%eLF&r-F| zlUlfNbBnxV`^&|XwdhX4gA(1{F)a=H*_Hh|W{^}@_Esq7oUmu6Qck9$8 zL6dgjBf5l0em`QkQ^Isa`7IfT4a0u)WHF~8vr8wV?p)>^sFG&WdLLLc3p;{2GRR>u zwr{uEahcAhdhN3V9X6*?h{v3%)-IFvOSzD&wt1zBzP}3d4NlQ}M`6}qM1ub!M(^Ye@F+8ZS6(Iv}%^ym8Y^*g4rb% z|9<3hQ1MogXKt)SCjl<`vw$?W;_U=O;rKU~KdIsUuM8|OAM$T9SU$oUVG9kaUcE|# zFCW~45L7gA094c_V{<}c9teZM$?rjZ-4#BmT!*%p?Rv;5>IpelG27X3dn_C$ zSLP(&P>Q|%rTCjHxoZ$YQ$W;r(QEWjeoBVB6aU{?pJYr#JG`Jxl|&cBte8?F=LYU1 z!D@?Y#}}YMg=bz|LLxn}xJ+lZ1we@CK!}v7;Yp>#ELyW7rIq<_EfO8m4V zoOj^BBrD@LBUo*X?g#aY$wIY*!u9YM?vWkgBE*tsj%O2&ftZqjYHSt4&XWBCfy)qx z7%12?59@BN*-CjI14u`=H#0Z-wo=A$cP1pNO)VuDD!LcG#X@4=rpix2YAgF9%P#j- z&b#8iQA0v8v$s-CBdJ5kA8xNa)KBJ?t&y1~WM0Hy>}OkwAGHVWD7-OHy$yw6D+E(} zx4Y-^&C5*ppf57Yl<3WtIvG|w^?u8)($u;8EgM#$2GxE`c!cOI*oV|HWPR`*9Iy;2 z3fRtDzjnoE=EiwAqyeUDD)zx9pD*Lzn#uSZOQtTvPj028WILv6#!jL}=w>Xz$aamS zXBS1klM;KzHT;ZF=AzFz*rcq33Q0S^zRbe7+bbm)cYt6UnvUO<1<@hf+R`Y=g4-+S zFy{cl7cO$QG~Vn-mv*k%7M2P$K8Dzzz+$#n7OI<~e1#kAVX=V);zLMEeD=m01JxUt zDZJJ0wV8AO@axe5O1`wB)BB=g99?um(pxPXbrx)ZQZ;N{wpQQL5=qsj+O$N)m-zIs zcnzgcfGf-E_UZn<#I#X&u`d>AqeQ-Rk1VrRdPRzcYDh%nc`{w`GxYgUNZM zoAbJ{IXUm`&v~55Ia3PS&7hb}%tkHPDgNEsrb`V&JcpEWMG6AjE(iRkZEnmC-X-&3 zi>vKwyFGf?=FlSyLBPL?3pr=t`5Dv4QXC$CQe!-hG7+mN#t}y(-;65MkxY90tJ+QR zzlK|)9AJXjY~`l3!Yj@7xSP4LP@z!zMGg=Cy5Nhi+1(@;vP+QT=I^xQpsm*K6p zF)uGPFu`=Oxps~G%6=rtIyDMM7^O%K0b3ww+RLb>Rk2IuKHU{>xHv2Jj!a|fRV82Pzf?mf_{ zfbW6sXoETgEQaL-LwMWwOs$l5NewUno!4v~>fX zXr*myI-aPV7z*a$q~%8C6p0a{wc?iuPf^Bf&5k%!9LKmf537)iR`C$NH7lu)LTYsc zeET$}fQFh-!VDDW7e7)?jd-JL8w?_+rZ^-oDb&w^QqoVJG5#h-m2kbDqNFpJ4y67s z+?j>=PshZ zPxR#nrddbGI}e-VX+z6QHve$5smEM`%5c~FDWzbhmeS2+ld{xpW#NfduO3rHdlKYh zJhDRBYz$!IXYd)716haX(w1EgZ{F`krQV2i2} znSVfnVR=yYI0eR-9^5G;I`BW|Xubt^}LL4noOhZmFC)zwPLdyq`Q?zo8p&9UTw%#7?m64jTQr>ekp~w{I zx3f)wj=_9}5}3I{zbnm;(7*nV^kCqoh`$-3!Cj1VC&_cI2bTauQ4XlV?SX0rb45Kb zbwNFiQG%+zv~w-UDuA2k8a+?|-&gXC47JoY2Bj8)*^bm6fqjZXyNw)Tbc>5%*r$a+ zfab_(BX6ISw|st6eTq-eyOpPK^@m^-BiNBXXvHV1$3oR%c2omOQUyp1@wA3S+&T(Z zf1}gFBOKCX^^k8`5XU6HGsf$CFh#gC<}6cXw=Tw_!a^ihY-#=%*}{4Qnb(i@WuXpk zCw|Fdp?qtb#S)Xnm*Y(qgOEk$6h*(%PyY&!z8oYuLDLKv+(!+;8kgXQ&+8g(uSyEK z=_-K~-K3tqb*5bXp=_$*%1lgUw5LA~qxkfP>hYhWT)qhIhvhv-Jq|FqKR(kiVt?RP zY?yXuQ2lt5q^KXa7+9y}&_A|4`oE(Jr7p`|`Y%6c=_>n-Q~OTN16ivdx75fUs_ zw$>Hpg8!H*n{>7r#nOSls%W8YRaC)_r~ zrT4NhgQUp_Ctk)Ry3_*XW408=zr=3TDOGgjPmz$b`a8&5RLon;<VcD1)aO(+-14j|dk`R_bp z3=7|q!W2ISgp1JiarS8C#Dg~=G~GAsbkmjAcEG}RVxT~mTcf2N+C$!ROz}^rYy73- z3~TRs#u%ONZl%%jMv0fv{JP!1*AMqJf!)9tlZcX)L3O{@v&Vol-?eM&DY!Gn}~-fYh3sCASBhTN~AH+gPD?f26XYN%A3^L1#nL2 z0|lc^WsF4K44j-sL6-3g`;qd@sTKQFWKfcy*+;<+Amgw_L%`5QKSEP`xGzG1hxM8>#5~l+v0E<`S&Q9(@tr ziJDlTz3gU)-0c!+e$rIwVJXvILOCd0K-hk@{SNq59H~n`pr~fcmup9@&87L+Ilqymfj{mzW zyz}DAjcB7uamk*ts*8ImQHU%i5Aqtcb4B=8 z(T-Hn?WDUGR-KtbH#~1DVRT%_hA19;BakA>D?|FZ&q`bL7z`~%+PR#Q^b(DcR0`-9 z_$1DTY+Hd4=fAk|B87}-TL%FOx4v2j-~j@>@L*4djuv>6_q4lrk&nR2S$xZuIKF1C zD@?FR&#NaHtq4C3M5&?$-=L&BV*(l-8CNhSCd;2n#uvb;X1;RDsx z1$90fP%s7iS(7DG6;F!iEzKtuwWzV;e?$apS4Vb`nCZx5eAJI+<`J3`bJscTyLoKU zv}s`J2p{^>oMW)jUK}!h<{St2oLYw;;^%Rf+~Qy+K-Kq9Q=<1=LstE$LPj=^fcvYe z`;=<*YVF8W&DyHEd>2{-i?a|jLc8xEkFlpYk6|@Rpq=MJyBBilRsYoz-N$Jc+H*i8 zqIjeWtwnk7i3HpS*98Ubdm1N7AkOshyom_^@z-5godd8646HOJB^1Z30IYRGa@50x z6*aKt7aJKk)d#Dy3yY2jgtfYI4y!Y*jx}oGOdM9=>WJ_CkC8i_eWbn-Fdj=?N?Ix_ z5oVVzGQHf?r~(-ET9uL`hdW6gw~TxN2e@SPIYV+6Owm@AKNl*)M7*_=ltO9VY0e(- z6_UDmn-eD@CIwJFuP#0tytP74MOmdT7LGNAJ{S24RKVT|-VRb1nadeuN2aU!s@i19 z^s4A0_>(TeX-eVQouqxndB#da=p%fnB#2E1+KVI@rJRTHfD+GsCf~6xv%h%Quqe1j z{l8EG*JPsWOqYI`%x3t3Hi2fdUF=}tLncY5#94l{!qU+?5kENA>sSC`yV(RoHkWn8 z*VL?e=FxUTwJ6{))1h(JWzmt)Yo{0kDW-8TOh$X&-sX7ZydbT%+hZ=K8T2_P992d?2rJkt02Q3u%p`rc7XwQvI}g*g9h08gl3OD zOIjs6y1{bjJsEeH6^{6n2C^AniB z@XEX%!t9lKu_VbYbL;WC%&*`CN#TGxN2J8r`qmr?@`h0I!SxcYL{acNZ@mpr`#DRZQ7(AFK3 ztm&BW;G+Y7j0)9?K={qr zMs7cJ-w|c!jV_T&O$0X>vQr^EV?J3mh;8NbdOZ7wd2K9`n4)ks4@}i$1Pra;%Q;~q zqs`&OGdj>#!j7hX1Fy%f|-qvC(^M@*bPLN5^~Qg(Re)XrU=UsZw%FNvej_ zO&J-7Wqi5<)*DS_@a*%AZMZ;_FBJ-_$$m-jFJ^4c||hjv2B zeHv;|4D=|sDraH-NXnfVW^%RZvz1`QXfNtj=%<;F$oLB^SP9c|o7*d~9YHm>yp>0~ zUhok|<@+nx!9@{zWQ1QuCmpR5CZwYc`nOU4Ht{zdeU98iY*Y=q&T|=x(@k-%6}k%W z5Jw)aWtdb>BRdE3IhR^JLLTf0J9YE$JP*IMm!bAAjbs+p5*y-?`27iTyxFV!-4J!VRzy|8K_l%CApEYXe3*);^{Hr79m*0r!0 z55fSa16IeKtAuLzP-shK@?{l%B07=D4{+M%g}^Y}hv8H^ItO@f{=novB9MRAKgvID z@;}VY{{}1@ixkA{a~=PEB6mT%aGwb4a)NtWYYBQ%wf;KgRhf1%hpNp>xhqG{c&x$U zaB?ZR3}A3RpZaY~M^_LQx(c0uWa+BpYq7brPPaZ}RFH1KZ-XLqJL1IVu0GEC5TX!@_=jXk5T9PHG>omoN}<|zWH#@o=I`C(G=sk6!D zgCO#7)h@(OvZf#Y`UM6?z)moR%x9t&cX|q0B^WK47=^zrcd+Z6mUH3vrbNN58Nn1A z(To>ll#C0o5QtI0Z@9w+_oBRpi@$`#armn;NR=Fo=94GOc82AJ8jtuPIC@xj#?!NOGeP+9)aU~3+C-3k@Pff**EHx#}GnF6}+}9}+=xBGu{y6=w z1FOYvxoSDRmqYQ3of^zIr9)S<6j=Y*(={aFYL*^h)A#Y)j*}&ZwjFj2xg^H>n<8yC zX5c}Yhu3e%AY&Sc=*+^&O6217L552Htd_AVi=X#!vn?xiI!XkveJQ6_k}o^oV}6Jp zbk=u!`=PunsoXAali;|;;MhFM;5ZgIMEqL1Av;@YP*g;!U$OdyP(-SD^tK}vH0NkO0LL4O#P>3HfBf&xpHiZ}zD8%o( z``Z68NmYnXfF1IXDmvILM8$2UB^+Z5zW!1U^-Qfz6bfjHCqSQ%u_=XLi7^23q~8-C zH)1?cF(JpCo(QdjIi-eZbNXi##-|?5|Nm5vu4Qf2<62Dqxau)(H&;%>)m>RgobwHZ z@S4_xBt~2H*zZVPqZ5xXV)+yne_LK@qaGGAH0m)|smBMs-E5&A>oLtDGadKLQPyGmst3J5U)44di_SkiXlt9cB0lNCk3V7xLe*)~6uXAUmz8a(u}`p`bdW z*MKE2LA^Yd+~%k6GhUCGELM&%T=@&K$PC^dRoj`W)`@!*Y-u9e*R5}!%hj#Xr=NzF zJd!M5mds8{Mgv_Iv_R}_&I?n*KHNoBKZisIg_ocwV_RtnvrCs5SCwyoT)6bRTZEIa z6pg-wI;Yp|fIffmhAorQ(Z&u~I$M^Et_?4V*1|U2KN-Qv=-X<+0-_yyiGQ5MX!?@T zHC5$nI?Uj5%E=lGhc~6pc+3TfEQT?Y!iqhC0hGn#p$H!1drPVuS)5=Xk3HOQeeP@| zkFEipqb@U5{0@~MRoZ~?(X|+sq5t;QQutfB2Lb#&E~_e->bDm4@-ziqYpV`o=%Kh> zzG@V7b}|57Kg6GAwtkH^2Kr^l4b!b{GrbsoeN zj#S(Dd$}2Gl{1F{thQUBAs)jnkd&HXcJVSgA)Pil`D$^pSsL462J+3r4Fli18G-=k zaX;)SlY≷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�`9Of)JFb8cSjRPavdx3+bv@`@6o@?LP?dS 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

OEMh-}lQ19?=R3sKsP%mD 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�gO4M216 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 z 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Ðnto{8jMg-ZykgM zBgZIX_+bVmKShA>!-7D@2#Csg zZ-l+V(N4n@X_$Z^2{dYE7;<%J`~8$i-dBMeKw$#n|H;S_6hvE(D@EB$P#w)76;e{F zKai;s<_1h&{xV;&Q|;TQA;8P{Oa>wr<&#`G-#)x;*_ znp8kxDJLdyKGo9(4&vH62`7nxaS{g9OK+0+1)K>Zl>-V02%0L0q2Z7buLk39S{ml2 zuElq9lz&?iCtx7;QeaK`6*cKXz?$@PYSN|Bn)DNc^vaR(Ef2r~rgaJA zCqd6Jaz-2os=9T}=kR5~&i2qCve^;%6?`X0`B!>~N!mlqz#jS~oRz}iHllzC(?bf) z9+E`UL*|=3WTox`n9&$~%Y{VxbFv|*{*2|06w&L;r|4b9Izg;}LDyD+D%_H7u%sg> zH=2xU=_Z~Qw#08ZoFdyN#7aO}LJXk@ONiU?ogC%gmc$#AqfAmlFartkh2Mh^Z$?2j zVgn)|iH@C`C-y>U*by3{}Y;xQ=L%nYRhNwZdB!GUONjS z`TWqV>;vkl3h^8!B&QFgk{KiGzK*ak@|bt5MKn+l=}nR*+E&4Q=-2qrKI(gb?y%6B zznp6gE67#ak=^J5V0*QO;u3QDuT;|^vy<=zq$Ljzpz}I}@M)9*bM6F6@eomp za5RfXgtIuL4ly-t(1p%We2d>LJnbTrmSLCVSCC+m+MyV*dC#jDBqa0%LIw$iBN7FR1V0ps zVS~gOio|djiK0a!7eZp2Ai=+a1d|jASPyyc5{ra{dIBUAjz|Tk3?(E~M95G=;fTbzMS>rSMAjg2iXxGe(c$5~*X!2sotU-G&(?UOPqAQ1nHHzhNK;Oh@K@PKS)HYHeR5y7Z~fn3i$7XssNPV^P(ZJIF(!?as(1Wr$PhK4SHTg zmi91TQ|=fKHEgFejDKam#-z}EE$N|Q3xEtc?j6s^+(u8UU8sp1mpn zZO^RA>B!J;cEi@meZR0~5?}Lk0yjV=T&Ij6A|6R0`HnrZI+Zf0c@XP_2xNK#1Vp*k zty84?>3#QF|6^*ZZX#yr#1z>DVZiBu_a1w8I&h|hz_Aay8~*;Rn`pS*9rxmGIT3~V zTcICZ`s$#msFscd*1;n%npUeLhG0auyk z+OtpdaBru-oUsb14Pw?hP`?h7afY^ZhjDu&aI4Wi15LEgaE1Y{vZ1UnH|q10%f z0bl#%fc_9*2Dgy1W*Ow@>Co@N&0YS~wog|mb(QY!0hy0%>gP|Ub@ym6wdHOySW5Vd zsck=Q(SWefOmY?kA()yW4M!3lW-be4X|kRAI5AX&afbu+aFiL=JxmV@Zi2?>YVQ~mPL}RfL`|@lZI93 z_7E88$(MYkc0?=An6UlKyWp7szs~s$2zJjGhAE$keU?FaSTNuCah;n>!#d}0iJ_n5 zaxc7|p#*G-fvNfh(Jnvp#{b=~9RjT#bj&Kf8{E4Rx<~HI% zL@4G8Ow6Th#aur_n9mi=pGJE_n9ps*ycEKm8yit9qky?5DU8#7fVyU{m~(YrXkPF! zCpaW$I5A)G8$)v&(Sr!3xdIb&DO)ku&k*MG1oKa!y&;;<3t>J$#KOZT7jH4L zL`G4*lLuos^hSsiR~D8^dUV4I9e{qkzmrbOY{QBo8ibr0p6hRv&~OZ^pyBj+{#J%z zX}!4G(q`;UC}bOr5A{B!Q;dVF4}bHiUHGfilrK_~2};eF+K3MzLh)5#;wxoq@9QV=<-QZacTI_PGKfAWo*{ha3sx#2W|8D+ zb^BO9Bje!k#NT{sF8(UM@Lf;jqB&Vw7!1U;b zxjJP0c+SJ@m}-M#6)o_?FdNPfhha7>3x{DgT%=*C8=E66)s{=NY+EQ`n-@ZE>Qem8 zr&i*xQcb={H6|$4;5W&8zkA$tt%ROJNV`_SNVS5Y8h)t}h_h(08KAIfLQ-7x92y2S zc<_!QT&}GVFMce1}l}x(KQH*!-NTn+Bi|eYm_>EC3KdLnt~BE?4t

WHty<%QjU(Cy$B1*MB!3b2lRzB!>^@!TNj~Ub? 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ඕTYPzG^7jr#OC9Au!zHNgdRYRbsf;qr79f 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ℜ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

qn+U_ZKo~x@o%fL8T_X77 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%0A@+-ZROw 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≤>5u1M-P*oINxdy3+<9u0`vhY6Js=tW5 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�`TXX12Zco%Eg#Ot$W*o)hSbiDmpfO$TAC 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

W;nTJ@9X}(+H$KZW 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%0DG1e}LPEO=F2lzSJap4GM9# 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 T06(RfcDq=uLaQbWuIsUhZq)DUw)YKXbu1f$R- z#9VNq0=y>=PSSdKPadR(m)}0l zkQ!nxNDVQE!>`dHyeAJ*L(B!2>ipq7d2pEmyeAJ*L(B!KA?AYA5OYClh`As VN_ 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

LY7HxOVRJ^>pp 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

0t|bnC_Y8R;UKJ96xQ_aJxsSfq^2A*m8G03 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
0(lp){snS=g*s2|@GP}PO=$0g{B#&NI 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≫ zQ4t~nqKk@(8U+zo6uf}oHLI@TWnH|pyI!KAe)X%Wo@Ao#yZ?80zwh}!pF9tluG3w= zs;<6Pcb`5np2abqTlNyqBD*Kmier?=@HT zvX1lEqa*PI{P}0vmdEAau+_G_9`B?}sEwUWF}}bQBsvR;Y~SWPT$Y=zCbwKC zCV4FXjq~t0;63_Q7k)mv$ZdI&Jr$1-We2`lNhp@r3gi_d_*gaNsT-WzR3BfGa}(|4zM{ zJ)hLK9FM)=A&p-EUXH(RAH^?Nh4_Gd`70WK`DG^lL^R^dw;?{+)uAKxG{Fm^<1JT) zA`msfa%BqT30~0ee9M(3RDdW-*-@yF<=XZXbywN%5SAN234RYOngBanp@(URwL<4o zk7kGdK@-+s=nd*_Lm?N{x}?xe>l`aNl)cNbQbUhzaIChW;M0zk6*`;heRjx0YYI7` z0hHCQq3bBk5uv^JJ68A5XYV;y&(JJtPrX7Lo^Y(fPy?kI9J=Ru$0`avKtug8A zb!=!$y<-)JPIFSwW;I^#9Lh2Gc zQ&4run2A3gMg!d?TuUN>AbJnaRMc2kBsuZfzfz@~CR8}_A6`m1U8roT6-h*1`Y|E9 z0jq}b%(#SzP_~C$=+N|(AQ`5D!miLK^yWSdCVy%}T(gTQO;SBcSxSM!hEkxT<(@;~ zib~3^m__ z)5#y6Lz_WX;w=I4c&m;$Ofox&#u49Kp#q6h5{Q~7RC3}Cq?xa}7pDv-ZhVKF;hK(2 zWhV|Np}zT0z!TZE-%jLp{sltsB|4pK;k#VuMxuFJ;0mGl6Mc9hZNFT}y+z~z(If7$ zE#E?#6BFJ+q7Oi?MX0}?NZosO;s=X8mT&PhG@bWE>WTh&Cece)C4yc{^lQ*(DU9HW zY#@3GbiYdIjYQu>^~`rQO<^d06Vc*^vj9fNuHAL+A*Ad z1<_kWgm+zE%01~r^bLq#{&N6yJ<-p+NOY~>H4wcH$6BrzdOOiq&~(XngV4K(zV~&a zSDZ}c?1}6p`nEJmfAdhrZzTGli|D#hOz$T;izXtzTVCV*9w7SCCyBlly%pJu=m)Q- zm5bX1zlrFZA%CUN^FOc?uZ8}%3%!Ks9Ga>6Rtf)dqEDw<=36cCbwr<*PU-7~t|$6A zhv++m-avG{kLWc*ZzB3ss@T3ezhr$Hh|WTJaHaG_wi8{9TDMN@yMyTciA1j#dKb}a zfq$3S<3*w$LH_R<&H3L;^j}b){xFg0#t*0iDj{><0sVWJhn&+w8gog zM6Z&`R{ABo9V^jiL+!No`vDWM9|jC&?TLy%~&C`Y*^mLUzoo1e%P6J5dYJFOvPuoe? zpZJ7*0yTtCEzQrZP%8D=cIdB!;naM<%$okTXA`WWPzTte0}M$lf1qS%x*p(UkJ8@^dsi$8(pj0| z#Isx|qtqrE9VuK*Vbq2J)OLvkB5K1^@A*KAovA>sm1v;3!5&Vhww*Z6l|TwR?)jQ` zn&dbeX^xRgPfgYix{gDpuB5g`8g`~8LhZPBiv%;=mmon8s=HPwO35hiX*7r=&Tx;R zh|I2uGu`L|Q(s+8B4;r;G`@xgsKnVy22vNnsuesBLjC=W`ntq94DE`frlM<0tkhVk z&WTk@W~6>dH8pXrlG#>zJyq_+dG5*pbdI+@T#b zzIa0E)Ihyf`YLM2iPyQmYr($Wjczk^6EzYm)JS!LGTCiCN!{!&pa@r(8e`I<7f~=R zNWs#i4BpR8T}1_-lxf4Dl;^gyqE=FtQh~O!dRs{yl}c_q>nJNJTd8o{S$(XePD*8` zUPTonDTg6lk*=wSQQ;*;Y#GjrQ%~yVv64F5hoDGg6fFsmG!Q)Gx~(Ln3(+XUv~49_ zLL*9sp{ckLm+Ye|?k&P&$6crOAqkD^Sd-Fix%(pJI2ts)C*v^<-kLJ`(@pfSL>}%p z4>!^P;TR&H6EO^>Ue$Z{UP|LeLe6-mPE?BCxp+*1OiBp4yG6=dkn&#gYQ0zBvE#OC)o}S(y}4QhP1c93=K;f>VYwT@ z{xeNaz1QF|wQa*bj;6TY>xF%*KJ*1JsduN-5bT7!2T!Hn#209k^ZpG5K{YmU5;YI+ z-!X2uBA&#bj-l1Ke+WfB(tetSdB4gbE-eq=8JN9A zG@7Pjp3sqi4Bd~xHPoJ(x!-b4z(_f+tOd|Hm==UmNf#?rN^o{)Ff~zE=t4{|Lw902 zYq_om+qrjBN+;ku-!T5i-d9~K7hE3V}O6h2tGNDFx&vj>N?Fg?FArCz*KEIf-qtd zCPJ6KjbxD}*@-_>9(0FVdCRuU8j0zdefQs4pR2HX(H<$RtxY~Sn)h{qQ= zkN-YS7{0(TO6SH5(HFps#Er?EFF>oPRuW8txl8s?(t^rRAI&tVhg(TNT4?AZ%Z<2j zKk9aUTU>Zft;p14B;90^W?SxhB%OnDdC!ICj(h(NI>aAFh3{)p0P9A5Is-Po)ve9= z<`(VHpRD;L@8es*-i~?X9d0})4K!(Z94gaY`n0G{Vb4aDxz{a?cDp{!%=UffUP0`s zd`#ebULnAk#^)q{P%@CpCnydnnViZ8g??mnx*}mK{YuOSe{!EhK#Z1|?6W+(0lS^n z;C!}6rdL)f?^n7!>d{!~)yRO`vyPHxF7bIi;|?dD1ezfEd>(jdQ04E`Hhq4E!;o<; z@)1z7AoT$>6GzG7)M?0jka1j*(o}YQ5QN;uXUGXCRH*Q3-*ZYgR(GMrdf)RwcywgD z>hR^XWa)b$h|UW~40F$FBYJ10%5RTUYTa2!kQe-UP%L_&I&W{QMB$7(3B?mLc{mep zp;zfmbci6gQt=k03GPhbE`hh3uE`Eo=RMOZQFuWmm27)W&{R!0hW}~BxeYiy-X)wo zO*X&A%FSsjQl{wdQ?XP%G}RJH^|8i26qeNO(gpwe|UdFP}{ zV#5?(HiVWK25ADE^UK|#cq#2A=``RTi6QB9P1aD8m(fllO``C%7`@L;IE_oDzB$|kJ=i4F;<}qzBrs33~!E7dJ(w%GxqC25ITIo%;1kt8(XqY>XEkSf1v`r&@hlwo; z^YO$dxaLZa_7x6tY!s0lRHPBz1d&IklSl^L$e`##1a%|J#4+gb%^2J73u5MnV~AZU zFQAR3`-AYwsI0n7yp&$L*`)2Ip$2^q8pK)=`^Uq?JVt!!77}|MiOqrkMyVug#o?x6 zT8&$;%9nz|MKNdvPY_CeJCl)F+>=vAa>jsZb`ZWj>5_8> zI*!>v_9$xs+8uRZvVeY`D5@FoI)Gjf1D$L@sp?Ed$8o-}H7J{5Zvxwv7~A>ER+_`> zg69XZFo+@XGL+PWSV?uW+o8#p3TTaj8t~F>1ZuZ887z&Ni9t&hw2V|+hju+$P|i}6 z7#dIt2t@|G(JgYc8xyBuVf#l&3}M*APZHaGF}C7Zj;=VJnWUYUDv1uxK5tTkx ze`QEGF_vReb_B{}h)CU`QjPQqNOgBGSsoJ0@;x~IKSX<%vYh$kFA^yYw3I-P#E?Hg zK$j_~0dEB8g)z_p@t_0ZK?fMnoRzeMMvz!4qpNvI#t^jYqeaH)D#OSs*iJIG#$+5F zlfmXXIwph7b+nN|pj)u8+Dkxl6x4v%0rc<;V~t+%puOTjd$j<)0^LQ9fEFi6!5Z); zfL<8`&4~xii3iOwpgFm;^h1zX3nXiZadOl+CDsx4dQ{|W5jjXj8quXsk;o(LKf`_< zB}sQpVv;r>NyM&3-;*v$+GrA!H2g=j@uAhsOd z185V(8X;cpi`d`5<4qK{eadFo8^Kl$Hg;MQb=WJ<=|(FZ#3WU(%sSE@17rIIWuu}P zw1THOTPI_Z z(cv{5nnjKB3rD7-JiPvhf@l;mH>emRu5<^9c?ucj{;N^7gL^X=J@Rg08=-85y#Z|g zj>N`IX}4y%Tza0}nq~CstAO&fSUIF91}*#yp$rBJ3x7H$yqo{C=2T`-aQ~F6BWgvH3H@BnD7T2EH%)epI4&^KhobY?^JAd z5_sq;K^=VrUHh$$jiOxP7wrsw!Lx*0olV+t9lcHKN~zS*+f>;SG2BWuT(M+jrN$OX zR&M94;H@xe+N&J&dwg{KR!k1-xs-9Pi0!w=IgYb{!rKc6`v%8GriQ47M$Ck8*^>LgOSRxfiLowYV__D@UCa#LX`(JB?=%&1K!3$} z6*1#kUDu)WI76yUhF9`wRBM1rGjb@OZ1Xd;+LTJR&r}U{2tHFaESB;-OEnxW8je#9 zi*hHZkiGgln()JKVHdwGNb%$6#YJG+5i3NA*^&@GjE( z=a}AuV|w$5I#^X1n>$_k?$qBuLzOQEk*9gQgBd+0l6gBd(r>_7l`+k#MC=byS0bXz z6)w>wq-+(?<$?&=aIU11-c=`N5$y&_@@`PRt@Fw3IcdMi$ z4~fJ#p*%0|tWuC&)mE;Fb$*moy>cnlZY-;<3mna=9IOsMi5#sD$jT8dJiSVXYGU-p z>TqZ`(RV58UP3i!e^t~)Ks|RYrFt+h!l3qihUkX^@S1ozYrvmd(1iNkb3|`e)J8%z zXxn}gUEc=k>u^+`44i6E*KZ+udoyZhY+@LiP?KnL$oG_@(gH=^JBl__3%koCnkWQL zX02$|tQZSUdo(>Qi1{?xM3bC%81`~~palY2@t`FSYz`#-k%Gu9FYI;{8fr348;1vMf-_?Lx42oHqObo5Sm&Alwnam6=hUH~nUNo^-Dlhx;GOmeVQj>fBHzH}R z{+>!gq@icBCCO2>a$nTQ*T0p-ODIv7^J)4Q37ndUwlgj~hqf$zot357$~8&Xf2TPC z?wr*$vKMKdi>y2o>D6p@DW{`#zA0Kl^rl)OW^tD&jaSvWFU5k~_kJ6tet}xaSgR3M zYTM0N>3hHFak|+rg6%`Ujm>eFvKjV*7m4k}7~6*}*t%kzc;C-u^7%g`Cx*QaY*)tE z-jA_Sw}^S#Zed%jY=*rFY`!CCg3T-PyZtD-*b>@qzxWcmgtprsw}fV5i^8{J$la@n z%fsCH@AKbtIH1a?GEIl!c8UfAR0E?)>2A_s4rw4Ybf-~V6xyi@sgto&WvG*}Qx#Gt z!^9So$Q+n>n~41Q?_w(>x&b1CM;eja;zd3gFY?KFk=x@%Zr9jiX;4pTY>_mmr!0TxPSaoP+kNI?;aeXqUa^obSwoN>5uC}yEohW1g*8V>Tmd5wCYp1>~W()xF?2; z(S8~2mr?iV|~MERHN0{o}6Mj+LBh{7$>-=|0iszS6a`GrrG4QQh# zuTEnVRHzuK$p<50Szkt)@05df5~51diFR z_MtcCe&li#X1y|ym#AQ0>2LTkI74^&WdDgweIt6}4N7D3Vs$?O!}g^jP|uUFzdw5Om`gPOkGbtj|n_rD;Q$&rHnH#N}P4oJZH;%+}a( zUFc?l3Lp9hY&dM0LFcp$Io9f$h~D~KDZ1lS8>3YPwAl)6cy4iSeEFAY?JLWvLP3;i zeJag)3?tZis%uHkM65KPr?JI3Y|-=BqORKEIb2NVb1}JUsTq$#KR;UZdEz6nj?t?T z`iwft=rcNApV9I9jE>i5OuRm0;`JF5ug}WJ$6MA_ zyF{5@v#HB3_T@iJ&)l_N&C0)<0|#g2-_C*hiu_s*)K%m!TlblDais(aJtimuTf9!lcYY6uTMX^87puCvT)_> z{6n0)sUoj+%4jMl*)%Vj&4DGequn{MY<9GO1IuSehjU=X>}UxG>SjmBabV@_XgLS! zXZM~#0pE)v{>(k{`wcXm!zt#^>9ddmWmFum2I`-qj6P! z@AVYy{*uIR(chfD1aTLqSw1KF5C`h!&}BBGE$b~!bK+j%@xA7)rsVk_QXKWqbMhNG zP(LTHb;{^Lj#)l0dPvgFjt0hnX%p$e*i#hqU4#9)_swSP?FPGHPG0Mjt+6*6>|KQ2 z7kZ~_*)26?*yvTA8x8K>IeD#9wZ`3KaQ73gW%aq13Vt~meeM9V*bP!?=0;a@U{@7a zo{L`=L-qcX8Z79W-al4(Hk-H@2c`0Cr+lQ~sZ^d)v$OSt{lxgT0|LuXW1S*l!!`2EyjbvqUk!H`uYtv&-Oaugq(msx|I@gS(e-3HcVP z{qJh6IQWigo#4y=iCe{zs{FrmV18BpM;vIX%zu*u2P^aUaNs~?{vSE8d|v(|9N1r( z{|62R`vcY zzh|PppUx?^R~2s)j*r(vVk6ZU({Rkf&5k>BVwS2xon_O8e>wZfj%<^dPw8v ze<%oQAXtS=xQ%S`CpCc?38PQ4p}wLN{a&D8b_L0Nk)Q3F3$Cu;!uK2?(~yTA6Z!0fP*>FpFwvgOvArtVUofhoBRH_PDtZbB8mppbb6|f}w44Lf6lQSXKvi@;2M$(6 zmvNw}Dq6>Z`Ez@(r9h9zMB|fmHn)u|7rmQP?5*zoFa-u{ibeW+?jTC>xTL7GdOt%U z6ZM8Bxg1HJ=Ojz!T7BN2P(5X36|mpt#|P&{4{%`ryrT}MVQkLhqQ;n~l<=oK9J ztTK8X2M$*DzKsG4w}|-no{--KgGu9+oT6@SpA8h)OZhktPw(ZYUsYO1KTe^ywhBXy zGDf#>bUoEqo&vnGP2xv9DZjpBy?-VY(~Hm55n{vKyw)jAZ)>I(O_e&mXfW6l74r>) zeVn&HY$qecE`z;&ZeHt@t+5Xo?7f7|BgA3b)e!pYJKjt$_8Z*Bxp}QqwZ@%ar8*xV zTta?}`bbmKE1y-1O!4Lyor*S5KQF%z2kPeKcjW*L0~s7xGA}=w1M}zQdpNMEI=_i~ z+@`ttpL5{g+`QJ<(NUas!@OvzFwKij;6TH?=rj&&pBJ6WfnD>WOE|E1UhfqYc0FzV(CbzmO2x_aP6_K*(n%{sv~9bpqXK=?%Br}k*&hxKgb zhxODB&iG;Zt^BZjjW>Q+ek(t$SF8hs%*tCtnUa~5t=|8(9|oBJvL80~R?#?J$B_|~ zi+|Yw~3rpND}XdeWFpD*GLlb!?q5m2K-AutaZxPQ|W)p z5Bp}Nh(B?){8kSmP2>Eq`BWU|;Ay-ccHAmq_*8#e`(YjHCH_ABy$2A#;fL+fG(~p^ z4^5?gu*EO^u+}NH)A=WUSeatJY_MPVp5Kh!(hqB$vNiTE{ji{x-CR?Kv8i-RKdg1C z*0{gshixLGduRduH~g@3?i53Hy+;ie^nG`1tn#$jHTJ*Zho#&r>K)SG_m87Oj`PFTw@T644@0y`&~E zBVlVltO(vnOFyh&8Fm%kk=q~KZ<2@BpO?np^h5S<4U%c2~E96bhkG$B_EaVN% zzjAmW-W)sN#b#z9Uvu)YuzrJ`!B2#h-*Ws^!u!6YJ&n&K%*T*E=kOqSo`s8X%;zgF zvQ}7(wePRJr;&Pv_aWooc=76E;YzI0f6HnQ!ousoNtW+BFLoHLL0CsC$%*^VG9SHmWxR*n>d~BbMYc!;U2s!aDx|{G=*={ z>-4@A5&@CJugw@wVeg}3Xm+c@d*A{*R z?bmV&%F73P=xx0RIGVCHkUucAo2^usjxyQ9mMCnP@jJh*Fkc&)#qQtLTOc3eg4H<7s>HZpMSB&8=rqM7p}Y3`20)Q zh_pe|6EcgIiZaV*kgivG|6QLSF#lzrzx`FB@nH2F9;95v`}{|0ip%tO%!!mD-sd+_ zJ2c5GB#HO=w^LTG2llV~{1;p;Y7Dzxe#z%wOpX6neE!xc|D!(trOQP8zH8-o=1HV+ zoX>xd@^LDj#{2v)Tq6uqm9e$Y|MYbdfAn(sC7*vEq5O)^-#Vok*?-&TKUFbz8tmh| zJz%?E`uwd^w#NRY&;PSxPOnwHf7R!2ovJnNulf9@q?g^S$p1l~zcu#1;qyPXLeyJx zqx?=o9gg$)M`?^n(c0&KNaN?$}@mkyKILz7|B)nb@*wHPKnErv<240SwA`XtQ5 zq+h~3Oa>&(!=xi&9wvhl=3z2{!-HjrOyUw5gk?k-BHMDT86rD#G|e4`)M5zy++(}b zXe*?DBF5y;Jsi%)$&JrF9q4)CUd%_n^x#^JLcYS}pohoy&v1s~Zyuh8_yV|Wg6@E! zIatwJ%#7ai*n@RcHKS_-M%8NxGKWRI$D(j9lcl}K((r2Y1Uj$uo?KC3&SrezkyDyw z;fHV-=0nd4f|0jqlSwZ(Pz%1r%;$Q!O3eL-u{2}E)a`l?rf&UtMt6e;v%CI0UAn=8 z*-C$&(yj0ydH)H>^$HJWgZ;Ud-6&z6(rK7$nS=||a60Q|#w^@~gJX4Ujl!WggK~>J ze+ihkO4thpZ)40tzQJQ9--Iy;`#yzVBJv>y;M(?>ho^kj;P6qHDDLn)MX4Nj*{!q@ zNdLk=LdY|o*ZFCYJ}vwnh4`!olS-5aCb@i75tw;e=eOJsP&f%Gz-t~pOW}g!QIm(N z1wTJkEjYA=1&?WA!DCuja99fq4r^h-;S%Qi4mHdcl(1Ov*cKK%u7w4QTUhY;78V@Y z!h$D=1+gwF7M##*!HeQ8I72O%9cRIrYC$W`g0s|uUEAXDO&hVu*9)cdHT617=h^6L zKsxt^de(-mgriqET-Q=qV?KJt^(}?1MU%W7u5zhtFdUD};cA!4nc@TF{6(oWrRgLV zcXEcFUz5WI6xvmr9p+k?&eCu)iz{N7tw4va!dw^IX>3WDt7Cg5>CJXjx(+PLMK7Ci zrOaTH;;3%k(~Bj?hiOX=b0s}m!RhF0#Qr0C;78qj4)RZzOLAkV3K(ccshLJU>Rw9| zZ?@3uXcdpT5eEy&VYCLmv6D^0htV4Nx*M28E(3Yojh2Z_vD>yq$r3)AwpA{}p)MKe^E-QpaZHn#eIKGMnaG$blhBuZ zstL%-)R3Wg*VoY#Un;gWJNZ=3;Jqx-$ojj+3RS9Q(|^q7~r-)DMzbKwlF%Fy)c&TFV*v)njpM@3nk^SID*VlF%P#08R%C-ip(;e?;Rm;BjzZaL@oc6Im( z3{=%h@2?K?FjS-ThxFdcVOsOH>aQH(yIM2VSRFq0uT*-=++VPk^cD|aaC!}!7~cSb ziE$YgTg?}MvUIx*d9X=i=+95Yr7x-!J%SFQx7(gHSM)aJQ1BYr|Fg4j2$qJg-fDij z=Vt1&B>5;eqWGShAlHX)O;7jYB%%`ZbN`uh zvX|b;!4bm(_umL0IRn%-^eR;TXgYN}Q0cAJ;qfUHU#OO;ug?8SGZL(p40RzO z8D)p@)n;^}t~xI`Pa?n5-*7uRd=CN>c=VOTC!%YLG#uK<1IkF2E)r( zRfVqfxx!1TovQQ>202YZ=*6o2Sky4|#_GHhRq!*T=p?$z!L(?SnP+5Oq)h`yGtXDN z&DD9Ss>&%EEwyZdir-Zo=DXV_D*YlMQXP1X{wDEtZsTHgphpI}hAg*jsp(8zs6!p7 zri5GvvbYXVcO^xf#hTzy=3VF{3|SLF1d?MR>8C0|l+L%GOFG~3a0u!bxTK?8S(AH*roVoUq+fV86*XUgJ5)jGt}4C&*wECQ^3h3Wg(ZcP>d3+ zgCR=<^D@Pt4_f6J-fvAtS?Ud%f?ghAycLR9DtLx0BXf0q75!2dDS!uNiYBHYN?)e} zm`4R5=R~@=q=5BQd>2J6lkPQ_ivx3EE{$A`Ey>}xkn&8HtgdIm_!%N`l1em^8z6Ci zOkzg7#Ef`}neh@cjYO(e)6up=BIC6gk}D%C{07OGcrN9N&yR=VQ9=eKrw+YPq6;ah zDDr+(mBE2AYh;Qmed!oDE&>wzj^98AIUnaRVvKk>HLPag0 zUn;1U(w7QaBClBd&F0(PGunB^8kf5BOQK4?(FcpE6*DYFJWn$S|)C#!24)_uK0*sx- z0)4|J0&PT;{)wPRj5pB54Bh;~XR+qVyg5;Rm9${zn7g)g;szm+&QsInr9-v(Cmlb#r%1^J&a1;UAw-f3omw0(EJsJ zKg4?#6S-ozYd6+}ajUWK0;Q>9U5@w*m8Q9F4W@kMN>lI57jjLq`TGdeX86kQi)`tg zsbA#Fvo6-?lDz0N$-=Gr8~z5(cA9E;7rjq(7m1s$@cf!a#2$klzEDg*NlkBxpaG`8 znoKXnSg6HVF2z`=*(|fVo(AWmn}A$DMYJ$r;Wr6n&;$e0O+oakv~I>$Qd-@#w6@kr z`5b9%pZA=?UZ^^DxuARkeLIgc=c+wRY?IGJrmc<&wNo<-1yc*b-q-7f^44lPpCTr+Rv*dxyW~?1wY#B@eoe$`Vgp|KHi3pOAW**P zxIFo?tVqekzrvo2Bv6|(_Y#lT_>cIYr=jrbh1x5wC)2PX-S z;SK+pc&-8u_a%>^E1}wz{CBWyDP;NdktusJ`jST&;x7tepeg_{)SiJ}`aVukt0_#% zMx=Nzrr3R`6&SsaTZUz=G4?D?Z}5fUCi9xRl;3#4BiR!uDX;mhyn3<+Nt%{YsYy!EwXs;z*-(ni<7a$ z;$4H)JXRT>+w#`ghswo{MtBp1z8n);*HUF~ol&`KTUrVC++o}J63O)!3WR|weU~5# zsKW3nC8ffeDD~rcr>m^*^*7vyGVXbRdr8uXCmNmy8PioenI<#yspWfCNN07rN-@$J zAZ1xh$_gVT2c9l5q3fl4z`}dd=w9EOV$HJa`&7K1s|7PdF%5QjKVj~VVO|}Nd38MI zH8IQ{^nC=&bGdE*aDiCD;8p;y(gCRp9K)9B@?5~ZF{5Chf-keM-% zDh^}b%NebTDK(Hf8qd5~k4D!=Q`vNX1*%OIWZ7WX0dvwtCd(aTCR{^PWMYyUByZ{yDIG&`?zIyH=3V_gju67Pqo}&+ zxG~kr^QrzN`YQ=WXo5@Vx{P;eX6jkVBgNaQm{G6^irr4I#r(0ml~O+@TO;v-HTN)^ zylrcX@)+LI_laj8@f?E>thtAYw&m7Hd|=Hzz<$R?@8~Fx;cWnq_hQ2{!0_+~*61@% zSjDJP9>W{{fOz`HcnV@XYhI`O^tbT65@VIe@K%6l3V0kkCE(g}1nEM}+#2BlnPcNi zO0S$RRyDkh;3=AHS;zCYnj$hi*;+#+eXOaon55`<{#a8Np@tJR-g4y%RZQQUbd^eY zRIW!=O4Z*VNE?DW&vKn5N$8f2_8J$}-;ON3AEh~0(u}q8Ox!7&CYf_|A#yhPw`28)IB4&0OZ|bkHte zxeRv`xZaO(=@(gO02ui+)o#0qTg=brb*Cb3W-k2;F}0mS1;q+B8U03f2G0jJmP#I0 z9>d!Jp7I#a2f|aD*Qn`!)ZgQ$S@r?x?Wxx?-^fFT*J=ub9R7$9ZzIHF{zjh6Q_ExD z$U|;#QWnEn0hT?62E%+<( z^o{W>j`8UC?qHt@%42xzz;jWIXOZCj&{%jhM!`^;>xQ5j_2Z zoqXiZEg!ja%h&DP^0_>>?Zb!d-0}%K*Ml!p7%!q&F7HtUcMXExfKRSGl5gnwp*jh| z_h@{9dLsNA=}+La&svBOPnqxi-PM) zDAuE7aWJ=*NUxG5!Sb_71)q|o!BU#hcmnnobSaUt;JzPdQV_JCVzNAVByUv39$sO5Tk*tJa8*}+Aidn#RT2d@F0uk;2x zxB_%9r8n8Z+d%i`k<=Y&u!E`820ij^Tz6!<9eg7~`W{Vpn?j!*ww2KLLMp3U1BW-- zR@hSylQ?rerEj+0A=a^+H5rs(jTk53cyFZn)OxW^GF68wiNP0ml++EOnjl|^sF-+) zn!!&$H&0Wnq(oYIwGX@Sby9PPjR^9I7Tio!k)h6AK_(ljRPv&`U6yw-#M^fAA08%R zi4u94R8^NMk+Y39W!gh8+YUWQKjYl=@jAdctVk=Pt_D;HEk>TOS&!F zzZz3l5^yE8Y=8YQhDo0EB*ol;7C|w8L$dXnY!Q;(r^zlxvil`jV9K?QRToH~Nww42 zG=jbu*$%1DC~~fLtU&vbOnIDsONi{Kl!Dl(T-c6D|Gv$IgWoLfM35vsuH3o2Kr zA}1dxc|sLCHzBU8P$kYw*AUfBB$PTgK*AA1jdSv@BC5MkWzM-k=^=VfaLz#e%ZYZPR8VIM_{Sm3}tV3pqcmV{raUw1TvEd%#ux(%93PMSqMYX`W`w4vn zL#5ic5wP9awp}__nK3K;F%5AMzh$Mp(S=hW>oku```|Vj7CYMjrnP{ye+UUsT4iqg z0)1=T&b6VPt9B~kKM4G=ZP#^`vCzn=0R9!gXTY!mmZo8ynixb}Ng7I$NG{6SQR(N; zyuh+M#PGv*4vo2XvTcu1d?Tk3_^$%L@e?;v2w-_y$4|&2$?CF{rS%kkt`79+=63cf zJn+dZHKd>hyx8Av71g$VjUfxm&tE0Ue zR^7o&_vVTL408jR&L*bpDU`&pbh1BzoX72AO>Wr2pHcD+NKP4jTx(_aB{PZnaqf(2 zOR~6@Y(<-dFGc2u^apH2f6+yx8`uiKeF~Mio~0`ZW6=wy$8Hh0-qE4zVd1bg40 zXmeMbHg|EiSvyvs?nXn$M6|u#1gKRuqK{HI16%Mp!ObB!(PmYgHucRAUS#N6dj>VL z*E&mv3{)K;8Ub;rj_T93Vw2*G0!Ur18OlKaWM7Z5kJ@y`^`KUW>Bo|W&w*aR@Us=( zh-m_RzXXCuZ)Y!vgI^d2zc>zlX)}BP@Us{`Tj7nE(k}?~Ccv}yv&4p@MEeRgKn6NV zyHWthiS~1aLTP`4mNSXrpNoibjF<+%e;w0)QXKr0IQXe?@Y4-^jy)Q}N85P{ZA65> zBccdXyA*%Ij59+$pb5NpYvV0sDQ@+@gdKCIyczaSOshNP?P9NlbtCFdd3)G*F|F>Dx2MwTPI>c{R(HzVOKEkd zysg|RZ!34od$jFwL!NP`yy{MQ>tPahr@VKFb;OxDoNv~aqg6Nh>Zw!r@Tdmf;;6Ms+2GA2*LV?Q$qHve2bw8P4nPc`IaaF z&&sz{33yh1<5`U)#%t+6c~(~d1D=(?1D@D+{FM5zg;U7;`IwtNd0nV>m|nN^x}4Qp znUTFNr={2BwDh{1^_mP`m($Yga^k$MVEWTE6tdS9jPtsJ?YVoRIXk?rUk7ts zUBNi7D;Vc>1>?M~V0Jy}ZoIBwr(u*oS0tOgu3((k6^z`)DaGpwb{0y!u3#6T#On&? z3MF1wFi$A)x`JJW60a*5=XC|+ysluJ*A?s`dWzR&DDk?2Jq1&|E<=ge6^!?~g7IEg zFy8A5#(Q1CzOV+`AA4QFX0MC=tYH849^+>P2d2<`hW)JIAnqyE&kDx*S;06zD;V!* z1&8jTa%VrQCxNM-6*xpgPdK5=0^omplVc_1Nf}wrsi3-MQ3U+BKhX3hLG2lGZoio* zwP3Py#R{T&2w$q@0%Sr@2obN%7kHL3%AQoHr6(0y2Nw0DLfpL7lL~F1yOk-%7eHNQ zPbzdb?OpLBn4*oH(1C``efER-GMJe`tq#NGI&wr(cF?eA?^{NR$x})>{T7;?DOHrR zk(Oudm)ZREZH$zZ7Gy(B>g4egDHb3&9+P%AB)!VHtDT%Su?1C{_UWwz^qRz#rTqwz zuM0IH?RKPmL#Xn!AK-4hBh)xD3=H1J-UE&XdtXn{$;D&wx!5A|H5W>0F1AXX=HdyVG#A^1(p;$5Fpl(Z!o=l1d$Q_p z@=^LX()xYUUu=0Fv>?|kh0VoX6V1(2K11g3lf0Ftuwn04B~lh6PN}geY&@k(thROq zOk2;L=H4D+I-^1ZL=SPubf2~|!INf`t&lOe_^ zgn?=V#E2NgOw~vrlqw^~{C*U`+4iy{CGQ5N;2*@k73_D?Y{5QTvQVB$ldYwvqy+^QS?^;z z%5Gp9zQSrfgv07abKo1hYA+#w@D|WvhAPKToWsR+7gcG>Y05}Fo8vnFr4+kD&dw-pNe zS-j#5W`Fu6#K5~n&r+bJ-x65;2t6T1v0D^q>9+)0`YnO=nhbtRprzjui1S;VbULgk zev1?5w>WWri_>AG>WtkYC(dti;`|mTYZ#}L-6AK>Z*j6A%=j%%CrO#jev6YMl7taPMqK3#Q7~w57ATn7DI{O z;`9_u@mmZfev1?Dw>a^Bixcm+IPrdq6YsY;&3;R~Ys+4Y(?2!l#W({y(4fa&j1#w8 zh0O zKOGUYG1V5`h22i1)5n?vuudC$9Uzl!Gj<#3a1%i$z`bEBBqK<3^px@E(b1e_0VyF6 zh_di0YnS!)`>`3p&jgAYfhne4eZIUyCc7Te&qj(8NsI*xT5x89a_u~Q-Oi&L7ovzq8ULHLCgqv_~tnj z)&OJiou{J_5I}hfB!hTf^C12VAUfI4E4zUy_>S1S^Oy|w zPRdRr?weppw4C2PJjpxW9e#yur>+>^zZ4hsDKvU0f#+}pj==n}L*r}&Br;vC( zwTU23ZC;P+ss22|#*v>uj+Hv{7l4c0AUUJCj45+QQz&yrQz&yrQz&yrQ>fS(O(A1v zG=+?v(G)UvMpMYx8BHN$XEcS3ozYxFn!B1E`3+3Q9C^u1?2M+6u``;y_R@St6Yf*X zGn#akoap8=n)eZQOGkbi)6I^24X1BDqj?q6&1W=)Za$+av~DWW8BL*o`-~>EZ+S*@ z2g^5`ip`EZOrnmwSjRZ>VjSbhi!tESUQ7(Wz$$_dp;91UF-IOXgP*=?p2lq|k|U3Z zW=CErb>xMT)53la&5YHNhbA#cUI}sJl@LcBD$?FykQh&*|K!LI1BM*e#1q<7)I-d& zRUW9O&4z4$+7lG#e7lm|`nCw7K406RnF=_?)CKv|xx0xZx0zx2!^pWS5^giz^0zyM z!x>~0`1r2Frg&(F6F`B19fMYpKVt^DcFsgv_4a2ZJg{Z^-gP_p0ZWC$gv zT%AnelT)rvmQZHhLMS=q>SRM$^SXt^nRN@H%(}%oPHEOHgfi&PdWfE8-9jj{ZXuXv-9jj{ZUL0oDOV>dq@HqhjuKK& zxjKD>)KjibUm>?FiM|J10~ltw^_%)Q>s-sT^d{m5F&88G`L;~oGuM+IDr_kjPg(^#EG8&99RqLh** zG1NwuQI=EeJAks!WoIgiL2Cd?KWyqT%05LYZcFP9`&`^2Yl~8Q(hWF70u=jRZKuwh z0UCVRO-)~%N$9Vr(9-lHsV!39DLRy;_ban$Kh=eXD=NVNDRx_^wAp1ZI7>2SR0~u8 zW&3F-PE^{=DzRA7X>&}dtkG;%r8cNin_b|j* zIWsw|K+Y!8evjm=r{=7#TGm~9vV2^0l*$(D$?CalmsPhre2gGHdaC@=>%vyrD9i3` ziYRTgW%n`qrwyY6l`aUv@nR~f0*xt6zXa+HaG`R#Ywxd?vN_R|P5ZA^&N*X6P8zM< z3{tf=Rl|gX)!+@)>AXB7G|q@x?RKhmYfFWDt7>_=>tfOcmvKSOGnAqtAwADxJyBp# z^lX*2p++<&*e%TtcIS~tDvT8(Q}3Bd9UhukLtOkru{ur~H1)zi@PG3)XLQ0;tyk@Ppk_Mz&fyX@ts2$-p1ji^}{g-p##k2Pb;RXS@gQQ{_!dQU3xk8M=7<`VyyJ2AR-uzmK)BD|mG1{wdtMknH`JqH;##JTPI zYSKUGZ+}uzGX8gkqY{6r6`o}LJ57KR58JuO_>DH})U8Bj|KH2kW?=;O}q<}2deqXc=9B5$^(^P@vY1pSCoba;fY8x*?;*pDlAv0y);*h^}x z_6G9{tpw2cMJ-9`RQD()o$6ktq*HyFfpK@DAit@|S5p6yVh3R71-AX!v7)!Jb?J{} z;|uAUQyHulXay@p1zVtcm!N_fqPQ*P$Ph)SUJFz(%^0Y9El{zWwL@88s+Uxcg{FE) zWmp!g3@P^KX#7)b`{5CyqEWR0Dh3ZXDo$ys;uJPC7C=ZvL$HcdRC!i$N}P&QTB$fC zUd8G0Dps^m@p@SC4BK8ZTvRlwhJPXz?~SQ=MoSgX&;n-_4Z$j&(NaZ;;RZ}rJfoG0 zXT+;`cD#xcTBtbr5}MTXwe4eviHb(m3aB``4V{mo`BmSTJ!I0?*N$?ZApJ#OhC@w~ zhSis+jy!miY6YB@OrHKI3e1q@>3kT=kUT>4=N3vAPo-T#(-EVy)xka%O76Ckhlq|w z*GA}Am||HOJWbt=xh^b{NhY)SS?X?dh0rjA=YzY=bTEq)ehEow z%G~iB=(|_?vy(bLi?USe#EuWNpib_%y*KH%Po|AyvuJkovUIg&9bZDaS0tvS{ij8e zfh;w4#|t3hrztFuI=Bw@aTw&b*mn(*geJ!Y z6)~z*q;3$YB_y>3wy3l}?JrV|^d?AM9+O&W@WKw54T&iywf&B=uD1%k?6)g>D1;7$$ z;Z_<_RJF|DdK1-J1n8(hkIFoc!lrQObukX3>A^xr8LQ;jQ&2M909UFajp#;*Jds3p z#NiG5NHIWpN31c~vVcH$+(hi7(I5`z4$>?j8>j*oL1Zw);ab`qxg$tXV_4QhiB#pS zVIRd7qn8sLc9f03{Ew+(iR@F8tTE^Q+G4a>Y5uR@Bw&`Ne?MdPFI*q+`x!G{S8Ba9 zE$7J0^#Mx#zjwxr-}U#Wr_<>hUIq2Xo!;`to!;`to!;_iu)`FQRZxH2=`DZU=`DXp z?$RQ%3hK{>FtZBk?<8@u3hIwLz2%Q&aY|VQ^>-FZRzdw;gpyTIf38rn3hK`jN>)Mr zU4@cWP=DO%Eq~nUEq`~>MOH!mJw#7g1vQkcg8F+3rmTV*N>)Mr@u#=^@u#=^@u#=^ z@u#=^@u#=^|Mc{hzdu&~Wfjyv5U+3YDyTp1^p-#F^p<~!Y{qd)_{6l*YM&Q`& zptUKGN}avs}w1myqNE|JRX$kv2;PwNOJ5pymZvcw#z;Z|G^^%7H!n?tC zjzZ#rLf&oD5)pzf6hmOpd@2z>znMc=E%!m3)othrEk)z}=0AJyOq2cQduRO4(R_oh zcRMUMbZiwII>lDOQ9!X(a3y3FdtZ36YPPP4>PLI!o=5y|08WQj=xxD%COmbRJRODg^a)h?C{+2AwEDmQVF zR9>Oy1>|J=OiGK(aof_Am=0M|zS!Bl*icxYzk~|KPO+z<+-l3x`#^qsK1%7XeY7S# za*F71)g|(qLy+lPsQJ)Q4Q{6747IyXBYSE-)6Yi62Wx_2Nk7Cmv809V`s3eVa3Hj| zUqkAh_P7g0gvoXTvO9>@w>z+Tcfz{JjlAByQ!=}}rUU0d$t5)%I0rkq_0m1R8I<+s zBzP_MHpA z>{o2&R#rPUll_W^$8$z;^cUqRd(6H7uJ*{X2SLepHW=ETEA}#WtAM?#5{+3wsEzLRT^OpsX1+==1@IE%}F&~kaa)V z%4HpPAm+A>r=|{Y)JqPp{O-2# z6>Yz}ZJ1eqO@lyvAdS}7)os(+v$}0z^!a#MjNLYM)YNTjFOIIdZR)6Hh})JS^X^P> z)YPrd7Dr9p`p)90b>d+p(p4O_9Kq}*?p|l1`iR?>3ng9T(y`kn2Wlfl;pZaW1u~Kn98!n5(VWyTo8}52jpAErgpG~NL-Di7~z}061tMS?P z1OI>a*;E>zS4_wTQ_N=*;$QLEK4LcGvq{zYpM17_;_(GO*3Y%eX0vjU4XG>tVW}hv==K76ORqV4R*r!ukPYgS{2wvfUwOFfJQ=dvGJfWn06w-?(gd3Z*XFogzhDwzXm~ z*SKu!1!+l*xNHyc*koL`&F6AP;j*DPjm!3T zYG+yYJ!mfCvPGwfy^P($v1>?Sn?2 z-(UNXV_K2zv8%a%f9->&Ppw}2_}|{irPx?RH=76nrnr8mWTM>`AIp%+S zE27114gkYs5B<=8=dFnN+Z;rm><2or_e^m2_kZU$2a)%$ycO}kz0Cm<*u}uz-~Y|G zB7WmGhyV3k5iM?WKrM{z{~$xL{U0S{|A+QRDCVEs<`C*kW6(OD_H9`x!;2Ya8Zl%I zqmeh|T?|y~a7zKEt|@%|GhZQr<<687meb0ko@T16N#Uyw)`1V}$Emc)Y7RH0UK9(L zq|&@jpO>cb8=)JxSZG?8%J&@HeLNx1^elD86gnpK2Z`KVlXf50aFwLPo;+>l2_lZl z%T)^UN@-iWipEd-R_+XM(!7~G76d47%Sl2y>2a%!-sO_9Te*SLo2hN=EC5Vp<9vLD z7{>tB0f6pLP~%J$<22Ny90h|;1tJ#dQ~0{=sbUS@g4apxI}5iAI-bbQ*6G%$Mj@UhYwE^l8_K^_km+!X0%EXeJ~Q@?++l%se9Bm{Vgn)QH*4=_(kvw`fxe<7${S zGaoz>rTVM^s=qVsi!klVvqLo?|znl?Z~(eChg?GBIE?r>AsqFst;R08c%TWF_Y z)-Fq)my32Cr3H8sh)aPsf-LywKIna(4a zPqzs9`~2|t`QiWkS}?!uT1~xR%N4^`-*iDk)p?!2<=d{UzUiXLB6mE z=XHU&w_O8qZ@UKK-gXUS3ZMC=i%{m9E<*kKH(ex7=5>L%dEI~Kn=T^HeA7iJ^Gz3_ z{@ri703|lB3&g+e8i;?}H4y){Yasq@*T6r0+x0iU>C$pu7l?b?H84bSXuj!k3inH) zmfv&<96=lH*-lE-N6W6bG|Nfj?-x*wD4=b12j6$2zAWJ2l3OPo$!MX~!R5S8SkS`` z?&dY`O=rjpv_mN&S7E>9f(WPmJJ_E1D_!xM>SU~rNz3Bz4H#)M>d;NbEG-+!Ae*Ii z5@{ikrZp#7q}^|%xh)q&IFV8GMD9&?x+Kzsi|1P>ghS$VZc)pFbC7a#1P=y zd=lE+Y;Y3da1!Eh5@I+muqC9I5tn>%CsetY!hCaQsQHUKq2@2{gsPEWi@&%Ns#ya@ z{^Cw(frIH7X2YT8FYbh{L~Y?O?t~ViAmocXp+#>IquvvZoTxVtYWYrdsO3A+p$+t% zH}(epANJloyvpM08@}&*?<70tgpgz>AtaD+KFcYd5Ikaw60Kkq5LDD)5fBj2WbYuN zqM{N@+q9yBVvCB17Bo~;w1}XnsHka+73&ErR@7FbV)=f*wbtwqd7kTe-|zaq>wEwB zxHNm_o^_fvYi8Cx_nMi+jXN0+Ot43KhIhA>mZA<++UMQzyPqy-d@j^Ks zdy3^3Hbe*At*RVD=jwC;|cW!D|dxKEo&(JGxIYnzr3MP-k)Y#z6ty5IvMsE_N#p68w7UXc|{*u zQL;Ihg&U~Q>rDyY#JMVbFPJAs*p9{iYMN2sK-`ROcWS+zNiCo$eT+{8`8P0PrEfq) zu2bjBxy*gd6tMeFOsB6k{*s3LYNbltP~*ae{NK@3`UaYBjpv7Z9G1s+VllOTR*(Jh zd}%4o2aR67G?dFm)DZg__r3ALml?}6F!)TkVTa!-H0+~-uOyGH`F&VE#LAl+3Oh4D z%$ZHWJRXaFbnq>}xp`DhNk1kyB-v_O^>I=$TIYPeF`jN&F0-?9B}X_6B}c}|-%;rH z$q^2p#eNp68Byh~`i&~rDY=EpEzESvjhJ%rrXlx!g1= zW7o^Rj$JSq8M|B_1|wsa%VTU49lb1XgP}%@ZBmJs)p>5*V`JCLa#>QS5o4X`E^o_We8SkJWmE@-E|(e2k;`SOb>wo{8XdV_Gmc9dbm)5Bm+2X*k)i7i z%TCpyYq!aZQAW?-m-xC+xL-f*Lt0r%0(%&Iaq7Gf}8W6@4 z8M^jbzNsO)#E_n`-HzNY z7{X+Ta`Z5NNOyF3bQT$+7K)lsFCC(;lh5Ws5jZ2J%qt#3rqp;OjXQufowaZ&Yp2&iaXR5k2F?IfrB8*PUto0u)zRm-tGG_=7K-~k#TBP9Frqd2 zGV;2t%dmHHo%|JPEw)W|zFRaqckj=i*548qk zy1qkod~$`@d=2U_f$HDpzkRFL!PTXeb+{gzb+r!LI1FPac4xURW1GCY;yOdAf#s^T z0+t)2^1q;LN2~ajJ6WZ-+{ms|Dbfz>&0T*^CB3Y8Q?Q+OE(LtjuQLIipf%YLa4Q7t zEGJ$+X>C^~tKfD)%uJx~An^_UPYm6WX(oCIn|T#|Lp$`xbrGHD9msu^-?UWK?Uv)qXcVIk~wB#Dv9Mrt0Z$M2?h@p1edciXM)UY6J!ZBI#C3<{U#N}2~?E} zLEcRWGEtFgRFH}7RAObO63dxNCbn0}1??o6>?A4m$I#Nwky)kIBykcoQIgJ4nE!HNU+Oq753vtvzKg~@ky1;m^ zvEQ!JnFpH8p4ZLqPID;`ExYe7PT&O;RD~>{YnTvH*NU8wQr0G(^20kW?Oe;gnitiJ~51E=r= z*z{qSg}k=2WT_oHOI8)-rQX{K0Qah%jyy|t9uN*YOO{oX6>C17iHw{j`>uQX;|=>P zXgf>Ra<*Y#b9R<2F5Pk$R8kVGm+A$TmeC6;Eu$Aya-hapviU$f5C7w%(V3*77gX}e z5kW;AFjqCeb-2U43#a3HdIDily~EEhxf&arHJ6h*7l&O( z2JVuwC=|eNmU>oQkTMbB?1QdG5dxe!URL}5wQIB|yB^)bF{nR|=IJ<<L^F{ zRQp3DTb+;L@NDx>d5POwAekKDvAuczKS;RD_YeL~2|ET=9YOe4Mz}0Nn8E{`y2aR9 zKv$|6?S-U`vy*t694)K}C*_P#h1GhUhf}g{{>_lg zO*xKA3$dfK=FSEH%Ymzv?54cWDSn@B!eNp^M^T#o)qVJqmHu{1s+W--Y)SR9(tmY-s+W^q zz8#x38D! zrRftubAcDC1&PSmY)BaT1`-DSC~W9iG+gQrR87V*{K5J5UM8ET%nR>EI_s0aHn7b33n2MON&n(aZWP zVgJC^K|owAZ`v#`ykVozZHZ;QaW_CWD%b6?tkt+=F#Nb?cf~pmTCc)ywBIi{>dx@O z&ndOFF|VU5I_6OYEdb@LVoJMxi!j*>ph;HfKc+xOql9!`Q#$KoUVecU9kSo7Ct-Tw zKmS9--Vn>LKB9asZWMn<%bR0aZAUSvy&}SF>B$Ws)Pb=i~?l zNRIpkf5X&C#t!I^^O>~uNH52~n}m*+rVJiZ>0OgHu_>ox;LDx44YD53BsUG@9ul0{ zl3m!Kjdi?cTjRMOW`W`eYpi%~D}hI-%J;>yK7?t8M?MJ=;E`utH5rAYG*>N6cOu2a zi(=NS-vRI>jtpGY&Dy;I*^@Q9q9N<&JCeNcDVkl`khO>PKUKB8x*=-=d7h@FYZ|f+ zuynKx1C47NvOZ$=bS*{P+?7`C|JX10YGm+i8Z%$qUL3ty^SH#B(pu59}{g~{XFPWamKQp3#+Sv){6yhz1rZeX+h z9!1F!>7yL_mVl_V8#b}|3t5Tb{wzG-_n;DV?bph7V?1sym-@rQse5i}$no!>UWWOk z_=+JpXI4@7QagL#`~ejvLRgCI^0&`D33(9@OJQXhWAmM zWz0gYXc?~dH7}}VR9>Iu{fCx8_cFO<6zUopgg@c-?xme|$e}f?{wRKEDq&xo$*?+` zVZD+kpdXpiZ5p71vnoSgO84bNG?$X;V8|N*?&09r8_>l}=|$4PA5H*XUkZ^N2|bG+ z5Zpk=bURCb22znC_9jS|x)uZ?`;m#H$V?qJx0h~eY7{{nUN8(yQj1nHNsl$P_#q}Y zf=O!0<4mga`W=#??oe&&xIx1_e`peuKVx#(ZWfJ_BJpc;kPMwA`C&s45mAC<8eH6K z@taN;mt}Nu19fqyvpnK2T4m*nE_CH*aNt_B6xoav@!r#hRHHj*N;k`tZk8$CEK|B! zrgXDR>1LVI%`&B%WlA^8lx~(O-7HhOS*CQeOzCEs(#=@l zvrOq`nbOTNrJH41H=_%jHg+wgR~MMVru7U>--zF=*G&%+I7OCu`fsAulvbbJ47?k^p(7=E~7X@OwhDF9pRA$(mw9b3a8Uvpk%JzgJ@Z z@-r789c2C^1aL3-a|is)e;zQ|^aPUO{p5^7qRb0@jfc7Fhx0Ky^u3%pASRvn@DG$R zRF0AkIdH~nkjUdQe|Wuq@vHFis=y=ssQ(dhDk5ITd-@>%m_Lv>;qd9fQsRgs`jcRo zwryV52w;9{*}&@FjX3Z&mu1bO1Woo(5W z*YVy@;4=LzxQld%-mwydllu5yAf3%x1X$0=XVtwN>`!>TFG~CQQk9k++TC5Zuj!0I zBM$JwsdMHM>RBL#8(R*=qjzsj2sduWgUR|pA+{Wf7fl6;0se=O zAl$h3P#nCM5F}rDPuQ-!oea(7eLegn<()6Q@#0aZtn-C6K8e>U=X_B(hj*v})txx?+0DNm!==FGS|5uXV zTUX3xOe*#jy%~48zlMB?FR7aqx71-Ii?C5r zB7s znCdBFdfFaSJw>d1ORSLXlPaXJ(iAIVk4#E8@B^{pKV*VjhW`*);c)y|G3_@g6CaV7 z-yiGrI12jzNrhXu0L!E~{&#TsN`Juf&R+@E%6R8}l4y!|en%3^;+Y$!in66+hfoP)$%6Xr4d zEgvVP+d1fWrL=k5RN7sXHrGE~(gRM?eNNK7PSO@9>8^MgF-_7|C+WfllXOXgNxH1z ze~|QK6Xa_9HAxYuh<_=OK4KqD_#2}3E8fE_owQvWZVKvDDZO(CJ7>4LRFuhiZ{4Iv zzQ_*QP5R=Cw1i5w@=LUrZddGp;l9Mdu>0)~BKh*Apw(k0tp62K?fzR@-K%`qeFr)2 zl4LoC?WET^@OICnfxW@;uzN=)cQe_u2kiT8T0ceSd>JCOUj8_OtP`o1KdXv&w!DBg zT$+lP07|!xy`GDmeK@owt<#>ip`ou>yo79@pHMzH_{!C&&&)1>rdghbUG` zgac`)Cz8GVN7=tuNIm*lJzRZSSdWJRCG}Xrdf?@|&pq29+X|`z{IwQ$x2wfH?P{^o z)uNk^TCB2Kc>VmHY>-L9dGJ%JK_@{~IXGW~5C`ErNj2DdO&=~OBu!!g7Id!ZBV*Mh zRp|a}`p8gb*?rgKZY2H5e?t8^4(4WNAUlQZLyg<(az}SW_QHiiYFC{q?qcozYwA?T zQ#HG`F85+gz)6?T&A}p6UH^ZWxIa9tVn2yVS{rb>D7kTSU5RI9|FqxSBJ!U(Mrhnt z$F`ZJ1easf?C(frZc&oGA(*ypOr=;~mwR0j8a}Ss4ML$oDKypP?p+7vT6RTU$w|*B znRo5C?=&yz+R>tlm0(xm*rZvL_r1zXxXw194AsD976^^ zi3*3Ot1u}hj1#Jv!h|xNFw=u}!c1>3%#8NJ%xo{rtoFiOnGj}B6}5rr|9hWQ^*JG; zUBP@-g84XOUZa{o@V;oGnzJU*IiNyKGHHg-4a5pggCIpfaJ*SxaF+#r*H-&9B@bBrMd5h9~&S)lRSAb?b zLGzaOG;e87^VS5-qY9HjbCK__GJ1|~6X`vZpts2A)vAn(jNVjl@Rk4s>QtzUjff-G zN+NmLuA+64#!R6^>Jma7OJ&EzjiL5ZB3sZlgWsTNGnI0gQFa_^Dna>*1m&6SDbH+A zd2WL8z=M2^!AC|;!*@Qe&EjY`lV(beleR3O!h6xtfTRXh9p#EVvLpd>>p$cPC3C&~ zeh8_G?_yK+!j%n#ndz0RZC0SK?NX87<@Vp_m+{Y1OkqPDmjCO-y$3n2){16#h zq4qJ|8*0map8@AW!*RF^h%*y7ePqq#B$c+-8*0ma6QJQ?hU0Ksh;v^8N6tK>;SI6n zKFZd`a2#$`ci_C8z;WB1y@Bh{rhbKL`kx!M_71s;NSV3Nv@G{km}+6-oBxb=?K~e# zah|u)upD+Pu}(^0<+WkCr9~^lprU$UDPGE%+SVNBe7`$E(R?`j1AvY6gEs%P1 zY4HVF3ZNovHIjTTFcgOx?Fp239m*!xMnlfQ3%9>SxSU}q4s`)h^05BXTUH~NsDXiv ztzeSI@rL7YTZnU70_R4DGt^cv*+zlkINYjUz_}AR!?1#RBYuZ-1(Vc=a|M$nUT8Z0 z_SF?kf^Y>ho3qnH$jHBYhh2NYR%F6sU&ZqvZ7`B6 zMe)^qy6Qnb{T{A%`0-+BFo_GCnV%s)Fr4E*giO{6AQH|MMRFPDI>L6aY&d(~ATOL} zxk&cBqr7lO%VlKG8|;M_(OOi$&u$oKSLyv6)M$#dQDm+vv30cXpM$^U8? zG8wN8OvB$KbPpKQ)wHRv5UPY#EI#?>C!mi{(f3v1w+-{qEMo2gFg~=SHo*LvKZnNS zdB+<`WPqQ7bZV&5P&+pA=|Fqh(>=YDPY2o4zV7M$e0r2U9q67u!l#4n=@9qyNtmoZ z)GrinRqpBYd^*gYj&x67<Vu+H$4=;igG`B*35TzIw@?SPW zj$pJ82u(^58W&hV!7h*y z!hdL4B94(LkFK%#HZmy;+&zCRNVgzts?PataMx9Tdpj@`lz z{SWxp+M&G=(^&hxCVImu*#CssCLnQLsX!v^^phYq$X}x!KClkIxUTyFAYNV%s^~TnEv5X_26PB^O&MaeDo%P0ri0u&;O-A|)$Kst}LmP`G$6`rL zSR4VJV6oD%z*>`b_+^g8go7&m2K)8@78GLH#%h7pB^^_ml*JLy2^MP|i#3kLO2?w} z56WV`{rc|)ToW`F>m7?V%Hjy<1dC?JVuNFWkSnj}Xf(<@MtY8~J-GCAX{qK|={QMj ziIq-~#P(R}&n2-dRyt1-EiqB`RsT^TU$I|*e^7=+784RHgf_OSkVil#gxuYbsft!6b zKTzS6W;(?6i=Qd(M8*PruDfwCn*V z^mY~c2ahb2OWzRWpM;_g2m!`YuSbM)=&33 z7W<9#(Mie*{gjJT#$rjm+2=lGaRhXN#WKfYsbg`#vG}c#{@Ag2H|Uz3V6oh>XjK+R zKqpwNa4eb}i-nl}rJtUWtkR!n-kbGP9D}U=6!W|GQ_Sz$PceOKKV8!xt@*N1C{8gw z>WCJcPp$zzGf; z9EbJF0X~8;NQtQI=h(0R&)}vu2F;E^wJ?K;%0noNw^vNED1N`6G_sYn8f#k zC$T3OtnT}_4z|v%sOk%MVmS5@t2^;zz%ziw_2 zZ|?}mgtv$D+tt5bjO&-+U-N?@{*_VkYfa)bb9nsc0+SjCkyC1zVW%GhiO}#!MP@j? zCi1cd5xIM-ihQa4wu!u4MRxw_5r7Gaabmhkj0>z(V&|VS#H{>YzOwx~@VR;rx*0;M zG5uN^NsZ>$38VSVVMg;?wUb%~KHV7*9cHkKrg@8+<_{mJ?9LpTXa?~TX9l+fOiN&f znCvZLvUr23Q?K$CFKEa9V(0Mj>XkR`W45bHn_cw1w1@uu}fJT0i9q0&rDgsJ5&}eU?Fxp z*i^X0e*I~#tHC!@@_Uv15s(S;@XC}t{5mC1ch2kiPqfGvM)%y$R7<6wOEVpam3}XY zopq(jooHRV>PmAZvAeFclO$T|M94fg9V2)=1!0Y^+(EYWxRBcKy3;3p{y_+iRonPc&uksh|+tmW$9 zeD(x2NO()iqDfgC0i9q0KS^1@(^3{I!9tp{(MW&fSX|?p5}uNhU!&xYfJ~5wkEG<` zWhwdfAdi2&*pCts_9zSbq~ve}aDu}Jj>BH%pgt)Xd}xIG|4SM9R|loA zW2?hH$Dmpm908nQaKJIx?-b3&AulG4?+f>YSmGe@lFlsk@FNR(CtgQ!6`zlw;Hd4i=)iy1u2l zaG+HKK>66NkXal*-yFZ~_3HTf=J;)?SDpK&^X7VW1k=nB+*4mnA}fu0{2l8(`9WDZ zdQS{x_~=kya-}5D>n_nmtmHgNw8Tozki@Q7rymn3y-7;;#Y%r62{;z_NMcL8^Fv7N zHl`2!MVa1FhB;=vK(xk6H%nq+yz~W0EQy!CE{SFMU?GX7crjm*>)uxE-S+Fh?tj)9 zqU)yubYop>!U&)%hnSNEucSrs=Gw3ShTjbWxK9iY4+DbYtueeO4Zh=_O;x-7No{!O z;>r(QT=6hT%d6@HgWurr-gKWc7Q4?G3*G08W=!mzKS3>jFx9O8t1|n9D*A_19|5$i zzJnNV5dMdb>{3T|i6grmWM%wI-lOCu*ss6eefn4)vxx?NzfLqQK=R6HBu|@hoMhJO z7Y1e^D`I9KO))bNT%D^1vM+81vNzu8#{|qkTH|IQ3me2h@FFMn@rm*Key>WqzDvSB zu;8Nhfdv<}4=lK-ePF>w?E?!gRM7OlDfTA&g?(g#khSw_r=*omNf<2z?+b$;@vh>- zK2B-FTkG)FI6O>sf;Z3L|K#v?`}J*j8ywzx#pA25wBz>%KH4hlC(L8BLuqy>Sceho z82O%x_NM(Np^?No_(IFNJAhjapv^e8I-*+~QOj=b!eys;{q81_wMt~E5pl#?N#xoDk+qJ9 z4%;p}1v69uNBc%!R)2==R8btYnt`BF*TaqWjcz|jOh@}hQE#YmWlTr=Mj?Vj*X--@ zZ$-_x054WdB99vNZm%g9+~)FlH*|@oP=;vbSjnT3fQ{TQ3E0SQB+(Ktxm6Oo;+=j> zq;!Xr?2VVcA&GtQ(sw0sFxL4~BtA5zYhG2R3&F8;zd#&_m$ph`XRI{TlQQ7zMwTRY z$4ZMNfzKSY&Wm4G?6vmm&+z|R3DNb#?Otc0d)(;Nicy<*`wf2RD^_I$9C^mjBZ>JbZsvw;bQDb+la4puOln27j8>7DqW6FMNhp9DKz->`j3} z9x&jecbSm&4hf%@6$ziF6{)F#!!lcQinZcRW_kYaeQQa4v(=WwH(PBTA~&48m*i*JCrFleoiy3JZ8Usq7ipG9K4LP5#9Ki z#__WT=jQ}4{qC@K9Y1Rh8$W9f8$W9VP{+@j!^Y2=#Q1ssVdLinNq3bM#)*PyOVpRO zjh(gfT*l66mc-b3xg{}n{#=rX!I{O84rd5a)Ku%xZmeqN81-|AuVYZP03j+^M>?0S z_4@mrIMSW!`+s{$Tg6d|4g!UTN#RNIIaR!FXel~~F7~Ms9)qb36vmOlDBu5sQE-$N zkizE)3ZulkPEZ&n3+SXU!0%2D$LeUi#;7=IEu_+S9+zRubyS~e5Dv2HC_wNddVvIh zmP=EyJFeqZu6nS|@|nV0bH+8YOS&PiU2w2zM7Y>o6A(WAGdlEA3j(J2wSP zyc1g!A-8`=Gzs^QyYRR{9rZI?aZ{G}aLht(!~ak1ALpj=r0zGNrnYHZ;%<{9?iRte zce21DZttZ!xHCMth%W<)o#ES%!Orjp_)Oz&Q#I~3Wyk^_!ML)|I!*Rjr^!C+G}&jJ zCi|?@WS@1K?6Xdjeb#BR&pJ)^S*OW9>onPCohJLN(`27@n(VVqlYQ1{vd=nA_F1RN zKI=5uXPqYdtkYzlb(-w6PLqAsX@~8zP8qwKmEt~YzaNE_P|-;7GCWP^zVy^#>yQlL zW^gZ^@u8{1Z$mQl0RChQ!6`3kD`YE1YG{guI%aHm8Bg!Br?u{B^Hw~)+n&yHPtV29 z^t5~I=>mJ2xdySjY3Bu{u;!FV1^#CFY=$bNvYE)H?Rc55AvQPd{NQ8(`w9N$_!AN! zg!6KvX%m7w@T@~C_SYhvi!@?uI~?DAEm%QH2+pM@FBa;=xQlhVTw@H6Yg?2Dy@uH{v*~U@jj+r2AF) z{A*G7;2Kg+4K1;UdCY$9(1&=TcZuEwZ5Pz@F&H^WGAcs!s?;5jsYvHPj13jRb$pB( z{mvK-cnlA3QAYdiVII+I9C{}&G@9s#u<{n%%Ezf8@Arm2@mV~)L(z}3hXwvGG46y; z_YdUhaN~xZ77kh4K%kIwT!pnJT42YC;IVXslPN5j#Sl9km!|! z37z9==y)4fmBjHzqWD3>ddGfCgx`sGp)on7g2g>#F-%xYG$6;Si7a^Lld>3Q!>h6w z)+S}u5Re$)zW}1A7zszJl_XY?1b5to2FP%L-AqOPL*(1X=Yu|m$3+`D0jX-8%5DK{&`3LX`fS{iex(&I%n+RTT=K15eo(A2eCp7jm);nzl&G zOz}F~(JT~Tl~Hh%nn>YmC$*p0#?;x4X1NYJoo6@>x0N`E&Q|sKiET_}b~Fo@cirUZ zaBGeRj;Pa5Y+>>imB4ho(07Tc_08crwL04_J6di1%)7F@iP!#5N3(=RgK^llw4B5A z|MK}PGXQPpv;2mLc0LQ!c0S8hOzQb8B;EdemTh>F5_toE-CWGHozij}AG=dpzCi|a zG0#v7&d3UT$-kV!;&unNT*pE^u;qRx^}v?(OzMFxPco?ow#X?g$Dxtzz!sju65@7Z zJGJFqfTrp}gxqWtx=cXjz?MPG&&Qv%z+bomzdW^NA#u6ABlr?W1NsYZWI0ZC*=*(4 zl7N)!sV=`~IZk!iW95rTP|EdGmlu%5;U!dA+7Rv{`9J$qmyapEp6WtjajMHt4&YZ$ zb@{1uX>2DNiZMSlM$DihlC=mYYK6{tnQc;$qi4LFskvy@-=4-CIaYJ!UU2bVfL7xa zA1`|X;L|a`xbs=Q$3r`xg^%H|*uWor`wsT_Y#_H#Horez+>>iGWjO-o`3y)NYnEF<%{uESwI^O`(d# z)m}EmXRcrre!Vm=n}(a~9vsT{I@XiIAA{!sSm@t{(I9DSAn(-gRq06JMucXLC)WZs zD(6CM4cG-S4He0mEnDTY3SL&C90@@~l!CKNxwRBo9hy=Hy2dR5B}2s1oZ|I3mN99m6)&4p%%cgDZVPa@9Lo33FFy5Sw8`xO;_#WDQ~U$$ zJ!x5RtmK>K6kh~aE~!yAvt#LWj;iSntL>UO#gj34CjG+7*U#xRXQ=8aZHd{+5#w7`n^HDK&UX)`#Xc$4k%Z8?r`P!S%TI> z2DNLBSL#atVo=3PFsUc4HHeluoI=fD#Z;z`aRaU+wE}|UmM2Q!PC`XGZp~ekyJsRoQAOoxzs9DTo zM3auQJU)<3gE=1`P!ir1R(u-XACpc9I4xiywfF>Ta%8|El%L9r&)9}ym&Zr0{sXmI z)9kl+IJ@-8*6LXIMysF3Rwskb{uR^+J~vY%DW(ypnO17#4r+wTEtejG$ciF4dZj#| z?cnScam$msTB}tT_b0!KfOuFdDSnI$Dy?)%F=vUSZoyqr%3~`y|Az>i65;3`Vo7KJ zF7~lQy4n1#ep(|ZUd?e3>&7$_>yS??5Bd;uV?Bk=8Tq9 z5X=^Rjp0o59ILlQs~72`;I5j@tX>4W8;azdnJto*`pE#kB~ia38Q7lnvjEFeW{aMj zi$kfOm8N9WgbuUM89W2djniwU(Bj+KHZS^>Adni`Yx95c)Su$%Oa3AecXY9w_p;Nn z)x}5C{$93hP4Ul}eMKg3_B*QLRpYq1q4-VKbC=|4yT71myynx(MNeobK9gE~U8nlS zlRI70S2Z!pGF-N)^u&4=ew&|uA!pGqk&$_L<7l8GTj}y0cN@@J^qIr+_~u>uFN5~Y zc#1C~#9C($C09(F>Lop#u!r-oP>BPn)Oe;8Z(|ETVvRGpbXIQ_;S2jMxnu^gA2aaU z;;n0e{RgW8>}UNK$ZwE5?dNYl#Q{JYEqgMwROlZ=1{eEcVs~0YxdvOnhU%V$hI)V& zaIx9pbRDoSmUe(aXfwD{&Q|FpI!=k^7*R*Og+!l75FKYkCo0i#MzmUqy3(4W7`5iI zV~Qt`!?~h%IFWk%U5#a@7XOkhcb;XZdu3NLKSt$wshg_M$yGH1^7O)15fxyJ2~eW~ zj4|=fDSn3>&rGm5jq;352p}A*6CAtv9Ov)Df>a0Ytw} z5Ir{0yh7AvDcU;}tx~Bhu2lUwYR#lF4VycPcxpDFwt*EL`=uwqgR3-Irs!Z?DUg`f zv>ugCyXwKZY&C|Km7vn~QcAy5NKEXaY#saPNU;5TE+Q5>KM%G$$(4h6MH7d!ovbg% z@Cum&UZ#BTZ5t{?eJ{(q83vdNsi|cbHdKsfqrIY~2jjWoC-0)03@fkX#T`kn(bt3g zx#A?hu4T2kGIPGcH?R=S7}s;hc8^7tXTtID@}xJlaD78A4=+!8OS2mqa(Q@p(%bYN zIsWJJ@N&H>0bvCVxjei)>Cf^K*f=tmXO}1ag{bfwI(c1HCD97~eH7Zr-G)O-lRi;| z(O#)5+h{QA%!l-4v2jcZPa#hV>j4yv!0P5#QGeS+=e00LNS$7wySuLL5Xvd!1ZSpUw(02$c0ex;h0~I$uwa ztJmzZ`K6Z|wIA#^_gcynSKD4bA485Kw#JCg0a5b3Noh3AFCA_rzp&p*ctAJHYgOZQ zpit^C?=aiR6)){}ZJZVJ3BF7-E9aN~rc7nO+5sP=Ev!&DE_j=xpPgmixz<=6I$C*$QO{WrDQHuCN0SKl!&M_7j+1`?!f}x9V8Yz(*;f(kE zVh_p+0>7&fb3|K7Y+Zs_fe{<6#0mlyVZttwGwTWhRTk!RStE)DTRfU0;of{sg7A55e=zQ?B)TeTE4v^tpegp*u1y zM4ypB|J=}XCA zm2$Yv#Ce7?v_I;tuO0RFD|FBuhU0Lfrvit&U=%0ujijp`^+wq?7>>hTK%5>$4kz)Q zq-PDj4*Pw4f2JWg#1^c|CiBys&N;y8hco3y;RpCN{V2C)7==6JYCXfh-C5>{IPqtHX_L@w+`S}uH4#%1iwt#m0N#B7FTYOZpx5*ptS#! zuiQ!*`#t2eE4L_YhM$2}3O(&t;rZ#-K(3*h*seV=DrIs>D)cmyIHPKE<~xF;*L47V&_)sJm62*SPPkSI^#q_*sEs59r$c43+?32@SYzmMiiEeK%+D!;+^~fgpG-Q+ zp~n?(G?*2#^dVt(jxlpgYkmr5z2L4Wvxl_GP6L+RHCfrMO=v*)t!=M?bqNh*_&dmP zm2mv@1g)Oq+)R$YN^o4&u6mZU>fPI}dU6dzqI&na>gBB_uW`a_`!UMP@r;fEuS|TH z(%OyJ+BG$(E-kyPL2Gxe)^16IYV%yJ-NJ^j%x_w4-=Ota^tg zkOy3&Y%Yn1Cgw?QbT;4CLX#A6O+!b%^Mx+Z?AnIxztIFHcNW;{?0w8l(OgaTm&{$L zxhdJlQGkmySDW8-tX48-g#NyW&tTc#5o9KNu3QHHsKI=Dyux&Z{a&f1n;}5{nTFeH zzn_6d$2nf;R)xXESp}}>8EZcl-=W3a1(_6i3CxmN@uUbJCr6RY@OM)3K|X8wpamtk zR$0K-_%ooiH3nG=YGYV#r1rI=v@Mz&w67hdZGmgUsO=%D?I|6(2p1Zv+OAb?44?}(yVEC0Zpvv4OKo*5^wH9+`lM_^vyUoTE zi8M*>4uM>xi3FJ>_u!kZ1eqlF5=@7K~I_yf69nxISv~R~Ehoex0%)qp>Gm!NyTa}iIK9HgtEQ5-XY4=y7G;F1# z)4Dezn`GJQwAx7!A=$DuX*HLz8a|^9g9^QWIVH{iR|0^&m&`%&03;ncrehTP9|9TXMDi--^GjfoR`iDR}asP5kC%Nc0 zRAKior*!l82>dcXtpSFV($D``@=bo)4b1nq{7OIVR^|s-evO~DocV#4U+<^g$^22` zjE5?k{j`oB;l|Lxy7i}Gi=Xy(1>_xy6YVI^R$nh&PWf#lx5f9ODJvxa^XgBNyp&a{ z9ldlpv}J8kG3*yUzaEIINy#Lb{lzzn=h`ht8acM0(+zaGoec9$-voZz#- zE?rI;>2kbuIc1dPa&CAa@FF*oz1_4NSz;O9v>ds~GQ4RywU}}tcK$;AEC=aaFLV=r z{p_N}tTq)Nms4*-@6chteh`*?dE7vHf>B#1%gxRMvh73eEDUg`!0*SdUkeKTN ziMcM2nCk+Gxh{~H>jH_nE|8e(0*SdUkeKTNiMcM2nCk+Gxh{~H>jH_nE|8e(0*SdU zkeKTNiMcM2nCk+Gxh{~H>jH_nE;uaaI%DioO0Q8+6gCf0P`|`)s@!emqM%YW3W{~& zkfKpgIx^&Rl+e&KH5X0QC@9U9dx1tloeGK>3xT~J2{A>4D6d4iP;aT?W5mR+;luChhhiF867Rye#6XZoWJaE^QUT5H8ru3dx|(JBIj zYg+?ocm+TG6fbWDJwO2i^$xrTX6+`O$V12BV(#z<*CU-OS89G}EuZ>& z2~Kw!Yw zO?ZJu)l@8uq#YoYtAnjT4pl77@iNGo0VbmQLtX}T$OUZ67w^DS8NMbUw^Bb1dI%SV zWDvX3=1eztHgo2E2$-E2hXg2&lyD`=cufzow(8TFZyU(I2|n=c%lNjDD6IyMugNf1 zdF;MY=Viw$Iu<-miZ~v*!UL}~W6K!p1S~Sas`gmr(m}XjkK|Zo)4|HOj4h+{8qN#R zknlxhY*~n0UA}p2IbSlu`62ScI`~*GgOI#wNmZT%LF?F_Nh;`E6VwU3fPxN$NvSfD z63P%cliDjIxxF%yt+ZN&Oc5c2#xW|R%Z@G+5hF&~E8_=)aKvyUWmO%JO$||opfRWH z8;0wphK5NtT6V>|l9kz_vApczw+_qpMAxDfBuCgYa75cNp!AK#qU2jWU42_vPpn2; zJ--QDqf0%%u`r-1+8nJxyGC!dQmf~;fs7%po-S+k{LUy_J-;*D2;?iIQSMjy7R*wE zadK8wL%z8PO3`-MFI3tLX1_%TIfMC3By2O7&#c@T%s)lOHiL0_XD|nXgu#^hUs0~T zDp%Cxa`H7%u4)8Qs9by7>us;q&h++Pd%eA9rKY#Px7VA?n%>@TuebLN*X-kipq+hu z5VW(859EZ7z}bh(_JqzaqwT+`b=x#kb?)le%DNp$)a}job$hdY-QH?nx3}8Y?d|q; zb6KlfOZ&RDxVm{=I#Im1iZ|`&DxMRw<}8S}2|*UB`UWAwZ@fB&Xm}hy@~Y7;G?T!Y zLNZh>6fTVM((ZY!nFJ2plQG2Qam-Oa?B574vMPAmU#~NnBidiDGnsSBp5g$s*xDni z{dKXmN4fUb#nv7@wZC2;jF%C1V7Xk$cw_JkD#eJTa(-bBF9}|h{Q8D+epL?NWclWX zu87PG-yCd3G2ZGcR!vt06Y*m}0{e}g z4XM8YIW@{D?fc9Wvl1H*rnK)fuC!Xknqp#&_PY3V9|kGM>n>A0B{-AgJ096~%6t8l<6?U^`Q&u$w0EYX zj(P1lc5KhFqm>%Re8*ASI^Qh+WUtG~v^abUrU2_MQ~{hIO%x#9(Fu@l7Pmd718=%n z)Rvg`#tgH#=9qTJ3@gV;lVWk1W^rp`-R{9R)H95Tf4iATi3EpmlFE(Sv=98D(@YXoI z0}c=8==GsK&oubu4)0sv>elRV{^f8GE{T6#j^gkeQqx>KQLE=nw3VhwE7IN=`jKgd zeq@^AADL$ON2Zz7-ZWDtDYua{&6NL5(VGuNwFdva!`tUCX~X;PO|#Er<#(n1hClVUwBh~trun$RA9Q$M`K@hu|GjAroTB{Z z*>CvY{y?;})$hMI%?AzsfW!O7uWiHo?@hDPhP}(}7n`R32h;3Z$YJ|+4I&BAy!**3 z^y{*C*k4|yUY8-YpS(Q3;qyJJzqq4s$n*X(BJLKyX8`Bdw`6J`D0AuCJ{`e<;_?HKK9_g~4NT=r-@6iW;(15yV&B>7`=L1yu75WU@>_jL zODNG+S+P(dwu%s#2uWwK{|f0mt5v(mdY$WiHRqt$tp~-jG6a|cin9hkJ`CB&SEpt@ z?&H%5+I|kZnONmfU`eH$g&$WEWaXn-itrsxz4K<@UMjm@bm3GlyvafmYrD?z!hf{P zbO^f;oQKR|Gptit>x`@89vug+ze;djColI2uIt)!UFW!#%aW7bo!%&1A2qI1;UL^b zhHI4Jq4Twxj`0FA%ql`PHzcJHif?NCdaLzZBV}0Xn5-3DBTc|S#H?oNspa$i;KxL;u0aXhSO`2ypPyMJUM$GZX!)jwuCULGj5>VD zy_DJITjS;T(=adAMRa_wr8{F4J%6TrX4-ExSahB3 zg-&d4J+_WFoLkPqdq@c%r3+;l;&1UR9mJ3EM^aI1rK?}_QzhsK z*WfrEe_|O3${@a02e+pB;S5a)uVo2FgZg7-zFSLnP-Xpanex_hnn1JF7d9erJ-qHB z0p1%c96;qfGF!4MV}*>u53kpDTwh;!9!nq9?1uWncUjvF42r~{T3>P57!~jh`@O0& zPI7@AJgErH^@SxwuWT5HVr;MXDjlSgfyHlX@lMEyp^KReF3wQ%_SrzJi-Ji$TSqmX z7;DycjNhF`xqgLW5Z=N&a%s5g}vB(w~%V6@r{_8&e9o@-5aZ-Lv$aBB&BtB-Ki)C^*X-=N2dV3+O2ySVT7$ZF>gwt` zPV3rQH(b2Faaz{{b;BpH-;L9bu&-|T?KEa9-CI{Ee%`sd-q%zwwW-nCtgJ5-$L~BX zTvJ~tYMP+cTUxKZWTIx5)fY;4ynq5>EQ=L#FM4=#U&*d)D3r#>HCKS9Sy zR?)R?GR%EqTmBe-1TE`Sars(L(VDwfUclCU7{J51)h&FgI-}Ed96MFr-6?9gR#xkE zIXt9%u@Q8HTS)MI5G=EhaysF3nUAxO^1q*~5;(-F^MKH`0upFQxx&|!OH6oMNcr&= z6#g4ScVwD~J|lttzOftLE+~As28Cw*(tA2V?*&IsERNeg zrgfHs_uAsPhq^fKLL=Y^RZRqeoNkUliFn=o1Z#2J5{}R~#T)A4xL-X{RpSUXk-%9A z0_h0?7RRmXo$4L82%pmZ&-|+l-_dC${=>i@E;aZ}D^Mei<9{Y!$s5n9Ty0o8?Y9cY z@_otSiiYfsuo!U)JJlc@pPEUazZdk6l^AiYPpvn?V#F!lctdfh%|yxTZYZ0afgEo! z;>Q`dLyKNO4FFtgaH}o1NRd`B``oF!i9 zOK_;tXmNrtT3n{ELCDA;7xG3~v^aUV7&*tQi9Ea|Hv`k_86X5mL+bu=l7`f|aDeQ| z1AvTEqn^m}{=MXXFQks2eq1!&g-o|Uz)1syeiUMNlj0l}Vz-D-?2_^!2peh_S4Z%} z0_svCp;!5YmrqLD`LG2cP* zyuxAle&)MMUSf>CK|U2RMrY$u8e@zID=|bGV{|;SsfaO}ZROVzSIRZUXcEg2V|0g= zFFMMVYm8A0SzLk5`bCC}3NU0!j8TTf7-dL|QHI1AWk`%shQt_UNQ_a2#295rj8TTf z7-dL|QHI1AWk`%shQt_UNQ_a2#295rj8TTf7-dL|QHI1AWk`%shQt_UNQ_a2#2959 z7Go3{dl#kG7$XXs+A}nrmq}+zjL{V`Lsod1KV&0-b%wNAMI=q4ie_?X$4N_>+?pDi zrMYP4S4n`pQgh{Kxh!O7p9_j1k~PJI=I%izqdbhjfQ&2ia13b10;GeCe}n+;1%F2D zL}>owfXP}0F1$iEdlV9gO!^q<9F0ukV;uJ9B9m^;N%K-yv$aCGA+}+74 zmA`c|kj|J*BmyT#9%J(N_>+ruAN+I(hoABfAdz>&I(&S6$~XJV6GBhn{t5~j|_L;iR8mg@|q%f0UK_TSF7a1 z!z%e`mE4t%EP9@A=flH)06VFONIG03$Z9&v4Z6_|Q_X|@9?54|?*O38X zzDdw;NseSf#UYkP{nb=@rPk!0iK<*zqv(aG$s+($8JD>da-{z$o% zKT>Y@!<2jb7>HD&BBhu}PP7FSiPw;;;g*PUu`DuEMJzGn+ci^7w?t&b>g`OmfKDPL z-kfKu33RgZ=9&2tqt-c0+E{9wsU3baa;2l7H$*N*{a>?tV#cGve{{a;$_dy)!44(_ zOKsoksqI@mwSB9nwQuz_CzSQ5bgPu>QR#;5m0UkTg-9|jX&1_C>q1e#17-eBL;pIP z%ue>Iiy-s*RHw}ELhVL@@6^w5qrmqTuVqe=uyXWU2}A zf&Hq?p~GdKJ_<5_sWRVio>tMx-b9)4hH3`zrO4c70ACtkX8>QCT+RT#6tUY3z?C}# z_*W=l08#&O_VN!@j%76}hm)t3a=e_7tq%_N&U- zA4-ggQGXjJsW(-qXU-5+W=W5pa&=Aw9|tXtX4pBZ&v%6D$=maE>G%h*#hswj7G*%j|kv=nl{e zH|{+Y_p&&z--oOWtzHh=B$EnRtkOJkjw-}SRdopz(kIJx`Nco#@{2_}d|$LNf3XPH zHs)V1vbA;j>#f{%`5O=K@}HgxIqFr83rr3tPZQ`i+ zHt}6GYA%KNKR|rd-&B*=2CJz?#RjWOOkNwTF0oSUYM1`V&THj0gid7Cf1ka5l4;K-607(hT!5dk;wy05q+o4BxV34xG3BZ5XnZlb7BQKO+Pzy(%sVm%%4Ts zZagvfwWjHNodet}TxNX*rohbl3Xvsd)>n!sF|)oB?Pk`)_B88-Y}RM09J4M_C73*! zEXN8*jx!sZ(V3VQn9-TSh3{|_GdioW8J%S^AaXeyV=yy18`K`Ln{yl6&G~){P}_O0 z;z>J6L7PQySaNDQJb=oa(Zh!H(T@`i1|BF;FE~ zGE_BYk_?zY5kLn)o~!~0 z@J449zyv8_0cKKiOjV!)(9=6@PYEdanzpA1^mnOgy85ULw8M4UoN^NTRZmHCz zh98kieQJ1_R2ovltECc63%@Fr!nE*PQYlIcez@YsJ0SKJ5g3}m$}lVj=B_6?N>CN*hSGke`$CUsTnQj~#1{ljTPTFOLfqZMUZ%4n$+%}BXaDupvr&X!7aM$kkPYgM$k;}WW5txVf0Crpd z>oM#a!!AlUeW#ng(}QkW(|0=bJsgoRZI@xO2<%V5m*rn+~H?8U0u=^gZ z^1h0aj+M=cVb>aVwP9Boc4d0dO>6o#?1Y|*{Q%0q;r@?f*xL-d-mvQoyEZ-OrZs&V z_E*5n?FD@w;U7dB;GmN_!!DX>`kra}o*8u0n!aa3-&MdI)f?FD{Jgmi*xL=e+_1|G zyL4vIO>6o#>?eSE(lNkp@BcA|U2oXchFxXYl{15GTGO{-&jn`tKEOWGe^Gl!?wy8R zZ`gH)T{|=ArZs&V_Ap@XFzldzNesKeu#0AyzGs=fX9eA~rtewMcdx!G?>dx$qx=c9 zlM4FYZP?|8U1r#&vx06~)3;&&4$M1`g-$y7uZv+vr(+$gHtZ_HuACKg)0(~w`%Pe8 ze;lwo`d^G;&o%6N!>%*z+F3z2t?8Sw=bh>Cq#duAD+dAlX#Zoh#VKVywb5>)=_#wF zQj(FfOe#egDUWDVM#{ZXiDm@dAmM6hDb0{&{57x`*$*treR)Ag?ek6iiVRF?c?PDm zEFUo^S%Nm;2t2VHX*8jbT?Cc2!2uO$+Q=!@d!ihxZ5e3f~DwIdU&F z>;}WGH|)BMpqm!h(b}yX{d4EP3 zsPOHGVJ|Z53d1fp?6TQGH?8U0u%`}CY~MiWWR34!HWzjGrG{N&*wuzzH9P30HGLCy zq>c<`Dlo^HDZc1SIZ7ge#nV$-OQm6UN;9d{&rbP|*jOFmy6D2)rAsuE5(#SLX52px zfz&DLK%th{df!XU+V6XIL#IP$2yVS5tvY?Zqte~3~ z*ky+O7%&H%2J8yo+cE65hFxjc6^31&6?D^@z76{sV4g7;*lT>pu(_y_R~mM$Vb>UT zbym<#Yx*W^G4f}CS!Sl_82NfL@@O`UydeulUQf6#Iv9B&ZFPl_n{gj|E~M_|pBi?I zyvmHcEE`5%nhhf_$%c^^We43LF!J(jnb31iSLlyWl98XC;wWaLDW)nL#!{J$39ZNu zx@n=9Y8rrGr~FN^pFD{_KvTGO{-e+SH)&Ia}xUt2a8HS$`+t~2af!>-8*x@k?{ge^w? z9WcK-2iT60Z!;q=%!QFhb7ABSgzKV%kr(AUMsCL42YHh~Z~vtc$H?o<$jftK=Rx>#U#~8XVz!%Ns&ip1Rk<*h%G{uv7K*8%0SNXO zVD2*P<-WogcD-TO8+M&x*X9P@w7_mK>>=l?yzinUBi|Oo-f7rHd62s>4{}HIf^J%1 zm(a#ukvsVU#a@Dv&btrp>gc4wu*(g*%&<%If^J%1R~UB6g^K+gN(xsN#jtl9cC}$w z88-dIyPMYZZP>jpQtX#e2G;l*V%X7CMCJ8{U1!+ztL$!C(>Gy@k@vn>u_I=Rj*-tz zMYvLw4CarSOAnv!>F*9`8` zID2;_nuejgkGnL^-i<=j11Q&Wm&VzXYuCehuH$F#+_bi4Sf;Aw&x-vh zO3L2NjA6&m-nnUQ%`oh5ff@ZpdC;Xt)iLb&**iC_tr>>>FJO*t0CpRHucIBE#LwQj zX>H9g>_>rl;;+DN>o1I9$IsrmX-(gjsmcLntN#G|F#om~cKqy}o7VJg*p~qFOT$j~ z5ANycB!2eJO>6o#>~6oQylYWX_HI!OJAU@gO>6o#?4;d_{UFM~5&ni4cKqy}o7VJg znX0dWng2WV-Ohh`FGnZwvv+P<)3;&22F#Iv0K2`vJcb=Vd*`M#eH-@Uz#Q}^u#fZ~ z+}n{me)i5yYx*|qEMOkuQQsH{`X|J&<7e;Ow5D&%f?WvA&kXx0|N0nq{Op~Z*7R-I z9la{=N|b>P{?4Qw1jF&OcWzqKw_$$|%(*`3q@zDKh8;h9=cYA%TlVfwzhZ7~0qmpw z*V6up1IymIK^kZ8>cAo|02bvwPDemB@w0bsT8Qst@74kH%4Wb`?z=aJ9Y1^LrUkZ> zy?YdxCnf-Uh3}^rcKqy}n-=yQ2?M=$BAZVx#kMj$-0x@7%OdjFY|dAFS9VC@Ha#8^eyD zy>rt7+sWQ-17=oBsAh$)CWak9d*`MFwv)Z90Oo~<0DGmc-|>!4;%D#Nw7_<ZdzbF*}GqWIX@X{U+HV#-_c3@?46qy z*iQD&f4E|nprpjctQdCu?46s|^ljO@Lyu7G#V9GU@m35we)i5yYx=hA-J$IiJIPGZ zG4lA?J2&0l**i1tp`D@a-u_mUtU$Q(7qfS6kjB}&G6;Rjkzi5o`-Yz*b#d{tcWzoJ z#>w8@2+YHSz+Ub_RfrZF_0T)?F+|D0T2J;JW8^h_t0sfQ@ z@&{Z>L${VnG%ux@R2p(qewBnLrNMVdr7pKS6NP(FJ6|Sr0+ogq{#wUy|4GzgkN_0r zdAglVweD!T2zm~mBh4jw;mf5`nin1;m9o6>6seTwg=b4;TW*ARM^w2G0-JqUtk&mZ zX9VS?b!P~mO17NYL$&<8t$8S{jl_)9fy!T}1;h{e)=;pa5)6;I+ zJq%p1e*xzFZ0R|7Y#>DyL=;a{n|VHomXT@BoHd#wgNR`8jUTD=|C|0=oOqvf#Q zr#=ouddfjMy?4K-9MSm9$A_MK%Bif+F&fot$sXRn(^x=z1e^AzMTIe^udSAqcPx}fe&1*su-%=oABqZ&odGJ>gNsqQ1sIG@Ca4e*@@ai76 z@T$(a*usWAY+=J5w(y$RLhsIWcSYb|GFN>#G*gK-ibBa!#5y*q8pS%QwJz52R?Iry z7VA(Az2oCUk0j}hJWo$T(vMhDI->rh=)316p7SSt{B6%EJINfM6yT%T)RqWXPf_s_ zAD@HmT}eNE6Id!;NH1)CekSelGn?H4`mJf!6dz4En(s^y+YF|c`ifXx$uMaX%3fX&+j>=p%U=bgi%TA z!M`C68jt7t_!PFBXqGDlb7jutc%$4Ym@D(f=fL#HdcJRu6U)ytpLWXU;}4XN@vC7z z-<@lG+JR45{*l6`9r%>yw--L`!KWl&&nUK+q0?1|`Fcq4NVFH`C(GR+NBKnW#cT7E zzvAV>KCjPD?$6JMeXh$-mirCub7j6BkL}>&t3&+7a|@E?9+HltM}P6Q{N#5Yq6zOL z{OG#eWU;r-5T}rDXYd44d^>4md@XD8wQOl2->>wU&Q&GLRf}DGf%CYzl)!sXb608R zOZ}6-V&NkATwaj;FsrbeuZ8rlC`g{m4}EtrRC=pPK9tv?9;TauzV%yG%NZYOx$+$P z(RaEW@m#2*DnD7SW3GrbZzYsjbH#0y-7PrJ$A1r2E|tS@;UzhYkF`%~03tZ%cARsK?xx6}8@*YUzU zM()h_7jMr`p2cU<7|9lsc{(&|xP_Vd#z&ck_>TOn{*E`N>ni zrm3C?lCAl{N?@I3V(;K(aWcdn!xBtE?^wT<7hinhZfXVcLynntuAm7Qu;xDetZ~rDw`gdMleb^w|FJ&9~Ui#95n&19z zUckObdu@JuF~NH8Cxk^0Zhrf9%(339HdvM4zKwp?Q~jRyb$r(F2O+03wQ8|H$*nVd zfkN^JUTWUyy^==fFP>kJEIQi-Zbb!b7eDKwM;F8fQ{LB6t-|A{quGjHkib@Om-USBdfx$c)W%4FoF8!DZ zda6$2&jBANH29JB1TR4EM@*~-_+<0JKAElJr3JwWt`0}>kBSCbf$!piqh`_dv0zXr z??&{iPco^j#$zAn$MjXYd-z=)zD;fkPwH(K+N8dUNo~k){}ev}uR?J<^V^H*y^3+y zW70NY63GZ;NEWCSC5(qD5K!D~WKzqF#0S|#u_sqI_xqf;eU7}512`N=Z;*X4R6 zKMh|e{S9Z*`=0!sj^iGbUtd5gz(l@#U6)x}CO_tt%RbZ36a=mBd>A%c#)s%%SP*;^ zP`PMU%h-w$lO>2{e1y+r31S%^C`@dspZ%Hhm${%nC0@wsaVqzL4!kxpBuyzxvs9%i-J<$7sfJAY zGqO~qi(NXPcL&E#XD=1mVyCmM-A-peEtlBHMKkTZUDy&As~i_Y4wI*XxOT3|-gpmSb$5$HWq*`xKGoyM|sds7o_RpqaslFl%}hX zwb!QUdyWc0D{5NjW5_wQcv`v9oyx3&l*#lRh4V90csnv}tDc#1g;b(5Q_ho0Lwd?- zQmIc5Wl$xRvS{Ji@=eLi@Eoa>&J5onm9m-P5~-BW3_m87ikabM+9yBEsaB5D!mmh$ zE**GNDs<_<`%{skxIkN z@Uc>f&I+F_mBLx!v!zlrD}1R`N@j&eNu_jFc!E^QW`)zGQa&r3FO`Z};al~a8R3Oe z*`6MLSSqV#bXh``dQ{HxbXh~SOf;=V*_*pmN|!3?vXN>pqG>nE zq1@#y=~7KyKBAg;xiUHpWjc5HOuE#}@^t;}MvrGRn$B3ET>}B{ChC=vGKbYwF(c&& zsn9vtgQY^}VBI9)UeZ!OD}16<3TM#YHW>R3VE%5{&AdG+J_hz$!;WSEyJ1$)O#>9DQJU6c`YlK{Kaux~T$Ux7Js6?Bs5{XB-f-mvL# ztzy&RS~m%>D-8Q~!(IZ+BcBC!lJ~T$9G%eB2&(TY!>-H-x=DatZP@b-djv4wFzn{u z2V&S84ZGH`Ychgv5@6RE_8o@Z{5h333uT~%_m>zp-R+=q(+OVHNqt7pO#t^b}BGy4f|m4GcoKM!!9%I(%C^b z39!ozyU4J6RH(f7p$xS29(1)M_g2HMH0+AmK{pAos|>r?us;Fj#jBx{L%ic-*tLdD zr-M}|)w6?c5@6RF_ML`(H!z#M0PI7(uf(vo88#gZR%|*L>?Q$rgJIug*h7H1+^}1D zI}LYqLf3PsofKvQJDM4ElK{IY6LzxDuy+7+)Eda$+M5%@-fq}*_E_aE$qc$lfL&(T zcN_LSz)V;R>^9!_V%T)Qh{{c8jTM{D8oNn=U1`|&81`wve8#ZbdXFFB=wzp1R~vR! zX3$Ln>>9(qm$8@78hhtIRo=h947tPJ6{84y8?}+!pONx`RO&NRHc6!}^SJd?Nm(PG zYBPgwfbjRy(vW#PFX7t(Kk`MuFWC{3e78wnm}Rq>6?9YBY-V9L`AQmreh`o?Ujp<~ z=Ztie5>1D~=|nRoGb`w(u*o#&`waR@KyEPTrH{p+=NdGfW5!%&1>F=jmj->mLHjCI z+8HPV%l?Q#7aDZ6L04r3-4r&J2K|6R{{+bE*FhmGujZLlPdwkC>kPU!E9j;GbiF|@ zBItfRjqd>RZ)PRW1C}ngQNyN_(yEMxtf0F$U<^;qoPD#4~V18xUVk2Ke-m6~${E{i79hH=r>=h<^d3MlEVH0VxKV;gz zACN891Ny1gV$h2Wy4s+tvV(34n@EFx*q|>1cAg8|ysh8!&pcfl79lFM3W(VCAHkmn?%ts8m9*|=;0D5Ij44UpIQadRz=%SpU zn*z|K2K^{Oi}_UpaQ|iu^Q+3))BGxPf^GnqUrmmf-{+9`vMRtY`Ie1apU71vJDuysMCJtD6gH72`(o2} zF(AGF0`ya7UF$$s7&M*e#zf`>-4r&FxtPeu4fK{o}UqxsPF(*!N%cRwIon3b6MZ8O-Sd?=$ZKj`ia*b;+%hG6M%`*%@~$INaf zfWzO@mz2v%=N_GsIKetb(^P4<>ZmMR)Gn2>M6+lAm$F2=z-@5O|1eABq4d)K_gSJ2 z^L5TfqwG7Ll+rj$bUm6Dqr8l}G|mz|iKeemW^k9rS)%P|I{FS}cprCZoF#e*O??*N z=?HjtQ7^2{O=gMQB(USXvqYJ|tTXIp-b*Gp*iB}M+$6x>J4-Jo4bI0kT)xa z-DH-?O#ZZb>cCIR-|S)#)hs=RYiQkLl0$&OB%%o4dtfW3E? z=yhNYx*Iw<#Ct~!yU8q(n*`WV;gKjcQ}1@RNXFQZ&oac9U5mH-$~4B}JSp z(Y1hl%b=h7HU`~fmdH(E6KT*+mgtBjD(x*O153}!aHMWBOXQ}oi8N>@OH>KSzE43R z%N~hAH<=}JQ`lr0w38)z3Xs92fL^&f2Hj+q$V~z0y|YB~0J+Pc&HS3o61jT=wy7+U zncX!ozs6aj%Xu%+HJT-Aj=YU!i!wP&)Zk=^u4%lP>6*rynXYNPnaNtQndzFwo0+bO zZDx9O4*_=1QMH;NH7vkgltt40Tq*$lRTGD(l?QER!XauEff8UiL~ZT0I7F>N&}OFG z&duqMV$qwFn}^d>*LYLTqVH&fQC`YPQlSiGU#ZX`hi*AQmM}i=SYP%DcvlUrFr3Esm#yovWP0*LWmx7RhYxG2=_th(U9lq z$A99z0Znfd!ss?)=_ty>-!~|Ks0rr6{5=!QbVH__7E4D-z9g8}0J-NpATN1?*khqy zn1=*29XZxiEgd;_Q^4-ZEjxKL?e7xkiGY0Hpr49lJJ2NtU1`u2`9U`YpsNh}7K83| zvr7ASl!2u;#-JA&bd5pNDGWCSplc1f(4b!hWaJhoWZBjjbg4nt8+2WM&`km827|uU zpdSF_&j!8nL^2`hda*$l7C_f@M!-!0=%NB7m~SI!NiYwGVLWRFVoOJv!Im0qNkP!v z8?a>tdpp6(f1OU}t(I6DzRy*S*dsb1jUG+j68K+vG}H5xTP11#fFDgJ`oHmLeheXw z%2#2Qb5^?Xqj?pYUc|x`IDkjfP22dY6d3t)*$#?idQdog zel!;V@@s=$`F0Gt$w$*o0qDIS%?n`|Wo968A5C{}!0!EMp71;$RM{*Z*#Ae=v9v}ycxAM8-0djKmBR*C_=dY6Ikv2FRJ>&-qa2069{;O{#LD_zS7Zf#NTvD(8v6I+?^7AjgU8 zq$;P0zm}>TCjLgMa+dg8kw%UZZKDK37auua{Gng)U+c8TpYjC`4)>6AHw2N8^e8crnLObr-jM%K zomzJPI<+sxruN0y)V>s(+LvNeTgg*P1N8)6mJ!Kpz7m_w^-LwR`KrvOoG9MFlSN;%N0%dWrvS`RZNmyLWlS^@I z{z*^vX9n6@m)}ax>|VmQ$cJWI$&uVk_2a^VR&wI@GVV+#Y+A{Kdih&|R8epWYyFC; zBoCd3Z6(KRuhPS|Lt7Q|;o4z5V{{0qm7JBmT2apF`+c?!t8b2$OK!(}NP z-M;bw=&rO@I#HUV)MW*&rQ!lRT54$g?C#}=r$@J|bUhh`=&?ZxrZ5Zv+iT28QM9YsR_2Nf?_y^xZ$80c5 z?nkHW{mbPzA7LloGL~*cSRt5v#K|-Ghyr>-801?ABnLwrrXV>0xjgwK9z>q3bu3k<-OcE8C&lbDO9eCR z0W%46-pw}jPB!%Rj~*;U{2cLFIet>P+;FIDXXPp7r-)91Ec?{TEK zb3tX)nM}3Lp=ukWdTR?&`MomhtwCkfHB9x3L*;jVjI zpX=C%1&h${S(J=e*E*4z6XKAQz9MN~6UB@~4?}KX#2P|8dEzwc!@6UdAs>H6B&$U$ z7lFh`hh-AUL9}=X$!fExzdg5#NN)EYhwesJ!QIcL?y8g9RVNcpdNVnJx~ooZ@C>>9 zJ)$lY8B>5@NbRx+A&(iR&YVG=Y{rMQeTQgn(WwKC(PlEua);&?hvvR&qPbbL>j6z` zlr>EAg+p_*(VUvKiD<4B8-8_$&bZMI$R?VBw|P8g1iaUGrSi;K9`E(6lQXZU3b%Ot zE$H7GSwJM<@6^N!~jj^>_}>9@@gQ=+YLRL$B#WJm}}uQu;}`^6f)BN8X;~@g+4o z;eMaTzv-N29$(El)E1yiA?fSHKEu79W`SlCr;#_lSiWlZcL`Ls+VMK7m%y6-+3tta6S62?EqyNv41 zQ>fnAU+jCwp}5ocphIz&FG_Wf&ztn~tu!iMV%b`+#}`Pv;g|rO1DBSBWsi{T51vRe zbY&2qui4~2^i98a=zg4TAJ8}c)%jk!PlLPrSDr@wdhr-rBn7&WGzTROq<;g)&_6zJ z!YaZF@E87v39wnaolMi8keanm;BPk!O7Jv0vNczqC8TD-qqy4YW>Urt44N=)3=QpE z-UGD2ZqiosbRdNbfNZl9qw7hma zL0{>+gL{XgQE$s#wBY)$!WVPti^P$HH_Ueo5eLGB^hG9raka0Xd{IPS^kfG+93&-C zujdekV}e6j+&>Sc@fXrJ2PHjD|F-JvA0-NJIhlb*3o?uHF;CbvKCy~$Qp?rcItHz+ zT1Hn8lWWo1&Xe$uE2;T9-yq_02&jlagYA}Jl=NRar{MF`XZr@hTv`QO`|UoCeY}--MsugU4}%SH&IN> z+e?D0!?#`0!s9u7^HtR8@K5PcqPgxrj6U@B4q*xor;bSS4);Dnm3FgOl;K{MqTMW( zVz`$DNLn_UD296(-jguqV)>9x9}cObFaAjt(MO^uz^|(9pP&cJ`-qpnZ|<+exDR19 z)a}u=hP(dWhPpoLR|aUD zmypIihZo9d=MakT@bmf6^(6EnTlGeLeW+7_dm7z+z6DIT;G5?3??%i}q+XuG zUuRW%66UZxixS@0quYZCEt^q?fdY9mSs``%jmP|8!jIgonJi-7B?$wm+mRvamVab5 zjkh2;owf$i^U3qFB%wXE9_9U>Rk*sjmsf^iSTSwo9F{{1Z7y}|P60$p*A0vX#wc)e*AIEbY?f@`r^G$c(&QE|LA}a9e8J6lEz; z#&|k;w_n2pP?RHpVrZF+($V_^&(LGq=#3K}s?C`HO(yAYakq#c=X?$3Dya*n~Yd{|H*y8YbxG|519Uiw{N}vxn z2M+?RC8P2#RM0Gd8h8nV4x~7zLzG2Z*qrMuxQt^Vc#P3;ECi2X9mbXukA>iIIW0o$ z!~#s)(fcCLW0A5O2zJJ{f!RIpuq!flo%wy7h*WK3I&)TwKC0S=b>N_%KI)Jz@9@z2 zJw6U4mOqg}dgm+4ot<=QjP1s=w$ zf_W@(coa6~QP`MAVPhVJ#-ju0?}&qrl85yVUc=`q%P3eH>vjdi@^fOTb;NT)yA7&PjD%JfGKRL$5vvKf1LQA$@H+dAre z7_S=UK`$QQk=~d`y2Im~-hu%$?(o+4H0RcNXa{!B^if-x<$3IiZcvsz!O~a{h!V?_ zX$90_-O!lj4Gzl!deb5dV<}IkeH^9|7%e2Q)(c32a(;FPsRTQBA5RYi-CzevN?3x$ zZAgNZ{4fq`&UN~OWu{6rNF<_L3NrOU8zdspA1pIFh#CfoO#b4{neC%&h9@^)qV!qq z`OV*Z3fk$HWluWFI3mHMod^vj9rPZ!$TNueM3`{Ii1&=*oE&knsWm9p&6zok-?6BB|76M;1vXnj0yTN<&U$l~fjGMJlCIpWSUERmwl~cviNg z+lk+jZ+B*Pf0x3Pd0v(JQlFM|AIkQFJ)Y1JSFyZ>IiZ83vN$XBC-wFhmu7{2l1elu zR40{&?64ao5*DJetVkcJETup8cF*bV^IYRsF5jW_1`{tKkwTA98(qJb6S`X}r8%Kn zrBad;c9TSwNlST73c~B3Zr*A-+EI{e)m>4>iz9;j}33Zi9bxx?g zRH|~q?(UIOq@^||a<)|Jaw3;VrJfjgx_v_0t0h(TJA_oZ4XR9GRSru~zFiZc%2N}e z#*$p9ah0jD+|*c<3pEzzhTQ;AV}+@4EveDd?FZu7YAfXdS%9BKfYRIu2atTLdsmJ< zy)9IN>rh4xmDcjyNKh&jxilXk(pus{+VPc^5IH|_)}b^Xmy1Sgazp1xr8+lsvQ(;a zLw%)EnHzS~M#fMJ<%d%?Qn?Pmml$xpH}r>4HspqWluCVW=u4^8<%T|x3LTE)`TOZ$ z6~>{ZYtwZ8it;djg?X62XkOUe9rIU`hxseb!~B)$-DBZHXHK7 zZW3s-C?DD^$%i&e=`WYvPNspS(kO?trcn;rbCj1P>*zXSiS)Kg!oyIJk5O*6QC8b1 z%kweHviz_c0Hdt2QEruo;UeN$N&?)<0$e5nROUynkxEs5*U3~#X{VCRK^d7Mt=0LF zOsVkQ(migb>hI{Vt-TVw$e6cFpW6J$y;7;mk31%o`g~81a;mirYUczviPOnXMwUyL zhI}#SiRkedO7Ey7Gv@*`=K?e5g0Q>0nR9`ebAg#N|CvEJTnOH`nESm!InW$z`Bkos#vG$RR6lL8M+3(k#|ACt zXyb}G+PGqlHnEsP;-EH8%%Sm}eXd3fa+oUyNk)HqtnN9A{%rS=O7rY*T6!bRL-q8% z#30+GLNQ24r9Dy7np8Cs>4tWcR$5RAOyhW*!nGZ=AmlVGIt4jqvMBa1LR z2}a(jM+*ldeRtsl2P4n^q#q<0dCxV5{{_KF5oP-ZA5M>o1|#(vjGS4kQn&e3OA1D^ zl4-p_o(`U-%X_ORPdj+N00zb2P5n1RFcrwTJAF#c?}(I;-7w_ z|GfE$zIHSpe4l5Zu~|8TO05J1S2cIb+P^^O~i*nnH&L8oA3JP$lh zFybcJe=yRSV%9oBMKA(0nfkpBZxB`z?|}v*Zh(CUBQ-xNtNvJ;C>Xi0J&jUByC#DX zHwm;ECm0z@qkNN45sYAzt#>Nxk5L|QFyaQ-cQ6tq0S-Ts1ZX-K`SfR%4x;@BFHrH~dG-O-$4%80mqQ>rw6}7;$$ubB+^?w1k5?+x&3cV8q>9 z808k?)f@F{1h8JGpzU@^}b5j90rk z#KTX4g{D1g!GqJ#w{j-<{UpiO#-+@IW>I`gaF< z!yeEZ6j}ne4GJyUE7XO}YkRPHZ4Wm3y{GqB&R?xoHve3sb7Bgp;emhMh4dw(S}m;U zSIM$8U$t7;Q)ri^`Kr|-0$qomrCGBVgq^=Qnx%=m7eo}=(4Tn>XPDC0D!1Ai@-l1x zLO@6FVVYf9YuTj=%P!F?y=Ir_m42`6QXl3ZL0t74%2I;33oy+R#ND(BEgZzvzJm`O z#EpGhKlJ5{QavFda4X9GpJb8NTNa646#se_X=7I7EK=(G9?!3xNE8j+mS#y7Y1fM? z>B}!^NrBsO)X5#V?fu5LXBNo~($pd=FYlWwmCNXL;1*20m$}6W+}tGl58O%t{)aJ% zAGo=@W2KB2xRsJBvpbV2HE>&+C4pPjD>|sV*JE&d2X5Q!#ktmAocGKkxdEWYI(u>6 zo<$G8WRa>#fR|Z-rUSRM*HnVHQSLKvn_ZPjW>RlvvS${_4FEG~Ff-ZBW+GXn!nc&wmnbQ4O9;~_;{VNNxa(vM?K&>G|3GFmM)W3<=||TyB6sv&FK%giJbkHz0BD^<8t=T#GJjv8|5)) zFENLGE`;-6?sERi8$17%4=VS*?~(Ig`QLQ@%t4%gt7Xbkod0};I^z6aDMt%C|IW|i z13Ul6S3*p7{(}kWe}VI_Br$&OMxr!w{wI{Gq`pVABZwVxV8OQlYX_RvbwXyT}u2R--qC8;d?*`bn^Did> zHnIRsJO8(yQ%R0{9?IC)pOBWJ!@>&f=q0DNU+4eIYVG{o3tG-&qDIcYJz6e9xgY26 z?r!EB$NB#bz7Eo2fD-oouhZYq^hN&(`2I4y z=syA9Uz*iHeE$>h{fn~nk3{yF5(AQR_y>G_QI@>uA77x{qFczN&@H$KJ7ly?IUH`eHdAM{G|(&mH7Deh;YQm zH@g!p?BlPy2OrqSf3;9Q$P0cEA;HI&{*PYpH`@z7{f%@kq0@GgzpzbYYgXeI{8sOJ zJRkHSQPjt;)ffERZ&XQ#&C!y4d|T?|_VIf=r#)Zr-5^alCwajidy{h6iIRMLCUcA9 zNhV zNQXD27&_nkFEe|;`tJFH?*?en`^gJ_3oJtuP?C@Tibom8$Gb_O%{V^3nnpQ+h5{dt zQU2|29bGFdi%t0Wh4z9^dkOb`!FK~-lqL3pzsPyP_fW*m@zOqgeDe~OWD?4KzTkg> z4jb=N0{#Q*etrCJ_iN|x9?)_kdA!Cx{t~p@j&eUf-re2IIgXD%0ZwT;%J@Fs-CG#! z)5mx8{*9gdL+a#5!O5GmZ(t|i=>&7~4~dg^cB?-mKAv`tX)gaEaq+%l-aGs+-XngG zf_lcN>I{6?Tms#BvVq>?iX857MGp74A_x0iqLIP_K(Bs>B88IwMx?;V5-GeeT?ZnO zLNBOFB892xXyHiV_1XBqk;26p`avRv+IPr!bVKR?%Sd6&X4-;3fJA8&Dg1PuN?Lin zmJ}(Raw07zu00&_BLz3eJ|l&H-=JJZjs>@1;-kzhPNd)_*?*+)5WsgElla*HcXvFR z@gjvHQsq2WWur)8?RXv3t-Nm1e@$cq;ztT@fPF^_l_bEwS%9V^g%Oigg0(3387W*l zMLTwYjnkh3HVmZs_$%1}H*KRxAvjfmpPB|;96+RSA!r=h_>qFUyDhD8BLy4qKWyO9 z#GZp3Lu@iqaFgsmQmCg{T1u#mBZb5ns*=qpo5%*lj}+Vh`;HW5%u-g>C@E5CeG-i_ zPNd)_fi~kr3Z1vmuT2qZ<4EBttbmzV77sX5a0Bc+QW#1Ce82)UoefCKQYE~Na-WgH zh1uG%UyhcClC#=xq;P$%cD^!C%e$DUQ8r*Tdi;cPKaqmFyP0#GNZ~>7eh+2*NWtA( z7{rMbF5$oX&sV4Z)DRt|Irj>7>Z{K%r#|21)aS>Xy6kG0?>KdN-9PnoMeF=FEtU)Z z8%~^&#fgu)L|KUw-*gQ=@ClJtSKtFX@u^qi13U2_uhI|V#QPG`{{kmoPGbD)G!mte z6TjySmGt^EwInC*qfQ6r#N8nKbmFOJDVIM{((C?s<`&0^yGi!%#D|=%OddwLpVxhN zcRV%moOms%^1Q*M%0^E7nsb$Juk)bF1AX0h1MJ(0w|a*bP8OhPC;rC;D#0}uYPnA* z9=J$5R1VdWocQfSXg>am6L-@#a^f!n_#y*704H95u?pkR#&_cG?zZa1b>cSQ^YC!f z>wY~CTn({FC+;TMzY`z)j>nUBI?a-v3c-u;lFM{>voD9v5A=244X|$~o{VKE9VI#O zcS)XjPTWlbZN_opsWi%~{zjwJQz01TMZ03naPo{SPCn^)9hf-zY=kQEroN^>TG+|AI|(1y$v-$y zKZui$64L(yC+~U7<9YgQ5~Y!o9}-bX59y{QIr*>7qIKYa-qhV7`*iZb?#g8eN^iryf8sAx{0wc4%Rz{^(Ko zz)rneP(O%MuO_7b1x|hFCXeT)i%FD5PW_EUm9!*DOLFRKFQVuEfSkG;WS>s`@#e~< zUkh*xCZ>=`@tnGwWdBY*1K^vDNqnd7?vAG@o>PyKDg#4Fm5rSG!h>~C*S5sq4)o34 z4X|&gUQPmBzydVw)Q@ka5-dcyPp3YxwRYUq79!^-o_Pt)$6s;kZrVmp{U-q5WWWdD z)VqSlp^fj<-Q8^!jO)~Gzy)}?>CJr!4?K=jca!Yjsn^mh^}Lj3sgYCv!9JaO&q}^3>-7XV3F)uA(&IT!u0newVS|tAau3?Z zgnoQ(P%c6HcLJ^Fo?ddt+nZXyo{u6{%RPU+Ht{`tZ^>nTy>8-*zTQsYn*)1|;1~IK z5;hRNo-^F6bvb9aC4q7%p5q7b3C4Me$1h^K8A-?YWUTdx#}DGqMGLQ?oqYPxSi@eBtn?(!KvK zX7_mlb@BASnX?z$w4Tbeb=v1Cu79odPQTE_dfzJB4}PJrWP1Yrfz;Fg(-!poj)YIS z&KH7vzmxAz@I=ZgCQSCEzb8($OdKp%wk=&?M&PIgu|hQSfd_G4SqE z2Y9cf7h3fl^YrV#OYXzePkcAXb~2g( z!yJ@U%T=C@o-24vOB1}TBLASP$gFq-WX4h3via})H!!C@UP z;V^V=f?oND)4g*=7GLoN?ZudHPI!q3X=h6NLpTz?MGS)v`yQ0Um%;`Zwxc(T?R27Y z|Elabo-dC{G2mw6UNYCXPZaKSPt#b9nkObylGf-}t+5(4PZV+Joa}0OK)1jtZB64^%H74_8tD`HU4J} z|MLw0^BDaTx|jZ;qp?#$w@amRY^Xpg^;1IWQmLB~8ZVXFDJk2ja@`Uao8JSWjLrzA&IyLNO8=0eBCPo%WrF3fKKB?4>jXW-uvZ;~fQi)EB{8K9BQzQS9O2yR37O89- z8~Ic!bz>ttq_TZ%vm^pHx;)W``^sht`bB9*$S zkqf0#KQ%H;Dh*R3H%MjY*hs2W%ExudrAopURb-dB^x>$r`l0)ZE zZ;d9J7o8x>n7*^$JDmu@bsn+?3>9%ZoA8v(it5ml)fbJob?-8MyH+1_Lnm$2k=I!X#0|^~T z9o<%&Za12Fr=hQn+54>D%zHY_yT&o^=`iojj(JZP^Iiy$4JhZcvSHrS)x53A3*A1$ zU0~icE;es#8ffZ=dGokDJ-(&6u*v+#YMp}UwFFWxlT<%FvRf)!$3>Dt{CL)m>v|Yf zo(7uHM3SX-+qg(4snm^&^pwiZaotDK^Zp<7ANwq(`DOnz*U;q6m8GtJTqsj24bwx@ zq_TZnk7BN%dvBC~Cz{AT(j%Jc>G~Me`lD$K%E)4AE=;9|mpLaqrySEzdaM0C#yFgJ z8|R`_aBfh}hobvHl+B3-oJ+v@bTmyt3C^X=nOE*f&nxFS6&Uju{y&+suH4b_ST@R1 z#kB83?`k#ecetl68*|5Fusw!tt_l{}Xh-pj^R%>dIX~g7V6}8%+Zs2u!<@ z1l5)MYBV^KI;LGT9xM0!@zgh;?CAyc?FMV{e(4WAEi2}t@u5ehQk5DikxI$<(0r*Z z9N*&ws%!-9Zj__h(q57t)gQlq+?szFIOv5FA zMQOO?uOyAdyqb7D3FI$cQ(=A^OG1nmAR!sOGHc2Xuj0r~HC~n%YdsjP-r<4KWMf!fR@w4WIYXA0@T#dWA=^+g#OeOVtnW)snpI0eJz!Z<9i%L{4WK`jVM>K zh^?rB?$4g#>Cu5|*7OXzyvJQa(xsk8(T8f*WQ-$yrMZDeLH|jVKcY&NIQMlez1e{p z5*$%}Q97dh&EpZ}7p5c1kEVy+w21Pz>ttGM`oDnuo3AG$tFNfB$t+2i$-E766zOFC zNnr;jbE{2eX?h=S#bnm%WIheLI+Pz1AttjdT_<*@Ok`%7h4Kk_6l!M5qwpVq^n%hKqS4|} zsGq5if;Ejtmv!7lAB6@Q7e5Nt^f0>MQHajs$?dU{d`y>3s`_>BXnE~a0$C-_XXAv( zi&Ckc5P4lHTXouu=HzNj+bw||lbva+uxTrtC5C<(ICS19?r0tN)M;C5(^fRA54U34 zDs|dsgKjy>QX<5(mCRB@e-2GQqQtb7^6+E@YYPb-Nu6n{vT0jS(q3 zg3`Mn@M(Q>DsY~GrbQ^hxtcgjgumi#<=hFg?|meI2)}*; zBK(?Ji14>hK!jg6K_dM1pxudbFk6mB__f5IBYbNzctrShGC#areh$9BZH6V42k`Lk zG%KoCD{6xtLpO>QB~k_hR@7it)G(_Lx5A2cs}=PJT`I~iSxOCRq8VyMv(U60C9J40 z!>s6SG&oW^Ry21amdhxuDW0x1^pseRW%0W@q{#d7=oDpi{emj5Y|(G~TkDt7TEe_& zPB>FM;63f~tzZAlY)UN{k1;+hO(iHjy8OI)3SEOAu^vc#1cVK-Z3i8oI{mbf+p zS>mM=ktMFnK$f_2HnPO^8ORbhWFSjiJ`q{sRTGgVu9%1{@!E;V5=UnvOI$b`S>mGE z$P$;#MwYmAHnPNJvymk(pN%YW#cX7WD<>jLynCW#i3j?0jwDO`#Me4;5?#mCnC(Ko85<7@!V8TlrZCQ(0zikBN5`csh_RS%{DZ3h9G!u z8fLR4zerE_5HvWFI?qjwJvW=_xe=$i0(~8QIZm@E6Has6L^#dDOgPQjiEx_HOmUi9 z0Fnr$zr#Xn8m%N#ou)ONjxIlQ7j>GYnd&sHDH~njG|Mvi5tS);5G~Jsj461~{~b@R z#w~R=1?8DC1sl=3T&Lh=?x|C--KL--vk$jo3hH$V>OprjxI99Hn1V_YmEXtuplLEn zOhFZkDpN2Y4UVMF6g1cr?4&7>Eb$ujHKQIze;Y%VxF!=>;<9XHiA%F3OI!t-gFaJD z{6Y~Evc%Py$Pz~_Tg6OcHty3@9#j@9bA5=mjg3z=(abSCZaU+c656i8XQR- z-7cC0w@^YMnV9!)=xbw+Wr>TjVBU)-nR#cyyh|sUd1r}vcZ9-*qFlkshIwbHd0W%% z=(2^oz`V26yshaKQ@>`3%lJ}B%@W&W9{ZI}!4vdEBTHPKg)DK|BxH$~PLeF~02qML zAWK|630dM*laM8@oFp;NT=f4QrT1n3777axZLOVzXp8Rh)huzvB#E}}K=k9o26rDNB4YxnFRuGR}1EkaAwHobN;TS5WpL8gQ-w z=Z$Fk86`N^GG~rhF-xBfs$}*~HSDR_q zXZ7J$nD%Bh?Xy95Bgz^UR3n}S5>(PSXnGkXOgoxw%f{zua3pn1d#jmt4VyM+iO;}j zmfNVDEOFf=#E|ss9-1ZIHVH9g?IejIuLRA_DCe@JX$)DEtudrE89ZXh5|&l7#E+Vp z!v9`KPbjj)+b2nu_|7_2P zBTLLb(8m8sl>Y^uao900l*C<8=@$*jX< z&PLNpl$gwVXEHaV!I9LN%vCm-s{WKAtGb%^pysV7Y?XNf1HWy!CY zf`UM=0#dAIiRt&}hDzpl{bXc`%kz*WF3StMX^|z~I$5&B)_Rj6J6Yl?o7l=cc}nkx z44yY72>2u4nb?gsu~m6}xD^vytrPnq=o(OdM1+{wYEl3P0l%YZAcVlg@=xUHQ#u?C zj+D;C*4V^urisO);Qfzk>FC|iRy5H3Mv_)vc!QRcGcMBpj&|QP$GoJ z3iDNCccEz$N@%QzbgLSxM}s4&qp_W)v3h$HuEl5^eL0UpSw0?x=oCB(rTKUicH5&+ zk}r?KT!1`>ay<*Jk3u>93LbBZvZf!<9(rCH*q(UR=d ze8(*}5r}4qOQs-8yl4ut#AQ>&9U0Ar-!W~s1lrDVrfu#NxTC6kG4zkXVT?}OS8O^u zZG}_dj;izfa4V*5{uFUXUZ9_Zasv@!+UVB<#n1<%DHkQCt=5^g2aOh`*O|73Q{aw@ zrjVKQ9+QLr(9ujr>Af{@2aig##EYlky`?T6Zx5wY;s-3OwaN;G(Tpr0$0_m)o%T!L~OTaHHfrNo}I#MWf+i15pZ zy+@YIez3Y@kZtoiS>j5wqVfW`R#c@{bR+0ipgf3E zANp%f#ct^6z_=en9fHb+LshN{hmHj)i#j@U9Rk0He?Ib!;KM@bQX z1f(I>$SGpyM;|+S-yco8jXUU`=B;-fOPF+9ZJF9c3GZn>>tHW_%cz6wX$};Zl^5uy z=8m$dIZ#|mU&!web(CGrf#MSSLVn4+lWbcK6fdMNrdos{_UL^c`=o4)F%-K=JnH3v8G5)sjCC6xY#L*k*mTZL_}Gwpm{-3H0DkF1ARZ z2a1d6_dI!@b)a}Y)p({UxZO`>^+jBkK_FNCQJ=eo+&-HNIb3I(L z>139K$eXSM#oHEUY6OCQhBP6^C6fY&U zV%zly#21Al!fs-TF9OBuD+oFIo%jgA70kVU2(q6}Uq zG1)@y%C3r@0P2dJ*CYCHv#c_K;);p_aaNl_c?cM#6Dgck`3PNS+M?-VlyFuRBj_oY zg(ejZj<8s00>zcYy;|g0Tfs{=2i%{cx1%;E%BUV8QAVJ6BavbE^#}xGI6}DfG zkT@d%t@lUSi&T#|qh^H08P=4BE*EnbjWcR#Y#e7;)060eIHQiorWvx0Xxa8FX5vBr z1-CgfQB7j$Ow{X4{D$tSIujkatIot`>Z&u*Frp7PV`|YLvgTwD_~&NS%q% zXu2OIW}`{_k{{=LI zephu|GoNU%2YaMs*J-t)hln>}(^6JZAo=w!|Iyw*?bcHA>$LE}+FwWWXTL$mtNi7+ zJ38L!=(u#GSo^Q&UaC5t!(CO!4UUe>M)u)m=y*4D+yM-(LU}Ebnzcj6BhgfX(yZOl z@oF?U!a6#hyV`UdU2WEWG)8PAk7e1bN5b0Y6B(?1B&@xVzJj%n6l=c_Fa;=&WVLHl zT{BXx-I`uNms7Y4tewWj)^1HdqKjEOk4^LJHmzfPy3lp{JAq&~_DIRIlRsHqAc=Nb z%U2gjrhPn&!KftDPK!5nm8da))=( zDDYki-c=y{5oKwNcL{j^hNiB-2Jcel%?bCgM-_XLS4-~~{s$H~roM`J>vB>yN=*Gy zbgx!ZpUPd;)GMf~E+^%q`fxK$eJ#n#XKFG)S&s4oB890}kgWW={VbY(KnYW?Bw2M~ zZv!D6VI5OnPuz7msT5P^tb00o*V@pKbq^F*Q*Ug}9wk9JE%Edf@6M)`odo9X+4Dg5 zEXv_G8m;=}v1*ZEcRVfgZK+=Vmm zf#Mn(i~L6VB(znbjHTYAqiuusDBGYtD(voV8?;B;2JO+dL3=a{${Vz=Yo<~>)Jn^L z+(lAw>OD}rb#;O6(0-ZjODU$Wu|s>bWRL?1O7Lf*mXv$Hr--ZqJG4h5gIqou8RW9j zVK)gf$d#id_kKJ8i&4({KdgOueAMOfe@GT>tF72-D^(GV_149+Dk}GV--jH5B!q-R zJWxc0RjI5t)s0eJ73!*}QKK#xaDf0@#kwf1t4-UrMqO=eqefj@tg%r2z2}+tJd0b~ z*Y}Sfe=wV!ndg~jW}f3SpJ!*#8Y9T585(;x)VJ9uBgknPjo#3Ps4n&%sLO6%;ezku zzoqhx`VQsv!S^5krW|S6^Q^uUicoQ3Yhp?-tg;%sGqoJmJTl=Gop_$?v8hn44 zqQnlSNc{t^q9Lj-I+Lo4%%tkVGfN9uC{}EyQ(ZF~JnJBBFrF8yex|C

+*@V#P%) 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 zht�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%0Dsi&hKz==#CfG=HLTK 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⪼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%0D6^|h0(SMb%A9+8u1KxLCJg#TEwM85r|mR_ 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%0AKQz)r2xLEJ{CgJdx}9oVOJI!KH~-AjPc=^#F> z(?L9;P6zfr8){Ffr_;gY5SAMiGvYs%by0@ATC+ zTZU};E#;cd!Qz$rXN7crqN^}!Ne-pSw!I3b)JZqn_wjoP!KaQ)4;j z{+6=yV9a?6v$sK&$auQ%XPxd?7AYMsgJ1WIH&MyUQY7>54w)ZnR;~2wbp@()8LlRe zqo%zXe3^b_Bv6Id-P@ddn%<^JUf88^PRF*jXf?0(IupfX`TRsq`7?V}I>6$&YZ5cp z!fWCU<*Q9orxerS`sE{9hj4l48!F zM?h~mYj(beFvKXQN?j{0bpXZqj}AjzDFV214D#mDuRw$ryoa)wwPX@uH0 zIDB}R?3-KI9%u=)+k)-Tn#Eu{L|d>Oe5(lCp){t4>%ex1T0Phfa}|N@;5Sel)wAlb z9SW@r+adfaU^`0vo;GMs!=Npf!%6o|hN<|=c{kXCsa18ftQUY~AcfRjtziZCnPnh_ zyg~^Xt6GaO4;C1ETXw91Qt=kV!&ecAuNO#kt5U%y9mUHWQ>y3 zF@26Gqbs(K>GMS(Mry2>KF5q0pwKuQ5F=rY*90+QT$c$kBIWgg7*TKtF=D0L5F@-* zh>_A6h%t26wS$h>g&;;m-B1uC`twdhjI;qZAjTmaZnY32ZUzQgrMtm_eVKiIgG0Cl zAvK|m`wpdv0f8%BrDPTP7f$aksqC?G`1U5g*8U{du2Gv&*FjVvyqm9F}jF3-K?L@IGf z0H{k8LlDeb;5iqAlG?O42jnfKas_8=>=#uzjY{Bp+dbUjZahVxTt5otl3=X%BDq{D z%KZlp+v&Z|R%q{M+~gQA`1cC$)lG+++)StkeTFvy-VyFL_3;X9Q-;k5&XCOr2Tgsv z0-NA6*^HQ$ZkV|-z}Irwj4<*IyaG3^di+U5i)fZXV()?1W>GYRnu+bw{Cg-xl2TL`b9!ftN7f=1w~n4f6X45V)uyaM!7h)B>_tO{O1 zd=LiaAm$gi8)j~L!6S!l2H))Rt=VEm3|?WJ^YIFdH7B8PjI~J)MqJ}GDXatwvqYg9 z%@S30p~=f-i9#l9C=D|=8OU5c&p?(;xnTjudHf^CD~Ly1TeF4JVB(e&3&w=fimI|i z!58I#Lds|WQdmq*=sSu9sVLTL;f_WkyA{wdb3@egd&bNSp$y+YrBQ~`nx;VQE#QAo ztF|8qhXq)ipedzO_4E+i3f7%chw23T_a)X%J(No1vL zDmN9}(tEgJg$Kk0v6IN*YO#|LEFAKjG z07KSh3|7J*H*;YP3}$FpS6bHy@gbWR%i zG}-y^W?fe%4JjK8BQyb^K`a0Uz8btG8h{iQq=EuK+Jpd16mLOf6s}oPCJnRFU>E_! zIXL{xyGthRu)YonqsT%MYA0UTXw6SFeV4(GK96h)Yhj{@#Manki7=A7Q4?x!J`XV- zvCadD9)eNorsQxE`H4D6o@Y|+Ql#uxvz(}NUa@eVj0KI(i7` zNy)_A=oJ1+qZNs&IaaITUF)gJUT2#$sLvBFk_8j0i8<$y*sOa{wLbNPkJJ*VntrTE9n5ty3^L1A4oE96)q(!glBFxN8#S-O6#I~xv<>!IMs z2n6vB@x7tZC&Xq5s7W6he1RpJh{aDU_(6C>r_b{OhM4tbKpD)lapFQ`oGS!yWbxDj zI0(NA0Ebe)2LT)-4@85YMT0Q1H;sCq6$$9jjm8qtfw!UUr*D9Scd&$>f8OTDr=eOv zC6RmkgJgV_ ztRsqpsB06&p(Zv&aaJE$!MH9HSwYI{gRG$7khKNtd)}vC6~&=+MieJ>*A>M<>_VbA zh`OOfanPT48d;%juOW(4UlgaFd=2rt?EZa?pnRxFrBn*0j>nuW8=&+9|GLhURey;z z!`!=}1Z6Ja9|*LFC`?tEPgyJTnY{?zG`W)VC~NB(n}kXcXyhrC6qJS#0>O$%rpszG z!x5_0D@-ZqDrr$OXVqq3^}xze+IcuOqLL~mI&n^v)h1SobCHzdT;zPB6enRR#o399 zics~kb$waASSdqYOsz_s7L&J9s+8u`+bT`C%y=HEg-Xt2(1>#y8gU+rWoMuPMX|aS zZmo(J)I>pJLW;DmIA^>++m>)r>(zavMW!suZ=m_6(^es)O6u3jX%(AbxaCtZ(u(p! zpqUNno+HEYXFq|vN$(I;U&IOJfYyr4OYz~M{bW?Qp;`He9~G@SG;qW}77eP=Qu9t* zTpH@_yB_jE%TkUY)Hv=b?<&pSM^T3u=|s}Qc$&~CENKg7DC z!NhUHDo~~aqQR^}{3AwM2u>pxWI4e@VnQ3tDh)^lBGb5U2$Rf9!&L>!^R$}?@lS7_ z3vsI)|Bo7L`B>8rU~@U;S0?cjR3?jK&;ZNe#3_%}*gD(pVDC=vRDl^@nml#JgMwH_OgxnQ$re>iwwG0E zM_6osWio66%0a78GB+3L<1vf@6{#lT-~IjZdkX+t45N$ZbhilW3U#_;gSaWv233?= z+RG>Bcbuw-)CUDEkqRrp>6~BSI`i?;ACBE43_YwA#$v$noO@#x6$Gb?@xmXDZShs` znLi}7N^+hsSlBlez;w+Q^n4Ny2r0s z9W{f5G19|8bE2mtAAj@Tk8d^bSD!ak2*Bv{ChUgG@}X(jCEeqxtc<84tzocFdCsR} zDp@?+nFvaL9864~RR_BQHi!;*5&FSl=sZ`10^`>wiseE<$_sTQgUf14mOBdS-ryd+ z;NIEF3Wom#%F>)QO$`OZ*H8AV!MPOohldD^JmkZ?`E@p4E?4mtvM$wAE_^j$S}oVW zyGbo^gu_S!ZFJTe6oVL#2=bt#I>Kxu;7~&ou~t8f;b;JGbmi?kx*Zgo)?Wcn-@ajO z`HMaz()Tb7!)J$%!thz2e`J4V015^Kb`Ik;3jJPDKK$;*+!`u`{r#EeEuk?1{caeQ zJPnYo0kXXWq3#CA1}dd@=&-1cqDPw0gA+-loNf@)<_(Z-c+el(Ph#JIloz*BM!S83 zZ>c`WR*!Eign`&djsl)h*62}f98~`<7MWMG;8V&8 ztUhR1*{O^WUvEi_get!5U>T!5XW7+8-25d;$q$ZkEsSA;eZ@WZIi?SeZ28hNB8 z36`sr0)sN5V1%vgJhCB~n4ZmLE6Aqy+UiBv0L#?ouR>@^$f)txO>8Sn;z*s%Gp7YTS z?lI@FCU>3SS^sS#;aPus1N0FY5dn~HS8sAlvqPhmKw#M3D2jpLwUN{y2rE>6#P3M*q=c8Js!ScJ zqpVSxQPKM67AmC`+<5AyG!lOL=P{_Z!-h7LCBotQZLd zUU#CAd+@eG{sihJp%n;Nojx9n+)}aQ{(!+;I2@wBzW=0fb;n(t>yx zTcau3I5l)1>XpU-hi(k8Ne+F!#%WTZWRqZF9n+{rbB$G9X!3G(Od}Jv2CZWnp3sIT z8X@jblW;X1Z6KL_8PRG)C4?Tt(B_PmQ&|IKVn-bFY+_MhX86dyFlp$avJIyg9e&15 z)v){KQ*nf)VYtTNG?anm#9WzBS}^ZI9n+ZAUW*9TP72NT9?A64M}!HkdJtm)SBSEF zv_fS68uEwtrD?H6VJsv+I)`DC}D8;6A&Wd2iw8nr!s?w2S`I46Rw{a z&@Z`z!=DuKS`HRn((K%gXF8L5ckkiBp_h#B8KcUG)BW7OBh)i?KVzM^5@19~#CNE- zm-ZC#yfi#;q)*$Y8XSIBz9>Wyk&Z;5&?Pi%=re{pj1md$4o($w8|q&}9*b!V1rUDa zeP82OKMwqAHfbXq5f};PsbKB=_a*=&XwE6d7S7?<;5jfl^#vt7Vj{WLR)&UUKRc>Q zV?i#T4o+&$9L^cRm$t>!d4wALiu6*4rEa^6()Yj?{N?Gl)a$t~krDG|k1eh5;e_A{ zB2>rep&$1pZZ~P3c5gW|LB{GgkM_saSUN~#)2|{)lQ-=J?r_GvvoD>XNDk}sM$}k8 z5{+1ij%H4R?FXqYl-0dKs!%}p36%PnW>u;WBLR%-5x{NQqc-VoIrm1;uhJw6qhyXp zh?~1;+L6HRyYzp$8(KwlF~DfdqEX+viYBE@lWbnDnkGFgEMn8%BB>_Cj6Aj4207tf z>!I)M($?EMwjrcRn%Z$$7{G{0t3{>K=~=_5Mup5DnfxTy5@qI*vFk7_ zZRpc^z@7o93+FnhtPyf`VpK1xo#m0N>bIcKn%156o%^lk&5sWYT~-5^mnctTHW2Ac z1WR?=h1-w%a+=a!E~{L=QXRu6GHQmGlFLU)fUYy`y`ApY6B9CHQiN*7Z}>&Bp7$n? zGEXo+9T*kYdlvG&aB}xZ#%*baBpDSUW}Ocj`uB65m+yydKOf6HR=uet{>xF4iUO}=-@ zc^{;qJ+KEjYku{{hrd?{Zm&QxI>ctL5!*Gm`l8S_ZU#|k`@IN$gIvoDz2FZVI&eLN zn_j z?=d7tn(z_{w^ll`e{hHhb(9Ko0m_$fio8oU|K zrSWDU*$uq8fj0vsG5nUYG^=_7vGNRtOpEY_#G4QAJK8T_C3W$oqrG&sq(>fuG23o@ zxKX@WU%_c;s?T8-$V{0nFXgvxz*5|i8ya(_5oln}2YZRPnZ{ya%$Zh0&C4PJs;{6S zBn_x5bl<%2G(K1ZPuD@JaTp6y4Tm7r1cS{(sxc!5Z#K^Bj8vl=I=sh|dA38h;o!)~-23Dl1?PdZLh&ms-Ml``z;4Pahs1CX?VLJhj5*4jo{X@O` z4s0Lp-#65Iz<#K%HRld`Sk$JWfJK1@#N)7E9B4qA5NLpVA)oG7$(q<@^_hw?Fm> z^1)}+y;5iBBpf)-g@cj;Bmcm@BT`Z5M)(UaWqOB4_G$3P__nt{hNOu0G1Eu34;;Wl zEHoiXn58Zr@XzxLs8mA}FtkVLp^~cCPLSxv2@2gffw8i)j{QHZD~sa|g@zn&h`}=1 z4{6AK2OtdzK7%1GDQRp#qux+WJaUF^gwtBx4$EH|W_YB811}ujK0I*v!1e>Z`wyWs z468Jqu@D+Lq!RabVXHMkneBAT-F~F+xGO&W}#yCb{g&Js58@*TvW}w1uZkT~aV6|Wdd~f*nUKkuC-U)b~f4+(VKmV!c z!G*GbK6--@SJ`|}4!$=OgH^Cxee|^c7uHA5u|^*~Jj>EYPYp9fFfF!a!VDT(VC+Kk z&IuP>1aqJmS)YScu!bv8WsN?1GER`! zruP_88kEi=Rm5FaGd)r+q?sO3HLSNK2OU07swlj;L~= zdWycU5-O?BN!q%LSv8zN)-xM(UA`W6;wEpYvJWh#&A@ zs1hrw6qNZV6FJ2b4^?#?l+I#WffqIw$M)i{OI&rXO46?p{Zt#l6Le9vj0Lnx5Mzq4 zc{34=GJ+oE=P}2^<+o5pNUPZ-hn1`_=#KlqG|W%RG%u8|9VIKHP|i&`i6-~Xj*q+R zI<_TLQh30yXdY-$326H(&lW9aFsrw)COM))t!fX$0A-*BRlT>kb5uqw8z7 z)8O*CenO}XE+7Bcb_m$ULwI(3-@vin15xaC=;(f&HJQPKy+?rBTq`gqU>ryZ4aVV~ zrb$e=7Qx&QyC~*{_$4tnqzN%MxEI3Q5CyQu2%1JQw}?759t%*5ID-wbNX__BbNMU; ztWm!V$cAf>fzr?c%eM-^nvCCkU`-?#IJ6GNW`H%^P#dg0@^P>#HJO|$$VThy-K;n5 zItY%^)44(4Y&QWSiwlu1fxb~;H#ho5Bd}WN8@BW+`UcNxpl?|1%SGSl!&n%7<5+{f z!K2YP4URRKeDu2nPS|uWy(D0WLiCN4&;hm?IE*)0M8O-nk!&IK4N(SiYcToXz+0X; zDt(Z3#8D9}=$kmIIJHlcMS-CNYQ#fZq(R&;A)yLGVBB&NY z-;i=4^bJw<&^LO6gho0lwmPOesRKY|ZT$}p0Uo|)7(4_*OE<2*zNh~sR%ogoJ3)4wkmF`|GZ zkLoB9Z6j%{<8#hOK1hXouTbipp3~NnKbhz9nspdOtM#60$&Z%v6Zy&NKgxna5DJ$U zNsfTElu2MXxRO+?NXuP9q;txfEa&t5-$ed&^)Gu)hjpBuNsfW3svS7sSU+J)j_XVF z2@=w}-cbCmeE!S-5(%jWBneTYJJkAL1T2YAtBV^bk;j=`Pp~W}ekYgiDVEk%dw`?G zlJQSFZFl8I^RG>%so=HME;du=Hk{7oDf|{I+-W1}P4peVihtKhQunqKl-6#>0Q|tp zcH)o2zb^ka^Y2>zmDu;OTS;5hcNmTmq)ptW3>F;aO3^-)D$S6dz7NuG2zuXl7@-p* z3(l51cjc2O{W$k@L*6}3Z9$XP1Eg{uZ%XIMY{asMY6HnRHhHjg5!2ejJuh50QqU_dg#M5ynG-N-*vcR`q1DD zY(oOnQs(f1M}=sxDB}7MBdD@^Y<%dU#l{EUDzNdrJ0Zq8xFUuQm;8lz_W)B^yn7fL z3@ieWNze>&%Mw{GA0MS21a_wdM&EmUd^8O2W{9!&k>EOjj>Mm0Ku6n6x1<$;j>7nI zc;EgZX1%5IZZgS28iAV`bR;~@F!j+`$fbK=5X`>Vc!=Z0#M0vU5wZMX6Idb3A4<4N zmOt7#4ax}2&;}jh4Wp238KC3UvHVeE8!UgT&+>UxjUfI-heiZ%DQiWZ@og?iC0G5Zg~oS32EW+X$U-JO(8Cyc{GP<0VnOCd&H(QskB2 z?>zMW|DfUkH0;y@T~In#5wg<^cqmP>kZ?0rlveGXI|4uJ18r;Hs5<@0eqRcA+ShxU zFOQugKxZCma&J+Yw2J3*a|HC{voN(;s2qbifrLd|oP1@x_WK2JNCsr^oQ$82B=f8fcj?xQSXb zC(A_*DJe^}dhVU4z|o1p4@)Se{qeAnbb5SVIaB}&BjlKiC%=?>$SU&}54bC;R4!e@W4klZ_Ey!|O!Ihai<|BP4gc_FdaJ>w0ypWoxg z&Zu1aaxzh#Q?bjOn6YRYXBW_3Tw8rbC)FlnGMC)~j7j(ul}}(ZSWnMMA>Qw}x9<_& zK1uUy?(uW#>lAs^y(L4Fo>S=pspJwEF5{&E2zG5qW>wp)^CW@g!oTM{!Z5M($OpLO zo!&3Q7RTSIY#>N0%??BGJSvuJd_oB$AreR#oWg0B`Y4q3-Z}1JS_Hf(HeywM-T71t z1bflK6PE*(Dw2H?nSK~3k>PjZgyK5hFz4IjsVyn@!)>aIy|9CvO)(Vs6}%ugYkmp8 zO-=vp_V?qrsfj%J?;4d^F`FD9tO#VcW=*ztXc$KRL{Kw|Oki`SXN({GtZYIb-08Sz zM=z*3XU&Hofw3AbW8vEUJBJ64#KX2-B?eh5r%Xp|w42v3W>(8s1=(sV0b3F*U3wVm z@%f2ijWzpsKJ(L`2`5#^3CyRVG60Ym+)QI7^zbG0o+bH;xGJNcpex%!-e@_`5GbL1 z483e;c}|psjM4(5!Yisd3%8~LriYLd?Wh4~ki9X`ILwN8u6=K;0M$ zqTXmoY0cX6gJ}nr3M8RN~?e zh)ZPE-sFxT*CXLqyz_Hh799F4Wmm;Ldcs|Q=E>Yx-rd-Cr93v8GZazrYv}fTp{)Ka&JW49q+-i63yNfI8^ZHM#T=umIl_&|h ze@wBKY7c@5x171Ch&+^*=KRq&I1dq4o0W{2xX)YRe=harM~Th3<_K5-#iDB?M}%l(a)GwvN7?whFX4`1$Z*LS#EJ05rMYR#$*S$?IK0jxj}X>>Gu zI*W;$IDdM=y~Vk&DV2Dgm?9kakX}HZd)FB}Q|FP+$2Dq`+C1qOWq>t3{kqy(b{^Z{ zC#-+%kc6UJlH>MBIj21LflHJ-wF6fY_qH~(G>R{&k8)pWmC_YN{W7jh-N_vas?VQ@ zoh(d!BZt{ibCs8z%|E6|P%Oi(S+&Leg;(5LJDzr99ho^S$uSuQNZ^s3-9VQ7u zheP@)H9j(y^V3+n{S{hMO-Xz(BWe#ta}WBw>_|?MkYB~=gQ{>8KA_jcfnP_RAUU6c z>XeU4dcJU25KV|78dcl?zVaI040`)-M#=LdDPXr%H)sD0ronvL*-58&1FeD5B>lq5 zqPUOc&QGbXNxGwFvnqcK;&J%bvjdyL+=S{S>tO;rpHok%&fgtTTMNOL zkWii0mqH}rSr#uZA)a)1SDX82tLnlU?sAJ*!9U*NZtQS3(A1)_xm+>(8X5+%u};<1 zqxvU;Ij)UMpb>1Qucz4~{*h)Z*NO7ftgrgrfiv#iXOJ;l_Ei@Z#Eq|Jr4jp9O;7%q z6X32{uP0|KcH@zsMq+^u%G}bbcBfx%bHB4jy4aa@Kf(RO%G=Ny_V9GIU3I!NSyr7> zv#P)6b?P6Iy8QEBIny5RyXv%>n6R2wQ$(6aMGau|&H|C3Qi_*ln4UW0{)aWP>F|hN zK%sg>RXm%0y{0yN^gN*0L$V{qMC!M`m~0Q=4B+GjWxV6b_HzG-0(+F^5Xs;J3HlSi zt>fKwYTCHf*OKiOd~Ndo!j7O2JPAvaBNd#Xz=`52pRBIfmx?2Q`P<)g2h~n6zO<{( z<4{@c9#=cJ0SnTqt25p)u7!_IgGv9{&83=+$dDs}NqO1Q);S9#-oymtoPUz(I#6CnigC z#o6<-7ta=gVhUq%(AiEc5Eb4?A(KwWzM4@9FvuZMC+ei1Cv%nT>!2R2-$I4YK#yS} znPP7w**;Ur7R;%B52gZMHFG{V7I9kT>?qUr&!d2SYjSJ?J9ak6X1`1A<}=R$!NKuD zM0jrO62>HwYkUHS)3xNf@0xNgr-j_Fli#R(gRrkn=Sd>>E;+8QP|t{%XcnZ;%c&3c zzZw97IW|%VUJFLuLucH(GVUjFAl%yV2|7ag(`?U;exqk<;`NCs{Nn*R<6TaCmR*;; z-}=RQLHzlg@!p!atV)R~brB1bJ|+Sae^33Ln^YIvk6v;={)*ex+KvUTHt}yH~U>jX@cfqyGzPg9#35E|hAYgEZ=;})>BIFJ)TjUvh;YDbDk{Au0;5u|D zb66)n&brKz5_MRZ2;KXJhkIGW6x(6x_cf z7io&4g~qD|(_VXbM&ah}jKq?};B3_ZgRN0{2YO%d30tBicevLqt^)+(QIKX`Cuf>q z3vz@bMV`z)0nEtlA35N&c7F0?by;+Qf95Ot^(oO*NGqX{E_lKCxEjYj3~v^=vlk~+ zyg(R!)92`i&S%F{uXrQv(DQ(}(e?nm+N!hrGX6*rFwp^SVtS$45*z7kpZy*`@o2z) z_nlOXhi9ter`%gw+s}fENhI6lkw?LP5~t;%Ca$`=-{Mf$;{(NcbiJ2%5-k)8!a-yHiZ^FPhn-7&;@dU=^&jJwh++aY z%~8{yvmMv;?pdcZ28w%KM_E54(94DM3VzmlsdgR?AvKhQ`JjiGN896aE+JtvRrx-o zzBDTjR1&4AB;XDywHJgd+zuDy@-v&sB854UgGvkw!(}n4c6~?dV%SMhs6yR?P^q7a zcj;#>KNh`@fdcOSEkv>0;&st)r(_8WI^lh;yK{$bDVecSGkmD?WzG&hKT~23c)ARZ zm_F0F*-Xt`OJ^bzk|-O?Ot?nJWPNv&7+a0spLGIYXX4f*P%#z~OBh;jo}jyuoZ3Hpi_(G=Y# zs3t7vuI^F(qjG2mmNBrhZq8}Ka2}jO%Ml}wQE5ZMN9O_&)tFBK_(f4sNZQqw#(0MgL!T(quxgrZ6cd;C*z(U&P z>{>V;MXC5CKC7Ox#_MR3aCN6&6wzLmXEk1XatBB7Si72Wvu#gr!(Fp|b_5sZ9=vtq zKT2yEPrnX`WQSz!RufModb^$ShhMC|=wezo`gl3oOL87$tm^8VX ztkbMWyiy1IzE?dpR3Guzs;@Tq}V!X&Ey`Q<*;cl&stRU zR&fOz+}7BubUo7{(;oE3s9B&gZ($Mmv>|sV(SlZ*FQ^FWLf9>@*58;Kz{Hymz9U@R5;fww@L_%6?ij6QrMM5Rdty z6~Gf_Khq&9@=OPRNUMkLDy@znvwko;)mJ=JXusmYOAlg9W^1>+;^~IL0<3-_MuFk` z8{J3@M>d65-{O!h@)pO%gzs+h78ecEZ*df8J-$&5mKT-GdyAv~Ek|9nd5c5(@GTB& zOGY_-i=$4MS8R?ow+ndc-!8xbhX#h%1b9O?@0>cXrlkXHIJ2)d2o#fTNRH97GXhTh}OCt3(z+=N4-TV-Y;e>Ubj+c)B!VlR;~ zn<;CjnpK@;^<_hz(OJT@Y%>c}Hha6rpfHO<1=7J`@w$^}0oVsZ(}%2J3ja?Eji)J3 zA+eDV3dLCb6Xc&Nbc13|;d)TUuip)l&^&Rd6kapZD2xv#$-Ex!<~^R@kM`p!h+{ym zqns4Mf8r;i*I|lwEjibEVr0u>`BLOlQC{Qx(RO`2Z~Rn{4OgnCT|Lg4HCDDV zL=smfz<~+EU1kX@w2V(totKX(jjxczL+nZy1Hn}D;X1-r(3g&pEaaEtJsz*E-l1a`ai-U@` z?hrM!NhU)f@zG{Ofe5fjCio1=gy~);$wWtC1pZryWJ2kyM>5sH+?JwskVP|8QRc;{ z9>imeLyDHiyAB0}4y_Iagu$*-K&afNfZz=&Ang_kNE!+1ryd1_5*MI=kS#(1aWV5K zplFz;fGE%+d8h`0@U6c9#s5ekT74Fv>GeF_NMmQ4Y{8cbdUXet2uO9L=P;5Z1f%1^=B z$p@EQ&bhqJAP2=G!|c1gbHnK{ZfaNtLBU2m{u^$;pkJ&^=4Uns|WL-iO$4(P@}-9t1=S&9le= zatQzJr2?Qt!(>lp1CR`oJ)l5z4D?@w5+lluK+&)kfO2UtV1wA0p2bkj5DbMuD*+7# zL;?^>$j4*>EH-FWKMh$C@C6!4t%8+z&??f;K7enjG6FER&PQVb(xnXTB4i-VkLb;4 z_J}@gmPhM803uAUF+HO`#>IgS>ue8n(V!~9#{yb}qaYx`e@}Pdc96~!~L&8ZQd8kK}{Ss72Y*XRCsvi4i7 z6<&5Nm@xO=HcWX^bEseO@cPf>lWu96Fi)t!*sFY+9HLhs=0UkZ@bh}aOsZr*;s{v< ziOnrtQ=5^ zP&E-xEdYg$Z;2E&P||fKaSpr?5;)k|!$(eo0a)k|oP6K{VxWyaf(cQwx&#h#SeOu< z33Y%EfW_AF_7OzEM<~Als@7TL ze3T!1KN8DxuFesT?_n?s@v{<-GEu7YDJEe!GY}~KyaR$pU?8U31cBn`DdAis4NwH! zB-7Mo`oD@j`ZfZfvI_rC0jVmed{Omuo9CxJ%<+iV#2QDRm+WjWNNv!~B+p9`M+MAb zQZALvu9j|)GHDE8r#j0}PY%z-l&BM7XbjFlBCmCxV>r@?1!VB({=oxm z*N=RLb18b9+j}VQVzqA?SRvNYjzslw4BA#BM>_%*W@B3BUM-vF$~b(uVGx$mCRV2)~l;ZZ`!AzDRxNmW^tj_w-*o0|@{xsYs*rh0r#;gL;?GGuD9*_GZ}_Y-vc zU*m3RlDBVq&309r=a(ut((pEsO6&VDKPNc%toKrnD7nKxgxDVq@+DkjAzP9wwCDWx zw@OLI&z-N*=Iha|$nEpK$DTf~oeXFnd1WfqqVQ0l&g9 z%A7m;BqG&>>2Z2;AZU8rceb_Ai-h+4BS7$A^#+t)P#bWjY|^b}xL@v*ctj|7)72PR z%Bo!GHWdeuVIP}ArJBR)={va@JH0uup|DeIx-k9$-I<+F!p3nSI0-HY72nGVc({cB zSDqCh;IXOQieiQ)iOS8Cix2+9m6F_ac)<@a_ zHVz!DiB8-bWn`x{UpkI!Ihhr~@{mdwpL6ee&rdzwuzRaISc#OR7N0Lhg$^_WDy;1Yg) z$iW54wq;Oulw?7kpA`c@S3x%}UDqO#{D*KFGA%gVn|YD>bOG!~?%hO;nK(I$1v=0MhQb?wWvP$4AqAfvdq^jMqfhab-`i?snT{0YAH>O zhmFH%Zz!D(e@Iw`?kZu0AVa*NjmBw0H5~_U^*M-WSzO}}YO!{B!{;FFmggXvmk6DN zQbJS)Lle3YZXq<5Z&7Zg@HL4Lu=>0;+=6*8NzpLl(-D3U9Fm##-lA4E&8pABzY7(mt=J{3akjHm(nX~YZA7`-G7rA`g6lIQgV2NopR!#N|8 zd_gIK|9h(@%XdJy7bGX(o_73y2acI7mF{8*gz*eGNy-%*x-c`D&%p{G`8w6>bTqXn zh_GIQRH|^WgA{-Q@v|z~seb+}jxZc(E2`(*J(mbDgmD7ER^q#ZQ{Zi9 zD`L9K!8rT*xP@Q=gOMQy8uoOv)Rl((5dF8)T=;dVmNOHAkaUGY8`o|`ZwHy zo!&`ERkM?rf%)v#r2Q|*2q1;CbE8;R)G!v`FGH?y)VL&pp@4)z^AZ?{-{2h340rM_GIuS#ZQe7e88@_oW2^+YK6wf3RN~Z2N zE4qL+lQ=$zt#lR_rM+}1#J_Z0eNOEzxBn1v!101S)?ybW&e4z4p~n>-TmUb|)%NoN zQISYhK@Uq((lGpWs5ETv*0UR*m(`c7`VSa5 zA8^`-XC0lu=G>z?{(tt~1TfC)I?N^h9~@s%l4WT?GR_K6mL*Ff0Z@`xg3w|+7C~C^ z8Z3%siUNj^xS7NNlx#;ahm^B5At=8zNgEC*C#{=sC^>n3O*o*EzVtN$ow!R<4k$a# zOU;3tG-(nJ<)(Gg^gHL=`_DhXfSV*oZe-DeyKn!!=bn4kCTu&te+tW^P;)F#F69Q= zp597}h;=ty#agpYe3NJx(tH6}@&eKpg5Qp6j4z8?VErObU&kU5bF|mr!r#;4dY+DM zUfz4ADy;ueqy>6`UHph_K(+U5b-ds{cyo=sDYv}_YY4GUWKyre6u>9e#Mc}~Q^)mm zxl$LpN)sYq5yg)t@9PzK^c5iDU7|#{U6(2Jo>Ks$k6ndFMkrEo3~v^&d7d_;mlL2` z8V&dOn_sUj;*9q^EvJXUwIrqiw6ua=>9AGqeWmJUGQyHVMke(uke|D3{;x4-xW6@{ z6UL87;B0e8k>4!jFuKrZAaa^h6fG%nG+qOd`GweZT}9`LUmuZdDm2+tl;>Rf~bYzm}&+j~8vTp{lj*sXaS%quP4 zhdKFP&Y!2qjBtZ1E?=t(eg1S8&U{?Yq4-gg-h*I?XK+`+7*n}|VOh*;%=LBe2Zil{ z{|*W_*?X=$upg|mg2Es#qFRgzQ#w%AbbPgI7m_{*X-WPo;p!eJqd`VggF`F--ctXi zy_(imDmTV#Wvp&BzpbjZ(5mXaSo*nVcG8uVrW?6`qcw!87()U4*Cv1UMWyS#11R>Y zfL{yY#{&A_%a61*#SPO0#mhrE1E7P6wE)ZoOh)joM5-!9x@+9lQYyiVly$q%`h;L} z3u$?cSR!STx4e{Zg7MK+3ge?t!1y>wDY~AFr~%_6;U#l(b$Ay-VlP3qSO-~0E+ra} zOLn~i*_07P{Ujcvq-Z1AN9#5v`;e1R9g}dK>ZnQcsX~&NuyZYP*|s~IQiam+l2r}x zlCJ#53gD5H6jdl8{5B&GB|Ar@1?qMs1eX5mO&*r^wCpdJde5P0{LYmouH+5ki0wha zr2u$>8}cVNBuE$hHh#tE8&7M%=TNN-e1#(_f8vj=yXT(xJKB*;m7?SFqs*KjI@39O zXSH0IGZv%qj-VQK7l!lm7J0XKJV-T>xibX$J1<=C4if+92ORg}0 zpmphVy{Kf1B?{lWvb!t|%NToIe|)78eq8kcC(v|kG zAu|p1m!#;OZ}2J4S_)LCr0~3~bm2SgmeB#8^IZw$EQ)USUELD8!nFIk4{Ik{+85T3 zn{k2k@FI$2-6C4H%1Um4t~Dn?Q+?Vq7(a#;$(y=g)NJiZTPqvGQc(IR^Xr<4NjGEB z>IxgxDdT?7=Sg{^rUjA`HcIY+R>Q_@D~R29u4dNh3BvZJv>AlKrK0=6y%4w9gOuv5 zxjoNIsp3y>{psbAsShM4V_eH!VEqCK`X<-@V%@8wU7 z5ZmDG<$=Nx*U>32u7B}m(f%`$Fm1)%3kkIJFaLe~$Z^a|vSRNP(R2B46S`tN-fG>h z_NIHVB8tRW8R_bc)PAZ`sm6N(P60ad2Dbr}Wm-DcNww@5baP&yUe^)xnPj$}feVj3 zcJ)AI7WAYKbx|8iCVdiYuZ&SXoP<)T%xQ%L%3F<9s+Okj7HbG?z2#|S{bioA1L7#z zAJe_leoyEoHy(P%{S~EzW4ravviwhD0t^mWNDg8I`P1{&b$%8v7mzV;vr=MgUPHRw zf)$E?q)F7htG9e&dfMA1R6tao7N&1sxeTN#VMhW2uIS*Ek3gX=Kcyx>I`%^bJ5uIF zT0=(ShU~;ld7@CA;M12~F<*%~+iKH4y-JMdEpsFB-ZifLKW>fQ&iu>MrE|>WiLPIN zmK8Yxqm>uwZa?{*Yq6s(EhZj+< zV>k&1mDNeYq^G#4sn|bUdG|{~T3<=5l+B+=ur?<~zhZd&W$S^Ybw3!h9YK&?L2z&1 z;St<7wv@4(fHEDtrpx*5Sx`$-j?c+8ihMn8OG3*FOInZJ+JcOMTA;Rl)R}>|IIy=| zb%&6ySKQ>E=;ena6xu}DZIO%<(Yuk#L-lV+uN|*_h7cujpR!Li$}rI64vCUMejvUP zdjgZH$XJ5knMdP5mDR82Y`#Vb-QBsUB-5glP$5e#pb#`A3tW&202I6+6@W4qKAv(7 zy~Zm_UiP3`7OubSHEBK!mBi#_Z;{J3d3nK?Js&c>?CHwC?9WRHO$eYOY^KPE0Jp35 zdf>LE#l0YG{``Sbkf7E_wD~ep(|+EDxS;Z_LK4jn+=1S85b6~DoHjRO)+>IGYdu=> zE^yUX21{M^pw&r+7sde_sEG}cg``Lh#05$$IO4A`Y0+DuRp1dwibnfMEGR6{EV)#( z7IlpF5>pI>^^Ur(!A^7+ov`yN)*b_CP8eQWbZ zG15qPeC3!j!i+ArFEiK88RVy1r}sN>snTFTU^iVBFmfOY?To=#WAf)RB-hkY5W>Vr^QZ}%z z7F&4vG+wS0YECbrSmWhN!lFFA1`!3VS!c9KG>jH--oR+nHoXxFu?rNKpUl@#7E7!P zc!zt6ifPgk(MDLPoi>GqY^Gd;uJ`jy*4mV88khVK2M>GQOhg>M(VU=>`e;aCS|ZI;8{~xbTffSdMM5BdTZi zLg$o1FT*)KKdNdY5-PF|?WQh3oz)|r-<{k!&i)amW2D&3Mfm8q27ELK>1K7&#qXoDd?s%j|4#02x%BR{|5 ze&_vIZLOBe7!-k1m0geB(DFUV&=<-g% zO=39BJ=&~cW%%zC0;ggb%Gip8A%_R@J7Bk3D#kbSD30`&j2C8X+^F|j&E1e0C8IOi zcHf#I*m)CS`_->qn-uX*UK2? z$LIx)_Yhf9pP9{9==(Ty$fmF=QW!Z_sYs&Qf1 z$uwQWri<%@1ut4HZaHOK7o6$t)gmGw|6~GusePGvn>&oJF3wnI^!_YH=-jWKESK_y zb8bKEgYFX?H3SvAy!sC8^8JjmL7{;@;qv=U|*(ih&ouEzKvBlDQ+3gxs52`+TzM%ht(NvkH5R$4ZRrcZes~LhQur#w(#_y z0TN&WI$1n}q;<}q{^{n(-(b9a4fc6}cIf5gfdyDxq~?AxlvIrO zniR(fzE<6Ht`kQQSmZ;!KOenmISn3XALOUYan_A+I*WPsLkjIc`pAb?urKt2-wpc!9y!Lq0n2w* zep!1M%RI{(=a5;Tm)HLJJYK0BFLl~SW_+|9hN+|IE!T>*ZK=idX57QRQ;kKmJNZ{*+I%b@;SQevVZTF&k@UtN8sH zeNMhn%U=0WMjH)|=f}0m({=z>Ph&>Aiarpf3U3P7GAVgpiZ#Cdg^25&%qc}St*76B=xfdT z+h3w#NIc~m-u~nTL_Y+-{WQ3~C0x0b4n$phA$dMF5x{-^w>+Z%mKMR%YNeYYKc#BC$v*g>UB+zFo`js|da=N-X)dq^J13 z_KHHnCh$)ziyJYb87$+2H-}|FlN2lysMx?HBq6{uF?i8nG5R?d-u@g$pVqq3iagse9*|dG9vx+B2z*uHto?wvxpXM^x2NTO_rZ>0?<1H)bp zojqS?+@+rZ=|_t&_`(Z;ectex(CuA+Oh_~oozFFpym>;p&wklM{_kqR46`^3b3>{C zV?NnclS&+bJ%>LE(crqpAU4EXg~Kqti$a~s54a=P#}>R;GMv(TQ94m__3O}lLR+gU zmYngjDP=_41#?B@XQHcuz-8lG>x__d{nB}}dM>;O9 zP{fS4;O+&8BSk!ieXr}UdQ!ENMizqk&fq_y=&eMWhFsM4XUkEJvcBN4+)(dt`_ zZ{fbySNsy&7+k>*v-nF-+RT)ielQbH;9VO7q<+wpidFMU9Z7qe7(MJ=GBCU3uGeNp zGVpRHp)5UVQGO$AjZcI)l*b!x^VF*`?=kIg=Ey*ybHG)gc*c*JR{R)B@zAhYq#S0H zu8MAIiO2gPo*s=K?YHG%cVmP$>RoXwGAQPRIm!rUC06EyXo`kGN>D$dw`Md45H-kYt6M*Ul}pVwA&u|(U@FR`pvtC2XR zerv@|6d^f^D@36Ze#tCYL0x|?6F+n&{$6wCBa%TvJBDHm$=LwNTm@thr;AeEzCCnK zv7_G;??uy5djE|4?1`_IF{%}IT*L@1Q7Dn>jAdNB#yOD84oYx*#VOxg+6FLLP>-WM z&;diwj6UJyNIs|-(u%J+c(y{LfGQj*0AW}_(_C@P(Y{TK#?P_hn zZjjdJFN&P&Rt1Z#wlW&e4;DGYMF`;rvkqr!wVG7-Q1Rxrc+WxcaMUB@e;msUAaB$U z4P0BYDFLn716GL{Dw)*hlo+g#z(e%&5kE2K-Qx0>2;4BR#(G{3-&PLzg z26!8)qO!@)L)rWJ>_e_{e>kA9V?+^oMRemzcOveKZfS|%j>wn{Lv~NRa!kIxQK9ww zyX@WAZ6js8Y+4q-05vXJ@+L0M*WLiHkm{dt-j(#R*b^W~EqQ`*P~%IPN*DAb!ChXO z$%ba65SmYsLSB*QLZf(3oYOgaB6IVyQV4rCE56luYsv`=hxBwAuXJ`<~reqO3@VgHY+T%&#RkCbSaPj-Je5HDME0(Pu0@3^6I(nl2U6?8z* zVE41D4)p|1`AB9Gip<17Hx}sR16IN5tE$!RFn}s7JiFsvn|t7*{7r(L<+6)!fF;T+gAD;5hOx zc?f`*-WcoDf*D=|g)Lv~xucxm`X}=ti+9t!qC z+g%~Bw<(Roh%m{8Pc#Y3wbX<$%Yd5S;Ejw~nL-0ILnm@ErZu%@ot7feKuej=m?ck_ ztZw}%QKE+I;+2&Mr9Jmjr%_pne7UIteNOtDN1wUA?fXQVdP%&zWg1W;#x77_<`ARF z!O@NM4B`q)z?{Io_=@A^*KD9{vQt#Sb-R=ROzk6&*NkRC8qhkYGC%J=pc>Dh;Zpa0 z@OBB{r^}7!c$I50bMG1JO{gF&cJK6kKGE$y$6=-h1GGl*EMmIQ0$U?3AJxnA&Je=M z*D;q2Y_jL3I`fLW^AVG8u_q<^-O?tHhB5J~S*^G~(tf$!ZiL=~P!zBi-syV&h!c5X zqpHJn08Ez%IY|O)EsjT&1bxK+ZIi?-V0h~bb`9(UlKrn}?aGGO3hvf7Q3yd3R&pIi zW7fsX`=J$$$L}S$?s&Xu4Q@5!8`{_FB8VJ~yheKl;;d+X+dE{hg1I;H`>FtQ7hp6j zfO!ic%w+(sS6I0d*^$@yuff+e-~{M$0VoVyTa407{RT?2KxJ`1@DIi7mpvlFi^&@y zW>LaBgY~c?7b~BhJiFv^8~Cq!HG5}Z^7y#A-9!BEX^F3R4p3)Ea5SO_aosA}Q$Ge4 zxV7Xe<4P>;s`8&ZX`oTyrP-=ln#n7Q^)pR)V_}vAIizMZuUwT5PU4e41}AeYV2`sOwv5LIUoIuUH3WWM~{%nHc_d z5DUbwt7(!*B4XDPhgm0oCPml7Uc&CAyfVEszdhPj-?vqHhpo!OGk+tny6$pqMp3bX ztMzq1zhI!$oXHfB1gSTakxIGHhkq2j@qs(9Jf3d6`6yD23vA9D zl;)z_F`|B;acs@2w=xN8w5B_{;4Gx0L-J!Z@%o>{)_c0S<{dX5_giG#L0KZ&Aj=sm zAq3lbh5?HwNaV>=|A}IO<(;LF>+I`34hzS=w1cG3iOKgdl|+QVP^#2UVwbs~Xz|C6 zqv@R=K)}AQD*uaCf(d`;8{}rXkNfFWffX;rau*=N7eJg}eONJ`Ko{Ifm;T=OI@p2* zHlyV)PP%Vm$t2O@4s3vw;!+nRZFV z{^6PjOzuS4mUZWAeE0b_Y^>zVCDy~@rypAq4WuZjMh!XwtJNi!5Bc{L^9Wu9dJwzS*hzg+E6 zl~pZg?M6DDF|iIP-nfPrc8SRk;Qw=CMi?)>iXRLrPEsnDb0rkWAb@*W7ML}HmaaF69r=uOCw?q_%2vJp}>MN zy>5KER&qHL3DWnVH?_UM!0^4}5Y+A$lx!01HAWB#niIu4Otb_9r|mFO0oGvgVj4VV z4$TsS<1}Z6z6CvK($n^&r{#y^F?TS&8qr_)Mf{_x@EP*1f=rNogE4JRmaP?e0{*1! zhHumg$o1&o!(L?Oyj4u>O6;lSa?*)6hzu7F`d?0zM71rI&p1nPsfcU9;2OYeIwpv{ zmKjE7YQG(WmsFTxr{(S0nq zW7-??R>a%7QxWV!s>~T(pKnm;y_F5ClEKEN76{5!jMiq|e;R~JyLK`WlF;SLC>9nJ zx}}otR5hjEy^{GW_0~wZHOWRxMgBa_j}VU^ftxuwS-ca2J1=OG_^d<2-IYaoaCPb* z4$t0`g;N-hx5wAC-%7|;@cS_^$GY_B!L2eZz!q@m`&Z2zsau-Eg@hkgiV1X-zMvfOMvTTd&Txamzrk-m5S9bY}#%6*lcFwf>b>|H_x8exy=zdUlq|b>^3p zV}vgtSxeFuFN5)2H(QV!nPM%OgG>gAvmhv$zu%_<@H;+kk76sbDqbm)W83;+1a){w z4`}A*HTR!oD#p>)YqdUttgG8_dH@e6=O%~JO?jzNsVY#e;tT9RP*yD!ki0;W6!#`TD`&tc{2vDSUa7xF;*;cJYk7>ho z_T5eK7e2ivzF{Q(4=p3{Eh=sj|G%GZk3SRj$A7(~J^EfK0*`?&Moa!0#PC%?9k{^L ze*vjrAvNLEM;#EWO$*2am-xi@v;o227piZA3G$(tt-Hz_YRw6BrL>Ttak{ zL5IEMw%vK+-lfa9X8V>2^m!Vh%WKf*6_OlQBXBPx_<2Qa(0MAJfVU=;NjWi1?L{MW~Tb? zz;u$S&K%9`)_caS6Qg)k?5o(b?qH@O+HAMBVKR^sX1UM%WTWubJ4MYAwH)3pJ@I2B zJ9^6?>ZM-SQFbeDb<e8`8ox|>sI>1}j-VKkf6Qb8i%obult=EWs$1^pz zyccSs8pCrH(cE7i^z~H2nCIy`gyIsMxQgY$JM956PYij|wTVIK8CGBj8&eQ737naO z+Q;AHbK}b2C9AU(edLWFszyJM<#jB+&Pv7T=I^+<1fgaM>neA&6^D4~@N;t(Jw&KO z5KD?{U1!&-UU34;O2cA|*76n`V&X%tJOqWUn@3g^QN`Mg#sBAqZYGpvB`Amr;EWs0 z`v)_keDyCM39+w1uv^xomGL41SaGwiP{i7cbVg%k3E7${Ga|k)q&k19Soh5wAQM7Y~ zRHB9MbNpG;mhY~zimYz&dY*-S;%gG;d77L`WJ)Y^aY(d5S%0a?hj^2GN4^Ty6J1GU z_+=vMe=v zwSPA(?=3M7&SlBO@_A%q#M8^@`-mzzKEaZ8yG`tO+3q!)2fvZf{rtyVKgotHyJIs^ z4CeVGiiLgwSoq3dp$#^UL2x>ATed8GxV|lT>AAog_`(m|i+Ck}tDS;~fiXowmFFhX zc&0>Dw_tH;EN}lFrjcO1Ld4(~K8?2}md&=M4J9|en5mk=FQrX}<@t;$8$Mu7jrgUY zQQjU|bIv!@3>aeFs91u;(NPknSPG#_#SEb%VF5x%nl0u7;@zMLzcg8DN+#SqS*9i^ zc2dOav#~&zuZcz<4RWnvq+YI7qKmOw$!o->v~bghI5`QHo`maIx+cv>wj?omh+D)z z#ED49i|Y8L^X;=HSW$v?DdokBv9bn%4NFxk62w^R2>}fwWf3$i`EY5GRzbgZ{$C#b z>TUr=!MY==!V2qDN7@?}5;AHRB;Q_vncgnL2L#=S^%jZ$jn>$Z*>-o;$eYTP;d&LY z8GXh*!ChI!`sYcI5xD@Wz}6frQ~>K}P4J=~3>49R35V|8W#5F{H^vNVJxj1v3He@y z9)Tt8QmL4s5VqDT;x9to%VU|X47+M!DQhaeYG2J23;}_AMq+5i@`dtHtJ)32?Eemo z=-j0BDVKR9*Sfz1q>)x`fs@=i<9EJD4D75)la_%bm!M#s)^uaJ%&?WgXwn?mjUY*# zz2&^EM`KaxGm~r9h~>QR8Es0j92xM^j98l(*TiNmS?Nq^8gjaZb(X@2QBDOn{Cafi z&sV*5W6@3Azj&EPq^pXa_c%+khYlm;}gMM-6*M29?Q)p1g$m4f#~by4L=~8O;32|L_5}95hWw z+t@+o7)Dc@Y(;BUD;x$t!QuqY!-j$xt%W<=v!fbzO(y=(NZcj-fTsJ2tFN{7H{^#$ zNpJ03^p9GWmlvI(wsJJ%5xj*1s8(wb-)cXkx(vQ8FK7D!y^+*x~097n$~2I;%6T37YosUwxqusYm+Yj%xYe{)4){0LI2Zr zOF)SpdQcO?szFJ=qGszGuXMudKVu*iyFqe@cUo^@_#YfuABF4Z~WpUtj-PZ7~VZP zZ;Nf-y=$`-z3`4|W?y;tt}PG;*}d-@-nV)NVVn^Nix#qX+e4z-oAO))}6bBUbV)VwW{}0$_u%Ags-Whue6nt zVjUHe6}%>P59fF?>0sIXl(2Aacx>mcu?My!9fPIsvaI3VyLaxk;MnG!du;wZ3&vPa zk|iXI=!08!Z@F!)q@$k(u0OVUWan;HiUhc3Qh)m%v3e@CHt*iOSt!U-GPiB#gE~(s zwT*H4^k5D{^Q7ROM@Dz0^7n9fcHtX*4<<8w6`m)LjO-qk0a0P=<~>5@m8$yml8)H| zB>9jzapR>f$(x3^e;9>psq0fV?v&vs*<(T{_OZM3BO}AIGCuy^(R9W4eyE;v4<~$7 zrsPY0aOcFP;oZ4mTJVXog`_DNC!7^C4NHU%lw!fM!_*AkmGbxA9kR>>H}Baqyjxl) zJN4cq7T%lK(oDTK*%^)RP2DP{W_`7Enb^N37M{VhmS#gxC3$0#m4r!8y*E>_i}f+d zmTr*GCC&!i;kS4QO7}kX_4VL2^&q+lT442qoA=1qBpzt`yr%f(;oLKLJNFbyzq3eh z_MWBV@cbf}yo9B+${5oM>5WfKDcGFnOHT6COv3f2rY6mQYD!}A)U=3yY7#l`Q!|}! z)x94go+~t}iKz~U#~$7;0Ewp4Ad+#1FUclPm`~}j)ELb%#Lz_pBPumIj-a{a zl(dwUNogzFO+7n6!MuTI+d;Rx9k)i&T^7Sm4GHWKezT%z-Mz(Fv zg@G9BE>%R9Y&2*0oUf6h^l-u++__V(F^*VbZh<;!BMVHrQAI;PP2I=>`Dx~=k0z=Z z#1lrI>}I|D5=I`m3B^NmgRUbHK^qy`wG?5`YFOrPa~$0{J}hun1`~3nF%3W9FFv2J z`Jsmdh9}vC0ZBc?i%5=jw^K^^cIZ-XZQ6TibT?m`_84vwCcS|iMqGhV z-Dqq=4g*MzY}qm95s46_f(A{q){h+377GEhK*Oxhq#@oBoP~5W2{W_??FL$BVfCsd zD+IIkAO%L{NQ0G(ZSjHpLq4!;!o#8wyH)ujqdT|g3_{RvMopG5OPYjP(NLVZhhQi{ z;ZPvq4>KAr1+bgV`E7dO=w|!&&9VUX5QQWyyef2H~l{N>SNZV~|QnDVQ3H`(mfGb+T;T_|nyLax`&hGS|LyY43?kVo^O08uz z!u3hR6WqfAdZk@Kv+)I88Qv>c?@{?&LUzAkzZt($@kl?A-J2VZm<|TfIxK!w`G-r~pdM@L02kKNKLW z#x_1C=R<>=Y-d_{c>B)X@@}vy!Ox_|KDc>@%+qpGFDXk1Zz+py8y=SZWsyhs$ZZ>< zAGVW5mb_R<<*l%DkEABU{?Ma)#)bt2@P)#>^4h@y)wOH|w1t1$o=N z8$ab^sh7050E#bJokUM5Vqd)auc>*0u@CT*$88oM}m6kbRZr4d5Ji6s+_0uTr5GQ zkw$YtYe2sBPOklzLY1qN*3LUC?yn1sPf1gk_gR_|$6lp`txdy9pMa&O#Ei|Lk6Q#K zk(kjrd{!d?LJ}KDHDKw1rX%-1wUwG7<)HKkK$P3SJl)f-+_3e8KrSPtPA{Svd7DyD zIokdj6bNXbmee#YEIfpyji%CkWTeac0i+Z*8V|HHl0EGVfF&~!KrKUhbk75T za8Fs1%7J!9refhh(Lg&RDZ%ClH`30i>uG0XgSXd7r>5^kVzDJZVfxHQ^G z9@o@gguHKD~x#NR1Wl&{U2`0t(~i21E!1Th~; zNMJthFLNJD-7r2SA%sa>KE2$hGT4OXMTDhK(Y#nX+i8?!za(MOn-OSO{uB+2LV*Ux zJ)NR~QLK>$rk~tsV1f|WX<)>3)7J$p0`93*!oybYeZ>`6IsFUqED-4kCPX?Jk~C=h zE+L$eoP=pOMMO)*E>>uRz1=`WBhF4#BAWE$gESn1hPY_~Fwu|-zNx_`L^P($!4J@Y zMicT^I!q6Zq%aZ|A%&5XkiwF1ofM`?^GRWnn2^FOa@kTBby64;2;?n-vPt!gqVQrq zDNGVQDUAN>q%a~Lut{=43QM&is3XxdDU7HdiFw^Mkiw*eKnkPjG$~95>!CAyJt2jq z!&0M83ZtzCQkb-DNWTojNMVweqJ2qYsi?JQq_8BMB86F6niMAOrAT362!X6s&raO{ zzCxX@Wz9C$sguI2jd`RntCEnyELx{`NjxEi(Ljn6CR47H!lYoG6sFa5Po#=i{|REO zWxUW6rzW9(Q7ldUqF5vKOPWcU7$rYV{qoU-`b9jUe#r)Iq<)dhmo=t><_78)ktWnH znQ|lbO9m6(X40631NF-%)TvfUQD8|D2AD|rqN!hWsrN3eCloJ+n}kW%*Kv1B`YUDR zknDsq1#}A}FIoseN;FcxNbs~9t?a2^)JPgS5A};;I-Irj;RKQwSs|FBe$j_gzvOkM z)Gq=?{UTu0FBz;+zxX17h82Py3ri?otaTD*twV9<9)h6+kS7#Ks9%hxk@`h9p88b} zQK*6X72*l?iv+)dR02?V>KBm&Ut$o8Qonq4BX~&*3H6H{4^O2nMcOP-Uu~s+Nn%3q zYKTbNf%?U|CSeL$I8eW&tAzSR$$EqwqsJKai|9P+7bz*~7qNNNFH!>TK*I_3i=CdP zei5xxzoc9WU6@DxO1dy)qJjEFULbkVNC=WD-$m)DY>jVE>KF6zgf70G4>7So@**(= zB{iXbNqQ0?Cq?ffD;1MPnn(Q-09dDfNw=Q*l?oaXrPME42-Gh{0~6|(#*F%SrQf;J(M$= z7coz{65O4K1ZZL+BLF@W2w9TrDPR&b3Ybp~)dx|M{Dx+PDOI(5rG zSrY12{iWe)S@nbzElb}Y`m$tlv@f))PyFAWcJ;!N7Hq;`jb?lhD?GpU_!@Ve2&jrO zOAd?tId^+JK6cklfmF3#1p&pU&A1k%RMichox^&}iwQmJUD>D162FkL-qrS0Dg%G# z^_ciVug6esddlR!uFEu}PRs=g8p3{3qEFOlO;C3%GgX*6hg+Y{7jh@ilA3gr)j1Jc z3B#RtjA+t}h|Py%WWc@zTJ!SqDI;wu0VKWA4DXC(B_F$%ciZ1k^ci zh7qz}r8SO!{c*QW)JV3v+-w0cHrDcAFWC@`{g~ZJv#o)Tus-vJrtP@FeJA&g@0;fL zWZe>FMeH{4-+E^Psb@1&VGXRUjCffvWu6O!*5Qs6TkIQMNBAevFX`{X%UO24{!E*+Bc*T1)}AVxN#yaC@0av-76?-srZQqeUti>Pd(L`>eZX5`Hr?){9T8O#i@c@rT?xc ztPL=f1LgAmfiBTC%h!(NDd}!fv>h6m(Mu8{yBD~mz6!5sUf{v{bY1Q3)^u&c1GQP zsKInS=-%`+&c1Sp>^|Z0RR7yp40A-$4_u>Dz{iT4D$k(^q|q^5+(*N2)x5CZL;&x>sr$jFt4PWPD5G|MIEm?v@f>@I=a(@%~&K-O};{t(o{gf6|Rb zx3@X@uM5}T$M`)K;kq1?C9B(J&&|F_>3yyJPaya1rDWG>+i2X07;lhtC)lcrkYXb$ zqef=L7KudET9B9yQN_KiFU1p7rcoxcf~hKfhhg~OH>~RF&@8ebBE*Ok9&PZ z{ISF{OP*Wh>v`=n%%J2>=e9<-U57KrBhfnC1!mb9<;S9T+0H1I*%>!x*&u#r;2VdX zQKY-0OE+MptXRXtikz@mpkb^)H|F$8f(Yh=w-A1)FZXcrBLAo&%NdZn!7 zRkC}p%820oRc@pHcFc-;Vh7uz_XW3cz|G-d0YwO`h>0+jY?Qs|pn2>V9;x~yt!7@HUIYL+z2NVGHECaTr;hFSdN>)c^o zMOpDVx3BuV>njFe?L7&pSt4oGD_wf8J(7%pAb!)!cTzi(uWSmn+{||QTw-IH-_=c+ zFHhF~oF?o01TP-i#lg()>R;(Vc4Tpq{V-XLAC-??FaCOGAfaJHL;`EP?u^~KvKP{+ zTkR+;*z-s1d+Am_$QB%w?d`vfPqghVjyfOGR#Q9NLnl>az`14TbAKvRVCkdRAuRvl zRZC!!8%)3mN?-{Ldt05MM^?oR7yA{doNLw|Cc5bR-!~wyh%!VhNP7D%vEhkd5lsz z;Zn*TQZA*W3dh+fpMJMAGORVRkt^z3HSVOZlyE0~JfRWzxH7eUIN?k-#DnOIBql6M zx?(e?Sd=WOa{QF)bFT{R5KK6JWT#k?!~#na)?$h!$=7ORN$RJ+fLOkKO=0?Y?j%(b zE+Sb;nDlUdjfY5r9-Oo#AJUAA7Z^~B@erkD&qI_BFIN!1k%vg5cEmYUUISKbM3D>!gnlzvLD2WO8(ITGvNJKhbROdULZy==3 zeUxSJ97Tcxroz_<$<(eh8i{yNCdsc5qmic5j7AxkXEX|{9I-N$8B2$y#`zhIDK4T^ zOhv7(F%^?=im7O6FNvvWO*G2aTiPWt6|G9bRJ3TFsVMP9n2IvxI#W>!)|rZ0?E*|i zEmLPIa#*~4{dqWy)HyGQk^D4=(MN>`qpl8!CmcrEq>UU#auW`t<^~QUktQ5Qng8M( zMro{p!{`${hcU_K?7SQtM%qibiVQailit8#B(AW<^PD6a%uS>?jIn($IN0j1+6&Fw#U|E0Pt0DGnnAl*1_GbLB7+Fb*RD<1or#&nsUqZHU;t za2o^vP{M(MNbn*#jI`9qVPp?@4r4t;p#~0Ph$kFI68s9v7D_mbL=rUUd>lq!y@`B1 zIUbNoTMOmu$-jVny|f)TjI3)Cwt*t(8#s*8Rl;GUWIaMon!`wR9*2>X6o--6JPso% z;Z~&Ki{da!xxise!iju+(gh!y+y)LKd4a7+RtSmA%s7l1 z^c+SD2M(iE2^>a^c@CrHq@FmI5FR-e^BhKtBpgPf@?2m$f#=s{>O(2xFKQuU5ei=K zS%?xe7NUewTt|5^)KyLrwxN_t3B^mPI@^%vMvC<)MN@oBiSh(V$uG(Sz-09`FK}vo zK^_mD*+@BICH~xto|X9LOIixTwOF&p=x%14K22CR!ra32{l$C{{$m{f=Hqyx_1wtT z_}(>ctXilQD&uf4%-jonjo!8+a1%NwXWi70D^A3Fj(6hTArIdr*iBOwNRKcHja?(& zHj?V%KiJzMfqCdzZo)ar7Uv4au*0O`l(-u25*iss^J?yp%f%BL;;Y@MVm0u&!e4~- zUH&O83Y!jYi4gSMf6;^uncu3_rU%BMei~Vt63QZ)^rp}yo^|WzglSfTc#V+_9J(Bl zzx=lmV{g72ZS*;QJ@HV;>5)*!yIke>CH!6dv|z&@_vZcH;5)OrJ3BCLiy)CU3qA)+ z5WaydQ}nNVHTPx>P-;~h*66k}iuL%L!SPyH!=e$n&tgs|{;|j5u{7{ITjRg<{LX~U zSvbdp3K&+g#bH%3QPh{mG+xei)sA57c*YZGjmHvijn=lr-)ThFG0y|WO-*2QV#}`< z_{uVfxgU1z^Tu$fWy2<&2d;Cl4kAnKrxg!GA8UzkY43A~tWzzqDq$}6F82k+56dba z7BkJODy}e58|bPfsR>UY?>dewY=BSct55Zva|3vjo7`G(rHAwU+?PvQ5tWbqe0%F* zyfzrWeogeg>x`|f3&=#rF>97eo3E3_jYs&o!k9J7B=ssuy?O&SB(u|mJku+_BqopbsvSmlz+17z zpBaS_r%gup32(>)gUmD54VJaGV$>hMEqAo#Oa6#7mShi2!aDSBaSr1QfvM+kG9drn zv>bll6UpSi@hY4A)5foWD;2&Yqvu@1#j_lpjwIN0-qNOl6-?^up9){}bMdR}i#GpI z`a$FJ<3|Mqyni76DOWqOexKG>UTh@1 z5j@yry6j|e>}S!ds!c^VwN2NGUY-Crx*o}Zv8s(iSk94?qY=wFT6$a^d~z<7e{!ld zCXtWyH=m5IZ^)c4Z=U|P{ zC)_%h1xWnJ(&)C9JT`MN{#nC#n?Ljilm0WsbL>F4^1Ita*6PWleBtc*oy3x;bXa|rkiZ--Fzt+Ni8SPk6o4|Blf8Xx-W6_&i;x~@O z1MP$HTa8h5*8IuH&iP{0=N&yMm+LSVIf(p;vw>%uPk!^fgK zl3li_NI+|RVCjY_XSW#Jxx;18=|rRX?ft<;w)ay@Hx!@u5?2{JOJU#X%#x9N(BH5# zt%QL7uu5P+#vzHUQEMn^&Dv#&!r94KKm)$)*9PiLdFm#q}@x(j2s^ry@=yUnnKcA zzBVxfdRChNDJfwfmF`hRFb#Lsg9u!K#nX>QeJzLp0kmeY--|qr zh#;Blkx7`$03^PU*^uYsOjT=7fw6UH+noDdwi<@a4IsEtbtS_P$^38|A{sy0QrB$# zaGT5}iXW4+E5aP{GS`lo=UN#lvm13zA|tqKdCiWrT$MZnKJzF5N`<4~t*da<0uh+j z_>VIi%uXB)47Jtv4!9@X8Jp%==~Rzxtjn5NmuFD`0Gj>;ebGuk`KcW2`&#+N2=H9`# zd0{V-j{gk7o7VWBye@UoF1GzQ%|EN&OQMJ^dTaJ}tp?zdnY7EK3CJmP?c2nqQ6zf! z#ch@RnicL=zfsQ%Jr<0J`d8@$|?1Q zE`I$E0Ja`>gYt~ci}BcUZ4$vLJORjU9KA=Il$D7x|H8tV_^LBK6JR&_6Tqw@|Bbq8 zelJ#S@6H;`;RtnQC(8$1Pec5vz1o1hpRuf-n=JnxaE2!GGv)m0sjAz5`lP!*SFW09 z3J|n+QgI31-YQq}kjj<3^EJ7WOS8||s0n_F;vtPvAKxnFbroj0JUN&kMU$2ZSukwK ztQVNrw}U~(z?X(12u<^%%BPlYfj42RNY5csBBIL6H7LgPobH36#NePRD@M4l8WCckP zf^|s|Wg-RJjyRC@(>jhX^GK`$>Ni3>$Tq%o5^ zkx(LaqJ5}Di4P^BM=Dz+pZ~maA&sIY=aULqAcg`PG$jbaiYaLuvT#uSCYT6K{#6}WpWx#gg?kh!lYkSB>QW*iu*86U+c$67t;fxSO|_krgkO^wk-H>O zLzi_478&hSd5IAsi|M3O=jDDkU(__BW`8=r- zN;HU%NEH)CZxlX9!bF_{(4|P2{N6{~C9ot85+*y466t{^H9i>sw}@~joPL!b`N>bG zqt{g?<5U%Dpv{A@vMkR+1w*Ed>c)FZ(GllYy{B#)|Ra^l+;vUw{&Su8r zkB`MG*4=eeZW;!tD>K&o{uJ}!Hdt)FX!M>o^pW$B;*CD1v~3)*yf=IQf|MWy121{{ zT)cbi?z?Z$Rv1{yvD^KO_3EHY`%A&@$I0Nqle$IjX`2McvjN}gUvI3uA5RFb@&I%)Y6>D6M9#(EZ^bsAy zhRl~?JVbA5I|l1vewMpk@@~vVH)9weM|HOs=3~}POvfJ`iLZjEeC4{Ho;cfX+Wo=| znJ$<1SB&o=jM``{!wmOTOV#}j#wL~Rp9W1)Rw%q)QC8KcV`oHCR_AW7-%rq{$v(M@ zZ(!^gB5%$zu~oKLi2l%uhUnNzH)m_%IS(pfVkwmVNLy{H8jWVl!Yzq@UYBDGX`46J z^5xppvxvnck~R=qk!+G;%JhnrMKPB7!QY!KBkt2-O$sX2N_x+Mcw+3)OhuptNBP>n6vgOtvAqC5%5YXGAO%Du0Xhwp%i zJ5&-*KCZFgSF^@w|Lnw(oC$%AGyG>U?WF#U>xbBW^;^7AdU>EInLQQaKUN zitfv<#~o}U^Ao+bEmuA_y}s=3EJwE*Gc3CKx(tqEMRWR=*E3kJ0}9XagJD9evelW& zOuXwkoPc#zY7+(1Vviou0zi@P5DB9W*K>?k2*|;Yg%1*|gjx(6P$D9pU~2n+PDo_a z{#mU$bIf&!{a9(CCxIC6Yr}Pu8S`2$?xwJ-+r-b*@&OLzL+$ zJhMLS%8zOeI-+~sb9ZXtM~yRdG!tJ9BTTae#BtJ$|0Zq4Orc^QN`)tc-`A?_nT(w! z2WwA!5erKgjz_yU;2;6F3K1Ah=F8u=V%)8(?ngoWi;tc9J;2e)rP143`VbfE0%X`x z*V7~wWP==AXb|BO+SrE7Z}lFR?edMs&L+_Az|#J{G7IqQpLWMRT>H0?z_oF=5r|fh zZ9d^vRcB^qN|nAY*H_qIIaVwoa8;eD4I=7Sh4U(aV9*swDA&UIb`?DVw#aj z`)5*>W^vbi{c>&y1&LH2!sp*i?RFFDU_S3%9{-ESN8)#`i`&~(8pasQl4D#_Iqv0Y z`FeV=o(X|tDbbi?oHq7i)pNh85~SaRGwV8lU3N0V_3>fcvcYq-9uOyi_o(fL{K2*% zi?fw0$hF~!nMX6q_jY z^zZjZ-52cX$=7WVkJ7RN(b}uEM>yqIxc-_U8H`^Oncn-eRYc}SEG`!e{-u3|VkJn) zjb(~fU@U_LhxqfKbp7mg&JyNGi2u?j*AV_nE8AYGb_kR$7d+E-jY-~Q_!N0gxR)C^ zL%~?(i$ZU1HmvQe34FrGhZpT-YA8Bu*X9W4yDEG}lcgc!v=1WQ_&oBQoGh%SB$iZM zc?!^Iz0hL$$kSjIl&IzrxO#r#EF=Gda|fe44fLMP#2RTjV4tiGk5)jYm`S3DfOr{!)?mwR-8BL+wr z;P;6Xgqx}_rfi|C6mpxjHf63jIxTY$Nu!pGh-^k9nH<1raI#!3@@e{jnlrVD>3Z;l z1WUDvR7N^xy&-j0n-F}nUb3+sv9vIr03IEJ3gaynOA4g}(?}4HBa8M~KzclalvloT zZiel9Js zuOCS4KaGcvE4y-v+P|82&mq4fZO<(0&ryZMUl?~sOBFX*Q?9pgzU99oTIxSu(VwHp z!Er3LJji*b9A4J*{5P)o`<7wlNUUl6+_*bPCOD8}hW{qC&?y>0lF$_>_l114s>KiC z50>?l@~3%se15Y(v8;bTS-+Tf2YuNJ9kIgR9FJ_-*!{9D`B>&F9BKqtsPNo`J6MeG zb7!Wxez4DT)9XJeL-|tt=7R{#Pr8kQ%pY?j4-4GgSM>sEhcmJ^Kf^dgrsuyd+sCU3 zC`Q_kv)W8bC6L7;i~e_-LVt3_zC8JVmd8HK4nA51|L&MY;=kT_*-_>wkYsY%*tibs z2^ObmGk;DqVikyIRGjTF-E5wZ<5~Ea*Emg7DK1om0o3 zZ@X&=_Dhfvf7u*=ZuxunQz^8Om*QceE=2Ou#4;|gc4FLwz_$ED!<`ExI_lmTE>Xax zc~h^n{S$R$a=FH49va@Yr*q4OJ;C$oKLAmeM&TCWAF!Xj(G+h&MTmn4w}`q~u)Lx6 z2W3g(_|Q^C09>PY8BXEXC}mh?Ubi>(w)tVFr20 z7a?!jI0!Y9e4(x8c2memmxp^I-3CMEgc}Tz(_?BF#sQYJl%$MQ50WwrCP>PV>}{%O z8|L1D{6@1X zW@%z*MIsI2Gm?-pt|HOAQLx!0$udcYd$$bl8Z%#~Qfix+UL7-Mr`iZGI^_=4iX@UY z8Z}89f?m=_5)(-q*^`M8mPPEl)Ct^D+7rbkh`%l|6)QnDre6#~CVJ)fXi7B4r)*S@ zWImFZZ1M3FvD~K^ZJgFai3VS)Bz}Tp0E3JY@X@wx_|SdtCny$c6Ok~c%=b^p?Xa@? z^*CNZZiiqZw?lSHZiiTq+d&^UWx$24(P+R$_n8@R5jzESpAy6Z1C7?waywK>WOc|& z!lb7J@r)RPh^=ZcxP%}c z{Hg*xQc^rLYLJJ;SFj?Yc7#c9CdEU?L2*49w=W%}ct{sGv>JbmV`^+z3N|tvd zB#V$-QryF3@f*RnOZ$x=DwTH6E85^Uf--6FDP!?h1ba9!;gSwB05MVG-KI+Yl*Ek` zOhv7%nQTeIDFGZyOPg$w_ELTzh&H%Ht!D?JN^7FgWQ(N*lPy+9_3x9F7|m(C?mEJ% zBqm!dS~uAu@x){c4W|4+$dv0QTclv!WQ$gtZ?eV4lL+8w8E>-14uluLA(9B-P$%sa zf;x=?IMQayDFpdxlPx})m~0`Qm~4@a*eHNQF1M^Xh0xp}fJ4L!;P7}zIG{3r+k?R+ zsthJ5!b@Ws4o)F_f;ZWcWV3tIepbcY3DwLggwL>u9l0LN^RI36ri8 zFTp7UafN~2WQ# zLJ2B{0*O-yT52@eLO0%IOFcxP29qrzo|tSQ!LJ~dSSjxmf=Gg8F$fEr<4f5HNjYEL zOtwf1iBkx2Jg}6u)MSeV>R($;wn$>)6rv#_Z3m$n)-?%J$ihJYN4iQ(wotMjAxA&4 zcZo`Lp2-$cQYKr7d3;i9+2;y39}Oo0IPCPaQwXAUrw~#ug+I)53Xya{lnhxW z+?YxAR6?>dQfanlz1R)&@gcsR4>7S|r-j52l+?sZi=-zJa#BWG$V$azkqjUuE>Q&l zf}z!qV=&nwBk=wqm=*|Az*oLqO}5lUZ4^cRP!P3|_o$bsk#~ei)JVu)FA|a$iAki61+i{dP2(kgCstf9~seC0xgO_ z%{?>i5?B)devJ1AFFg~*Y3Z3bo?Wu0fZ2)lg<=VAw~+^hucN{do-SE#ZG{vU$A9y~ zXH{J}j`y`VA<~IG`Y*yiy{`JAGp6lG2Eytlc&wi3A@v|v&Q>AreyO}ZA@)_OdtsbD ziC*P(H(?>8V3f?U%%Q^m^0dp96LA2@$HuLc{;zAKF+d=MN|kh2vBu4m1^dV)^WsLF}Kjw^w1b?s{ zOWK2!GQNS5`uhMa336dRO#d8-srS)9?rA@(c7sboSG3gxD_=tBAUH=z6y7Inu(#YSndE zDhjQy)1VGPK^*^=2;Jbm==Q8|b+-1o z&Pt_R8m*Me?@we19$2v+Wk=Wf4D9xDxl}2^LMTl5h~V`t!|)lSpVfu$TF zj?uMWT&(batrz~OQ21B1@Y#$?Lq-|vmb9g6C`BQo8t!lz5t_MR0dcV~d4zpx@It2N z50ZSqi&n#?>{UUw2~p8QEi3(5NC8leBgNE`#K%^Ai+VJ18i2^hR`5~aBCdBGwHX+O z&+3nk2Ze6Cla6Le9_%-tyWDLqN-NA~p41ko7;d;rta%v_!Ap=e??~>H#vzj6J&$ZG z<^Y<9a+TU4mmSR&D_i-45Z2bp`|(-RWL0cqvpf}>rf9xrE%+@RcO}P_H<_zd7EHvXLW{^){;xI=Al&Fa>?;Inu7sE)^ASNsj#*7-twRa379Cb)h zb=^qdrUB}uod$!0Y(4KU%0RA4`o(`W;N7AKG7-tWo0d?OF|xg(R^tjYq^~P{qt6&`5^cI?f*) z>g~Dv9XIxLpUW3(`6GE50X}*J0Nf$%#?dGA&lYXDKl9a|?wT;|U1xMFo{{|Df!nZ7 zR7LRn*rPLiDHH0%FAPXuw0b#WPl%n}l%0-NuRury3C+SWG1B(g3AYbu_&=R{?nyA{ zc%Q}pj(Gn5$rDMrzZzGZ@Zc40O!iW>ntp+6$DU@|+bqOd*$jhI1YU!Nqjm zQT(=5d{$bYq@iam{@cVGMp3f#KWH+FcO;`YVuk*gLS>QI>Odl56}DVjJ=~vKS7cQY;i}~il)v#A zckZhqiiOO>Tz(4F^8kW5Sjhqv$5hS6LRG|1I^9-8tjYYJV<4sEJ#i&@DtU)(8$n$` zkM%cR_8i5|j$txJ${nO!pQ|C^6utR6GX8YzjHdq#>EnFRU(93M$)qM16GV*TXP2o2 zlwB{JuD2sT%5{IGbMYybSMZqk5~2>AFr7Bpe2&5qUD^&QfjSScOH(_G%InzF9g>;IqH@lLGvWcy3bW-3|Ylqr7z@m7&N?oAr1#Jef_hBbhz&$+&yZujJ<=EJ&~^`qQ+v0y0N!QaiB=S<{g8V${BzYYPu9C0>d7!n0SR8+O4BMxlC{)`oHRQ<=tLRnyQ@+e!yw#nHKWu07cqZ;Ti!f=rYkHht_21U3z8G)c z5U)6nm?B>5O1DMpvOnsIk4@QNInk61M%^-VlXGrUu@aPpn&jT+W)KpU7w9v`tNv+wtWn&(qZElDtX#~U=07x!a_<15>{U1185=K(kSWPH`ZcpPmnB)gw1AEK4%+Dx&y zzC2y^r%gV(-W~JrlG9!~Pai#aKICxEx^eAiKGf)O;|M=aS7kT*X{ENiDc5w7*D8m% zRX|kh)=KK7RKYY`w4NQWz@)e221LkF9|WITzW&^J*)Au*VIR_^nkBdcLY8eBk(6(bhApDubWE}dy4U$*slc(6%HpCsu);mZJ; z5dT{DsoO%nl$3Oml$eq;;MaJ-trgqJih-+7z1E|diD)B|mpPC+6sy()rfcP>+g9oC zd0=3&8!;fJLpw0%mWO*|!75^(cGYrVA9IwqGl!*GcFUh-Q{T~cjy=eIwdsUr+WI-U zB3t!w-m0{b$W6tE9!JdjFPF5t&w9d;9?wf6$Nb9RuY^024&qCzd+1j%s?9uf)G}y0 zd5eq~EZ|4!Bg)9O0Z-x=Q*J?LNuoVsNUeqH8WB)o2~(&|*<(D%Tt|D!F- zq2zSzrGT8)sY2fScyx(n*;D|HCRfHtZajXFYhLT5%k6jNzQXvB6)I!nHGZ@|{?2tb z^mq%mbrJoHJC^v0rI|!shug^-`;U5z~}qhj%W_SkNR7MxN4yt zLZd`RF+MQErIg3;BQGN0a6AT0ZG|-`EpR6(Fcu}Uy{>0^AOPKwOzD1Y+#VzfIgVy# z-NtzAZ2X3!EXKiVWe(4)=-qj62vrPS%%b6_G=5k1DJ0zwY=cDKG0A29%`7fEQNej# z{5ee%<);5i+EA;De_==Tz7}95N!4qkx7pGg$mA-JS^WySzf}E+q`7lc4b%TP`kyvh z6px+2dfq~zaH(sc}x_P39O!4%p^!@=}WbgKbQ2KjYSm3(FPWwJkw>ESpjGmrKC_$;wMN$Pryk)LSYk~UY=5x`mGzdad%8&O zUpyREb5d&Pr~O}=CZASXkx%>C?a}-Fr~T%2=lirTCe8ggRdw`y6#2AxY_@OuXGxJK zDPrIBg(U6gByGVreO|d%163^l%jxkqf4euW&(&!uy6%v5W%*U76ASM8apG}1E&}j? z9$(ObfkSLzNBmIyz3X5xJuYoqR< zSC)27! z1q$Wq2}#k5;e@nls}LHklq>oD1Jo|>w<{jZS6c{Q`OfUnX;iX70=lz(1M)Kj=(v?j z2uBC=Us;|_y6}}Hvv1uhKT4$N8|2Y-qWmlerG(~rwp+W@msh+8#WSLb-g%roZZvb2 z@pNB&>~VVl!&mx)CC9nFduZg?F>ULZHUp8u@PBKM_eW!U*B;-LEAEfK`NL!JkF}ul zB)%(HfOE(PxQ*vr4n^y*^0LXE8S(V5|L{iWWCN%gQ5Mf8QkqkDc;u`SkiJH40cyta zxXtxrd*C<*Fpk(#vMJx5rRYzN9M+=WplII#KsNfXa31k0FZ-o(>K=)5KL6rf$ul}@N?`o}JRIcqk3{3=4-^OdNpjR!bmsMhWWj1LweZhj=XarqELPe7Gzv-u;kU8$+5D^_-lxr4VG zHfB=V^}Da}UAs5O{cGa4v?~~r>lf|c>0$r|wGuwW#qd8qX_&9KJPy`s%DoZRp$(Yv zCcox*Y2bFuu((w-`EHaD%b)9T9X(xz8VY3Ane;4F##w)uCG0k0)S;L=`9-0vmQDkD z?2ebbaodjsJD#bM2Y{~%W;*0@f>X|(V~O19Y7q^+>EZ#wx1xBbS)oQG0+?1dzI^mY zezNhhQT#sla=@kXD0F5R)LV01_q)gK7c$-TV;rCO`v@{8KTyz+Dr_tNq4xdwaJ4@Cc{^<0f|8=Sd^#ugL-oO77$bf1 z8dGfJKu=G#tD^=+Dr?(a2oq?cx%`*A=Qe8EJFR`76#oN26ovNj6 z9$l%dAH@DO&CDG@_mf(G;%a^VC79Z$AxZjzCTV|<(3l$y*n|1nQcyj%k}s2L?-Ul2 z%i|P{pCtE`vmajQ1(Dkky|(t&WCQc}M;=`xdxVh@%l~HA(m=>M82VaN{xqZLlMM6C zkm#Rfvo3pC$xLgr)!rUtf)!jby}V?8PNpRj8cKI|%`}woN%b-{#xt)ndKkI~MHJ6^ zOViQ%t;}U@DKGpwUq+RoVZkZC@DhKBV6SznZzo&HaBqDH?10R?cWJg>oDmGFMIh#O zb_JXNyX~8>HE~%}FAM1jRBnxV;w7Ch)k0@)ZsvXSNZ;=4_6l3_V{Dn?jo~`B%2tur zEbO(d^}1~5E^yfPX0L7vl~*?(wk_r(Teg}@=bJ0$UzG2I$^g@g9IY?W;?-b)uz@*5%<$*1WfFKr|7>$e9} zCB}U8rEPo7a@3dSWAaD_qgyo=8Q2BflPX_pTyl-~h1i>Dig$-Ew`@Ly1HA-p)m4>I zUY%UFyt$ryyGkGb>vX%19(!)je))Lj|8HN~N$IVj^ti4gTADtg_v)K3b*pvn~}-+?QpHPJE~*vlLpFOw;q0?7+R4`x6}CC|E}X(RQ^55 z?fC@zK%7R;YXLUdZCl)09$`-%wNHV$w#Y&BXh;o$9)@{4u)~b$SU}Q-^#ur@a<6nO z&$jo#CMUG4{Au|$odWbK;qC>8Mr)&Du76H_ZwI>TCG*{--XIsGw3o1}b+grz+td5x zf5Udd)?<~r{X&YN$KF$|R$I4uv^$(v=QOqV@z@{=tUTC$RQq1x4YBCH!_#wNvzsL1 zuW=933K=SU5mW!j+uV`0}|0%5?NqmQVp z#=Y$>32(cD;vK6;THNtA9x7uF%|NIBxzpz|S9p7p4(&2+W>NVMG23==1qU+lM`8F0 z6oVw-77hv$5IJw*5TskAxql0LlVt7f4U@SKU{hR<=wzCwr*ztSkBF_meVd#P%=Vf7 zbDSG_F6)gx{Cbdk=27C9X-1{IMqJ>2Cr6{bC-Pgl*%09&$U|zIWGuv*5}=w<_!5C?Z%)AjH2aqxryXx@&!Brt>moHuCsuyVxST@cD90!Hx>2o<8%U>F)T! zI>)q83k=F(K5H%?bCKKPMP}xET%>PO+`VX!<4dnT0QyiuOWcdRyLGSKi>%YWQ`Yc4 zXsC;^SmkSSitc^T^$piZ6XhJ{zUDg1y__dx^~k5M%k3;_Iu=LT4MT zRjYPaHGJ=}l)XKXa@sNsJfo=T+w}fswqrsm@!a-hYcu5)*Nda=ltiYJg|jRt;dM z;t61E-x)5o?EY)7A(okU$Bl7#3YgtPTUctduqQSD`sF;l!hfT!#jCq8! z408!naNe0snTxtYsr19=KaXG1i14@NFP=?l|TQTF{{qUA2>)ms7YUKSM4$Wc7J71zx#3s%7))5ls#35ICK*#(bv^ zo~U`GmJK9)$I{NFE7q<@!4_>EQSOLZ+LG&aR8cc=%EZBpL7ouI7`T+E6yhxwptO_g z)20>(f?BC4u-v&GqYJa0zFO3MBO@)(;G~Dd0)a$>1p>MW76?f876`o7^IEEskAhX= zt3xUW3j}1IkgpEvdJ6>9OmvHKy91~~<;DhN8Vkk-Bq1?2AW@lThAH(Le04~!s3Ch_ z9U65O1PFQy0+JXl2*@o|3j)&EF?@A+n*makl@mG+h64N&N(=?~6lW;FN1~wsA6GjV zJ{(O1_;}H42Z_vmqW#Y_o(8WS+?JyDzuse~{g3s5MEjpu(B7kKUE?e7UM{MeR7o}d zW0>?r`#*^}?SB%+X#bOzX#cB@aWNh=`rRU0Bg>RJAyw4kyiEX%6@;KuW?Qp1X#W!r z+W%;CCEEWq>K<5HB`1bSA5Z(Aj)M+l95*$kbkP1My{P>!1;^L^CnswE$8fIwuSt#C z|B@KB|6Rmu{}Y)|`#;ThbC_%Y%QT#X4-cBmO#%?{TbLxvv#8qby1S^#d8e2JAex#4 zAex&5$cq+C0!VVOz(UjM-p07Y)+@H?m#@O)0-dB`sgauppsj)hm%K|E#_{;@aP2u0 z0x_JJ5O8U!2?6ONF(D9!5X=GO*~wn-E9CY7T(iYGst+0`d5j4GS0$PdaM9d^fW)H- z0S1wn5Rm!HO$bQA+=PHuYcwI?t|6Kb&@$eHfP1PY_u)aEq6qUX4QLO@n?(S(2w$eR$*++ae0$O-%Kkj4ro1bl)wArP}!h+<7eixOrJ%1sFP3}-?> za>kkv;QIA-OM9u=fEXrSRg8lP0phv|d8KlR233DH$ws>Y42Tj%69Oc71$eFOO$abW zu_3-RMBhBLOEiWlro*`+??2cLAS(nh)DVL7p(X^*;Tc}Gj`0w1CIkpL69QE9I?Jrc zU=tt&{ax2&2{WZJ%#4QOTzd$H67FVbYI=++nh>BHZ$cmsG30^?fe?=-1W52RNF`BK zXHC)@k!V7IL8K-GWFf?IzPd9ZAT2}_0_6D3RoYS$0xpoxwwe%-#ArgG5RtZn2?6Fc zhAHI2!GwTx6-@|GGLMksl-k#>lUOhMxf+9`bdOSPhWR3U6^ha-78h zE#nNW5lqYoNJe~9NF(Pe_akkSKNp-f(1w1g4lH zQ?Mg|8QKoKaAf9@EptW{pb{8R#lL%Py9joTip)x4FaJ*5)}qjgVrZ?~{fgOP;c}#Z zhJoG0g!|JaJO6OEncfCBtJnO)W_t*a>t=gtzqw@(=`%!ja%j_5vwoj>0b0*a;0e?| zyw`bs$omx@(m#~!PHJ5ut<}sEn^9ti-w$XyjNMVQv(#qZjIeK_?yye$ZgZn_eQDbt z()ZtPYIB4OpuE;5Y?tmiY!}r75ga*60cq%CLd9U@=rXx>zP5Q$HDHYy4cQ)d z9~jl!n}jOysVy)&o~9wN$pxi6_cqMKxAq}Q($+;%hg|X(RigDe%(0?xrx}WBXK%(u zG)4i;^F5b|IbhcB zG1K<<+2$kd=F3xT8=Cy)ojVV7b(t5oE$A3B>qjJfE(U#fV5qq=paT=x_5l&HzR}Jf zJWAy^?m}Zir|jY|V|_>od#dUbMyJz3r z46)WY%=^YB1Av_fadSK=5u%FQSQnRn- z;A;)L)a#UUR{oI2P`0^P16DK=rk?%eAPih4?=E4Vs6zr0P36#FwqBCo8Iy4x63mB> z>G!gvUkM*azh)&}XwOZt3+Z{I@A;uH9O>6RQl8;00ul&$@>{Md?PIF>^kx>UC~F?b zZ|EPF@*BEVZ|H-Y5n%S)N4TyhOLluJ_xN+0k-!v}*=I}XJwCG8EtL3V_Ldg4I@tuz z;+m#`;rL+Q!t;*C;JtRAJeTh^g?qfDsjL0Ya3O;4<9nWY)T z?c~DVt$WN5HtB^uLAUp1BXV6k#$MN77q07zjo0*@w#r4 z>vB^d)6Xuy7=G^Dn8FGc0|Z@gXt!@hh3!_meFyibwKcow`Kuw6+W`jso@~Ve3jF;h z+c`G#H(cg-#?5@M%lzQIJXvalJu}}lZPM72_yrl;*l)S=+pw%Mz9IO`{C%eNd#Hb` zBHzv077EXDYrWdHo4&Sfwhx1dHWta9l7~`Gb-p@3F=8QR%yk zVY~{Id?0g6(3fOhj#ctKv7{IXfAC(h&z_loFpfy&>wkMw_S(`hy86x7fDY<6Hf8g% z6FGo_TIS1{jsszJ9u(Gc8?vA9qH>+v)3ml z1>Q;Sy7GNU8Bq5_K^bg^fugzFr=DFlkMJx=1KGpXCB1z|g{1M9_o575NADBKCOjSa zGsBKj=)-JmFxa3m-ShA$fy{hh>Y)yAHb@i^4q^qTg>w)^KE3` z{n;H&j!;ZHuWK6ZdbDnz(ssrEMN|9A>{5S9kautv^&a2~xx25F65zj2j+YtcR@KElG+>gndi05;-WuvubswK9Wf8j)1m8ZYKS#kHn++lJu|DE^cV`< z>xAy4v(m+B!d1~*%)LUPhravok*63}9vn>(jO#J$t4gevlc_lE=(}gkE&B6VKpa&( zeK(tnd#P^2jteRK?mpyh{AbTPG@Dht;~th|;jH!K)cn=FLRb2i?`b$oeQIiQn0i;? zFm-G5F8kI6-@rkTUJ^I7je~ktM&dn!`Mqq)8h%f!4Ez*i*eU~m25sn{k_>rLq4+Z( zy#6;6>Vxb|BA)M9Q$5+~8&8hDYUP^h#!0$dx?y#(1PMW2(2%iy-BOo=z^J8T*|M?T z60Q<22I7-p_KKAom)}vWj}%j2ggf4m$`O|ZJLhR4FI!&{iSip)uM?0`QoI-&&>><~ zf-yK-`icsPb?hMAcEuzi2)6~TC|H$`rrEumTiOW1Xu?4lO+7D+2E|j<-{Fhg&_ozb zDMiG=qJjy0+K9+1VGjTeBLlms2`Yu9U(mHgAWJM2wZcn}lNsu*r!6>=@1k*qYQRz?Q@)z;+QYz$P-G z06WcReu$=`U@j+I8IM;K1*c)Dk&A+L9Tnpq^p*wbM8T9{3tGK&+4?}dNTUrSaLqf( za14i?-Vb<1*8P+mhGR$&}_T(v++LNbPQ5Y=EB*I|V46D*TC#hhV zEQyNfOa;TlqhOddLMv389oQh+kQWSVZV(I;8AmWIm+u54!M3~%EJ%2zv4UXOCwRed z%x2I$u(29Xtc0B`*k?>67^X{o4bomJ431&aRhSe6!^HLB_M$?G1_3TxNDvHj!68VA zqF|T=FV@t`UNB6J*w6%mVT$Q+f?${?5)p6+CW2uKs9>1ayb}x)aDrh1PB1Kkbv!=q zND%LapzONRMzAfhRN|SU1>`N!!D5DZ50elViXJ)BGPsc3^T7WOd%Hz zf???@3Wh0}N62yFOD7m6+8`JvB@ql0YY+^R65gCN90kLy^i(iRG#3m@x#U&ZAQ+Ba zxDBEp7$z@~28ST2a$la^f?+1bi-Wm)KE#CuX)uW)D5+5vEa@>qP9h2>D~ZV@H3)`f z1Iz`((ybQ^C&5H8ObbCUtVf_I7}nVJE5#j>20c$#!#9Q+cG&8-vFXt@7rjYwn0S2{+cY9zIB1Y}NAR!bWkCyEcd?mk_;)gFzaOgS|1>nWt9g zQYYY*4+<{;mY@>=ODOnDldxx)%C|<4_)4;dBS$!q_)^f5St*vtkEIfue4xK-)X`rh zn9!Of8XaflbZGq?eAmi#tMW<(F0NFgbnXLAB*-7XcBYdcS4yC}ip-$gQTShNROQB+ z&O#RD1t2PpRPAh$;hlw6T{(O0iv0lkQHFUlG(Yrt+fkyO*J1r!uukdvhZ|k zJ}BxlDMWI--{^&}^Fn0ohy72U-oWWZZT@|fQN}}T#<;R%)1TzlC}xx{il0!_$1}|x z;Ny`To@@678!($ZAz(Hx#cek1&K{`YaPH3)gvR@5rrP))*<_^U*)OGsWYd*s*m7x{ zIZ!taWQcxSb)xez!K<;J6eR!ba_mo z%OH1L9uJR?Q6&OtWW_M)38!7y2e0hckB^H_5c(uE7;4LP1h+d|d`| zA`}$EITWNxjZlyzMkvTdJQPG^LMSNBcjNS1j=O*WPjW4?iG{n7z&jqwl%2*ynKYS0 znMC~VC&}`pHnt&9Cbd&2lc-d3P^Pr(kpfLjIt;oDG@WjXGFZQB3+g+bE`!v_0W7*G z=rZJ8N{#T$ckbG$ciQcPDNG-CXf{c6tWUAk?JxKaF7)N2U*Er9c0BF z3BXeb3S=d1oF2%EmWq%S-Hg#?pilv_3h@Y8k>F=gmQaMOh{O}tM39xQK8`K}Iev4M zw#Mo*kUxnogR~tWE9NzZ-9T~a79cC>DneG2%p>HakQLDe$cmH%vLe<1S&BTa`f(bMw8S#B15s!JvCr!Y-Bssynq`zFt!DCNR z%OQMiRd&mjv0pVC zQ`#3m$+|^>Ivlq>1N5vElNp2S2%vTbs9U?b<(MhV7nD)oQHfI5ep{91K+b@`k#XdSqh$Y$~*k7sZ3+C78T z@gn5eIsvq<@hy4$=v}%hBN%uF((_-U5kxuz>8)P9c8&X9U9sv6q$em~WDm;6Mk488 zPdfwYu~cM=#+WCOxmwwA2GVnn(iuokVGN#_GmzdmEHoaLGmxHswaZMLf%Mc08}Ms* zy$EgbC&oO<8Ay*k-9c+XP@^%=LUTFEF~KDSN`#Af7MhDh7MezHax65$Ud7;93+YAc zobh|30O1Kb_w?eK4xPKG)Ke2PB;r+|tJ*K{96nEnMsX*EBN>6qgn4GNIp=AiMdb(D z=l1MAIykzddK9A_s5NT#g)Y0T{3O;(M(5fVtbqfD4UHcCp6xg~+K#F3qdj~3?e6;U z@NoTr)D#aunQDZ;OoRz`g$C&M_n9C&k@Y|b0Vr) zwtm?wu2{yfWf}{dIY~%3a}t#)p{Ud=aOPB2v#h|Glj6d}Ic^KT(uPu{xo8ffy(Kc)A>QLhyv? zay*?0U5-ZGqs{sgfFdY*l0F_?j*f$*K8~B3QaWf+l3t|CNx|{ya^yt1Tny)QIZbNB z)+8~~gAo?M}$%Sl?okAn}8MqPW3E*HZIUCyPYbUA4+ zq05CK1nOI!oxBx%g>;U5>bJLY^)s(Q)W< zv=Fd0N)+jGBzUryR`zr`YQ%;npvzILK$oM5z>y;>1QWU(1t!z*l)+9&my33miFaX$VScWXMT+jF6KMM%UTgtJtn1=R z7cJQytidgq>(DFV(FGU_m%Z)7g9~w`x_Ga*ut`=X?&*vuh@ORGGjWHuuvWKySOuMa z*g=4xXf4gy*$eGpIMt3m@SLhL60)#iumVz~C($J6S_=0h0n3v>4BX1#R1;M#D1t@bF&wcM+jcp2O_ zWcw+XiA%JmA>48{)o&OU`*$8>RrkkO_;pOj@9F&%%Xs+nRZowlGCm?dE(yP&W!lQ- z=bX>FvbvX>TDF3gPR-sRaO_!S(F0b$-?pv1aPBBxI!Ooyr)P`7Y0L*U*}j2M?gh4| z{cmo38Z&wro34#wit#OOc8_gq`nIh(hjRq$eWOF8wOuvtEY3LVn2J5iJnc*kzBd!| z$u-l}$!L_)`FywFN6J;0oR8Y3KDduhYUVzEahQ3Rb*>V*;B#>u*@=7X=S`oxufBH_ z@94F?qqcWo6g#0ut9Z?=c3vx$O!xHAe8ui>xBa771)OX9x`DQVqY2ItSEJk*OsDb( zyTJAq{3(l#L>yvb;aFTter6Mn3e|pdAI|yk0$c5cojL0f{9a?7wCMrcM^6uDi>lt& zT{cT7o#C1%Hb(tx`*^TGr04J8$to_6Bc#a_7{uv_139d&Nk#gw0MPQ*C}x zW;*+M&8Cq*nj)5Xuc&mBU}T{l$y%n>YhTcOv8o94zu->0;08%h6U4tuDC?0Q2~9;- zkX_T<%`JWOUb}(;{*m@0?TL}Z>})XfbEi)MLx0)n#?Vg-27an~)6Wcse%#vYMa619 z1muJ3WJ#u{Ad~<|gtK&pp}MBpa(o5^aZ=`psS%MBu{&UC0&VJ{XZ`x6VsgXhdMsUX zD65{%B%GXuq@YJ_^rV@Z6U-Bi0j(!+jR&MS4ST$uL#qEuB9!9i39@n;@OBy>i?=fh zg)5i{IV&F%ZznV0?fJ)c&|D`oBJYHcg}jp$kavQ|K;C7R3&^|PpWM8ML{9*Dm*N8I zdE{NAPFtOz*H)LrsI7jI$h%)R3G(h!9RD?DtG2q2MQwE-kK!F4FM{kOa;FkpojIHc zS0_8c)rp-(TwQM8F>rOVP9Lt$>MU?pi3bE-`Z?{mI*rQHphgo@T%Gh2z}2Pnvl>^I zY4Er@LD`!W6PLZhC$ry83Zd)P;tX&KgibWoI43F%JB{pa)bWn=nj)oy-39n+5gGF%c8|7q>t3Al>g!sd+1n${{({v zv~wh0%fi8#*3E+A0W^OYJ@o97Y4zQ-@u%XRZ`f|LsPHF$u4Yubw>;cs#cv-z(2VIR z;lqS^FSzU}fycMCj`mvtJdFUNMlgH%-z>|1u{2ej{TQHZL3>N(tz|0+u5-8I;M0A8 zl3ljf?p-h!w(e2eXNQHw3&Z$;t&6+F*15H+tv`y4WaEJvG~q>;c*j{%bJTV$1i}XD z2dpfa`V;|075wx*5MKin-ac=rukUebb3iQ>fQ7dX)dmntfMa*}?3Gw|D`pF9-)Ied zTKcl>Zg>bHuC5FKFzfg=)|KRRiHN1n`n|Q^_U!8G%U;=}IDH8@0JLT2Jc!_HoAMT5 zGxrF<`kBqPllff0xF0LoX?9zj8Eq02H^RyX>|TKOgxpNiwrAL$pSHTI5Yh39^BYI9 z*5L#cx7@YuYP-P6al}$W&nS{1TRCd)1gCDPEZmb_)HLL>p<6$JZ$bPc{$LZs>R_64(vuOtPYxUA2u83bUgMH&U_ZuYjm`u zJ9|x~I{3+#XTMx|Y~j$O(Z$iQTOJC__aLaaVQ?V3w4z;oXned794i(9e_ig}Y^u;ga+U@gz0a%~)z@wY3hA^(S|; z9g-+dW$i3nNu6bW{T{q{Nont3tYm&PwX=G_IdF83d9dYC&aP>q#;5PrxtBJ+LK_3t zJxdn9QU`0L6kZtdy@&kF3|DppLZr4F7dn%hB z-G$uO&&swkW1{w_@6P5Fr{#~&>g-5XR$hHHss7ti-Fsf;ir?DgZmD+jouu6Rr5u94 zFg3rD4Ck9kIku5$1Lih%0CVwvhV{fa%aDKjthW2iIaa-Ws+`%*IWjnSfa8(wIPzAxtci^#9ekb9Gitjx zT+eGOwsi@s^|5^Kzp-hwUhnU-y*&JOo*j~x`Zi|k^Be7<;)Af~?A*8Sb(MO3AbVxJ z2iH}o^2LpKsdW#?=g+p&C}C%DpV)NHGQXeaJ*IhPRhzk>O*+LJts9^IW*ry!EB}~O zK`6<^A3WQ(?I>JCh|I6pzIxp}yk)1sFwd-#H`l{#TRwu5$n z4T86(TVj-1+{9>;xofJ+xB{ofwkNE1d20{Ll*aeN zHG6r}$;FjbMx0$at=x-m-wP{yQKAw#e>Eqc%&$BeuXlch*WiqN79UJ=%nNo7)wyY3 z>dvm$2RYvjKWpwQPP}yktvL`dFv0 zhF$S8udZ|_1P)@n61LWd|3;Q0Gn~z763@ZmpEP!>xI>1g!kWDBX!fcKrv>%TSssy% z@N?bS+e&t(degqDQWtO9uS)06xzm;vN*Vljd&bITIvIHIW?#kvlw{6mGv^+{tG0_> z+V&l;|98T)%jWZ|=ffp%t6P}?Fc;)qmwjuSKj#J3&W-2YDg&3jfhYf}D}BUl%&sd* zg`e|J+9$iUFZy}RwsGG-*)6ZS$;U~BkGlJpnXWkd)8W=+FNF=T`z68#xcm$oU?S&p zMY;aCrnkm%BUr3;h7Hj2Y%wgaV*T;?0ExuELCT*J0M1DKMW&+GXaS|4DT#kjUlh#i zjPzeAC}*VqV9;lz|K4I1&)!&zRg!r6wd#;I1TjCsGtz(OKasgcG=CxrbRt4IBmG}1 z{&`acI(e#p`R$@`vr@z;%xh7BPNwaQ^j{|?O8iBjxpMvT;LPy(&Z@==DW70^# zDwdb|GkIsE|4s`3Z(@?_xYXw4L**w<`rp8C=Q9>c@p140F8{lkjt?-ilwCCK$N}4P z04*F*sk*a)kR^Rk+D+QeKcce87TM>6Fp4KTyT4%YxifHXiQw~w~3tQ~;xnj?rlm!54CG$&m z`YXT}MeJTupjN~?2eR4dh#f@>>GFze33F9Wu#4fUh2#z+6t#o9_*qO-?Lri&m{)6y z>+JOI_8kDqWV|K2S&_ylteMr>J}?Y=`o1kHJ2mFdrew>s$mNw$JNO_Yn%>zSWxj_2 zH36D+49K-i*<1%eSdb{ay0e{*stw|u*Nri$_L}-T%F@^I5dOa+H$j|o= zAcct1ALQND;Q^K74$x%Jmh6fYCS_>fn}Wd2%5=VWOZKuLTzYzn2$u}q*%2>f_z_8@ zY~2#2`&kSB3#C7Es~y>kT(!NLT`Ehb zY9D7fZ`|HN{+~^;+sDser1@VtW`3*YKRyNZwOfII$9Aw-3w(RC-8Vdp>9QHX=6#3< zMCkKdrM5de&^_BK43d3Q(1KfO_w}(_d#kc|7H6+uwRW24>@(-KwepBi<@dKN5(3Dd z%6KL%{25pH%dkbvN(LuQ*R<)bV$&~^ra$XS|A{MoNvUrTg}Qnlju32DHa{PUJV_M) z+?Gxm$vVM7kLgEgU7j(tksRgi5UGx;ziZMgfS1F(8j=pJ+#U0>5>b3B5UhnGWIhW zvQI43ec~U`ag7_rUv6&PDLz*6TgCe~`K{s)OO0E_LzHRQEA;U}hAMl-=QlTQ7JI3{ zK%NeFHcH30Nyb$3+nfB3@z0stF^0Jr;eli`dUAsOV%z5I6%G5vQ*pWcX0lwq=a6^H$jm<&y-OIMTYDAf9RE_ z?71IgTX!5Fooi`J(|??8m1*HZ3dR4QOXeyH$^Yt-xr9RUuN!UTdkx9=x#SNs=CMpU z7XDXVYdi?!=l^-OwX5o>Vg7Ax56JuFeW-?)%+p8AbG><@(5` z?5c(Z_jo4zlTckgy(!5)xwfBG6pvOj%%Q+z`WlN6Tv5j)yDD6)B{39eia zlU?}2sYXhe-`wmZ|NmTSdtf20Y-8Oj72x}&HeIKp)o)fH5mse+uTK8@^L+JR_tk$` zYP)}-qdWe=y+|3~VYfFd&x1x6?$LYf*6Q%lA-G-_(*4${jwUGl2$QvhX1}+|jq3ia z?E!IGGl#qW>3i*dv&OE73qt9OJv8zav#51&hrB>X?tzAR)K-L<`JSm;xt=4wrQgXK zE=M|ayxQ>R8=?=Y|14?%Vx@8}O*VDSx~Pa|23!%*4cJbf3}rYvvvL&KI1R`PqMZz!IFbwK@j{mykiA^1FDkEg&2XT` zxPT|S@T45*>oCvFZYY^9WbE0SO6Kmij_h?8yga+MS#7{>xJ)G0b56I!`V`cyMfq23 zm!7PqcWwjr?Q+)>?RSkj?RSD+`&|;F_Pg9_wL2?~IlHqG zigstUk2~JMr1((5?yS>w_iHg~xBGabQ71LA;PZ;IZW5W^MAMz=QB8N&YH+wtFgjc( zJJEC}Hom4iGhehItG96y3$k)&5>0oiMD2F6Vwm*Af@~6V7Gy~nV?mZQrzNhs)hxGy ztebdHZtjp5vatR^*Dkd?$J>vj=uL6*pb7G%?Ww>jh%WMvw>N;|z0S#CsRAu zbSL6BDM^+mE8M)WwaH#f?Nrm9s8n*A?$WY%X|0L*J{UFKX*%7hWL%SIx=W4RSS(!> zG~K1kV{5g$x=yYg!--*7mzElamG%<3cIYl>wddJEtKBtG^rP<5igj|WcGrf+bFFq) zC2F<1Xl@u*;?XcH4IEReT?*!gVYOPLVOZCH)N0o<-Y~3tSiE6aBGE7`byB%Db&7Ir zX)}>)lb;%f^-*D3sULOX(J-tm(xO&7xvV1RM_qG+Ry&d7(rTB%1g&;yOvAyCx=-+i zVPiHc`&10W(xtvAX)nsM8Ey=dUXW`O*S*CXhLz|zhGA(T$h9d^Gz?3EXRc}GcR2la zYQ%;nFbqpE9nKYb|3RsptPo5L!_tQuh7|)c>PMY`^P^6{`B9g_PN?55ZJZv%u(UL} zgquPI!>}P94a1V)XV3|bm$4>U2BMR`#{0fxNw{#7W3t)!a=!XFhGEI^8|nD^?c`5l z7*^U2Qf=lnhQ~;_rK>2^req!=CzWs$Z7>W=N@5t6m_N#CE%z!3Z$%o85^h#{s^3mD z*Ke0{LBBnQqkenrg2u@$=(m#>l-kJ(K~iPDpWS}cxt=i+ZZ0fXgXNZnprl4yu#z4l z-=yZvw9NuZ3^LlO! zHk5KY?NZ3;w9B_ZBGr~N{;6Akm2ZmREL}QCblRnZ-1@5&EXb_=*MYN(m3W{K9roXw zccGJ67fryfn`38;_G7HF?p05MZpPJ>E1djzM4>9R``U_m% zteRykW75+e05JR57F5}0pxRTl715Xfiz#h)qIolj8gmx{mQR+ls_JjNM)XYT=AkXw zn@ghDRYzsZ4sJC6b&Gx29GQZyqxt%jHggT4KT-F{t)pJ1)=?LkH#jAfR{)ni{BCot zi@mn(@9FcmQ1A9b&F(;hsWzZ7k-V-r-_|xtOr&s+pp*1nBs%SyE&6K?0{7@;SN{Og zALLjsw>y#R7IernbG^d@7nS?4or)stVl-vNU}jw`cPcWNz2W)VaOc!=+5Df)*_G(~ zX6EB10?fq4*(*!t4iGe;F?Yp zKBt&J7oOSngDN-|qh5VbsD8+g>he z9Y#0DT-94!`_VnyX1Y{m3)Oe?Jk+Hry<)85ETYA>);@;u&}MFuT-smzOWTmW=EN^; zLuZd%+PkvL#$MX_D{RZra4}EX_WJjBSCND}UI5@}yxVBl>Xgf^ehupDs?}dIpV(}- zmPKV5Fc#)QH)Gw0XikeFQoFk1mIS(yqCy3VKRD=gtKFKIPEF>v2i4}8mHuFmSYd4* zhP}Hb>BC6J`GciY*DAQV`A?fg@k-PV5i%gpv)lS9;VBg(QsRN6gvbD$O6LHU7xtSM zi~4F*;YR^~o6OH>5ZGXinAPfaK=*kIucA<89}P3rB^DRXHaj-kIpYi6mx_J2w$pTnxe*`{yv$T%Xg%zV9sfr+!tr=_Wh3`}HZsDw=8Z1a1Q zmwc=w1}21zaAc}Q^tIotU4fi=8eMEyF-qv&$k8g?g>Pjdqs6-OtK8ovA*p<16OU6B zE$HkO=lAvXZKK>*vlYGMe0UT3%hl}lP1%(p=g+ehBL079Y|hun2`lRDP4>?0)zeUh zt8mXA-{iH9Jq;!^pUOI`eFKAod(l9hY7T5-RO|&eCd?M|BJ3;-z&@4 z8FM}|Z~GX7{Lh(tWWK(M9p%KUf52D&$|h9mSc?N&Sa6Ky|4fnHB{QGNRHIjIQe;8^ zm?}n(rTXVEchM(TEyf%B}z`M3nl_g0>SnZo_~#HOtEB*y#s zOg6u=`O|x4oSFFp1d=7RgV7Iune3npNOyHMJDGQRspy^o8KBI~pK88)FT#D9$iU~w z%zrZZF7Wc)^2OW#1NyC3A!wI28?9nA_wC+o+yBaEsqqPWjYT^tFN+zre((Sl{^ef3GCUChsdm=cA@U+|N2vdy)4s&$wL1P*9`&GR+73wM-xoyzvP_z}D9sBP)rWox@^ zPfKp<;N}-*FT3C(e_GgCcDF|NSDI~xb%n<6{|@~%4IUh>+Xo@b)w|8@c9EI2BAQg_ zs;L5PS(aobmO#QtZf>>*h8K#pl*PIQmgW4?U}fIXLspbWvkRN+HB4R1!)CpC?tE-v zh`76?=E*Z*y41KmAKN507oZGbf<5Eb+TLBgb{n==VD9vqyLI%xpw$-frrd)el`xiH z6z`9{iA8yruo2TV7l}geP_2G=SZtEJ_ti*wpjYgY%Yd_aFYrx%(YMy`#H&`Xr))>H z)RpJm!ihue#$;xr=Be@W=Z=U;lcw05{io0xHqNX2%yXyD8|~Evm2pEK%dUB$H1`r; z==%#X%igXhhr}@ZO53*!jqPBNeIn!R&OE#M)IGLsLdh*t`ah;_U0AEt7_HFqoE7@1 z=a}7h+4%=X4?MtzPN6TCvqws$R(my@?uYKOhpO3vrfhE5jSrR=Ezpr~FZY;@Td$FJ z%-z%d#h4e2V4$b74k6+kv$N3bervJ2xe(6f02RR$Q=PtXw-#%hyWG!P)l;%t2HV&0y4dg#+xhD*dz&Pdp zRLeE@aemgl`>>rQ26%YZ+BsXl`bF7)DV=Xt>7gs!VHER!!MbC39N$4P9r6SgA{Y@D zxa(}Yy`x6bw>0Sql0JC$$enHnf#Wt)dvlNN_NnKV%|G9jy}HEf%+}3%jAzJ~j##qE z=Dk=9PhkjT`f30QbiJ@Y&lL z+f&`dxZe!-ebz1--SKG6+@v?m+~uAOIJ{lvmDpKnJxcTcugf=o-#M=N$B)tc=V*Sa z`N~Fjx*u~``LOL69q8jNR5-2tyqs3#)8)UO&1r=RDVwLdc;ZdEggtK+xHjPl*3gx32ylcpxA? z6Rfw+C(S z4%;h_G2T|@Pb+uvt}q)q&3Ss;^vSmSotKDS4p{GJ0p7_=@=A9UfKpl>_@6!B$lluA zZ{eQ2PLu6XzIrZgCVhc@Yj#63b#~haT^Bb@!!Jf9dqd@sZ)MjvXB`rR=v&DaRI<0Z zS-=xR+3j`N#nZ~}Je2+Nw6YFTM|7y3U8b{C7TadSb^)~UgMGss$Oa(lW;ZwA#}UDA zu!lkm3qxCWpEl*TEv&FT$NYI!r|c8w#wjb~9%d$Qy7sx*%kT^Fd3LYv`?3Yi_7>h_ z>KS6CcMeg`=7xr|nbXQwFFc+& zcji$-lF4qLCihh~7v)0fVM5E=a&_uCBwO>oD*ND0%x|;^`S734-RdUE?T~VWo0`p& zR?d=E&X(QEtl;OItX)#imDJ}->hl(r@#R6lpZtug*4VkLc8*kgj#PW@B6ly;MF>tZ zNHT}@3XQ>t*W%J3J6Jm>WCr)76;$D>7iuSL0&n9**XybOdX`a}9h?j)aMq!++IA~* z--&u)1X3aq9@XEi@^+CsKBH$F*5{7ti{y{bUDT!Bafm!9+iI7bI^zg`+*KUmj~hp* zb-68fy2I)Tj`BUnIm#!}QMxYqbriR@ayDBI!}CC#rUQAHmiaU7(OM7Ya#|MFI3%>x z7urLIInoOg^242WdkTMj<2iT?>KWa|S#MxB)7=uzd)aNxpU|F|n8kd1T6cutKz(OZ z-Oe2tKA^d>3*Fv4^cekAa6X=0Q_O`p$pKN{Ws zhC4P=&DI`|41^<(8;$uy*;n|3##`yX(xYkf}Q*&oyZjK z;=&GuE0fWF^#mLGrW@^t8SD=KEhyh@*HmO`M|CQ77WSNAyHAG!a`m4bJH=lrT>an) zHoomSI>j{o(W+ep&5+NGbLF9ygFGNB*WwldYjCD~!9LU}pNrsymj@VYe_;S0tYX5* z9lMX^c1mt9?s&`xo@1x$%)7Z6XR3bl_#68ejj>kD%1-kOalhRSiSsF0)!{>8?lcF- zmCe!4{d%?Uc~09lE^DN7@{fgYpSzV$yIL)q>0V4inbe_ku%0ojAvs}Xdla82m3?F* zzLkzVi84sF-Rt>i(d>;)^K75l*lC`d+b!!B^PRWWo|JDx9GPVqhJqHqc*+^tC4O}f zTz1|y##8--Ji~Xa?DRxKxGgOm%YJ%I4Fx9ZgwuiS@u!k@>B(xxL%R&7YeckFpiPQc z%@cQ!Y&o`7pi1Tmfhy@z991%xSBj84cVO+QlE^N-@SIReeGG&f5v1L@e)-ZnW;;oK z)O#l*Est1Gx=kdD5)E=i8V|Hcl07ZbbH#)fDI(MYEmA56S|pju_CU1j83g18f+U%d zKR~!hkffX^NRkx@k_2;tq%thlFMGumB7l`?FIWtcgblgBAc@Ltps3V4Rf444R3%7C zV~!vxp-7O_K9nHoLj{6l1Ird+=gCthxxH^(y-w&D$0AV{2*2E!gi*6GkOfB8!r&7$!YoR3MkSAF!lNb=64kDT|Dv3%Z$EeJU7JLUua_}8Q)9EHBvn6oUkS|iKS^&eT5TE??1-2>!VmP8`Uk~%5Nk~&3}rL>u_ zEXhw>=~P&j zbgA!M+KbFeh8x4A7g(0WQWj@-)FgXnDmR4C0Yci^x9_IJOt7^3o1knL-E&{W+a4_nsN_r5vj6cA;7qB za2s`Sz|uZExUdf6Vz0-qX|92CQCTQ%d%(v#2C*y;>B-i1gOvZ{X3XpK0mNnV&mS5Z z66xv#rOpm={$Xs+d&tSJ?{#7!-U+?~|K;W;cOk;{iM+lWD*&Yrf!)`XJR*Sbn{Z_Q z&Q9glxwP%&cr}-)2XZf=n*(_ZQ!I;wnG&Yxmk?<=o{@vpZ_I8LA@BkWn(Sxz>+B-H z%wGl3c9g$)xjh9n&OW2ZE(}dAY0k~l-`uo|tA0?dfh5G)!zCmKx&{>Ne^Ujk|2+r2 zw1z8rorsx3bL93nM85*n@bytzAej1xwiL&EDd;l;{vB_m$b4r?c9lv9E^*x4(`hF@ zGjB@e1UnjrGLNAQh!ZB$g$th43jKwM;42uR-*0ZgJ^`k$nCRt)C|K2kIWPFal2`qg zVyOOS=B9`10~B0$94)@<5GIPkWWKIRmxf3;cf*DenOuOdXHP44AjT2z1(Dmv(Lu8HFuZIl#zKg`OQ{8O~BjtY9E>gv?m z@Ry!HqM?y;Rd^uVY!g(L+7V4ts#Te8g~}q%xN!H;#vRxLn`rJHJlx=;YRLBO#rjj< zQH&lOt=eH)zJ}77>7E`cRrb>|ZmDqQ(YJ9_1iH1+g~-pkYOt-!X3u6jUF>?b0PR6;Y{Cyq525)$f_48M@Zr#%{<9-~kvB*$uIaw^erW3_H5XI(O%x>Ab}5$$qUVABN)t z;6F!`%=cK(Iw_czIZM{%#vQ`xyr@~Sm3;w!9RZW$r8#>h7fYAM-k~jU(_T58UE9=g zt43qPU%OjoRMN~N+OXc)1@blZfCJ+ zj0ya;O80_pp5I!J^RFR9LAgx`-fxgHx+#p|hLp2cHg~tHJn1>-PeGpaUocr&D*f>J z&*QfQCMmdNspaGhS%9&g9xEIZN-v&e!ki$HIk_o41*0gbS&@_LT<)h1V8Z*s*Va#i zGzs~@I36cF;>h9N!NfrnlqUpHkV|o*AP(pL^Gd$yy(ow;CNByC8uQ=!gc?LU(oFb{ zAvef!NcOTE{d99CF34x{6B8GdQXGkIxriOjgW6 zf?$W>+6_0xZz{f4b2$&#j<-=E#!sS+3i*0b5saciK@KEER%~$67CyV;py`15PDCHt zqr(7#F$sE&q7SkY(Fd{dMIT&QQS_mcGl}Sf)>6?2Rie0qtQaOe5q%^vC;A{^jOc^3 zMD)RpEr>pd2O)>_<3%6T3BeN^JBGUJMW^U>-u43Yzqqo_o~tCz03 zbM1P;HMpe7L?u!q7nRU=K~$0tQHJeAC6ab*QAxuHT=PzH62pn)#HFQ@6KOt?oP-et zDM+53Ucal5OHN#~#X7m<#I?~NIdN5@St)C`wVZA#bZf zbAuFx$Z<(gWMDyxB8?TKC_ceUQDQcOJ{2hnUFzG9_6pJx;;FPmqT@(QxUe8Cp+r$y zqE)=KgmSU^1kw_U6{ICJ5kw?pg~Z9A>gDXGQ0oDoRTz znMcS;r6oigq$Q*z(h_0~(h^d_E0u<$w1jn>N=t}F0f`h-VM!E_#8%xCUl5Rx7o;Lo z3_()4!e_aFgzFh2AmPG-R736OM1x*HqTwhY(U=pEXwVBtTsR0wT$Lao(U=#IxST{l;u6A#g^PIsiAHYX zJ?I-`({qW4D}UDpClS#?>(?(8`xkP6U%IM8m}Laz;4ic;pCPBC73-Hv!&+|b zhVTI)9|6vIg=BcKi3C^Q@hVqZtVO)x=Vm#v#TTcP94aJK+Zx{BTkp)~zM$nIfk#ZY zF!5F2@Oe9N2+)G!=xE;nnz*X-n|;XVzIV8<+vy|(BeXu_$@Z=uprx6Dw0euWbISW#}ey~|g!rQI1_lHx^z{3Rpp1!`r zc2F$TqJl6dx02tA!eq%@yNIIm!FVStc%2lyuSCfkkKqD999D>`#9nkHuxh<|e^;P! zqx;({2KTp$n+FDhQ4n;R(%4E=p0d|BGt=?zPo! z_}&=xy}Z)vmWD@o<-U}^t~UUr_MAgtv(u$R{wazmtHdau++?p7m{OGBx&3-W%U&i2 zjQJef1{|uxt0dKR5r^v9pl=1lT+qa^4Lz5Jq%|g`it=T43A(l2tuiW#XJuK)21Qhy zEH@)A6QVm{EgDS%^vs(|gIxu3>IL*$amC~DqG3^70< z7CWXS5|NPiIxM{mvF z|FJ@-0q&I=;Z#O$fO|L+P{Y~|<{AX}xttOYj|pO9oQKM7__%M;Pn$xbj^V&h}B47!NflCYt3 z63kXEDxs@WCE~PX#W3j!W}CzuW=p~t%$78VcLtR3SeUK!<1t(6gy0Edwk)Frv!zkD z2AOaDMDds{>EmIxbR0e~3l0soYMj1(q5DZGTay@y#VkM*Zs^J{gvoA052^B zfR_?QfR_XhRBB}p^-?1?Gy&90u>#af69L~PD+Cj$mjVj)^4@k(F98Sj3aq8Xcp2=3 zP_MLcdZ1ofnjGq-Pyy-<@d)*ja4Jx*uRadcOOD^CLFmSTddZ&z>Xo(w)XTiaFzvZ; zfO@5?2=!7jkC2l>y+j+JUQ!aMmskVTOG}WD|L#vZ|uUA zEa1N61+bTjAxJ8h`z*(Oxt=k&FBcZTUcq;LzNAK|SJGpIoCN75D~ZV@of_^-3jz04 zB6-ApHRf<%4L&P~@f`hg7+8mWV}OB)rF3}tNN|v@d?9#9SAq`GB_xpUf4**(gLGe1 z8U?<>Kwh=GA1iU779M+T3E1m9`)dmwLL!{Y1Kq=;1A{{chIbt97~S=#ca_?S$y;o4 zdCVijPU4KYBS)&+>@9m?A~u5o1HkduE~QAcEN9NO)4{oFcBR9CupKkpy?3Z~KlbLd zDS>1_U3!LVcY%Y>s=J; zq&V3R(H3%GkU%LBSCLIIx{7kVxX6IZwg1T&A5PIN`Hd=MBN!=gycy5HDeKpWB$Dk` z@s`=|Sh_)kkHi(YAb18&S+zRVx0y(vCf49vCdTq#5#?6Vx7xLh;=R@ zh;UuZ6YDf`lOxs<_QX2n(n+d#pK|2`qT&k$$*g=dI7B5X&q$JoRwT_qD})4E`PVnh za?nas2||*Pd3yUmIa=q|s(ah#?sF_MMK-$7ja7sKR?SUK_7T){7i2Gn1M+3?=WNQk z2)$01N}w_p)HAny*&@$4b?b`-cEQQgIC3V%>Hgv#?BJXWY1xvNr(VG52wz7i4aq0o8tNRrm$EWrSxlx1L-VA z*A=77i_wk6Xk+Z{t5r4?uP{oq2rQd@C+6^$ub++JV7+Xs40`-eSeB(|q-|Jvw|ve~ ztjGw^i*<|u9w8+M%)V0mwh>DYc9bhf&ZNIpYnQ4U>=@1k+9ZYhzyLJJ0Oae5oLpke zGntBr6g+$e{GFd@XL$d6w|96q!S^wFV>hIm%0vYcux_>@g z{(Spj4M$tqh3B85W5q;o{-c|T5jPVb={4uixy_R}#e#h%KH{bdRds54 zS2mTm*Iyxj&Za!T?=$lz18rVay<>UHxVyc3L!IEuuJBqLzuliKI%EC{JvqQW!2PHD z1-xqIn(D?$W^?I=)x{Dd1XfE!#`<+jUCQM5bM}gr8<*cvtdF%>Hp9f$ty3~Tt(?Mt zf8aYuy5$U;T&;hhj7JLu1`n#-1SiL_Ip!vZ0Cwr(AwYL@cL+c-nH&O$1^aSx68edx z1&VyylLeob2Lo9!;Ml~^;MfUmkmCw>{S1!nj`)5{;W3HFzceh*$0-p7rLpAHC+#KQ z!LIqAZla*f08=P5LbvpO#)yI`r%&d>5oK1c?OHAxfAVFi8%*QIMqpuW^Im3Iqcjk_5RqAypO( z=*Fs5de?{v^0jXHdO4?2pOVD{N;pzwXnW#PIdi4NE%&my!(-5XbX&DZXyKV_POcE-S#hv=E4b zdK8X0w#FQetwE1tYxu^n!)nao*c$XWwhIRw+f@lTw#Gb;?Q)X$w@U~(wu^Zj+eM*@czKe?~j{A+l^?^$^Qj`wr2@F7`9OdN~3OZvIxkDVbWO{<4JxJ%-xOKEuR=>3S>dg=3}FCt;kMEpsCff zH>_NJ$Lu?nFI$Bi$;~!7lgM>etZGzLlsZvS(M3*!aXFa=uc$~c%7ygtan|BEv3enk zB%Xl9xugwYX%J1NP(-CSCwa>W(L^tqUBT?c}BasFZ({eHcInW>lbB#o;)~J!_#&cq(<)|~ExJ=qCipVCBrA85+ ztoouBq8qf+6W83Jg-FC}A9~a1HTfqfMjNn2cB5en7fq9K#3b}9q7o@AGg-FRfLXP{~ zUAxXNk_IhA3M5*H#2T~^NeQo68jf0stn}329MRnVuarv;D-BwRu?x3O3tEWe1!f$L zgdnLh-<^W_urva=Krp;lk{~xHq{@QH!3APtu!Ld)C5q4h&9W)E!!hAvCLJXS4qPav zxkc^K1Fpx1xO+atg#|=`#1NF!h$l#TjF6MS31lTPnIyL%MQ}kjz#LqVZauh=1i36u zXW?)Zzy&?kMsPu64qVWn2NyJaW7uIe=D-CFdT_yo1GwO-1aLuP9$aua3Ao@A!WV^$ zd2qo+BDkQ@n<9)i9%nApaNq*5!~h-YGppAvRU^1^;4gS~6|6$O(z%n87cI@@hUf&P z`1zYWN^u!JA1dBP8}^ktZWtV_4c3OLcJHI&Q)7nh9jbNPp4vux!Cp9a=3AMaGi3TV zjT~+1iD<=Z{5`^u)CWwS~{=65%Z3^`pwlnx*9ncm?#Db8~Z=DpsDQ;Q3xVVc^}<$m+Qk}QDlY#uqPwNP3ek~DgJa`VW5y*j2og+;wvY^!;%W`3W{>@sifj5<$Y zdd~c4irqS7eq)RCgCgt}?qk`u&-G>qLqfG{8}v@KM5o{w*5sVMH1Up-*%jqa*vG2d z+HH?Be`awKaS$z8EbQHi<+fY!)G;@E4VS&rZZpg6b_|ToHy5$&T5GnikGqKj6#23J z_7*rn`XddSwb@K%72zD-G`po&#z@=&TUl7Qa|io6Q0^V&s#?tjbL@g@t6eNB+iCdP zZxB?s@^897yRzc^Ks982@ALSlQ3p|8D|k-O3jW@sHO8}m(X`lY!H1OIFTLb)>)amG z&FJiPGSExiXmfLn%{yD?jt;r|Dz%Jv-fnb!v?^)N&yKDIV}D4BjCPIwF9@WqT;0=R zU#jsv-qSvJ=s;9s?&@ouXGe#f3BH}> zzP=9IgjblMQLbX)AP?wt^TIZZXCAY9#C%}OzUrV^Yv*^p{|(v8F1UVyl$!fjI9xIR zcgp8!X>ev7~<$EG5~rU0EX^ogKTvJ>c(*!a*XS6zfoWp+H6 zcTDJ%*7W1RbF!%t;Zm|4;S50KTA&vt&<+z_frwl&ArTQW8vt;8f zAfR${`3h(>$wpG{O(&G)o<3{My7BckE{MuC2?DshGt58%MCJR_e;?)`s-z{TsWhBK zrM={X%r*bh&DN3`$U#)O;v7VknESv^ipUJE?1&($mU$MNb(?}!DJB#E zRhkIUDOn+y0IC!?ezq2?Ghm@1*vQsmuC>U?0ji8`0J@KXe+7T8*20oC{pOfXXkMpJHqN+A@BNU9L9 zHsH^6AZY4KJ7-B?ig{6Kq<)}=H|oB<9knijLRx_;y8}>K9j)7|Ywh!5+;((SJGz{s z(%o#**_2nEMv#FoT6B_I?pWTrbmgk!U{*a7j4dA8#TupgNi3@9xcNKqt5QkaGdR@5Shp~ot3i9m|wAcii>VtfpUAs3pU7SdP} zZRplDe1sFq0!k^M!E2P>qlKzk?9pjsxmk^NPO zNZaFq71E8S|NDUztmqW1AbJL@@S0?(jw;90BXAy~;JNT2?w${Ee*;26VhBoV#3v*@ zM#xFv39^!ytd$0^LN>Y_tdMR!`zr~$Q=GEDXd!?Vdd`jPFO50&mj*riOT#yYom69v z{iQ+A{&L~K{&H0U`%7b<{pE5JVS`Hu-w-b5*kOyMV`WTxX(~>QTEWQL@AtfRd6peCr7ez?T#oAoZa2AV^8JWQhYxq9GC( zK;p~5^Z=wCDZ-FavfgYolv9pid|D3Ao>A?&hBteN3hXfi`)zwwi)m3%Q`Rklh1;@!H_dvDG*(kFy zrwM9NPI{@#%g6t5zBA&CjI^*?$SII*QF8(t1T$rxcQGI~q+ogh@ED_Bac)4!47t6Z zRM`d;Y6__8@<3X6wY&hTA(P`PSmLL|S3n<(eI2Ni$L%0IJxpasucidV4o>K`zA}=+ zSn^r;qX#_Wvzh~`nh;6B>R$EZLz@2hj*y$mtme>nX7`D^5&SOMp;PYa@qQl5j;<*> zYvjqK(3o>S-p>z@D5-n~kracwVw!lMia(6k@qs9KpR?5rp~7YoRG}{Qfhwj&#=Ne0 z+m9rv2a2|G>a9wjDS|4h433X~WO|?q3hWflPg*w}a0`yrp zY)tKRLIuqbh#%f#T1!M}hUgnbH4#-^)sGJy@&>{^{=h$c5d*fE;CQeFUFvCu7%dSL z231M(q{)F)lfe)0mTHEe8V$A-L-^3s1zYeC7L=+VpE$HgHZdrOUPu2K+6;R9p=*Ya z%YmvNpUuP`VYp5Xw$K7t1Y3~ZfGxft`qQX7;7c2@g;`+_Y~h#!TR7+eEFAj)eb7JZ z0W4gz23QcT1hA;4`d!kO0W8pYBUI%detVHZRlJ zNG8SVS{R*)#;{lxl5fk%o;?wncHG8&&QQ|o9k8yAw>HX1GHH@wzB6FWrbOTka$roh zydiVPP}*Ctcgqcq!obYhb+Ya5g~zg4YwIhk@4DN%O4-)DVk-j~{AG}XjNz3V zFHCZj1r(c79kRK4D?VU-oGMC+rjYfcn)pc>IXF^~(U^i_7$T7+7)d=@&k;rJGMopJmGJKz>0H2N(|0Yg*sqtQ0e?dzf#G1h4X$S!Hy!pK}(=s-JnZS z8Qy^2n^6=&aB4*n5Q!?hVRm?{mMzue_Ix`*;DoF2hH@0Cy#*Qb9^esGcq8s;LHGQ0 zMyl`zD+(!3LXb`X9hV!vkYWuK4~&iqqFxxYbQ*>)P|7woFsNhthA*Ix2Ba{-D!f5T zCF68S&^bk2l9C9zn?BtRa;l4O<%N++g+Dx95{S-zT@pk;7+sPoywSVE>ABGG2D8E* zyumRAZ*WlWAadA)IyiR8xGB~OBpToNAA2;u@i$iB%&K*F8RL|M*2;j(nBgS6i70_Dcqaex7WIB8eVc|_13X*>y!8z#>v-%R~ z0wW5S4;}ykmUXi}`qF%55gxL=5#bS>T7<`{N^Au5WIY}jCmFyRDu`59c>OmWwAMk3XBus zDbX_rDTz?ol|*=CQt6kU2#=v*G!zgtFtIO)k7H74z!aSUBUbAB7dcB4kVE&p|E1bJ!E%Ii^H-4r+4{6*lG|>JeiO!ZB?QqVD)M0aSu92T?I?4x%ES zwgN}BwgSRhTfx&|phFgas`B0%W3*Mis3f@)08z(!r&&0vMJ9;1WM*anmzRTJC3QpcGA{UcY@m$N<3b{9e zIJf~5RI4`2-7ko5#{u^cu> zr+aCe+T%O6b#M0VZj%oM6Jc20B*%s`QP8?_8ztzkXRu-{Ao5mS1B{RA&8H` znZTngqOYuq=v5JY21Rs6pDuuSPRwyt`mSz{W1FXHzE9^^>U})gJoylhaVSU4E^&F> zgBXqMToupbn|uhCnBDi)F&d3W}JXt-0}msiCGTD3Df<8`b4a5jx$6wxqf?9 zJgp4D@ymmtDECkqA%mk@xS{$EuPO03|pboyz~7+)rcJmzt8pTn2uO&^v2K4 z3Vnu5;HyUL(=cM!Dl8X3vMap*v_2H`~?NBuH>%$|8#YXGR^WtQV zN8o{HBDkaV;gPKL;Z>jrj`3NJl<4Whmqe)SO8W4~q|z@xeR#;}W=9@Dqqy!1;^UZ9 zFdaU9c*IIYe&j4oKn|aVJBSR5_4MHpF1?AzeF;h*zBEnoL1p^z_dI+3d(uwOSwE7sP9UQ5%0e0yDUtK0L>K9{Y+;v3K-dI{x~UX9#V?{@;zbUmM6f zVgVfppieLmOXeVAPC1adq1e8J^qqk){(fIH(VAa%a14hM$Xu#ej^9C^+$X!H%&}D_ zWvUUE^m5m2%%u6qfa@57NL6?CrvpLE5QuPY2!_EwKKc*@ti~TzCM_2LLO3swU`Bv} zQa^a!L5jcyx$9jQwKO7fsx3_Jx_5VI z^>6rS?QY+$Zh2vF63^_4cl7qPlY3=ftiEZbN^n3bx7T-X>DV6cj_*=w%3pp_Ke;q+ z)bPKw4b*a|@P#UZP(=_}i9j6?tA~bCyP%cILk1A>Eb1W`RuKfH z0|Y+9EJRhOcpq5=fmvY>LEzX&%PAgN)c=d$*GdDSz@dB+ry4#fBQm!_Hsob0mBKlL zZXbKcOTp!SLhjGw0Dx3dr#mu~?$=8Eb^>1SoIW>d-P~{}FK(|(i6sO{2>F)`D6F-A zm;Sn1-9J5-T;culQUe7d{dcYeOjf_Od%M$L4`ay)!EY6g4xHjtJ*=>$IY7#ZoR=nY zEj5wz6XwtD>GQxLJZJOg*znCewr$(7J;E)R6p1K1ny~ESwD)c+?NKBci`H>BX2>Ui z_Hc2Yr~+Z`OkhY%*WSojEwy;Q8SapgG)OmYXpEjh5UELsrekG|jRKOPzRJ#QAl%;f z;JQyE1C>lCf2#s89ydX#-P+x&nQew40GgV!2f23Nu0Rp(M@=4!fLs%uN=OBOt%%dc zCvXVB5S`oGw~_ddHkD$)Xb6M3cmyzw=Q9Kga1qx4V-lw_y2({8u!Oh=awx!ibN$Yq z4y6sj#UK|i;7a2GK@Zu$?aq$&xPvwz6Jne3nC`-9A{*e0e8>i32H8Mq6CoS8HFL-Y zKIW!PK4b%NgJDoTJw1$J_>c{J0h4Or47@y6V@@^52I7^G4HQa)XFClR90cHnk$x8D z5S06pKFyH3K~2e`-2+W5J!R41n|C_(y)337qNgb(BXxf|aP>e4RxYBr;dINQYPoIGb^F^t=^HOi1;(dn`nid)7 z1I63ZKb%lK!+TX;|DTuleiY~fD%6_HFb3ugbwKZ?&aLe+4SMPhq+X4;Z+;G0RC~_O zx&hBjYTZC((z;*Vz(rJ9H{jDx*Sdj6K0Q`%76^JB<0MMWi|+0GW{7B@0{cLodIR-E zsd@u7%qTxlVH}JDkK1M`^>rE*rP*tIF>gqcBHUGC|D+aE*WrBFZs4d`&8%EO?L`R!c z`uIgReu$N6DU>E4hw2ei0E)%BdKjar;$kmyFAs7fqzo zP;lXiATQ5&k22H&mjrfV(&`QrtC+axp`5tC_H0WYN=~b2b?AU>uv=r|({ys7xP@z4 zYg@BqLxoBY=4B*D_heY^l__z5D5vn5fPK`K5v3d=%g#kaNmtm?-8j}No%Df>?6+oZ z5O;>gW#}jk#&z)5?E!0o2^^sSs}S0)w)N$!$G?sTQgi5 zKP1NKuE-J7&ayJaqPfK~l9{%GSQ1tzIj9%$4H1-og)J6cf2&l(q^vCY>YlYDr++3R zgEBHCqj@>PO)`f{$|(IG$_|O&354()&SZuu0}mDX%9vCQ;bKeAmAok=GYOfIF8pE8 z6Kxn=WAdcx@cnj8F2SRAmb-XJJP^VUXOVMkJ+|i9 zBNL_5Q^j#HkROz-a=km^0#Z$+(@>!DDPc*PF`kZ=DqD@8v%k^lFUmKWWXX*;^x!X> z9kx8d?^xDjdd%A8H*QwFQhwvMv%O*M7WILfWLsV-? zRW9eR!qRz@P%`lV4&o$vT2qWI= zZ0VRrQBy+nkeL(!|AFJ>M(gg}DlVe!lVar%O{VCjGBjQ9K1^Ed2M(|^Cpwepx>m0t zrKxJ)u4ywV1XcD(Lg!)`y6CpQk<_8c)z!74`N2Ztjtf z9sq7Y2+Rc!|MrK0gp^|6B}#i(Ml?7Ohk&e1{V2@`ep6w-D3y1aVd2yRMWCBH;PS%4 z!Bu&%HTA`eVBxe6X&`h$Jw5na-zWm(7ZeM}GHU>EED$D$Z+x~`IBgjCuy8~t!@~P_ z?CjX?LvHWzcRD9FLQuyFHv7-@#-@znGxO0m^MMOpKGG z8jX_|L+H)v;^cS;y{K_=L_Gcjjqu~-G)TOBG$XxJai|0@f;+UXq2*K-b3F{yz;yV?GSbcmikI%1o5>A|iKI9^(ecP55Dnx+#rb8M~UmlRo;Y{lzq9G)n z4gpnf4ri7Q%Lq$YGfUJhe~URLg%B*EZ%0fD&62u0lYCP-ulssDyI% z`xwIz(B*4uBuuk0=_DdD^#G^JW_xSoK@*gBWgDSH=TnOL$* z!781$%q6>C1(qpS(eteYz!&x?v>(OFmZ5br>tK5zi$*^r6~uJX&L2Q(Uq;*>7B|;M zt!o@wc^6Cd9HZA7U)*lelf2w9{zg#u-d%k{BQSvx~pn{(NSy z%w+mCn1(*&&XZ6Wh2ClU4VlmM`R>Vlqm1XBeb_aM{le=Bi{8Dg>j)5+jD1Q5*d$|$ zQY;ShgK{nYRC+RC^FZ|K`2lBFA0EL;>rr*mRGMx*eezH~olMf$4A>ZEvS}LCAt!QG zYP_`HqRI)HH1FP4mJpNckrv2v9}nc!&H?s=a<3{#^N?Mj`;*M4W8=!CIV+2ogzJb! zVHt&aGB%wStIZ*Wd{>;F*46>5Zi7_VKTTVn0zsO)L7UcwASOHh1nfh$bv41k6Ex12 z3-|KfxQ+cI*%eXyIf$VpdvaD{Ueh0A!FW3>ZV9DDq_!1%V;c^Qsb{czk(3c}n{F;G zK*%N|j@qOYw_#DOD@&<$L>)lVpRl>}i7IS*fz6$Zz~{LEr+zi#b1T6Bx052I;P*Z< zz-v##c_ObqT%@SWNYcbq`i_-w*>W97XeU0qP1|AWyWow$ua@C6<(iD8dV}M2052v0 zIL;l07Xu4xG%dgh0#4yp*RxdN=@eGNguy@?Oc=qbF<~IR)5L^X&hSo6N6e>yba7(B z5PpEPvwk$BCKJT!&B3ZB^km1f89isrFdCDd&g|K#Kbu8CZ^4Y$hVJU=Xx~z=3>Ezt ziGTY0ReXIwDz!`7L(pc0QDydr8Rzg2?22G5WxudsEvD|-osvdya(AqqPt3zYKrhi9 z!@Q4s`g^QGY(9uj2bo^xa>iZ#I>^))GlIKf;qY)*4eS=7Ru6=wI~Npp#ZqR#R*ZZT z#Naqv-1S1}AY%_y=^!JZbdX6gvTutb&>CCC7cmH_3695B(bpcfiXJuD@$M#Qa-d|B z!M|?AopeFC5rx6TG=rD`?M>I>qvz#EO% zVrHJw16nzzfL0D_pq0aqnk_1hDd%e(T(6WbRM;Fpt{yR#B^=YokE=UAa<3AMwuXx7 zM*~!%F(yuT`YP(t?3?V4&W|msJ zjzhg{o>)L=iD1O=_24h~-?8SA4)xxHu zZ$z{2oV3EGkin_k3Myie4^Jzs3Qu?@_MVpMJw~~qGj96~oe?vJ&RE>0Dc*w$_zay9 zGvYl;n@GIJt(jB#Vl2mJ=#01#*{Pm#LuWt`CRNd`5=q~P_aMy1juGa}-~bFifI=&( zd?6jGfSc>PAe(md)PsZT(S}n#`zp`4nQ~v!hR)OtTBt|Rll9U2MtH|``KX`!hH2tK z2>vj!+(kT*M`&r>*GCFqpnmfq3RIXcO6B>u8ddy9``kC`fwMv-s0X`aXJ;8rU*`Tz z5CxRe2=wcwO@8A^DsuwMXbk%4T1L}UVT0<5meG8-M_WcCQgz|Rq#Kl$hPiS;h7i`) zScmri>8X58q78xCmbMVt%!2f+|*c(Px4a*Ujb!oksPFqRytRN)g z_Bt6J>2ugedmk$;oT>`-+ak|)Y=5qMdvD~iHIM^3dLa8nNEQd08{fs|YwVcp+%yKN zItvlMvcw1Ajg2PCB>)PP_y+Md5wO%wWFUrH282bh#6Ya*7mXAIJilmIEGokVSVSvn z1EAQ-Z~?^rX~G2)Y6DP{C$JEs7c<`9K`%dGkM9*Q0`R6-78yh^Z~@{~xB#1E!0T!2 zOK;H?HE!??t8f8fWfN%}oEKa`1z+B90rkM;3>QqU#6aA#*QuUPHW!B=YKL%5<6gZZkPCh@99=wH$8?8F9QD9iJ)hQU1!CM5Pp`BlBLw)06%hhTp8z4it+PQ0klnxnzM$gm#v=sG{dx!i z$39|u3&oS5OH~*?|M!a&Y)~6;Wh>ci=;PzqRLVG*fyw|I;@GEcm=3iz7Gz9&?qc6R zlje1uk<~}vgCD5A*zi6NgowGuEJ}O~Is`pfR7K4LxXy$=!IqAly^-C(kL#NnmNqms zk;GoQVLWr5W~L|?%hnV*%3Q8gY@1&%0WUU%FPuty8&Ra(g=_5~caz zEd%0fuZ`G9MQe?>6y90U8|veIjqj#a8Ta5>Xj0LaKC8+W+Z}`cn+lf+wNzD^j}EL! zc)HStZDk=Bi~cl)Tnt>_o;Yy`rIM|0Ls+$}9<8Ij4e&IZHfe9{u=gy6Cf%h%P88GL zLw?V->un!l^|&8W4glHoxu^BQygc`I_fNyCEii-ejFQn-YCO7S-U3q7uLQx%!xD zH*)%#>Pi*xJeU={33d`uISp>sFJOgle&^D-%1ILjSuuRnL_&CqT}?(g^jKA4SeMZ0 z4C;*``=eTass2q*!@Hvz6GXpF!p0j#4Lo3ic)$cP7EKUT+60MdAgvDr%^*&Y_}~5K zMT)k~4jgeDWm8F7c;dKygaPlbVSIrDOGmk5wei|;7%m?Y)uDkp0eoAfInVUg zuUwAVSEV`V1gv^hnxl=K#*rtVbySt+jMFqRbYuo-&Mp5%)11Gq3ApJT{CScK+}yo# zSzo_1lylOV%wcj6tBl*pNyHxUTj9*cOk<|Wecf5=G$Ew^FR~uqV68ZraS!A&?w~dM zU_qv{F8oDUSBcvKEUED(Zrpy#QG%O}KB;2La^ALfli_^8hF553gH@{{YWJ5+=Yym- z9<+D41$WSu&YL;0Pkv!bG9DbSk_gz(=En5>}L7hyxt=6>-Z#s^05pdkj^=10f zPRvP1mx0!@1$~Yl>1~Dc;6)+FjjoW(9oNgQT$vuUT@`?d9Q}rl%*ogfoSf@At_&T?slxbGI_-{CGDPl~`<={4euZq3sn%sLIVrC~(zp-U z>=s*)@6_N1yJgwoLhG{c_%q3jlgc5HZoK4wJARs(hgaYJ_E4YDok7LIVSc=@69n+L>w;Y^d&E1nA6WnDW@ z%z`NVIq*B8=Kd;!a&a>#WSm;%P@HG@2oca77KIg0Qk9CUQZbmav$Wr?awr#$Lz(~I zG>39SKz1bt3&|LK<8;Z;e_R-YTbx8J6Sb~tI5ehQ<$yq^^BI>tk`EHG!WjWSf?Fs@ zM#d;gHf7e;arf{TJb@X{LD@n9sI0dQUi#ZG6eD~T)ym{xwRRnCWN z^w&Yy)4K~9upQZ9@I}_F1~+kdhza9Cn;w$Rld^^5ed$hp)P_zrz7E9I_n`TA6s$8mTE z9^e|8>w`t1O^rPC)A0|a$wKi>eKragO)i)MHhsu`*IoYZxChiLf#0wafIHVdi=CMgTn=z#0G zVpTXsY*OOQ6PaA$4DnoJj>1BS>lw;NK@+pYk>M;Vt6y%gt~_}_QF!vjDfZjxG-F8Y zVnE2R5xKJ!ma~dUUydKfqjC5E7(gZen3gTzpAzYz*x~4k_r1!ZLrzq=du0;YY4@%I ziu|6vJHSmKgz$yNB?%iMm&{}9`WF3w~MXU@oI0Zu917T(e7hY_==c^W&FAG#hz z$+0|BZyrsdB>^fuMGjAoV(PliRXxJDB?eVToZ34vb5h*i*ZcjxovKO<26pkwwET;z z4!gClXDCOY-gr+3A5*Sk+zQs4z%BNT0KNvdP_OSK7_BA1DiOr=_|zlNUsI?=;9=t? z03+*ys6?nkKG8CdeNdb4{-_s5dl(^@hVlZK5YFl|3azNT0HD>cynv{;k)*>)c>xhm zVFAtX!a%*w!AikXSRmB`qbE)PT2Xlc6_zM3AYR5kl%{Fr1xoa3D^Lx-=(yb>3>l=H zElh(^r1)!mx0!=%(5*hj1%Ch1cu|o7SA0P6f#nbvkQr%NPSk6;T*$YmRWUb1=!qtdIO-6z4e*VOkZW#h;Q(lC#`>F@ zX1Vn6F;Rb=LMM*eI1n_JdD8`r%wX3=9pE=$$8g$XjF6@D`{uyGdF(Rr;F_n9^ZUmd)eA0)DgX z03D6CxlSU|mfb+P8A?)_34Tyn9uDOzX8{nSUdR;0C|7w=>Wy@DGMp_8%NF%A=w=Qu z3iRzZIC-z9YRSEQ;BRpeHhDDvsIT`|k$e~!F{q|s{P-!T{ z;H&#crtxqlmU=qVn78_mT360Xwb557Yk&lz*>)nI85~Y4H(2OKZWMK=jK;8wDI*&z z)*@pm9E~7b*aN?fDS|QaWR5?t+R!bI0C8XF_vNmLXt{0-EMjE%o8nX9SU$5cH{2$c zhSUhB+yPtMa&2T`TE^gjoVHBIw--mG=Fnh*-$p06&pVKo+B@}HKu4=)_Yqr~X%e?x zXFYz@YQzz+av{d>)4EA_QIp!Zbq{mv&?(%e{dN`|FGF;hpKBYf)MU!KajwHw^DJgjlhL-t{*kx7gJ9t>*9l&+d+YL&{g;VZRf+A6(3EJpGTcgb@Lfk$FD%01=L~N99a_@?j*U~L}gT3x~TAo@1&d-FSR+X-E@_;6yY*NI_i$PB`s z9IvTg6f3V5+mat2me-FY_bOs+YZ{$UBYps(-j^!qYnr;W} z+)xe@TPn8;X9s5z!_j5G&^dJB$L&5BTM*YZyqj`VgITp*69}BMEkpY<)-GCA1NH!p z+3rlWEIstIan&G-;w9?GK%{Q!Z8} zmOZ}>G+or(0Y>u!kv*pn2hZ6_V7Vsb#VC6!8IZLiJ#~3-@TD>&7}*IW$5Qc-WDX+| z`o%+}R}v3Vuuo$inJSBi$hLLI_E`Ov9a=YlIcs=^2N#XOQb9LB@$r7;c|2m2=lN+; z>o>~t#RMZ=BgH2*7flNAa%UxB;+0AyOq9zqh_+s%s86fDM8d?q8Iv&43{S#DxjqTg z7pretsk)6jp}u=d$M!hfRH!shs`N{kc=*Cgn5bl&dOT7pOPJ%b8dXJV<^&QZZgp%= zbocDoz720n;|VD~yFSFm+4XT@T2-D#bx~D*QVA1T(FP@9BJ7tiQ6fdjVU?p>;Hk>v z-gs4cBzdaxUa6jhiMu3JcHggs$|V7@Y>xGR)DY)k5&5#dk4wOg+r)dS6mk1?I_>Q| zWf4Eu(ad}f9Jk$6D`=K0-7L#gUWS6na2R5r-dv}BU}68UF5)Zvm(yOcQ$xfP=}K=l zmA*!GLjGdvZ;Sg)y0!2)HoYTGVbU1P1+# zOf1o|nODgWw%(;{9eP2m2w00ZSU1m0wMz8KYqG$CBKE!60PSTaUZ1(FH-s_DFOY`6 z4>&FH{ZeM?Hn{Q_*1s}lbr<$0|xT);VkY0&` zqDCJDMW)IW6xm8CD6broQPARf+lFlNBYv`pgd&mj=-4E9E1FkA4Y^ft`cbsy_DZ>s zcq^LWQA0GrM-6>3MGcWqMh%fxks4C^C5E?RfXy7tLWkE|B46XI%EJejKctsJR)}4@8bC zmv=6p=ro1U_5ttVwQt$l(X(vnS*mXPD2ie9F{V5z4Bu@s;!;XAklCXYeyV}=si_7s z8LB~(5&kH8vHF7-#<;!+s0NyM9#o@fSB$BA)?0I^d!|SQy4E8b=-3NDDyW7Fwlz1S zq=JU!G)V=rdZYs386p*4sh;43PeOvzLys(`K#le9YXbi$LwlVZj!{h~WgV1sBQp9s zvM!wzD?)NEYxpKefDnITG1wW+;fB>u0>bR$nP`;KKld&55blT-b=Y7-bj2^7A<+_Y zpbvtA9LOvzhU~YM(r|^pc&Bhv_)4@Cg|;n|n5Y z!0WoIv4ZA>8nQ|ls4nsSK1Gb`65qbXa1dC=Dq~}~;fK)-Hb#`lU}Klb5}$uUFYzOR zz{3s{CS@~2IKafLtKtqUX=y#SX3I{tslbYD{aS-u8jD24^3dbFR>$q{v_{1*W$5uY zqv8(&__L1ES)Brz+(^W_dV^ew{boGWT=LNWHj5wn%D9J`@es5etSdJhPDb2J>tnlH zm&;ldYNhBRRw-0$t=;u|^5oCbhuM@yA!!U%Sv|U8UzL01@5&_hw)zgJKUUvqYxX?0 zqILLhmC^|PSej+#)QO&NtKEXemX+jqXCzJk|#{z-9gIR2W zt6h-+tjO9$0760ANq0?nuYYh2l;j#~t*aa4$d}YoPLGpn#Gs1WgRF)3Q;v1oeNg9% zIqOx7vXZWY1zm?pQ|y>3tT*eTBTMkappDLaF4y!Vt3)Ll#dl!mKXTeX}jPQP(E)xL7~KPWD9G5I;hWHv`-?BW%GfJ);Bjo1v7~PwTcN8 z81t+h1U;_aqJeG}|Du2ofBBB{&P#>2T)8KybO~8+gWf#2 zfi8CI#w0f5U=+cx%5pEX(Mlruwx&P6iK{(i=iidR4k<_2ZmLut*to!dW z-{9x?bJ4}3mR~_F=MMWAMQ2g;%1*mW9zlRCN;2}u8Bd2MpThrr4sly_uN8w|*5g5BTuJ54rlPLq_%#&2mg3j3lGGepZ^ATS!nRm^J^fY6sbQ$p za?JlHz#TJnYa2*;uK~NN;jtIR&0+TqIC8;0a8xE+WUoBN1AvQyGc;yc%|imG%Z=V{M%%nt~07vJ7^y$sD`0!^uvv$!1B2?qhN0W0s>BtVa%9DA&7z4#s&3BEh)nnifOLk)3rj!i^0l=Q@ro$=VpL%}?LpZnlLc{8Z9y!qB~|5?6|P(-*49xO`X`*r z=Xibo2^0*;47?9!Zb}J~ROEy_Xg_hc3!{ITEm*S-N#|jH5A?(jt$G?k0k!77v+u=Z z>$k001J+do_uX~hlh3PcG*JRJFCd?yAcvmdtIbpA9Bme{*cp{#&ACbsi%0b+cps~TMqG+Gz)Dt zTtHfA>|uo=;S`#SC)1#2kq~NuHGs@)je*=!c-Xr4ko6yG=4B7Kq~0z!%271$j!<59 zQFITW%%x%E?2b_#m_xV<=3WFmI%I~l7YNyaH6C^9XJdnT7&D>+_u$cOP`_V@^~vjZ z#ry2%l4zoduO;1M9SB$?{R*4jJ^&TbRT#oDqi7A+OY>uP156{O)~H5j#|GsR^q}~D zfYwr)92d&S} zd&>GTI%xqtIXVMONaH<$kUsIJvF`P7Fh z8@-ABghQRz(BIbmQ z4EM}YpZK0evz7;}Uzcn1Ihi7t2=Yyw0qMH<0ae-+lZ94USSJV5saX11xhI!yjU_1| zo$4;RhZ{(z-}UlOQ}7Pvrjj|iAY;{SNXA?i=M`@R_-QZ1;aEvh(q*FJ<#>7A6RRVn zlPul)wx(fWrHvEiDx$rNkd$0oVU)+2(%5$22&0;f6lfdFG$Bl~9(W%6L@J$<-8trO z6br<%c2E+V7_^yo@#RN|3x_Tg3fiP79JERJVK-4h$`qW>IW`*-fWFJbMqcts8Xs3%0%#11mRP>gkDA(H}KuogCBlR!b= z3QZS}UZp8nYe;RhK)gn2LaagB9krsN*6M}bE4CP7uzqzj>3kvg6T-$#4g2lq z2;~5l1LOngWbB!iLnA;ih;~pEl5-k37{{Q1uuI$*Kv-D26n+G6+t(ib1~o+}Q|GmC z7({-7mW4!pUF$dSbW~d(55Onkg0R>al7m)1<7Nb2vcvA~L)M~s@V+1$#=eL&ty91b zx~>0eGF{b~lG!e?=31)k6DAd4+SRhNkjamJQ4VAKLVPO3$f%HCHd(GYq-0x$QkW1D zDh)hj4ZT*7kzVCO5mr8@ZL$0sxq|Re>|?NiEMKvo>k^*}9b+xIT5&)329QRo;Gc03 zRKB2)aZM#z@)dV7uE1X`C=-B#n&-lI1hyTT#}YZm;cW^4H#vFC1+YQIVe?@miI1VA z)d8EJE1Uyn;H>ETxrakBeCyUR}PTBdjR5H*d&o%4~sihduTQY%|afuty&~we}y ze8=|g&BX)U07Fb+qc(+!fiiA5`;*)GOgUeR_yBnSIp$>wtv-EJztP(i?VFyld5zaK z%6Or>ec4j*#$W`LvV>uymF(!}nvqg`)*J<;m`G-^$19#d{6U|yJscj@);CBb?wmZR z0@Fj2eI8Vii(F@^TRk1Ij((l1#9WRZGg?a?Yp*h*x-x%cDAZ>zhlh;@6Rg&J8cfJm zYWRQzHTV=B6oR{+br`kQXA{P^#vR&< zF{eD1=`m;Q!;n`GT7=9iZbNH}Z`@58dbBzgl6|Z;RlKP*-rn2W(L>(C&}6I({<*nr zn?KfH8r`;S(>8uxJc>4Ul-}K08jY7m+e@RprO}-`cEZ-pUv*z;hVIg6d!pZ;8PSpz z2Jsb5OFPG9K~e`6q2fZMvhA#pZ!^s?Z^2Ue643J>pY{x$!8 zZ+GXm_VN-awNeWb&ur^1&rPY7axX_IJA2FXFHdaW-d*8c66(X0HnX>@qY6#j{##AU@GUdsF};-(uT2&Hcm3vU?9 zj~w}mxG4<9s||NOVl9!c4Ez*&KFdO~ZQwnvzlQzpQJi#u?e%BZaq%bZZ|J{+4g;Hg zSd&D}Vq9m8ReS8wwn*>p8E4ac{8dfl9CN@m<72K2OQq}qE3#Cyv*FN29MPrS`fmwig&b2eP{?E$D2#$>GEhX> ziwqQE;}|H94uiMSd?G@VQe@`ICZx#d55;w%xiiCc;bn_l7b^F2U5I*ImkukgOEnTR z+(6OzY98x_rg>qcpAQ>`#!bM6p#>#u7`Mn{)RoqFX_{tJDAC88Q4PK*+UsYyFq)8Z z&b%3VLVYklZ>C(eqGa6lF-ZJErSYOuS7cSwhDSN(O!szncg(C9Q4SR67a5ShoOd^y z1oTEq8bQd<*cJP$gt0^Ny*sw;#6k1DpWfO*&V|$@TeE9>`?l`Q_w0&y+}+dDPTrN! z9-aE&_P8(cvF=z`d`)}2{Sl%PkH&ZOw8uKus0YwP&+OQ-RlPyQjQ6RG+I1D`*n*Nw zle+oPT_jRF9z#LTb?f#$hEpHcw{J&HJ-Vjdo7n$?7xSEOQ9th9QhImGCjV{nHmy8J zAuo}$fh(6Na`tNhISj-#FT0`2)&i|!Qai7^4VQ3a1wfoJ@fXk$S^sk)8?Hb|v`}Nx`aeHXy>KNqTq$RZsv?LUr`jA2^fJ zB>iIbiH^;fgm^zHsr#92^}XHOw$yLw*u1sgfCIQQg}0JU93InwrM7-sN4#st7FAm3 z&ibu8VnmOrfSvW)L$t0K9&)z!)^~Mm-PzGo-|1}UF4ER4)Z=_#J$sJp9@n(TVaVm?Ug~bH3;vz*46og8st)IMBUWzG4k#tp{ z&OVCF^zXx2yU{t9#@by%JiE7d?`-b@EP)|MG++Ym3SX@R)1vRGj}*qT?J+x;u3i{f ze2kATHa%xd#FiNR2@m`5Ck)nUF+M(~h6?jVQQkNn2Pu_#oN-wV{)A)?e^Lu1))0@! z!QBU(PDsQAylQIsFRxyrsAVWH@-k?~H5^}j*=Iw-&Nyz!o@4qGU z=3UOZBo2q$7i)3~GPxS!-x`=@VCy8^1QBm_hzx)lPBHQA`qRU&r2rxHSyb@hE;H_-%y0Yo)3UWn0+>L$OBuM)qZ8?p=8dYB>AeI_BbV zJnT*09LCdwZhlZdN{=_uJu06IYjUYH&yE4&Y6?ZJQW+X$Slm_%y8>MbOP$yxL>{d~ z`+;(h#B?- zOovZoMv)V;CroT7+H=5z-U^D+y)e?xVKwzhQ|N#aI2!R{Uos*+0XOEc6I6l^Nk@xH znF!Uz-r0J@5*Q>Mc|FR4xAM#FxHX=#Ou=*+!h;?!auTTA&lw={bPT=pDau!;0W*9 zhWC*gun*c9SDwK>``WNrdW|n5mjrTYCE(ef6l4BT=O4}wQuS-E^JTWb(}3; zEJ=+crG=MplIxCUYtB6D;|=oUdz^|h>`^DVq{RKGN}Lhaf`akZu!}`x;62rW``ME^v}g|5!&F7sC3~{FLjTJDxZFhb zbivh!bzNKz{6ESxalbx^1CNdX8y@7x2f2NBh2W#)_x(jc1%$p;AVG!9iOahv0{h47%_B`8N%WT-3XqCC^%V<{zr z^7MUOE!Lcd0uF~uv{2D4=vf#W7GxH>2^dfB!I}=b$?&8l*QNI<<=ule9}odMR~tr0 z_!w*gO=<`9vlPTyCC%kmW9|aIL3eLZx6+59Q5=rJ!0srllV_bAOdkLf1uSBS4*_Nq zKA7IL>(Wpf!PSXOJ zOsAkVV%^tZwTL?dsk~}2Icc%3iQ{ZP3(Ud)4$>lO=Hq(77zM22X9HtY<^oF85lSMJ z^GA41zNi?5nL*f%L<$j9A*xt7wIGX?T_GO$nvA;B-{~M65EOkZ1d6H5LLgfy3xNcK zOiao`AfHFG(cGeThM#(KCO-tg<;#~)pvGDlI5g%YGh@f{v4oPENe1n66(50P;D<9%nm#t__C-Nj<^FuK zOP=YHzi?U4l}?l2E$Zit!7_c%@IGi)?mIKce~$IDAu!RXJ`a)y6>i1x?W+%+0>bbR z6l$R+yf_q<8_6a;%Vg}kEbo2`4Zftv*rm8vjB%!i4$Hfkp$e+U3^j5PW*&&XQO2V= zT=5WdWGf>2<7pUHg7SHZ#0vAWnChFCNStt9;$C%EdfLZ5smW%Wm@=)f-;&@A}AwX#zU2+6`_4U&7>N9f-)-kkZ2~qkdKC{#%nPe zw2|giaWhHH#Y&q=xKqAcM2X&Rk&5WuB1F91ph~+%{`;VPh|VDKE`Ff#TPdhy8Uz+I z{^HrHE)rNYi^%HE-&#U}8tZy^ngM{_B6F=xAaihEl}Qh$NA8lX$rSuU!L3OCn7FwX z^bbd-JrjcE51X!733-U+%ngw2j*Grf63{pj1c3no9N;IPT}XMe$6|?*mZjoOP~MQZ zBP<)=F2EZbOo&n^inndW^-`+9%Q8btXR<@ztI|H7)CmfqH0cq;jP zAW#3s92~G1&pS!6a4w*P`DjfWWN$iJ62(|#(qM^&*O^yapA&bY0mWOlsawbGp^SVE zjY*1?VOZ$wcB4yCEDk|;M{p2pYbGn*Bl0;wINkDK-q|A;Cg`|w>^bB{_l;!4BVk-V zIaho-Gw_M6lII`ps4`#O8vD7scEnr;!ju@AlZjiAzWUc-mgJ+EsY4Jc9H2;|FXZGW!P*(0fgDnj3REcBq1UYnD zM|@P6>?xPjNw^NIv#u430#?rkr~*DfMxbyI_^T&<5fFM|J#tzz9M(!XXXJO=6c&86MN58lwoEXPt; z4+NLEAmHVPp>9ohCW5C@R=x??hZA`K6}aJ7|&D~>Dxl{9o2;r_S{E+<|>;-XO7 z5r8Z3T#Ldjh7QE722dDHLD{egg)Ryun^5F(_Eca!G|$lgJLDYKoiCr1qZxK}u39g@ zsqcT|cKAM~t@Q_(rruVisUHkYRc0g?oTTb0SS6`s(Sv2Tx(lE-$_)oX%t%*HNBfp~ z7)SSXY^nF%@NXDQd*}ROBB^SQ8NK`>?tbY~RBiBf;U#N7H!?X%{qnP#r2e`gsWLK- zrk)r_Q-4>})c41e)FlQB|E?mZH%vrM=YyOM!{t{QIlb$cblyy7({vg=G|oclEF{hh zsCk=M0%8h3om11&2!!gGkCv|YXz87bmTr_MhS^*9M6~n{rltQ>rKJ~~mY$FO`fjWP zIAU0vWzGO8o>V=+$g-%kRDAuQMAmVV<^@=&tA^!9qoBHl|DkN*o4IUAzEZ$De`P!+ zuaj=x`2G9~A~#=BX6+?1HZ7@OwBfIg6a|94nl%Uo&d8Ya#b^`UiaN=|&Y<`LnX@&H zklsLYFNE71!t6$6?mU8a-veJdqua{Vu*l{e+u)_`ytJ%MIqb_oZSrFMo(YBV^H8p1 zLRM;V=JWA#!D(>Kwhq!*#VH1xcRDK2(bKb|XVcD}?nHZ>%)oGu90kB1bi2;l*{jp3 z@tZJFJ9@UalM4rA-houLeg^zS!0+G!k%+R*FB3FQGt<^>;Oawa(hUfjrEh z=F1HOse$CctH*N(-9uLW@%~LsFIiW`t+@?yeo8L6HR;M#YoKZ?=dX5CqcYNzPs!SP znc`SWQvr6i^{|S$su`ix^)iBev7i5TbJRiE%i`%SX!vfA;olzXuWFj*+Ms3q&*$a5 zfn!QJi8jzgyc70E4K5xHTFF2|A(L@o^TW_t+)hPTyh}$HM(#ZY^i4*rx@Pwb%yRW1 zJZo(z=g8DOE>w8<3Aq;MOx_#{USa(dMJ1Ea6;cNXs^gy6$*MkJkgRrs>3i{f1P8a_ z>>C`wx0=HQ1j0@4>VnL>bUs)pDbt4m7cPKVv#dRaL#Y1tOAUvtPs%x8vSyzSe$2WR zCpnQ3kv>$4O_^|>TWERZWUHycO?}mxbI`i-=vS?eAOCBsv0=ab!G4)ODc?E>msu75 zEDD{pJ|U0d5U)f!eQ#@SC5}a)8rc^s0gaZj@FM@le6HUt`$-sHCv#ZzYj`wUP{&o< zIITLDfJ%2Bnpf-88JOx^K5`5jBzMq3yJe^)D6PWo24#RH+0u&7u2K%0TdZ(HtIRbW zgS|NW#s0tIT*%Gj^YMBv6j2OK)z>VXCuYUgr9wvORDwe}sx z4lmAUSgnQy%HUk5?UV~szv$AJ+m;%0GMv91m92fQ+ca=Q&KpA{n{dSQA$ep^u_?+& zFEu5T$+R|6o4t}{AqwmAP@^&f!oE zYO-d%;=llIEezkbB+EvSt5eE0XievQ2;Z)oi2wAK6D| zi5=srj%)kE)Ak5@D->O={5>B>|3{+BU|=vlmp-)=A2E+McR+>kIXFHp?27`pZ;_)- zbXlq#+o2E~DhFPw1#Q&NQCdEqjV?>(@_JZNQeinyL3kE7_Kp|+thcN2mdA&>@)XhJrr{?tk4pK>9;YQd*67=zQ zsuk3)LG6H=JiS|#Bgh(~B}WFTg9E9D?U%u<1Oq(ddN)!KzSuwaNTvz%nqwFELMmIwQF};dV;jzsEecxte`s9GzjBf&dIlXDflg10)wRZIgrQhkSjMH z%tKoQnz9>*lPR@~?MEJA{|@COJKk2kKEN;r3Mb^5x@By*Y5I?^_#TzSqg6h^Mf(=; zhma6tMc^P)IljpBa|GDIMTZ`-G)iztG+jH^>HmmW_u+B{6NQi2Pt&;3z9^0&-FNgK zj_9RFwTBG)KzvfOrXi2;z4S_$!ahaYWvaX3=lh}S=#J{ohbe5?d~^V{#8=zskge|b0l}KJ3>B4GMW6{YLdzc8blvny|*~XPQ~>{RbAnnNaq}|1yTG)WQ>m| zR@}yU4#3yw1*jyOyToR*C7kdBCmk+GE&dl=Ip38__@&_N635!o5!l_WurL;j=Vo!l z<6KNG81_D1m%x6b@_ix}k%M&M=Un{#K7J6>daXabrk}J{;8<@;FV3p~pH|`jV5(5Q zij{SgyEy#0=fDwh+5G9$5eq+}gf}^rsA&)s4S!VGR@nicij*&f&Nv)_ ze)%0CaD65L-G(p!88Bto%uUOO#2Yxhl32U>X()Ovkf|&u%c zwbO%g86}IGxw|EiwV=3ZF8xt6mOES>OA+K1DfhN~6)p^-)-`g2_%tm;baeCxSVoY* zFb^KERLygpeYXbHRV=CHN*lOR_QM)fSHSsn$DhRKTm|K;`~(`Y65ZXZ zPt=Ut$x)b@Tk{&MZDK({hWbaoLLad)WbIn}C)Ty6S6i@&=X5&XT{MNgyMJrdp1vDO z_>Sz$OOWP$vJblWGC@Z(P=n!oU>+zC7F2hsbZAg&j+NIhHKg@n0$>H?LU3X--6);K zG7ASp6Fsn0E-aXQk>pB6f_M@06{{)2O7W>V7*kv`FXO%}YL(@wBDu%DNZlh7F|m-o zsyg-BPi1s5INg@I9xpe?b`>j1wOdsF_)~EWsj~a%i4M9vNEhyVfy3kx5f6&TuYD-d zPyTlu3}*NUKn-0OFO*YBKmKN?kc=ZznxNUBF0yrTM!x1|ptC4Pano|?!pE_iD?MXj ztnrO6<4SAu_aM39$GWLGpGbj;=VY)xG}{Han-C&$waJ^L6Fuf<_EJfBb?$GqPN?t5 z9exTogJLN?Bv8TcC7WCba?utdMGep=!LnUDl8Ry8Ix?|mpZvcmwc%bduTA7PUe#Gjm+R+TK-x30GFnk$GyfE zb)vIArHuugVsel*M}nArH>=sV-yTXQhIXZKEJa*=ehvnB0(zjDmWn2P^+BnPW5xZ5 z!8FAs)~YGAmn#>mkO+esj$l<(T_zsHYw#y!PZ|HECN3VIV-3F`hHyU7|5XF6Q|rwa zHh>3FMTw_j5yY1)^g!>&I<+)3A|AkrH{rveNGbkb$jV*+)A-Fy&>Z6p3itgGc5E8aj&gy#?H*4f;iKT++$B8K+tpRzsopG$l2P=SqC$nE2$4;?B7%A%fAeig8Cd{Bx4m)-y<~wBFGd2=W2PC0Bli7bvwf zL$8-Ieyf-pvK}I81+b1&It>@iy3+Kp#pkY537JL_<-x32O%JXL;2+*&I?B|2_Ubz)dqv#4ow6rub| zKZPV|RQ(ym`iNSf;yAV@sTShXcDEMv_uF60kG3wi7Va1I;nt;~1Zf#toh;-tcjH8t zysQI7tq;NHi~KV;1L};EYU*fSt5rp;xsL0M+po%B{YX9_zbWc(KwfxTl?(Wecyx~a zN4WDN(QqT?#dS zoLrTswTxbI4=s;*`7$rn1aLqVEHj3=!uRpOsBC#rzR$7K_CB1(ZEj$h#DjF|SLoF} z$vxI*2drg8)b-K|R3f)bb|%&8s0kFWX}*O`4H;Dz4F!vMA^)JD<&ULEmPN3-A}(mH zcw&{zt7YM!eZ-NWJ#!1tw5k)Q;&xWFsfjPP&at2SH)4&7owmEqu&|_>%6OKD z&0PW2%e;t&MMs_72zEISc2#uM;-CPz5%|Cg*^*4Ek-OhMoEI;$KxRhQFntVi^Mu)z zdNpU@NDQ~oMw(B<7zmsLgAp9P4tBjSPwdOA6f3CWTCsJm+{7;j;gUc$9LYuljb0Zi zUz&q8E4P9&a{}{kG=w!bu0)og=;GB|Y$fJkw>$;*cNrG4Q{+KubtvzUhb&mgauGZM zd_|<1PU1}g4#AblKC}G{M;RvtO937Xo}3=7bNc|AHc-nx zSBt~QypS3^aXXESux-t&gKOL15sel&E{fmqsQtvSLO>7MY8}{b55{B`b8FPa$#wv!k`3DXQoYh^vwhw{jdIXF9Irdlc`Hbux#vA5xzyblQ zKs?e-%sAq~kl2o5Krjxz$EnavJ~JXCB37&63`i0VgcKRcpAuam`T6o!gq+Szex?ph z?pI9)cZ=yjbPgkrm^xJ@t|D${M3l#mXb;J1ciV;n8 zk_972$-cBg$ocDr)IrNO_IUK_zZNS+as_%)b-DCh&h594V5rbg1fHT6EO=5Kk>9p% z1WU@ri$B8obkqHXL7Cb^QR$_s@9lFF^gHY3CIk6cz*`H zESn5A)1EjU_euVc*O4G3E#1Ck_~hg9xejISUTgilCN4YGfS~97ysDBPiTM#lghgX< zYIO;A;U@70s^z}F82I{D62@clE3$J;c44Sw9YPRpggQX#<2BeXOjlI{dUovC7J0T~ z`*Ypfdn1pnF`MVC-{5S=83PeMSC7tUq21XMTlA912dElQK_h^7j!om$PBSM>w)5}b zXx>b_$9TV)+We==(G2YQd&&vplomYofHFmZ(k=3joLYcS8Nja(!Jo_jNie%<8-JDv zH{V2o8td<|p!`#NtPg#bY!A*VJVy zkHA&F5qMiDQ+Wi2Wb=aW^7Q)0-=27SeY5YIeP8STX5Y{IzSbwdPxA{7a|g=i)w-Na zVQPt0bpXO|Coj4nqlpeINFgd#Qc4WR0xX|fdCsY4x&Q!B zabR$}ZvfJT$6G{qc&fR$8=bx&C(~#b8U=`z8%1*yUVvB9PtMwT-1_N|glXUjQ?^2=M^@34!^(pB@)XS%Jl!Im3Qx6i6z9uBXcOy)p-nVj zAg%Cx$yAsxH(?q19*Mk6oddKMU;)$v7or?ny2v>67f9S?66mQ zNQ;)fw^_%J^ZuaPyRdBD9FZ(kGKQOXU8_&rAF!?>EJoFVm5Dwi$17D7)H}hd3#nBN z)Y|g;m8@E^2(@dewQDF}Y13|jY`$Bb{QNl<%Wzt0i2$svIJTgzYv$pVyXlp0Y``~u z5=_%70KVAh5)X&OXTo&+j6&nM;YxFY3O@LV2nxlwZa|IjenFrST6; zNq;hFyr_atVtD?0RWW=5jrGaIa0ubMAcVt-DX;OolgaXTJIB}BU$^=^*?Tr*?>|?v zcj1inpPm;lKuneM%O!75?uH`99RY~{TK1l;WN$3(#NV^feWg6@$=qPP=fdNcXq*eS z2HWbr;Lf4^?<$#k6=;L?3GsNKC`pqT-KWIp^a}&lf5Qr{#OQ0Wp1<|H*nF|JZw}g* zy@=ZvM*F^BY+t4T?h=ZU09F?GC0cym2K9LXiG(cryjrH!^6ZuJC^?%23k%*8Ul$*{ zelGA6oG<>HzEO!$4ZvWLduDex<^#Ja#l zLsLACQ46jATS6TWi7N<}IpQ?_f;f%hI9-C+pBMYN1i`vwUgBoF#J{`LU*cB0#J4KH z#DW*s_jbRy{`>2D*UR2+45ucHc^XdMSjT9J0lvXPOF|ob6VZUb2ZL#G7?>?K1HY{Y zQ%kM<1Z{8~=E3w}08=4?sX*u|%>_noXq_{IX$c0?dK8NLRH!F(G1oe7EZq)?>l-X_ z6&Gciw>)!4-@^XVq{0L%{Y_Vhl5Y`MqICh7^(M4dn;WsP1@V+pN<=57F*LDm4ynEK zN>BRb7v7z=mHfo4e3>wTPcYvQh%m_y4^JvNP^u-x$F0vowe5Q~ z61r6|g(5*AO`<|1j1`T3ZdIbfYvHP>5P{X_bCpeR3V=)@GYhUClL%DrHj__E~XMxW=x%UiPm7ALIQp*P)?oTQ`C)m^%+g8(t|pLDN8OaQvVg#5u~?$IM8$Gi-z2J=0CVcC2bftqw9} zVbi@Jy$KVqGol1mx>zb}o4;m$aTybsxn6jI#OeyO*TpYYA)C zA?RPBufUp8)n~Z#RNHYCTw_tWE6BFNL2a_4b?bQhHpo5o^{4VKYY5&7*N^cWl)8@Q zPRO@iIxQN??qS#39fwi0jG{tnF?0!U3XMS(QV#N4yvj90R)pe{SVn5a|37hBzBw@7Laq*Nn^{hovXFuIzAFx@=+hHloW(x%d)9s8(VUmHi^M<(gI~0 zB`vT(Bc}y+*+xkzEJx(DT!lEHu+Y|W%CRg&PRg-Bl(ewG_W%24o-SWW+Bi+Ad`NHR z&6_vJH{X2oouW^314L~Qy^kqChf;#lo?`@J=-?@TI5F&I8=~Vo7vr0vSB;rrp{Z1) za)XOMWoD`TFt%&vf*}pGibq(t1s3ktLI}pXlst&TkOkM!!w~2q>w}av8(E#1$RbhM z{N?ntot}O-@*An>KT*+5RP;T_+C*9JqO1nWN<-HB>FM`Gp01~-Gm&3QMVC?08Y*f) zRt;rkP}c2~WkgmrJ#C<;VeL&~Zdiw7u?!kOycsa-r5_<}zZ{H`m;F?eN$oq-r#R@4 z>IEG`{Bg2R!wCaoX73>=iXEi05>}gXlQsmA72g|Rcf+)StyGq3q2Zn$HfzOI}--iMZ>jW}Wt(?mmtKyP;Kgd}w^v^WD3P|Lm-=zsiz;Lp29v`%l^s9 zV9YR8Pp2EG*YL7;IoW6EWzgA#g0@%zm=`f6a!d)n!m-ds0S z?n4NI0w=5J5k~)mG=`!_? z85TL?OR%T=_)+-2;CT;y7TS4OPm8p$>o7s|1&-1pEs4T{5D)m+))5|Jzt{n;74t=u zGG>9T^b+-F_diB|z#WtQ`N+8b6doEsKhPYd`4Q}$3G7*^*< z4I;V}AmrxHBHRNz`<5OC@LJ?B{QhEw;dB@nB4Z6;SOZ`n3%`Zu2L^sF78XFrAUXyi zwVz{iQm3|vrq)DLn|`rVn-lKS*ff2r06Xdtp~)m5-0dFMC$bPwZWCPs?p7DvmkH<) zlq>`tbrtO@i^exkFt}7KJQ4100Te!=1veR>_tOX>5Hu4JO{7t9_b5Vjfcf6YT*B;Gp)Ti}n+_A_K7Z%p=k3kfXDF{J?}lB$AK+q5(R?ML!thq+ zOTru7mBf}5n)MMEd2eCsf~Y>j)W!y%`q2!tF5kSy2JB{j^m04ogF(aYd-MFq1wZV7 zPI9>LJ;XN-`ryW5RNN5un=sT44$mK;ji%rL!6(H&SE?=LpDK zeo*q-@F|V7k(YZAXMkCmqr-dvjDcL(D#O0luN1*CBe4`_=fRfD0V@(ZxjEngC52s= z=Nmu`(xH>Etz`T|qGIxamE(6CL;{BRrf0UAvJP>74(fn+rePDYO!M6atF>Mf5o}*_ zQea}&;>G~Ppodv^CU+a5hkl*jO1VMzkiiZ4{wvQT0xjEW0kfE@AiGZa^;;G9b4GL3YS zC=heC0p}yD?-&Q8FO?rV0X~k~#_hK%x6bqNp>ucwOkafYtvDtxg(>)MUAH-G94s=L zb!8PX_bI6?nahn7y!QxP2ZZEhZwM3^vz}qs!`er1lG!Gyd(*FDMkq~sl{@CT@4_(N z2yP+O00tvCPOu=nRjGLg=)dl{e89)teIx8u$S8So+o)=y*{>5EYDKyE?V=%=_Cn&N z!0Tcfh2dq__74MQq}{QYY{^51(hzIp}p}4f|ND;Ef9to@BmnG1(EPDa+=9<#^8R86I}` zO3hvF%HhF5UUu9)cK^l~;5zclV6L~_dMiJ^hh9V7VM@kq@nU!+d#K59D@bUziC_U! zQLg(7d#4_cw7vija|%eFb`z02|B@hi{y|8dh{2-RBrnpYlKk?{9PN`Zp@dB-JS$J3 zv>A1{ET%5vBbh|9fBT>5=o;hhus`GsVMl2I_P7vx%CE5tay|^FSw1)SgY~|PmjnC)ec!I*Hj(vSwrY~gld4@ea{~%Ex(kz}R7uBnw)XkSW z^XtvNEzm=VUSfNplEZkDit~5n=kSxkgTdiLh%tK*?sNvl4f#r;FeC+`(uJt9;5up| znUO-EIqXCEHB*!q3Q)?zX!+)uEq~1cY^WR8>lQ65*R>wHz`Q>bXKR7{n+tNU zUGsbxnh!Sa|I))I0s4zDn`aFr&G<{21IJ-e~ z79^^U_ry!XAsNeuhvP>6GD)oUf5h+=dfdo|7#c1*{QNAw7egQncIfH-+{3=u2iIrXvt)F=okY$azDTK? zJ<9%|J;NT|p?prO#Y4yrfutm=k?4EqMbJ5d*oh=S4Z)5aHfq@-2tNz`h|Lw zn`fKZL)vC`bccndLp?K%kK(+s6FPzpl507X<*9tZ3G~t64ZV66I-D7$ZdoVN1YsO14Nbeo?n>gQj=kqeHksCV=6Jse;)C!s_Djx1U-ivH4_ zV^kg7&B|)V1RTUybU#tQPz+rVU=1hPB9ccM*b_Sx_Z2dXpTIDF55qXDf!1_lc*aB7 zCow$FB!(w9dGbYg*MTbvaDJs}cEBxKd2%3xBPR(r7o`R~p1of9qeO;ZxoI}9AZz>( z``W!q0~~&x3PNo|=>#SM1~JPJ$;y6%=6pmjTXk5WkZ)KB=-5yq!m zfleR3s(DmdGnb6{Vo_>0P%7);{cI!OR|GaFyIs$IMMOwJGTWfst7XgdLI1au;uNJW zd5iM?WOfhHUe_K4;TW!l-?oQ;3Bid#dbS|gI1!YHP;;87I4D}M_m8mosQ)oiZ22{W z`QUBl@uy=?oFcL~6V6>32fqj;db#etd?y?gP4rdmB6YOi&g)DNo6+Ya!|_OB?lW%6A?U=Ac7M_ za6IQdK?F~Wj}qv5+TlqM!3maeLKZivNHc+0r^Orz#5(QpOoCYdf$8AO#48NAbte+s;7J9%35~Rb!d?QaUMyDq2d08A4>$NH5hD0t zf(T9!!3iQbK?GkaE&fTE76~Fap+KCl%rLVAH+Wh?FF^-SJ3Nyh)_-6+_%d;WPecge ze@zg=2|_qQ2qy^P1R*^0mUIbjaDp40uuq;;Wh6lbC#c|v8QtaK2LBR7u<|Z=-1?sz z$>Y|RE862$lbsw*cG~z76lUAd#cXf4i**d#gdm5Z}nKjPC z)l@FHqN97sy=}F)nq^by-MG3+qv`E!Y3Oc|xyWqHz`QoushCcq>2`LtwmalCCb==A z#oo|l@5<^7=?mPTW<#iwP9)VHC%aAAgmSS^ujG~2ng(@w9Z zVtDtK#+HUIc^UD47UN|r-f1fN(@JhwCPN(kT%#>_m2c?}x?BiwV(ItvyZc#o#Glr6 zG%Y4nW36N&0yOMIX8!`I(mwr5&hs3XVeZ8_V*+a35Bfb;P@UY^9* z-*<3*|1s&z<_zp*6=yU2Ey3fX0se9Vn#^tN`ZMfz8aRv;#rwp= zNjE{{^-y)YBRxs&(+!2-n;RjR7a&ef?BBfUA8gj`L3tBfkoklQkLUP$U>|JsaYIoM z&Sa8JIYDm5*9yOXQ2GjouNqv5_8r!F_Yb?^ozm9>mqRY@Sp!F(KifW;Z?GgC^Y!H& zW`>UF_c;5y~2f$PIgSMyR+J491b9&2>k?t0g7_6GemAVwYtN)aBqA3 zFjY3GolW*KYMaM|E4RE4V>cjUnbHZ)g}EX>!OHlJpqGsNEtQyUwE9usj4GL{}rGja#}j z-KX2*g?FC~J}-={{l3AcR3}jTbe`kfy`aFVFANrP75j}*Q}XJwxG9rt=MR9zKN= zEb_bxb9gnt;TfGnElnQDC|(qIMXnrHRG@ED965AyD8?U}4sHSP zxS}kb&0nT^?DQd;_c&c~f)7QsMxk7Vauxn3x`)8;yAgM42vMLSv4P3e)+^j_9BC>!v3hq47lAxzCrgM zzn5K|M^3!>0{CqD9sGMC+LfOITgb=wNu6k>F#1<(LwUv(+sOFExJ@UZ1tq=oy^SzHev zU?WQ19CTIAk~2K~%{mGOMy_PwL}3tr;vwWdicW}Y`1%Tijt35{c=AJ(-2(t-X>j!A z4(?Llb0m!4bUfb?e#FnEquG5J?D=!Wqku+)Br|Zs#=+;6+Iiw>poE=BStn05e>`^ICEo z?B*x@A?8KUXhcddDId@VxJ&$*@U#iPmB-+@VLbw#Qj9Uo0iss1Pxm2CaKxK~j~w>U zU#jO7DuYM}w3km-t1DF8D?C!G#&T?D~dbmmJ`8 zm4zt?P>p6|9}6B42+qY#0r;LRPyQxPMIR0FaqI|i2)2d~oaL?%`o_Iym0MHrIQym6 z*#n0cyV*4scFzbP>kR8W!{%6&^@u*q-bOJ#;9og-f&xy^3>gSizMwro1N!B@Nk+8d zS-w+@sSoabqvM)Bm+kITmS`s*SVUlgA3;RI2*Fbt4eZBnnqpv2kUtF?*VDN0jET@@ z*v|Qj?9)3U1AG#pI@rHN(?O)sn@>h_PE(1c$||i=GMnan3tV!1q7Tbz(s_SlnrB4w z*aO=YUn~%um;?q0LrnyLZ(SGw98{d}?*{;QyTyx@03c8@-oe^i|S z60c(sYv;;c$CtZ#Z{2mgkf83p0_ffog*kTZ0e&i=WX=WN%8gvDaJ%6(Hn~^Q8Y=lz zCWr!fKRTA5%g+Sw7fIn!l+FiNi8=+@ES#dwBG9Bt6;vD5pdJJB-DoG(0>7Ks`JO-valTra92_geS;9clMk@&F zd~CEtvK_N4`mmmxZS%%^i!=4?-VU^>W+9Gj^wrQv^}A-Tf($_>LdwB&Dg`U&{eqHy1IFfD0)WM;vQf_eNOg$ji7ePN$s9MF8p&DlCwd_&}X#M z*#G_2%lnVHmFydO@Uvw@RzJU;A2=l{Bl2EtEZ(ysbrdufA_fEoLG8-|%{mH<>kmAN z0E;3=S&gv?1s;t~cW^i)k3lrQO3WmC_qzhYv%zzr(a-Z;G-lkF1wz0`UU_NK_Q+!` z9lVb5EI@#FNR$tR_=bnMX-pLB*ZG5i&ykm}o00=tf`KiRON4cANJ0#^T65t#Iv{=P z0xJFYy})nHN0b3c#e+2WzvzVzG*KO;#KnQ=x3V(z^%lrVJt3>l1B~FbO7Bo~1oe!L zq>2Dgh5tbma_T+-$le$^7=rHd0P0VvOaZ`?djPHHj_e^Gki3NeD9uqmOdgQ&Yc;CR z;^Y)Q!^$ZTkZWac&vd(u_zQ{mp_GT>m(sJtnBg>3Dl0-}KHm^HVKsttA<8!E1_KT- zPYfQ1XA7d&iA-fB<~)G2Gab`Z*VABK_(pNsQxEqz1M(KX90X<299;`0MS493yJIkx z-H`%F@NY2_?*X%_ey!kgwh8?xhjn+FcZxSfIVdg%A09<{mnl08vBWyT=|Chm+rn1YS`O?7|iH8E^pPprHNY6#xhq&tD#?6hVC7o_Qun#J}wA8Cfu&2=uF+i0PO) zcLlL)a5^)ZxYg+Q=adhZZ&6F**ruX9;_VbjpaZBQYzEC5o|7LAdF5Wt*Qg^;Q|GW^ z%2B0g*$CJU*4$7iXv!T3D7PmE0@iFfNx0LqSCkR`6`s+>hlo{^G(WBeBgH)-?uKXB zn(gA(I+eZcq_RE*@vk$1Be7fqE}Y5SZLuf#DsI0puo%xR>mGuPB93<3Jw)DwHKN)&fKU)Hg;j*BNY2!;w@Tm^&|V zBOe~3gATl5BRH&lUnW*;8dWr(&*NF>fp-H|iC`Iuo^ioF0lUn~f6dQ{XRtz5R?lvo z3;@1C%@5*mV8Btr?7@LcHY}Z3D7U8sa7YyyM|Cf~z#n&@GKqsx8BY^;1pb7_aoXH? zDjkmRO!fhR(}6ssukj))xmKZbK9Vbvh zMU9Zj+$|(Dklu(yYg0H$V-kDa6;4P2O$G!uYW?>1rq%|!MrR|}sC^SAse4O9r)*d_ zm0?^VGh9?dMr)J3-P!8gD)YMSZT3c*6tp#RO(WCl=(an(8gUmb?rCVl z(?S*%$?NX4H>#OiyEiv9c6EfsPBBTmq|@2b1+iFoxR4_=GP)slvNvVK+=wlj(a_aM zayOK3Xd@vPt|M@gA?8EgjR@gzH%1tS#>NT9WaA;OQ>9)uTWOiOM0Oy0Wm{)!>}YRp zC7~YPY_o0NL?98FGR#s#7v02ypc(71wY6>zw?mb-skemW4Q&dG*HE20$6|`)L+TO{ z_vFY@ZP9^lr2<{ip)OJd%O!30&6r`7#iA%}1C$-Lwt_Fv_SU!N(ZNlP50zH_tV5uxfBP6eyP*b=`tzu!|#j#jKw4@I5 z#)^h^yotn&0t?u}6DU&=$)`v*#oukR#ol%~TiYaHqb!h9YrBwRB0-|b{Im=yntYq~ z@E8KhQ@n}fd~WlFuL}p<1J=L*sLv_?%|<_1oZ?Y>9KXM~?dWN5OTYwb`RG{q;l1DwKVa6wMtxMgl`a1zo3+E6hAt|FV~_y(wJNnKNk9aRomWJir`ni#{#H85>> z%fz_Fq~5w4=q29?35YX#Kyh>szQ-5?_%~;Cw{C9Afbvco)MF$;hC9t|&J3b1GB(?t zEghtDLz$f!Z5<9G24zBxU5fXV5zp=?rbY|hW-2w&&-dcC)C#DTLygUN%CrmhwQ$z7P@iOt^=$xo$x zv5)s+2Uj$U68ref@8c6z-gF!J1@7Au>J-2|$sV3K04EN>m-qmD$@lLodE16Ei1vD3`_PP5+C+`Jj`qf4;EgsZyfo#k=~ z@`MOUHE05tXa>+yR5*FbgoX(zVMJ(%Ig1tjN#@-ZAtk<ib8cGzp>JEahmfy4}py z`U2eQ8HE-anLGseAen5ytOFWYumkh?4#K$2HQ+VkV6!;6$Lrq@9XRh!6O^P7*d32# zqZFx4Dl4x)yMX%&2DsE_giQ&I8gf&l{tTZ(oIRy*j?SbMra+g`2%7}f+YGy&-HS|Q zBjyXC{uT-upPovMS&_os8$2y$w8g62oa!~>9aaeY*eoZuKsSn@Mm9(vLUW1nuL-`P zMfW+c$WWAZZ&!0p8x-^GBhVOv6jD4pciJL8x7pou3|jTqatpmct2=;Cg>?RsNV_UY zM}}WXUPu{}AH}~Fy@5#{^3;+-do#(R+Xa=Uh3*skFU?2+j=3Sw@!!Z+w5_J%in zgDwiV8-_;EO{0GkU@e)qD7U1bdf4lb>C3WYWqGo4YqB3dJCETAj&Qj6mqi`QEjYi6 zqR_QM@a~mlhD1eoi4s&QQt}3rqe@}Of@1i)MU-4)w7~H~ikwm0vNUeBf-PbuK7up_L(?f|a&E=pOFNSwNkEQXJlU8?8EM zA5%N`oJGI=;$J?rCj`(<OC!t5eWI*xkuTAL3qEmdcNq7p5tT=BiI+ zBmCb#HDeH<#IFn;sH8jAbdgu}*Pnx&#Dl zM1nrWE5;GFVIF-P-3v+}#`qs1Wn_T91+9YX%SGs3GU9U_#hjo;FDETJ1LqUf4+Vi@ z)IY@eRNw%?QH8HJFQt3sYo(38PbFaIX#F5yeFZRf4*K12|FH96?)c1NuWDH&2(B2x zG+E*#iF--n5|*%(LsV)KsenrYNLer&*F*u0@w0rvKnq^6bF_tsV)uQMluxRFCv?#4e?68mu~?5Fm@V**urFG>DznO_wo&6 z^tX|^CX62DoFob$pF@)md;4er>V4SQhk|2}rYjjKXGa4&d4G^y-4AMI00b0`lG>1k z;Q<0wBKkM3lUs!C)%aF#5yJn8xucWkgS?5pF)}5*;$rh*06?nq#qtX*}lyvp<2GLQamx2*E zJsqXu;i%F>f{tpuJE8eMbDIANIx4J+EDkV}%c3q?H{uG`?hkcLMn`=lOh?@We^Imr zNe);H9YrRVVG4>i=_H~m#&57=JakH>oxndK;%V0;rFw!>5Kly)jjyr?o~dS#c$zDT zr-uab6g+c zm^;J76A?$@|6_C!M|F=g2P8L9kV=BpDve(&FzQLu zkxD+$N<=$p?;>l}iL_FSu<7`J37*qspp{}wlP&?HX>t@CrHCQ~RG2iHz*V|joTPCK zpc&XoqujAe#auWzre{}8CmD@bc$<#18^`CGwBVJ`Li*5$A~H~(Kj0rd z3n7?qV9+%P|9#j>6e+@}rCmiw+Ylr2N6~$rKH&gPI4vXr+O;E)hSKvF{OlQ7Cm!7g zmkO>?Klcramy?()Fp5ofkp6{l4TU-7o`^SHKf+v@1qB83*{nSH>hnX41V21IKKC&f zBw)&d8+b5F{qxGl6!tc~Xz$&s*bWJ`A8g);xYHc%$v>eduoEG1Y=4k%;mLtx7z}P| zL9_Dtniif4t)m_*YoivyceEH89lLP^+1%jwo0L?@cNC$Kl+b;(&-`9H-dOk&?6;Hb ztka>43sI&>?98vl143eFzPvm0YnAu33ZDTpY1cUE{`wE3`&xUSx)G;pv8xSx2RR%| z(`im&_eA!-S^L1250R%OSpqr|Q%ME`5ZmG z0=$PbSU~a*AS-xk5P5Fi!XK5Ht#~WyTrW1_a@{WJC#YHH%7;Pa6nAoXj|X}jUXs_4 zE4vorH zhWtZ*{}8+&!Q~nJJwux1d4-6Y<1UPDngfoamL_}QQ{C+YqiO?x^)7&$XTw8iB|KzN z#p48A2SM{7TRBc2!o8LPnvD|dP68`>HM^P5!OWef%ftavSa(d9uaEEY&bThu#dev% z_yW3|AMWyf7uIDs`lpIzmlucSSn*vZxmdKz{YZtotjq%yxB!r8Z|K^3p%N+8JC9Vk5q_u0OU!s@Q!(|bu{mP(b@0Ub zIV&g>_9{i*p`rmgpr1UYS1IAE2mTBq0XnAQtf2kVdKZ%Yo5s74)HXsRFAYBhU5rv~ zc)3WZ;wmJGv=)X`>a}#MAsY!QVlqcnXxgRnvw_A<;iw8Nh;vjWS`=|gB^_18=c(S4 zC^N=06}=%Qd1+P9F%n=pV8SMKRE4`SY!A_)__Q>@C7%{3N*)q=234YCkro@03xPxY zCU#xskjuq=E}ms#b26V6*fk_jEJ;D+F8OhR>EL14|L3> zk}`$6Ugp&8AA?`nv)H-W9AZyB_Xja$g+4Y&{MAZj$h(Y4tK>hBb451&+iG)!EmnBI!GpDiPp~=>WCmbz5*x}Dg@z`L1s5M4Zo=xGuz=&&Efys~ z@TM=T5WG@51&}JNJhKP>Y{`g0{$QUB|LpPX=@Iz*ajZH;^L}9QD{9~-r~l*Jy~ZUb zmIncJo)Q=5KlUQ8xDaduaFpgYD8XH)= zU)lIPm0YLH82X&v5R<&LeA9%^fK*iG5l|{(?y*LVwN93vsX41+{LIDJOb~ zfQmo9H&Y%Lz+j}HhW-L&G5AVpClLDWl-NfPs|3St-BWPfHX#%o5ddK6DmO{q9`^3^ z(-$2Hj^89+wOjWzZN}n+rrLr+ft#`-0paLiLL5%{1SwIoStk+A!$05|^!Ns>**;vm zd9vprQLtIJ*Dn}ek{2o%V3L{0KPU>6>+ZL*?`ks1t2$iZ7f>cU(x=pl?g(l~e29m% z{3aa*S7581tjq$##GmnJmHG4V$2yhyT9&HhYS}yaKGtkOyJ0DtnF?O(KDJpTP0Er~ z*wy7x_3O1h(01Qqw;-e)TWdpNu*nJ z4QZWH^VhFj#BQz)7clj$m* zA2C>BG6n03a&O2izZY?13h-a-^_v3uEH9J)0)dq>*;o6NGHn2X7M%!ggGeBL_NhK) zh1R3ol)_HqmF(d@0ghPXG^ z^CHN^9QB_Izxf@_^Wj&)fWVmKXu;$LE;q5GnoRyXF(UuorpW30U!HtX*Hm2nxa14@3$J|SMEuYN9GSZhPlhi z?>d8&Y%lo+u(CB2--~ClVx_*fpD;XmSthJ7ED7)GTXOZsg?utO9gxL zBij|bO#U||KO0H@ijtp+B!7)08q0kr@U}E?h}nbNl}h>KpQtE8T5godGnD*TBpIUQ zM#vm#95_$Fst*zM6KSDDxl z5>4(8H#w-bxI{jP7WY$&Yh)5F?xz;3Nwm11TC66~VzDHnEoN6+(%6zro_3aP;0OGC z3x+v`&t<>drWm#4WRVRrZh^;QS~Lg@UjI2yz!TU5jW}lI%@77DZ0ZP+)l{N7N;i)cFr#jM)7|^`neiWe* zSe)Nu`~YHq;hk}psa?N^f{ltlB@WB^Iv*%VZ9 zO14}~`D#o#=Av9#q{YQKFet@1@%b@WDTSY4XYW<&@EVNU14%RvaJM0`(usQ&6_P)n z1fZGZTUCE&>dD?nEioSlwcRub%|z#c_7G{47gi4h?a=%Xnl-;KwVC>F1TB${&pq3uwP5N9N`9lb9c+AeY(4Q+?4@Cb~< zl(-X>IAFcLE=-BaVk8bRDH(_d8DfxQBiSJ@f*oTqCFRd}Bs;uhoR3Q6Ozxv{T+whO zJ7h;9*+sx2f+=xV$`MpRdEJR*cFX(jfHz z!~y?dmNC+6Gwx#7IN9<{Xw%Hi;2w5OUdY3Z8GKk?QKT~P%|P z4UWAaLJ_ssy8JZJ&W55>Amq7Wt^X`o7%k9+^%RRs;&8*UNjc&`BX2Dojl(%EFcqL= z@EdJr$PMN*&ku<^LX^&lk)vuG5&J#KTZHEg(4Pt*?ymu!`{){{X$n{keooL2*}+$~ zO;O>bXcX35BF=OYanO_a@yMkVEO5kh#)+WV3)Terse~U$lu(p4 z*WpX>_;2Tr4vxV)olsFybeWW|hD3i(mZ1l9%EE}=K)T3=r~=m-OAm;$W zkY}ra1^o?K3Q>AZ%AypE3v|0A(BU3*pp8h415mG)|GJTY7PEjONy`0lFCIz9&olHlnb?+BqqRX`#5zQV!!-e2fQV z8!6(je1OWmQ!VrnUT`{GfYg?u*zpbZ)&OKN`+L-f$zl%o9ufDrMc1+)YA)z5fZIzl z8=OxON?U4yvn^5q8cn$NFal%`iie`Tkt++jH{r^TfZ>Q9r6BtCd^PicPL3jn$jU|S z-h)->!hkAk2-+!Rb3o|ED6EUtjp*>(4?~kaBvObU&t@x2wD~#Uj(8ks=I}0Yqgi(( zZ~|AVmjCzFXLm`bNYqi^>Q-01BQ9qT&GX7fD4 zDwItDsJDWBH|oFv92$zoelS6IE4K+LTyKC*@Iih=RG=&qb#t0JfmW`9?vuEKCdYm6 z*6o*1tVa-Madl=~3F!Ik$85_|rE_%Z8>}cV^_7(B@T1B`gs4`lcd0jTnxi9&23WM9 z`P(pjr$m9>vY=8#GB!9Z0BRPjfg7=jD4L(ls6u0c%r(Ty>LMrfNtgv<6Tbj5_9CfP zRq^pMQmq$pJdBVw%TGxLy=S#b2JO;n`+>5*)Ym^HLDQUh_~+c^ z4tjc2Bm;bSo09(a$FP8+JEUu`il$W*ZWqf7Mo{^XF!3NBcew+BQN9tV)Eh>}TX;V7 zBY{gOO#Se5SG2RURIa}(`ceh)-Uq#Ytrk#Q)})qr zI$9NWc$X)C1&1m$nH%K@Sv#CN+n`4Y|Jz<3$X2t2_+2l=?;pmz%$)c=fgCOvIgI1u zfg?gX(}Dvq?a>z}Rbgu*&Ls$REsrHQy~o6OSMNowL82Mc;hKr;8LZ9mXXYy!`;5af z=l7n1ftfm%xQfEUvBXh!3g*{1To;4fro?66DV%VmTg)vZf%qfcJjgRVeDP9{VQW}w z-b|eDSW2cm+M)gnJkfn+2Z>p%FmwTaAuXmJFPkOF{(T^KmP*WZQYD2zBu!5Nl}$>{?=W9RcitnODc7}GLk4dU z$8`sHfBIc&=B|Q;2C}3fz55|j`Ug2aKiM|~MX@ExtYsg2=RPax_DAa<<{^(M3m>ef zoL#pspUr~od*rk{8_S^*P{O#}`J6hMtZ>(Ek%X|C;^BDImZ|f;9bKVIm={0vJsbQ;H?j zl?$yodA5q??Sg&NFqfxq7!}Y10zj0T!%yv`ldr5w+!i0}kVogbyQ2?8UPIDFwUTw= zN}h0Vo62n98-v13LcZpfaEYDntRNjk)F*F?yi+3CFZlO~#Gw)6o@8&@Vtmy(oEfNj3 zoCia0kc~8k1crnk#P2pnL4%r4_DGL-t+3afcJmv=0 ze&hhX`ki!uW>++g95u?2@|w4jq==~GX#c0BlhtG8bo6dS3i)Oub1#ex9Y+kuP^Hry zxg&=F51gz1AX1^=Xj}SB_kUC%@dT=FB4?b3hC%`=M)w z^Ap93azVl+z61F2(%1(z7=h3BSr{rU)Uro#^=omp4_Cj^(8PFg_21&^(LRe(mcstI z4_dn6Df)v3bMW!loIg^|1AQ^m^e4*sSZvN2%7HR-L8P7#<$NSI=Pc#i-xo9e=P2jC z*qoOsXIJdoU!k0xu{nRHoPpT4|Alhgu{r-sIsJVg6vO@cE9HDRHs^1Y^PxUvWu(mC zDd*K4F**N-92hOLw!`cl{0#dJjqXzzzi-pU)42E+T|k{!1@-7SN>GoEhXnQLeF^H( z_7SM(NKlVv5~$}As7JF1)H{`Oxw4|wU6$8f>_U!?Y|KKAW=0lrG%K!mm*;gM4bM}G zli7+htU@A=oCw}XEJBI56N@mh2rqE+j;`g4S@TmZ!U=mL#1)dt=~rc#5M1!!fa-}R zd{*73^PCkTjZB=~N>bo&4U9%mKoq<3eN)sR&%kjtET+04+RX-wK-9A#S`SMG?UOs_ zCB7frC6j}QJIUSPc9medkF0gPkj;A?2SEf1HVhS0AVH=t)}=bVg}fdT^vyWzjzRr! zKP3Bj%nL1<`H~e!rmnuRE-(mYD+M>ePn=0`VRS;;FLXZ?9UaXT=7`q#&XfFZYBo;5(>%-%%YUg_IamLgq@#M z8;r?pF+b^HchEK-&bf(l>SN2K^OMM+EnR(R2|xJ&YP*~0RcPrXvrNAGLGZEcM63Ft zQ^1VK;9J0(Dx@qQV3D$i4zh(7_Kw}`mqa~0)+e`}pKEB}alUz5K4Gy6LiT`|h37RO zWDjBz&QHjSGeiysrqaT)iHNPTfSZT!Y75IE0`_(b_iN{V}dB z9~XIlh|BwDk@r7wZFx}S{XQ;lH}V*=VjvI)o|Ei%aansP>$f`unXSU+fb*e*?EQGxWLak}i|>=xAl~leA7^a*W6k3k8(zFi^Kr zmlDLf92=#T(hj4VOSxcU-h0t45tR2OLmmGJEjgpv4f^?imk=7>8a{C+R(&j1O00U? zV=sEGC06}JOn9Z>p9!me!tS4Y;epvYSmrEqx`hLo*^Wwaf;IxRIVp4F3(lrVR1rZJGQMEsPyK!Li_Z+_mc4Jr%;o* zWC~_&_v9M7yBaTC(DfP>(C9sI%6uLJs5jW8O1O?bzqBu-xwY3GZ#QdbYi)P+!cOU) zT*%DEIdY>+;Zr7TU4#joC_IxnsOB|esRc%nG;e>8bR?AqPz#se(lFhUPx zmb=P5#1T>VDyZNfag{}9C})tqs3uOZJ|TTD(!GL24LmURTb2nAT&i_QREY_}%2}iG zJ}rAURG%6x4?o6|E$oGD%6(cbgs{*gGAlRD-U1#}3!JWyF&70ZAeD+VzR(MeqO4zk z^|Z5FnZ!I#*p+bl}P+`TAe#{Ngb&@4F8_{t7=Vqi|i0M-d2L9khL z2Hk3bM%c|avb*^i4^LrvCz%V5$CL$g$>IsdPphtHk8Abha0RX^rhoPq+LLTn^Dty$ zW)1GuNKNXC7>oZ#YuyRYPs14?E5ce$BLLz;T{@D{+ORIdv zFkisFzC&3Uz4w&X0yi=K6L)gQSt6#m!=49>_l z`0zMS<&%Nn$C&;Y`!RVEInTqt(x7EOSNIth`_Bs~KH0k-WO{f~1|RWR@&I$5_Z`JZ z06Jf#v4}wDD~hFM7y|VF-4+X%e^Ur914jg0!U#;jC2wKhqUn+V=Vt&oxHw6srSA4B z3*SLgf8K@nCwB5l?j2TE%-*vX<_&w<4>T6`^*&f2rokIZMlv5FEU*|lr6)WH&bpT^ zZ{EP(uQX~|8qm)B3GJj>*iW`8AGuhx^ASQje+JsQpU}?V5@=_}(ay(#cFrZx&IGh` z2x#Z|1loB+(aw*6cK%};w6m&tBfCra0Q87~cJ8ux*n$z(V0nza!@_>}8j#P&3Hh7_ z@_B%e53o>z=9yud#{=Z^rv&nufPB6T5x2X6*MnEuy62wBtt05`Wb{? zF<1=SU`<6X_aSuRe$Nq+c{PGZ?%}6#dP`#`8FV;qgVdh1UiIuYI;^d*uqR&wz4S#w zS))K%|3)b5X9<)w<0#7ql=VUaWlca?KLX17%3BjDZe%D1q`UjuG>f^gH1ftwByZh9es zn`Rt0eFeDbhY8#?0XK~RH~A8{=?%qAF9SFI^E9~Wzkr)?Yzv(aJDs6p+mn6DJzDl7 zLQzllf#dY7W`upM4?L&u;w_(h4NRx65w1E0T=iALRXagpwA^x&>M<^UIiA}ISmRrO-H%k-V2Q~J|DV^ zP(<{A$88O;t4CmJ`w(JD;TYGg1rHqv>TyC)&jUdLQ$5Cxqv}Uq1A=;r5Y%^oppFoN z`hEgI%{YSkHW1V|69{Sof;tHV<$dcSs5e|NH-Pc~(3FC?-)ou|JPNn*za3Tb<~jIX z6t`kIxs=}zk4Lw_Xo#HB)N0v>wLnd%21=elO+a@0k1;wWp1JqpwX|O%-1I5nrqhI* zKAXTzGme{n58U){0yj;-O%GyR&Tda=X}^(L+N84j!j7r6v_GY7-r$8JGK2?Z1B8YC zz5`gOUpoRPTZD!F0xa~0doNyT`*(ze9tIZrEn%U5NnoKF$3lO^YTJ{*LKCpi9*hh0 zN#BaLB3Fd!(v!eIKiM&r>e6Sl&GR2s7SH+32_0P`GJNU!m;SMKQ_MaV08>Khe@zTYQ}6i7>Lr>@73s8|6X0-4X^&A;P& zR42o5^$wrq@b=FAXRYivTj3>WTD2@;$+JSsPm%i-MCw{{Jv(=m{zJS9!M zwQ5;@`#pi526hH-I|x;)G=7{6%7vq25qe1B&x>@q?jfnSC7c&8OeumQmp1?h=Bnf4 zs5;kvID$ljO)rW#WT{Uf_ut)6UKn!jRAkf zENuU_weSED6MN<+x;; z8nNtT&5#Wx=#(qm-&+EmB+!YLoDIC;4hJ5c!qdQgthtq&xS{1SxFI;fTO!oT|80Y- zH|~J>E?6obO|Vq1IA4+p+>*d8Zw6B3(;!v;zD+SFkjWM7m^Oh-63FDrCR9Ev36(4d zyJjCZxJA@kxYG_R56#gXha;tw;IVwDNoT^rHe3~v-?q=g7t+tSA)?p-T-*-9JNBdS zh0U&2mTLJR{9li#?yup97f8y&+zg?j*#F_GpCJ+xB;W{1aTJkB7X`cs$BL-*gYdaD ze2AjC`sr$52zGMKo}iMGtgM*Jdxn+#WcF1T>L+i`N3RwU#@OGSYKHq7xOY}=PT{V- ze31VD%07$XV>gxjIRD^mzza1bhGKGy;$t3nKgRPRyYlgDR04O& zOOuZ&OXtCD@0w(GJ={@Q5bMl@n8N`mM7iKid0stv^UX!*B*u6Y!~0k z^GEqN`BSV%$=9;kdLHDipDBf@>{H$9pa!p{L6xI;{2X2~xP8(g{7*#;Vak2s@lsZ% zo@cn&@)1^J;k_6Rj4xVafyub=$0-|3A*8SkbR7x`!BdiKsT+^ z1a!|ZbiV`8-I9sO-_7iSiO`)K1KoTi2xkRAn{Zcfl1zmsN8O(UaQ_DI`w0Quzr)o- z0(Ji$S9=M#$;)N}xD&vA8Bq6p0QdVd5dff>4NL^?cSeEx9?&I0_RVdIL(9Gi=>GOp z(7hkf{YwDwpn&dQ;cB0N?qB2T5rXbh3FuA`CYOgWSqA97Ba;Ul0xk*iQl7{~CsFWl0J*DCwy&r^_J#_%ncE_zMR8 z4W9z+8v==|eozE)b9n(A!GT`O=`t&Ey1b~~q_B|9BSTm$kfKivJ0mL(1a0-~umB_C2Cx zrl?Skz_kH~8XN@I>RGU#=LQsRJ)M1qzqYZk5pS=@`AAq!zX zmfloXcPDyu3BD@ybk*_xt~ zsyaPBN;T%Hb+*dl5_6%IDq5wfF11yb)U7S4FVh=yG&Sb3in2OeWpzzek=|yDO=_rN z4!g6{ZtrSu*lfq`%9_{=yuG%}R#RB9pDY zQol;m?%Hf_ZMS!8$|`L|=EBYn)O=`TmuC?)QO-W@{abaDd zeuYs})X>&e>uhkgHdbx=fW6UKVRyE4G!<$9Lg@|5Henj?)l zA>h5Da9vpups93iVX**(y4u^#wz{+2^QY+l9R!?J&2%CN-47n)jIS!vPw8a%09q4(w@TTz|0xLsBc|Kow=59?(*E_tHs*^t6g?itJ;8Y3RM-C6s^c5Bx1Aa zjU^d5t8$8qHIA+hSLdd!a=~ew4V&8RW$jJ&UQJs=x3dOSwc2~^b={hdPAC2}oiujN zUUO@=liGt-Uuf2^TCQnvc5Jd6SETm}xar=~&}lQS&?8AeSz;+E0%Ab<+M+6qf__D| zrj(YP*>tBqe6b=|!g^_aCD0wJEyN!{ zb4g)sT~4-se((I~FgW6d0V#0{D6`An9T}oXQq$1o=(KeuK07-rX9+NQ**bLFR(WStO>wP0-I$e~ zt2gM=SLv7P3DtBo>!S#_t)tzcZ*6xj!8$4h1Qu2j3=le~D+7M1t|=)h!_JF+qOh_` zpRH-^*u1#`5EvaSbrdUsH>Vv!cQ?U(2Z4MCKpvME7CZr1#09}eX_-abE0g%Ew5D*KK08~3ZdFy6RO$)(G_+yR zQp617?oG>XijrNxjkP5eh1Kh^W(DyDI;3uWO-W&~%~XP60_i8nk#TuMap4)-^K+JK zY_|HcN~}v;5%x5Fqkh2xeZ2-KmL|IbNL8N>TvtuRb+TK%r6s#`D8 z_?A<&*}l0M8!@OFr%FG>=HRV`byXFhy=dpO00Oa*p!L-tB1DtvLSr+R)&e2c))hxd zxG?gsF0`7f(9znm4JG>J#%!Q#;20IX*rF5%I%Y1Wp{v!;&)A%kJs-H*=xMM4``DZf z9op|x?x7yp9x-)Ig*3I^=%;>!sgi}*ZGb}O0)JO&+0pc2MrV-LtfikNsii2`- zu&4(ph>bQv@rDsF^|!dBuCQpm4NwcR3$%#X%s||(*XQPFfb41ttu{hK1k>1b_Qx&-(L6f}K{+dx{K#Tct4`kVFXYSE=2!RS%kv$xqd6Yu~d5kP?+ zDJ#PMW-9~$=dRXtR(IKZFtSd2FZN;D6T*OdC#I;>Twl9h9aUQ6aRu&JS5sAAT}${q zQYK3yI|c$Cha-Uv(p#6cHc|6i(Ha+s_0qNmNB2hLy%%_iV5S&Ej=i#@)7;U~spO7@Bs_3hG{YdwmH`egd>BOVAB$EFud#xDnIiqTyUy0*KZdSAd?1 zBAS}2we=_uoK}U8syb{1u{dXv+k|nj0hvl_Doe~ZK~!RF0Oz=|uBZs-w+eylY*qDj z)gac17?LAYNOOywYpuD&2GmqmiWY;~D5^5oSJ1)6W-Gzw11ic~t5?ZDalXM}BL^K> zfj7t_NiAUwfgW=}wF+2STULkNRiC>O4}#3CvEZX%L=i?Vuf@h*Z7wV- zSzl!?2FPXgt}I3UMN};gFF5(?<5B`ht11dHggKH9?6QB*Wyeh1ZQrUFi$5kq)6&pg z-qG5wX>fLIZf(S@wb2R&>0`IqdjY7}6^VeuiDzqj{B4jJHlpvapw^aE6465=i%~IV zuM&+bu~cJBR~U1bhZzIa5jPR<} zIB*bMU2Ou0VpZ3PS*H!mrjnPUhc=X@!z}&O(=pdvRaL#Vu*gJv9w-_NO@wN}5XPj! z5K>W6K?i0%Xq{DAt5q5b@Id5T?fMe4*;WXAdq-IvKoG=UO_-u>>e$@S+8*Uj0HsE= zVn((O7@_PAAnvtTOY5-VIV;o;te%5_0@ILk(yb?EF%bMi~&(Fn8D?_ z#;jb!N*}95qtomp|P8&F4`V6C(XJXX=cJB_;pwTqm zKqFTL0!t;j3hO}X)#;bxYz&TwWo_+po4FdJ24)C8BfOBwZpimWSqqY9C028T6X(87 zE~nkrWCvY<13kDNo4Xx0TRJ`kzaUb=Mnp_(Ib={F00yBdqB779;Ba%v9XQfso2PTI zI1SS&yR5RbD&5wl(#3QIY98B7YeO5hzb5Q8%?)kc_IMf?hYKQUZCEL^ZjChbVwIL+ z@f%l6Sfp~PVzGkg1Fx*f-fTk^RE#zrIv*Lcmxpm-GZ<7(@kR2(EVll2+3Jnay#Y%q?rTOiUkcc=6N zC@b10tQA%D*#3G!!(u9`fh%iq90%PNT}d&BILx{vgj_N;wlErVKvMzlOBS$AB7Je9 z5QoJTxfZOVb+oxk{s<_G(lU_1<@FWSY7c0oPqy4>+Y$M4u>rKfizzY@Z#j%g1pY{$ zaAXFi?{dmBa}0?oc5UK|H)>TVkShk7EFt}nzBj(Rf0r`%h7<3Q&Cb|OSlhjs5Rm6 zug@cvTFeb%5ER)gbT|X4vEEi@TqPO4@mXkADNZIObz&66m`A4)#BGHATv5ADP_$F? z*;i*_I~5NT6Adh`k~&~NjMW7b^^I)+>sse#r>4=>)rFA)*U>@X-P+yI*4YATFv{O- zB#t981a}i$S5Y9A&nc(^aQg`XtBmkzQF^wKm?|_$ot+&x|7X*p07AU83`-01NCN~W zJoc{|WT*Eo>&9}nZEoo8R`HEwYTLj8(04mK+Z#K#Vl{UWU4BPH8@N|!93G)B`Ba9i z35cfE*rWkblJKRg zx_|q5=3F~2k^%euc(S`pL?{%B*s=Gz%r)0q7RJD%=_|eAbbolyuWCNFJMZbla|>yQ0KfUd;^Le+aa==tFoP>{JQU$+(yQ z0XWVtd;B>0Fn>pj+0XjQQ;&XjD5nN{r`=|KB%q3e#u@UX|I9p096mqkGDXwzg}`&; zZh=EkD@+?K33*~CU?7-qH7g4M3yFNm!4RdZj<)nqPKEFSYV|wFrQc*bAK20Qk0b25 zfPfi#Jf>`UHGeB;9&9q~qQYUX+n47bM&5T?e3BcDVmaGA zlo-JuAsQh6VpfWz!fp-^iF|5Y;MJ(bnlMqKSXA<BfY5 zdkhr$0+_kfTDCZPz@Zud$WEqLfEfrD{o%&tmL4G3^6*yR?4B+~aCGzd_y>ZcsNV8x zXWSt3*RaNmx3|*30QUC+W8XYD=9L)mq#q44+dncdA)~|#w zld-Xs?BbTdqZl(|V1ul%RFg?5KL7{#6w9=OcPJ|}$Ci-F1R&c-M{l|TDj^i#4-nsi zTCq8LGJ1C&_yy*}!Dbsbnu)n1;>5w`n+|idF3f5m4TniEdm29ixS!6;W={MEr(O*| z4W{w;&+!MX&+1Q~APEK-M!%27+0RxPh+*c!;{u5FU$S-7y-&>k`NEg%oAJH$rB?H$ zZ{6Hie~RBq-&*>iFNGUe{8U3fH6BhM$KcI+R17oIM;z5`VWDsQqr@0f_kM2s~_G?+<_U_Xl1|d{Z+akTR>Zh{Wk2{t)g6YVK9_7Zzsy z&@ZF$V0HOfKa`KZ?}y5l+d3uCO5{<#U)+~<&J0_{$fx7z&wC85RZt=Yyp8EKwZ>WM zZ9IGM4(45g0TEN-{9M2V8_Tta14LHn69Y{`X%BZ08+%xD;kA7kUVa*8#KehTyg6fS zo!e>;SUkCo^+)2X2r?|Mf6d=)end+d$71sJPWDW;4(9@8Fv7CPahcf8gDlfL)Qo~) zyGGFB{cr~vTk8pFjhiLP+Ij1nR0L|Uhgq3#gelv5d{@JAmpo^R$oAUa{H@1~TEkL1 zFc`?&1VLg@r6RpkdpNzi_7B(s0zUf0gy!aj9DNc@@EE`dN9Ur0j|8j^0T86Bvid7a zDfZg+jb^jeS|e(`y1uf!wzjgqw6^dH`$4~OM=X3a&f{*eqqof5I>kK4(mutW#LFgl zFXc_l@ppzb!bwEt>ixyHG9vm5^|!p=hbbT}?4&yYr!U0abIJoFFlXUPcrL`W!9N4t z*2Fo+Qa2TAue;N)j~BD2UU>0(dpI@Ny$eL#JA&u!1Be}1U^rE-heR2d+gNezE zv!w2I54HynqtDl?%U@Wm&^-EYMKxJjW;HP-PLI*Ef=UIAl$1C`*fo&%Ra)O+mdPj5 zu;G>ta^sDsmqd>Jh1%6S+wKL7n{W&p%4lO?+lSo4@;zH{2xq{U1;nxg(I(`?OX$92 z9&aqIYEiW{bl(~=z0!z*2FK*zJL-X^F9FPH6##}4EM7(#D%!Pqwp*A-Qmir>PIq>a zOOBheuBdB}@B|Fb23wcPxN4T7)BIk{?W@NWDrH0OQi7WQNzt+Q?9y1M<%n#WH}W6t zGCgw~y{|Y>r+r4SK_IBYdg3lx`K)F2X3NUQ-m84s)5A9am4{iUiFp*lBB$qEAx2R_ z`;I`0sbt5re$N`a2NiIfk%6z82QzwqM(vljLayZ(v%3qpg~Lw(8%1!G^_(T$znIM* zm712|KG`wBsnJ3=oEuz2E!Z^K*1SF*{Ce62*kdIDdGMAsXv9Q_$3gViCXBt(3Tsh7 zuLAY>P#|bo-J=o*VJGy{;eTe8SMJ}N`97=`OHIWuzsN9z zXSE!MCis(gpxRjCYaFpVo-EJcQ?*{NF0Vk#T4^=b*PF|0%S2OFKn#~wHd?J!uG839 zZw_BAZ>%)-e;8W>SiZr?8@7cZ5BuU~_5Oa_y?cm7U@wj+i%e{8)uP$Ka)l+d!2_ZM zW)9gjHWH7JC!!5cQC5wt`)`i&ps>0|S6@N!t`{#BVMl?RF)Ii<521z1N*0eWrUJ;+ zpEH3`IVy{1@k`ba2Bo7FCmRC5^x}Rxc*yWR{JH1SrA*698**HWox$J|(%~x>v)~c! z{gO3TR!md9gnZqe@1gBy9;31ESUkpF-#^4rHq*%yIJhh5$n@ zei@$23+~<5t)NCnNBe(z@)LxGs3GF!@+|9^=U7aGPbLn<0e1a!f6m@9aX$X}$;-&o z$gd+SX!b(s$PZl!9k7qto8OVlso7hyf%QZ8RJ~MgnpLiqANrx&Dy*ZYhcWmwX%uaFC5zPS#z#|7NTG@x_eO4s@3OaC*2gtO`#&NA;{&Q2wsg(*G}wkPpi ztNP{lnAeK+BaNzu!(A^wWSJ+b8K)(11Q-O9>1H}i#MKnv&X1bF3b73R3Ki6z-p+V* z*Mo9>cTtxx6e0ZXqA%Q^-G7zs2})wY;Ki&!L4*kiHIF7c;xyG1{M?asB89DAR;1t; zgxB?JM822`oBO+BDe#9oyu2sKTtcYDfhvS*UUP>NZ*WHY{ol~C(Az}mt9ROaN2o%K zagj#YfQ+U;5n23arq4V7)W2`yPrJXLoSz$9oberIEgUDAT|mqt%fpJPUvt;>`t{HC z{|$#$A35f*un?%A4sc=)0)~w*a`>&tCm+m=I~X(u$K7n{HCnT^w6VUv%HK8Y#I?o> zmafu6Fj@dE0u!xY5;^5}VQS#|3-aYT;$YRB?)2Ix-7RrYSqnd`Y==0EI3T}14#!`m zVxZ8#$);UXKkZ+Zm;TsB;?o>GogZm+IbTjyC!4x{!+{QJ9 z(|QDzA9IsjhMp{+lY&wrO6a#L7Yu$f1z8?HUMk+XI=HyHB0GcWZzcNlr(8%3e@^Y4eIH&mo=d^qdtnvF>a2D>$T6o?HAy%z4ohJ{A zF~XG2ni~u(%X#O3Xl!FGjWm2^gKz~70S)fBARXd0V>F7vyz1BwY#q$bAD$|3116Uc zB!-$N%0m*(IeP`tfpbi*$k?Kgkg@Hr%7K_8^7)8Ropd2YRLonMp#ss?^CTti63aNH zD0xSZU|RKY=ioF0+OP@TImL?W{F(_TwFlUSyN?ujGdMo(Wg9EuYU~{;389y)Ec_u6Ma8Isg@hN+eJPsyQa%>ZFUde@LYBGgy(;M|fJF02n0dWZ9?Wx4 zTUy0l!JCJQW-zk<@c%6>zW9G=LjF&~$<*+R!qKn@BH4vEqnHIbWF-ieM6%ouBy);; zh#D`%MIe||HCA0s`f?9^g>)jN6utW813Q`>C!1XnuGR@oNVq4Al6RS$?N*DcOr{WF zCe!KHAa9-K6bZkyVlS=`h{N{jNhB+w0U%B?2HPF{=T{K@rP< zEUrD04^2*=eKZ+b_#%oUPOT?@mQ03+}TyN+6nA?>c zPolU`B*3p66C#;O>1NzM2|U}3NQnRqzdS$#0s+d|Vx8TRImUKne)mozdLEST$?#52 z-_-H)}0-N=Jd&Z+>@t0J9<>2k)6 zD>|OXc4j>P#_Q#!Mss6*d6h`j@;Vx5ZE2$kbh@#!-fFIIY&2FIEj<5~9ibpEq%9uy zgC_d}=hSSo5%=alOKlq#pT%Zj!Fx4J$;i?O;V*%-qfDMeb)M%}1UY?yP@E`|=0RgY zIt|X`heQk)R3Mmt9#sJ0ZLyNDkPe(_ll)e&sqIj_yC*jHizmx83_9*-?50rqsbMra@&}XRwb_1SmPXlxKxCQ&UVjgc29{lQbA zyOC(_4V@FN`wCg7i+Bplrhf$j~VcyQTyB0AT2C84XO&M80KGSX$oth)6FILZO62s^!Zw?kSSok7$H2JXXnG#xF1yIyc>=HmK@GcTO^ zk5q8tMZQzJCd5ZtlP=cT+{r`)z8zj%D@C%%!9F7cD9^w?-iG00asy|UJGs~`#Vr{) z?-zN88lpT2X9C1fe~%5Pj2yyPlmFs`zmX$!Xp{5w5Utxzd^NsxZ@*CCO^Mt152Y)= z+QH}AWwGTJW5z!k9gMZIScJoTVwH9|aL zH)TX{`zOa;l9<<5!|3T@G0Wl!=dIUSX2NKZh2M}n2H+o?=q!^b@)Uo(x_0Qvly9e? zv9J_oSjx^4B%yREB7N#c7x^Ko%#h-Lb{bSCTb_C2x+2Yfmtw!8=O~ zVv)(WJKOvq2sKP>6jiy220wYY+!>88hyBY3Cgjnt4i4x=k==l(+xm^X#--deCRQ^@ zuUKpQf!Ot=b~U&rQ&9gLp!vh5pEJ*-G zx;@P;Yk!H8nIoP;*sLORlEks?uo;(DNfCRog#jcypI<^FfMh8=OCVZ_Btbu@oEFYF ztgWN1&3$t_!*1%M-h1LNVWF?dUrCmagH$Qo3!c3Ie<|Kxk(4*P*g?>I*hbYekA$D(mS~SH%y>$|e|oxbXUYfj5P-s7kOxoD z`y)kFG{;IF)x8~X$d@c=xnYmWB!Xrz@7XA;;v@}`j1=J)>GFPqHd89VIKs;6EPx>LTJ_BQyk%pAUpJr5Zr;e3*&Fa1FO>I(eVEacC{Qq4R@a|dgH{9hq}JG8=RU|p-C6p@Ez&X0df{V^axK2E5wYa$Bwltp_E z{SWz^mj}T}#VR`j1BuAHt%S4VJ*i10S=kHOtQ@G}ZGbgMsPc|DO{_x5QF|#NP*4Dm zpVg+^zQT!h{iFQ9d!-ExFYfTo=03^pNtubyYJ+Q1`=Dp^9?3--V^mjB>CLMvGjvh< z;h~eC2{VfU0JDcL)&=EAe~msp4_zJ(KX2cVk~vj0l83qGhgg@Ce-h?$@wHr&bM-O2 zPK#pz?9hp}l@<(Sad`R`c&j(`MI%NzP~P}pT5`&Ehf|;xTTUH{6OidOsS!fl%(etn z*gQms>pel*f{fDHJsTXqA@Bbrt8CB2xXzZtcKZKqj4Q>jA{#sfu@G=@fPooeX;pPM z^sbkcb_5+{pcsB!4@(}lcv*t2_HNi}PDdZ4@p45-t|+?J6M#-tsm`s-7nacjehIHW**ZWK1i0b3^ zsYdqO%MaXG=f@PF7^s-U3(_4jG5&)p_!WiJ(jCi|d8)t~lBmB|zrMsmshX!bD*&N2 z`izMhZaXS~Gb^0I#EyBHH|Tl?Do5ZVQPfZ&5xj39kNKSI0Xsaw%aDtU0}PwdiI(gn zgbWx%cvFHhW?X{*}XFc^OiqtR`d&(wb+pJ`g;GeM|pJJLV| zFeS%O=}MQ%YA&``q#x$o=;G)Cxr{ObrPy%l3j!aH*y||M!8t<>m!TOqJEl0p(U|SKhBOD&rh8C&U$G(&LwWhcf%&hWH+Z_ZS|R@`xHg3P}MAuxJ!? z)OfM@pd%BaP|cRDBf}Zgw9FOR}*##Z>|d`oGNn8Wm>!+FNVb_+&7S5C(SHI zs?%cqp1V$Hh))C*HrocTxB`?UnoVtMWo;F^D(R~zK`WPHI>f_k$Q>uD`jto9d<`?|46vSe^t|?N;tJ+qfohG|`;KQJP~ur; zB#0m4?f|K6?T7-2(blYCQ(z7%h`N(iwmCaE4LjmAfcAD!cI06RB4EcDjEEcfoC8zl z@&bD#$B2|&)_WxCiB`j_s+6^ix|T{jiRzQrszyW9kC&w=15vilVNNw6NDd4QG&1O& z1GSlj>t8N?aOD{1(Ix7%t)I&omiy;!StqA@M^gVtR_k(-CbOcM}yB7<9qz)I_U8Pn@#fTiI4IB zSOZx)ndKBGJKTGShMpAh-rxptBu~+Dg_17@I_pS zhgyEDSdU^f0YaYu3R2?m`N@a5Mj#kDU^*+4L4a^7!H6CsO>8OU9&W?q84$EO-#o$J z>_fb#K1QHfyN9PiVt510A(?8glL6mi*p&hzLm5+qv=j(SqKESu>H`?5c{L_BQaL6a zEwckoT;Wf`Yj{g22}>E-l&o)2={1ds6)zHMhJYg${k0qeBZjJRb$w3&4g^?HEtIdF z0BRu+U7@0i3xL=n6emx1H9nuNJAZxd^^!VBksz zG9Afuh~XO;|29qrt>|=Ld;l^~i^m!$3IuUxs}8Ci2jN=+ee1csA*CUEwZqL7bpl04rzujAt~ zKJ5b`oq4GdBLhWJ1JxL~f4nBRcv+s&P(3IwX8-VwoEZKv^;x2Aj25xwAq*lPyBG@x zbzYVhq5i!31+$OZuP&7^b3oQW$%H$An%+Hp<0rSLF!Nzv8BL!=*+&S0BF82A3k+D% z-WL7~=9)<&eoIJX*7X!V=6EvQzW|i~usyuRdlDK5B8vcvjm?vq;RRBg$VFCpJr;#F zc?f1M0&=>bVaMq&6zEueV`^Uq`Ix27%{6Q1-5n4b>ic!J5pTj3q;@Jtf%M|A z4Jl?Nvg%A(NHV5&h+iXl1%VG92r0$SnAf37RG{6PXHeuYY7iRFYgvdAdMTHkyLUtM z;#F;nxC508lM$7~Q(V^16bU|tgIGvpK|Fu$rfi;I>uyc~uBqef!Hyb`c@0Mm|ICrf zlgz}zZ3{0w|9gbCsY|;40>TtYnpcw$a^Z zo=|ufKKGW?wYW4TZ6fDsC<_EBpc+fb_4GjHcYPqjAx~%a>9fPcZSx9*jsP)yx`yk_ zEMS7>dujeq`Z0uL;WVgb2{S^(4WPYTg?r6VVJcY>d`PyKMHRI)SV$@WjIEI(*-}Pl zN?!uPVV!MnsSW`befxwt@>Y3^MS1a{Z#W$e-YSsh-s%rT@h}Qf+DpCnCsIC;82asxky(tlC6J!k>W~}Vfh=jE070ZTPg#| zVm(mpa=Vnuy*%7b1v#OGQfS%3fTm;oOsdDW`X>2PMWTeAR)pJmr$cF?`J?jV|CnL7 z;kk^z;^kd;R1}G-&_V>9J?KFI^(Qg?9WiBFKtvW=wGMKohn2RnCgUNmfI4qJq~l47 zdghAFlH2I*9o|B3_xbgPSt;BCsSqLLWVt|veBziw(|Hh#7*r}I#$TCXOYmb;!t7IH z1||&>W=^WHu#@3?6-_mfW+lay0ByC{C`Tt|4N#<5HqU(Mdu|Snw-7vXP&>Zi>H!TK zz%H*ZHkcG4M6_O_P*w0zYiMvns+t;gn@B+4{+pY($Z$`jaOhEo#s2?#OXa7lXGj>! zZiP!SA;Q(;%Sxf>VF}fxxTPYrFA-OdBceZWXopi+BIr<1B48=MZfT0fyAUC|cQnJV zr$;ALx=5^52Lkfidtg1-F!HBd{WRG8NU=?c7|kP_I~Y7#XVoAxlA@I8f+Dr8lC`7VA=vAAy` zx#Fjgglg-MjDFD{!u;>SP}q)aPNAwl95RIOzjZ+xnL>pij>I=qSx>i$r^7>MgWa^n zAQ+($Ua;u`W#Q^a8Z~i}r<157`zIxH{okcnBh#Gnh5GXIdo`EnMDGO79TY$AhE&dH zRZ)}L;N*rAHwbVb85OEu7shU)aYcT9{_0b@{soolMdbt^frh?$LjMg6ckn~1(cvXj zn?D2#8o-EYG?Wm>|ITB_<^D{?4MFdI|6uyT%hn1|4}%1OB*MEe^+?K9RF!w69HDBO zt`9Bhkh6BH-bNboI$t4!SNv_Y=#WN;`h_kM$4aoUat_F z`TT^!OwVC2T&I&hOdBZhP7M$PLar38VWa_?kC*^0V06{%)zcsWFRpBbU<;)kqy}sm zy%@{IhrNqWk{jXpTGV(06?;(Ov?t4HGB6QUz*y)vn5wy3xPZ`QqQQIuh4ww#k zwX=eVAeGCcpqoh)yKxrX0Q~w&1|5Hz@kfRndkVSor&?z1Sb^!U4m~3%OMfhC zPzwh+VACFjXDL)f{;{5k!cq8^QMw^xaLd|Kr+^S za0V8^Rltdu!qMTrsJEfvLljpF{#TDE6G~_r0+C=N z4p3-U4&fr^(!#E{CZ>HLA;R(BzSsDjJNo#hy~!n9s5{S_@^0FxNS{)#L2{+M{IgRF z)EypI6c?PqzbPP3aeH{2)uQ(wZ*Ff@^Pa=ph&l?$d2WNPo?!Rbs0Li8?-ky~VZnWu zVhSz|BU~nuAc`+X6LLvXWssuguU7<9Yo9#0u$!sVtTZD!>@-|JRxUl`r)6yK9%(2D zXl@@%56(bu_tz}ns2!Tf8ciZ#bCVM$$2ye0FN$i8G}W#{19h+}-VI`q1uE}|jrPgm zzW(x7)eVTPw~@j6mh1rN(3?Aze5iaOiFup{GgC-{*w7x(UOE~k0oh;ctx~Q?FopWN zmT-w$b<)S&6UGd)$c~wF?vqi(0hPEoqP9Gi>ft_ZefW<`gq}{+-drLt} zUZVe#JcwWdEyHd;4sR*$FuI4mRf2+~9bpYfJ?jHm9VtKv^-L&Zauwn;;08jFbJ*`+e9M6Q1Vk;%i{VkP)`B zEkvH)K*=o)=e^mWCdYbfb$LytcQk#OWu47~;EAMd1tDF#2hkf}d%5UKQN>3dNn{#P zJz{BNwPLayohkm4WU7e}a2^U$L~QfBk!VoGW-*^|$8x2i!7Lb0nJ2+hEGQKu!$HAf z?q2c!ZmAWEp~XgVB3C^B88<`cc_n(~7 zj(V^&G1`dT$|5HK(SGCUswj?zkZLJ%m2yhh(wECv7Wu!L8^XI>)tLMh=8-GdZ0LTN z-XzLpOQ+1jz3KE}`<>L|0ZehaD2#)7b4^P2{Uugf3`()fSICY6EEs-aNn$AO5ASP} zNWFHwgSm8U@dV`i%1srrN5mnpvA9376q{MACDfg;flzn;@Ecd}Oy7Pp9I9l~Q2bgo zn!-cmkDf*|5HBd4KPClfh?LA?g19Eute@xlSey`bwg4p4X#_oNk!m%HP}aVF4*{aq zOSxa6{IME8k14D$ct>>;$WbPRTcs#UFB3i%MeTR`irrkQfe1{hfRV*2fmgudKns;( zFvLZyRV-7C^%nz;s#uoS2bM^e9?ikhvY|@9uZCAb`>}MnDfqu2nLCWdOg4v5T$c^!i+vEOElSsvOh|CIWhK3ol+vsax7fc*stv+bU*bn%Um*e7p?}f z(0olFvSmQ^(R zb%Pi+1l?NtC31s=YL9dNggK|i%m9=I|IXX-0D{B->YOby} zG0fJMn!|sEeB9g-!7}B*r~0Fe?d$>GkGz9Nw00^o_i!-0+X`}AN{!JEJB0L7b_^NB zDU=*GxlBrhlK~NU+_&TxxLU3vHp5HxOJQz4j#-|hlh@p%F)n8+*Yg>)R3if-7m{5b5+RLNQ zSlyL|N(5eApy2i39X798EU9|L;NAVz>o~cLTj*_itxzd=pgadG5jiva+zEO3H)EjB zLQY9iI+;N+WA3F~xpPJ`9G%UVEoHD=#{8_?p)VC-*q)tg;-0C=FCi-e7k3U+PQ;R&nhTvsYmZ7QN+f>_XE-L zseLfSDc5=g2O;iy;5my@x`3-qKP`|QMzHLtAU=YoQiVcgKxBqLW&c5TP)hOBss(YQ z%bb<_6VL<2u?|M0U5v)mp@EgE7pSx>*$j-NS*DsEU=gqaqJ$cjaB>A5ps9?fvSf-x zV3@9RHd#AH7$W|g=lvrcu&{*+a(B4qq*(?#e9193$&$k)$R3j!o6 zKa#XH!Ua!-!**jarOR@rBvQyDpv%V}{@gM`7v9KAJIeSgXYk?*=8xmXT$MHzU>q&HAG?6ae8buKiEJ${zu{tYXR zN-xOTSbarz4CXOjnr=xXGf(_H;za_1sz$l&y0K;n+?Zh{!{q=5`4{j$%c=<8D;Y1i zDswe6e}?Vzzj@J2Io@&_^VAj8rQAh3KrECqn~g1Xf>P0G-hJBA4XOL5b!Z7EnG?f| zVpUIEXUa)!5KU6#WT|z%j*A}oi25OF?gC<#nS#5+>E@-H>zN=~Ptd!ureE`l94aw6 zd*5Vfrj}yeL$x!R*{eYrt-oFT&Bjb@l@2qiHYbWx2uaTI7f>)Z%MoTm2-y^{iqZBR z+|#8&B@LgT<%1*EC<1dOA>O@jD|m0rm1hoPx{aj?GI?9=-C+E|U6{n607`T4nb>l) zMuIlRs~|s#AJWPezbm-MDfb3L3eD%va)sarGO|A-7zdDu6 z%M-pJnbVeNy%HZvNwGdb<52bG7G!T|!Xj)3`{hEfQs&Qd=ay7U{Gv zq|)YDuf`Lq#jHK^1y{VFHP&$Vs7ug0Zf6*og&h-RM2HJAFm%NQ-(jjS3r-KC#w=ck zU4-tI3j6C5UYFXxIYEUmgRCwZ1}hz^Y-5Slb@}1;N}!%Uvz08+m(iz+RcZ{#n+Icz zk}w3%eNX)!Ig6U2sscY#Qb%TzyhJ~JwR^&^R6p4UxqJTMDU@X!3;1TrV&HlG z&I{PNS4gVL@62dsDI=u_yr`YmrJY4=V%0bpu8n-DxaFjEn)F=VfuTp%gUo9zo7Zxf z(qk5936*nVRUXB+imWt=Gg#YfZZz}ax=p#lM6M6z3+r#9$9dh7u2LE3Tw2Z#HjtXK zw?oEqZ&Pz{lqcf?3R-KRwT=VKA41#px1kJEX~1P88Wv|J^9aH!ky;gf7ECK$N}N+w zo#ZlEiB|UcPV%Q_`7NNVGo1m9G!Uc|&Jyy3sqC?Fdz%oEE+A9hLV(4Im}W@<_@S3~ z)a$~}S)<-Xg_V|a@xOP1rxscM4VjT?u&Ml8;nUR#t6kp6h?kf|6JmQ(fwOY>uYZk~ zgg`8zFpNA1EErskVQXJCVSnHYbV%?QR`rF(aARNSP?DsT=9f>@+%G=8|8CL!Uhbe^ z7#tj{8Ja_vvZqN;6LlwBPP($f8SM2B1UX~wDiDbu{7B`HFE-iw3WY|%@Kp3DI~$yo z5VI5kDxm%S?wbz8DoA_dsj3L{Co`ZZbE;lqqG3E2*ne66D7WW%rq)sPz_tmAdux(1n)Z5In)SEes1%W`gMMmr~ zb!!8Fty4&_UO$V5Z|wJFm3@LMy!1C;tf>0!>*af~25{EP&Z|yZ4svOk#cv^gsG+3P z;L!<&=izY(EO1Gz(xWE@{M(f74u9$L^M6lUlB zwDU?J$2T2YUS&yOJ>S3s$3G%Zf^`&l5>yQlF}S9w-)1@{w9NfXhA)Jwf)T_+I6pj6xyBjQ?=E8Z z6s15Rq~%YJU0yLrIO3@)RLZL9_xi_9t_X|~Y%*E7c~zT4FrSN<9#RmS`4Nf5$pxr* zQu+zF2$UFp-i}yXqUN3b=K_?^J8f}ej9iqyhz)d6_pPF$kk@U>V)lsnr-bW*8q82=10{!MW}h60 zLtd~r3Ka)}%%8m2mmH01YDV%wo<1XP@f#pOX4ngFu(jftF9N-IgV8!ot@}XZsOm8J z5J|^M3&8ZsX!2uMmbYQpx(k->A~%9I#0#g_OX0nWw8bYZVqg;6LWgyUS(89SU<0+6?ncCN8a& z^M--N>tZRULTt~kww59$o{0V$bRxb*cWYJ+*;J}%`~3J2_{30xvk8lEbQCB!cp4NE z)~ShaE>e?k0xRc*Z53L#)tfsgbsJ@1LHx}>loUY7I%+dWEVU+muX>x@BPG^^-XN6# zA^Kh5CM+!d}@8N}*tLK>ezCH$1@os)Mc<_wYs{qaakFElanz z^$okzZDr0^9o+~wdg{EeW>#m`Ots8%&XRln%S#Pl`Ct#LgqYMr4)7NXH|Sep61wuj z^A~Hipw^NZ1cHW5k~UsXKPi?@6$_|>ZMp;^jgGRJJ%?qxC)=A8QVq{xW|e)j?()%c z`w13G>iWCMCT0?7B6NV5l+r)cY-j3qW} z{S_q^&?~G)@k^Rj^(Fv~lOqc8G<-JqaUchjlreD7=~u5-QH3qkIl@++0XJD9cF&wr zo6uYeBGM@#TO%7muy$rs;*jR*JNlCDW^?=bKlk(r5a-Gc;#o52sY$-42f3c3TY%dlWn#^1H_jzjH{rb z+y)|sT7kEa4Wb2@uT<>XgfqCIldCJu*>K+))W@#y`#N4{}aaGKXgO|cdUma z;zOxky>ZKia@EsO*SMFqauP=W?tzj|{FKF^mLs-+q@V_^38qSiX{xaetlveZbdv{^ zeL#e(+>B-@lsg%h`sNB9{YcaOz_%>g7zHKqiQuKX)t^_t1n@2_!R}5gF*&UYpFGO_ zUjF(4xCY{x29aSwzZR8yi(L)kmnT`TjJ{gn9XqJJB;M6!|4vU{66+rx@jahv^b;Q> zUgI5oFK^rt456QP<`WGxDwuG6jC4_|HC{)@q{wC~4N_&mP2blZjJ%RBJa(LjASQKC z_3X!8lI(k38(3*ujtK4S`XFMIdt+gV69+iLhzA%Fos3KK#XTu#lnKhu_g?NS?$i|p zXQh`Uhp|2!tgY<(c?dlEc@*5V(|2)&k4O7b*{nwJtHf;SSSRX3Oi-!^z(%#nC<#+! zmKLh)ut!69H5-l$4*&GY<~iqZPi%0p&yQn@iW0;%xi;kpgKu`X6|r zIyJA|LVXuicF}!NsdTd}@H0bB;a%ah$}DY=R+@U*5Ux(8W&tr+DzwctO5EPsJXHsZ zyiy!r-eVVI(s2<2fbh!bPeFWV@VnXHWaO2vNg6jy7$dIV=k>H!w+JiVPnf9tYIoGW zpw80G^egw7R$;D+n8)NE(;odHGA4q{ROKY8D=vUnVw}&?Go#Zf_wH^}hL5y1SpmNJ z345g0AX;PKmq5+fdA{&vgVm?Joue)}RrluuJFjzpSabaQ#$ zv(m4nIVXI;EWlX*wSZ1#QYR3#@+(?bXO2MPe+FX?U)a{<3%}KBq20sT#1u0FwhUb= z$;B;mgRVv4AOh=D3PKm9WTENpfH-aDH$HPHCPD5V5RPa3rXxx@4#%1Wj!5!{4qLGT z(r54`A%+k!&?@C~`bz3G@0zS9#8A!)qzBv=EzlnJA%Q*4&}W-{#l2>RKKyQ)fjw(R zW8W~^rXg>h$Pc7v0_?i1F#>Bv7ju|H5rxF3}lRQ@oxv^kNcT%-DIphJ->>a zhTuaz``Am(Cay?%jjA7{aM<$$w$xh264xA1Uhi_|ckfLf{CEkA*T=L~bL34LkEkso zu?&&c1jEqcJxhOUn_IomX(%>oHOR7K>rdG${^(9w3K7`N`2^WdgTG%rj_pv&aJ-y; zslk&RQ!BmxM-BMyP{pM0M@ssTu0KmLV=MZ6M;$iahURowm8_#L^f_2sSzl?Lik{Ui zh*?;NDrjWZu0lP+4Ur3afOaISm7A6pq)sU%5bHQHyej)RVJf7j`P%^&RW9{1)pa20#t>I>vLCQN9 zGw51~S;g|Po8)IrWesVac;XUej?^BXoT)2~VC2}O0i0^vv>(U7{izluSA;CFSeYO6Bk}9>Hu@qY(rO0q- zHFf9S{ZEwZ_t7fl~@$hlS-hhs0Ul34`L&-D4Tga%an5vm{rECCNz9ADQZHVTsA|VLs+H2<8r2bgQ3{CHFx;1rD4?%fW~nq^#Q7nH>^hBt86*+hN-V z8nZD^(JgOR?cALW>T-!M)$iL-ky@tV@tYc5>#<>!d&iK?|i^yDL81-V13hsqtJ&-WRWf7lm2apSOb&h{~M)Ea}5ZgP@UG*$^aj`kqc zNZB!^1Zj8H$IiEu!>m{KM1yWW-#Dv$vGcSWn|~rn^-f+$#(KSf_X7 zR#3rGlC(p9Ncv01lK?hTSjmACYS^%p30m{+BBWN7gVmUpi~$b-o?SiLr50p>VP{z&D>mmWk$#JEf3Y&L>Duxg8lj*uKvJx?9y)^B;S7f zK$%H-9t8=ZnID1fl4K=eecB9gx#+xXEh!)CsP9T~&xX=FAu>BEulK7EJjDQ*97Q=J z?yT4*>N)v%^N@;PXuT6cllSB7X__Url4eLgjDilWbWGv}b6cz`P-DwhuT*B_?J&>H ztR5*V@Tdx{L}qIyOuI`w5I@llmXf+wM*5&FQ= z>4@DvE2Pj-sy`?FBqC@hYGBk~nK(q!Hl*Tx6`pGG^YoSaf_96#;X#d8FAq)nMas3X zi7$>%TyiCtRvg9kiBA`ugF;#S_!1Mk>i?F$8cbI>rcPQqZ~JA%n-{Oog$LD?wo;6c zY8vMv}HUcf?p9hF)qO9TUO(QJ_uK4>3 z(^)F`tXZ+}X9g%|?nEpe6pSYntGx^vsU-&08%uF)!BR?pdi{ zgws$fAvM)3bQz%Z)s8wn5R{D`@KZH@P@N{{%qsH(00l;@&<`{zH6H+Y1;EPHR*h6k z6m5CfG2mI9mKU*U9hEEt+-#;7T}=KVBrpta=@?v0O{h4qQ2(k4!u{sIKtoddLozDq zd^Nrq$y$jwUha#FVD14iYNAW(VxVscI?~j@ztKDye7Xb90#7H`71{|D*a#GDQGA}R zXDL*K<5?-qV{wCxmF7@V4>L!3%|pnvS3`$ieza4PhC2M89-c1#`q2&^yZsfOxH4aa z4}@_ESRtYOy@t;%nYD$${1qF4%Cd^_%c`fUJU$kZUVR=*Ks%3bDyS&af}bbrw%5zd~OW&iRow`6^dE7?isO8S?t z`D|*Ey1nNKNn9PPg0djh5YKZh8n{ui991xadrVsjd7i#CT+;jPfSq6-IaE^a^E0`? zbTI|WKe8?bj~x(dlH=lLopVlkp04B1bP_aA@O)g{8Q-0wuk(-M{p#k3XQvFV!y~(^ zsMl2Q!3?drdJhnu;dZ@Is0f2a)()_~F&k3!bDRZ%Ob`w*MCqlq!4cJEf!Tn0a)SNN z=2qJa_~GQ@9vfyWb&X{f;1t=`>g}DB?ay$Ya|lO}S6SU7+V<^s4ryu|K__)}W+^~m z=^bv0zrr6+M#6g7%)CHEMr_w?M=}NKUw&R{K@Rd~2%ys5Bq*B_uB?&mETe-d!bWjG zve`);*zaJHJnI5b9S}i(Kz)ppzAJ~krZsG1X_Zd7EWQ=`%hFF)i;wQyMDi#HcKMNH z$us^-tPjIQJ-HG?#4?e!gj$7t>~p zS}-%&<#uncZa!5!r^I8N;c1CgB!3&jKld7;k|eK@RLpPLr^UzL^%^Bzrm8&^cjnDJ z483*nQDNwIZ#9Gpc|&MPxLf|Ni{o0f1aCzywgwkT;*U zMps|O3C;m!Cm>RzL`H2M?1CL^lMzv1V+_rU4a>ygTmFj)pqyZ&I266kwp@?sU`c-h z<=q6x7M;sU&(%_ebPptt+UT7_ex%zlCpkVWky=8Xd$K^1E0n5RaXH(uCU5J@vSANS z2AzXrdIxh4b)a4a2c};ZW2RWY|Ka)q&Wvg-|=}=a%g3FiMvMi&D52;74l4JH#gwA9U9(9f65s9 zdJC2z|{l!-njY9!%!rJ~7< zc{5cFX+r6Q_lLsu7I^FZbx=JJra{c}MIo&Tuptwb6bO)1*0*rXbEnb7MnI$SFvpXo{kCYcv{f(o1@SO4jNdz3g%{?kA|}CCEom;TO9~ zT5BB1;~9`y^cGw;9QojJ&v#hNrgfH4fxt>^j^iFJ^N7;>=(kge8_`3H5&=NhU5ZD- zLOG&iA{ZxH+yOSuIvp&%{@K3L>4-5kiJ04L!tR^d4H2Wv z8d)7GH?b3D%&eVVjTM`*?^}IdPr`}ChJ~`0FoKHFTVet7}0?$PC686qf$EfENx<^XZQYU_=Q(jX+rLvWwNXn6xrV!P1tY9XL;qC`XqGr$cpVyjFI=KN|vuE zhDPe~Cy}dxn1nio`Cgz*K;JyOJ7Tzj2u`xQ#}b85L3aFmUH~^#?&ud4ywI;|rOA{i zk*}f}=a+Br@BF=xQIFaE-S>jYX`r^(`IQ23G_wr2w%FC`>K+_)w!4D&8niPYD&hW`9m~ZVW zSGDW=W2KwC?9?h=YQGi%%#`DvXlz_oMfgpHO=ej7Q1aV`A%wd`M}Z!ZZ<4(0d3yoP zETGw9_XKyV+y#X^PP3Qi5MqNL{gu~%62QS@b*Kk9^>C@uB3_3@3`t&t?%Q2xAa!jB zt%f-Y{MI|bdW!HTp5!jUj^2Or4FY8?UGDtk#kO~{aGxu#n4%wnN}|Q4<9mvl39U@s z^QuQ2D@od1ngqJh=`pfH`A%Vh&vE;^9`Fy7$i zNg|~ZD@rmJMi$jo5P>1H@jqp;j;<*fnuWZo9I?yYE(*EGa-K{Ti$ly1P|tEtt4QRd zo$vSwSF8B^yRKH}@GTi905bxUWj}yEQkriKw{?y5^o^C3#%g2b6gNTK5W^}@biuMB znrnmQO1{xUg}IC2tni!KyunaXY?S{NYM;C|1in!x&r0p%kTL--)QEX~kv#gjgAB{Z zb%!H%$|QAjW&jf*nnO219wMmKhl_|l06sZR+<-krRd?XabrI^+qKUcURFwOugPCFA zUkKKG=2I?o0d~YmuYO6K&(}mO;>)cjS=){Xs14M!=gwE4e#q?N;(`4oX&veDJ_v|jo(Cz1Dbl)79pCcbxyfJ(fi%orl4Coe>9;bG(^2H+*)QM^9~1S^6~oq`0sgPL;-47YNG*kiyESfv#@?xN}iY1Q!Kf z%0zSokrQUE#ngiqeoa67DVxxLVEQNAs&HTP{3S{m$(+W5%PnfWXJ*QThNY_;wT?0- z42)ySmI%d)3ZVSO!764Aej0pov^~A)0Z315P0t^k^TanREkPJ~Cj`_GL1nI1|$;>70igcQ(?EBFM;xBv@Le4#uk zUk#N*?%`P3H#fNaMly9PC-i{{z=ddYTArnDmY8pDPE{W55{f2up7IGST<5sIp>!9R zI%v$}u!^XUr!J9o^PW!_Cvb=zn6eP4W=wu-HN1>#YAM=o>hB%yf4AFnYV#cRab=MN zA|Rdgs--m6n+ZVX<*=Gpm=5rRMP8vSGWYU`!s_N5$t{%SR!w)&j-4=-Z2KCs#ios^ zvd5V!+tNNt#EnB}p`Wl_)h%m>wp~htVf7kL3IfAzCF&E~wIbZnpnTYLLbkraqabC{ z%n{%cdvtwigE|@5f#mc48de|<33L7!uhH2xiy`N%`7G{1T z(nUUT#n7KSUWU{xuYk?cKn<%w1MT<&X`tafubLGc+eYSH0War&9(NBw)$PWRhjXB4 zFIc;n7}Qe&ZdL#Fw*18>tKj)*L()T3!(;W2o0RNIt`_0=HJ}P<7tc+<6!dKVDXv8`D+_8;K9L;BdIh z6gSAO{8-tU*)M3A)c80*4DL>V-#srQ?|ys@4>C@Zi6cJGzx&@miJx?zx~(ST_?ye| zE5ywY^K@7y)Izv1a!drwsvJ#nX5tWCwv+qfeYrO}M_8+@z>`gi-ISYzDCr6v-GQ0j zea>g3_yo{Ibx*9QbS_xg zL&3up-Nren$Z#oG@%QA0GQCu`hl%}yo|PS)&qNo@sqQ%GwDOa>0jhFWj;O8!%Mb_- zjEFX`)t%buHZ80V!7F64`@B$kky(L7!#8J+SY)8{c}tnsNVZYxsJp?ps);aDN>j*OIW%C^gKXpVhX3nqtZwhvXnU$^ z+gatNlhg;b3Ip)@Rgc^U_=~mtElJNaHR5t6it9a{C<8g_U<90ou~e49$O~!d?|v=l z?WiC1ONqpzOJ?|Gr38fiSD?pAiT^BN$VEIOp3JY5%uBL);DgFNq)Z)K-7ED(PDgWi zhFdD(8RPO%_oD$bL2@@2vk{J4#9O(DYo;x^3heUn-s5jD?2YT z(gcWz478G6}t-%d<*r53y#@b9QTd8#fc2N}N>`xutcn zl{5JZ_&g`A71()dWw3vAbgXi-ywIDd(;;L>RaK1bz+;l>)F>k64tIa`T^z1l%6S(aBnSms zRo61+gx0fS0!#~43#Xn$uIGuU6{aZLwGQ>9LEoIKP}x>+tK#2LKmte}J{9C%yDi@d z_*_ixB z)Zj!}l0TV&*Ca-rvljw^Mo0*B_7f(|xz+*4TtO{3es}rEqh62zQ&mt-}+Lk7iE*v@adn zJKs7XGuu=M`3UL(s9=V%8G>sTK~dpB-=Kpo{zF_NklN@@Wa;TmUOt3ZGb!eoM?t)B znysyDQ1Ef3CPT5C=8xlWipHUe`NgZX_4QguVv1HTYvpPfY#kB6r30^Y19^0;L6(e2 zb|>3iimgAd;Bq0m3A@sUOeL}`L$@4$m9v&5PRQzXcTdf1cV4RRM8_D?JKzFX#mV75 zqV)y$WG00vYK^58kHL8OZZw)^{wTKNG_hnK-{FtoHKPtxTeMHwHFW~yvochZoaYwX zd@BqxcnK5>Q=4&_W{^H#ham2}+E~E=0T5FiBNIX7b|d-~>tuxxAvP<1DI6 zIpfN_ttkjOjP4C)`Mf>n4XrGbeNYaXjeBR&?0&!1`zqOOAWzjWZAvWg1@#hbLXf55 z=i&88u_Y^m@vH3N%lM`QSin4L)*f6H)*8=OlMJz^?7@t9M4}CGC0^3Zp}aV_OT?=} zxH1qG{aK_wxKr};0}Cz?j)iS=#Y>3rL%08Dg%SLfh1ZIMtG)?mC7WGmL=@Xv{&C^Y z3bI&9tLi+KlD9)C=9jtQ_tEt~b9U8Sm$Eb&mZk9U-uOGj5#A;p$@ zY*3>p5gX}`-yTMtCxV>^ig;V5`nYb*ow|7hrHh%S*)A~$FJ?Fh=c7qA8rHl9AZT(- zz~ITT5jZ*vysJK$iV*HprjtYpZw>aKLt!et|7idTbKb)7V8DX zzgh-kj+9c(f>^EAgc6+vAkvjJXF}@L1R=Uxh3c zkl&e1m9&5=$te5;$!7{o#UtzQIz6V`AEwGyYa6XjnD5V7$!ANPkBAC-jCfg;=iHrd=J zMMO`>iz}*$8k1q*|ATHlLTD(j09Lp_OR0RjL}#HCE)xFx9mb^W{i`8da9%xsg;7)V z$n8JKmImpDx`o8q;@4EPAw~9B_XX6;#VR9zUX-C&1`R|8s|t_?mSrc4WN<7VNwLLc zeS^L3!8U^By%{kTVVzJO8E8F%K<$@XF}Bu0N~vbEOJyb7suYBEH9fU3W-_F^pS^cO zCRmi3v@)t(HFOp((VJztIrOe(gc_7E*5-8JQ;N|GzQ@?XF=J*`tN&}^KlzEXLX``e z;ru8)G|!(%(KKQzB!wbR^05Y@iOzn z9X+6}x*#EP@-1r)9hPePUXCwY%}d##GC`{$I7h6V#5fq#>C|#@=ZfPMTApGV7$!VT zIxS156;-o~boQsKW)~lS*NNAJCXEgb7E|J+{)he_2#$PNCIOO%R#;Cc5HL)?t|~n} zUbiW&p8o*M6`lkq$Zv*Wthms0(zzF8)(1PGRN?sR2~~r}Q>rPzy$}SZ>-I*E`Em5k#x7Dbg*y~2f-nl9{+W+_CHDTG&Be0e<&e&N^CqZ4`-CWqf?7sn{& z-K{0@i7=q;TCx&|Q4yQP8PPfF1E3>nX$SoqhE{1wN((Dt6rul8-U%EUvU;6tjMq-p zq-we`R2nBqWWvM*r_7K**RBPR!Ks07r+-z}2GtYH);8ZrjO!7Fa8!PFcohf86X@#E zNa`l!Tviu~MzHFxh$n3uwn8Kal}I62ZYe5@5r;)CQaQ!dww%44^v)bJk&C&QaM{QS z1Ce@ZwDz9Nu;ydFD%VRhwvbd&Dinxc#@%Y(GR$s3Y<$^{k8p0J5qXvQ=ov+d(Ta%Cy!p+9_^Eq{;q4b59x5Jo z$B{A+gtj3sh_1{V{0IsfX%5w2rETyicilZe{qCIhp(+4jO5jI9thAv!PDvf)+usfiiq$0BZW%y4bhMc+L<7%t=dDI!0vPySUf%@;_2cRI?U6?zCY45 zHOZr}nJ_WtUUiHIibOmQl4>yN)Hu$|^5Ns~YlvcMBQhiRrQEQSqr_N{+#ZB)BjhEdC4}YPZqrI{eDgp_CY}(~Dui&7Xw|3;UJ(eu zTa76C@Zgxr2?gymS}Zww!`w#rE;Up)L<*+6vv)2M3`dFV&-CL!xd&yyGCMI*>r~-Tv-%zm$oTYmGHQVdKD|XG=peuNc$lq6|MJ+yxUxr1AhQyMeu~Vb<*F1l}X&7Coju}q+5z->#Mb^;k(E8hHNqZu7rY8cuR(rie$P9 zl+0OBA7$2wXI+5b73}+%+XoH8s3~GlYVu5R!;K~d>Q%S^eb2}(+ThOgFk05i(r zS51)B(x>hM)bLc{P`lrGd+$UAy7^PXoS2Xfj#{p@PgDggO8@BQU1~#ilz9^p--$nA za%2+?ud`f>vWbU`hSLhj3)mp1uDb>VuMy9yY5(xoN@=FrK*rI(Q-nWNBK^T zY~2Sk-0>fO*dsFtE{v23uWIeMWcegLrdEDsyC!NJSsvZpJ<{~;4HIPKbq^>z$}B<8 z-n@?z#$yN7Qq-hy?p50sQ|UVtzXq=~wT{qeg(ENa`Tc~Pll1za)F#*w%DrlRFG#xN3A2G4K)`yMI`Y^WybS|N8%uaKW3~C3A{D9to^a;2Gnz3TplWe>mG^pi9xTaUA5gkv z$7q#G)8N$Lha_(-dxcei$rYE~f9IkyT$uz`9$-!i_c{gx%gl{HOW~13`wbqDCtge&lzP7Tyw6_0>xG!ja zn4p1a;B8kYm&&68YmyxT%tnF65(Np+CkH})pG6K7(aD{m&A6~6}jcM?=<$D0Mr?93M;%UE__5^10uL-M1pl@6Gv7F15%_GQxhf< zlLmJ;_arBYb&5w!Q88CF6%WUXHx52zd1o@1Px1Gx>6JD zMwa4`RJm)!A&GJTxq&ko$-^i*buYh*@%ZAaf=mu6??G@mUbPA%>=|tpe4vXrpAOs;ox%u8- z2{TOhUQRdn-99OfN15tmu07(9N6z&PWS$QaXnAJCvQ&o z=1(j4_ToE_T5!)^t5PcNM_v+-@$9AajQH^7m=*U$@3RZck7vL6>=);#%@{*Zg$=8Q z&F;XqEQqkXCK@8B@>*eYenC|q*zlnVFCXLRZ|UgpdlN+FC#-K z6Ru)zhe)=?2>5sTEjIVG*s(yu>lfb0#J^K7eax#fK;i6%gDCLRqa?ThI!F;>zL{rM0 zl$k~~(tUH>(~9wO>hc&|QgH)NDpqmP2dTnX%j!?LRbh%@4UKP=s*;64obTrD4fich z7rGPZN1U<9x{?*gSBspm*sjdtD(9v95?jFC3x701jcN_zvA~C-X02cmy_%8>KQp9f zg|qBZaQiZ)sfVUVaQx;|JbG+H1dHjCEICb}?(RunNP7%P~K+kcLF8XH<4C%5Y;vZ7%h*41b-Nv zx|y6lU`zycPcNasDb!#!0$i&t+RiYBa?rSSFGQY#nIa^vN1ii@-l-AGPlM0ZHWEl) zg9Cg`BmQ)tJo4h?SP||sjTBCk|^`+0ptcJcY98%gyWzjtui%Yo$|Wd)YnxH^X^XnXuF?& z5nv{Mn!s#>bl+5gr2(AciQ)RKLC1l}a~z=0!GV(Uj7%Y2G>^-|cG`-s+H|)8SJ>~O zwUTrSZ)&S^3RSMytWA4_d6 zi91uLu*z&El*MV8t_aqg(;zc99VyGxy49Guu-!xJB2i+&cqsHl&U>Vh$xDn?$HK#XCgLM19nCni#~-e7w3D zXBGx`+N@3CPpC{qO?}w_^UxYdhXUcO%4=mQJwJdntO1Z?0HX%KFbV}i^>*8PU8E;3 z%WiG4Cr_PJ>fRoaL^f5su&-{1wZZ;QkD+ywT8gE@hi0+i+=q&T3jj1L)*x=UtEJwHrG5E7J zC5u(Am}mM$M^PbvGALa`mgf{dDla$(7#P_$$+{xOnHr@;Oy7A1QhPI5wM-H!c6Df9 zq1HazWV|+N6Y4&*2+nWruPBRk_3r3l8d*N44``0z#a*6-BY78+@5wBj;^Xg1z3F88 z9_7*%V|W(-gAlT*@><5QWIs#7mRnQXO(M+{fnc>+UF>z%IT4Bn% zrj)4!N_=9~Q+}79- ze)mNbC9sR-hSl#0ueL`Z;sDXE?iRJS+IuSCC)>`cyBgWqq})h-RlS}0}>e&pXP_t4Q-o@sr+< zv;z|GW=zyL`qAP3Z%AD#bd_T!ABORg94VzoP_Sr}sf0!{q_^LZM0+C*;-R0Kpy?`1xO8WEFE=(1EH5?odlvB?*8UO$PSD zva3lP3=E0fGh+~|%LMu3{pMweNf%#6TbjF(17-DVr#k9iapMTwc?!$mP+2{4#a4s^ z?sO3CC@u$wBr?fv9)4sdOX_H|;+0j$kO-r%SAE+scWCfgMT^P9aeK2Ww^z#OfS6R` zlhIFe^|Yu%>g*BO$NbOLMUU=pzb?vnSOkA8s*x(=V<3RhHNBz^sm{byHSVZdVthxt zm^2G@e|Moq;3|bvvU<7sM>-A?(Gocf_R--NhiNDUS~yIAE2kZzHa+LYXprnu#UOdJ zD2+os5D$xG1pbK){G4-+x}fU=ksBpvHP)7kA~GJHB4_kr`oU!+#-GK8z-an=lIm1q zY4828!$dlL9dPqoSb-`oirl6=PMQ%f%MuAD#&V51i!NAh29%G>Mxix_Vt%g9D(`JN zxq7!VfzVv?$R~b;32(1Y60v%8Goer{zO0SwAY*f_$Rb-PC36GJPd) zG{xkOMpILZ8NQ%vJ^5)%@do{focn4c9t1L!K=tdxSe>oFAnO}!j*QZ`I}Ca%GEABw zi8MV|8-A*_gB}SGLFmBz$KSO%VtM0oz}BrSb^@yBMM*?aI4+g*A zJ=lJrwoA-maI14yd$ov5m z&FWnJbsut}UDIXFs7)0+vZ*3HIOX<<@eOGS};kjipv|g`%))gz4}k-r6A*0?X~? zE(I8M#S(B$r1}lB7K?;JN;kx~uT>LfLdl1#$i)2H>*^7v-rsl(kGmXooZEAfw#zUi zZ%zK78m%C0$e}soE#)Kk>*nt6!6sf61H8GvOXn5rVphD?v!&+)6eigg^t8DxE9TJ2 z;ka=sPgQ2N>$y3v-2ZTxX+#$+*NyG(b;!?T!gEPqsh~PIRRM}a%iKI_v6qo#z zf~P_c#FVR3bO{P@;qM}%fcch1+Ub2+9@3~syVIO?sb~3gJsN+^pwu$4``zPqaCk>F zB4%BU2h@(ax&Au1zDJcK)RX$Md;gEx90I~5*1v!9hZkgCN2$Z(!xg^kJ;0*Cz zs(UwcB(A|-D}NGCR(I`e%coq>lx;~%6mo{L_;qg!=DGM%a`d2zm`+5pBTYP%WE6f@ z|8y&?N54A*0Yy%8&ejcKQ1~a78-9s(alXEg+p@W!RJLFZo%VOQWw#h*im8Xe)^Ezv z!K`p)IkVUp>)^A=X7kh8ZsT$IDt2@iG8;7r`z|c$+ye>W8omnJS?Q1Oryo3+InPN; zF>PzWZj!#WFZzBk9(`7L8FMxwBs(ra@Wm(b!x=&c$t+^rh( ziD~6%aZ&UPr-l^;#efq^WTZ#$K3CUOafM#?>?bjQfjF=k<2ByJ4nLkV1PnFjiy;3? zHi>2!G)cjYENfnf#A?oP-LarebXV_yJ-`pLGt5j@gC|BquI4Zqsu4H9;5wiP~(Zv5lT}*R9w3SV23OIEw)ohN+W;D7WX)6yJ z@r`6`073<46omjN2!BjDbg(G+O&8%W$C+3DWR8CYh?*+_@U7D#ms%|mUT|8lD!=cu z$g{zPNnVRwQ}ZAK*%J0;q>(44;5GkJEFAuB2L)&Q~CfiZuS#J1w7AkS%yoB{!ld~uYOD_CED#C zVz!UX07^ps1FAAwQ~I{iXHg<`R8L zn#=3Z^=X5Fceb{?(nM9SuhJKzvDO&AYHaMRE`NzN&Xs?uO>l6#SuZSK$-x_?c4v4w|C)cBg?XN^;6=y zMpw(3*a_lcT$PJtvtBiKdNaKfg;NrkdQ0^_bi= z(o?!LpN)T&JFIQ_+TQ-Y+%%G#*B_AGBCS5W%-|`0)gvf&e)p?!Oo~mRm+T+lSL#`> zesh`_53A>%l1jEII996IlRVdwpiRdl3nC>I7S9%lP5o%@6pFdBrrj!q1q5i%2tur2zldLl%|6D|g;aye2nvoq8i_aHVNG~noAtS3i z|8jA8ex=3#y`a*EUO9AVZmrA@pDn#yY;B5iC%iU>E##8(tKn%u&ga*xFpK%G%Jbxv zlv^4xikt2QEM{um?fmG{>+#a<0LshuE})c(xX8p9ZBNTaB6C!<712$Sf zG{{6cw<5z5^>{9b!Ye?|Xq#*p-5IPrE0Nh~m0gL4?e1q2-rk{|c`mp3M7c%3{|knW zsfwL1n)}#PwTb{>2DJJ|;fidT?bn^|9x^0A9^29mqn5CzPV66sr_R#uQT3HvMy(5K zfNO87DSzcV|3jLNd7-9w7bGObHA*kV$WVEG6}Dh`i)9UT00(rU(9}n`R<49=iA1LcJH&%?4C8z><9}DgbA~Oq%l`A90TOUHEUfL7|@RP z!n@n;uGCGo+`4;33p6fpIOsh|C{hO->Nq&a$%C@d<{s2Hxe4eO`={U}Z9?OFRkX4E zOv??1%*CB9h#ItglcQ-4kDmHISr-^hR(2h<+lyaVcqmf&2^7IMWJ;VMQhD0i;3) zP)StOrn07|TF)XvwWYc#c#WEuisT93OxwIC76K8gm(FaclnbAc@yU|!ma?%7@CXjc zI;Fa@R8_`N&hRK`quM3cq?Ws_yU8^KJ=oA^gi(V6wJOjtfPbS98Iu?YC3@RhX6~ud z6cLk7kza7v-tJRdVL>+f7~W64rS5TU3nbvNce!bfRRF+{2~!wUuq5L-atj-~>xw>X zJ1N}7sErJrAX=bMGZ>!{Ya+3;w{6vo%mDqB;eC^o(!9__7ZkMFz9vnLc0-n&7+=b| z;}BMmkqQx2Qvsju%_F>#d3SZ+-U8RADVQ}Gs&Yx{Zt#+xJOREWS;xx4bJ^<-hM(x+ zcy_8xZRiNqukfgW04TH_HRNH1q8)&ukl06F5ykejw~=YTN?w2)d$iMpVxPV_W?-C8 zKA)byKYxH|8}9*faWJ*)>e;0xWcVSyElO4BD_=B2AC9WA$?oL65=aG-)z223iH}2m zD()PUpxSz^e4A^mwZEq}PB${v$Ah?!=c1}vkj0^-NcHc7W#1`}mM$2XoZ-EPAqC~j~pFAx4 zIX2$WeRVqeAb*ixl@6(7G}-i2CH+DU-}5qF+9+j&5G&*xRew-g_x=ij?D40y0Egka zXPJcd^mBdAxN!n=8)dFX>$jZ-P0Le6P0IQ`!g}QGuZK?cD#=pbjAdn~W}pIVK(OeZ z1MKMqde6M`3;ITmxwTB%yZakwa)5#Ml3=M7Lhj>#tE~2%F87xS?}&+;Xed>x0+PJ_ z4kekOB((SUUvJ|%t!;-}Mz5LgYWo?UFiAECM{2&OA>$Ve8P1g%t4@o#qd4@eAYtQS z49AyoJ@MLsI&B7z)cH8bZb8Odpm{@O43*~;k&bhYnBkH6&{|M)n)~RK$VZqb>RA{fXm@W#vHD~>9xMetUk+VX&iDZy6UwBAjysW*2 z5>9>HGHw;O+LS<+T`70)v}b3C-PPG$>8vCm^VZxJ$tKKAh@Q?riyAYT3mGrnCY`PK*`ezD%s7RlRTgUi!yy8o6maoGq>oI;Zx+aBHNt7MSzBenQ%EZA{nx`Uh{VHo zxR{8bps-tDw5l?JsM#Iw5r><^@${*(zn`D}4IznYfj026+dmYbhj@}mzGR}JsUqA< z5q+kEcc*6;kgs5SglR9i(28497uhn4Cqf-`$J0~b4v{R*p@<(}f5-$sg9@cYs^3ah zu=FNUY>Fn?Hq9$Av&6gmXWxv_fksYlE{DS9SYU$JEeyCH8K69nplSej21uTjJX5Bj zgzCB*0_!waXY&eo_B3i8(2Vliy< z$}s@;!x!0jDb4xxWTNv(b-i87Jdr(y%mR^bxnhRgj@OSue7#1mGv zw>a!~Dy70EG*=LGu9 zRY{lY-4P*(w22-bz>v!NNsU8Q#X&+0Zz>%M$=T=!m2tLSfXV@H@5r}Q z`2pVm_&T{OUV%qnZ7JMq-;5`taXc9LV(0InC9+1M?}|)-vEn`9=Vv>R99o1aK(h(_Fb};tCUBx5XK+~)FjIZqVKB!$H;&ZT?_Rpe39+^Vl$XZCR+gNQ1 zC6?qg{3cQh-9;^)BtO$)Xr|3t7q}K89#k$;M?&szFXTA&UdXkyLuBJ7r=B2Goc%&5 z<@_6~eJwlLdA6{;v4Pd?flUr!M$m~|2{qlL7>G(SfXfK}#~kZ1`MQo&R1o*0Tm?#O z47lP>5ViL8a2E_c&jbbDO_xBK!l$%~!Z|65e!<}WJ*85Lc_mZam8#sO<9^g(WXFlh z|5QNWo2`|`jD03PDeg#`la8+pmz}vN{_yMY>f`y< zbh$dO$k5fm5R@h#P&}7! z>1MZ#;4M!>dMl~k+ng5GnIoGblU`Cfg<{OYix%k=Uh^@jteg%{E@};v)be?JRoDx6 ze*`<^3MpzD!79W_3N7Tbn)3i|v4E5K}%QrWNGt3$C8i}W}9Sa`_xv2KY8 zIS55$SZ`OtLhGYb9WBwHkDsJLT)qAJQ+|`;d`d?=L>DNjd-0_~m(Q9Y3@fED>O0E#>3&9a^3NY* zUDs@qM>8kDYN6IG1k_-HkBw(ZAo>{#xpRtJG!ksX1k?As%&OC4Ppl7P2m8+AXHLOYec5e;?5u&BY5@p zGm1_ziPz)=&Vwg_#|xPyFML(&SSOcBB85I^+5F0Cp=ryZs1hY)(a}1UQ7X6UCbLrB z0BWW6CC5GrJTK6{MsDop+KzQib$7TMgOn0FhUQx2QB~imhvwQS8l%+7K2jS4j!Ab( zw5lw8nYufIv6JU#m9pjW6H`&!+<0!BrGk24-n(i#rIA;Br@k6M9oRxBsow9;6nx~* z#T7C1c=$=2|FPm}UjNyhE6YuJ5#`3SpRTZ~9DP-DC{kVBc#`**hsO?nBYlbrf_fD| zH6n@1h>ze(Q4$1t&hXxIA=krmmWoy&j1DwB^+H*C*?`xFe;Ou-LJ|mfLvH?zr9Zy- z{rJlS*H~{RpPe+S8gFNlRBhUIbQH&A4p$hxxuw;`l_h>y%rH?)wWivac1zvJw#ll` zcG!(X8?LgRg3W-JUyqv@{D27;WJY^;w(d!O8e_#NL=O56af*kmQ`OJUt5&NBoxtzV1zCx z*-L6m;aLC*^&P(MlMnb{gj8DQ<8|ZLYthA02<1Y)cK>Z|=`^Pr)35h|+C>_u|F+%< ziWyEv*@BN}wJ;PX@ue)ofknrIkQI@;LZin)D8Vv{8h_rkKhoGV|9-mFhjD;U#Z3m*?lFm7DKlh4>t0h7#HI)UXwUeli z-w>7k`HPn?R$eYHEH16Cv=$eZU(ByAz(#$s)LMM8hy)02&t43_R}nqT;AG@4%_bOK zQwwBn|8{p{P01DgjXPps%H3t<6=&(unbHpykYiwQx&6?;ctBzm?kT8MgOTgb=j${3TpILof>iS`A{?#Q}AP_u}EV9=xPbK!{X(7$;@jqq5m~ z&(;gPWim`yN%5{K+bI7kGZ+&NfsNYgzj|bGS$u(w_s@{@x*ELuQk#j32y$2+nuUbU zq7#lIBvmr&I;pp^XI*f#cMoK7ybJ#buVTrB7wX}qvlAD@!m;%a}D z?AGx3Dl*bZC^xFk_<-t{^qG(V*zWaS?KY_#5k{*&bV`^GByS@|$jlDigDqTKm!{Hm zvprauUtWIc5P-D!+dfS~-fBdE)xpa!Tu9ix0qG$@jFl5eg3|byoWRmC%x+>lT{CqRA~+{y5z-l=&4OC(f_878%0}zb^oP#H+U51StMwW-IqNmu zIVhNRUj&9iGl~aN%_D?t7rLMF;Zuo9Qd}c|`;Y9`9@$_@B9k_7|8i{FbF#zGcWOph zpR6uc?UEo)A|Aml0QhE2Qu@QiDZrjllB~73R--OaG}VO6G`_Euhx|kNI`C8uiI}~< zBWtGC_o;}bzMX~paiyphz%$MTetuRe@7rF-XO3m_);@Yo$Tn<3x&Un1fm2G>ODjs| zL@C2fku1+p)$jT|JM_2LDL^#Oc*Hf^1eNP=J!}zRqyK98mJJi!` zZ@i@}2?gglBtFdiI4RZr?c>vToMkmlmR8A5Q0r(VMtZ|%FaQUa%s%T96-x7|Ni_Z5mc zB0U(NjUM^lwao=U^Un|#ss*whJR}e88z8_n=x=gW@uxm!|1@4_>Zq911B<}~<~EXS zn0H=fIu5=DZG3SvdYzxS?*3EBlQ=+%5%cE!6gFhA#7Kbb3Qd258`s|G9rg}Vzkn|y zunU>0TF>Auf&Y`o5~~~?%|n#_oc^WeBH4c3ch(3%SPfb&7k>GD!Lpy^cbuc+aaVhu z7T+aB1w|>PfDd<~KZaYX@~Ya6t$QA%!MV&}DnI6UyfhMJuCg?Hem>l0vcU|LPa0oc zr(C%#;Bk;*9*_d2kE8(L*W!)FD>y|sFD@qN9BfiUczB@nNdfQJehDh!l#*4;e zWkAw<%xyToS{d9tXR(ew45HT>&B%}`{o%ztRfo|0HyRRq8!(b`5_PXFn*UF8_PAP6 zN$s$I{G*sXEHd-AzwORp>M?oiAOiiE0E#DZ?|ZL{*hY)cA#Lxq2eJuSA!6=3P;ED^ zL-b$6y+-Bt%i1$>6{eIP_O>K+=k=WwA0>47!hDqfrD8Crh6S~2yv+GFA8k+AK&{&tcV zSX+P7t{4K2rx0jZfB-ERn7kF-LS7Iwh5b)%bz}`i?}&CF;K!>=ODivymXINPF;Dv) z5(dj+dMnP|r{y#b#WFs+I$WF5i;&U6D%2v);>a78f>obG58IQJm>U_VP{Gc%EG$ft zxImnLv#7o160T^-!aDm%Z@_c}b1TT%+?~oSYW4=jN=QKq#DUN4D7bk zr+l%xM&`~H(QN~_*$=t;CF8Mb%%}9Be@9Kh9{!aT{fb5udFt!j5F&4p z4}NhQK*c75?%D>98qFBu@Rf^m|Q&x;313u09FN zQ`(l1jd|{295l%F65&I|K3&?jl2LZxrMn5Df=DnW3)@?bv+LZeK#M+89TVz8(6+BM z#lPDR$G^AUQcapYr1#^|jjszlfIQzBU8V%E2d7a0J0wP)br2_z97R@jZ{4U)aLL|? zpSXw6*5OQ3L7DX%@HR5U>a15D65}b=*h8D=UGdeT=ALbC5;;8P!FmUs{#V?j`euk@ zBy1jQ6uJgIy7RE!pliUZa$sPEyPcm^3p)pQLen}AnSnYTEUYN{%DafD2?GYjPvFz~ zh+F=}Ax(Xn)0We?LG{gUQN85HOk|Krs-P`n6*CokRUk^=*6<67%@|EVno07+(F-t^ zZl$$saCpkfzQ|xXizAY&vt3w-zOvI_Y5mwzQ#TbT#81`SH=tlM@9PC?X@{a(sennf z7BUABo7XUUeb|LLzw$y2yMa9+ly)W;kpKL|kq(J1A&%vl=hQEi;sSiWnu3SCp=F;G zL_z)nS&b1`)d;^HY#Zi@4bwXaXfcHJDw`GI17u(*3QF?Sw@!jVtZe=(bsb8k_hBnY zicaNy;VjP(gK?DeHfeEJ{R$Y`rVGl^iiAxNdXd8eg|U3abtGK=q&FR2QzIYDjq&6< z3NGdRh==3C=MM}L%CiI6poZ%bH9T$hKUHxwBpHgsAY*6p4-|K zK@`uMy3zE;+QCSe@v`2_z^yo2@?dFJRT5A4l}Ic|1723?c={Mp;h*3?iEjivVUYNY z4s4i$KdRYb?Fi`kz7<07UCRgvp&X&2e|m2Lzu=urrif6}=T}rOzXQeZk9yrgfi2z~ zFi59;i3R8m_T0iEn`RefxfdDr{bp>KEUm!rb%d+vjpIqhFiU^AWU)O^klyO(WCXnG zG3?T_FdvlsQJFO;SKMIPf)Ro@}(U1)a~0zihl-7_@+)_V%gpwNYTH&&k!)(BU3((fNd` zBr%7O(~Q@5X-0xN@^Li^(lhgmsyAmoSibi^$X;S(T%Ug$O%c1vshw(@aVGJLJ>p%= zfEJ5@{=+Uh#Ciov)rAxx${W%owp9w>V%|$KrCXdu9Q!9g=18!>w zK-98Ei7j={+sRW-CM~>1h9NvjPw+M1l3#XNW-$^ZZ-AMj4ENm)-5SqDCiDYw4o4|U z7cgSASaAGk@R99TCDUAP@@RNc?ooSrJswS=%0jV!+34)F_U!S~QmAJ+#I@;kY^$Tv zh02ZBxJdNM!Di@q*r0T__wbXpR2zqPyqv-`D=9ikd&lG^N-K9bNP8!@CcJyKffL{y zLy7avJ2>MF>oAsuUA^S!U^TZ6yIc7il#&{qogRNFzoOi8+XqnoxMYRs-aoeZzNC0L zo}+v4iBDntcL{pkXwtqIO@=*AemLD5wN(PEi4AH$8S()AUpI(G!^0cpx$+)M;2?$>kCTQxlwZ6-aJDp%i8H%KL=TAVnPu@>%Z#y7d! zs=AmdZYM`jJh_2I&Ljr;6t=RWk1{|lfNW3(A4dL%Z}9bTR*DBTam zs;IQ-TcZ7*07WW1;t0!pvwF*aPd_0IiFeYEc>14s1P6y5?q5KPPyZ(U8tpSym3HFK zlVO;L!zV5;79vK3s?NEMX@JnW?`EvT@xrRhvThV8q9LayP-m?38S%wDgXy=F zXH4GFe}&hW_GayG?mQYJjM(rMF=#OeKU^|PIbp4Je(l}IC)iN$)T`REDv6!L-CY15 zfd#VA@?&jzSS#dntVvv6Sw6n8G|@JnEK$fk*i~E&#%m-zJ<1Q&YC~Q9Sk{APE))Ee zLQ5)qa8_}qGBO=iqkx(eyxt=sTfUuP>LziG`i9&=t3@TFVEVN=WqP4mdng1D+d=D3 zr!-i-h@7G8a(;?%3I@GQQ>}~?T1A+v*?ruDioS6@`uz;S{-VKJ*d|Gmp}@}On(_#4 zAxLsaDzDBdEc;jXga-M${mKbjKvK^pw>(a{aKC0?_~8-MOmYAhud6g>U)5kl$*BN$ zl$DDXTld__{O(t8Wcs#JuRrnzw*+0wcfa~|AR{v9K;82GsRp1~XDa7=@TydY1XzVWl2h7m?<-_dH>d)+9GS|3&f7r;6r|`zxaHo6o{!R@b8;9<-1>q}H#sRkVyo~kHT_#m{4 zKADz6U#nlv55~ zRm!;(cs#@q!vKOcZEYN$1-PBM)tB$9g^5Hm^0dVa(XUPG47@xbDoylmkzb@rjSVS@ zi4`Omr`g|7`30N(r_HK9BfUMNsHO1B13!CuS7#FuJtUZpdUfLl1>fwLNzt;6KV_r! z?)r?o&bq=2?>MuI=v{tUBTpa#B!4A0v?C+J#RP@7$c`crd2eIzMjj+}Ed*GakvhBk zlQs}5JFVtHgX=%F8UU>36ljS=x%a-jvMtHcB+VC1WFb*lSy2kY{iakrBH%Y;1n z{j_+2`Vcznw&3~2FT1p25f z(4b<=ieP@MstCQ9a@Vpxa&3p39;4|20vZLl%tXk{!|_zBEs@7~c=nv3t+dKKy$Cgt zSiNG2sBbhv2{2Zqg+@fimUnfI-K>o$ed0tXYZn&`Zx%S^T=5Gu;{Es8PZvX~5cFf^ z==fmG_&Ogzr3X=30vZVu1UH&&bPCsU-R?zrS(Z~rZyw9xIEqVqsYWtuEJtH@J07jY|9FMsuqUd-qS~b<6EchKN z&yYhXpQ-uGv}A>k_q9+B7a@~$@3Lytt7Cuj=Z!t=54DUq*eAniC z_Y?m+G}su3;oGwse@7Rj5oVHH%V!odP>9+d@N~X=7E)tUldlvEtccAchk&;nIozd1&wPP};1pgl?8}uEwSUVfaQW+)jd|(4|R%ppZH^JfLS) z@Oh(O6|beVAkyBc*HRWeaGa24X-Fz#gda zSm2(#gTcCSKKa-_d+#-)H8`M&fK9L0FfSUncj^Zu>J}iXNwlN_I%K#QFL!q~)?L19 zp>J>vz!Pv@$$0>juuSz1*4_l-=~s=;t2g|#8bmHEq8O0sLAYZqwV&kXfW9qIS5ad| zQPn}L#nRZN3^fI00UEV?^;#qGVw61IU;j(gEP}_;#^O=N3VJm>)L%zdp>RSq+#+X?6zeZQX2F@6l#wh4qsVURi>904F>F)7_rMvMf2E2d# zp0F=1%M4^q!DfOy%8o??5EOcv)E8(lC$-H^fqQQU{*A+SDu^{C$HPk&u^MHqwu8XO zc^O!bn-EyQKxk$b#ey{r=CV?+^!8N&Sk~+LZTbJQT1h^jUhP-C|IeyuP{)^Fr;Ync z4F6dW@M7eu(<;WcjkkIP~5nI{XI~rXEfJ2 zgl*;JsUoTnABLCJwE%s#56BqeDzy*kqh9w~QZ9no!7Bu_^M`Jk)4o+mm9lpMe0s#!W8#G-W?i>h9zEO< z889yuwRTLtR7*&UL%R_-XI4Io7WXWVc89bO$H8hY(0Ch7fCS>oXOSit0B1s$+y24_ zW>CAgoB$Wm87#Wxf3&XO+eUhaRnkHtdceJ)Vq}hQ6^#gNWH_U zl*B=PpOzqAGVa+gT!KJTsHT7hwNfM#$w>@$Uo)BnJY>Ydw4{>TO>oKwV8?!q z-}934@)CT*$zr8d#)|nD@FDS)ZP1H_Tn=DynX(?hl>p~+^f<--P#EO#UA|kZ7D#XV z(=?cRC5B07XM^@m#SKQU!U*a#>L74G--}OaZMleUmeptan zePnvHT106wEeE*m7!4pdlw{X2=+t8`G@w(aVm0Na-iL4!0^jfP5GPe~t?9)=(;s8a zgiwmHE?htvo^^E0ND`)6^7;sS9J>sPySzR>fU}DK$)tpug!6pzQDu%%rme6W$DP7Z zw4a?vYLh!VKOrvT7V)4Avvb%l=4bn#f>@dn|oD?$b0HxbGpZI*~8DnlTTzzh$kRIzoxQr ze_cxlw_}__Y@1^i5Gbz0TA_d{-9sXbHaG)E0YiG=AEfM{F zI*LZ)7pZyhUvlh@PgP69!{E~@^VAlJKhOcpdt2)ljRh%cFKVxS^1vuep^V;n8JXR6 z%dmbUCjgZ#2p_vt`EBFLh-nCgL$g(a8qM4L;}B|PR&bPh-8VbO(~}PvK?tTS9{P{e zO_;Wvz2s(y#Fof2OY^EjafJldRnSm?If`~9lye~c8PsRosnx=`+fzz!2)miofs!Sp z?fUqON{$?Jq_C<-p$mj~ygsYGN_NhxumsM0!yMbkn1KO(c}%E89!#Ex29r}helR8s zsbLs%DN#B~E^s!c#uXlMB_&?11%v^UtEl{vxNv8uyRoiN2G^2VtbuMl3UpQ(+wyd6 z72`%$wNG7=CCY$P|5Uf|ndX}u9}3XE<_WyO!23GkwK!v{qVxrH$5}ZwEmrM;;q2hgclU|>vB&zWbyZ^i@LI(TV6K!E)4jIL*4hra z2C7~_b+V^j?-x?Mq!otLU8!$EPl=_O#3ZzyLp8)IQ@wQu4CaKZA>Eq(hPdNmcs6}5 zRaKs7C89z!a*1rJ5YvHtnEHFrWVqV;5rQMRIL$xhLAI~j#}H5zHS?uf$fI1yzP`{v z2s=r6U-d6#V!lkw+)FVi-z|#@A7pEMIQ~S71!t-ijuRvP9#}-lh3^vXS%)cej2>}- z7A$7RGJ?xP7H|bHrPd}$OKEeF-lljkn%|Wz@O~ zOx1wW?$K}~-&&v4yF^SXh1(}w@x-2a6Q6-Nrq|ay%)zL~6n#o@5`C-9oua1UKbeH; z|BiNn(g~l1j+8NJlr>S}+^-a7)ihPddC`e(JYk%md7e1`5=*QlHuJvtO5G1G@#n++ zE~JBC{W2(V91iFgQ&2*ic(5cr>WxKMo}BYH-><)cc0zv>b$SI+@x`-&S;V2=V2;;p zj_H157{i2hnOl;=y)6Qw5EA%wJl0eLeh>oxX-=&{F@DYFQM|$4zVPEu+{<~4RZ)L~ z1AV+zt>}MGsWCs1)h`;V5+TSAqKFB2c+s6lQzPM$M!fx5_=ie*8;Tvf94}6{EePbcU^?ve! zrPz1oQqcubB`Y0}dv~AO90oL8F9j2*i7Cfj2%$n%vl0hJCJmD;|1rFJlWAWaZgnJZ z<`}iC@7TrF5&;IUg@tlc(Il;)cmyA!Mp2rMPkCD@UK|t6Ko;(PFLXZ~4pIkC(HRUG zk39W-K0%O11V&6GSqG*TA&-I~zd4+JlimcOtG2cdET^JHTF9wrhWkMmP5`{U4beI! z_@&&ybR-iXORgnpMhKMz=TwOYO@_O*C|m7(v`#eeegzd5H< zgVRconZmtrMJ(l80bI4FqQWR$p2=t{UrU6RfR&p?!!^M>z|uIjN+5^jCgXCASg4Oe zpyc@K=9)0!z1XUbW{7Z4rgQH7<73{DCgu>gTpnMabk9$5zP_fFPyzz@`+EfUB5CBD zymbPKc``vfoK$Tuw{S*cjcsa&!T_?I$N+K`y{Q@eDCTX5qyz{)DRMjNr)&QCmPPJHpd?g+)8nl{P9)7i7;S4s% zBRRk_phBRI$TT(Qqa$NOczBO3D=S9IEV@LdMTL9+DngL(Xwgr%O7U7Z&-PNy7Z*Gt@nSt^)}WfoUpy! z9lRYX5FH-}^Hl~#vM2|A4RhU41Gq4YFyAv(-0_eE+3#=QZFBe$J`H3qx2(Yhd@#&w zEvRDKL}V&-hSW&rB?P9kf;mkb>Vz14YRbcXO@C@5wAoCDG*{(RPemXgf9Pm*{UsVI zDS@@zAV>Riw-1H-`O?A?YxFV#W-n-*PRFWM;z-B3b(X>H9h%bBl&63wH0jF9m{{&o zoeZar_ff6(hfH($QH@WlqWaz{!Uyjd_ z+9$3iO1Kq&3z}cattRzR%YWr9jUKK5z0U-$cvgHSn?lJW>y`xUKwY9u9S1SoaNSe2 zu)W^KV4_*Sm`%9?TviRglCEQ+f55XNP#1lK!j8@Dw^1|2nNou@Jr=2qBXm)D zv$0L}JWbNd62y8=^-BUk*}sdhlU1`dBj^KcmK;+Gzn=P}6H4;K4~Y z|3X+wu%e;(h=4eUx_NzJk;GAZJXThGjbCB$;t-I@oqID!L zN*O}tj7u)3mV(jOkd~JOiA*|I=F!qN&z;@l&%yj+DTvZdSMRDc>M~e`l<%50Xok|Q zB2X`O+&_X9Mn`n$EjQzYBb#Cv{V)53J7VCFCBpNRQreB+;q8OBF| zp<9{SSXP?w#-LAy>00AZ{`H2zp4{SDCxUWr9(Utb8rtz=ga^sD8RiRVhw=%MO`bvAgbjox(MaL;_X{2n(>7yg8f zPNUxyiVTmFK9zF#g1@UGuUXff$9$iLGBfLzk8f`oYkt!B@NP_4QMW|*^>@AY2s z_}ftd1HvJxM=%@vDzpPKD$id!B^ut?OYjCW9a7uXghlUOd_z-L<%A|{s_PGwV1^rU z2m-4luhI}->*c||mKeh|!zdOFkq|d4HT}Jb`y3BAJCeo1%SA0}pFCBlWw81*GsQ1? z-n>+$k2HA{=81*aJ6xAYR^nLVC|Q_)Jom8{#MTA=6|E+FP?PZAz^%w4{=#!Unnshz zI%Z7Q4zBe6t3&JDecAcI$5Oi)pLl&wTuND;D+iSvz_MrYIoSLsrZL_`dKpJ!p{5em zUnQrbpjJ4ALEjgN16m(7%V#9nHP$o~kv%iyAjdyGB|zmHjPt0RI; zGgrjhMZ7Ox>Xp>6ca?|{Kkw*GM~Wta<}eN}?FEu}NPip}dCI5@RkF8N%?&JC?W=S2Lh(um)7h#v_pWbeh-g z>o3jI$#f1Mh8)=mTiTT54{f#bB4Psj*-jPvAB$-#0}8=M`9x^8Yrrw4mJf$TmU z*9jwTS;r3ZMZl4L06!*up`Md99-o4AWhz+-OH{YkN4B$npzJ;Zf+}Wkh+S}9({N(DuI4(U>PpUVh;ce;L``zy0fx3G?coL%D5`Z7ShgGqC+CZCGMop5<)ysU2 zZx6N>eU1aBj?S$LM;N-X&vPt_L2PdQvSGHBId#;5L`Su<5H8b4Dvk(G$WR-%F_mXm z`GzVrY}VcZVtb&b6{(|FmkzC-iUXNIZpcM`18lR%qruTTQl5u=82v2)+xQ<9!$tK{ zhp^zjR5X9j+yVW-2(9f=N0t30O?Qe;sm#iyT4z^c&Y1yRDU5KNQ+!TUfESpB=L@SZ zQEOj%Nt@CasJOpap>k}YwX(Rnyome#@&#MN@0VUKwoq~ZeE%&u$}^c;TWfKHI0&N6 zqDwR7-@qYgWs4UjkE&I^H(y!4{Z(d*Dwz^kcB_|Y<-oppY_)vgO+5jLsz_6cBvn?> zVhmTp{vpDU_N2w5%Lh`E8H}7u_fzAefqSgQhDY<|ZvzF3r=sr`9@Om8Vd!KlNMAw`&EBM>>B@_LRgUHn-{e_L~gEbkH+u5Y4COaW;@AC)VXz5?Iv zu51Jz_jtUZqtXwkgv;U)4<6mBj&9YCmR*#8HaJIS*N4Ovs5~NUX40UrU^@FiHd$)(g@N6L~i zqvOj-^1@$#@*-jk;cm6&>rb)v2Ix{{$HME;D3nF!%#WNB$401c7jpQNVYtNvUX@!r zWTq(nB|KkTReW{|8t*{i6Q|A=IU34}lrL2|jC&G^h$}0ontl9}P5lluu&j#7=c}En zf3@0U;)qDo$@j^mdsUjR&cEDgp!nZoT#a;jC_?YtGKEqU{~uEd3(exO(d?BS`gR-Abf=iClpkKMH`{8U$Z&VSzIKhYHO z)0(C26)InMsi9oNImaQAy`n^XW_LR2U9uODXry&l#AQ&nrk%X6)zLXHveRzh&4iJf z0hSm>XV7zEQNZCVqjpw=wCQ!SykSS27sFcSetbrSv|>F3t6BtmQEE{@_6us`#qjF= z^h0P05@@m{1hK3LyPr2ph2q_xqfLcK4vH&i5EXkAW2F{)s|zn#!!~v{+aVFwX^Am~ zziYza9vWcVG>B5bw3++#PA1kOe9r7TQ|e{CBg&*QWWAyhkw1s48iZV-LHt29Znjq~ zSDNc3rmeU1;*pvf!oYzF_F(R#B1l5?xZw;56nYfj-NFpxzUF9v5>h9rMO-D^3v1g}q81Xr#*PJyy=d^^{ z*vu*O!~Um*JhAHVLdO^SKoOrPs*e=;GY#AgAa*YfHRU~OWwZ94AUY~uk<}DYgPU|d zIk}pSFCL3AeL#va!8!r}F^U<_f0~Nupb3;{r5}7ebEXf4Pmi|cn-@2(Oj-w*6mzh# zp{g16TxnQ8j<^_wrc!~oV!?Pt#*Wpc0?SQ9lA2`3B=y3DF|>OS6v&8NeMx46;;#^$ z5;|9#D`1g?5hMtA6%H%leRxX4*HnuI;y}K<|Mq9;80zbnC=XWhQm#g^Ox%I-O7a7m z_fp~qd(cqa-4%339ED(;@-3{0QiE!q;g?UzlM^n*9y+YWE>?#C@DVnt5PWT9Ha6@& z*l@W!l!feZdLoh|NdkcAI814{yZNN=QiBfVXxyGmUDR=E*c^ga6_5EsdNy>9Oo zv>Fm1T7jLpFIOz;q~T7r4&-)Sj%?d)>X2!S3LBCqry6gk2<1C*WBhd=E~VlT-{IGc zRzpq3&Th3}OI24&cf{a=P-bX=QrQ}FV{v7!AV`V~QC^EVH?PJ1sarc66j$%TEYg2D z6*ogn408@jtzq_voqVZ5+TJ@iZGn-ElaMpt=djdq2dNo}sjaK$oM8T>pfGK4{c3+s zI)~IFe1mcn3Y5cri6N;C2i`px3U_h9uEAlv}iolXLoUm60DMVBdWq`F`~G0wkFiXH8PFl2B_J1 zrSkHA^F-KQ$x%De0)fkXL!V+d$E<_#RIj))-lOKCR@)n6r@p5gY#aNIJivEo$4>7P ziHP_WnWs*dzQfx)m_h8tU(J%{o3ayma`9i@#ZBCx-~^WVN8QJtRoKQp$!7*47#f-r z?f~hrgWdiiW{l1znwWZW?35VjW*0I7!j)dQL-}Q`C&7&OgLh&|3h-obz{B1@Qy!P{ znRfS}%hUmwW*DKeVca)cnvgPp?+&#i9^h**B_f}}Z;m^EBg{P^@Tk~SBI?MqNsn9o zeDnbot!5eRf(*6WA9*t?bw@X3I(*!r5t_a`ptxKrPLuhwE&{{B@sOi=($4PIdfLvc&Jg1F&V^tKqgFtyc50HgMN=u1fI@9;L6sLOlf&Zk2Vd;?0v>bSe@Q!7#LA*d z$x!BTkBL}^g=*U`PA&oZGVKs{q;MNOwt5K7tGAX|+Wvdgf17%3-P3!k@~i7)0y{tv z@jPOT=NDh#`hf05rTc=w1+NvG39;s4crnJhcb)gbd|0=vnld!;IqoRJ($aeRY68d3=$j{RNP=w zcp<`)?hIf=LQXs-B(CmOJ!VQy{==&l<0n?FU}E31bivDZ&w#`BQPCoOQvFauWCcW- zoux$^Zj$O6us5#3VD2NARTZcPS#qZHL~=&drUm-1b3S<6X=QNEhpvofs|D=Gl=SAG zfeJ|oJ^Kk}C{(ucO>dTOsuQ!oLVc>-iD}F`hhi*ON(J!7fL=oq!0a>R?-+@@P6_z|xf2y>=s|-6?W)&~ z5^#H4O&AENMb%uqoEsqH$}W?l@hz98K@ zP1Ad?31cH_>%aKL<@A2=duKax%FUV)1ht=4-(z%$Rs~y~Zi|TZ4f0-VxX3D*anLp2 z_%$%@s)?%DKx8ODfQ2x!;vzT#lKO%I{4AIxYP^95%o@>v7ff-nu` z0RbJ*>GgxnqS^}I07r|vqAN21mmG%9?g7+&7${BBZE2s}d7+}{>uJGv&S#D{?LQGx z_%jZBEEqxPbBCjj$OEHDtuY z^OOL9)pj6=;?C-MCsK_yc|YUh<%mF}h%O~~dR)xg%X3)gjHT=2_rnSI!gH;*t5KGW zsg_2Q6fOxbbBOeGP=3~zEc!UjQAr+EzL;$q&6>?Zr-BY03 z!wa(``#)EpyR0;>?(pwus|-I$A%MAsf47BQ1Q==A15{KtkBnn$Vd=%v>f*}M3yb!Z z#RjeztJGOauKk9&UZK~Oc_$A-RivR59hH^zkjBN)CbpsS21DEVOrhYU%sC>g1z-Sx zDk5*0a-7*4;;aPP3En!yOsffv+e2fp;X9cA;lNCcWGN^e=}$cF+@%K;ZAs z-vPrR%E|!8zkM#A2Cs)t|M_R0m#R!sf;~qvfjy)Q`yiz~6B{gvDH0?kR(7N`lUld1 zy|iCrff<-f`gWU>FPHBm6g#_np=fSj71IyH0e9?bHyLx_~Lv*zQQrZ z|Gp~TeJOsNe3|^f|1OVD#-qve4?jIGHeoA#;DL_DQuKjUae1wE=3Jl%Q0bKK;IkAi zP>(#l_>#Y`{5B<|^i2ro7Qdr^KS#<0g8HzyM#QL?j`(mOa-1ipGZ~Gpo)`U5K?9L| znnGmVnELMd@oD6PunHGno)_C^#h1|yJ5CGop_;0C8q@f$O`hD(mU!C&g%7!O6Uo~ zF-<-lV0IGs^O?l!22ZU|jycF37Vm7Tf`H7vp}_PKJn)9Dgh+cL_bn$u>PK2E%pPpL z79$~3u~Q8Ci%D|=fDc}=P^bnwz~5@KLHcW__sTXF21RYsdKr{AsiM_V6`r;*- z_0<+-eJ@(WXN#?+O?rahYm)C-dxLqQzbP4N()V|`Gk4W9>%!Lg-A2W-wI8RN<9cXM z50u`ntQPG)Ffiwz=T1b*@)UO1UZnl3flC zqY`{pF6;lhMm@8XrEl!e^AE9@I5z|A!Fr;ayll?XR~|jJug8W@-|1F7Q39^L($&ze zdpF0~6M$tbD{WEm{0VZ1)*ifza_d>qd{=G(Rn?Eil-3XTW_7$aqgBD(52^4A^yk^L znYa9bnLYl>@Bf3)$Ny=Otm9%b1c9tGbDab#w;Ggxq>5V^0kBGHgm_l?{V#mC+f)?<)>;Y3GCY7abMuZ^=X=;UvL50OxR;{n%T}I5xd~P<}9XOdc*s^^?IYr3~|hVyjD0%yKyAQKxL7UM15?HG<@Efxf#6-pqj?T8wtEyegAlTmx=+UR&3e(51b zJk}(OPvS&c9Gc?nkwGHXOVXj{F{K{sv9>mbNq(lnB=d zLv}++=PlCNTEx0pFJN&sEn?FNjpj+PhF*+x0ZTudEGc}$4NFx;UzSAsR#lxiBMQID zKGUq7N=1}4ID7q9_mtqsnnu+P_vCnT$%2UuP771f{6kdYXiefi?7yMB=W<$mLhf{v zEF3zOoeGdWhcdZ@e$U|paSA&t|ZB+(^#y0W|11)}Blc`j@ z$7d{H`6auZ(66#ATq2ma%Zc#Y5C&7{qLdaW&Axngl_DeX zkBZ4Fz=K8e|kGcMqLgU#RTXvGMFwyeTD90DE$kuBHHE?8W2pV8EmPv z;sP`76ALqwFe_o6%;#&#N9 zWfv>0KKHb_E8qWW5?hqPq?80_YnN3~6ExaZ%L+iZ6{HF*LgoAc6g9nFSI@=i9uI$O zULOBC2SEIk_d%Evwzl!4z_sBjYX%w38u8)7j5X{fR8p#qL_ra&5Cl)z$UXswy)t@U-c%Y&cO={^R=z+_+o}LaQi`9ZTuR;To|KM{_u>w_5 zKLu9%|GFuj{Fn7(%FbnFJF*O#9-<(H)1{ijJmu1CbIZtEY2TyKc~%=rgTEA5yqCXG zzFXSf2jv&#PVfHAb>c;8vAnh2K(Beos#g^Ujen0sgch1<3pP821BM4-N%5&kv`=cQ@~UAQAq<$;CN1Ps5H_s6Z(j zV;GAD+4GGzsgT0uBW)kNtCBO$MtA*TJ49hXTZ|O_r+AgF(^QI=Hl>&?{}J%sQHvh| zczWDY`qJZ`xUm7=L1F^xKG5h#1)DJ?xjNZlf>mKS`Mm)*sA!_)r_40(pFI7Wc^8V9 zVSnOSn((UH0V&{_uO??Dd@3wEL2PuRmrDgTEuGDmOR?otgtfAwadxiI{7%*YPEw3z zNe&qPh?ysX<|fjU5mtqkmN23t2LkHU+`L9dpYzopS&E5Dpn1`THp^2~2=nZxPbT1s zIS)G_oteE6$_(C@Wd@pLK@ePfRa7tOe<4;B5VP_uW&U^%;l^mVRSMW7&O+tbgPGs! z*w<*}?d}eJ&yCJMY&RAbTGWe$yB944w6GK5PUI0{?bWv|pK-T$R1t2q!IKz?+$}bC z&GnLdDLEaU2E#_Llx>R?L;Hd*UzHcv7i4TFE>w%?YJpN1L8Gx+WSxc*@z}lJq#_hsFkI|2S}$; zSAt3hv$Or`A5TgyH!XIR!fjS&Fl}ypso0qhxz36PJN`|#4 zk#tUnCl_H8XqEW1K$IU-8cmWMYlRjLV{S%}EHiwFzVtEHXb;NEk6_y_;G`l#sVgY> zVu1md706@aacVTdm7)kmhKlE@)CTpJ-7ZHXBkv&Uqx9M_aL0)(Ty66erN`8yVM1+l zQ2gN!#b%5y)6xWgL`&07%H=#3jxR29b97F+nQ9-Nd^Hgz2Opsvjn6HqI!6PK(>b`a z_(vx5ruKR%S*UkCO44>Fdx%u?T`F@E9|NTiAq)B%y^#+yEUq`dFLDUD{!72pi=*}3 ze=g+#?m3K)-TqxL5S_b(1VZ6;mH=ie9zmbYcytWv^!5)Wu_?;JO(km)q86opxl}Y; z^M<+B5t`6{tcF;AKyXkUMCT?v2*tsev|M zJ*Wf-NP7@}h+tNxpmVFKJP@cuSLKE16%4l>q=A^wXMb$|pRhNo6p$fc2-o<->d&K3 z(1L;qaWIU4!1N0*DKe*TSc?qi%6x0NwMx42<>KPX!pkKfJg|DI&=*{0 z?%VQ8sdhq?StlK={ek^tYq5Clm_Y z85OD^nLuYTnMJ|SuDh|wALLBMAw{7uh!d36w-b#;y`P~EAdB1IS!X=D6`CE_nf6{D zaH))d98PeTGPsja{q@&&;-7&-svIMzLsn=K${@T7l*xI9-UwDo_C)3nw1+ z15qX!Ry$&_nl+g=#GkDY+WG>>*?wjDlWiJoza@3gSMsX!w$r9Xr~OE|dht>WqR+-? zHaEmjEt;!JsM$dbyCAR(A4>Aqve|Me_@8F9J5YvBNy2$0)n=HN9#(t%2S5JUTKb1j z-@Li7k~d2q>&G8gz0YWI28Ka7r!*`5(2k62U|(x6iRoc>71RXfh9=w5;CwdnR_onI z#1we@tAV#lR4nP4nEy3$&f4Zui(3Y@SU$n5HYLahH!g7%voUs1*&L&l8r+a{gciUI zyoOlwZR9oZ)$-q}NX^QsAg}U3=ADK3r-yg6kWCt6f;6;TzM_Uh;!&9d6Eb!+6^}-x zMOzKEtfz*7RfSUYlaG*67=%o9*d%JHTmnHgIDC*$?@Q+Ukps+z#)P^;04v^Hn3F*j z=EAPJuafXL{Jl5re)q8sT+8a@6b}mfWn(a78hDSMl${Py2lO>93T~i{UZ{&2fiJl# zAxUMpnKv2-+o-k>Q==b8rxExt+xz{3KWppVKHrnfyi~eUT2|u4h@tFuUq`UVJ>!cp z28v{x6>%l`K-a-{X^}V=H0txBK7_WakS?U{f}_K-h$#k7Zx7sT>K}fob-}mITV-D% zz61+9{YXiUD)-scb>%q4{CzA=qW^KOAZtJzNsno53uljygx3U_?eJ~pbz!97v9(sv zN70Ga^W$%O+YVH?_vqa()r`6zlq53)tZ)k!zrd@*qVN>ZoGX0V@%paMk2K6z8y&!D z(qruXf_4F_8@k=Mwj1h!BZdu`mg;3>RYJc8<9LKyf*(^m2YNa7_es{!;k~SwOzWJe zV~LffHB7ze=uTmQdtxlIhJCm1wZmdB^PW1RhvPz+X`31*ZPTqCKFQ&fIv5a(>vly&NcpNUyaqNbtyN+*k!QG%?38wwl^ZcR?B;k<&r& zU~~a%2XZJO#*>o^XiVeb^`DC;9Fo2V$auepyYl2ePM&C8JDnF@|35ZjgY*b*9kb!x z^SsDQU}zOotiG8=k*`?b*gxuLD7N(~N^<_%ygz*<>RhAomnS&lGYMluIYgUkJSAyL zO@!l%fnRZ15hPCYKE28I?qlu(^E5_3Q<$g`3~pag|~K;GlV8rLG! z*O@Z;7r@B)I~xDoRH8wcGfD%#OBVYBx=|9f!FZ=6q zXQeD{GgRB=j?9#!o-F?L9C)~A{jLN2We}31(9B9 zRko|h8{G=Z`v--;gLlZ07EMH(L5V&o{;jg3>G7H8yVVQ- z>kS{m`t%`t`)JrOC2REA+j}7k;Htl63@k4(gy~E$K=W{V{8_SHN)}<~V3=o0+d?LK zKG2TOYh5h0T($;Q{CEGT6?Igc7Y)6wZf|LoCZn83ONIJd5R#pawH}??dU>r+q$~8o zUMw%YTv}Y7hhf!PeX%_M;w6-;#g*m77wl*)LBN7^wYu5hF?M&Q$|H|C0p;>iBNKFQ zN4xUvullN9Xtvbk6bTUky$|Ej?{o>_T;;M4em|ZJCdZ$K7zGhENoDkdX`r)dSd5uz zP4j9#z@t6k<|*DRkv2QEhrUO8;XjRBcs;%E367N zF=e{mmWaD&A3ytUG?`acPm?g0Lyt__W~_n+I^!oT=?y%tSN$UX_zL+8;`{8y`Q1v@9)XI)0HxpA_<2`VkmA_P9XzTKe&ZIqKH>BA?J7>-!nv^lZOX<6~BB%c`Jv zm!&=igKC4bXH*G!HpV9mkrVP2Li7CC(&2+-YAKZK>Dmk*BX$JPDxyJ>=bqz9_K9rmB5k)%%Eolq<{7P*KT4$lLc)XHoVFFUVzovqrmnshGb7yF2NW_qj;V>v+gZVHPWTE~yF z1*EXLw6yYK35N6H3)-11v!toMgu*SdlQ6HSYUyt2V)qjA#chjMW`>-RS6h{ z$8|I|h?^X*8QWlbWs$#bq!aVlV|C>84XDs&TU6|f#CS-n-CV=Od_1q_q~5!$)8}!p zPLGJ1LLC!s-Fz!yOElUN=+{FufD=rwYPUIM&)NvweFZ%fflafRu)w&!T^HxVN$^H{ z2wo(jU!OiXb)p}!S^YT^IQ$m$9v)>?(hZFrcZg9OObEudOaq6g1O&&^&Cq)AeIgI! z{)5EVr3U^Yl$)f<-t7xdyEf8(o z9>#8oREw{2XP3AkF5dLA)ZQi+z1X;BR8lFD2~tosI0fYs-zpA;l%H7Pg0vNvW-YZr z@#Mwx<>&J%3mnN3=Z<8S>Gdylc46^vZ=sLOC%;us1;f`Fk9Q}bry_68)Da|=5v|vlItvnnGlkh4{98Fiu*ujOe|5&Up zNA(>d!{-!pc3pFj)#_BS`=+bx9V?ERq}A$oE6vkZ-Da=8_}zOz!-nz=-REGk*Isj3 zJXR{XJ}IJt`#+F2-{A6edGLXmirjhu6NLo>E__0Yn#Fwa^v{jX&R!S#DfBLR%MuFX zPahiz*Sh4A%g7~RV@P28e96OjPD^OH`7!5oIhr=7pG*$dpR(LS5^LoSRX?a>W(akqnEbY6ntBRsp;q&aMu`nyU=dZ2sX}(ps25RssQY zXwOu(lmSGr(kos-vE1GfyIT3pnoJypYB=3duBM{2)Dp;pnai#Q@ql)iSKPx>xgdM{ zQd*@1JaROmo(cvP!^=qy5pJf~?n?`SDiB}WFK^oK=7>29xuIov<3%i)xy~G zs~V$-npyIu#3ld@Jh8X5B7gg&F*-YAz#X!HHm)~mhi-FB-zb6<+DBO+pJ;3UXww4u z@v?UQN(fcp1KkTAIdcmOIRI7@NjmE$i2)1g$bn+HIW@fY zZ#}n}uM;OFr9Z3hOJTq_eqosyzW=snDU~>PJLum%jo)gf`^wJhx4_&VliaC&U5!su z`#zogzwm`gcZIXdIx5wDh?TiIwMWk^3#;%=rBF)sRcSH*#_!TKz~czY5RQbTP^$0J zyX?H@yGn7CxY>6;`QQg<3*&wj(I)$e_;m)WvZHuDk&WwIUQfT!NCaDYfgv-bNrE4i z9W*;!38)`w!T4pbAP(kRFmd>@*)Z%34mW6v__=k{pb-QK2;~X(u$in4Rhh)i)P)jV z;IL6c@_LuYn9j8+#qqY|$%q1mPJma=XX%(-YAeR4P*7RLWnb?Ca_0U9hdiGbs)9;G z*wB7+hnZzva%Nv|bd|>x9It}VZSp?-J0+psJ6jamcP=y57eRgC2CqANO<^lQNzmH}WDKrLQ2@O6K+e zdaWSOt#!9R3&`gU#vIC`lJV$3O59F`2x2#e!jFI~dxDqmNY)XCy&&m@)UGt?9jn{P*Wx7v7; zY=2}~UtGthz~Jy$QOM~-LW&y%RS15l=)Kc}wf>f3R!KnKp5pbMn)PyYB3Z{4>i0=ZD8ewls58(aPJNz# zIZxszEhXsi3kKj~H+I_Fyu11mZXphO4l9dAO-%}a6^Sbnay_e(Hdiwp=18ns z#uKi#pbZQp)zoNy*(hr*AGiou!_)Gq70yScu(23=t_Qk7nZhMF@q4oM=)IhueWA5( z0D%IHwfpAEJ(_tn{UE^ad3i*+fJ$FEb@zxBHScggc%$vEwrTz*@l1)J;3f3D;?S5! zAcbEuj1HPji6>ib>^F@UXP!0so?rW=+&K})<78fy6!bH#InCMq%1%8`UW6A*U*VB8n?Fb3{swEv`%e_)z zvPyFnvsYP8KOAMp0W>F5OcT9~tT7<3k`&P&^+pSIx_EQIRfZ!Z>WiSMaM_=>p3`W9 z{KM+bDF5GoRU&>vV>Sb_E9LF*wLHJk&xq=D1`(*LR@ zKo0)){wBhLiNj^0o7Q#tu^DghK#O$9gTFby*a9A9(i|Spi(36SPmjN-O@}5c1`<~A zP*=Ez6@e6_wM?x8x$TjR==3Rr6@z055PECS#gj;X?SM%WJD?ot6hsvRQsV;(?%$AO z#6d+h4TJ9BKzM*P!g@CMQIoS{acI|rJ?Q<)QU%& z@EhGlVj@o!|~)6Va#0VMgSbt6i)PDeKY)1|<;GvjDoQx<=WHpV^as zpZryv2#9J9OB0(JdG14=q%#@Yd#@131g1-!uQEx}#Wk7Ct(-2=bZKaz(edoU#_~Ei zH&GK>;N&yECm-HWjY`dVK5SQ{m-xi)E5;}|+nxx=6kII}Hv1gHiN)<452DkP-!6<0 zawDk*7aK4+QZYh4xp&o=0D~1OxpzUzUh9)J_fqF%RldZ!tIR?KYDe_8(fAeIa_p5t zg-&uPEnI+|OZo+d)3pX9W8ukf+|?seD-W2ROh4}Z!-E6__EeTM7%sRll-IAl)jd!H z6r~eNa7aKgXCgXC-Qajc5--y}JXYAqKRo0CE-b7O0(18g4Yp)jiU=!v{BHb_`_4+w zi^lcZ>1hOM6R!*a@ak42Tg53Ju{7Ws&@;>v#Muq$;k)-xQx#qm()jOBtZqqe!P|c< zs!u4tkUoYrF}FR9hFLcgGi*NVJKdC`Ju5d2(@n38)(D!tck|qbsu8 z0I-Q2DUsIF&wn4$^1vm=!+xO$2PPOkgfq$$5b2Xmzi z;Hrw%2KZ3wg$hY}-RUr@p^-uY=pJ9aA08nQ5O>W@TE3{jRiankcY!}c0qt_oAl-~P zj{SnOABCHm5k6r?fr5d1uEY%LO?l1 zSe3F)uCn}w6lk!fI#fV(Pt`}+wb;;^i56z4`$j`|Kr4{MO?HMHDExty`EGc6O7Y+S zqW#4(-0b>SiBW#EraJf@jq2rBf(u0~aWkbe-zaNDNPC#dcKE_3-X7r=+BM&4E-?@G!@C8A-HWwW6tT_AW3E7R_VR)EIAvG<_qUqNYi`7x9>bjO2y=C7cm>x8 z34!z`9=K8NKNUJkwX|o24%K~3Uo${(uxR>A{1(1`R^0Yy;&6|!@R_Ucy14sYD@(Bd z>R&c+WC03OeN6aH{M0vxrKF?Q30G`t_P`w#oR*K7j=q)Vwx~UO9cB=V@!h@Ly^zOo z6fl1nv#>U%H`dcS+`8p9GUbCGx6=b&TOeqilxO4M9X!+VQyIBuk>bRVDmkQaN2Ky7 zyC0+n7N)iKFZPG(J8DKEubYHqhs35|apl$!kdtF#=9M&_aYY;u0=XXV9$!Z&qqv&; z#1vqVoP6Zw5a07~fY0niC+rnW(%Q^Z!O ze2el6H4lGUD0zMV5qpAm3EAWX?isa`4(0|Ymcn&;U5zL|!T#_%H)67t zsCCDKkz+OPX*slkpJ|_cbMOQ$EjMSscaUY_Dx^ zO2_)zsD*(r7~iaEhdT#qC8?@REh#)5sEsFc+)`NA5a5lIc{?)hcdP4^n*2PEd&7-R>NPx%P9Hy_;}!GJQxSd!m?P_y%ao z(`V6T^OZNJ5$9g)vt{khme!sxcLIkJJwY8$#7uL%PUp3y;gAcw9U@d?vVF|T$;dLq zM}NF^MIiLXQwYL&GSsp^fdGhquMA&v=t>luo`>9rhke-j#g~B78qopn`v?58>WPO}G57%7?RG=k4=bog7y>`YD#gS8!$Wdw%B{jXQVQREdnk6z4> zJLyZ#JsXjU7_Uq3xeJ)23QhNNR(jMK!1Do_BkHdB|L?y)A9zhpZ^6RWo4LXPQKH~S z1K#jGV6H5xTEBgqs@Akt@gId(v9R;q|7Ly7Nc^!knqb)_YkElr6{CyojhfQLJ<@t$ zp)|lwO|l&v3jE>P>s&C>M$d89ipu?D1jygi0<1qj{bZ+)vK|3IBS2o?evrcig`#3$hPVafAD(yhd+!P>Ipg?eQ8fW8wWR- z%R(6FZcH?VQ-tchh+r(4G^RKvqK(>!7j6{tKMouD7S|&^HtQDgFFot3W#=-M9md4= z{t;#|@_OlYqo+rhET}#h+Jv62e%WwdkBA20g-~myo*F%>?uMl38^7A~5qG7x>xN+b zsaX?o_|#F023voU@JbD-zmEtd6q{byS2sM78ah?$<)d=n18(n=mA5U+N z>EdxbP8rS0G9)fc@38&K32)AhtZes@`veTh6V>$|sxVE(K&2Vt6wW3-aksFoFllQ( z0!RaC|Gs}s(avlmfc@^46L9}?eE?PssJ@Ht!v$qFxeu}P5Vw8TT2A8rw-llGcDB{g z72k^PDl~@U;weR_65KUbjLsd_&m9=+Ya%8qapPei`*rU-9vJn+uj*t);;_!_t+1_5!;ay3bBS8h zv;{Ok4Mx;ts0)c=5qR;`$DA>2;iZ#=zi>ImEp9pj^Utd{b7F{}tv!b5{vA7r#hGaK zSL7AxJd@v8)}zD0N8(+X>(1xvaSukksLk7xwFwCh>lt=cp4^F zD;f{Kdr+)KWpk2b7UOPv6RfrCb>hxm|5k)~C5^xljV8sK`i_gfp0!jA`~_=tJX<5Rb;{i;E~{Rrw4+1IB!ljCu>t zhLPcNgp0|$TLZ(5l%Ch#w;MvPYlnIjminc};f6Y3qlvK4z?)&HuWvKqP+hB;en%qZ z>B>ZTz&uV-1T@Z!0I!ufoWW_+TK6?nN*)^(YGdhuxi~Lt9}Ga%B5Q7Z7R<4i+QPdG zSA5GSjq9|Ifi&!q1^yJO#<<+WK_ks+>Q)A*geq>p%TS}e6QwbBjwe&-vUnIcKtcuc zeXsyg)W7kYRNX_DmV-xL%v>FUI+paagH2jp+s6C)VfIJ4!cUz zA{de`g)x$8Y0{lpzd1Vt6ep7HaotVY4nILk!*`8jMukGC-^XrpbH4VD1yH#>Ih z7+}mV7(S7yjoMJ{g>hG3Czlz_ob&4X=$SX9d>(rTxR26sN}Iwz?5%I8dqrA!Jals* zOkM+lq25H~p~j+2b@XMR`d6D;12;Qz{dA*;#oFt&Z~eEq+*(}3GmN=HVCwuARuLXJo`48R%OrCh2-yQV&*(moKx$#nzORaIuG2HChyXMg`~Z)u<~%ynxN%saRfQxccEz z6#Ahczig+2yOLd*DivoBCKHgE6X*(iDwUiCdBaAGzME{il6$iFZK;AbKh{_WmyKf-+^rqM@*5b)ZZ^=jr~4Q`|Pn; z03JDR39Sdm_qVcA_Z4oMoMtBF98Em{V#XlQMF=zaZM@O9lq(S|S<=Dn3 zuY-m}UW>(4WrWX4a;rrOYEV}qTy$_iFc9(wZBP8ERrJofqZ``WJ2-k~X@OS8(vlu9 zkAHu#zXz&g0EXer#lIJON^6DggtS7k-$fCi$K8 zk$dK?p_t;g$6H%%-Wygde}uCpqC;uz;Xd_Lh}vqLx#e8Lqw-3YJs7C1wWYM4il5k= z+|n|!#!U19$7uEe0I#imrwFZnpaHIcf1p8s31_k18t88QDhc@4E&9=WFd^A63i|qv zGs+%P?e$0Ej0trR_MNI$LcWr6cXmMy&eHcW#8w!yf;DJJpki5BBW_q~C#_6}%@o(G z>fj?a-bDrC&7d8NZu4@EXOYg9wZj~x%@_;j=~BMPOx~cW?jW&< z#`}`0{fK&{S(KyR*lz3&clNO5ub0&*)okh@=;v*?g2IV%9pBFqy|oBeGruzU&Z;L?+`S1Y3eIqNVF$ta!!80 z_i5_;^_bI#s`|}1m3c65cIJzJZ|aj@BAO4MKnUsnyS;)a!dVs);Br<(FhKFv75yox zuS2Y(YMB{j1@wbOB8mv-9_>Zn+WHYVcfJRuIK>@>X-zcNNIjlQRw$t~Rritm8ybn8 zNt~VXO8Rb`+?<|YY4=YdjPGU~aWH)h9(-bt$|B^0>E&wO5wGUUbY9;{^3+vpH@6c+ z^^i|94$oOr-ige9zP`giq&R#yWH)}$$wxS<)z_7u&Ch#X?xa^&S=!u6h<0n2zns(c z7GpL2)r1uPsxCHNf?ihrc3ZD}H`7g$K)U5JtGmR@XgQ2BQ`~km07bh)9K<)_;fqDZ zsAf&-P@@#N;Qn>BgD1hE^|YQCvFpP~&eBr(FRg1eY|t^bJ?D35Hw_oZ$<z~oodYra64XAn6O&zky zL%2#+H9i~LEFcIvE9;t~MOAmux99F;bj}T;pB*GlB)@r&s4c4MEKf^EaSR!jA9jAt zqRZsC{jI2N%fCV`UcD3v-T|q3LXH_XU`6Xco~IfVEaVl6EY8tktaMW3!ZVc|hn?-H zFd_l;=IxO3ivjm_G-ux8G<8TE2$%!^`W3|*0Pb1V;rZ40oQd_TIgSs`rUl*o;-=(e zsY#Jql46r6#Ph0>VXwjd05ZLk+7g^Eow$rpIS|3h-)jaD-Md_9A!{JpF^eWhLEX$8 zf@i}1CG@tc@8L5M62}YhvZgwv&w5~r$6`m{`wlsJg4ih*iaWK4hVmFSMR)S~K@rRo zF;3V%TX*u-J~V|}H~_ihWM(6Y*hlVm`)I*F!HI6^`T&~^BQ zfjA=eq!Pu~g<~J=FDT(LN*GuarX<2TPC?ScOkuJ^g`=b!kz<9evONhe&cOTfQXS)+ z)nDsLj-!&WdE~TEe*!FfFK1%cg*1T^7iER`BiyTxfQJsaOWR;@RjtrF zZ;2w7VkCGR1)&LdB`J|U%Sc`o2L<2#E9xQe44Llqnw9MB>D9?U|7n=OY4U}XK%cR( zQ-`zth|Cjt%x5xBoc(6zNkbV~oclU!G4`g$ORDM9un3MC7%eOU4Jr+N8fKEQg7*)B zSMHVNf-7zmiwgdFLO^qG3O_0_aOTLAyez!sfAPpbSq|p-?8!fMINUtLGRX}kwAv;8 z;vRB`&09h9{F9$%Y1?~!^FW2QKXw|^KXX2Pyk*jAO}di}s6BZA#P1=pNy}aKA*A6c zd!pWU8w&yyf|_g+ub0D2mP_2J?%_I#emSbJXUsMQX0KQqD#n{f5^#QTjiS7T7FBoi ztBWh`5w5YW$lui&yXn5s z5hHc`5Hr`e78dwTw6L6v-_qoCAD91+0z3ev^Yer2|XmJJ6d|EX;2&7cch+w z68|XCU2*a&IGK;OSx6j7e@U_@iKlscUbFsa)xVF5~UR%0HrL7cB<;8p$5~`KOX$`wixOMg88J&oN8>l`? zBRE-EaoibBeT#nt8Z zLThPdezmo@)LvOczG9)ZGLH`S%J~mb%4)v0o}(9xna7xt^YzD=4k1KJz1eV);B{qn zX<>~yxv;Q?gr}-zmvO6@VaF8QMI!RJ;jS63zSu^Z;e7Jx_KfjW0ZCGB$4oK1o-I3@ zU#WpeKsrhkYt~R80(tpeTfT?92=&ELmc@f;OyMmcv3gxAcDHD{;P!9@sPDTW{FA>S znRP{kvxnkiE@*yimtWziIM)m>2{m-h0c(~x<|{s-1ZCx&k$(0|UKL~F;al7woZm5V z0*onPYW&VI<@=-Gc7l7a*k@z?s9S8f9g=KJDmsLfL#DJUTTJ_ndsa5Y{>SM84>ym+ zVZlJPG&0o;7nwjRT8RL}T9)t|>N-@poXNKh%|ESM$`W;(@q)qI^Pt3vE3&swkX|&s zx%p1Sx72f&941|h=!PP%N`unJUK3L%4e zgHses)#gqmGhr)mZ#ylJvX&cWh92GISUAW<@aai?KwndzZ~N@ISut*sLm9CW9)>fD zWZYYEg9;Cvcc5BKTDddh84)x+CusdWEtGthTxw9Pr1exni^i#0Lq(ua=;&o@{eUj7 zT@pB+O9s*zHl0BlR&PH)N40+Yxg=VPIKeQCK^AS!w4Dx@gAd^3+K_wNcs=IDVg@(p;|;ld&kslLT+T?ZLAPv%l&sQQ{LGTrAS_^H54AnCX|dPLeK3`p~)Pm zdR-)eE1DKUBh@ORiQMwbA`i$=e|UT_#Pzdb6d+*$b`Zt38dqL0e(%ZmOqoI|NNx~#u{P|u*tlA3oog0xfZP;whlq6;Z?;p&sL>N8}&+jpZ{^J{1p=$$6qK~yPSgjXA5Enq z3uHLZKtOA;XcMQUB;f|s>fYud3vrTl$dGfEp}xDlYl?MqKgm?g+Nhi2SSl}<-+f;$ z)7eWn5QO$S$r|InzBM;cP^ujn(%geqcMS}CWgL<8VqHsWUJ|q zPYS_9ZBtEDo^YqeI~j140!P?>0xG{b5LHlO=J6Ln08RpD`2`7S^hI2h&vG z@#57rQ2Q&Y{&6?q<#Fdy>tBw|IzfL~UWDJ++h*;7j7%j&585vUxJ*gSTIGdXOWst5 zxyLWSE2KH&tY8f{ZgF{Oera`a=_p1W-(-9vI34)aKa)GU{UXz^k(IEBR!bH|?wFX7 zT9$;cvC!HN{pB-b-KmkUh=7hP0$Mw!IOYd>q2e1@@epxl8q=vZR^O1x&gH13JZdyi zip~&0DoUY^wS2%rBX{}`pHV@|0THHVh*~DT7GB4_IrT~vV}Ylpo1of9iJe4m0w6_8 z8_RWY6B4n;X%(%mq=XgHeKm0$2x;c1UZ@czI&svvF>`3uqiQ$6Iy83F5WCx3r~Zir z0w+fQ@28zvX-2Nd7wCimon@)@x;4l*T=4h-pK`;*Lc8c|ve z0*6Cv;>RW{wWf>yy!xx0ch*=McugNjL05@mBEy58#33UjwcTb>QQ4+_jF)BjjBVE8 z|5>z9g;4*$=@x6vC{T?T{i$$@2KJ(9^Fwu!DVo32Nxjdvg>(aOuUM^9pVyGypNydpZpj2%-Ds9Kyjz_^0gqtcjj~j4Vp{j% z=D|9FmX(lM!%>F%^&XX%z5A=H%u2#Ci5DdbTD8j7Yq?mAJl?ZH4jwH(8So;jJxL99?Wz#qz>J^@sI^G> z9hG>*YWR_zw=`&i(KMClrA8d|gFd;=tUW!xNT@)+v)j>|l( z;IQMVlM+ca4eC^}2ObW4u9bj4*-OZtJiWyBB*V}AC))>?(YZD~b3Rf27g!_0v%&$H zf~uJ?vW;u<0@#e1UDh3`XBdeU>8Plg%<*pS1wYW)O;t!Ot7xo~p?4S_ zSBN_zC;9h(G=Li>_aBCL_t9SQ(-4`-n_Fo8!(rMUijbwNPw<4kOfZb@0dP_@7Kz3s zwe6{xtiOX=g{CFe`h9yzm>+*?6T!9=W_B=R9XmWZ1CUFj?oW68Eo$C$$^EkksDenv zxU?>AeTOTQ2X62d?<04g1{PChqtEEpvdm~yVxMk;s#nXojWUCfu#f2+!hDrHC{j@b zVU4sIk4dJAJwbcafw?Me9X5PuhP89=O zRqo&A-58~QUI&MN6P>_-#A=haMBb7c)V!H1@E%AX-f03s2ZGioulb(D#an~@Cd4eK zc`LeL#T-;QGuUFil6f>y4KpqP2nAc>67dQQ*Swz&mKK!DI+ddg$jF93{N|QDch>M`F=17`UJ~6qZs*|qPE{Ofw@Ja5INuRlLf78e>BU-Ntv|uQD$*2#Lp*K9hSrux z&o!j2q4cfw-xG7*pT(z~emRTx#x_5a&xyS1vYf?4SKu|(&a4@x;U|}kA4SbNknhv$ zE&wWaiTh+OnnEf>V-9~hP-KxZbHZQL-%VlfAq(?+jj-hJQZ+-lNU>7;{wl`UhtB@w z3P5PV3SfG@$}ke$UhNr3@#u=V`a7gg>L^ThKNIp6g>RKhD=EQTiv>!cMrqITfl#<3 z77!(-KS0^sB@cL;I0ytBD%sY8zJVpQoNp3s#Y#w&9ZyyeQx&=s^<7YALQes7I;CUJh-C>Nw59(D{S6~C zidjf&lTd}^XuM%0KGPvRx~U@tNeHN$dN@4p9S)ATL({vAlE=Ez5>}S|WxuZ} ztqrrodb7?tG ztdqQp4duCa<(b&!sdgK~zpWpy_xHC3Ll&FiZr4o^GsG7Bml}Z!4WX-F#FVIIU;G8p zFGRU9>BR_s)Ym>ZS{sQ99gXmiKc&F@$#F=$NHY}*x8-*WOvOAVw)4c)5Ih=So=3Ea zfwksNfwmlvgtXerX0s{@la!x`3orltXSI1|&#%@hoVc)+w8rC^)AIZ`DURW#M`4R< zeqHrQ?Fzp@1uTh${hIu(da?ukiGpmaD{W+&ut+s|WK#i-ee9y^45NsDFGLt-NrEWQ zrJ33H`byAqiY(sn^R)?+pP9eh%-N%6+2SMjD`5$eqsqLp*dYphyt%(4-6I}_^cMv^Hst>KJ46Or;YVny0;gpdlfKxCfnRb3QVY>qKeOz|nb7qoQ>mtml z8Fp0W{7dEGp{Od*mo%!1Na}}vbLWJqK-p+~ZKP+Li@?w!RdwGqyP57??-fu%jtVie zn=o>F5k0``lkqP~Y){|m`c0w32@z2U=uQ>vOdaC>V3D#|Luru~*HmTCj9q7FDuIS| z*+DKT8iF=S4o^)`ubL%GFW(q@r;M@^Ugh4+%1l*A!QdQBe|HLCD0C zbgxiTR8)F7gNzyVSA>=phwts{OZee@zNoTH%dy0HEs`I>F7(~nh!sAXD-)dMeC9qZ zsJBH#+a??N2WqH+$lL+y6k%jyhk<~_fnOGMJyLC?O=~rOg1en{q26y!qO0kooKc-i zEkl);slRP!ll9BzR1$bk)`9m{gHD2jNQij#KzsVdsVWw34>63#7AUt*0{kQJ)|UyP^%rQvl1SSa za;z*QJGL5|8(T!o1>&YPx1WYgd{Hd4Pk#yVHC839YPX}LC;IrJmQR0kO{;!|#*4h0 z{f)ozYlysP`S2XmYoRT`OJk&3k<3DUxFp5l+7;Kadx09yT=c>ULz8Mn;Lx`P688o66s;oj{N|t-6U2;Myg$HE(jNk(L-ky<8BcPY}`W*mO|y^Z`XIt z@dwgkt|p|I@B_x+=MNf`lwO!Rb!FV@Ws!VoQZ-R|pe*AYSrgVp+$^D8tm<&Zgget4 zM9`^cQ5jvALNf63r^dGqbz zNm3?h%ETe%qn%k2biVBpTf!g;Y*Ss9YbEOAB^5XZPk|J~b7Mz676NAy-7nH~B8&?A zJ%Y2lnRH6|?YYXE@T?y}CZQNk+msi{w0c^f?R(_eBKxiiY9X35D+bT>6lCIgeN4~| z5WR@thwI&`Y@*h-|5iCdo4WVLS;edJcSV^STDSza`TBxC_}ImLFSF3k4S3+xwgAle;*4?QN8Fp;4=)5_k>TdBgSH z4b|zRV+d`OxEsQv`&KkQg+OQgaUPlW&rCAx1)g9Xac5wn?Wc>Uh(H!E!)4P7g**af zXgH~KC<_Y7`8BR+e2PcbxV%{o?Z?~OyASBBq)#&Ha)_+l@K~EH`Ff1@u;i0zOQeAq z2Fz>=i)biRb~t;Qin2W&v;uwG;e>RjpPRC&*|1UCVNSLa58$NwCAG2+SlL!z3<-5Y z!r9+3BbYP)^kjn$ME;A%(MLJ*1kvu~8tsrdo_366wCaseZLRAE8k@PWt%G-^fGO$g z!}Tzc2WKA`bBlz#%HR~j&=Z$ZF)ZVdF~NPXuwQux6{TmY9_hZKw#~aQ$9L)?S1fZlYtwD9w9|C9zT!#2GWay z`AgMAo@IR(7|`6)4J$-C3(kd+y6$zvgy+KIlT)Vh1nBt_Ebq(H{Tqs?xrK(8OZhbW zrotr%^aS1Miy<(CMq>oaYMqnfW^M8jn3(Hd&MrsAsvuzYSk9BI1Fre`37msExTdA1 zrnmjAdYOe)M!i2a#c|{mFjuVbE48^Kr!;fuW8r#Mbry6`ABv?+GAum=#)ej2QPx|b z5|6XDMRe_jRR>bO+n(lD56W>)AKJ1wa|C}$sRKxKuAh?W^Xh7gBL|dx{c zKgTB?pIqUsFjMqS(TVtM3nhFZp?nU?@bXV_zr*rzVW>fEgBOThB~y$Q$Ke=Y=v7!PSKisXl!}gv#+ZP4K+zegAblkwSycXXCkUedF&zjF)bIDmy72|3M^Q%FDO(T<4FJ0#!#hcwP?Gs*@1{odWpdycQGESYMiF} zhos|Lk81fh5>|wj+xWj)pS~9ZNVMsVlga5P$Nx64o!c>LwbBT4q$yX@>Zlmt+w z;w~CEScG?X;L_QqPrq!4V}>6#R60E6zqy92c5UVqF6&me^R7#!CfBKX5MB*7ytW)O zCEmNCo=H%8MKmF+Cy4;yA$L}0DFN`|(LJx3B?cE<=6-jt>^qA{-sfvU6m6w>)Er0Q zI);Pu!Z6 z&6?NZR-sewo9jf}7~;MA_4cF8nmj}HF}Pc$i)15IyIZ*gzN)+_U#g`E<5tfeY*Mj( zNP+9SfEp0-lgIP@g83ZUgjh?XG#LgfOh zjXN?^yXV*8ztNQAsDDsIq250!)brq$wR5mTRTYsEs?Sl^Nv56P+@XB8WWdR$a97Q9 z&>L-Hay+y-K!MUD<`>if4o0^hiQP$NQ%E(S74;j|M4(@n7jJGHY!ypHSAjbUXplRi za-lb5fUaZ<=RTdJ^)nxN`C7w-1=Ovpeg07c)TocD(2HOM`36zOjtbL7A!1=NvD%I6y)f)sOQ+~sTj@=k2h4j z8OjUWM8irlNvnjnaxY>K@M0AUdLg$F5cHo!zgW9;pNG_uvpzlhAFVu)Y*sUmPbaio z`xt1Bi)@cX$K2jy-Nf9h%9*d<5^L?zGMievT$DGM8#Plwq?^kge+1E|YFbP#(5+3Z zI+_nKo9cE9ls&H%c2!F@W@qae;0HJs>%q<4J90ZDTEPqfj&b~V8BheLa#^U5=OuK% ztknq-OKIt3ZronoU*CkS6rxW)O*wDMQnV4*PugH-;B0~Z`L}{6ywx?F6%)fhSd@-=y}w0GHcL_EJsJmHj(_P~ zeDn>ALMd)3gxaW&V39_^$fRZXrCGaSrH<@nvdvy(oQL!rekP9$=jPm9)Hhl-dr&zK*l|=61(W-N$>URRAd1VBG!{)W8?g9Y5@|m8Bqw$-#_dG&>EG+nB-m~E8 zBBBp|5Xfg%8VR;3^&@ewS#6Hh)LwSHSOGGZYFYWvyZelj@V>0N#G1?8P|mTI(@i4R zy@St-hNz-I4tLv^326$3t26(qTd##^bg7GC5=C=Otut(VE`BH?R&-L2d8A(^2mif0 zWh2byD+xxx-Io(U==Lfx{tzN8#raKbY@=sGKeAAH6*F2B)pQ?UOBKk1>qgBT>hU|z z;ZFyS1{^UYA7rkkJcJm_~Rh?t>E+Rd>MR@70QWc8&@f zWbgActoFmDwtkv1l<;}AP6;MQYx$85D&^^KC&bh~%;+!!kb!W)#1Qp7q1EMXrC?AQ ziI`OyAM}_3{H-VX>QxpQ0+M37go2;GYwdY>GveEd4=%jyJ;R2Z!j{HQMnMtq^+3gE z9l7&$v9`kO8VLKd{vBq;UT;`1sInzK*w5bAfSzCjJB%Tq?2EDc9|1@hw~BdVOT|A7 zGG%TKG(qj{c`czdwMBZH5jApm`qKQoTetr(GifWF`CH7274WC?>$}Ns-TUk7-+E^j zOs*}QwY4{|EvU#I63K7wAvE!fMQBrO$q>~#$kT(32RT2nRo0(rB2ab>keWos?ObkL z`9VCf>H1!!qTY6Pm51U_nr84~Vdy^qmE&+imD6x1_wd|sFHe7SxQpmN*MHll37Cf$mD$+UL15JwWL`oQz2CjJQT@X|CBR_&JDnpYy8ja?T#K68#ZmFkN}7&jM`3h5 z{37%yM4h&%&;dWgr(c`Z%#r?6QUKK_D@kQGu^`M%$2P?u{?{MOK*0~qLYiKQJ@qzV z0pY+rZQhu1Oc)+&k1}L9Lx{*ND)Y7Ohx z&gv4#B8azNN#ZH`>2Afn`+$5g{ew)R+Z}e@3s90l;DK7T zJUXU2qi|5(yT(6@#V>prrQGqYWtJkonx(%kWwx`A8^Kt%gW!Bd@@(^~rIv|0)7GG) zx-BF#Tgf#uqOa96dday{>Tt7vK-HKF+Nd#pt3aiU5CDq^=%;VQF(`&LYD-;%jrM|2 z(Ud(9sMHs=4qwYPpf2g&Cif!x-*j3Ju}71WdS_p=wb+M0EkWGR5lYsf;w#F9aR;KM zl@x7Vkcp+7045rLgI8q|TFdE;x-$%H1 z;;pBUzZ9%nd`*An<)!6CGy_^~!~+%=Tl9QeUR_yhuP(2)+b#Uh^H&S)MI6slMeMfi zXZLptg-5lvP9pcedX$gFsJJnT4Me64-=O@2B zbO8bR{$KfkEY1hWcDSC~8#Sk*?)+M|HQe8)jokdgBCxe7nahjs{b(|?1PHk}s5}T6xotQuxW1cL`5e+6k># zwRk|g7}t!*v!idMDi@nzR%#LU7g1W8%;a!r;; zDYhtC+dS+HSRV|qNn^i`zP1`S>vFL@wZ##1GqMBa?3zQ$+nUY(o0IXUJ*B>KP|07N z%7TB@E5!TOnhdDXL^+GR2mk)QNQa!5&rzhTwL;CsV!7owJ{4u920`=1D~MPmtEGq1 zS56Ow+Arq_6sV@s*H*=xIk#)UCs=3@lb;?CL~V*eHGJybohZr%k^r!8PALcMy}ziOz4+gMDxekA-dm&+xb#VXf9%6)zlrw4 zV`u)oX#E4hhx*sPp8a(Ir;ok$*$_HqZHSu2Y`*(n25bBr>B!$IeWIGx%Q z<&kjHh5xG9gqOAM8yl3ZdQq1fw*qBDH7SVT`|UXB3Pjb7RAC{$ATmUBP}+8sSncw& zm@+|gNXcbZ-giRLKo{`G>yC{QRo0gfU12L4Eqbk9RLkjj54n8RrivX|9#ewf2jv_` z`w-H!@xyS-`}Dwz@)s0+W6w)f*?EsD`IBotP#&-=7kS)1hF1_eWS`EjuB>N{9XsqC zZyas8W=p?zbEo}=x=x+|*W&I5p}is(A=gf$+u%=U8KNwXWr(!@KpttW4=ow;FI>iG zqOjbR?H6a{$Z@$FRJ}voM!ywm7kT5zrTj`RMLh074+Y-#3Z^q#V!Iqr1KjT^Y7J8& zJBjI_B;)F{-t8mo9C-2Q)@&i-T*J73Ji;wE%8l#)eh18P5k9EkPEl_9Z@F|QZyA*8 zi9}Av1`YP85eU~5)^-0^{BY{Behi{&H;pm6yk?ITAYqr^Rbkr*{-|nDbsc3o#JNxv z*{lyodg$VuGz;4Y*p%lQ7gB^&1j{*S4Nq zM2`t9taaFXCqzTo<2w{s)2cC@eOzXGoiZM>=tqiERQ*VUg*%{UtW9iql%^)A44uMb zsM=5IJL~A@%0vBz!*}oZ{TtZWE`Nhq4~P!cm~3okL-esgWK?K=kL`%>Ek$S!Q-~0}*lJG(vldOYus^D%)&cTI`!6+WVim zjB{|$Kx)QI#RSSloCpb7P0DXipHzyKCjYwXjfe4)4h?-FTaCR=2bsSV!&0&Oi&}4( z_rdRf*YB!|T~m3?n>! zFvh#*7qwMfva02Q3!zGEZf?>wfZivn`bw3G`Z}Q1h1ZMofCCGQ%ebLS?bX#KRHmg~ z-C9N1dU2_>j5s_p)~hHX#y8mEkprxZ7AQMNzTKmzeH}n;_;HoDBpK@LEGa;zqbV^L z0OH;=pRpp8VAf!u&Zv2|dy7EH?Wp^~^6^?Xb6y~g{lHqc%6<_+FtO)O>QCz))ks=J z`Tz1o=}^2kAH_y1Hw#IF6mYf4FS{InJwwX=Sqf>qB2hg7Myap&zaBORJ?RuOR3h%|C0=^63B*Fuw&eF37Dpqq+rf*b4 zSIb|DstH3%Y7dXN##8yLSUsY^K4A6epjbUZ6I^x`yav7S;UTW%gQS6=)WKmpxtY*H zN7WGo5c;ELu@?zTbSJv@qH9gdlk@X&+9y|M&&63(`u~hRhiX)7?~~EGK+27Cd}x|0 z<~V4iX&P%>SbV4y*$tHjr0W&HPAT<; z*Nh`1TnbkQct~`i8<@7A&ktcoaiin}o?8dm$YMa8BDV{hz*QQ&K^D-arhdc}2#M59 z#XLJ(f|pA5M21CqwQwQee9&DT=x_RhXV0XSuT9EzO0Yh>+w6I$H>d?f+$MMD0P`&0 zNPm)=qx3_bI!R@zt9N(DA1m*SI9V_UqqDMb(@6(Gpj56sZQOuB2?nv$_}Pb$c4VZv z!2&r%YNHp2W;5&XVdU_bug=lL=oYV|EU!IMR*{h+da75H=*w)}xNPSLpwC@mB<#bC zeOxpndHgvZ=$mzI>lB;%wJziqIw(II^hQoL6ze4pxwgSEQHy6M2q9TwZq>RH<=8X4 zI@AxzFC_4UKql;t>@t@`$l|^WcyB=%s_ik5`h92|gyF%ts@;6q%c|xPR5m$u&)Cal zu)FZ;07zrXd%~B;xRrhA{LbeppQcXG^&OpgF0b#Q;k6l|G)+Hw&|J520KPf-fwR&B z34m)!ObDwjA6hpri0%9f35Rt@CE~HufQc*{0Y6HA<7q?^UBCvKCn8_ytMJ#0a_dMv zP?cZ)>ijYl6e!;SFUBO33{KjS<*3)(SUk-2Ybo$#7=rzcT_q&td)Z(0CfX3l~XRcqX z4j2ptFZA|JWa$Lw=2@Vf#>GL|``V&5)?U^`yHDhM>P|eb>k&4b+J9wU26Cb>D`!PKApgf(182^lG~dTb%|Du)Nm z*`w#`kLTyfx%H9Z?p%w=r|b@{L{PTXi>Ppd zAA%z|48q&<;cQ$~7ZbCp)wuoeGae&=;ie-MJNE!k;a4*m_;8_kfw-OC-4m$Nr8k|Z zF=gy-h7<=khndO~Q#;xpk9uOyNl{rYU@d)d?T>nt2$WATMdH~jXklpPf$#{g%Cku> z%lWlH7C}36OLB#&f zucTh08Biq(qT4d*6)iCHPrHS!)^b-fU%5E-QLMTo(5Q=cIS>UKc4|~v#Cm;5B*h`j z(nO+$av#ceO4lb~Cb6344of;@Puq?ImFau?M+_@U4+tt|j`1tFWBMUT%I6Z75(y~1 zt;mQz%K%#@G$l(+@Gxma$Jo?3gSu5s(|tPMaIf~n1*Mz{aZwzRtu9tW0UMPz?*Q}2 zha$it#QCvfWi~sBBQj9b`&g1nxyz2daj9d%-Ei)RadvyN4ao8ll!i|MH)xS zCK#%cFFGZ$xO2et4S1Qw6d713r{Dl2gI$XN?)BI!WR=5T&P8+{tpfI9kg|m})4OXZ zCA@HC;KZ*C&aX0h%C_MX97Dwj`BjrMjs`@{o&jNwAfPeVS&NBdnYQsIkDlVO**3_# z3r}3pRz^5TJ4~~J)gOfTc=Tc4Syx^vsskEz%62QP$KP#ic~HwTLBGUX?CjA?qgJJ_=-( zXTJ$#VhT6-?R0Pj6U+lsQz=;CDm$t~TOUz$^}>Z12(93-;Nxq4BLg=%4M@UcG7)}d zvb|wZJ?y?aEXplQpVFiehyouoq)+p1{v`oL@!Zub&@;KzVIyLohOR0b-#@jPIcxlU zdwFA03MI|ch8PYFDxqqPCc6W{|%Fba$u-jZm(B$pT85uXVUBziF5p0l?S_ItN(m02r#Qn3>&i=At>uOmZ2EIw zj?bB3Fs1mIcY2OEjYl{k0l#Hk?7Gy0)v$-ec@~kdbc8rgiiUZz{Ydt==)Z+h_YJtH z?1Q8OtyGf~LVD4rW&N=8##1d>d_~m)s8!6!-KiffJHVA{ZAmyQAUoZ_nT_x!hVI?equxF z*;uYChEI7~U?aJ?5ovYHjF^{Oe%K!qa`E)b6#-!Xj#uzaDg@Ym@655ryXq+`#g8Aa z#n2U1NhnnNs;lbL4t4qk=ELdK%f=VTq-gRI;+-R6;BQYe_i&$Tr-8WqBy;zW+fvOS zKkn(%hJ=`)?|(8R}UyLP{*^iQwAzlb0u^ zaiVG5n26tSdn#i-r$qtjh3bF}d(PAlG&Lu;5XWfOsXvlmQXr-OMYe_p4XS$+Q#ta= zB2o^m8G`Glkp~2Hdlv)8n={OK?%Xe{3V186F5EW8sa#E2Ab8;*1@b14l1)9D+*C|$ zv2F0Y)NWDT!B9purM(p8yKZb$w_^BJ2_L-A?Us~-t&Cp6sb+I)^p*8Q~qKU z3BwtR%X}Lcij!teqo)@0VGY5I^7)@-@t+R365Qq_TGD_v}+%x>4 z`sw5+KLCytLsOkg8qy+Si2%mb_}%YhsyHiblU@+ReiJZL{U9_R=hzmTkSG2iTcGnc z&%DO@fxCOqdpcXP`)|c+0bY|nMO-QJ|2}0%2U4@`@PNvTUKf`?{{Nl3L z1V=T<^(%N6xdVE%MW!H0@b!0KcgYc0Q--QPRFglIhgX}8JpzSdsDB%YL9j8Gou>T9jzlQu0q=O(|jj@T_M!>qA0(w3XyxnY~nbkxT_h zFeweF_NiX&K3{gro<>}#!3!sR4qU0`h$qP9?ChIvaqaRdXH?f;1JfQd63X*}(r%r^ zHPe%~2{TjrKQ|asP!7p4C&Y5$0Xh$=Nl*y@*d!F#R3z$VSW!x}(;h@Ekp%VRzg1B} zb~94u#;BVlPNF56+lmODE}g!xUtm70PR|tgW4Jo}sA>GLc3WyJjT*rC;03H%D65QE zv0}ZlmR|&6tb;yf34zen4m43|Bza7Y102Bf!TwuTX#p;M{KCQQFNAC=lG_s$M>H-z zvO-c~{=0LLW3G|Ol7Zs^RK{F3d=vi1p;-|TrmBLi!wMq$_R=Drj$ll>KJGVJRb>X; z{flA4-VZIN_A8;&q~W#d(AV-nZU+yf?nTOlgnz}c19d-OIn=+g);OvkbE;NRgaS1S z?zCm*VlHn6*bXEbo1pP#MkdqOnlHo!DM-1dAYT=veJfC zxU@R*} zKHo|hRRA(9emjXhNtfaT*y9Bmf(WisQ*h>e>SrU!NR!l#N=8HBlVcXAMvU!>m=|d! z=Z4YwwYNnXE|@TT^n^i{D#|4_LtLlGSMv2dxeXHToem|j*o|Ps&K_)R%7zpO-1Gyh zVKq5G;lmcnQd32eoZ^Qm{fX*P*>1{Q>q}Um=2~kbZb9Z2?g~uRAgm0Fg8yp4=srkX zJa(RM&R$-8zKZeqSZJS;3u>T_0!5Bj@p$h>l1gd8Q=XuGcnO`*i%~AX)o*NZMVfU9 zQuZOCcZ2=_H77R9?-` z@h-$x5)DiZzmSDV^f#6@at}!yCTcBhaP1x2(bhkIDLlaAy!~dPe7|I7?I_W0O!8w( z$HViYq_RR%OvA$|LH^+oMH8yNK3qz+sriCb>ZSrZdQmkVCbu%6uqNt5EMT`+dIY+Scd!0BAt(Z5N-y9R zb5RpMCOIUb(flYz7pF>C5IxN+>u09=(h?oiFN9Q=+}O0G3uLw80<~PxpN!?IBbbVr z3Yfb-*d>Vx`NaM~f@HDi2<=y#q)N=j3BhW;4m)EK0I=GWCJ8tX6TtZZlt+le0mAL` zikhNEDGK0zyLL~pFsQN9*jQPrmBI7b3+?yWqAT`&jWpEa;`00=)OI9PSU=`h7guPU zu&}TU*K(OMSqfoW%UeqB$$mXZ96WZA`Kf0JQ6wWMW;|O6aX@(u5~NIRb=+o$*9!Q+ zo-zd9)av+|rEw>N_bPo4J0WR8laG!eMg>)N5RAnzJ{^S~ zg|!Y7@Tx&4W7mu~h6>u&j&%1rJ4fA3zjgMt{`k3vueCSN9imZNk9N#z>Y^~d&<&b7 z2IH^R6iTZ|)eH(}g+M>b`&7&~R3j&ef=_pUxlD{!(X$^(kum|0_Ezk;YQYXLwXD{0c>7D>3@T z+@_IeUkwiBXk47lp_4d=X6~Hp&(zbPI#uXgp_4_NWsHg!NoOGR&2l?L9Yg;?30lRn z5BeZtGZSY)jS(}utOQdb5Aq`eNtK($P^tKN_(et|RNx@Rhj_@ z4IoorIcoK?7O5US`Sa#iq&h{(>{KWXI)?-T_5L{Kd+R8=;e;&-NBc6O+3NUwcyT`= zqXorCiK5M4;a53jv`5tu3&Z|}`H|A88<#5r?Q|m!eN@vwpZ#WpYT|YIsCdTH2h8fn zBXhSMdzIp1MHGq`AbS8z!69}!k11WThK*>}cX_jaN0fDaGI76OBgK-@Zr1t-{%4VQ zFjuJYzm!yn(KHe7wpn&y@rLiY86|D8f1R#S@7N<5XBrTZH} zGV@Sc$M-kGJARVgo7@pdNw?amnp^W`BM%AEpYXTc`MpVPN3(hH`{sW|<&l!08p4=Q z8R#^IKwP>6zf*;zRA9J{^!837%XN{2QY}Ct3FL)IZmYqiKTGJ1&{RZb=xQ#lH-Q8J z3!oHclCQ&3Qd~)b!&BP1wpg5rG+JeJ84r;v&O2txVZ;)3mrQ#TrA>H@=AGn>&<~4p(CJlg zxdB6f%TYD_`OW9K@yTaqqU56etK&@JQ$=~M%Bvg=wjy7a1hggL1stYea!#y&K4yzV zHJ<9f7dj|T?nR+9bBzGp-XY$xeRccc-EAh}`o982|<6`AjQ}VHHUnxnF zxiQkimtW@sbV(W<7MPup6mKf6UwcO&G~8tpz4Qc%41*wN)?0fgOf+2U{xO8Ak6x?d>oLl2IHA$dCPSM{YIeq$@KZ&^|?7gTVpgAl!ayM(6?hKXRo!U$O-E z7kw7llIe@BOVMPzAlQ7@{KMc6bG)nFnagDsyzBb%b__J_72Tb@di#g@l?!e9!qrk_ zMn-pm<5Wx}h*U~i)tWS|xLB4;JnfscTT~QmETz`nptBZUP|y?&K@j+8-hmV|Z1v~W zUsE$6HfpU~Ui~$=&Gb4lG2Ma4_xeKIeA3ct58+Y#u(cYRpIWcngaYLMff6L-1{Sfi zyxvpv5Jtb-hh)9J)t2OF)Mt`i zj{THtw;f=ocZ~1Dbd^4X<|_l1*!Sr>zpOS@lm>5@cSfTYz7cJXMEaO-Xii+84B$>R z!MAbQ@W3VnED$rrs~I=Cq6-`r@#ni0)ur=B9hPtwNvhW(Utpk!zAfRUuWXi-3hSK7RhVcAa%mbj2xLwI%tZD+(>Rc*cW~{@Wc&_Pq3sNN3G23GZShv@R zBnTlikYZ~PSss@KseDc}kS)SzntT@uqxqXtcDkX&JIdH~iAdNTC~Zfk&TuLE*(9T= zkIA5-Fx1(Degu5Y<>}b2$eW|>+?|GDBHvWSN??Jp(U_d|X=8~anX_)WQYrraXW>$% zs1!3=!3|3doiKHMkl&!*lm_#G)4;YHu%q^_Y(m}8KI|V zCp0YV;uiJ+80Wq0$D-CO>PH2!JZ6L_DYZRN4PI47L{R^h1;a&01ss%+4id5WsGn7T z_}LZ|ilYDxOm7r|^iJ6^@^Ykw>qg!WYP(~w{3oMu&t1q8{$k=mZxqs#8y#%&spu4(OdItN9$g#}MFysq4Z0X(mD8Q{4f{c<@znt)9I^Ze~G zGr0N7oC`*9;-f_5j~vEG-vTLrJ|77(4iFHX^BRBULXNs-zJe%^)oVrNcOtC-4*8x~ zXjk4)RgxQ{nz`>G?YV?y+|&)}toOEbL-e;c_LK@1So{q$H;<0B7SCmF7VDQ6a&XGD;In$h?It{a1wf%Zt&8QIag8X9<&)0*DguK=&I3Z zQb>5bBbJRoL+Gc!@lmIfug!}qCOZE(K)JiTJIAY*Ti{LI^7U=4Ex2IC8vaynmnY~b z;%j3iB}^hHNC+5CRUIHzaQT3M;*j&fQ9b}90c#O?;Ei689CAX>NoK_=1n)|E-)Y%u zfL2lJjqsSL(N@1Y+9QA z8ycy3^oV6l*Nm%ynZ_hib5$-Xy@c`}p;GK^jPL0S1C!uWqqDJoq}nl-CYAK&ZdQqK zQ-?YV9E|9IT!S{^m_%>Jl&7j|>ir!by>WAPM(_-_y!j3vBlTK}woB1yiQyu~R%g>E>9T%4GthScO+Nk4-JsAD;UWGA2|wj~o)N^jX3AXvPC z(bD~tNkDDe%~L)A@1F(ffqdfa9`btS(kazGesVqY;46MhJc1H0)K+5Mi{`o3%_wY0y zA`y+t3w>B-4|_3{eA1ncN^pY@;r;pB%k#L6egRURpiZ1m1%od}x1%q`|G7F>{Esj5 zFQ7KQ_{->pUP@;Xb~xm>Y5Vl_g_q#Zu_75e4_ZK6^NZoHxQ`NHbRqH1Tkhzxe3Qr- z>JcehZ5dT*q74!(`3HmQHzk6mXQe(>2unlK%wCN{!~ z(H{UMhl&l-BuwAH3Fb7rwb|SI-(bJ$=_Tc5ipM-`89ETw>$)SXVzpf)I5xYzqg{tA z=sl+h4I^dZ1&YR6Ma#?_!&tZ~<^C>nAgRKPJiWR{R234Ko?z_|YzQ4}c%Y(5C+He#D|F2uVKX-JCIo zP!0xah*ai%dd_w>Tg!|DJI)7UtEQIaieo9LDHgUyjNCgTbTj%1_3ek*rkn zmCvC<7G7;*D4{g!)46`6G)UEZtKeuHY)n{l2Z)+B`71X>e}JSQ#>*;`2RJ5tKvIXB z+y4T$xXJ(gI{iVBOoU`vTHcy#%k_#ZNyb#;Gvl?)+Gk$8swrB&w!Qe|Yw6Nc4Ysab7AK-vP52G1!*u$#L5It>Pq*o zTvYl->Er@-Z||Wfn(~^;Fr;O_fn*7gZkWzgmdLcL5WV_n_j0N^@Z5M`(IuA+7Tf7w z-T|Et1wa+C%H>@v0oL1aDa-cT7~h{2nuoYG+&JuYw`pai3^+_VY>FcFV5b==E-{|@ zEzP8>%MYil+`pV({ic)yj&ij^q3i+pqoJe|bK=)lQ_})erif&ObnqXg9-)5L7n7Qt*6Zp9S@?iCYdD(Pf&JLOMHY-0(vG{^yHOppw%*mSiwFps3aw zgDDYWNS}rUQCmumNEgC8xu*zX=wtyI)0j^DJ?@oIi3i8z;J`&ANs%h+ZRA91fPg2- zHrI2Jx_j=aue7+8qw!szZh4wIm$zlk#GBma;E+p?SA|M})@0IKCRf&|gjff6Uy$WZ zYv^|@pS`_u`CNa`@+nUzIN%~`zeM+2p@AJ7Gq=O`mB~0g;(!)sg(F(DVh5hGd`Q4M z<+f=M)CEq3PDb>=b&)Bx%ho*~TL|EmhM^XVkrH+1_U2}s98Bpzi0CW%6M1_xwRg5E z_qLA?xZz8SQbX01N!%=>w8-eDdfbimL)4)KMu=#Vs&qwST@=kr42;+ifT6II)X^YQ7Ob$kdeYaP%X6rCW?BbV7A~nn0 z#d2tk)Tkkzlr|x8+0&2*{*)$!8#Z{2tBm|~woEx28NO#etKCBKN?g9k2$~?+1eus4 zp%Co}qK(g?%DR+;DE>HvlUR%*W@rvYqmg2YMER<{SAV@>hVnW+SUo+*2fTuh<_)89 zK2^46<%5cU^&fnhThIGT^nrgWf=gWe%z|^2Xz3^2JQyW%5`78gFHfUUBGyt%6@UF{*Z3W>% zrM^+Hl8SvH9(NDvfSxUO&N_GTF)Hq@AZ`|f!7yc3wK~LtAr{}M*nYSwbHyTY9%ppy z)CVNGT^<`#<$`JBb;*?xb`k_udotB7kp{$RuA)dAuP2{j%$zn-#Uy@L(Nsrpkhg@| z0P8ti^V&dZOI9ABxGMN-qJr|jnHsC_*XQQxK`8WpQ3PP*s?Po{>#2&e9_!K54<9}9 z6V7asQFW>6iRL#Cg$J9HgBIIKfS)|9zDow_f}0LSSGZT zgVMeX#laNRr8h=?nXFYoosVZ5^NCp&n%nf9-74xk@}Ga*M@8oHruKB|o^VQRKWA>? zl*`i2w*K4A*ASS$}C~+4} z3-fk`Mg($3vv{`w#Yzf?BPq9z9073!vh&lmI`z5uu#jV=65Pkbi1Udrum?aet_TBu z=sKilf>A(6_n`DbL6zc=LPNP#l$6 zGj6Qo$Osq3_uCn)E4UVKO_{(lc5?q>pp84iC)&E7T!R>Xbg1kO@4aoXIOn%hTu!yAr7znw?lf}UUt5QOXMm`9k z^1~@CcM4ikr(}pdvLzYM74`s8$UOEa|5 z4LPG0SITi^4 z<(f`Lr=L=JWEjeFUkLJh*X$H8XlMNM&E?kU_Ighg3`FS-nQ5`Hw{Vf!( zwEHi^5l!M@{1+vA}9K$%es`J*${c8r<^H_{?g5!ZyXQk6k<6iB?ffkA`qFX zq@%k5wRAJV_iQxIM-QP2bl&z!NMlg8!ACEV9hdax#rdexa#ffveG=D374awLoz*2) zYAd$dFQRYA_N0G7n`ZB2{9E#oL3h@x`Bs%3G zk#@uY8c4^j0LXb7M|4g~B%wP|&~u4_$p~?v?ksTMqp2ge-Wy@{57$#?Z`Eh>bMPu_ zobkLDgE+9!7`xuiVIDcPgPnEKH+_wG{a1$?HGrdXUr5F`^=1}ut8uFasGzt%S#+); zf3xT4glevI+ip^-n41R5mVSJ$y!Wr<=coO~&nKhNL&atQa-t>utdK!{a!NsyW9iD@ zksp^nA3=M67by!tqUfUc-;m6apTrPOn`&!ubav4z>(@&on+iT7JH<3jfwMA#bZ6)* zw~Loo>de-6>?!pCw;HUVpgFN>W3l#ObS8?023-ozLp;5KZR$#hYrf_D8)Egpy*U{} z_W`UtD>EN^KQVTu@*RGx{G*iR0jM68Iyei|B5t8Sr`F-5XS^{3Y=(^qV6)U$TCLI3 zQo(@g1x!$L_N3&b*7xj=zgzDq!4GrYUU{`ks>HsM47VkU`#-r^LAb2ew@r1tNh1Sv zXUP4{hA~Oy?0TK8*orxAEP?Q%VoVggbH?k z8>24EvdLphfu-_Rc#w6OX;;dLupkdSw0c3w9AnT!fOYzJze@`UT}Tes350$UWEGK* zq?szuZNTuaQX2vWjZHo|59XIu;z)XSyaBzMd)L3dV(h3;Z!gr90AO=NLRnJ9-9jj{l>4P^cxe5ZSQw_DL+z#OrU>~x4x`_oOxIm>93B8->04gTLH(A0{{IDU+zBA97>XAe!e?3&yx~HT z)}qVGr%TY4Rw^sdb)l(7%+|N@j>@oIyu{3~#S-O173;Q6tOv1$|vbaI!2`AyGQ z?iqKh5=6^*f1;Fb?kXBoN1@HoU;_#NUY0Xgx-MNfX5D%9#L3xu`fBs4yCKkAI2udU)K4j{UmMCE!$g_(~1TESipLW>fX{nnSdUD_E3Bv%7<%f_4IUZvEYkTYNB0cQ<++ z<3&WL{+$LV6oaTkqyZ?opw85{-@fnns#huCrq-U-!(@q+&j#d(;xh$m5R|ga7?=Vz z8ofw`K*ZJkP*MFvd3rHv$Gi_cUB)INR;A5R?R9{+qBHxv(|vY0jYrvA*Iar~SVDUI=@bQ0afd)=RvRFc+-fdBVF{ z#4}-5JBppr@}NW*mSNEt-<;e*v70dKl{nfXrH>34LL*+U9He;Dpq8jCeAgaX$CQbm z0=A^-q=%oikRGIrtBXCRH^?>BB3lX0)*!&_B?TTmI3Bo_#b$yM9$bI~r)z7(K2)!e z7eD!Ya(Q(EmqgYpt>&ca<eL-de{M3F_#UgW2iu5sobzA;F}aLz-W$wU7>MAdsrY; z4XHmCsZEOjKm#Ymax^xLRfiZ0OzHA=ggz6JnqT?k@@dbW%bvfIa;13##58HpwQd^! zJusc+`K6_`NRttf63IYti0~z~19yuUWhMo*&H*TXkYc%0-|U>;{f2H7S~db^)ix%n z*Ju~E1MdT(O>g2H;h=krhx6!9Eb`eu6}+D`b@_2kJ%s$Z2t+;m=9DLIvUamN>}_?V z`_5#nH|LB%U+}J)>x9XZmRUU-QXr&7o%xRCpK|rsFRO=o2f&u<{?3}9VI)IiyAV+( zFGaLr6%D49#l`uR1riBMbQ&fu!nI&*W- z+Ix!t*Pbdr(`H`ZVf`Sy@bUc7t|;Zn661eT7|URJ$jHR>dawwnoD9y64CvEQQCn0! zdwN>3Ng0@wNyE$tXbxPkXuor%D@!;+a!PM4$kh zQ;MXTx+Uu$@i0%?4@$*ujh=-Fngu0R=e9UE3=H{S#S_ zEq*<*V8W7!U!a>)$HV$}A#d*@L2_v)bh|$M20}11yX;!!27IRNJU6>w3@ekyVwQbY zjJgy~h94M>GZ>0++t=w-*=RNfdXW^4_@F%Uxkb@5Q0umqpv~PLF-!={h=&4^mAA3v zq#bTH4gta|ZWA6`+?UAi4UhLx+fm*y?D@-}40S>C2p}?PXtfS1RCz!8rhF^wcY1r( zJF}?=9eytq-7;o;e^n#{2iB6Yf=T4#_UH;&+isj8p?fkq%l@-Yxq=2=o#yqYGlzsq zjzhI5;s8q-d~Aq<(k&!iRS+!Z^m!`F6l2@(g+V@jh?VTIj}e*t;R{*De6Is(RvAri zo558MaK^gEa3bsVJ)rXr?<9RV0K$s)MM@-+E6afuu$X-k)~M`~5M~*=$FB>iboL;n z0Q2W|w#*>#@pVQ$YokWUM5zXf zXO@t5#KbK+O$|m;rmg5t)DCx^q(Hf>Pqs^o^AxU4E>TG=Kot~Zti|MdGrdNns)wiN z5>?6%PuW?IFWNQ>y>N*YmqwvXRotO4;rZ$g$4kjie&>)yoxk`*!K5_m98gBKAEmI; z1CEl=U4$S;zwJ^MTo)xSiB8f;B^JSWJ$pJ~MJHz`pQdRfCa(0H#34r zAsUEBjSnHB>qu?>d2zLG7sp}@VjVH^)xC;k6*d><_|O>t*EtBxP4RB-N!?L&^Y_cM zuhh`9x|ie~zeTarR=h=!YJSHS9Nc&hMn%03DE_egPYkAvuyOaxTWa!y?m3SSg_Yst z`tIyCJYaFyoT{IE1a%y>&3QV#aDBtOHbV`>k z*4b-5vzBU_Zq_Tu4v2m@y8Unu>Gulvlkea*&KyJ+YvYKljJSfu>XFjz;&ud`8BhcQ zfjMU>Ei81uvxQaN0|JvjE9WR{&z2V`2u;`gjp?I8V+7rUnzoJ;ie+@5dOcaJTsdFmrN%SAU zTwlwfT>#%>iZhQpfmI*@QnB!MB#{^a z0sSAKnPBXBe&>qzkjzL=u-t91DkWULXdENn&7xfquG6Lhfv0ll>LLjgIwM;d@nZno z42g8#f$#%LMJd_k~4AWSsJyDC`$`!AFLDtgB^Kvxg7C~`7RkA z`quS?o#2-;Fc=^BgwK5C!YUE;WSkdW?rcepV!bXu+5Ym>5M~+wo*|57^$a@wq_v7( zoiPn(SZ{6h0&)8#>;2GxiDg8AWNyCH${TGK(WB!?E`o{pEV4^sSozJ{C3xK3)Sv-V>B_n9XVA1x zXdy02YBJ)pT#nybljVqJit;jF9sXWz)iXLl^h))%p2du^=)~?>@zt#cc43 z5&fv9A~=YX6MQPsKf-QkUf|}Gq_WuNDg=Hbd*BY*_$##>0`81-;`rtG{ziK_P#0XS zy*AzCIu&{yZ}$16ml5v?y$9G1JZdH>S6j|kIC{WHDShD9;UL6PmE#u3q)Cvw)=0io z2a<0fsWXCojV-C9G4qY1Q4*#DbHMrxUQia+?tViYSO-+cZ0wMq^pT*9&LIh6=?=z>b$r>lHQ{CX)Itr&K4$77T2AwHK z2dx$LAv?;EL=Yautf;HT=3M0tBSBWoj zuUG1!2^tL4yT8+>flV7G{$s!SxUqAzK2)NM)retSiskZ!0H&h6kkFQXq=-G#Z?qT5 z9S4Gd!uBz77hG4W*%5lDY^i^^t9X5_E|1X1iF0M6DZUQG8 zAVrXf0%rVj$KFgPcW<$*>sRXKgCB0}v;t9~mhY3m{)vR8^aH`YWl2$%*ZOSH5m_&S zIQ6j~zR8xv@t^t$692uFO=n4(i2zZ;B|(^j!o7O8mp{q}i}2FHqKNz98YuP3-B5HR zm_k2-NQwm+oS0Bg1<)Wy6iP^TP;+u`KbhtPzcC!BAZ^nZZ?h}r`2H?S7t|vYic@RQ z(8|{b(cTvh!3gFKi-`u-|14UJ`;5qrKV37q5k`oKj;0{;#ta18K{I6J>_xLEkxolO zz-*Gqc7l+7rIs6r>{Hg4=BsdIxKzptPG>*k;c%FS;l@aa;FXn9_Z{J2m@(1P^us+VI2jPq-(ka-rl6+ zl%5U5#6bx_N-5%XPQS9~~fH%N-|is?h~q9#&VZ0s#yUkcxlMmV^=C$kmock5ut=? z10csZG_T-lLF-JG`0=B2xkV?FHt?sAzhyat)^;f)i`1=`>;~Azta$mn^%5n19YIU( z=%rlH7lEnqBp)1Ru#&H8LtlKoxCp!iB0s;ny1KRuEKdQ?M*x*C_S1=mO@PjV#qIe4_Yxa}NmgIX5;f{2G3bb?5n8^|XIoq$^e8x~}?EPM#?)po~qACYEMIrT{e=Mrm6WzK@9c zb5t*2)XkoZ=0==RGtc(Yuiq)i-w{}@F+Eb4imlrV^_iA zku_z-^0hoXY$&$CO4ZQM z{(pO)h&up~#7d{rWf8czL)?fHXV_%B8yGfA)^*Gvs(q#*{1W*3JFx@r9WsW-6l+qN=X5=^Mg>SV=>Mq2MG@X%?xIN#P z=p%vS$nByBk(mI8)r7Vl_gYGVmwrUbRjSD2a{&|C$0iDdE>00=LMKhM*1) zQW?r3h7=ox=eQPt+ezep5~{~~Kp%s^{7(UobU^AvxT*rm?u*t7dRYuj}Q;D3?5KUFKWZeAh zz+@nls+p3*!gb|xO%$yKG2sw{k|arrK$XmqI!GniD-P6|_J3ZGN7qv&yTvU&2C2r@ zSAz*yRfexb4oJi^eZdq#r`>_}ez*Xe1dam7HyPR$0yDRijyeS!v#ttr(T;`IW?fd| zb};-5Oi>&LtBZr7W`Ob1SG4JM65z`hsaI+w0g#J6Mup*10&6$);T8FB6r}^1pUgif z?tpEr1aWf=n`Nqe|DFovz;V*3NqLg77eUfI1QNpJ$}t7ld%?2{W6XMSr#T$c@hVpY zRDmin4>VQ-aVj2kJ-L!LfIq%YK;`k~2I$nuHYKq5n{tBo{YC!Z?IV9|UF=l8sY}#@ zCO#nE|5%1N-hiaE>!mcmIJ}%brY!#4U?@c%JyGNlRSvE`42He7LV|56O4hl0Uv}#( zA7~hRKuJmp;zi?bHC6--=3cw}pF}rYnohHKQ=nvSds^X+- z20w^?RLj7nn|_8fj#bRyX9YF69bc(OL@2X}-fV_ojGq_dDLwWGzm;GnX$6nzNXA=%hpPhD zTVu#Z&LRu@D* z#a{RGEC!X5P*m3Ou>GD^BGfc14e)4LkYmE1J0!fg?V}@ZC~vyMKZv9Dc1FR30O89>ntOQ*`$&UI+A_Yr+BfDgh3UTr7bR5RL9GgyRrZPyZcqQ_OKdL1KO(uw zW=keAC<^)p{>|On6oXVE7q%!+!Np?DO|d_z-z8hgt!adiuQ9?2&`xKGPCufyUG_Jh z&Bq@S6Su>W-O1MqVae5-vrNQ%75NT2_~ottNE!VqzRPUG0#G`)Va>Gded@_lkuGvx zJ7x8Ae+!~hCSA37HYE!`UEyOGHRDgi+FkC9&bA**wylfdM`6O3h7e6Y$Rb!eg-1oN zAry!&zX%~}ng{{_BCp+LFI~)8oe&YMZho}x;izP$b!}mu7kzYH=t22TRYYFag7&ax z7|*GhtIqlIs2(fAw5sqN{nrzN2m!?v)_JHm2k%?wcEm=QZY~r4oE7Pl4~^DNXb=Xp zhpShufJ{kSGW4k0E6ijREj(v~5W^x5HlT+BK*G()k&+?hl*I5_I2rAWFSWV(oSc!O zZkOan4F8n!7*zWdWawDwh+%ac>~5q@w2IOMgqxu25h(^P*bIe={aQH~d$nGKs1v3$ zd#_rWsB<3MQP1^AZU-p}NE=)f{JwqItb7*JAtxhMuz>FrUzj5VYSd~4+Sz)}u2t}N z`}FMrx>5d!c#P0W8}Ta5{`BRu&1b!5n=~ls4@ud}7ORjqN~ykg*2ipm^#I{x?fYMy z-GT5?sq67o<^aNpY%3F7KEeY4%B7T$I2)%VcgTp{(y2vZLx9yi3``iLVqIJs5>P== zD=k&oDoEY(M{#v7P|9l)h=YNzK*vsJq}qMtPY}gy76L^12|5 zO7j#Swe5Oq;xt_Ey9_K=k}w-H`UT{~jeUX~Nc$wR62w2JmfJTdxZk4osS@nmV2*x> zB`s^0ChS8j*Fg6H!r|*BgdRV}b5_~=+5-u%jXoXx``sUHryq4^bNs8gesCu{w$cwT zS$+Vf6#m>Mze_GS6{TiS`;Z*PxdbK4_2~at5%qHvS0}xM`d`2^?GM0s6g}Y>)`KL4 zjhBL3Aaw{FX5#-uo4XR&b96-IB=`rlz zTYosX9pJ1cr*BIMmh|)9KYOjB5O$IkU)d5FLas&4W~J7x+#_cj3y$pNK+%47m>pd2 zs*kUTd$R8+4=zO~AIz*H+&}ooMC(KVGGhTB8W}2KF#nu>@ij+eQh_w?AMJ5fb0NnM ze2}~qTVs{ayaSJS%ciJRGeM10eJBv^vUdf#S9T09iKW{(=6tRBj*Z^xIr&d(o!$$+8%3$*qBKxM)uDOG|6ts23yeGz&)6hhy}o`!pS zUy5m<2C?&m{u9##C2u`iG~li5Vhn?~#Fnw^Fb*7)In##Y7e!Y5XH!60{j|7FC+&=T zpE>J6lk5I1MO|>eHy_J8@{__pQuNarUWiweF-HY~$HW0rseG>Rix1XoZy z4gc*og*5TzDQv#=8fwo%E7i7Fz_J%v^`i-{WOqMClW%<2Q2F^edyGb=^k1rdGcc#94YlEcD;{jCT6i=l zZYZRR(qBX|yo3-7a9DLOAy)dcUy%#+7!}-MAGzNob@^RljU1JzjGGW>G$d(6%CeK2 z_#k_|u+nS;MzKd3kq%OUpcJG+!yb8-37R}SXhRlNk*ibW7YI4Z{IpMT{C8~aw$K*K zNyT&*%z?d<-<|}h@*`}mOHmH8d71Y9tzakp+ZYm5Sg83D^4NB@s9TvH3vrBKAO5Jt zJwAJ%Y8k=vPuO#=9!==tTmXx0V#nASYKfhpd=RrIOe5t~M?-dkCRI@SVEg!xfYl{9hRwL6D`JuoKE$iCRWEcr7(qAaz-g zM=sNi*M|>|PVYC5K(1aNW_x-)XkCOe+UhGJ;=>5s(#}BmumvD2S)R5wh%zreCMScG zboZIHQBqM-DiLwJugO8ZLonQ9HpTVNJu1h9f`!4KbuB(7W{hqTEkTQd5|P1Od2}_d zX!~0UsLvklh5T>_mCX)r1Hh!vzr?&(4=bb=6&4U;r3Mc4baY4(u38t+DF;mm{b>2% z>(h&KC2wOmCB#D>A2AewY9Iu(`PzN|9wSzLBq%k+P$b{w@{%>7 zifSzv^N-aaXu|F+LR~k$lPioc@*{w{T*~rcBdV2f>u@IN+~au&ka1N1Zq0XS5?UI`t|KY7&(RiRm9)B>WaEW z0c`;x(P)*3Qb~w_8&V;tFvKmPAy9u4Kipb~TiLyJMo6TL{;E@11tqCx2UglcHxa^% zNnAaF-i;`w>rR6$JD57k59?V9fXm}cnOtJgFi0GqPMwFx6Uk2gU+C~j7^M`S1nvr_ zPfa9=@4}-(rEJ=hGpK-#|Bw&TW|HVq9aNu3M%l$a;D{6nefc+i0rpkaDQ;!@qN3QB z**ecsX%q-U8TE<<-9LHTazYQVUu1PG{g~{2%`!n_5qd=4TQbRQ#|d3Ryfh9DT%avp z3ZWC3nrHp#TdneH(+_5;9wJun2@;VDaNv=%=1lAPTZ5QroB}0=djU((80DNuzRaS7 zB26F8@I&I!M(IDfaGmR6dYJC&Y1LNYXn$hwIAQN%&9>rZAK<15BL_f0c*|1Nl$%ugV1?C59#nk-@ zAoa4Slv^Z+1NUMIIY$n099`W-m%=>|OD#GEdJlI{gVc4ZX-+^sm5eYD?wrphts@s{ zVZbnw-QXi|ri%EnIJ6Qcz({mlAycU#OhK^uLyv$r-?QVYeMA6s0wbLWzyZ35_92Oz#Iw zFZV!GMP_Z74Q2*?(rnkCVM?*;hohx6hnrR_rBbbWPFzI8h8oDlI~d*OQ0)8hBUKXL z9Nuq4NeL9}ML%0gS%J3kXJF(Bo12zLm@P!+E3w!+ofW+tkB1%hC}l|rS?=R(?N>A> zYs3fY^^HP2SBM%PY_+-Oy7orIyGZcY5Ai^niS?<`eSHCW5BkF%(TG%hK~0TLbv&Ko zI)@;4xpWI`J;*}L7%gIS2Sir^_tm1vPW3^s9LMOspWFxvp%FKH|Mq~(%hnmlECtv zjOc^a?|hbNm;&D`VRhIQc&fB__<&W&g06<+$yk>yj&9+8HP{1634L|eR@zk)C4J*} z?cWjh`O6cuK`+=Y_#mz(HBd=tVJ;ja%e3O@(ydWP(0!b^s4xy$o&X%XXdGC}Nad8J z5H;fkG^4-Tv{6MiLR6dgI+s#sIwbqkA`yFWu2etPr7&`GIl64=r0)%trH8k(*lKH` zazz@DaGAtpL zDVx`m<;K(XWl-*1Lk`y2CP$c>h>Ec|KM%9H)R~XGi4Y-O%^J)o4YC*Rr`;8P|af_TH}JZRjx#M1j_Gu`KWPwa__+K*&3mJnaW6l6lbk#4l56@@ zYp1~f`Wv*iy5Cg3uM8}!N~!svtT;V=pxigf+W7wEZ3+iCxpGdbRq z_XImoji>|ARx1IRo9`}2=pl2O#3Ga7U@Ts>NOYLLNeU1wbxw95B~F73oRA>bCQxY% zL4ecrx|g~Jz(?(Ie}AB)87GvDu~1o&B~ul+zAC9Zv~Z`z!=vYqUp#%mpDp~)FDPRE zXbWfC=JUt+ONnTHM(Kb@FAf0d(%YlA;F(g37a$*!jITZ@!D!ZW8;k??(8lKGzyCX) z>>?DFkrbaPlC1~=45xhr9k{-QB7i|c|KybOp#lxWfKx;Wb}f2-r-gkHoqgMwWXxrm zr1F+hZIM{R&>%p`u%s*(BvkK&tF~h6I^^njZj(#hg2U$Hhnr6bD%+x@!qXQopHoMR zWJ}d1x*6Rlxt$jQE07~ZOdO0v)_bA0DRS)=#)X8)ABI9ID@y3;-dPv1*B|XqdkO%^Lo~b$- zXOzA|1wG1F2>Xg^JfshSLb*NFQ2h6^;v&L`@J zVyyjXG@#Fc8lK`wBsPBF#;1&?bN8#H$ER3pN|87IJfmNV-?Vjngj(Q|l`QaS`xNhQ z`HOTc_bholI=RvLXZ8=j&So7qFG(KvxVS}JY)OF75~&2*C{QKooU z{*G^(R>)L#nSSnci$TWBNhiAOUj3xQ9zZ4cg~wm5=J4Y!#67&6!jIPYrR4qc9xJK) zl>*9IOgYOmkc!7VvT)Xqw844*iZ-jQpNDxmi$&FP>O37-nY7B|O@%zT zvcOZVaC>%Ta%C>x;VF#Ae{Cw?ZJ(dyQFzp@%b=OmFaN!jjcH&=)mh-{T_z#D$m$&M zW-NyqS9(*KVnjNo*KfbC%TcU_f z`08@y#88;_P`?#iQ0!Dcq zM4eJ1(ifMQL|WzQ?51F3Cb;s>8un{%wqn3R?V;xap>0zJNu7C=>|(JSrN1VncUJRQ zq`{CL3nm*^w90{`(_^ra6_ZYK3l_cJ=QN{KEXYsne(clKGpep|9wD_YM+2ZKPSyFx z(>B?g&GkV}xW**Xvhn;35K5`zVJN5+LLeAh*-%#qw9{+*ENA+f9RII|wxIew= z(}^cP1BB5XQBw7e8ATNAaBB3%F>!kC;b?a;)q=!NGX{P(?SJ&j<1nX6>5QSdnk%nU zG-Av{l48ju>Q3rrx;L2pgtpZn00O65xN=*^#KjCgbw7K2@#5uM2d9cNd*ev`-zPE> zvb|ai)xftP&)Qptr|)F{UB?9;iFX>zKR{y@qD4)_Jq3{t7j(N>u#oazuOF=v!-5fbsZBWVWQRAZuGVpL|$-q^7iuBl9=gX{TW?-%yV^r``OXE0^~EtM+R>COgLA_>Q*Qa&~* zrRVL1XJtGO6O53T*EO`aW9625ech5$TRevD9 zeA|7%X@|WBR|>HpqCmgMdl5g9j4%nB{og*}|2`xenQ;+1M@GA^cfP`;dxbGzw})?c zUndm5FWur=j{Ap~cwA=pmDSGt5VN*T8L9DNibf*Z7rX2=7ClNgLIs>u5ISf3y;1(J zPh>tZn-H3sQ!??W6U>!o$LeQeOifRfAQp$3#JY<}qqe{IN(7#1ciPODH598(?48%z zWVWLKlo>^5Rc~sUvqF2&oI;@5?5d$ z%DC8HN>w_eeJ<~FAmVJ_PJ$Dem^`3!4{o1g_5(uy#$xjfj?HfR%HK`wK0>yoYS&U1 z{$#%~X=5ZbCfheRp4Qljt!<(pVk-tg&f?V%Q_;-iJ(`>kZa$cH<6UE~jbePF;TanR zWvTx$l1cO)9Pk9@HJk9_T09YdZya2K!A$!%Vi&FaL{nTN@d;{Fs19s{5CC8W^@$P} zZtz~X!J`WY&V|(}D|m>hg?;b6s3GZqXWiE2Cy$Wf1e;g%WXWzh(@S4$tb^{Ao~{@1 zX!G0jN3+GWA5$f6`7k8 zQZkEL3>W7F4hMZ`#XS|*VpEWx`A+4g@o{^Hgf6jNJ+;EgOnfFve%ud5!3;0xKq4w8 zSkw{wpx6KaKt<7P6Q$1#))Y@w&sQyh^I}Zw)h&N&p3}G-h!?Dvo#N9>K<)&RuBg1- z_JRDi^%;Zve~QVOF-xc&KoZIUS7C=p@MOo}0c@GkrMH+-Vm!4AWhhB0Z|P2E51Qgj zg6|shF$Mij#8#MVi~LluPHLT1bU3&w=fOR=5tzPpIGz_nI$=f|!8wb;?Oae{F)1qL z!$Zxx?ECt3ue}}b@JeJ*ag*W=p^x)JsO9x6_E_8^Ve5s{LB3DY|p7XT*m~S9Vfy)AWmPES;Z|vvJ;-Uq%~|+-Gu}AD+6@1nxa|qE@sOx8f-G z#(S8~B833wIH3xZekGBIv7d7nqWL*D$`L$%i0|zMeQcihe@~YNW?A*3=@hdk;FsL6 z79p1h_zbJ%k|`lPyY{hr_h1L^KB7#Z4ly9i4ZgfRmtL31aI!|{;tWUWJ^+paScX!J zn;nu{`J#|Gf@%oWrH8{tk63GT*9Sn>{DD{bFPti>IwLr#13W{M84E6@)fQ(Ff%c%8 zFH~l!({>bQ#0P;qMUVEy^-kJr6fhbFV= z+qAkrq}A8~k@K`u!=3AZ4mnodJ1_~gf>3}q2z@O6_PaODjpc*I(*Lc=PZF0cN*TQF zz%I6(zYelbkR&7HXGct7bfmAiEMA?k9^^x$pZSgS+I*V2ZQM6zblXL@50#GzO$`p2 zzx0VsLR;4-1ZsGX=+DNZhtFR;ef;vp=Cj9-U(&@-Q9m^B!@Ka}$kI_GM5Pq#kJm6A^1q-kRO5=Vm!qADXkA@c(Eag3SmF;@13{fvCDpLnWVYYl+9MA z!{_GXr_Z(?KWB&(SbXu~(dM%kFX(`@#gJdVpw$W87WV$+sAR^5pZie*-x{IujUFX$ z!%?+GnwDk`_5R%nNV7I05g=|($Xn#4d_~TzS8<0BBLZGJKOD#8+k5RuF#OkEj@PuJ z@Z!lsL%`ZQZ`HL68NaDK1i|Okbr!v>zYkI7%swL|hI{fs8k_W`w8qSO=X~=iG~>S% z7_c_hIoNG)Twl#64+yN7LDQYyuygBLBKXB+P)!NdLe@g_?X)3 z1OqE7NRTQ^S1eF8U4M98VdJd$Rw~%4ux8CxolhTnT-l;IKqdnAh?+RfpZ|Y*n5HH9vYzwA}L-o0~75J$>^0=@yMC zA>}8JpKZZuUp(Qd>Z}?Zk>KfFNFejWWAZ#i!S5h&b{NqcTNhfV$_CUz@ilh3wz2T_ zH##*I>cTPX&InRF7b(7-Nmp9RZ3pCJ+SogZCI>`Nt9Qc-h*bYoNDukILuxFA@an_e zVC-;3rq(>3k6HetBwev>$^`w7@a_NaeuMh5Cz6obKK#Y-!*Qc*6N(uIZ&}{7PgxF% zpl&^T{_+W{{%rH**5l2`BoI@|7k2ZMUiXTUGH(fRRJlgynYm~SGdB)K=eRS=i@9Yh zSg}AEk!$#uIWPe&NisZSbwPW@hATy+RT@n}y=oPU5O^!T=novRz!6I~PeUTdGHdgT z<00jW13QY`Y^CL9RX_K-pS3?vcV9lu$K7d}MAU!&2xALWuaiH#<$StM=jU zn>>Uh(_pMnZKLI(Gr6`*Qi)kq8|^Lry)#3V&O|P>{)y309$yoK)m=!0ykGAs56;x= zB(;N2`N@h&4FpT?=vUj0V*bc?=7K6#=Wou4RW3e?7qj19?K~n#zOIFlR-+QomRFJh zSrFWHd~5)l^d-`StweM0$xH9h7#bdyYJbP z{@YN#%-IeR2Ne5w?>?f@L9}s98BX4jqYg$rf9C==D13ptuzc@nQpz-hNoK^F#>dVo4&3` z%pi*KR>OV7h=$#6BZB<}*MK*|=A-?}PI&Z?28dfPQC~J;@LNx51oZsbQ+n;t?VbOj z&8Q=qjV>CpWf=jF!`^+tS3I%Ti`lxg7 zC~BG1hf|{ADJoA}q5ZQC@5%%vJwnwy;-^@sLf=E)z=#sxv0f2J5^Jg)fhJ3xk!#-4 zD>I&Z0po7ln4pvFYa+kI)e)R>8oD+qEAnsV`nBe|RDOWhmLEZll(&)gd&%MMy4y<$K_+2H z2<#qj*_W|%UvhKl3tLc4%|g7BTKTEp5sVMXh@&8h&~RyIU^5OGqRK(vJ++)dE~Wtx zCXZZ#(e^uiqLEaMk6u{;WXq9JB3-!sXB$y;OgYOnRR3fDr`P+Hg{(bc2O|Po8hS zP%HYEPo84M(500G3$$RFS}?3PL*QjeAfP;|;5Efy&8j2ZZ= znoJb`%Zajaa(VH|nIc*8uPqvPwjQKQd3XM=p)P2m&>`>Mhz4n_Z)c`N3Gy5j->iC0 zor5KD`C&mjcBTOJ8y*hu5Ml%aNabikg|Qe(lppd<;7-w1hLIJYvt8E4&V)I&+6U*S z$JW{CK7wA0wf{e&*ZvDqVSk^Va^#f2-^-Vvl1^H}5Qfqg-PF)*%MOH5_?9YjBvl1U z%qm4OM?TIRq5g-5Kjf_L{30n$SvQo8^W|mB?z#4OZ56jz&Qu9 z}PRK!J!uJc5XcZMI-~20zUTuEY<3FL@Rfwdb?yV|-nt3HTN}1aq^-#yD3q{ix z1rDQ*3!p-Qp$e$Ci;xp<7jy8JJxA#0_9>wJQz1-OnZX$#v;Bt5;Rm+6mVjGC36~ns~ z*c0iUCZ#GUV2Td}2yCpSE|OSI+2F(nOV!F#68eH?q8WPHY>}(=6ghp0r^VA%=*h=3 zOT9yK{^$=dS>#TM8GH8+g5UL9N~Eb{@ce*sHqpMoawT~u{aty~2?g(+3sl>6Yx9CA zG5Zo_1^)?v8n`PtKVLF;#N1Z5#ojVR>H|8+427wZVeQhAsZKf&FP@XV6H^RXK!Lox ztRpYzAZNy>13-d+2D88Pr{l0_kk3oDOq3H)??%Gs2!+D&=Tobt_%ViX#UjQCzmCv2 zOY_uDC(AydqwK~;NwUMWJ*`%O(Iao7)cQ>tf*krOrS$NX0^?zD?iaRw zzNdbZ}Uk|-{uqQW{?(jMtlwN7W#~8 zxiSCv08a~QDWCAYl$`=Nn!i%FDgOvvyD>oi72xEm`91sS(Ie#^BxBZ7g#(R3T(RxM z_v@B<$-oob8VAf`SIKb62ww-N;EZ3|#}_jeq+(QSj|CaZF8ZQjecaivz}j06F&nmC z=>MNQeMyeq7Okb9NeRK8c#KN&Z0pHO_F|#Df>@d&P5;84Dbf;rU?(A2JMSBlS^IL> z9{&WoUKyYU7oBrE?N``!vh-_jfQvxgY9MMiYO@YhwYo<}@f9m`I_&AR36-ekD-+YE zZxO+yiX&BKEoFe=B<=GbH&iQ)JUduzgbFEpj{;+VjkX$Lka8Arjelrjk9AT> zGTE#-!JDfqxB5f#6HP7pQqJQ#?dI<`k5qyJ<7YJ1_k9-q+_q!B_uqNb0BMhv%SNRI z%_}H!O!eEOAw)s5gfM7t-^E*X#Kz1n4A}=2i1SWP3@`*&x$}GroJUkt;rU>V8I(2_ zBguq|TZGK{k=mqJ#QfCCCo9vP>!<`fydRpQzxWFgd-NOkTyvjKCZKh zZ4b-01{d5vKc|46Sa<#+4tWHiFBTc*$QB#U_1fPnluJ=+r9uCqP#Riq-Uc)d0$iU+ z(KK6fmxc-%D)J3f6EwC^1q~?SXWmb)3%T#^1U@Hk;kMs~{D0UyDWE5>j`rn5w(F1v zifY;@*@RAP3%W#l?rJ~lIpA*P%;hfukQwEE9JX@sV}#bS!-oP63jUz)?&tP`m~;zI z#rn|bclSpR5Vwv!I9vM`lq>BrS0l8J%4J~z3L8o^DI{r`PIc^?WSZuvG=J|pO9{=4 zQU<~$vFvs?99)rYGatejQ}Y(Q=C)T-U;$OW9oU3}3oEct%smYI!tSb?Yq65;T$<6) z0!q|T;a$m}i6c8!xi(7TON6zWOW#wR*^XR9>`E&Ro159DlGU;V$pB_QmN)-7_%)c= zi_OPRsPIQqo~MtVJ|@QE(Nl#I;lO2-5mL33@`q<8 zY~cX>hpHNKcWB{h9OH?s_`8HLN#iO&gVG#Y*Iszl6f?l|<;bm#jiT9Gse$4mEAeyf z`8Ck64x?pCo)8b`+OCz)-avUH#{PMcq6Z0V2Y_m+eF*a+TB?V_+{NEO9}7z_fknSb zT(Ggrfcl9J){3uiEZ%~}Bu%UgtixLZL~J}n$qTA)#adHc6%Gqt?yo4_S+>0SnB)rH zwXT@6&LdrL&h4X}=97zTXXhXsD@3isP>foKUXuer9WN#I79(aVf-+pe zARWmiTpObdn#~NIQ~jE26$evuK@@AmlmyL}FLE~@+x>c20YNM|vY;f_81*Lg`y7tZ zIKODAll{><6uSGZ5;bAS`=M*N=*a(}O41u?MLRR`q8O&X5>8iSjFGpiU?u*c6-W88WL-tU zD&k5Vairbxrb)A=gl%P*OORI;=PH3MVHO$LLKha!m3}m?Rr%Gp*S{7xR{)_#`&Q^D zvB0Cw6&FouL#g-&BCQlQQ^y+a7B~YHW4q)?SXm!mmV{xEysIE@j>V`NJf;1Ud>C721EVs?3&M2hO9T+2vyg48iFd50F_LxBo|3hJ8Wbu;9X8O$XSt-##bb&GHY&nQdI4vI z+Sx2cy6k@i*i|9YGH$H2_enxhASQ||@XBF=;A6 zRQ~DS;Xy(ubPAn?74g&AzG$Bw3;BYm;rA6C>5P)VxZD&sByn3rZW%y931K#VMd()L z>TkzxSxn`KU1RC^!wl_tEd8e&mT{4)8`H&Txt-4+Vwsr?#Df!0tlF_nvn2j^?n?OmJ z!-zk4)JQmgWJ$M8J^OSH5l`T+;QXHo$jj@H4WCWX7O}RJ42b)Q`X1F#fm&2_5iw>o zNPafdfHsL@4#7KaZ*BbYfU*(t%czLC>KDg$(3V+*2kep|Ef9X zL;tD=b2m3?FszzC$w~kF<|coLnp+N&R-B1qy>r$=0D$)2RT4849wi4hjhCe3=q@zc zJUP7pm8yL;4`Wwq-lV--yeL^BfB)&D5`!F)Tg?T1);Nb|;JLZU6z5m7IrVu#G0pi* zX)9^vOh_eEqja@3P>l|=Bq^G`dWv%ggycAuy+wand}r{kW9H<%`MZDqU8#Q8Mep6z z@2e*=^RdZc@slxAW4_04yQZcmNp6E(mX=#3! zTF70MZ=N0ya{j=M%K9By6jab9`z7iUv9r>yj07Rfx|ALy6+?89<9v(o>G8yVE=t-c zemd1?O0m<#y5B*+LP(+%DCmpsS?7^^<2h0fCyXjFSA2wN19|ca$&?m_}<2;;|`%C@F}*}G8qQKd}AiLMmo^fj${DG+K!Zw`1w zZ>Q~fXVa{RpD7F%W|r74O3;iK%H7YeSc{>%+uMq%7fxGDA?Hgl!s1wR zzj2Qd;YMG5$l_b?q8X(C%NeBuTQ#%ME{Q4%OyI=imjF^4>}V@ zRF0-7kLS4C(0bC`1tx7zH&do>$t)5Ry9-ZDWtWZT?w?a^fu6>;0;~34;q-V#4_n$0 zm6_=vnSWyHR9E?}=Wne{fI60sSD}syNarZF@||NYX!V35V1yLw9b>voOG;*Xs-V0L z*Qrlto;2%@MVv=9x;duPmFO@sr3RDaim(w()~LBfB6HQASKx#ZAO>b7~AZMr1SSBCh40#VJIuUri$ItN%%e z05{d2I86b0X~TXUO{=lJ6|LX^ZK^GMpESN_jao8uffa13x^l8GQ%(-UNTC~di(0JGjmI~lq52<@Hpzuf5eho&z^bfrJE5BRoD1B1*#l(JQ)7u=&06_# z+A@S#4gQY=fhucV5^_~(6hA5ayH>8{%VDW`jH%d8vh!Eev80R{?WE$319^-M@8BC& zs>RNkrkssgMVjaGO)5r^ntT;UsO%*wK&rT-d2>pVEGl9teJK*(Q?yT`I}q}5(G(mbl+W$Ygf~4bT9-;N;eUcb(QaqJ~=eb zpVG|^fIDe=c>)8bvcaB;D=3r*H{Ig~J)E)V5BCTw1lIA?$a$qNvPSpn#DqsG`c0w8 z+SJRC?)KjHS^HO}ycXAf8#PsXA0(iW@CvS8+R}Q}oWKq{{4&WTKW2?aL)ycWxk&=RN5bGnhI=d>?PIWLGyFU!0;tV0;gnv{Blp;Hk?Kp zAj~q?2}>F$MSdMOtJPFZ-Kg69v7^8Oz$L(XHG~qj6dw~^?CrO=Wg?h5B5(rd#yS2G zvI)J(D=uE`Z+aptMkx`KQkp?s6byftNR%Tfp`*}3)$$LG@Yn01qf!xNrbhQsEVKT4 zH%(O9tHD4{|KCD%+nt2^v*mwBFoG^$+UZ+zJ^%OROlBqunSW zFq^O>EiIJe+0ev}mL(6Y+Ax3^LRGA3?JIU)vG&dj!6AS)b9jA1k=Zr8sE9R76~!3$ zY(irRhZriU;9#3pPCqukds+Aw9BklPtMe{ESOncrLjW7yL9sNNMZust4k)uotN7MX z{1}|aN%TZGgtuXZpi&*3c-u-^)3tQ0 zZ&Wk+DhHI!*i!&gdz=Hp#i=aFw%)vm04h7AbMU#h!xNQkQ*@#KhoPgM!B^l1@$}Sg#zL6t|X#y7YUO!Cyp^ zLtkaaG$G}(RR}pDT*FzVGUW0hLrWO88f{Kzsv5U!FX6k82+xfbCvgBh5{pm#vef_Y;&N#{b~$a82| z4|IiPE1gGVwsTwEkKeeK+5=Q|Q^ct+bQwE8(*vD|OT`a^na8ZnM+aDV4UzvEVY*fP zcqw?Lcey>EPyKQf6c^SvYV5~+#k^2Sg%BlfQ9C%8CAi&P>u@uRd`TIs_m{gK42OGp zDblO&lJ3_l2VHc8%Z>URp9zn+VJv^?H*V!E`spJHLYSIy{fFgiq)5+DkhPz#j-R?tfmY7vYh?7OY-k_ zuRc&aclvqzMrHP=lnh2{xb>)}1sF%QZGvF(n$3R0aBk5DC4lE+2#}y|9)TkgqDu=c zMy4s82wY;SSnfri1&5Z}5Lx#|Fhmr}VY<9Aq>Ok{*+`w9f?+*_+)>2Q8_)fhOX(pn z9#NrrE+dI{A>)z3lrAmHuIP6l)f7kJ?JyQ3EzuIKMEgbAI{jXdy4UT^N1}UWOYLa! z@^kX|{g|27o&C@rj6Ppjn#aq;HV~1U!u|HetfW2d4Kh>vg5l?Kt>3A0hfpOwSUYXZ zhT~F?f!Al~5~9p+0?{e1Pc}Li(DPc28>?HO+R$(|VoPt$)Sm(prkrUaZ6OS-6R*{v zw@r7_Z=qSOyShi=V>u#n#9tIpLpoC-N+X8ncR)$H<0tbZ@CLX*dD`nfHDdy zIPP~<;QzMI$V=C%;w?McWFG+gMH`822$DYDCQe5drqml1UP~pg4aELfLxT~7bX4F|NJN38V!{B z&+iv9(9f8r6}fd%52OUYgN_TwzKCYtxa?oUq{aHyQcHXLl>^{-1#e!7u^Z2?R|jrH z6yjcL@B|~N5P;`Gp80y-njDq^V-fD1QrLM zYh1(Vf-$e`-sm>Ugrv8XD4O;uGRK*j+xkUd4-8&>&Lc_U(nfM^?_dM~u5(>ox) z&YYcjvbeouqw|wEu@)r9liUuuGb}E%?l&LLx|Dd+sRYMpTKqnl=ISTvnn}U(&zcGG6FEXP!V(k3(Ywy0gr=#gK9f|Q}i6Vbrlk3e4v7U5I}End;3|{+(Hl^ z!ypM0Eu1wUyIf8tRcLV*&SYWre+h z0Kr=i4qs8RVlU_@-c!_MRV0h|&?{u;727Vf!P}wLIyG0&MkxA0Xi#GCN2se5b8qGnwD2Uhg0d&z9u3d)^WvxF zC;EXnUH{Qx#ochi;=?A!!h$P535@o)dJMPnGh%p$vvUTX9LAsxQo7ye)Oz((U~c$7)8jtJ0hog{tf@ z<9jB~d)1-Z%!nC3A(@!s0a0tjxn#w9#`+vdBBuFuRj!zG;&Ecm*=X_RYl#g2w>a&N zTP^M;ur@uRJzWrL>6IpdI&K#yrK67>?Y!s*I+7->ATEsf83k3YKKu}{8gxTS#xofPzl$GuK!tDGm@(kn1r%j$m3 z><@g*+cpl!uQt|LH%PqMQ58|4c{J z@KB3@2U0)$p_%TI&nyr8NB-%%KMK;gFUz6iah(s%v1^QR(<7-QnMgkC_@-fdlMn@aEt^#WRsM|M(L4R$7A! zD=Bm|?{%5|At{qh92LLH;W9vG;VM3fL&x-+A0?)=&YOt#?~ zr44oevbt>8xE!L|)mUBlZ1d`S2H84zFx0(GWf65PP#nuZ*H~$w6y)%|>o<*zRGVMr z&%AqnZ<*D8M33U-hTqE55@>^q_?UbUqWyP7?0)gHE(l}1OIuh^byQF+KciUcvK{K{ zOZ#nTQgs+xtr+IHfYr)-D(_Hh0l~OUrDrilT3&Q9>7fsYN`IWR*^ZkiDJ7A#)iv}RQ2}b>D&;W1wkWtqt@SI+O&Aq9 z2zIlRF?Ax z7x3`SgkP(TgKBx$KrX=Z@K?$VzIVW!V&#KGqYVx5-c@!QL4NYcvPx- zn9pN7#R>_+FmL#6s=owlK>3;IP10O>dUjn)Z#W*~f3p3zpeJ?vQZ!o`X*vCgFNjUR zIAV}+%G6NvZ2QNf(`_ttifq^cf~!i4miM_Ise9MBiELuSRFx;%%_4To^-ObRmri9! zR1Oeh$5KGlUL`-l&qTkk4CZ_rc%!x#U=4Xclt1vmAhYO>>fKUO7R)TsRP9c&W*ydA z*i$?_^^xb9B7iy%@@&pP<#8c0^zLn%R1KqjJB^lq)prJtNW_miXgV`efwb;-Z-t#^ z;))~47&i3JZto5J@H5H~5J-74H)+viUES4upMwcV`~dyY4L5J6z-_aihu$u77mZR2 z>2!0cq=)ck{jhsUxzfdDqk~Ph`-3Yc@N2{>Np}!3B7mx;?p@KuHWyFSZQj6AYAgPaNU#Esx7@2HG|I)SYyw%k>-Wg)y95eTWZs(-ci!W0%Y?X^P#L!9Q6Tsd*Y8 z3y%Ie&ac6&Fqe!EAIymuDW?>(=!vQT_$olBl&QQndL>$2oBPD8>k2Rtf!mL# zSaukTxVK*3UBUA}yojFCtDkkbX0YEo8P5TI@{D@!wCxDld0y-tt!kn4-jBI-S= z2OGDu8|!tvxu{2CGzDGbJHp#(y{fj-<;a#NMZ|(@3y}}=yPfW;e#_(s@I%;9%YWqf znZ~e>F1E>++utSfsd?|8?y;*6RHv3XLV==b_Iv5x2g#dfEg4$_upg8SbgIgZq6rC9a+c*cc^C^7SP8z`YRbNpBXruu;PWwME z2GjobaA+KHrrRBMUg3qhAjnUFh(b&y%RFXGKELW@0a)CfZtOfj3-Xa}uU8yN*C287 zX!q1U7`nV3+^nqM+wJp1;l#vCAJMy!$^a4D-TCD~N4eEH8b>xdDu2AeQO_+|N<|_qmFMo#b(7p_&r&8WVn9)#TEGWv)Q^MtXChPBv+zm1J=_QI zZ;ShF%rqmjz{P1z#2RX{(^?%Iw^>ucO`V+)zAD#Lv z>uruu*lx6_N1gLN&(Tuj@V@d3vj8mmbu79M%XY)tu5G+=&Ff<7-ws9!k2vd34-i9P z&$M_sMN?=6BrXm|ugF!NTz>X6i7Pygv!#C?>z^l-vKv?;@#UG0 zJl8)j^v}x}_joeb;2w+~sJyubKA6!_tUsQP2I4%Lc|k+``fttabf9E2vAUu!OCNZa z7Nb4ZvLHS*a@Ko!Hyod!@0W|CieQ(YO{Bb~x~7b$jmg^^y{vCL>|f7c_lZH67Z<(z z0L1M}L@SVNu`h$g-Yd=&C)9};=pcQa%BGa&ama3gmV)Pbs)|kc!x;r=ZN)DxcZXfn z^5BW!8|wV0fG@4D6(Vk7s`6pNcqv7;^soScy>etwoE*Z8wdI-dftqk#F0PxYyA~!T zVIVLjbnfu*nB2}4(ZJ4!K89LAIZ^fQl5&|R&E+ivOTNB=3rRROCc!+8*%YlX?yUd0 z9lBu&0S|?sAZDA!#^*m;qG*5$%ezk==oQUWG9y9z82%(v9WOtTS0D1ycrdYRDN8!g z1eqQwpuuoy+@gO?oP--t8ak#>2cP;U6X>QXbkiid`BIwx>2+&*WeI}}Ig4`U?F5@J z9onVucvwPNQpDJbg*F&RCoIZOjTOP~SOR=#% z^wohX<4>%}n|~50)9pQKnEfC2;1c3H5c5afg0?no`P)V6s4i#cvD8ozh6(~&VTT*Q zt|`iuk`0m0D$7YXQmIq6u)?-o zc>lgRmVW}JkZYV@&1}_{W_n}av*`|lMG6+XI#x|WmvW{QTRTU}h9Lf@^^zEfBP8)3 zvm`z^B+J*KLj_W*mp^o;3=9EDA7+wL*l>aFbkLQVthFD@SD4uTFv@i9eC9>9wR8MY z%!%fb*~t6iYMhEZ+-pQ$XT(A4ES`68etfil(!4h`BYm3R6}3nqQh7pc&IYBK@ASrK z-)6|cJfuEkT>#A$6$pmTHn5f(*CiGN=Vsnc#I@wx$!n@HC@>b{`K5TOc6-U@4qu(n zT$768_x=xwJV%S}J@#h*DzVufG%8gkk2pNjp;dX2(?AD`XRxG8{N9{iRH5&3v1Bq3 zVxviF!>@usU+ubZ+74bgSn53HQJcwwoczVx4eNE*Pa<_EbE1V3o5O6&3WN{pnP!F*paR zH9mCHaw!M8H#Zl(>tdQv4q{@6=+|iWK2ytmbRFZ?exEa47`w*(c!yM7NYBIGxuK1q zLdDn~BiVkFR@jOx49kISQ*r^lk@yo7n}|5+F1@i$7pZlQIk1iF9fu6ngkkv}nTgON zizo+gmSY-Tp=#pSr=4VDQYid}4hoVvzBp=wMuxBnpf}b`J1dOv^zt7^ygR~LyvmR1 zoU|OlXjcZYF*p5R^dKT2JpX7XvJ*l;OY`B)@Oc8BF%^l+h@LoHGg@jgCUYAR*{faf z<1j3qnYe=0ASu#_GewzG9+I#}tc_>Gp8E0`^-0?wp%<#e`?xZ=eL|Eq8?C|~VV>9bkaxA}7M*!9mpt9FD0O{As zu65*R^C@xkf`h$?n!>?MiiQMmIkNTpRPW`qKi`yXwM&j341+dnrAB`=xE-YZs*PHj zVGyQRd@*-0AE7UPtIV_r2s%94QzLfws6|jI{CY4-JZP>>V3T}$Flr31%zfkv4B9h$ z2=d*2k7d`g4S8j%uh5goVXstcdJ@~%S{DeD$9x=1=69Vtz3 zOG@L#Xcql1ior`su&l5EfF*<`kj;I!2&)ue#8E;uvIouIb$*90gcd@qr3p)#1f-Ej zDcDRHboA4;tY`RazTN}Yg+mYU&kJy;DRFv_4NA6-u<8PYI_hu|E+rxatO5EWfhomx zN?@GNykAP3;)mAm`Qe%2%&c^%A_}wV6*NsG=8X#_{AxlFB{a2<5GoRqdgw?NvK5eJ z%UL!uL(%z=M1hGVJvD^|`gwoG)QgD~Q?LPKQNkq~Cr1!{h!;b(pN?Gz4Gp<1f zz>TBt#D0BC?d=YwYN%T2k~4hdZ=pLB3wsD)#@(5P(`mBOVo zWiP;T5l&dq6XYh5o^aCtgcayMxvFFpH1^zRzV4~K%aCur8RwLR*!`g3U<5*ME0 zY4?*K!8xQY?2n`b^!&<{u!fmZNEH06 zSUzWU7FjD59SFn1B|00Ek+eH@K>yPeIw~er$(mQdY)ZjOoQC8k{C(ivuL2GUF`5i9 z3>h(Npi!G)JA~Uzn!i{43LC88XTk0Tds0yqO`-dl#G^O;{^XJO4eH1igbRQMct!;- zzR$veN)Bnzj z>%7&e|JSCkKWiOQ1d#WUT!947FHR6D!BGpy!#~P%(bQR?;miQu`xPB$Acltn#88bH zNL_S@$XE;Qh~SL~uI-x}-&$~ltcT5*KqDuI?1-|j>c%H6)hDQUM)a5LMHZM6TCBW+ z8~jVZ{>$NsB#8nq4M4G1Jo}o311FVB25pt#>i=silIobzwN;= z2NsL+%Xq3Ov$1_n#&Z+P9DY3sCJjo)76RDz`e)Taw$5e4K{?!U$#_3G4gDAW!b~cb zhKYmq;*Mh1v31U=+j)Ymf2PKt*dP-iiU3 zXiw#l91VU7H83B5H%cOlk4f7@z~juc;n4G_O+B&A?sbmBX-I-ZY51zsB~6 zjZ^L$N*8E9#jeSR4^L_ZQ01c-1?H$BjEQ62@Mw-y!^;5U24G2IZX{CL7Ew^aJ~5$E z3}h?ljRu|WWRNvR3NbP$_c|r;^Y2jAzVybcgpY?H^F(*(M%fbrY^*0?9)Xf0T)@hZ z|H>&-;44&GO#S|(0eldek|&gXH?%2*f#p{zOe@%XG->|JfF!jfoPz$f zD%6&O&tPCd^s#~`$fE-PNcmgrT22YWucV7azotmik`6VTJqHUDaRo67Dx(tVmJAzv(Q2l*RFdn zsC?Fj$7rI(uqtw_P(zrS`ZaIegA)e>7&O?0?+b5nf>XJPG9XD&S}>L$OAyFREWDqc zt4DTq57ZJc5be*(G)c-qq9L^0>{}^m2OCI+C`3w`NHZ9hi*KE&Z3_2l>R;+o)IKs3#B+H@P@t%9FdGUH&^t*S zeM{9ri+!Tr5Xdig9x;og*F#xJrdyJ_#|NtELneQi%4S#$^HFeHvL}yuOZNc zSU$92^3urQG9=M4ApVV=g38Uo0f(BtN7Z+O<)-uQOR&dl$E$(_Nh%@GO&VZv`=kc0 z!J(;mhs*01;1Yp1NSqtg9`0eC?&8dO46Wv~5Mjwx+u8+4xcAS)>wAh&8U9319vB2J zz1WSV`*IQ)bw5yMt}{YU`-#((@qLQ8V*O437Td)PI_JrDk>+Ce!(#N4)$pl#MsjKK zQ^M9lPDqaGkqcjJ!Ww78dEwgbbCf>a@Ta~$bfzRT%iK=4#FyYut#8tt|kojb=pZA9n zLKt>RU-cer2MMChDM~2$QV;M<+NRV@!8G|FyA+b=T?@_5Y%)|^hiULL+J!<|fUNx)+~v!@?QZLMHXtcp3N!9g++>x#xoLi&rbQJ`&xlEO(*kEd)#c_L`7TDs$F7ddd6Yt zX&XS8$p7Hp&LhEsmz;6vP()w_aQ~n1IPI;oF_0cEUK^+(!Qu0in)jZ3K+eSMYS+^f z3wH@cDRdM&%&w8%7{x6tiEOVy?%O#k+Y4MrSB=N|abJwBN&3Sz$O5_yI1LMQ8==CY zgcH`D$$Q=X2uf=b1X|mCVx_`*fM&)149OOJFwN)6?#Cy{0t7#{@_syKtHESGCPzXJ zJ#lnH%MoNM*N}M65qjR7#p0RbZaHGZhlj=S@K9h17j6nEC9+6DF)1VEm{=h1(HyoU zmB$0;J+>l>#1SN0cFiLUeqJ!isJW`CR48-t{)wMqn(h!2tNA{(^RC&U)H$QQB#f`q z0d}M!$mL*2AkfCW4})H>Ke`8~*aTsed(C?|riL**roCO^B|f15v5L(7pu7U>oyd(F zMAMbxq@~DK?H{I15lUg33;%9ibw}tB(X}&lBApPu!0u6gCz9NT?%3U+r(c$)Wun1n+N>O4Y+?l(T6axi!ST6yFu zf?^V{HFm^FrS7iYdUB?koC}9QBbWomFOiA-d#FaX)aX9Pyjb^>*yn>U{(>PQmqHj4 z;#;8zp(*_&@FD*Gr&y!nu%sh3wf}04MujgG=yJJN?kz^Tyx(hbVI@CFgZhFOs>ab~ zfr#OV?~bCR36w4OHtZp&mgP20P0&6CM0IE*{!upC-X+-P_28G7!ujCpCj!k{lxc(2 z2kR`2>#Q_*%|A_vX~yZMsydl|<0i$GWmqB#j`yC>&r#UW0{TrFf-iK7q)D-lQxK6h zLTDbhlu0Hpe!muM#EGCOx7zp$tl?FQ0DzT6INhTgXVxE+Q?K<}IUFppWY9i#gPosD zJiItEd6=}*>x^8q0wA{dLIyx}Ol4yp0r9Cuiuoi1(d(3uajPAhEm?e;y~9zBK~DP| zlh`l=(AAaD8m(I)Ies`&{kwa=yVv|h|7!Nflb!K=KE6da`+3n17UGHBfdokP4z{Zr zaiFV3Z)2EyvBZ8@n6^@nSXA_iJz;KID=$HzZX13k#nrL-XovF;!b6rPynVJ5S>eDp zZN0)KLhe}R$i4%Q+!0HTjsz93pn8slQ7-7x2|o*vISVU_F^#~RD2Jn~;et?T zPg}6e#>C5|p;;v!%r2=VLH#MM5}#BDQ!5PO&6 zTvri6jLBt8x?TcLaHGfJrkPu^!Z;g-QXLBf6eNR-{{Q!ledR-k+XJ~!~u?k%u6H+ z6Mk>5EO%InHT{P&KZ^p2epV7Z@I@}Vr!aLn*RNGF8H>2Z+ATT z?CsUu*uCG}eEIUpckJP3&7(#4;dpvO6Vr>`@6Ls6=)xaWi3R}mM(GK##}&0GqH)4Y zdAR4O5pdE8vt}uiYV(QS3WR4~ri&#v$Q*}bw)C4Udotz=)jxY^0mWRq*|ZWM+3(p) z8Yqm6$YugOYtl`*0^urzdquuttySZ`7~<>b#k zepnxsSy33-JR=H{Ih(x1jPTZU;9pp2bFV#OQ%OK<(2a^qpReJ{Z|zOT6H&KBnQ-BX z1OV9fuwC-*P6Axkd{Awb{kmB%~PrzxN}q z4r=!79=uBN>aB)q>K`Az2agal+o1E6cG7*x@bWF?^h_CO`l<3u2ye@Je);#xF9Cd& zS23K8@{aA+-zs0WUr9BDV-U4fNvmTh_S|i3L{JHtZ~hdk@Owz28p)JHWsW-VaiyPN z{&G5mw(+lVgWvyNWmPN&aQE^=8*P|Us#s@@QeH)dQ9&qDlK*W`WX_n&%K!^=n^@gW? zf*a(#5=^a<3o>}bsl}&tmS7VHQoGWTj-=p-G8yVvwK2TM%NXh+!$ENeQpdui5xYm; z-2_yf!PlEB2(+ntC(pct42=z^!bG}z@}C8m6dL`gUy1_{00!9Zj%L@ytZV-i9kS?9cU zMze!6Qh7S^-@#^Yds`BqE+}x&hor@QzjTK{vhwNT*P=uPco;a@pTK6(N@VJ-+=8aj zsIZ_2pSmQ;jBfT8g0|6QtajB;KPL54EsPxj1ySFk%oD?E=(87{|}b$Q7+D zJ(Rnohgzxy*R$1}T(?CAX-hEE`E1gNvR0U<-vA%+ zI}m3)`@9z|N+-t_%dL2&aOX1sP2+D;;h-g;T#mTBSYQ)G#OnUGUd1OURB=PqfMjxT zV!&a?I2!k{)Ik#Mx%JY@d0?QpC{3X0s=qCiws(GdmNM~0YFWw8NW$?5UdxaY-LJpg zp$?43iyPV}AS;EAO`{-LSJvM1i-i|H4B+1NkkBcLAjn?jgXfqN)7V9@dzTtG$9O@n zf4pj|ee@Q1!WYJBG1UGTD{fzFu1Wx7@AB;T^Lhb3E!A4uCCPo zqdpf9PE;~YSE3G0W1#i(nDRG=N8oDs50-AhPp{#W?Hx9IWyt%tllkYERZT<+x`hpd zS8``63r>QAG8L8v)`K{ zgW>XCqmOH3aqm@9;%b%c&=iW_<6QWWO!?J+X%5TM0pQ(PKqgl{2H)r_hHw zPA!Nn6aPI|mCJsr)2kcR->1g5$-jr)MNMg|_7W9d$9xxk3GepnOGSM{NU!>Hh9!%` znjqeqZg~H3&2JyQqI&v&5eDCC(Hs&@Vr4Vchr_B@@#e(Nf>W%VY0gFbl-Sk|RnlER zZ0E=JK5);<$reuO$uDHai+J#T1v!-#=>Nc&8r=6zzS$C9IQ#m z+{)w9TUh#ffUFw!kp!o2f0YWKg52Q!fyo8a5-F6dDoHs1uBVkh@y!TK?A?{8qX&~X z|CXLJObuq{vnSGyU2X$&Xk&o^M+orzK29s@zp4rcUFjVPb2zgA5%)%=YqTVEgg6&F zn$C#9ibQL@1uaGtO1mS=A$pni3@;t z%60A{UuTL@RRJFgw(QFid-=BHK_qP34sY7u4ZD_~iEL{WHEb|2rVk5WGd=YN!Akv*g* z)bGhq!(H1+p~dx|nH`tk%I^>oZq{EXahEoIsaj+JuzqWv98=8R>PD3?v$U173YB;L zOq=qP30Kqh*T1Z6P>MO_iMRbANxypb!9GRO{mfP{l9|rQ$W}t4+wV|dXk4Hjetd?* zU}gAKDYg1541?jUf3wP7AfF@^@-zRcKct-aQVp-45j3*7{xM#Kn);s{QH33OJG;r8 zvwq*ah9zsZTA0{xD6s|03}t_Ho(WSprWd`KY*{6*x;e6z*#|eWawHj8uq+eJd`RiS9POn|FX{HcRfHSubE%Rj2{gWZ1hDoUZaZ?N%Exk&mI&=`C z2tyUPo#5RD5#F{qmU*Z!mUUaG6x-%x9v#UKRSKg)qby;mC~J(lxJ>*nz1fuo_v^V! z3B|<3gJt5-RwoJ=gz{N28CK?O$x2)zWYgDHex#X%V&ApauJ>WP2lHm>GRP;%h z!V^vqmPsN7?1<_#df8QjCnE>heuvG)d+It6B^+!91(s(^yQZR8P@Ev;;I_`g)cu&! z=~m{V(4MtvR$ob5I%!XMZf}i+B~2-FLfT$s^TBlNm!az>C>vVMO+O*G^(QY8N5are z^a^1hsr7@Z=!!bBDYX*}9H}`%&P{9%z|4YVX;5;d=lHm+ zLk2l4J;Ddqim7Mo&V0V^;LEiKO+3@_SdI!MC#hxtG4`eQmtR^H%|ew5`{FzjSXWun z9v(sxLYAJkEGzxo`gEM^BM{EtblRk8EYY-}MPg~AA&zJh@G>D4c~o^>XK!&kDS^BC zbF_29d_k54-ip6;F6MPO3f`4+$HXX1g2h7s$>*^p*1Wivv%ZrHcu=PYJ!Il7P>0o- zs#;f`397TpT`zvmgfD{yHR!(_ulOD6L#QroP+lRMNrR|XcTgr?=5Q=SXlH=}U{8BQe4(=_zQhmynezZ)hyf3r4hg7-6Lo9pQ-kFux zFHJ|kzmk0u#+Apt-gMBzDiDe2>5ERq8{mm!_kX|0gxS+_9AAoSfJ!#^+coO0EI zbd$3y>)0y;PDV(eLGsCZK9*iNZz3;`2AP)9W~~--#%yuyQWXeAULd{IiS#rOe5sr= zHiL~ahd%~amP%8alf?$=nY1NPRz_X3X;y#Ew9uf<2l~4WI1Srls&79H%|%}39!1a# zi716}H2W}K3?YTmA}OFiFK2yhOuxsLjBatf`UycjYc(orZ;pq(P6F6n%fW+6+8$Gj ze~|M2#q^t#Y5MJq$rcPaJ9R-)*>-WXvp2YoN$yx0NupMme|>};Py4>`y{w$jdQIEG zLYCPcNjZ9rWK4S%y?edJLH|onLOwE2_*$2a+cFQw?$R&i*fNx#7PZ(+NG&aCeZ<-n zD{{hQn9`6!tu9EUTB?}ou5yW`J2RlzLB(7Jy&Pb>PlxbjR3FPh#{@9xqJt+N6pk z$oC(7?9V@|sR!?AUJ#aKp6L421ln3Z7FY&}0YFkfkZX5Bg+ECzu_H9`oKnBFP+HkX z#n?qjp7P+A={m=SlG?hxE!}FB*L8kFKVl zCnQMEW)0#iQviiZFAxEA@~Zus%|9)zJ3kA0rYn?iKC(BIxuV=I31<7F7JLxpsuq-0 z;~1b4$|Hw7E*iM7k?+S#$%!53u?Iis(Dozv}^DUuFwfe`{U9(9KvTc~CKKXq@z+}3gA{ox8+vV5I*i!Y#r zm~RF^D|RZ2A_0&>L=qqXQlfYBeD?eM|9fW60ZG|eTlZEyTN{fwXU@EI_w?KJbgQqa zE~u)e6*sV#yWu%8rjVyQr-0Ly3fEIMRsZ-Ik|D$NWX>^}vDFM1QlKH(}1j%jF`VY%;{D*#GybXb#4gmAvhNcI(2D=RKFxh!Yr3WA7O zl*wFk0l3j&DtTfWHO)1~z6X#Zb47FC@cKM zS3>%-nz9TQ;`qqD?7l@*P!5_w&_@8W05N9nIk&IuCyURro4Y^9r;>J4mZ1_#A`G1p z4Nvvoi^;iShAH%nSUXVswviJc>Z51BRgrF|_0<`zBLmbTAaP+f=*%!t}m4QpiUn(ZqVL2A_1oug69k1 zi86`53*}Sfc|M}{fLp|p!E5{!i5tm2C@0C`3FVwomQ$e8#px)tPqTo4s&ZSBBNW5s zQUz;h{Jm}+I8-5cC6=CE20J>yDrS_9C~1CUbS+MGsZ!SmHMV#!!a~?hC&FB;I6=3d zqNnO&#OstHD1uhKy@%99f}Yv1X0A(`|A+|bOrST zAk^ps<#m{k-9zR);oJlm z-|9Y<;qJLc{^&^E1m+XfYOWRv0wWx;npRm`fDIqag&My)!Dc19VS=_61vVfG#H5x7 zb*szy1s5BoFVd%b^6WRy*a_+-F0Y`df!hN7=+ zUwDI-*~_yEW0i;5bsnH)^4Ot!O!FTMACXCqHj|Htnn*cJ-y#Z?A!M{E zTIh{?dV|FWxDYxH(&zAOR~mATO*KV1aRUk9oQtQ)Jg*Jm=g9p51wV-a zY*u;!aY%Cbn^WA)+q%1LbhCD}H)=7` zgHS}$j)e2rslYIHoHV}L9Pd&lgg{Z`aEvdkn@hy8V=r_iY$3)#V39oGHRy-xvX<#*UH4PG>|Z z>F7q3dMm#|QYbs4@qB(WDuY~NWR6q40AbyPE0apptnGArZszN`a(Uug8#w2HfkwZ(NS ze(EvVk0Aswf4P<|UxgVZz^U`tylF|4L0s&~x#cc;_idH~asRk@S!KMBhFf=3Y0xGY z!o9GVBS%Q28=j5k+JlWL`-(Y;phGNGgp=Xk(phJt8~i@c#bM~d;tcMPU)B1Mt_U}; z5_-~HAyvkSU1FL}6fr7%hh>{{Le4ebAgIpYjS(Ygb0UaYU z;!x+G@tcO#%pMLKJFHrM>8L(4v5fqw@TMsRqqAOZYPl>2Ugb;Z!61_mSv?%Yf`_kqf z-88zd#?@!ipx8vz-5YbE*Jj?#6ccoaXffNMfMI4IiDVNDLf%R-)(s_xF*Ziwb+wo*;d7m_H8+kM(<#%^EY!Pow@ih}mDoUj+*RKb{&MW2 zf#!2mKBY*#I*SwD`9Ryb+Spp2HVC(mbWIl7E%BT_2`oGy6m$~cbsVt3)5k+p zy~I3+x~G<)uLCzV+0}uHuo8m9CY6=ntmenhWx!h`t@cqf1&5+Rl3J*d73+p6>(}nh|0ZSyfj)77ZC8m6!qX)_5?&w-^lPsf~ zBUddc!K|G@S@dgZN>o^hGiUmXlRMHZ)pROEkB=WX-a~l`tFOTV;vyo0zhWdRygM0) zeps!*c20Qbw1iT5aoDr76)t5yQXZ6?Y7(rCrUUY+2>iX7QV`(FvJssF33VOV3)JeQ z8LOnx6x-T_NQ8n^OY^y!T9(1=FLRLvpMYm=3_;JmL^JyUV2ZHg#+gG~$&@`X01vPD zKA}~ajl%jIQs5VN9cQI+Ey#*%riIY-JhpnZ=2LzlNvRW$9aEm<&uZqSQq1JbLYCbe zF=(CBX$lP(&pRjYk52A%G=t?9Zgo(=MEQ{r5GaaVfL@F6n5^e3Stilo2rVl#gQQIJ zxE&|xO6C~`E=`g_l*pe*#7k^7OzWbh`n%e2>OZzyx*H-X&{o)|^CP>7(m z&_?7(dqc^%{`PBh66M5IS9u4UlE82XiVC}FVuq{Q1mI5piRsAK1>6{YqGGnMy=%SM zou^PKZoD*BlkZcjqHM3d{4J_y-bgxc$N3sQgklXxq;s{eL}@nQLT@vuzH4hLAjvx? zp}-#7-aPZ~HbHdSp#d0EHbAs}1%mlA7*97x#fmPJ-(E9IA4OHAP|SgwFV%VdA~mfa z^+&-w;U|_=Gn3)*{t7?BWp#Pqks$Jgox$8Z9ewXJ$oaL{kS_lwerjunwK2t_(DHL9 zc%|X6IhzrbD~o?oJj+%{r)1H!q6sPE1w^f#>cq%RaYdJXnzkrIPVWkIdy~8kFd*ZO zEGlx|<}gET3HAzHYREW&rHnNuLSyt~acWx?b!OCIC!s*3fI2XQN@Z1bsBO-k43^_k?NY7rWR_ zl4;n9++(j{ANozBWITJQ#KWdSiMlD$E^&4qfxH4&ajigBj2JF?Mk>75=U>`3#%`PY z@F7};pGHkQUW|1V8U&D0A8flu(aB)4Gp}H}b4xniwEL{P6?~epUNPq+wN%z>gTIwX z#0D_rtV=nnE8a(k2*xUiCrVy|oOh0tp)ztlpfA7$q^5Bq5ByBAn6lmk=VG>nz=-#9 zH+Z$$bcU=Hd61JPP!JTp3(>7r0#r8C0H1x**b8PKU~0-#FYA{>VxP2sk%YT9f%`Rr zgfp&VE@c$`!DW@oF|Dac>*#QcUk7j!%L6>23wyP*EHKrRvKN+~Hvl4UGDv%M7jCbP z+9)_8WRG$tucc^Q=^|z1n(q*K<{mgEOk%FU*2tun@&I60cO3Xpc)nR-TDq-sGURIM zmm{52YbHizX`km@XJ6GGXM@SYZZIWJT%Sj5U7itRXJsgJCmQA6?0v6n`05R0WMN#X zmGB}{NpDgxg1f=?V8E{%rg+FIqd5sT`Gi?9kVI~#8$OrZ(^pyI#WNJIdG-`!oasYD zAnTHW*1$zpVCRv4AT336AY7Y>)Gcx_LKS{s;TF)1EA8jzg)TH+PH9OJ0zxl9Jq$`fiVt!o|r4@FI~mK!&ig zAn)=A;XB_O_qoz!;=(MWRCKr7EW<1lie|$~QrH~jf=rXn@0$XZ+;XmSa%csWL_$PH z>&DJ$wq5C%oS$mXSF_!m(|P!$k(sUb6YkYdeS@SaMfCMqY3%nj6(of6wl z^4k!IuW?W%?K`tuXg=6g=p3Fj)=_hvH)0}ib^QYOcu%h9CHL=uFU#v>Y01`zR9=P)R#IHBx&X-WS%P&|*i z(M9WHq}|sNs^UEw=fpyL{>;`c;>7H;pjk|@NRAL}!C2Hyr3C5D^?W2@yHJYY*mX52p2)Y07ZFqT z#vxleB*vxT-h)1?{_^(AHqyLWA=Jp)GE(Vl5^fRO)n09xJYHxDqTfuDptq!Siy;4D zC`P~!l5Z5=>2eprMmID}dmgG$5H1hk;_TbWOsY{+-r9<_8U$Qp%3C1;XFba~&yfJGVVZ|m-O zY+(lnc0#QDB3LAbj5Gv~TnI-npdY=6$+kJsN!`Ru?e39%7GRX`Ci%Sdq*_hrol+1b z>cnZPycz;Isv)Y>mSQ3BGazI{!1?dw)A3r%9#{V?rBHu{SrHgP<4L>9;v#}3u#a*v}F#GxCej# zUFXik@vB}1B=%g`|oh87cyw|M$kh4j~j^`#msa1g^je<|D0@tw8d97}H8f_w16H-xLq`X&?wh*Ye zgM^|)0RUdok~QrD4dipoc{aW*6xMh*x|3v6OYgOCQy4FyI*_O?+@66WQ;VgBUH2|j z(fl=L@Njf`bN(k*_NRd}7KY27!yS^AI)>AEgk|Ne!BN#kH~bAlm`TXyW`$olRVVakpA6T6L7c4@Juk+u=$_OjW52S3QyJ5 zTC>j?WuN1_Zoj`uz0rR)79wscAAS!Z_@EiFHXC3$63M|Xxje}ahnTU<7i=H26rm*z zVQ7^=Naqa^HRZ2&w;a8$H~bHm;AXNA2|pW+)IucpWBb*QWa3!qt=%fW?M?IdzwfP* z=a%fvWRah9LPBc%-fHu+=1ZqCqiofG(JnW<lR$(2SD z|45Yzpa+yFSPUxX(2XMl3A4*KuR2@m3Ug!rRug8A5P^lsJv68+Vq*DhYmH?HERx2P z1`nH4Qz9MwUc1*L6(RS;+nWc}jwS1}GL(@%s`=UK${%`BR%5mKAI`mA*5H2SpN^G< zM&$)pz2{-~ZH!mXb@bkt#JBil6hp>rqt(1|#S1wL2$c08+~mlZO_O1@X(d`O8U*vr zM7m6bn@2|?KM3vtjnPSr7%+=%kWfPZq3kZv--06~4lS4IFCG?1pG{^1j%>n(I85+I zFv|iOq1dEVF^*^%sC5_(EPjEoy85 zMlqYbM1NwtxUKL)tFfKe>VtxJ{eGk0x?fy4m}8?R@A`px3>pIuKKJG<;mn7 z87&O;WklTjh>1)OiRnZa0&^Iv<`DdikeHAX_7a_4WIA19XAdc*u&a;I3%ihR1lYqf zh%|#XXy2nRL#WNfE_n~} zo)2`7T&pdOD^k?t7Kl3JCjSL>hrU#Q)c_;@$0mMjys*V>Ov=E|ZA}9e9Sv zT`8gO(Q}*kzc#_LMY;vkf0w*Bi_-cM~#+)-}y2pm70WNajqZmf=C1beX)3s!muzB5YCKtsW};n;RC`UOn(IuvXEC@O!JTZM>}fUi$Bq@fP;V?|a2?k!fk z0!?mY(vMY}5ZNh~wB8xP(fqtI1jaS`ke0ByXtWN13c(U>(uP@xhuBNmO24FLGEsLu zK7)!X)84-9vfe8 zewA)^p}=S|?CYPx;N&@kHl<4j%tzQLAjF{=sMMUp;Cw(4b?~NM4w2pZw}<|vhme~O z9vT-^3nI*QX6uHFn~KJWXjkp6r~c?MFJA7<*!niu5rql-IZ)xq5EO)ax#VGTiy|GqC@1R<**v6T@gY^5Cqw0 zbCB3~o1J#=H7O0+RG>)~AAD6^&Q&ArVoE7bufW!J^UY^M_%k&%XDGo>gNIs?d&C>g zft-$*ZL={xtON5HjNhE%S>KjNn9GQqh)e3eC-hyf1Az)y!;7ViQW^O{en2K#%<&kU zh$Tf6N9FRlV7@aN-VEf12LjAB!&I)gV-?Np0Wm`+QDR&*6~JSROko~k23a!UGOl7r zW2Q#$IKnp$uTXl02DG{Yl6JZXEpTKc2icJrUr^@2aNyP%qICi@5GfQo$vbWieO$!8 zTl^H-2{;45A`|ThP$uZ(8=@qT7HHbZH#!9FI_hIAJ17fOJZ3;8n1jLOx>(?PTk&qv z9Ym%L8PAmMar9D+^WyW2{qhqCe)X?oZPlt1Ee#b%Q;^e2 zbXpKI%H>UU!?n%}^KMIY8{`+x2_0_3NIBw!)UW~J1@$HCX$_>}Xa;DMjKiXupL6p? zhli4YY5!%gAlNSMlHaJ#G82*FBATVm5<9^ADUm!kBiMF2?HSVCT-*m2jI^71%Bikh zMgOR16^~B+t2+^ut`QL`)`_w!SCDdi!?qAzw67X{N(YjnP;p!;z=qpslEgy=(s1t) zbOI43&^|$ z94^+9>!f;-p5OC$r1!pqBJW9je6P{Js@UCQ&!gKSigE{E*6_5rWg1i>S9#A1r7@E> z1ds8&786ojD?XRp$}ZtRaaIf8g0GyRCJcL z$H4hJt<3UTah`JxpmpGhIwp|flgWNtXx15?`v zqK_q@eG0?s-01+}uw^2#en%jC8kpB<68GD*k06~&_e!>`%e$5Ee6gJR8ni=F(D5gb z4mcuCE=J7$6Z8e|*FA&`iv5&6cst=JIhFI{M;y!YE;oPoWHz7vZVkwB6w{V+Kw)s? z35sg%e7>=ejt67#34--KKk+6{uXd3pJE!qZo$0UeqvP>WL!#2#J2(;#cPV_=jgrZv zu6MCKr9&i+JSyUKT@sI1RC=_-UAHpQE1at8Sd1yeU}JH`@8$kU0lC!w)5khgqt$%E z+*oLFNX|H24ZSvdkTf8#)8fWgEp#+_4)mO?NV??J=r88)i5dC?c-3-1s-e|)jvwO= zaI6SslmawNfLOe2{?Gq3>n|d6Q@jIO?YUJQ%{7pmR#U%sn3bV|UBD^L^gbB~>QSZ4 zYiDaDn2^20g|>}CcRpG2$@D3nbeVYa|^o;5c3w%gYrX4 zo0p|61gIWT2{CR_5*#DdnP->enKyO%LTEhe;5jhpKG#G>?NkAq(mf>vj1W(bgL-^UmA1tQq^sgL;( z7sJpc(gc}$D{|tTU8t+t!&8OvT_&)2l?4tF9Hc3_Q^j0WE4aEV(7?@7?-AQ^rg7+V zb~1!j)<>gO_!3-uz&bh-TF*Up9qzGIauk6lW>K5Mmbyx?ZtS=!04@S*{q@PCvDWW1 zzW#giA^vu_Qanh1UU2Zb7PnMao5KmdpZIpQ`A5ol_Vs%8?<=XnKfd;{9xdosHA){e zknA~Sqv>hvCT*r8&>l1PGk9V!tAMIM1sMX)SuK(41j}bU(u248Ktbi&O zBIx|42Gq1KWIy$|;ISAfSw#(h!}<@^EXf2>+aDlOs5#?i#zGWWM`!KLJ(8>UW#diX zLI2(N9K_dVFox7cl0hs)pkhJRUwflf`!+48-a?t7%DfY^urJI0j_!eMo7je*f{)?% zn45`Ja{{hQK&jY4+O~kEK4EOAGGBi?Nnv}bIDDMI!`mD02lHgbVH|^m2*ys$tZBGj z|k?+0>x)L&zUld**FjEDKc;xaeL9=t0BUSIm|Mba@G&hJkUs`k6I zQN`P&w3k_s=J@e(B~DfX$Ac?BW4QD%KvAn8%w0jj02lRW4R4uRmd9Qu&!xDsR9jMfL^;P}F7TNu( zHx;<Tp(GdT6=l_yV_X0SId*HzN)b67)|_rOU|@1PJOw~GE&~uh9L!crkF>O zQ4PD?MfLmvB#Xdsn+jY@qyEgw`*KfJpOuj^Ua`Oj{V}!o^uH4bysWFf;tERaGp?gn zt?Ki5F!_2H_vcu9$F4D1+kc7I$qXR2ajn(ISF()T+9!FDv3++a%*P2%Szv)hf0+{N zOFGVLiZ1r%Z^vu`4qMF>AL%N2xyqZ`Z2G0M{$y4IVXaA`(-;g;e;{*7>8hG<>FD7* zU>RR`VyX{Y1RTo{^$}__>EB;SHTpefQU9o-|1xeJnq_ySDLT;-A^%vrV~$lgF6le+ z3AZ+fVqCi+PeGr{Z%N`=^K-vt> z%Ef!vm}i%cP6XkO55A;?#;FeJZyBKKDTW^0T;5z@XWqtLwRvM}@7un;vj>O$gH~&& zwIdt3d`9*s9eOA{w>(P|?JD|-!*ma~M;a39&UchokAkg-M=PYYSz~=Cmunx^?$+eZ z7QwAut>LYnt~Lp#Xs(Q-W@Z!Rq4^Y>Mdk$Gtv>l?&S~D)%|HGT)gwX_)AMx7A^%V0 z0$y2>YDQ4oA6D*G|33bQq7q{$D+&mGYLDO0*T0%8SF3;g#%yHI6JU1)gW@!() zFoX)Al?#Oky#(yH7l~}DZ&Wyn;>c7b+1yi@$qo6g#urJ2bEaTVB@r5^@5`$1pWgMu zkJ8xO*+HiySBYG?ox}EyQ=n`_)-%%Y5oqox!g7sw&Y9E2X#TBMy?ufgpYor?w&=`D z&I1vw2&+!CARYpn-c?ZH&}KkvJDvtkH%U8vkLZ_asBuG8*|Ck}*Oaq11*!^fbLGYJ zCwj7Vy!|cesh+LkAlNMs?WgX!W;|;^K%-ej){98zn=xHJDbNf(m8sT1=izNG|Nu5!oT}{5S=4T}E;vekYpx^v4k(}qeSMd7Z z`(y0#6N1O*f49fac*bk_kIz5kuCTiGy{NUO!+s3_`WADFrmh^`-z9H-DmtB3E?8<7 zYtpOMtY)sUhBY}Q*51`r`4tYN&KB0e-HHuE*sGd(>!g)L_C{OlEN?N>UP>Rb+W7G6 z=A(f3ESm3F&I%K-rvin2X=x4lLU+tDwqLilzwIBaEW{>6(QEd3XeD_|#~RR*W%1gr zm6oG#z=6IJ4&vvketz9d@6=iCoqoa#;8c0s_?(DR58KqZg_pn>1ij|c&{|4mXZR#k z8x^Tdkk&}8`^#h+*)uRX}i`5C|tLSSiM)&)bNM@a@|{l60pLg_C^hhCT5{Y?TZ zMI;~}Av9e$6PJRdW$FHB(^%{phe6xp)&GYnr{>E$#a8dv&HJ0ODZsFS%7nBv6Lm2- zE0dM|A9)6|5&YtN4Cv3fUNd5|E=j}Mi204^)Tbk92~`L9a2MnG=a}2EnOT)N*~6jk zx1^zH-4pxe{*!A@Q2T}cbIa6!jT9uO#V7vtIBaVzac(~4@`3mgw+{m74$pN}fl8># z%YaArx)$D7d>Yr~6t-M{a2TIA8i$@f2=(=c?>av;{YoKr)n^aF&=X^j8x#4wNdd-& zgxcob(d$jQTbfTl|8j$zWM6)<@$@SHpjMxbgU(Fvf=@aHb5CwG! zAWX+4!5uEA^Tu0)@ zc)r@4IXPlT6?38S*)Q}Py4TP2J0y7Ok&e?yK_LHXT-Soee~u0uJpMQxl(_PLj}Dx+ zL~_1pUERH!jbI%y@t3`Jw-?8$W=dSx;8$Ts1o7U}u(*7`4OLMl7md-335AX0MRnI{ zb(4S3EDbUu%6&BVsexLpeoaL!v|Eoq*SS$pOrv{jg;q26yL8F}$t^~5Xvu^;xVcQN zy*gqNFk?i6ju~Ui?bl5S*%eY7O{8It&?J6_or8Kq?1=yN(WN`rl{4~kS*i3)Fg>*k zaNV*C5V&Q;WSDSnJ7k#Qjk}8hJfUvyeHcdqu+FEQ9nb({BBAcf>6!k*sdq{G_RvKn za4S8;U`#n>q=%S7tbYHjg%Hy(#K#S*j*oen{#KeGa!; zZ=d;o{TVE`0Lgu1i2Y0-_W_m|JZA;TOilVdF8S%{BrKX!qAT8|xW$GvD=1QD5n(tJ zpgE`VhT?UQj}VArPl;o^#|(q8WT`~<31}YzR~)@6T5_Aoy_ry zjV=*cW7&SRbvqt@NM>!E%uQGS{`4RGzjs-Jsy6gzI@m{Fi1+LF-1o*Vc3y=uuA)7Wib!l`5>@pgsij2^D&?^QR`n&04#o(K|VTj=5hFb~eYP z{7qaYw96TKHz(z13mChEY6-nHG}ihYvy<2fggP77Y-i~Q^DtAAf{WWG$&jAz6Ivww z9V-0CYU2#^>z?&5S(Duj91=z70I`E~F&K?6>W?7i{r*wA`KRUv6x&?qe~)@BR>?#U zJPIJg!kSFCsO20sRu&)T?%2o$e0~6LSd5q^rIji?4qrUqz9BO^QQ@0MKvJeP3}-P3 za)4&zT9t$IX^y;Dad4#K3UJbAqhqG{;X+SUzm+>7qT1fC3YjzzI1Q9}FR2!D%h-Ab8Bj=H4Gv=x(&E|U|n zV)cR&l~sp=kpd5}67!@6l2{bB5RTMopwgeDrNf^pWXDoT-<)S_2bT!q-Yi!tVt-`n ze-!f#=KbUwOG1ZlL!S~D9vxLm@~8lzMm`C1%Pa_<(U7@Jw#1#C*7yDP{?T4|K4xpf zHEg%F;phSvh|k63zWM*eV_F;~h?aj~m3p*Qdw-T4rie+{|;3Y`NBCc#)bmcYM#J-iXJpqst4UC zT*xMD&rU~}p|PG|jhFZ>W@Xi@T#)Fpz^eqv{1qc z@XY&-q}Ewhz0)q)EnZXYtW>Skz82MrHD_#~e#)iNxW@#2zL5Jwx_OqiRuRHBms#-yyaX0U6(#1W1u{o;zgBF zutR#)z^fkYDa3TQ0@GORtO67;Ry7to`Qh7m@XfuKl}HN!*$S_bf`_jXe9adWae$C8S%#+!yTzEmNjM8CbLgGRZD)8noVO z5lhf2D0e=Vu+@5aM?kpAJRo4SQ&AE z*Oh%R!jD@=o9)hKx7&Vou!2ZhLwg{cFV9_%Fz6RKvQmZFT`gQ497tubzTYoN< zxT`Vz0O%Kg)c5uv`wd)s#~Zm z7Y|GVY%(sRoo8vz?x4s3nP1Sqcd%sgK1i!ruz_Oth*jY&u!yN`AdOL^OX3n@4brh} zl=t6{bPnBEV9KBw4hX5-r%ym1=K8l)2m_&R`B=SNb&4upIlaX^R6F*@j9as!&EO;z zHKwSMsDSW)5os!xGsPvy3H%3<>Y5L%?md;sEfdW#Fm@RKA?R7M;^!z@BV_+_A$$dk z)&z3xdtLU?Q9%{T`E%}Q_O^Ojc3eSAro{ueS!F(%cszlm&&+E)hya51KmWP15>f!c zPr6vmb&T4{apM8b|F6fk*%Nw$tg&A}=9H|4WP9*G8#ab}uQ@7seYm$%ch%s%`SSBG zpqQthKl>63STY4XsVFw)-p1(3a~@77@9W=?mZf*e6D*BAyzYDIlKZ0dSvswB$bPAo6Ex|~30TSBBw$hkVMA5QivFQEg znmUxg*%a;|CX?B5vQUS1vB;6eg$4Pc(pd>kND@n2DbbDMm#77KPd_VswK9dU?bwa- zA6ktQlkdug@cL^rsLX7|5%{gN1S$AME6DbuGDz2H3ObZXSDLo)+KY>&Cq;W%{p{mT z$g1_xBHBGp@2ib#&Fq&otfz^U*B+-+;&juo7K5TgVln++6Bebd5OicaIS9ip z^Xc3f|Rz z%iF-_O`IX}=dvfWW)KV}7Y~maaFQi+$QuMBJ35N(Qa{L%DTQK(Iig&MoZxCBxfwi1 zoW&CkCM$)!=4P`#uA_K3ewR4G<}*AQU{5aC>ni)u&siytCm<5}=LAImo{^~7g3P8e zsWlK7sCX@G@jG-!u8E1c$O)G;SD=zazYjr{f-{o}Y5gF8lUJVby5ua$cD)!;Vudj9 zthvL8b$)QspE#pLQBz^uwLqveq8}9|Y+Kw6UaLw?x;1xo$iR-zV8Zu-Qi@|bJTkUp zOJ|_(9yMBPPv=c4YN~{*anTi$AgizGz#g}a>OWHF153m2ca=%|y;JPEGuMVu&S5e-`b^Dp z!|NH<7@|+Io?oS7M+D-$p$KQJ)tRE`oNKCbGNq*{1VM+EN*O`NXHMY2<{ZzH`?f_i zm4a`er12$Z!xW_3$x@EQCJ+b!3zoy1@UzP7AZ7HMNU#|K;i`I3R z>!pMXo#QLg6};Qibu+Yj9zXep5e9G3vGTl~vukPE3H7*EjELYN zZzF?UeBu$3X}N3BBvf$~mk4n?9I6nn$A>6m4G^I21Z(rn70I>7o+x?9(~B6u3!f&^ zVuiB>NbJ2Ky!!_di>Rtt>jU&i)VX#m$~QgbT^KtoIl4KrG8^b|YN*g@1&6|8$BSII zMH)U=3h2ggOKa^p=mLLe+OBN0l5ariVzDInZ_a&R>5M{-_)!LKgZnwmD;5TLny)OKv!!&RrrZm_<_7qUXu^p)z5Ge-)uP+X$d=!egChAoPY2yHM@~B zgfJ*1<{3%SORKv#`DyIl}4e#xpTPrUQ;)BC<2dhxv6b3qTn+7W06ujdG?Ss=|ln8 zz;6Urqci7(cO!3D5BY#Gh)o}|bMd~Ku*>LxWALs`-lNpBuf9>GQRz$b3}XgLXI84f zLGxTZ_JD~9$iAS$&oRHM$N|7v>SmegFTI-HoZ_&0>s{}n+uruxRPHZh-_wy^0BLKd zljz)+G`g6*+pmL30)VJtpz{PXYr{nu>Vjnpg5DoSF4T#BJDV$ye>d(>Sc0TG#TZeY z=8B2AY$Eja|9<+fwdT`*p$3qR)147Vl94%AGIdYSTrs3xY{poC$Tt4+6!Jcm>Gjtx zcTR|+UKt@p)MnM^EqDmTo3RTNMNNQny7l9y9Q5)+mw(R6XHUL42{pqxJ%CY8pW{GJ-FVSs~yjIP?#^@ZCW$+evfOlOQwQ9EX^>pc1 zG&1QfJxA`z1s#e8hrC0i1~Uz+D%_xvsv#>_^>~lS%EcR_w?7-o% zPBhd#-r{WVwB{c=Q6eHcAay0=1b@M4zE&Qg?8$v_;-KdABa!ARv<5w{(BGd4FDHmO z{{Bl7bCp}B9B(Vy;e=3$|EBBOW7)FlIz??*oeZR>AMN(Vb9MW~onlj`UgPPV)~v^ z>=`ys(aXKf&(KlHwzPvh;mT0rFsNrL_9vc`6JpsxF^%`0t3z!xh=1W3AD>ZSO{%k{ zN$h^$u{|PN(0iohR(-EwWB_gJuC_0fV@Xj41&l<}!Jlm;<4Ms8J`($#JGjAR zWITXaYk`R;@^kY77q-_|)JzS24V-z7&TX$0wzyj`p6{BP_Es?d-dPk157B{t& z**mM?Ak&)Q5`*=8J&1XBZJnwDfrE$Q-rD{O!6m#)J753hZcZc}tGVKI9n7rm@dgJf z?h8{W#*<8TOPLKqTa;r92uYJSP*OY)5HQ2YimJ@Z`d()f8)ZQGkvdf6wZ4yfc-JeG?Y1EkE<@aSA6_5M&cVK&v4dRPW!A}x0->k|9Jf5(^= z5sF;cNY?PmHsO$+OsHwcvr&>+gS^W+gkwWEn8z0&lEIdM)Ce?*I(Om#0Rph;?n?*OAV^hc~KO`BDO9?12N9px>9 zm0)0|v?iXG)+6VqkkLpgZw6nnb+aOr?Q4^W&JAmFg@ebDRK>q1jq9zs^iz}}u5h1^?g4;E zUE@jRX2Qc1xlQj=28OU#z7VH0yAXv5;URq|c6C;lz@@pPE-NNe$@pSh)b<~8A8)CNS7 zTB$7@Mxr$n0v?O@RjMUklT>D6i_rYR`a*2p+Zk%$;wZGGh)D0gpp}H)B(>^tc5y0# zC-}b+0W|O~b1?!y`hK#~zqT@QjX&Bu7J~RZ|6y|-fy|{VEo_o6LUj~A8S>i|%wso=b?@8PG7pskZZ1A@HIQ^X#WmHHh{JShumc})I zvAR%`cU<%8=>CT#9zp|ov!`NaWak^ph5$c}flP|vVx;X}mh1Vs#8Z1{M^v;xr!riz z1MQ^&z{K4Pt@7}bH5&xCB`L%`X^A63G0CmsMF z;y+Q_qvAlKayfhMKM0Y0&m_+Vf>>g}?t}lG+T?NnR9YcW-vKIPS0)cAn00ceGhafD z`Ysk?)5O^Pxv=4>H1cEZHNQgen+S_Z=;9PP4^CgKh+><415`{jR&bAQwb@TB`-9)q z;O&V9j3fpc((oaNCFsQr#B^h}=6o<1`3O1ahxrFHtC4KKf9e~u;kJw1c;O?Ispf3b z@)X7+<&U<{(9@ik>l*09jSrSgySUVnriiep{xcicGQ?&5)2 zX$t6qsQ4pU|24n`M0$@nQjx&P(QfRvLmrzqym`nQ-h7ld*!kh9S{?qbJ&c2tnaW>U zf69k>jqz~IK4rGc^i)kZEHl2V9xe62K?b&3AxlHcL&Ko(jHkmPanhs)M1(`I<0Y_~ zfi$oIQ5-Ux8d4ZWb&F*U*VO*U4*n5a`OMKIUi`|Zc4&3OyF8g`e^0H2iqa4eMa(f_ zT`Hkg4!X`lnYv?OFDJ0pt^2>{a(uHjV2qiEA(5?(Q!79@x)RxkyIgt46OBH8?xj?{ zDk3~kjx=XEP>6xd+n`D!>N1mN&V_ZiL)U7Y%m=}frVs|ljLCd4Q_xZqJuf5LDtuxV zA5*R^UjPi(aq3E%B#@YxeSCs8CviR#lMw-fK?Q-O`ASXwHxjgVN^e8zo>wzX^uF!L zV;sWhH9u7W5k`%OGYgi-c-vzfp`aM#xn3|2ZloIX`<`WQph_>i@c}I5UPGHp8{MOa zX)dKn3Z6(TovR&ocF1?4d&n#LF9D(cCpp0Uw!hikUL}c)_jx?oX?3^BCsTW(HmmR% z;5zlmoQ^WYcIrYV@TjSd-do*S+Fy9PjKgJbwUBj7`e07rvyz0#0F;%}UbKT7M-?yW z(<+{B5PM8$a_i3f$ZArIoo2H%Zr6>L9!2A9RWH3-2$KNNJ&E9*$TrU5a92Ud<6*E` z>+9ZarUEvi`M7qlcoh)}-h=i%mLn?#9E1Z#f3Z3)p_>5+u!?YC(buw=!pjA&AE8i> zH=Hcdm4a@zNzTv-HIJLMo4w=i$~Bo8gnSt)bJI}s4-mosA>9qfH#SBNufkJpBRFkE z0U@z}K;YFwm|&LY5nPhDv;B2T5De$IsW$iq0BmOl12*w^|)LVEpaj$VeLuES9}&x^XGq zsyLk3iO%$-e>>1Alzg~PaT5|jR^U5FN_O zKZ3A_CuBGjahKDbqD8Xdxxwxe5N{pv`- z@R@Z;24MjRJxwD7A6tq?_N&bpC3GlO;yqIdbN^gKed=hlw3{aOyfwP*9W$5Tej6!F z-HD2+K|$rj&1T#{MaC@IyeLl%pvC4fg3KH$>07o=^7=_rm14_*H~*zB>#nQ2OF-hh z)J^j2_l5iK7Mm=Hh1lc5CyKE`Pzm6MawAxU#?CND-PiA-Zx#?(MK`KiVZqFHBGj@UsqI{WN^23N`sfwG8oDBdT zPD{C|mO44Q@lFhY8b+zWi)G?&#vLkjE9J#V6kq!yh7J(0K`*#IPUatx;Tww1;iB*= z-8sxkmBz}l4HeOaPj7s#N9+31J%w0`*(KxRQRTnxuQel*g}ZB0vYhjwTZnx4pF&Qn zC)?)bVRscqO1>X*#0)=dEDyOY-`Mh_WApMlI2uNlz|Y+$*ck@0oRSypNbyKwf5k9~%ob20qfBoFI0K_aKh==T-bZ)t!&+Pc0 zA|z7@O*(Qf$YmO2+*3&E z!Ak#jeXW1HvDSabzwh*~-R8HH=4Ny7njA=+U(k%}#_Sxf_D2@B6+hBRnb&&;w=mU|TSS%R^$AE`3xV1-tHfCg*78id z4`O$2VTp}fd`bRJAJ7IZSi&5S4A@N1DiLl)QaMegHvaQW8oYcIQ&|^ z9AVO7L?EUR%l+XO*$)`nBAaMJ;eZ@Wp~L>Lz&PNkHX&$06*A-STV*TZp#H?Mx$#of zaC_nSRZ?>Fnhz;JBTkIs^cZIi9+vbX9YYwi`^1WIJGgz2-f`xD0kQxzwK_8~(hgNW z2`0EY^Hez7@Z|ED#%?>AVExwqQSXQJmU1F&9m@^%=RX?Lu>c;QYvHaK6#QTgN%c3k z9Vweq)Mt*8KG=yfWOUu=z`*If4+!K*u@i(duRXP^Ejmj6or9VRSe?;(l!M%kZ}BTWL0SlxjJXtFwzSS~S8BMIo;hU(Nh&O!xLgVuRA?ULLgJ$D02DdrH=s{yx`C z)8?xUYD7Sg-{)~naIq0}7^_bU!u42mu7CCPK8)>>T%Lv)#BWyucD*!sVs!3(2IGf2 zrX*#fMrZTjRf_{cj#P=u&ZuL-p6rcgPFSdN;mmBX)^VF#n^UGCf|zPg0Ia|#?ZNxX zRFa03Q>f2I*zWx;O)*s1G<@E-wN08dmKcm^h7p;L={bFEtZB4YdCOK$#*KkC#_7d7 z(_4k0&WH%VXa_IE9uSo_rnZcb3&Mm*e?5&MKd+D}4l7Dw-{g6g!S?VB1nm9Dg}YcgR;3BWesxq&$ehWtfPC80GY5U)^7EJP8k+Joq~S@g4wx z-u)+IIu()SFXR2PfN4dm4aE2+Lzv@NE4p;2GZm zZ_|%}E;2}L6L}0Dj%9~nGvMNzS1ExaeP<})+(}#lf^_NU%ZQ!4k^E1mliDwpdlid) zR#?cA{LipWbNBo-uMjbH!CTEFI9ym!8<|>}lD?Z|Bv|Da*_cscx@ClCDHb+M5gyDc zzp3dWnYC(q>QP|R>pX4ksKC3%7PmHq#_Y8XM!@DACrv_;>HX^FGEUP1#7CSO%_jI> za;M7*fah815Y$$uAkuN>-8EV`h~yw5a^xrJ;u{pfy_memBjNpn;y+pVgeb<{8J%1R z>v?Wwv1|c*m8z|!C2HDpzbE+c45sQswf0#{_w@3#0bgiCa2C5f8{|qlxmb^XICx*+ z4B$Um_@}8a=^ur{C2V64YQ`o=EHwWME^`+h6V=vTY=Z<&PN?w&3ZC&;yFK-rF)T{S z^qugR5S$)+A&^vE+>~8*u`D8dfSarL)?P8#(snZ|6-Cxqptw%}txRVZAv@fP@Ok8X zZ7(K>EYq8ZK-AadV#SCh>SGU~Pl@wsc(x|zfQc?g2#f?(U{Za#y?1y(DWx=ljXFpE zo)e1Ko88wLR4k!v+gJrF7sYg}y@0lXM31bS{0-+b#5|apUX0(B z)97FarO~I-6tzrgi(=ALD63|hN19{L%;(E9GN+=D?vn zY{@6ujj29dZ(QGNq66;Ht=@4;pwX@sexUBME5cAJPepL)bS%w1(&)TtAM6~yX|8WD z-FrjSX5qf#JBLT;DoAsq5l;xWZTFfl9?pO+;RjwufX*;b1O)rfE04HtKc2ScvBe|^ zFY=EV!6)lmKQ!?^8b*hptgfIay`~bL zVX>Zm%YEEje`bc`WyOU3XLNYfIs9u2nxc(P5{1P?K<>NNa`V-zPV3cXuho2Bf&&!D zL8OX-_m=yB7vqz;Px`BIs#v-hu-D#iWh}3ks2muYgRJ39fcXNR#r1HWL2GiptagC>`ga8CMBHu#k}11%8t({j#Av@=bj1`-Z_e1NzMT!y zT(wtmGMbGk0H#*QPG00ryTcw-wNd;`=Koy>N61Eu-+MPFy75BMvIyH~T-=6@)t_Ovb%;!!_yxV|^S$xu zy{;nYu`zb55O&V+Y5wUokH9|E74OA(lSLvcZ{O1baqe7 zKd`3RIIVzU$Xv`CpW=KjC4Mqk_JYWT3gpn)_(Nkfn?)jjA~6DBpG_)(|x{0PCjh0VO$c;K!DE?Gn^xI<= zCm^~@E2n09<>IMY?#w1}m?3eM*SHhJTzIrC?6F*(NBImKR9sH$in z;m3HNTwYRZL>Y||1UgicP|KLd5eWm|6AnC&{6H9w27y4yStozvN7URmbv|5?Pnz}4 zY4vEjIUr+%mN340LryZTW?A=nFjejv>E1=mw!?Ju%nD+<(+fBs-Xxa(S9g%jY5}^;h^@hQTY{%1_?sZq5vmcXgXv2>9&4nU`&fsdi!Fi$+&_ zXkLx?Re7Uxki3NeFXREK?G$Z-om0=WOmGMTCUYM^mc{IxZ(6*9k3H}CfSHC})ph)v z?^*wL#mdlBbS7+b;X$k|E6ONc($h=DhR5657I16-jv3Wk)Mr}nH=e@>s*f3}`o4yK zjjKJNu>p+(OZD5jHD$GC)D)$LJhy#qFe=+|q+}X$N-zD|vBq0*NdQMcuZyA@E|)L? z%p#?|0$J}6atGentD(Ry|3K};JCuJVN@NaJ-y@t`MCm{@z6Gz8&~Rd#L&cwg%GrSD z(OF1P_nSAEf1pGRH9pib(_mX9xjB~%L)X7I(@-_pS(ilKYPR~;ZA=b+)DC^1S`o{W zmRxo938-d%YE@k1t84nbxWCbue(ybcA{znN;ZrcwtGPz}cfLwlO(_;5bE&a7!}ghoEeG&$4K5tyl?)s3xNa2lPlIB^ZNnW0ukF~QIm5no1;4m2;Y`iK+Tm~_RA*nyx zkwMn=>GkH%~XcLgZI0C8|%*l;xVyU24XluS5PRoX25 zJqV>XnmRfXC4hKX--Rwu=i$BVy{*zpIuf%qkba!Q+Evjd-QZydVrP53u-oXjyaY&u z^QL{v)O`Ta#=X?} zF%XJyuy~%+l>q|Z&)^&Wgh1I+zQr9ueatae$;`l-IbtKP*c3^6Y4Ye(Khi!YzCrO} z7%|f{`NyUpFCY=cS8|>N;L4Qe5d@xLQ0pj3@zT=9loqUB5S_`%!DMR)D=W;i&cx%d z>~PSXtJ0|=Kw}97`uTwgNQ;XrTZVPz{oxKqy5FCt)Kio%%?(H+iysDBqQs?V(x*U_ zp{Ij}CFpypY(fqjgNS}Rn?0te9&&kr$7Xz`(?_yG`%Y0GV}5dVZhY=zD4g!<5Wy-> z-F57RTuX;=%dIk@bYX5WQ7pW>U4R3M^=aq@qjQ=H`n>Je=-8LMWleXD8zRgPrj$ zzh?}3r6FrTQA#T=vH3R4m+(TAT;o19Fu7B-2e8!MyCpM20GU_zWVC7 zyUFI)5-7}NenmWuhJhkXd*kYb9j zyrV_=h{HgB;wZ#nb2&m71TkP=yTat0VEKYg&Sb5u+zeF20ptp|`=+_OJ9c4N|89%i z*Z21~NGgj;c;j=^VT(&vbUqbn_Rl!KL2}*QK~IBsEk{%^jF(LTBORq^QFnLGUVN$l zvS(vp--=A1>0UHO(fdph^`(6E;wv5pU4M+j2?7w3KWnm+`G7Nt?QeJ360bQ$6$3Gp zInQkIcTjI)KLw-Dp2iHt1`m9uL0;6_7>1b$)dlHN{^W#_v=_|F7E$3zLJ>6q zOFMpZc#QkRn&_}r=F|_iQKeP&w6wih__|d7z3&P+sH#*Ui5@7-u4kJw{1{Q5uRouF z4$QVR{LZd)+dg)aX^xt?y%tAkP?m2+Ng``{(BvAoygAUU9{3s*DPOKuHgq8>Ux%XE zlji#BpIkbgt5fOu`kz#7EDcLt3Y0m{VAF3{jnwBx)VgbZw{o_=cE*LPm9vvm&R@^g zeRYZ_5AN3wQj_RsJJL*;mTgjX}GV8P>O)U!OmS=c_h*(qqzfQ z>GxWC@U&=j@dqMAr$mz0>ajL)Rd~@IAI*u7N%5aHk!*}LKSwr;5TqPJYF8>R4#v`7 z9G#2LQCv(*&{{-M3}PMBqX-tn#G&8|Zrxs|wYd-HM)6Ulvi>nuuU4M>LSO2MLQ})f zR{!#s^%qJkvOy{l5+HIWKcB{IG%t7G0AFe8_)1T2&ZG30k{)t*7KrMZqQt8T$E~g7 zSIVZSDLVdRZ*so!JBUHGdF!7%tj?>dDO}W?I_Ip{Qqe&3_fn(yJ}cm3=s#%cW>}*s zkAMS;bLr{e_)7M=VI<&LKfu>2%<{GZpuk2*#9`-${&AOJh$hU92GVKxn5Z!t2VR6H zV6<{+tbwKYgPrscNo51{wpsnN+>5#p8ue*(@F)_Tgx9Ujol=}{c@p&+eay}qYZ(!-_t|Za?W*R=V^6);KFhRFEDjm$P5mc2^OD-# z_EvkZ-TQ$`bcFBD#-}&b^Xdakszi-X$DCc=HCKL@G|t~C8%#B#_BEx7o>Q&JEH3zo zlF_gfA<%qM*i3vAgc>+J(Q8c9DbWlgcd2l1O3=oN>f7MS29oAN8|?^-NxjKL1c`Fi z=`kEkIIoS83Z^7x5U-74k#Gd>Wct#NngvOUu2rL>KI018J9#k0To z00?~Ben-q8E*Yc{2{~?1^Fo5jH{P+>J06BFVv6+Ky&fvp znVN^FvO~xu_R((3z65|>AUH+I$%KcNCmx29iQ7MdjuId9n=`HRgudnF6aK+riiHdS>tq1 zSIs5<%5DMBj>yv2dh6i?V(+W^Ht4kWTAN**A!-_=6_m|Si6iZ+sV2}^RHYDqhW|fa z2~qINl@Na&U8TKH5tcbg-poWpZ>hLXeP#Qbe`SMzhRLD-!D*LXdiOu_BEiFOuLAHo zR+|iC!N^A%OWk>_bt6mG6xQIj8I}QW=lw5|-s2@y6XpF1pb6b3()0cql zZyoRMs?rL5tPsO)-)R@c67l`wi!YwN03+*G5|>^Y@Uh!LITt}N+RDD_AuNs#5BIdO zpwE39wSd^1`S?m+$9$eGrB}48ZPDdW!iZpw5`~*bZ4tw=RP@qovVWOegx}A##7uD( zA4^XX<#*9!;~^lcO&w9r0&KO}>oU*)NYtJo5PJLqZ64Deg;i&E_#1>yz>s!r z;j{%@M)f9j1_duo{&oMWmmAN%e7^DW%V*DDy!_HoO#a?qYmza6KanBkPsWFRuQAfb zS1+Hv-1u_+#mkNLr%jG8Y8FE-wz`GSb!P?b!&I@7)tA-$=$mHsOugQt%>QgYMJDCO z${!M4{Rv?uZ3}CI)BLlP&^4*!%oDkg^mRKCd17xT{|b}<{gfaeh&#)XgbiD0feJO{ z>|M<>W0!&eX zW3;^1wEAD+lpo4O%OnB(Ww$OdPviG>^;#a?3b>X!A z##^@RB;c{7f*_KACWZ?%n&Yueqy#7d-8vVFOCpA8@2z4;g!p1M_Xh5nC?)wFse&#o z30LAYu9jM${0dm7jhCU#C~}Cv@`5!6^>srOX+Cq+I#z|@37p#p)LY7>s5?f^@;BE# zhxrMJinPEM$#pJvaiP&B0g7f`B``H8LA(?_ z&8l^DNSYjKfgJR@31ozu9#8osD~~|zr_pSJsqR^1*ot^^$28I6(xk=ntM4_B^dyke zKux{4=no;e+Mj&et&rEpi#K?8F}f0-7RIR!Cw}ThKr*4Sv3M(+inAueH$%`#PelBh zKoSbfDuEK0;NjUWXJcuZT2;)8Q%{6i9)+lj1`fc$oq8g|jDrbvRDt}AWYxs*@iyTr zfo?z(Frn`Qs|^YIJSQ>0pb~uvCo167;Eda?-X;L1$wMWEp1#BC+8vTYGx}II0IYC` zaiee8J%^V5#S7MU!v(obUFxF)b&VxZTaKQJx|W~9Rjt8d+o^4%n_jbZ6~v@fN$BO_ zj=t@wjtEZY`crE)FTU_$nHN2{rJGN*1?fp!@U6>yd1;Vn?mkbqP7Y}WY2(OEmw_TY zF27w|qS0t6f+hM@UpH{LyTqQdmal_O0>FVxc(jE3*XVzaE~Zho58^EklDTYWi$Bg^ zaCmEHA(;^8qSL2mN-YwNq9Ji#8ixVvt;nnIp@vx-) zalKfEsIF8Hk%}S2SwDc)Q(&t;39OhT5NTRB(>JpdT`%s-q{2-<)Bj@158wS7O{o%! zH+bYpF6QdSkByL@=|+pEgSO|n5hW0FRcHpToBZ>^)K9Sv^UKzU0g3)o5mo+nTGZCBZ2qww}x@_ZCb|Cuz4;J#9)@Yp{0{HZ!zt6(P9c#@oMuktC;wa zNHq}I`qa>$Qt}V=FD!WP0Op3*{wUqT{59kzy`W&@EdwRBK;1hs0)HGzxA~Bs!9Oht zroLfkpG4eKMcG>EJ6m{oT>ayZ*^AZHw^}8-qd(%xXX|e(w`&9WXm3~1RB_d=J|R(G z843)SzZuq7+=0jxjuYWED5k!B+URTIDY0Y%>=AJc8KB}_xHv~Ka;|QsTY-I!bUE&B zt~~wxOHP+}J1s0A`B}6kuV6UQfx#KVPd`<|=shv_BfePu`oRD#*GNv7O}OeClgpFK zcr;Xu+0vCuBg8}xTAch*Ax36#|E=J}f62uSI^xcwehp3{D=8;_p7+H) zvp!G`JT6nu-GpTFN@}b?m`cf!OG63uI!L6WD3^b35Z>v$lKeFKuWqX^(Z^Dkh{7Re zIn;r-JAckZ(l}D5kgBr@c?b0NG)k+~3eAg(t>ena+9DVMWvAo3MUBNZamx!|@9uL$ zY|)>;KcW1ZlxaNnL@bPzEC{F6TcwkaM3W#)tycP^2R>V@_4|I!zuF!Ab9zJiOz&N& zX)wKG@A%mo#OO~}{g+y=va72`>Mq{7$JI63KWvrWsWXjK?`w%c#Cl>Cu_BhEi8t`{ z&2wI8o<$SG4yAi4fRrC6!++jzr0`osEhh8%1ny2a$c%H`vqe}?2ENDIoXt+|c2Fz1 zVn{%*sIhu3#jorNx3uTMd9AOAM<-wcy!!>b+B>p52r}Eb;nI^F302E9m@X>hkMnje z4`N?-Q&R2ROoZUO z9Z4zjq!{F=`b?lX(%#BaApu8hrfS7Ex&~1_Fj$5E*P{#cOin@kUDd!KFO#W}QF)fY zy8Ov~2m-Eqi?-hJ+o?=cl#~e1T-=-ZmJFnHBWt4I+uuBxZm7R_&S>#Rf5aId6>a%7 zp7)9L8(&?(nS2#NKU1qA*X5%X9}{n-Un%BH1)yF$M-xHX>c6UD{y+ai#KS73`PMhS zR8Yc`b$p4r&%g8PALuNw0p&y=9is`pc)kfjc_J&heYGHU2S03%xDC+A%~Pa%ZX91% zuagKa&FQRk?ye$FNf~U{msE0ZwXZc3bwq#>rxu__k7p>W2qnt*~Z2zs`WdT5blU^XgxSsAWC&Yu_r^)UsZ`ftyn znqmOA-k?U98H!~NwOJL2R#a5p){qBXr<+)?9GmVsPnbs?&m3Ow=klU)W*p`}x7Vmi zN!5Y3s$C7GC+m%q4guK8iQF%T6s#OG2|j0Pm=Z{~3Wc|TxroKL93HN&bCxLQw4BUBs8Fg2KI-M#sn83!CC%;(V;u zd4@}9xl7%R6=yl8Z5lSZ34TxFok{+*J{}SQHS%nNU$4yV{mj#AaC-wp6y?Lqieb_4 zwTisFa$h%(fEE&N%`gPqxER*{C8IFv1gB1ti#IRmrZTVH-V$+sGZ-lGc*OK+2Jw|& zp5IUcGVTpLT)+Fs#!Gjv)jI0$9CsYZ=}b4>viJp*mW&Gi(&8(lLL~<35A_?=2|XTQ zdEBY3i)CVYh|}Q>77gbM`^k&0RTVNeU!DaKiJ-`Hfrz}q`^?=lMq>h?BHSWs>sh4G zI7@u%iKGp}ir(KOOgX9XmW}H#WRpco6lJ?18v3S1;cs%UVb>~EurIr4 zzrT3ScPKWxcT^s}RA2sRt3zyd<7|DoIs*a#--xg2z=aLAH-q`$tzt}wf^mfUTbnyao8)_mv9)l$d9$7KB<@=e z{U^`U^pu@4H_sy(3|_XaD*v_Z>mR9Kb6h&EHN^C7<$h{lc>`STL)D-*ESC{;aM=B! zt5w#PsId8MlKH7 zct4nv*HonLgvq&0NWqLXZE?}+e9FCj=g?%t+>}2{cLzZ-(T3`tvSZXal-4;alve*D z+Eg=twvh+*q_ma3%_C(>%D-!*Lzi{Rp`|;@Ew!9@kY=;h$*)9ob?C?Knf{5uo7tpC%xvmq6Bb8mjz(KKTMfy_vt^Ofx?mw!nMDrm`QQspt6&fP_ZRhUF+)R9)#`YGG zY=xUqGmha&aMM2}0-Gd>Cs!*n7e33$#r{ARF;`_H(1^N;e<6ao(fzSchOtib2`Sf9 zu!kB>uG`btYC{JHJMB%vO}YQj+9%K^te8UaH|UZsD5J@VA!EUl@t^1pdL@v$*E#&5 z|K{}}RXe}m>`=&>E_g$*{rU@zd{`3|wp1NZlaMOJ8b&PVdE?cOZJo6369mvDk06oo zG$9m+d2ZCkl)k6oHn+Nc6@-3+SCR~KG@(4xsrVDuiZ#w{|5o{E`#e`qgpew&8gXO$ z9N0FWeA(#p6b~h#h+RdR%umjAa}|?jI9xedQtbJTHlv~v7P3H4EA)ffxeI-8pu@6Z@92k*>AcIWR>c{r0A1N~* zpd8+{%y2MDK* z+~ui`wLxP8WpT;=5o~p62Wx;0qY0Ghi!?fWt+boE$K1&4>PkpPgHR%sl%sdix35^d z7QBsoVUtbvTuXou&~|hUviamIY(U>h^hbgGw0nexXG;sHO+gg-qe9C7qKcLr67Lmh z2^ldW>*`B~Z$ZtPd!2jT$7NusATyz$I&eZT$H-G-jbFKX7O~(i6zUj3QoNc3Vw5j-c=KZWuV~7o>MFFq6LyLj`o{X<5 z@#a#4wJmGpC9Ld{4YIX^-z9?V!@QG$GMW;GQueDLTW4FO$RSE2rnmY1tG=ffoB8mV z8pnJp9^Aheb7i~HZSNoLwO($e&@osJ%e{eMU@ME&jb~54c=`X*_9onI9ml#hehT9A z9Usu96_Ju1=i2dE96$*Xrx2iIC*QePAO;E%3BUj-QE`&rexLWP?!7la%7dhn<%rl* z57kxGHTUC34Rn$yOP)4 zUDWQt$B)spcm#(&@Gn8;Vj6?-XjD6GAD_V}s?9N!gyEE71dGgJV?Svh@0_-uo~-gj zkBT(u3TMw?tnfOxm3f_TyJqz265c>bl-PWL4>2{)0e&+c;NJ_VgYJK1aC-@ltlaYC zXoo@ae@PbI1e(fQF#+B09-K+pQ`GAg*i*h!5OR5|WLtTQWz+4Pw7P#j-zURK8AJ8o zS(1L`n~*S5Y&uc;F)L|j&S#&~+?o^q}F%^I{2|n1lT4zfFc4mmkT*v@^4s^ z^V2&!C+$@AV2|{T@^wE5F*lw!CR7{TBqWPy)CT}shpFopj>89__n(|^_peO@pS7hU zGQ>Z4Vjd;)T51+F=)XFim<{Lbq;vRan;bndTAhE(X5Qd8qBY655&<4<->~s>FGXZ{ zt!F*C3mH6F(aP26TCq9Yn44O|g51xx6+hpkUyP?RblJ^? zqR6f3xmU56Wo7881Y10ci^A$I2%Nn*v{4G>ji0gycYXLE+U?F0sO)hlHt$_EzldI2 zirPmktUv(C6XB#7mgs#Je{`SdtMa~YtX`g#m(%!alK)JnvtTDFeSC5mB7;s7l38Y1 zQ=kzUmeRo^DT-jDhZunL!qyaYsSPeJy)-XY-rXk~x|#@8Z&X|IQ%56{t3qoUHOqtC zf%gh?rHS;4I08!*Z{&!EY2vuVQ1!u-cQw`S*qdL@I3UUBOutgXg5+6ZuKin4!$ga5 zsZx9t1H0UEol?(!+q2im<+{)(%0yLc^3i#RSU~n2?L=REhu?H`MA+(WN~-47L+WiW ziuV!gSKlU{h!o`1T4a;0zA&6`C_YJ}3bT)1MzU?5p{8KjsKQzYonfv@t5<#E1wa|r zdNMb|TJt$maXU>&7lHx54FFx+?az(fx5U;LQ`7gtmxuYsRvw>X^Q)bD>EAu35;M}k z)aNror3tOeLkdjMh&<#BD5|BLbynd7XP++vS@HRJK0DOp>7V$p-rSx7Wi_L4vnnpz z?Sj}Zj-yIsmS{yuhJ+>_NIJdr+SYn%msYS#_^f5>q}#ZX4O7K%uL79v0^Sc4iwP() zas_SF#l{NwD!GNLBvqj%T6OE4_P#7H2Rr9%n$=F~jqQh(ctN5E(ftzyh~S?i_Bx7x zZerY1Nrbe|7@)kVWqulkI+RXgPzWZfv-W$^-Ag= zdNV+TGcR^p9SRII$<~DFc!+ZUR*{{e2F+72UY$cW(HXXg)Eb)=nz7XC+LC`j0-3uD z7Q@zs3Ph7$z2rTuLad;v?JqUuhe7_>gFzM{MZ)Zo_IOW|iKaT!#6gTRWE~kZ@<-;W zCBBmzn%0Ey&5O(3v9M2V<mx?;JI| zht&PT@ZBg2{Yg1)wS|X(0c+rz z23KkPj~L>k+Vubx(M3JlkC_Q$-g;Eu`h%z9>Tk8DPv1TKr~eDXug>vy)4}qZhIFq< zng^GmeM$M^Cd+ZkF&Lyt19FD{xOQ*{25-~1|1Lm+c|9_>+K;wmo!;KYy7RRBkQZ6> zSb88>J2-eZAP)W)0MUNTRKBb|dGhXVpZsrhyS0UJu>FY6zv2%_fjRgw$g=g}QquL{ zOUa#(NeWQ^U>-nFa#DG$)I=B(k>97NI3bP0w9<8CahgY^J0@1K!*rcB8l_M8J+s>B za;Okh^t=$U^Z|R)&^%Q9P1+0h)SB)~O3~ltvK&y_ z6x_cCBdMae2$o!2=7ENoZsAMMEPd%)Z_c`t_5x%>(GI`S$C1yw%?n(-q%l4lMyxgo>ogYkpNmZa(6K6MuhX?EHf5J^Wz z)4`1jPh#yMXkWKU136tE`aYgd(!ViV&oLbLvVI&vacUGB`B2VdO-+pzEw8ua^Il~z z=S8iUK5p}mT=n`}D1|A|NYC9UDg{yDzVx^y`hyFDFfQm7!7XR!7ob1c)fr~(`j@iN z^O$~wM0(!}9B}uAaiD0Ow~D2qB2c*;`Ywg{`DJyBbf9Xsf+Od=+UTLz^1V)v6TqnV zb2AK)R?h^Y{2ZIRe^Oi)AEaNbh5SOLg?$RkVv`{)vztyvL&!kPfasTR+lfY3S`(qV zhQJ47&O(y{cYX}nmD=mq^S$Lfg69*XC@105&s0fR(Ib%O$au6qSuBb;(Mp5uUEYjA%_N8)@1cD1#x0SJjaL#c%0F3uP_O$0{RR z%pMVa0zAo3#YjUN7GMR41%dDbKs=zdVRwMrR2qs&N|pBYstA;f;kM_+fqd#U-!Ib6 z^V68e6?1SyZ);chOgWWzu7Rdh@zyDa3U*H9Jw@>6Tu!gfRd+g>VkmG2QYdN@Ein~I z^eKzFoc4*r-a9#^P^T)LP-*$AuZsVp6bC^m1~}$%P^n4VWcv z&0arNdWx6&C9)-finDDAnbj$^T|^*F39lR&7DsbAO?>Q9$e<*g(qDyL$2A>>b2>rC zS9M)=x$-DkzdjtpmUGMSiKE}sN8A!7-5JDsp!WTP4DaRLuVV_W92#-|$LBsmMu(oI z2#WRB2)9z=(7T$Cu=(|mlDSZ^pLZq|&tleK#L>wy_;uXcQ~ZYt8B0l>Q=3(_d2irx9S}NdW$ZEw{v*a47;*_gWB36 z-sm&uRq6%ySA8*!#+KJ}LaqA4YLOD|6(!M7R`yknvipuQVx6NimnW%wa!(aCk6_`W zJUmow{eYN>%fz-5qdii#*$OCPLRV~%no)dU8&*x^MIk0@VlpPE{2^PCQ{#!)Crgrc z-IbbLFY|Tp1n)2NrTP6_nXhV7_e|UZVkd7}*Yoc5;_u9*I(#ZNa=_xggfcBph!7gJ zw$NW(mitR=~OuxsfO-H@2Yz93llJIry2=04qW4`0l2vY2hHPpey1c)wY>t{5AH9?qrv&n zdk*fBj93k6IvG>Si~Wbq3F)sdk%mpCPuyf0x*?x&KI}jXgp)<>nyQ12aj&*@&Kg|L z|B{MBelU+W62RcEEeGhTYYJY&+;->W^wc7G5Z)j-%?fsN_VFH)`#!NU_BI1S@|&Y1 zz4?Jo=!Ig3Q2}DG3u6v)2~m|$QqJnL>s3UJ{1T8MbaUPn+{76Y^Z7-TGbg(r6N9wUM%M}mo8Md@(RvQ2hn>wHTmHR zoqNK9t-~VI7~~vI;~2h4vrYZ&DTmR}(*Tw2n!Z^S9|cf>j^TGROJAnRGbNFQ*g=U<>BU%1@+G-|l_{6M>8c61tc3 z0aX;Fc#kJdQb06TMf>Q-KEc?|vW=9HS#K3B6m?QtkmwfQlR#qpNyn2iBOPloq4Eh5 z0j*&*MPKH}#c=s%2-ffuFkLfk8frP;*FS3Ft%-wB3L>1g}t0$NjV-!yOjoLxQ>!B-btj!Wm%Vh_{drHA`f~A+zgqymhRu z;px1q9Pt|O?-L~1K%`y+qB?vX&k`#J+Ot9U;MtW{1_MT@eH8RvelZ_B~MVJ8X*W119>TR4(A2u zPxK4JT-qpK68MeyUl>pgPRFLHZc_;ci5l15R!Z3#@H zpP5>wi5$Hmr&=SiR5rtm_(9<lN*eTNYbic8fGkYaqe&VqV`D$K;0f(dAwz9<2!aM0uPLkd1Baijw7 z04>l?AK+{$z>ZCWcx)UXiINu3wJ0{>!oF>v#YLvl=i}aK3WZ2WQk1rs_ugdG=LDLW z?J%YX(h{OxMSKzPG|I#Z1iwo3k=6#{p*WS{qPSeAONtU!8LWa4K&jU##cV>s40Of~ zydblWXd`F91=*1f=L5Zw<-3>j>CFsTz&w|@>@l9`V3N6e$QvWNNKI_HCnN~2%nFil z799i`XBcKUB(e=qr#CBTQ2}O5Ab*eK4geA;@(fxNXmw1+tv8OoP7JDGTR|N`-Fxjs zshQu)!9MMiXp2>wI*n;CvC6CLmo1o_9W8jR@40jCRpRDpjo6V@U&4DML;$!J6sb|^ za#&RwuD3EZ+=^7PbUzk9*i6ub7GV|cy0d&a#a2P$t=M{4)l!*?X#eg$lek*mR{J_0 zdZp9!LPRRdNQh4$y#=K)(?KS$g+eI`w)M-@74MU-bq{sLaLrd@RoOU=e1adFRslan zZ)tf5n@}k>l{O{wWD}X>PY9FzWd9{^!PFaw zoGvK)i{upyCbQ&t?Rf}u>0=BItw~IDRmO?e&|Tu8+mCxO!~hk&jJ3O`b$w~c!JL9^Ehbio zcfna>bAK;MN9Bo2c_#rzIGTQD*cq2&tViPshcK=@54&qxX)$JrxQR7O@+7;Vwm_&E z-)6ZknmQF4B(5$T#{@ZlC6+Tp`=P48rydm4Utmlh_J;!qA(9)?Nna&B5O`>G6d*J7C#VNL2>k;?8{@>Pns4>eeHu@~@n=GDZ+bA$hY z(JpQ-3ejid3!+5W3~zefzIk?NM7l;2OP|&*+(KizQO5~JISgzpjpcH@5WZ6ek_UvI zObJ8udk>JI4!h?#so8cAbx!xrerPoh>Sl!r!rgrq#ARuX$FA75-vHkTW9-)A=3xL$J`_R0V! zoArmAxwhgmP5M^$Y{JprF~RWld48W(CV1KZ;yXm3+Es8E4vR1Z(XNxFzdz)p*6Ah5 z0&E8i=Y%>PTyaUYM#hhVciBh#M7<(g5gQ{X+|)mT&(=BT?&k8PimQztn| z=(BN1eqy(?^W<}ml3{(B0l5OgG9ip=^(A8P3IxLi{%cFp)sjf;^nx_B6eNbfMuVAO zM%>ytKw%rby6FOkjmE$8uZJ5t!$y4p2F5(L7`-j07jZflTbmc#8+A$6=?)7&UT(`{ z+TdZGr}RZ8_0A!Fv;Ex`KCznc7&LuJbpCM8R@no7RDzcuQNKtPo8#2w>aC! z94py(nTg`!@0+ahPxa1oX+-tU#@*?k8nAzYulQNe#GhFFbZ5EzliS?ou!ZK%v4XU` z*Zvu%wn|p_3?zLNU;x2iH4xv)5T>;5hO*`bomN6adcpO>St&Z4Nkxq+ zV)0jLx&nsH`a06zc;-PZ+lx9-h~E^lZhapR{mLU4F9I1w+kk4k)cS1H^OcsX&fQoV z7Dc;|5s6jBPdaRjHfK>#Yy?};9l3F(q&2EH{x<9X4@z51`=mP=Be}@>QEz+-94a@u z5F8VRZ}5nJzxZyfq%-cqIkrhW1CFfXmAIZpD@y(Dvj6gd_K)FUv%Y&sg$FQZLrGub zg_SUU!J!CvW0ig`Q%vf$`5ILrcAJ9xu)h$x ztE2K3OSYQcy#5)?dDG6liC{?$|xmsiqn!*dI^zNf$yp3?p2(N^_oQ0T^I4IzNi zvoYL`ukgEH5s^UKwh1x19kVhfBXb*v--zS2E6fk>eJ)N>J4#ZaIrMfXTHq?cgSn|wEp60tJ4Il+G2ryaa_3<($cMQpo8;cLZ+xpz_RtP0ngrJ}h36c;NjVCavO}L>0QZWJ#hK=Rs*tEE03cB&PF(md$-wo=vwlr|bloi?ijz#uH2DJ^-Yn=TT)CK=MVMPwIT*Ay`Vf zo)+abh_(HqKEgIJSCsAVB{6+wv1zF@=R=j!$nB!KBoaq{v|@$UWTwg@-{r4;I1(*Y zDUiX2)dKjpNN@Hg(hGuQl-4l6;P0f}@x#0Tg zLc0k9S?wQCaG$VZ_96adJ-_&3m1#qiOc1_&8?4u`!QQV|e8^J`D*Nv;q;c^pw{4!lXX#^z2O85^cZY;+b+o|uruBx z*&i(D!mGf~!_C*5q-IP)5LV%kpxdQ5>B{>;`q$vRUY2Yu21xk|vF@Nli*qE~@l|(b zEby$woI!9bes3-1sMT(d3P9`?zgt@;grKzVn3w4iLiA@@E|Ms%eRe4^Q2SFw{wN5z z6vHxTV>?YiNd6C1EJ*?d<*L8^)+Cx%4FT~Nmo1L2EEbJz$E=e5Ghw90&w}y?@juCM z$1Q4FTrIDy1N>t=)n9?K(7Kk_H{L4*CI$l~dEx%5BFI?BZ23{Mx}@E>3%U>`#&*!? zi%Vu^qN^{y)BUtYnjOJcmv}K(L>sOjOkP1-voXNwb8O3WCOPpZ-S9GM`BAC3kM)}$ z{jo1#2XXiF&%g0bZC=O;N!eD;F|&p%^8nnE-9X8}Wgz``YnLy411fW@ufQC`+ z$)2`Dd>(E!zLr37P45AiL5^h=8cqE+|)v8ZDl1)3-*Q9NXjssqBc2nGi005 zcz88f)Sp`uG1js{<2G5!KZ^|3RcaI<0nB8R82(H+w%a|HK}xspvb^Q0jIpZ9IQLeq z8;t-B=W{3RTF5De`FaC+>R7H$jT?}xQ(^ry6$dFMi zIjsneq|sL-#Ssy^+LK>WU!luc6xLzbyK#aSZ%Mfd#kUZVHlvL#D>1G#^P;&Um4;*& z4K1WH7Hs*3s31;zOJ#gmKt^+wU(xa;5pCNnWpA zN;)!=;vcDB!J{7NHVY13N;%?uT>Tpp(NM)eTx@7z4x3tiJqm=WP1ur`)0@|KxVttQ zu?g=#_wCU#XcWBu25GX^Jo#(AfnHF%dTn+tUF_tTlipw^A^-r6X8`jR_{%wiDfX6! zZOahY63%B(p80?t!U?U#4ply~1kc<~8}1z_ao(=e0KT3Sj)+ZA~imJ$le*{YGK zyOuR(%zg|e3Fa4nM>Izcl|mV6UQk;7v+1_2CfiJ@xV7b5n&osW2@G)S>2~@Zx7mqx zXSuvr>6q&4awo&=Rc>V=#A|x67PHP8mDUNzi252q2h#B+OcdmR)+3O3w?N}BHpXvb zV=NvmE0023K)OkMZUu1J#FPPNcw17a>7b>n#;m_NV-yw|83y}-Y$LF-8H6OIRTtpx z#CFiyo;Z11Ku>FfiidbrES1GDT`>`FjB5t8*eqjnzt@6>N!ixqZY-1$M6|wQMiX5? z%NR@8nIDH0(c$i^igYPS_a&=05X~8Qvd3Cy`H1SNar<60$+{`FY8~6ELpj)EK#Nc; zUVDy$C>v0*HP^k?TzV3T`8@6YVF*+`^lEPM8)k8vOLOiLcOug>0#g(izv2WP9B%(nbx15sr z&9XGB@$|3oFfr96c874esXNS^=XW)!@XA7B@d-Uz9*t{#7)sM7+F)-k`Eczqtjf)6 zLkJ~uo4hMx2Z>O)?8}>;1{&;|^|S&MhQxb0gz*;w;Y^tj{JAU_$9 zmL=Q-R+j4sN4q1uh|`4~88LcFvWs;XOBV%+r){@K09|$tWuHKB|IX7h?9F=r$YRs$ zQZEhh)*#2G=uKTDZ$T}dZG67PkrCc1H$0d-+N&fnbq*4}-uyJ)bc(?U^6w;DLF3bk<=~6&pmX{~_)%|r5zW)U7`SEniI_*p23`6e zcgodChQ`7^&RAwL8Hbe}{+%UtULcU+M2NPL|$2q^AXF zS%`9BwL(A;6*d1-YcF4svB2JlfTwKLP=UjxQ+2l$vki8iB1l*R%ze0NS6HuAt2<1& zu6M$bVTPWqK?=jb-QJ_7tajo5E&0IA>t_W7AruLCQr(>i;A^Z~p@biGpX`y+q_d|g zSjNx1v@$!cV;2it;!}xc8@iiO4%yneYE_mUj9-@`rmfOgP&4t>6rn$zs65qhUN6n| zQn#eATPMISQ2q{2SBiTH$4p{CQq1smL!QzR%{d5I59TNgq1J-g-RzgO3rm27Tp&>+ zQD}6S6w6jSexN#Zo&~40GMTkLw#smd$7MBTOQVsVp&fn+fsBTtSq=KF>I0#i)GdQk#ygj42}c6u8XW?Ia0lYsr^_D2$-K z;6JiSh7(ou*pM7O>+vmwXZBS%RW7ATnT&qP{+g#?$seAj@9r_c8Z3neYyCBiMSGj= z`RE@dclNJ*yu76$gdt3n+UUYeod;-_u3goL7;q7SCJBMiR=NB&s;SAdz#a#o`db@! zi+$F%-o(ONe7>oWdU&F~5i+6C);n@g*FTeN zBio@oF8!&BD!@>a*}xwC!fb$avf>5)_50H=`+qCmPS2l1E5u(gB4W@)xkOeYcng8m zAq-I_90FMNpEfSnWTgLFHIoS|W#=rEhftlzpd~Yg1j3cY55r#T5k`4Yo<(`Y;Uv;? z0_S@L!x8pRvkv-~8Jw7ZE=BrD*eX;>ZTSQ9G&lgtU-3W;K{Fsyn@=n5sbDM2BVw>L zhx6kjw_iF@kiZVJIw@o?*rPPeB4FnpdYB8kXZemi@^m;@VkBSZw@W!zpwD zja$YU3KD4f3&VLze%&R75^Z6~DEzYYI~?z8xdN-Fs>3{-1Y@np}I_kYE-4e*kn`?1YOVW9g( z@o+p)Xm1v|yyUiyC4ouWyF(p+R&`IYjsk^3l;mKOd$rJ~B*BzW5;-YWu9j^>>$qM} zB)~3l9kvES+LC!QxyHYR{aaoxG05cN2jSt6AJGP93Gf$TxFesok~6mzc3^EVhi%Dk zuzZbkQ?%rAANoO&%Eb~lib^X}?_jSLwK2ZNqDzHYZ36~(A*FC=w zD^FMHq4E|%vf&ArSkc+X(DAIv(a6~X^7*3}6w$u}j}9XX384Nd44}_ANdxASqO!7N zR;ZjEJCw6eAy5V}m|=B1S?L)If_=gSD8U33zqkzZ0xw6@7>h^HoiCH!rwkZN9LhHE zLgCUV)7G@IUHq&xZFE_)A%j4P)7)!8h7~E|*A^KDDJi>=t^O+^zkUN{9}Ebz%u@Tu zM$4=k{1RrCWUG`&`&UB*=H-Ku$@7_7Z-#H-oF}+sT`0hZqBFr zk>X^I&?=^!nZ$->+-egybBkV3iByyY3XWGqD(1iumPMg0;VRt=|LBuF?TkNtJlCbI zcVYM`gQ0X7QQWII&Wwk9gt!b9iC{ez#)5TFf<_RnjijlD?Dl7(F+1A`zX`hPE$!U5 z{Zmn_91ny@tM4Jh?96;rkXx3FfcRg1zDu${tjTt|wDb_xS6jiPCfp^>ux)xQwqzH! zO-G$u3%WnfCgK$kTvp?3ijkU{lT^AW#Zm@-Sn+GudKU`>TBY+@M#M#{6L#aUU49ZF zAeeE|MT?#42dfeanB|c-UGKRO2LeHH*Flx;L>!BNEUGBkc44Zky-^~RAHxi@y8q!~ z@Xak5*~(D=hZtgXud* zA>aXJm@hfmE0(i-)|=SKen{>mg|{dKgJp-tAhfyTf(}(mgygOAiv-c~MwTxQMLa@* za1&!hBcWbqv5_WI7^4my)ioxDDH;{<{4VEMsHT}>ZS-U}g@VQJzVcEPf8 zCYL13D1s?{ns9HIsD4H0$7~TzN?N8ddAcxkkbw$rabki8Z}D4CylU~GQ{&>NBYiy( zzzVOStdFn8m9@&|zB?-*-`<93>EDB??|T$lTvcZi7U)y{U+pr5 z0QxgE=*ZS+KcX`AfoIa6Iub3R5?}~FmzB=NSlbWFx}d<@1$nht0JN)ipPrmN(;XJR zFfDVLzm_c^MAEpa>-2i%rx(SU%GmIiwZrD~=3(3Ag`?$iJ>ojMYnYT*Cx)X2N416g zDX9x|1mbP@#&j{dpp*tV*WSGnql)%CQNU2NJGe-kiRUZ$z%-Nm8-wIrrfoXl?GMLi zH^at9ADT+gPz)dsEUsc&Xk@)tlo4mPC#PMGsMH>!h1H1T6>cija1{e!cm>IHKPD692r<~NYQ*Y?c$tkjeb`gGI06lruJa&oi zZ1DIb+m$|9vwUdePnwZErlCJGwAq?TxNM9TlAQD1NWom_ZXM6M_l0o3ZPZR?JM+tD z@#k1$KABOaZiuNOnS$_DU)STN!<Zm@oxOaHcZt4d|Q0^;Fiy-bZ z@B8G9J*V*0_LqOC37)&Rb^Y1P?>@6jZKs$M!&;j`V@nmUzhWNao!z}~1jr^J=lSpW zq0}m$&-GBzgyd-c9m{fKwsaPiZ!{iCK%Dhu?&IHY>$4?Mk%%u2AgZxS!irtVg_Wrb zk-q!RW0sxmXs7*bt6@yo-FzrHg4yCBJwH3H9Udsjv)$#)JdPMQ$}JZ_bs|bSaYM zC{n>S7*@<>;?OGM^Z2h4{I&6LNz#aRZ&qoTi`s>O!^ zoxM#jFzbTrIN(`no!mECjyL>Of@$#;fc2uma)l9El_D=RWhD*}hpn%#Y&mtNR;$Md|T zNa6Q>-!GQjY*#EZ^IafdOHqh-2?Bc+2<#aGi34-80Bf{YK;1)498mCKS>g2SJcJ7Q zL|rCc2(MC>p(v!;aa2*zp2Vt^L4XiG0>r%G_Pg&`hr}r$fOl|;y){m;S8$3HPD{7J zPdP%fbM_1)vCH`fTR{zxxm>CF;$y-GYqEMTUU#e`ZHUWaEz>NBQ4o=`F%41Q2d>YtTK0d@{rWrfmCmt>}Qaq!*Sn2+|>pXcF#waUaR9|pLo!5h@o zql_~OrxelTV?#Fv&iH+U2GMVgBniJndj%7u7jeN4w!c`GMhZn7hKsnn3b}+wm@$Fx zF{U^>m7U*G;|_s?&UUu0Bn?=b$(~p;9|2kiwc@lG6G)vjQSF@>_i6UY;mPifsrKmP zd4XKe=cWSAL~QpU*Nzus=bdYDQ!wZ1QWRgsLNL74xr{R*LNl3Li3U~reun^LB8eR) z;bm}&yjs=8@>)@1YGCsupy5E+L-X7O?9_Wj(5p%MV=YEuNCIOo6cxXW^0Yu58eakUT;fAP)WWEyMs;nD(lzb6ZcAt0@l&&6um?q(*2l4vjK&7;#P$LSCOmoAq!zJQ2-Ttk_lW0-_7ae@f7<@ zJPY+bnXAYtQBXNGDOIlTYCymYao@T{ll$7z{E@;GKAiTa5I#92MCHg2(1@T$$D@7m zUF7o0MWGP!VEGT-n08Us;IEwZb3*VyFK2;Sy${bFq zkl9c2dRVkmc@Ylaq!Sze_Emk%0SE-J>Tbuu6Wr!o%*4b!3kve6ruVV5u!KT#8Yf4| z1`Px*!ql&>P`@N@c&H?!amUifX`a-+a_FXSVo}|`p;%;=$vZEXm~w!Xr|0w4HCgb1 z%8sPA$EOMG0YN>NMce7q%uU7Y&cgJq_iQ|--K@H}$71}U7Ok|(bVpGHXl2 zmEN2%($tb#|MYfq%gqx#aqE_@27Dsy(fjVqzxHjS(!I7F0{Yd$pYY*CLPL;=+S9&9 zC6Y9}m`)?9LYw^6Y=z%>z!im}073+DrRKCL>I?-pPAr{&v>i;Yg*ebw>75~K1_${2 z2;NsT2*tvb9{S-E6iPBd_b0zW3b|G>|MBEi^yPPoxA;NtB{AvqSJ%thn_=%&5iMUSC*tQh!Dygh^&%+V z0qVJMOSRk&3DL{x_1JUY(|H_ewt6?5kyP#=s^$J-Cyr_}{k>iJpw6eRhQbT-Ya;tx z>SR;$_XJ*XZo=Itlr@K*#tTg*5?2WmnZM=W5jejI4e#g>swDC)+*Qwa4$qtNYZigy z#T|A#RbZOGvOk1TSdri-tJAAI*X(e7 zsNONI5S30Qq%7rlc?nW5c;jbQKyel6J*7E|80i_8=!Gt>xKds9`sp;bh z|7RW4DibN#byR{y!7y%rJBQDh5&ot~BDW(Wi966*0-OQ>nQSx+lKelME-yuu$&+2I zcQ4~>)%mQ)0NkJS>uCt<6;u48*~HS>Cc&1tVj*WND5M*8Kr~h3leZdi zI`3^oOemIkg%`NkiKCKM0ZsJB`m$AvC_w;B!)$|SmVuft02|yxbZ_LAIAjVbhNe%` znovuc00)nRP4EhT5mG0~6dUzobh_L`M(-Y~tQeA-1EoM<8Ty^mtMnVil2)P>q=Rq= zDt3tS?{$7HCuedi1qNE;i*SYvP5P)meh6)^l2D9PTmF+hWDJ;_g2QyAsAN^Zzy0{8 zn0xH&hI`u}f3lYuSX!)yCVM3)@*@#Jg;xGuq@3jZ+l_x38{imiXoG<3mjpvhUVb>f zs;R<1XFrYZL=STuQSJ&0W&EK05E+v3NiYBgLRCD_&o9m?+B&_C-_%x`Y{$>h^)$6a zW@5UfN<8tC@8bvMoa4t}cv(Ab)f+u3jJ9EW9mzxjl4 z08F#3-*0{W@WI10B4#;?Pien^p&+uL&VFiiNHrGr$qNZwA7S~1*OCHYlv)l&+JKHb zXJC?cJ@aTS3`@jIvCIcVFpE6p5EihQ#ZHa*%nQLWDHC^DMDHBP#t3#Aam zV;2mdHnHDTjl>V1S8U`=O@SbEj{tMo-HsmUcN;gMd(-2bP*U6|3JY9CGXhPxk|v7aOAyxLlw#7_*a{8Vj_50*-kxl1dSEnf`n0%r5dELcJv z%!6zS9n65g8~$uLMCywLIlUIq3#QeqnEVj_FDo3f`M=)0(iEMQ`Fi6!Y9?*et$`MA z=y~mVvfyHzI6T3yVYNE)Q+n4I96k-sx>-4)p8%xP!sktLFYgIkkkXZuCm$?7T_i29V~fW!tja zY905vjLgN}$qr4y4Sg1|$?okhY(bi-Yw36#a&^WMbP9JE*z-JAj<0u)_tOizEicj} zri!ruerRO`wHQ5H&|M7SwnSMVz79!KVj)R3n{c)t;w<%#X-*bTwCKP#t_6VFp$-d#5L z_T1R@+=fVRBi#|^Ty|!j@1ICumf|A9xSa)s1n}9^`Y&te$2(^~bWhJ(CugnB5BNCf z67B06#igN7j_94oiSGPQ#vu2ra1}Pj5WEOSscTNJ5QP*#x*g4jJ&8O<0g{R zNz;nj+Pn=l^4=@3TdlQ@^{;KLObIFuh5UKISJ7O;EH~yF^Kv6kZ)C7pCjrv}BM_EPP}hfh!|L zYGzy_Opn8-7&&Gpg);%HSKa`#mckJDNCTD^ma|e@BH?UquI-MERP2L46b2w6gG1T) zHc}pI2kbI!0n&rXE0S|#uC#j)%dLUtXK;5%WPC3TKLG1nWXw=~E(egjUW*&S(?PJT zQUv?GnT2`}9XH?eXAH$Nbqp3m>pW#bnwXea)Dg-XU3DOVHm5j)^(!Go-ZlL_D5Ped zbVBcO`*1xK8pmY~$rX%f;A1H?kNzf+3fW-rJ0(5Vf#LTYu`pToZq1cEUA^U)=bK*B zxzH)fNNNH9UCR16>hh`fW;s8Nb%7@S*8$A-Ye`qKaSX>kQ8KNr3re+5clNNY$9`CR zhb7S~NW%etEuD5Q{<5$SM3R~-g z=hVZOVsOi$VX-B~2lx2GpdSJ-nIeK zF^iNM^Jf~|4d;S#Mi{>w$$Z#tw)g7)^`HOsF%}J;?)Y#T*O{|A8$=z!?3oaJ4VpRJb8Bq>7;^~L!y+I6eV$#?GV|V==9)_;=!V!bgjTP3IraU9l?kl zP=*euv4*k3<7IOE)jHMudHs_wKCl1B!%s2?N<+ed!2#sJgq5KloZ&Uop%xr6No0Be z2x0Q1awz+==S8LB zqxzSGLnh=vI!}Zu#4wvNlBdUX#d#lT(HL9Om-{a-IH`(*p<`H=YQC$o0**3&3M1jT zXQz_bA0~gftD`-YX*@+wKQ#vx#XXgOjK*t|mnJ-BcKueZb!)EPHP*;w`KWJyrJv-6 zVRDIhlk|jr_2!zsqIMR|>GR0!&<6by%^cNF8A`csF(k|7fAU9t>UCAf+uHai4q0fI zamrN43fPdnIxh0H$}xTfwa`X8SP?O8?#M6^q*#0otN{yhl?sDO02IXekMrXFGE4vw z%j^o%RDkhjazSRe4tAD=i%dkCxK#E&Cn|B$yn0#~IQakw;tV(HY6C0JHsGogH5ZqB zMv>Fvc|fz?DwFbTNb~Ay9hb{12mbknR)+5vVcz0brYQ!V%0Lxz15bgy`qUg_Nj<5F z|CPO3heV`>^~{4=$GYn!`e&g0yE>JI?nH`}-b&-8K@JBeLB`)FczQLoiRr}ziWSUp zk~7#7m7@~s2x(XaJ2`Y{(Fbo(8b+{CRfyE0VPA|=nS}N^C6QNhFnGMJQA4alPH!43 zHe|u4LJ->uJTKif5n@o)q3FEH6n;%*T*!W{jEkkJpBCA-xm_o8@njzJ?% zgv!CLpc|WiN)1-uoi2npSy~DFaG==QrA8Ui^7`Vf{4(yutm}}_`CUuR`jwn^`ne~b zuOIEgO?OUOjCp7-ti{OvJv_4kuUB5F_~%Cco|~x&$zQrFLE4n*SERYwFQ_YM!>=5N zm$Y@z=qu-31{uVK5GmW-@k?@bmnwHgFzXy4*}@B`!bS6 z)bn#hnzr0Ix`?5z`g3C#$&tD~?zOpie)7N))8$~p5Wf+I8mwT1KN7W51bHA>qCG{Z z_-0+9Z7HTlA1kck)#oX6WaU0b{*n9fdG(&qqO1;2_l}BQ={|yPepUDS_`dGr{%ZHW z7u^@xJ0HAUuM_4!*Jc@{tZeDX9>QrFrzxQv6D>Ql(E#|GZJ?CwC}yojfpi#?l$FjA zY}3EGj&|V{w(MbF&vdH#8~jU{c=Q#K)&u};F0m$-r=!d-aIFMH%R-;?zHe%w!e6Q6 zV|X}c8aC$SHQ=qR-jSB|Q=LUhn?QY{MpNoL@571IV7}3(Q8AlvmCkzpk@Qj~S zOhm;IfGMjt>wi=K>Gqp{ePal5Bb6Gl7EOWP*e%McOSQA#$RyTaZ!UqWhM|)tQ&|+< zp&sIuQV#>{+CXenyi&pU7>FvFMb>{DZJ;;*ismtW)f0pK@J*erg5ySw^k`qZa~uUq zcTTQ}G!PDrl^!lxR0{;2*fi^xg07yafoCc1+*U8k3BGwb9glp5OidpnFkt4Z4TvFN zE4&Fgj6K0TiOEX6PB+Y6bSN?`i{lVO z_wwg(3fmMzIj#4)muaw9QcOinye1)Q=(quEYN5>f!%#* zZAFIT37|4+%Z_V|MC4XS3o=yD%#^0GRM8~=8etftY0g)3?EvZZI%$?=ARSYO5oi|H}%;_pr<`Cq@^nw$CH|@b#o!mNRw%E8oP2iUxyCP<%ZUMFvpt zGEa@?rXO+aF6Jp~?lCvr;ui`)2{moX37VLKPgHC&Yw|mg;Vyrmp?ov78#m?D2^;)@ma>g-eT~hn@ zYVFQqaIt$c3W2|KKyWoKg~RSK9-hW*Bn0B$FTV593MglswusE5P=FZ6KKJhd&zLfYNgr@Hi#-go470V84vHh8pQW6J*~ zMD3z2Gh+F5i!kkHjip9b-gJ|`iQKz(o7YLyEPB@&a8X!82Ar6%6I`pawS@?DW^@EH zLSM!3+>mGMoPd?-cC-^#``V}20jd4Xv--o^gNF}y4t5?M)cP0CIPd2#H^cec16XE_ z>N#Dvx_5Gf<+{^-+O6Y_I6djM_8rQQS@6<<9cVPmn(ETRe|F*7HpA47B2lA!S zOnRcDj}U{4C5c{qz3&;dj+H+_3AAV_MALuO?USoF9&UV7Sx@i*RQgQ_!Tb1Aq)$JE zTCcF)Y6&2fr}bLfSa{&WLr%BqHyBgCdfZ*sdzY7U;X85QTi=woFRoraAI`b?hssU8 zd*bukdGO^|wRRgKKSVM(hVx=7S#rdy+9KY&SbWg(u=CVwUjhb)TK&;^ZE`m3za=ou zL#up4440A6UoA%jR$}jLj5z$T_=Q9cKRd+vx@QbxunSeKkaOrv&dy>Hf+|m*kpW?z zurr%Ig**t=Icpus*=Zu-Y57U(_~0Y}&*4r`Bu80bg=hl6a^%f9qARhHiz%9~fd>UvY}-Kf5XUYR63Hcc?Nimp2?ioQ7qFR_Vr zp4gK)CeiyE;u1L<1+i7UV1daSyXZ!_+K@VYq5GHf=6Tbr*FHM17cwR+(hHsh>6I{u zTfScFj@OO zj++>;Txe93Aq1Pw-ZmDa%>mqZ*_#sQz;&=t!)7tknwf-s&3jdLsA)Mde4mpmtDNM( zH~v(|a_rSOr}XDuYrnY<3*@Hx@Hx`!Jxo&v42b~-RGJ4nB+7Sp31z@De)6K-z|IDq zOKvHCe)hQj`}&vURjL-+;syFSM|cI&Ys0c!)V;>IdmF9hJrr-o`WCvw4hjP@w^pCc zl4G+!Plc>V=98w#ZQM`v3m~Peu-|ODHsA(IIF}W;vE#z}TsQEa^^-1vC=j4+hI`Yi zV~o19_KloQp0r6udxuKgtn5d7?CY_KHI<0dc<|ss;^eZRi8{;u3iX^x^oL)9Q>Fn>;{iy!QCb|1xZq~abu6D_VZFjry^?xPq40D!r;+cBm zo}KC-aJicH#EB9_B?bgGYa_32!X>sJh^55vJJR)k)$lo`4&U#+!)M?tQ~tRr=ta@v zuj*55@SR=$0<1vKLwTbtQe~+p_8?gGAvRKu|1?b6yNAyb{f419_O63TfHY8EOdNca zYo~#(ir^U=6zDHc1-|lVd!N|NiX$#=f?Ln)|M4IBi_fUPrY0)yb=rH++UG~&H60*y z&^}^aD@&S)+rruJ%9T7hZ5~4zUd{^{mZ_jFp>QicH3Am`58`9~U81+{2(_Vs@#Gm< z1I50Hh}A@z6bqOf^==cT)s|VLRZy!qz%E8;{BR;0?ZmaeFQ#hfh{8WIUG7m*gk=oK z;lL@t#kMJXfdD3i5HM!wQ;7V;Kqr_&B#*W^+Q<}oKnSM?p82o1UWEt869!LG*x%{3%b`GYyP3(veojjMJR zG>V1tDz}bK54~1amEzODC1aAv&OhV?ka#r9%jhk@-0D}6qxuR#bmGe) z>sN)zF+$JL&Xd-j6r%J$dBNW3?6}H{2n1##`WNwpDOz0L!@RsJ+nIqGEN|z@le3>? zcsoeryH~G%3wLw#M%d=}>ziuxmN`M`c}LrmPthL`^d_N>^Xq-kcqo~f?Y3_&Fkv4N z`&4V6;q6NdH2&_5E^CvF>ZsQV`-3keUF2ast0E$?P($*aX;wDAdW6#;xKX`#bvc#q z;hJ~9E^ouRPDT=mxV`7hFiNC55#IcYpFi9S&ES=L2bqSy+wI_t#qd=l7!VkRnjQ;pEaRVI7T)$GK;sI zy@Mx~iP2_Cog1#MNlj`ngT3>!vnB$kw%K)tkQOb=yW*+`P^wvm%f^^c3w7&&1Np+p zQgR8)%m#?*Jn;#sC#66fS{O2M!B|1i1H^jmfV|oH{x}z_zL#N9C{0zH3ro9sxqACMot^jB?(}tnoXHMt@9_Ow)7O})(3A)QY&hdm4mgstHKHFPoh@f^PY7lBoyt7?UL`*E5F&| z`#Sw+E@4RrTx4jU$rqDur!DF?+kwQE4GFiD!}n{*}R@D-*RN!47-BoEqDislxvW8%5^D33NCi- zv)E%~8eXOL)#II6b;tcDQ z*FI>AQ6c4c_DNjiZdF>;Z)8Qkfj-+kYMwp8c6xrG4L-?QG{8sMOoPUpY&5OshcdYA z*L?^tk==;vc}wO4j7!Pn@lcF|D|km5dB`~IBm}7xjE0wlisf3FK@rB4fF*5hr%ln0 zPBKnveTgbOY%-;t!&qs{v9hXtt!-uBmO*GsIJs&mjFyNmOYgv^%bpp#UE#%3>bX^( z?tCBeYGE*}b-Rlzoix@RO(3rTrwqZ_)Z|&%XgzOJwI8uA5p`Q$SktOB7Br07?9AJ> zd}VTZ`5a+9QdcPDysKxLjKV&QrPg}=EqQe^3e>VGv8JvRpB0$A@OK!RZG=bwu^~R?zeoEA=+sjHOu$G zi^IcKK)3pKhVa_k$2-R-fNNDiSQ(qAg=$N20tvjn3{z8eq89s0!>Qjo!7So;rjx6; z03d=P3o*p+h?V*s>LH+4-qyxiie9>?La~kc;ksua>RoAcwVAD)mP*u!O>nV#{a3~4 z?(iJ+k~6l=my9Rvo5flnSQTrbhR&7Ha;GWxa|MQo0gM+OiZ)`ROVY04Tg76^x&z34)b z&PdD7AmLIAHDvkZE~$mS@-*Ner$w<$ye5#EQDC?c(a-h`jASqIs0QQtF|v?MJANj* zf78423})uKO1_hfv7ao$6_Qv(eh)$eZHuO3OpI6So`)~c6(cm1=fhZ=Y~`5kEejJ7 zG&~wP_fA@to8NIMd4l@bKRjS63*XE_^)ELVk6dWNV5LZ&k>hhS1GR?!CX9ixSH$G3 zCCD+ddU@zR&xRv94A9MHG2E?M{DLW_TTgg=TcD+UgMUVWiu@1 zAV;|@cgag35abgk<`{vzw);0TdNkIbD$+hC)Fv1o7KUXHEhvo>#oVoh zx0grR=vR7GG!JT~KsB$1ZvzXm@zo069_|ITkPK6pp6y6)OsqrKVgz~K$4YOQ?L^Od7#u32tXItw6_UhQ zS-=uw4tg-D_lhRF-Qh6zUfsc43DLSYUP7=ptpCACZNaGC(R>a0EK&8Wl?dj$Ajz90NdYIgfs>(r+x zgfZaDTDyX<1=|i9_VVM1(F@5EzvxWGX)8SIh%%Hl71Z)zMMI8*5X!2Z%Fqm%L^_$Z z=oND$f1O6uODtIEg01fQnCd9C*{SVUwO6mTVR(o-4>vQyr$qG}utscB1#-L1C-dnI z1+_>LEr~+*CO1)_G~+Q!tKC55>>FvHs}OX!>f47&>H0E%?JhdK%jXCu`ZjMCkfq{D zf>!rkT+27eNz(lT=K|;hM&JkD68qDu7OYJt#Mbm)_H|%=qXPoV^o3tX=80a@P0KCX z<}8Z0clrt$2t0ftIih$p1A!_FUy8W?Q0Ag0j-$bl5cn~n{O4aicBe^z94`Ni|AyiFLpyZza`YQL=(ielE+Lx2DSg8VBrhZA6jV#_@|eJSSRG0 zs3|FUYe;iIVTHl@*K7>bH_$uaLt5*Ezv`@a)z5vQ!6|`LuNIO@9vAn56ozVIg#>m6 z!LnPEC2F5iz|;bZ8{^^k8a~8Jvok{`@b?_0$cise!|735{AeK%%efoNFf@966dg#G zTUD);Y?I-Wduh9yZfr2_KToj}6kTFNg)sZZhCzo|`Px-*y#i@sDH8S4Sb{2XwSjhK zhUce<2Tkl!u<+y_cITNXl?y)~juH~}E`@3tOuU&yc3{Xx&syvvUqKso(w-{H@hOU3 z(pN+|o^z(#3PM{3OnTMY@)gTkLEm5su)j%64OYwKgNdw6K2K)%t(JVY7dQ|b@)`AF zJ^M@ZQ;**};2IpiRz^rkMJH4zXE|436+IVv7|0kM&7M8i7Ayos5{!HHWc#Ovq(>GL zqQ)=cMONAk8eED+edlGP(!3It2y@}kd7k0OT zPkujC)=urx`zWItnrB?guH1Pu1xo|=*N_zYnqu^mnMi6H%On!lcq~m(R8)mZk*m^1 zB;!&%nUA$3=@bWj+q?yulin3w1n!-23eOm?uz=<9V>-Z==FgR8f+{oAhh}XiRif<( zW0a$%YhA5f>aU)hVQE=Ho2%PY18&iNbw`NoJ>_JR<1RMSBbfn5nSv_=tYN6zqq0Ps z6l}^cCBj_{mlYTuOy?OVwYtMtL+UoMP&1j~h)zu(uFbPH)2N1mCJ7V6QQ%wJo;(L_ zuR%j@6*>=11)3@GCD6VQokAd4pSD+M6%tl8uTbX^ts_=mkoKC8p`wkHkHoz1fJ}O5 zC`Roo6r6Ukas`ybE+ouxpUR7kl>sboXq+Bhk|yDOmBz&Km|qeV)O1WRFOTJ{LPG{G zt3m}4=(V{aPsE#+j2Q$v-JONj-DmNwk8Hf?i0$ThTXAfRBFI{_L|X4)Dy|VEAe7P& z$(a#4yJ|^y_XpxNIo}joxb*amc#M?M0b zB!e>MSFUm2qFFK6;B3oFb9f*hT+m2Z;2gNK%BgErPFMi}(`g}j!)i431mKS$qG~}9 zQMEQJpw{dh7^41)IXU#s#xvQNQrNDe$|G@87_=D`oP?7l$Iyd~pB@BHz!j=pLv64{~`rwlqdzyz>m^p-1}dsb8c*mg>JtYlLY4*GEeQQ5SwtlfTc*lkK4l^ zr4h=?;*&qACn7(M25ditvHL{j`9n9V&01hW$7>cmP2*qKQP%bit=TCxJl1znotqP0 z5;v!P28T$J)1PoO*(40d!K{pG=_mGt9(=*O&ww!L*shDY;Boq~#B=#SJPxsG%{kGh z>h4`(EerVwh^M+X)(i#G0wmFEb?YeJsa=5_0rB8Qr^9(b8H{bJ@En2`!rj=E4(%(` zvqR)NRq?F|A;?r(SXOp&@nwtwwEJV(C%AvQ@?gcgb6$_-FplPTJ2%q^G|dd zTl-dRdb8|KM=IevMaTeTH)G0bmv9?o$w=^Z)84nD(I3TGEi_n?kop=SoRyxCQBaSE z^O^5SX!cC-Vu`jj|6;|?UL)Dg-m*gIUAXFmZ34eg$8ZhgsqR&FAF15(q{PTo6mqvA z8tx+LUSf|Tz?8{U7^}^O*-e6}Z#=MYAqFIorWjxWgA46M$5Z51>b{8u>Q#`n80i8h z-_qa;Kzq&+a36?q@2<;^W04&x*a6+@IM521;2Tk|6a|oY-n^v)kXBM=h;15zCo8T5 z=n^8AIACJbTfWti61s@NQ0ns;2pmH-R@Z(6OI1e%KvhKmGeq{e0I0EG72E&;Aba4T zpz;hNP_Wp~wCdi(k`NIFnZeZEI$i>4C#W+-YYib5cO=D&4Opxtc6HAjJ|j{R_KnBl z9An6KtFjdbd=_4`QrLBy@hBw4*c{c}>i*&aifK~IsrF|tw8@SE8*lO@IO%>(*@D*;`;hQfGURGjyWdH!E{610t1ijynzn4X|(t2i_PAmPddkI z?dLqA%mKQ9W>k4cIaexlQM^hv@aoGC_4s%BImt^F($;u`)?xl~c!iZip7$f{xta!2 zpJQ?gqBByWN`V9B9fkIH-+oeV9I!tEs;=p!1+2kqF_Q`%8Wdw`M8Q6jzt?N+JHnyX zB$Mb1US+@nwhWbMd8l^9YN41D^udOc<&4@~&ez0IBn~F~g27l^Z!@cZy!8rYy+pg$ z;6lthiL0jKCdIE&IB)Ft)yQ{7kfS+T$nK`L*t$**B0m8y6cs0lOL=;7xX%ff$gme; zbL!4)B7m`7lTsVOe-gsA1|99q^jG*^oEgcOnv(&NM$7mX_$5W;WE3RH3!-nyErza^ z@Ci1k%&E-KgU5uF-bPj@z>e=EPK~L;Yjr`w4ACvg7S%Ir3U&gAo11`B(?oK@UW1zr zdUl)!5WJO2A;MBE^=K=KUUVvJDGl*yUb+O;kEQNOHbLd%{CE|g^u|==szu-K zSPP!$rAWv~ixId`*vl)ZqLDK{FD$k;D3$n&L0U>E#2Oy)2HIHfz%zsWG&B(*jZp`~|Xog5Sm z|4~0jgenkS7LvQSD3)J0+fOKou(II>#=H367bJR)6V zeXd@nx%lx#Q}QrpLzVB9bIi2}JfQM6b}M`rMe9c6+&*q2M;ZFPf>Ru<%C)U1>xb(9N(&i9kN6%$bYXONI0}nll0tm82eeG-e&y zDT}=&y(S_wZFz7xf~HKVvLT<;T0dUNtyuZs1sg^qy<4rm5ZP7Zh+bX!Lb*1Psq=wd zsG*c;fps*^08LP$L_1;R;R3OJSP zysIP#70&YPsOnsVAg*R|n4xCscJoW?GY2Kuh;UBkR7QSYqy8q&WQ<7x^i<-hu8?2` zzEp3S-g?+j*r{~XtNaBT4f`N!L!|Yu(2BFz?}FI3?}PDZVejg)GE)ovv3}}qrTNHJ zz1x1=zpn$0wt^=aq*|rbrWIuTQAj}zB`VKkX4Ag}v5aJO&+4}`DK)g#w)${cjJr@N z9=!`N3GoDM1QO8Z0G*tD@gPZL5~sS|i*Vd~$jZG`il`wKc(~|@Q{&-k*ZQN0V%CkX zgOCnsx-*rygpL|(p}4ssFHE;Qin$ZNNdm<1*QGw*<-%v3%DFfw6fuj3o&DAsL2F0F z{@~r|pxwEhoJ_<$-H&%?hBO`_qxeopjVnD%hK+WxQOsmouBdYkk7=dYppYO<#mp$k zvfCX2t7~$8H46zJ^k*n3pjL`WyP+uBO=;CK2I*ph!Yqxr@p=6bOorwpM!AjFBKKf( zd~H&s-Vsj^+G6~HV+HWL zy*@@Z&;;vIUslJ0jqbt7ml3PDd~LLvOkKc#ww%iV?vn&G{R8ULzcdz$5OfF0k?9n_ zGX9cNl42|Kaul8M${b||B(#<7z?GqvWN`pTBE&f!#LZcAE^tui`Y8iLh7@9Uw(^gp zgAl}DO)<%mLNrp-^33V#^*xVCAYZ+C-EgFlohz@1x#sI+gR)80H zoR^#40*k$_%P zdJSW4FoR-+9I%|`U}hIUxey25s`*b=WrwfgSvOAB>~i1-hXxHfQ!fsIkN@aQDwRUwHDcL5lD);LCsxSLSuq40Z>p*=fqcQdb zlys}w!5OD^sU}GIT>(iJf$xGrCn%rxu*&+?Vl%Gr;xv_rM@e5)yY#T&Df zn6xS0o%s4B86NCsxU@M346u?HNHn+$dVru0Vm8I5C@S!DDy!gj0vxjweIs;A&@Rz9 zZ2%S&V#028@#pu!y8Hgz^y-}}4hGJjV< zH@BTS)QDsJH+HL3=2$#RubP=@DJt*ec@;Fr?2_3HHi~`2OE=rgD_q(L^hFpy8Co<` zY*K*>jvb9w)(s4vpbcI4v#c%YldybAb@naX;TMYcCc_drI+7Ks(ACct2CI%quj#)m zwMOznQetNMtkkiKZ|@cS)x`^r+G|F}J}+0z6QN*}qyT$2RF)B5HwddEXe$Gm1onlr zHD{2fUc<<^qTDS~doQlZa*Q1{L{^9(k%{ zs%*SCQvz6SF(6-hY0`Blr?VG%MJ*3i-<|EfBD+FkPnCGoI+zfTutFn}SZFYv;VQ}DQ(ia3xd;BPPOaxLtNB^!8HLoKz7H)|O z3q9&xCVOq%G~bDv?&>PK0&j;{{5=G(os==^R=Jc`n`0~meaR^$e0@v&DsB~qBv3&4 zVLs-x!UsxAK>_ObAm}g?^b0@z9w8So>JmKwagcHq31tHaL&b-5uU5if$E1lNVP&GL zo}5^vzV4^}r4ZF1O$eRbrisPnGzOO=Ek|{?RB3e{=AA~#epG%&DN(!txS^gr8ua5> z6On&s+<(Qxr_&oWj29(x#fq2Ps8zA}%qwf@IIcZ~k7S4hJ0x!6Nvh^*t1_Qk#7MdQt40!AKHY$>2)Nb9FP1?k)FJ7o=KgO%S6zQuUU%K#D9^Kgm=r`?+Wo zt~@&{XCLBdA*#*JVj{h$Ct-0R0P+l58IhS-w>_%_C1te61c-6~z#m0%jOq-9PeI}P z%!ma;6QS0N}ZLCthFf4cyzMgI{1N9kD)${y(5OGsevtCbzy6~QAn+xS9^N( zI(F3ZjoKn^I>uV35d_|(f(`Bl`KYqPr2?^~pgF^TQTM9cCHwSpI52qcu8@iAU&t~T zUg^yBXr}2BwB^?GzCEOE=i(~NJgJUITKAmMUO|K8Eg7!6FVYg2L=B11^$aQOWC3bI zlt{%g+sGTKE+AUyP77QvZGuYjFBITgLW5?3!SGpy;`#ZlWB(oBh?yk6h z=W7i<`7&aHPqj#9NO~mhis7={2!&F*nL)5ZWEhKsUsUHI@i%0Pa!|hwh19}EA`MN4 z4SacJ?&*H;dsdb%W+93Y10r%2)rPZ&DwMP`-A+cEUgiPSv6q|P`;I*}yjgqR528<) zlRL{Wj!_qb`FntoREVuK@5&4X{&+u0ObOAo5*~o>P5GvLo>p(h)AXTRJ zxdJoJSp9B!%`Wvo`T&ZQJv*ubxX)pK-P0Ws?QlRG>9Eq8zdkr?V!=>Za6U#DsWdUd zJ%O-0N=1K+j@^tYHBM_-7m0G@%t!(q164vy13 zd{TfbX&$}8^{@kEGQf5^4WIb3NsZRJ+uWgsAyB8bCcC=8pI>21P$5^qWyx7S41UY* z?w^2d5u=Lo_KYQu$USg+T7Yw8a6|>pcSGo1b*upqm3!=06=-Kj9pXaSR*On?YByhNLA2A3mVMmL7PU`B|y** zPAVZIbgJW1YNJZQ(RWYx0KMzJTBA(YkKS2pwB{75UxMa43iSst?=93X$edjpXxFo2 zObGEU`U7 zlCx_9tze|wE{alW?JI24-xLo6GvhnuYOH(-Z}AheQcpFpqusaCN6l`Z@3an$Uew($ z@jEuX3R(DThg}-Sj0@2MnKSKYD<6CEAVWH~!nm9H{A_97pEgFr>~G`2|7-+p5L8j+ zhJY_UxPRA)O*ykc7^i)#Xb!^EsMdQwps3H9K<29C0$g$DTf^`;0IQVi5fXep73JNy z{H_C0e$@^_s0j&rSh=-%RM@;=z5CYukVnB&_Q9!DcCZ36vB?J^YD|Nh2qiM68kf+@ zxRsX0=#(FO(&%E9FIvcERWU@Qz&-=JQjE)Jp<_!u;tBjmB3z=zni|PaOe{QzLpvN% z&VHd-o&r@R8L&M1Q&}5bvM|Efgl}qoRbbFs5gA~<$tW!JGDyoWvqPgTw@FE{9oQoc zp<38tX)JxE>-X7HR=B9JGWe(%ikfVgm97bOiL<0W((x&0Ta0%t=XP%u!PR$9E zlZMM11$CZG@~sdgb#-s&g+zHz_W>I9kU^ucgbYPAJpcUAy=FlBK&g9l#O`)N_5ChU zfz9uAY{kQ`Yu)SX?uauW=iS+$@qDAMYf8j%@FUmUKo~1OJm84rGwQ~dcRDAWDx#7$ z2WpN={ya*ZG)@DS+rJ=|posWAIl%J)S$J4FtuX(52eZBS7kK+w~TyuvX-!o``+Bo#j zyKnqZzES?{{3Q2Hg*vT0hZaapH?Wd`YSkSp7h-fkA>QjSe{mq>=M>KX%aU@b2 z6tUtdz}Y)I=K!#}ft`lG_)T+N{BO+_JZPR$x&FBMJwc*gtnIW|X&IRY^IltVFD+kn z>i;wl5@Mb0wAxMK77zeZ3o_2Ti!ozw>}*oxT#FTJw7#aiIrvd8R^Dms6syFypVhxk z%af59{M!9teRPB@!gZ+^-l25;>fi$F)5u;D>UcHma<1&o=I-W^7Om*|4$3Wfd$tH% zd(5!}X&M_bLeOjF=58@;H>*)M--!)s+5;JHeN_R{SC8)uf=Ze>~F9Y9sZ3Rl| zE69ncxA{Lnv0or0y*BONUmUIE9M|jAlo9P++(T#>u>6?Jg8@ZByY6r{{_1gK zf3v-c_v^!XJ?wK}?y~!OdoYgS@FU|FKlX)7I?1@Me>NKJ0=JIMt>}ga;ZfYjy)|K87RjUu^P@81 zl6Myq%x%vqB=Yl3zsybl44D`;51UGhXt$mmxBee-Z`u{dv84;wPpRd*x>s?GP79D_ zxqXiBLVzS*GaUv=w%c6`szBnJp+tcsbGq+uf1hU$F=b>`fl%KMwy4a=%oz6Y>>+l% zSYKI&IHR^gaWNcR-M^Oo{UkD5Q|rKLSklTIhXs8yxf8Om97QjTlLe6b*hSyRdEevy z?eW#+xVJfPDw#JgZb2+2BsWP2uXBmGvbMfait3$ho`&%vmxP6wHjOkWd8jtYLHiEA z76Tdh824T)22f6Jh(l>s70Sdcs{VsUe-VKPWinP-p+~D$Q!*GIKS5ff5Cepc$Qvg{ z5IXrS(s}RZVhlz+9(GZBSxEGL?-i2FHr5tY=lhNZj44Z$$%J^Fs|3@7JUWLj^mSOi`Yo(-N z0>*X%#>2pAIIuKFTDV*wGl86sA3sreW57q-2-`niY=G1kf@-sgU*D25N#qHhVlJo5 zlSB{?z8XB{|MWewOsng!1wgVn7SJ>z5HpUpe2s%jwl|iM2=)tZFKD-H(l9ein6pLv zm(Jai%-vI&J2Y98pMVOO$}qFI7-u%9=H2D3m#D~wZaiTZPla9-_m9WWQyKCf6YGeC zYQg{V+UIiqop6(ktgalAwcQR=v6QZPkVZ16=vaS5F8ic#i1OE&&IE9GOJR<6f7s~$ zaF*_Kec)@at;Lcr)IkbeQsZWS8(#fYAJ0>v5Sf$%R=#tvgV&(yZkkg{`qb@Ar z4TuLmpRGM;v9%}t9h~xf`RVaI{ zelF_ICHuLAbAQ7tuK9|>M7g;b4gNTz!r>?M&Dk^j&ZK7+<(d3D>`d*M_Y=Ou9#48E zen%&v*&KyS&g=`-RS9>jjSC8fVr^Ye+o*r$u&pJcVnSy zt;4&QonoHX?Y&cK_@`Qa5KdbPT2` zq@mlW!eGD`m}C*bA`SRIYM>M7GwNcw7!~7!qYK(y{Tp=|L8#Goq!(ir6LYfvV!DYb zqc=}Q)W7sMCF%jo2b;@4Su~nTZV6M<7@V9FgQMj(esgCjjj*HurjXb8Cc#T(jhsa z$2;pd)_(h7pJH9sEKw{X{&ZGp2SEg2GJ)#3G(w?2!>HjgCOhzduf9bGw{Qot3~xVn zK2r)M7@mbfC&S?B6pG%O8x@v|(u7+w=w1ts!b8SLbYNIFC%G=jbCX>c(|f8oMNcml z#y6#|-BmO=-SiTSh>vBiFVW=X#nK+bpreySDO+ew@xQ-y3q62YoQEi?GC zRkBZ?Vrl&;SVXxncQ;9XH9AVv+}x@%9xykYR{i&%g!YY*c@l2GVUKA66bvIp@!&WH zS!WJ>_?2^~>;$)GfY++)j=q9Z7AtDRBic759>kOinIbL6RiWbKlM9uCe)a$b7g4zR zBP4G)fRhK!c8?D~&v%appMT_EP>BnKbcf^fe!ut4V1)X#-{6?&Z~i{`riVsz{QD4p z9_pX}a(wg|X(-?P%kl8@H-s$u1wctO?*8;scM%5czw(_qJPGpj?9!-gnyVW!_00UZ zIVDxVf>JLcF$L*1r&U_kWwq07KCLC)Mp<+jzt-jg62I}}0L*kjq+ev<=M-O@-8KsB z`H-$#Xe0|PNRX@aL3og>E!+YARxskeLIS+Z`P*OwZ8?h2Xu2pZ?IX;fY4i7|vs2&u zS*Q=L2`cMniziQ)j=opWXRc-l)7;lwmD(e19TqEhY)6_*;c}$O=yb-y2q29iDgaW2 z5DIz>zN!(98F4g^*p6bsJ}(`^J$HH0?{|Cu?A~19&o1%|F0Q+$KX#$F53jo?-wa2DgTbW9 z=Dx%pk)VPv*d2d~XAVw5Q@wks`v!gx>(mVL7rm8sh^#)%TW)W&Uig_URCIVU)V{rlsI!uiNHPXAQYWd?mwxlKq z9zR|>k(D!OP31C+1rQ`vO|8tN%_M?@x+=Bc&21%ggH=BtjSq)MpCG(%RHjPaLz@X; zt-rjd;wxz;d^9bU=p+e)V|dC<9A1n;DY0@eD0)0UP#-NV+8Y_FLgvt`ZJa!*e#XV` zp2{Mbk%Zin8DL|b#R`DfVsHy-HT;*)N;N&f{Adl`M6;u!pmnOljM;d}zA{}Acf_g2 znb;?+RMXp;$KmA>Kl^n&yF+uhw+=)KgCA*Jz^A;T7nU&B+^&d?y4+y2vb!Qy$7XId z_x9#jb3{ zwCkWv_#r*CH`#+ycXj#d9kQWAv(Cxo)u%(&Rbo|lR=q?@TKu7Vq@=ubXrR}41T!{h zV3z#B*jCe~{km?Sl7zj`)^n%B1>R-`Uwj>}urGW59@*gSKWtAH{9b;Ao!mtc&CByw z$E@)f-((-tl)-(Jo{qOxF0YWJdA%X2yx~&kw=0$ou7P4*hKQ1e5zX zFTIPo?lsd#d-!XPpT|i}I6{l-cZz4FW>Dx6QyafLX=V(1VsTZF_9>HG^O?fRB4=~| zl2d((jZD^nrD)i22d5X|r~ui|>iyy%^#p0Zf_z0KO-P>o_uN~%dvkHYvpZ23i$$~O zBtRM;h?HBYwSaKf{{Sfd70&s! z-K{PyjVqqXN9oH7@!L3b@bVp#=*M{1&hqa5I(ObNA)&j#qZL>pisE6hN8jGOCX*w> z`2FQ@Ue5%2etJEgN7;EH%z3oJ6Yu_n_ak|@k5jJj_}siDUC;OQ6}S*zf*<}GDvR)@ z`L0g_M~FK#`X^+xm@IwEY-4VY>B?V7UPfbN ze@dxRpSd4o;&E1#of`ZD8lg@Y<_$B=Ie&$dA^Lm!tINAD`>(okb~2yErL`RxNWZRi z7oILXgAV_-zm156oLtSlw>)X1n8sw#F!SQwFi+iVUS^#DcHSr831{TR`qnyD@(E@D z#SO;SU0joa@9nJFsCGBjx=WGFHkbcD%pZrl_siCbQNkj2RGb}O!HqRQ(G2iNxA;vG z<3a447tGKKzjN>emaHb7q=b~vQAQ)l(1plA0y8fA*1^UGrrYL`Qh@}k--#1#)H>($ z?d_89#>S*S{WWVhZu<=B@IOvFdSp|#)VV!7J?dL!y)J*C2o;U}9v5ii#op5=I%hxp zz*$2Hiw&Iex{3lJn8K}}x0qhDs4@u~`maz?PPV-K+Q(re>+9WL`}^Q+v;|f64xz8- zy8J&b@H!S!&QIrY3Ruy7?C%7HY>}Sd-CiG`ok2+OAFQ8oMi-nS{K52?&E+kmLc`Ot zh^MzeF-TrT8ZLfODq*eP-LfVY3CibAkrJ!{ol!tM~|?AyfeBSfBWrx_b=LxI~3-={g&R$5{lu=${(;?+4{voMTAhUmg*`8uY18faWhD^csi+nA-FbVfmySx#JFACul z#|=XHbzqqE5e~rnWrMqOGOBal6Fpw)ey$-lgdjZ?s^^p&5+bRB7p`T`AS%~G@vt+p zk7`Fzb>Mcv*!~L>@M3uvyE}stp@@BVJ4P)V%n|>QIRddErRQl7Eux;jS@`SXUl$g> z!5H5lp^>x?iG=j1pS#d?Yj1a8f*BhuA8f!HLxRQr+DrKQ*lvAmd6$3QV>;q)zid)M z?{G9DY?Xz@BYenJE^_1{3m1*by?d{h*+J(eQ#aT~hMmgTw~3ljC#S;`sicYtlD*0{ zRkBBB4|oX$3x{$h5D&6IVF0uP#MwU|oq&FJ4zJ(i6-r1rhW6z2GY;qcu+Ecdhu4=p z+E_@8Phs;iDyE_>4=Cd^_n8^)S;^)EzxYmrD=$zrRDnzQ7(cxsB^I&q=UN8=>C5l) z7ApwxECdhx$5SY~PjwSv!hJ zPHpl!Ch7a!D9$lj{3alPZi55>;f4Q^1v(`Bs zp-|S9+&sQM(K%bc09EoTtPEJ1SOownDA>!#irxzm}5y|JdEW!tnYFZGI(sL|dGDhpb%z@xKK*fa3=bfKnnDw{!c2U}9 zd2daB?ksPuuK;>MN$zfSKJlwRKbKd7-cc3+Co1yTuUj}f^#KDUda~M|7}zxyNZ!1= z&kY2-`NOc<4=Jt3EKj|9NUpu5ZhOSP9aD z4#aXd53s#>q%S`hAHF;8ob-=qv)NbHS7GJykb6wosB=Zhj{(XX_F#psz}$Vly}fT& zUTyA3oefMarNHP$Un$L3_BWO{_EFA+N0`6ii}WFG^p@<*&dv2$cuboEfng`|#`a5X zw!E^l-haKmx<>rB{Blpvc7IOAybX5)-rir?IncIYRkpERD4)=E)B$A&!h<9O$|g*~ z`nI>_hDi#3dmZy6e(n?CY^<~D=JSKyz5UMk&!oFs*xARC=o6cJFE_Vrn&j_wS#W+t zR~(ak$T|j)HYX?#a9Q*7}-PJ3Gs;VU{;QfOwmHSLTr2!$FgO3=DpP z4nZQE87BhzK!^%q5ACqRiq58dSM?}qNBE5^^kVn5Q@(utdW=pwSwEC$`g077a|zj` zbhNy>gCVnH#3Z)P?2Hr=@g8eGWZKVIhD+#^t@f6Fc)a@jg|~Z73^2m!yCxf?8U=*I z#VKVMxmhS{{X&Jo*d}ua+X_(l4jT$Lme)5s*wAra zXlTP7>?+*_>-{1h+FIL}2cX>GKRp&eCGC(ny}G^GIRiFa1LooEB-|^cv-4(m?+y7O zaJUeGyy9QtWKMfn7*1(bn<~_Qyk}UO+EJ;bZoEe`|9c zzBY(>{W^)Ar#mjM?&$?&w&RF-^x+yp-ajlPh8|-lhshaG0|o~%h0)0{AQO0KmC^xP z`Jy`4?HfV5R;iT>&VB=YkO6LCSt;xn+3 zKAvJRTpwS1=jBV7uZ>;kh}E^%`aUWQHYe^cE}8 zqqGv(4h2v_iqbKpAQ; z@PRk-r1noNdVFk*VaelrzwGV)BQBNeWxctw4PJ*zq<@%7I!b|8+xt5k2c{?Y)_m3Q z?XC4dgPkj(B7K+gG(4gDbL%BiV2}gLzCwLq#1z^-!JeoW_MvxxPjM{KR`43eImBkqR8-hS7d=5h#jPxx;t=R`OD3V54O}c7-HF6+%>t zDnJ|9!RMnz{_lx)5Sii_-E&HtD}4k7@NoJlMT5XZkqz>bvn!BOf`fZBix41#If*mx zJIIeYKD$0VxE^#i*H=(O0U85}8Qb=WFHnT1v$YH-TjS~{)YM)D?BNLe@|nJT@#Op( zVk&%>hmGvtc6f`X0JCO0prot*`5(LnkJFfi`z%7qk{IX5FsflqP`kWC4K5ze0=KJt zXosU?6X;gBBL=5*$m++Ij}Vo9&w{W1);aQ{Y3d_N*^FVh3 zV_Qx>2vvEGQ%TgJ!VCNE069Osz*is2km9QWRj%<*UzSWJ@&$K6bEM;AD1I6%2wkHj z%SGo;6f}L@xxU>#;V}t%@a_IBriLCKEa=9@dUNRzQh;Ckn%|0(NY_{VB{Tsu>v}*h z?>3Ju#i2ueYzjxv6+@=q11G1TE((g;%0wL?CU+|Dq|J;ILI%e|;rKC9Lmw)dzImPp z1+arGHa<((!+-ZRtOo0qlp+xi#yKU|mTn1E+WW!n0xe0^di8S&iu8bazbaHxy&Dp?l1pc^( zH_Ob}u>TMI%5shkSd20eF@)u_!>jW>G4VkRANeZn9sYlT;`wN41sKD^(DFJT60be~ zldzE93HXS<3|`}PH=qAa{=atd5wmrV*EL+b@;Z3arL&zu|4bCkJ>HzSrL?1P(g>77 zM+f~=5D<~#fV77R6Nq~O>2bV)G%9d5*@H(uYBRApc^8fkfqRJS^|QziTV6 zw#5kT_V_0@%JQEz`}b%2cMIFX_&L6Nl?UhGZz+(-ALx~R2ptA8=no(S@Uc_E#{Q-D z_$8e0Jm8_bw6O5qQU?n1y7Tha^&PmnQ9*~H%Ukt;(v-gb zGQWlbz^mYm(}>c|2BTlNLL}S$e(}lo_gl@;_}>^Nd!(TPsjBhrc0gA!rX9lnyz}W0 zJ(eKN>%A?(4llY0YvA7T;d$rfKF?$BA#uJ(xP>S&SPGla{@%5pAsmd9`G4)Q;ZI$l zR^k-oJLso4j;-yjHB5$hiTljI!G3BmS(jtS5dilfC?(b5aXv%J0s28+-U_`o+we73_hq|ph60=rKF)Uti{ za&(A8QPrwsTVGAQ4Yh!F^=+{BIt2D7om=&ilOl8yL_pCuC^TU2A(cqrgr0+4*!*!p z5FV5PvdPN!&My*tM3|8RnzIengW+_r!pEN>k>A}88E3oS^yU+5v;$%S<-EgQEzBZ^ zOSQ&tGxUjnu8yfs@CSq>j{aqf&{Vp@?8w_=aHxj2P|$C1b~8Rj#caIv@}#rD1?ZkJ z^o1+(2p0&kAo&;+j1%XGSCG)nui@WIw(m3h1^)u1u$Q1=-W7uHvop9p#y>+;y2P2A zkhus|;P=giJpkZ^u)Mrk;iD}31I{0NBoo+|yg%*IppSn+6w+BtCjiEw^b3wq4nwj` z*#tB79{-N$gF3+s`=rO{4Ckt^UyzBB&JkmDco8>0hORNh zIqD$pN(aWl?v~~dU@7OiSI5^kR~M3%a{lP2^YJ@m-?Jf1?j9Q;+{}LvN

}IYmT` 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

>;Kd^|ctg+1>my=1 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

Gctqk_cMEg>6rO9 zezEyC(X2c0FCsH|H$Ss{{z6R0%)h`3&A*^#-GP4;nZX~7KUTBuz$Zjz@JD`Td3+?MW9HxfhUVWvv+lrL zAFyP8t-z!G%-&!+X8s$mY5u=y)*blf$PC`jd-Mj=G4nrib@TsAv+lr;MP~2~er9?9 zznG4hf7Pp+e>Kgz1FsR8!4LbH<^GA7j+uYcE1Q2a&AJ0`9+|0|kv1zzE_?M9xe2i!1`s89dX8uLBvzXs*sDqb`%;1eZE6>l1>6rN^($2(w zyP*!AEHZ-^@vJwPj+y_@=eD2!;hJ>^J~A?cZNLxHG4tPiPV?WQS$E*uA~X0;er9=o zMoh=dzv|h|znW&6rOv)Xq$PyP*!AH8O)2^{m|g z6w@*DKYn`q`TR$-?!Zq)X7CIHewdD#|8H{K6s``wB{G8_^Q>GSLrlla|LpMA|2fUN z1HTZN!8Z>0VLE31Y2}zMTpc`PWClOuS^4~_n2wqMFDJMDM`+d^_~^(Co@T%g(=qcu zdQkH}rdfC3Cn7WWa6hv*n2wqMj02nhOwGCjpA(tE|MoM>`+vlA%>0}0+5ErKtUK@) zkr{ltpV=Es$IQRm?#W$P9kMvvU1aFi&AT-JEt+)) zzAZ9?zg3^_ukR$LW9Fatcg;VaX5E1ojLhJ_`D>8#u^fSxnFT`}r{AX^|{AX#_9r)bH4DS8R^8P3>9W(!88#Mponson+#( z>uc5>c%#S+9?#G04W?t}AAPCjA49Y5z+Gepuj^-)*RREN%>3&w+58)5)*X1`$P6CM z&n$mGi0PR5_gkX*_t&gD@IjFoyq=#~uCF4dW9A>Wc=L~n2wo$aXFR1kU3XEf^${Cs2vFFN3d>6rOXp1S#mYt|k3w8#v8%Fis3tB^PjI-ci@X6Gx%*kvp1NIng5UpoBvSFx&!|?GK2r>XO`D5#B|L3W5_XPxH@?3 z$P7N%v-0|#n2wqM>6rN^kYmDdb@0TI8GM#!<@&>7I%fV2 z#&7*M)T}%3CXpFD{(v8*W9A=Qj&Z`(!Q)3}@cN#W&tHh?nE8k4V(O!4)*X2C$PDfV z{4gCe|Lo(opU)hcbqAh1GK0VKtlU2l(=qdJ*ERq4nso=>DKdj+8}P$)%=}}G)%=}i z-GRrA%;0VP%yNBuFiL8CYS!J2gkJ}feW$MiGH_qU4anE6+eWA$)#@S2ese4uB& z!F0_0cZ|~d->F%5;Cmu7c+~+vOvlXsm!=ZF%)g5qyN0WS zhaxlhaL>x~hhjQr{)x0RvEQz|{vy_|kMF;~0N&a6%Ii~NI%a;Y=$)>^{-57ppuh6V zUT-iRGyjPzwG&R#tUK^2kr_N}wYFdV@F<@B@coDD$+3R8I(VbV3_iiL^7?|9j#>Y! z^cZ=BKW-lC;A9r%mL48GFO>PSR{>L@z4*X6rPa zlVkdDb?{7)8N8Nf<@#@8I%fX0e$@J}tyy>A^&&HP+5taI$ISorLe2k;X5E2@E!_TD z$qZi8&n(}6DyC!RKYhXGI774Uz-LEh@K@fWH<*r@f7u0^|Hqnj2VOohgHQ7_dxPni z`B$B{`B&4dJMbEj8N7_2*&9s9%>SUic<7&+bq9VVGJ{v~Gt2AmVmfC2edlQX_tUI9 z@PUyT{D7a?8%)Q{|NGgR{|}mV2i_$zgZJ?>%lC_k>6rP)nzi{m&AJ1R8=1ks^D}#c z>6rN!oVocI(yTl1B9R$9rk`2v--_v&`G?Qc{HJKv9r*Of3|_#`>6rOHpR#rQLbL9`Uqxo{@qT8xzLS`ang5dUn*UPGx&vPknZcj=nZ3bu%>3)i zu|c>xc;mv>jQ9}&|r^AG9q`0oC=yu5xY-YYVL zmmToKbjnbjR|k49$jUVdh8FdZ}h zJEJuJyP92zh?0R^k^;0--1*9R8UG4p>m zdF%hVX5E3mjLhJ12mCM{GyjHiY!t2z-ZV0UKlQ9Pn2wp>^m@uf{<_Lg2TvNA!5a+t zVLE31_4IlNucg!-cq4x;WXND%TdIG*!F0_0r|bUA8GgT}Jbo9S9ht%F`kCeZGh#Ys z{@F)u|9Ha`W$}S$E(A zBQyA5KeN2PET&`TU+IPBUs<#6z^g@O@IHQKdHzI9$ISoUbIt$0X5E25ip<~@{mk6rPqez^I!(X2c0_K_LqfGk7^avp1NInSa@vn*Ya|bq8KP zGJ~i0Gt2d<#B|L3TV31yTWi)Gc)Q39UdGQX&u@$AnE8Jy$Irsm!7E2*@RpwS2GcR~ z&#e7f{B}bfJbPpYui#m4@J~Ja;p4jlu4zA?12t<0_>jm9p2=Ok!F0^}&nd@T;p*Ud zBQtn^&&u^}#B|L34~=O3AJ(ip@V_H7c#Z)-OvlWB@a4^ah-Te^{}h?Q|MW9^gXx(0 z=QywV=hUn_@H~+je2|}6uHPc2W9Gm5+~&VVv+lsxM`rNser9hl9W(z%XEguDnso=> zEHZ;f_?hMVXT@~P{CAz+{C8{C9r(V;4BpVsERVm$bj%zwhM&3~e1-GPTkX7J;FW^XVZGyi4BH2>wAbqBsGGJ}uzGt2YmVmfC2zaP>3 zH*3}%_}0h_zSPew*Uu5tG4mgMX!9SUS$E(+MP~3#erEapTrnLp|Ez~J|7@Cd2c9!B zgAejE%YR>DI%fWb4r=~|HR}$%Xk-S@;%AoYe~Rgt`QO{8`QO*9JMc%58N8sM*&9s9 z%s*nU=D%9A?!ebYX7IayX1RYWreo&cY0u{Wt!CYU{}7qMSNWOc`m16(X8uigZ~o0R z>khnmWCri(XZ8luG4pRZ)cjj%)*X1;$PC`Z&n(wx5YsX9-~apOe?YVDzz;=c@D_e% zxqg(Gj+y_1-!=b-nso>MBr=2V^E1o$8;a?e`JdXc`JdLTJMeRn8T`JV*&9s9%zud- zmxil@uZYaxCq3&8reo&6Zim+Ydd<26|1C0uFCOs2bjZ{PfPXx1J0?#K+j*3T^0 zClu2$^B*b4QQ_*~V6rN^(*DGLyYl!{JXvH0AK_W~{x2~dGykg_w4cvw znso<$Gctp1zz@?g^Ix}~{{3p!o$JMai_G9x{LJ29I%fW#%JH*sb@0lO8GNm0<=?NE zj+y_<6T)f&Ht%p-GRS|%;4V7EUzz%>6rP4FW&s8Xx1J0^vDeU*v~A_?}_P{ z`Hx(n`H#}9JMgiQ8GN#zS>E3wreo$G1qZYEM-`6|nZZYRR{r}H(=qekH+SoQzh>Qm z{~4LV!v_4YcPzJUw)npn%+>fp&FY6QiOk@8{mkBAI%fTO-`1|PwR7qYJQSJ1=lhxE z`rcwXX8y-!ZQjQ<>kj;6WCri-XO{P$i|Ls8H=}gVPnP%OAH;>HV(frKv z{Fs=InSaR{n|~?Ix&tp8nZcX*ndSbWn2wqM*E2N#Z#3%;yj5fdFX3nQ2GcR~f2Gf0 ze(j&jEY~L&e;1j-zw$H7_t%T*nEBV8uJvC}v+lqfMrQDrerCBoxtNZb|JrGq|2oaO z1K${#!Rz>$<@;5|bjjZu5VuS$AMQXI3(UkM=Xm^#jFp%=~wa)BJa9)*bl1$PE74dzAMFis_j7?;gAP z@6oI~@coe)e5apTo}UrZG4t;t$FAY(;GxJ2zRR<6eSR?=GyennjrO2s-GLvD%;22| z{4gCe{|s`>7_JVUB{GBW_pDsMS4_vuzw=n_=f8_)-GTea44!_#57RO8Pb0^);p*TS zA~X1pp7jRPG4roEM(e+pX5E3;jm+Sw2mCM{Gyf^0H~*=cbq78pGK1IfGkb&SnE5{& zt@%IKtUK_Rkr_PP&n(}+Bc@~KKShpH!_~oOL}u`(o|X59i0PR5m(k9$e!Fu0cJWUl zGkCaXrN5Ytng4}R+t24k&AJ1>5}CnE5BOm^X8r@^I4E2ld}w3_|JSqLU^-_0*|pDm zLh268dqPU)?+-a(zz@?g^WQg0`}y3jS$E)nMrQDA1Adr}nSTd4b_`bs|1L6v@Aa(Q zKNr(6^N**U@%?r~9c+;qyuD|=!F0_0|JQyz!@kt4JMcG=89eTQAEsmGze|q0!_~p} zMP~39p7jRPG4pSs{Vn}=LmmA8(e~ESzf{#9_XRF6^yXd~rMtTu3F&S@x&;L0LnBIe zhZragD$*$^-6)N8cMA$4Jm)a)*WR<%cdy@bS?hWH!}D72yXSr0%y&K$XJ*dq5Sqbv zxK@sjVlrm_DjDVHSGVr@!(`0-$C#&EV7S^^1CJe=!FRdV8hp2FL$4pNnWOW+R&Di% zZwSqt-K%_GKupFg|6{Xu{*SAzHSklR8GN<(S{T{wt`To23r=b~qtZU`{bTJt-|G!M!t^Zrq)*AS4 zp&7h;&mSgZ=KrB}{vWBWHSnjQ8GMWP*&0m7%zvG+JO6dn)*5(&&4w zZ>964ANzUJpnfvX8wO3-uYjtw${Mcgl6zY-e-A!LrliZ|4IEup7P(#pn?Axn!#6ipJo0B zF&Q)ece?n)-c?&`;15DG_zCZ`HJFT<{}S?8GQ1jina~V=+qLrjcQF|=f0c~#`P zf0&G!|5Gz|3p}m1*1*q(X7JWCb@g@ogtu{R=>B21>AU*f)mDFa&(I8h()%p?2QeA5 z{JT%t`Ts<1t%3In&EQ?V&+`0$n2eeKV2aLvKee?6J}@+cck@15gUOirzcG2||EAhn z1HTiR!L9dM_HSY`X8!9=+WD`iw${KKhGy{V-e;NrSxm;v|4y9)+~wy5W&BWlZ)gUu z<9)UUlQHw(L>`-lR|9Vmn!$ItR<4i4WX$~co1j}i`>U-r@Ij#&ym8MTCS&G5kvuHC z8hB)A1`k|o4JKpe|HSxR{wLMe8u*#e44$y(50f$T=NNvFkNXZ9_|VV{e%$*k&%cSu znECVG?InI(9W?Oep&5LD_t_du#?1c&9fMBv<5IalD?TMOgD>(vTZ74%`9D5JxBfX+ z)Ef9{{aeutKHmE*_h-dq%=|Br$ED%bz<&tM;Ky7m^K**HnEB7B@uHc0+-T6ijAPaO z@WnlUn2eeKZ$|6Z&u`V%8u<6289amMXbmP~=C4~o!*r|Z+xfd-?cS?q@UOkkGJmz0 zjG2Fze$>y;zo!N2@ew9t=Ktwz-2(qoTWjEdhi334b9VLBAHLMJ#w`Dix;ERXcZ~+` z8k)g#_xxcpX8t4OF*3Xwc(Tw8-odr<{WvihGym5$nco{~YYqH%Xa-N*^M}cp`5&S2 zkRyFuq`ZG8J|;ASU-Lf8`$1wdX8ze22;(82__@Ns;KRMo^8THejG6y2I^G@Y$G!4> zDDerQ8T`KYS)T6|lQHxET=y&g?e{Iq{VDO6p&5L%_gTIVB_?C$f2@vi$N6z@(7+sr z%W?*P=6#m?Q(`h^{>$iiw5%VO%KLHR6+$!k7|+ofOvcQgvF~ktzy5!Z&vS3A?w?^Y zX8y7r0`}%o(ncrT#UuXtj;#xVrh%a?*=>F|@lXM||ueN4@ zFAUA#z1^!dn2cHe1>~_{cs1}Mp&5LhYvudqVlrm_)2U{9U#@&VOFUC(2G8$WYcLrz z|6!^h&6g|l1B-`;X7IGGwFZ+h^FLGj!?S$9IB4KshGy_Lu9f+L#bnI<=TgnwzFhe} zj(EP%3_ioP)?hMb{=d{d>RjJ%4I212p&2}9&mSgZ=KuPH-S+v0+FAp@9h$-Cc%QAo zWX$|8lE=m2)xej9X7FpSmE((;jG6!Ts@cJpEAO|8cMi?q3tcPEH;T!a`G2l!w14|` zTiO4MzYNXb?Rx$&88iP+bd31aj~nIwm-zG04F1gfEc<^k88iPk$L;>UZ>g;{@VlWI z{IU00?th8NnE6jAkBP#ofk%X9@EfkR29q)KA4|u$vHiF=Xy9=}GkAiYKTO8Ve~qSF zKWnP3HSjv289b)<*&0m7%s+buhUa0{^?NM?gID)HTZ74%`5&n<-lNpk8u-}I3|_4f|S@#$CLT#;qzY5LZ$Gy)o{w5}4=6|a^ZVRslzCAR9ncJvtpD-CS|2H(= z`=*ckmho-zJE0l;7w@w*n2eeKKXtzJte-ax8u*3K41V4FEaTf^GG_j_$>Xo#)xdXz zX7DqvwFZ+h^IuH$i~Dke23{&OgKu@Me4j;3#>{_hU1P4}*PUg4X7T!=8N6uEA0}hw zKear*7hVlKZDlZICVPZ65I z^SIU;OvcRrRGq_|=I1qo20k-1gGcuKVKQd^3+a4dVLvYzH1J}f8GMTO*&0m7%zr-J zFP`7;8<+Wq#S4XI@PgiFYcLrz|1otvK9*mX4;px!&=LNoYT*II+gnEC%p2jI`t)*ARfp&5L5&mSgZ=Km{s z{5rfE_`J{z{?xVdew>($ng5Sev!yRLXyC0w^RbL`T`TjaiOHDxt7MeNPqyg!!(`0- zcU!evV0X2(2HrC?gCBCO%r7c_*tMbOC(G*Jmh08PD~4w9uCA5wb1@mS{M)Y5<=;+i zt$}w8&EREv{xBIc|HoGD{2y0aYv89sGk6>Cv%LQg>w${KOg=X-GoRWIJO3Be z)*ASg&9|Lqaq7cGp^i$(Z>srTV3Px$^#tc)8FF-ruz{|F)Qn zng3%;cI)SHwY3I*Dl~(a?D@lF%={0O$3fxMz=wur@T0Dk{im3Wng7mT{BI{&xS)*ATT&@={Dx~~d{0cq%zvy! zyZmFTtu^qtp&2|z&mSgZ=70CXo&P;*YYlvVXacv0`OHJFT<|5oz& zadsrTV3Pxw8KeFBh7@Te?=BZx@p>^S^YyZv9-Qw${LZ49(yr zd;TyPGykjR>HM!&TWjF!LNoXh@3Y*06q7OY|9Gy>{}Z*f2L3EGgRk^H%lvg>GG_j3 z$b;`E)f#x6o*M^M}cp`7b7q#lx$CmkQ0`yId>B zUojao|6k155~!24_sCS&IRy2g9o@NwVre1iDx z&{J$BaTR+2wckQ<|;xR%qc=nz@ zOvcQA8`*EGw${Kqgy!$Rf2}-q{ljF;{ADr9Xc(302 zfq&}S(DC8xNACjNptk-u!Z(Lz@DIGt)?hMb>t`EzY#Uw;yhCUPU*}qDFc~xd@l`*8 zFIVP&5L;*lZ|z!H|6(#`{yUA;OvcRrNo{XW`F2;{e-!^SG(P1pZ1$c%OvcP#7NflVKjD3r_aDV%%=|CZ7{Wzr zYYlv9Xa?WpT6up~e6wpqxBp`n=|UW-gl6ys?$sJh#w`Ep8c$fm#}x(*ymn{? zAMJgX^II_)Gyjt`o^Y~{D-0U=w9pJ*&HHQ(CS&HmyF7jpUJblgXa=9?T5B*FGyg9a z=+^&#)z%vL>(C6|t>+JuG4ub6JZ=rI2L4-U27lpNnZHy_#?1dJ)m-h%mGKAhb)gx2 zi)&^61Th&i|GVbz*3aE)YYlu~Xa--|^M}cp`5!HhW5TO}j}Oh@J6$XDn~BMo`ERG1 z?R~lOeGTzWp&5LXYpua#%>2KeuUkLgsI4{5?lrK{#oM}8zONxBW9EO8d~fdg!?%WJ z@c&$E4JKpepM4{n?`1DHZ};C;mNWRqoO`*w;bf-F6I47@u8s^yrlQp8cfE_ z{~29x{?o5J2Myf2ZZ`M;@3XvLDJEm)|H#bUI{3TVS_3~8n!!(dj@Do@X8s4uQ_+i&tgUOir|9AQ>|5s{j4g5`L1|QV(hsl`vpEq6S|2ws{2EHIPgTM4X%lw&Q zGG_jZ%VUY~`akC{{jJxP>t8V$GyiLKJ$s#B*OvLW#W#j#@M1lGn2eeKPTw2$?f-UG zTWjFmLNoXp@3YLmEhb~;zxmXi{}yU%4ZKxo2Jh&7mh(3;88iQVG@sADYHJO=UuXtz z=6$vXlQHw3LLO6wR|9`9G=ukct-N0&CS&Hm_>|rHSwd~CftL==;K_UbFc~xd^(OE9 z*H>F>;Eh5vcrov@%zrB;W9GllWS#%MYHJO=UuXue>wT8_W5s05{9n-+$g65=4a_)A z(G1?(`z-5UOvcQAfB7EJ^M?-(&ES_^YYir2=Kq4mKwk85k@9?k_?6HM-mm8mlQHwZ zP9E2XR|DS^n!(SzR-R7~lQHw(QZ-xoa)SomCNzVub*(j+jG6ycV|Uxn)oN=Ed|hY; z|ET8=lQHvOQyy!DR|7N8R$0#AE4{AVpAwTX^B-fZE`%U66Lo@iu z-th%K%C(`_r>|&#_^R(0%l<+9Mra0q=6#m;o5W9U-`FMFS5 z{~#t~=KsF-fgkvOvE2U>e;k^@3ww^%U@~U@r^w^f@M_>QLNoY1*UJ4bF&Q)ePqdHy z)c3pP{W5XyyT=Bf-1CRYnE9_SuMK+sFyCP=%NhK!*Om9n#AM9;2a|Tcfc@0g8u-A_ z3|_D250f$TpH?2zg;xX57@EPYYi0ffF&Q)ePbTT|f2y|Dz@LX^@H9Ptn2eeK&GNV< zyc)Ro-h;s(dtF)oVlrm_d#h$2U#@&VLOck~;G0}4<5yxbX8sS2?AFi2YHJPrkI)SM zY0n=fW9Gk?JboHp4ZLq?20!Rp`M#l;jG6yqBf9*LtF1NgQ=u8WXU`udW9EOB&Nt5X z^Nv9SpBtLNk9wcw`7|*ZGyl&u-_gH)-lMYr7k?R=!Do7(t-)l>{1=nQ;^Ec6OND0e zXRej~znF}f|G26d&zBoCF!MK+&o*>Vlrm_FOA>*eP32vYv9*HGkBbyKTO8V z{{nej7+wv0NoWSY=vr$q88iQ%jo0NrOl_@!4-d`Y^Lzd<88iPgbiQ|{pZ5(K_?*xT zW*)41e+njJ=D(plHVUr>-ZV6WPj{^~n2eeK$K!PC=M%NH24;SZqWN4K8}$5PGG_jN z()r{SeqK3f;NE$w!5?{!@_dw-jG6yp@?E^=4=)v(!GCnEHJFT<{~bC{^vdCVMM4LnKmz4Q4#m|Q3?|N;}^M}cp`ES$xd53MQw${Kqgy#3h zpY%S<{F!1hX8y7m<@ng4w=cK-LPtu^pNp&9(X z=P2_#iOHDx?<9|%!>fUJ3(eqrT`S)Y6_YXZpJRqD|D0-T4Lnb12JhJOhsl`vKQ(>l z|Fqg#13w#@!Lxgxt-)l>{AZKL?BUhGbA@K`ldhHDmza#1{|y>DV0^sRz_-M>g2A)) z{9!U?{?AR*t)J)B)*ASw&zpNLNl&ERvr&+>k;n2eeK)w;&K#;-dE4SaoQ z2A|-4mibS_WX$|O)b+?meqB<&?;!p(G=s15K3jvynE7uvdiVRsDUYSXtAUpd&EUgbEAuOg$(Z?1tQxJ> zVYLR;V`Fj2^88iRO59<8?ptjb)SA=Hp z^xkJ{Fc~xdZJW-2JGHe2-Z3XjG6z^@>nLk8hH8848Gd6GXIj8jG6y3V|MFjS+%tW zULiDtm+JY$WX$|0AEWc1LT#;qrw+~FrM=HG|EHLYng1)=2frHo;s$;rG=nGeK3jvy znE78SkITZVf&Unq!7sa3?jMQCnE78bTDN|#RaB~o?mlSXX+kr2 zTJN*Wk18f(mY;6}@Xdl+12aBbG#{&-()(-;CS&G*s>VxC^KsKMzmu48;_46c&4POT zg~^!tAEkZB(Y{|9H1Khu8GMT8DDyjs$(Z?Pzj1!=ulsLxVDORNXKOGSGylWoaYT4E z@X?_e{E};}!DP(*f2QsEFyF4r_`g`EHQ%1U!N2JF!(`0-Wi`sbFP)y0KFj#O7XF#q z%>P&0b^rKlwY3I5FEoSyxP4b&{oy~kHuU%P(vQ3Pm(^B(__fdsKG*v!*GFP9X8C8| zs`H;iZLNXl4$a^fz0b1$6q7OYe`m|i|6R4U2L2#4gJ<(TTZ74%`9Jcb&j0UfYYqHZ zXa>LSeU|SxiOHDx-yn}0!>fUB3C-Y#T`SM8ipiMy|421k`f_D{E%DZ&8GOBKW&B4> z#?1enEwujC)|z+4AB1M`7CnEMjG6z~n|1z;+FApT7n;Fud!J?fi^-VzPoe|sq-tvo zJVj^*kL7)~29q)K-(Zt2|AuO74ZKNc29NYUTZ74%`R}@M=f9iUS_AJ9n!)RPpRK`U z%=}N#!T&_HwFW*VG=q2XK3jvynE9WzewY7jwY3I5H#CEf_dd(_al~ZI{0HlG{`;w| zHSmF<8GNSqS?=$P$(Z?{zHaA#hT2*KpBn<@=Cd7tI^d@&g_|H&8X z{HIV`Yv8FvGnn@v>-if@#>{`L1v~$-)z%t#+|Uf3%=;|k17b2}{@FWXyf1d|{9WH= zIfKXaKFi-%OvcQAH+k$HUJblwXa?WmS{XkSlQHvuZ_X~``)X?q{84BI@7nW+$(Z@? zFl*<(quN>n?-H89?|PqQenl}EGyjig?EF7bTWjFYLNj=K@3S?SjG6z489M)wYHJNV zS!f1-3UQ+4;Y(w${KOg=X-E z-e+qt88iPg2ic$5`Rj zz~h8w@C&ZB29q)KKYHRW|1oN74SalP1`qG~!(`0--_lL2x7F4f_`T2!KFa$n?-z^7 znE6jPL6?7ewY3JGDKvxM^ghe?uf=4{{C_%L=fAhwS_AWa@uK;+#;5f@%lM?2jG6!0 z<97b%sI4{duR=3;FV9iVf5c?W{O6I!yy4Zr3xsCyS+2DPlQHw(T+eWBp|;k*TZLxu z+&zDojG6zFV|VN4DYdl*{%2?gZ{~fL^EWXWGyhLI`(dA|tu^rHp&9&y_gUu05R)jeNO518b<^+wo8MF|RA%ml2aO^H<3zkAH5^ z^M}cp`9Cvrx4=Ku)*ATv&4wUod&+ zf1%o1178xFf6H($&r$ZDVlrm_UryHf|5t6TfxiyT;PbuD@_eb7jG6xflXU(Ms;xEf zBcU10w}0yP50f$Te`{pt|F+s%1NY8r48Gs{EYGis$(Z?{DBqKM{_v@x8T_Ve<@hTm zW9I*kj-l`RakY#;i$4g>;1hcOFc~xd@97xveLrpt8hEluti z{JD%l11}z$!Bcymt-)l>{5R1tXj4Bf4H|fh&fvX8zsQIqL8KKI?s!=S#(8%={nKGi;Bktu^qIp&5Kk@9zsA>)O!c%jR02 zTljh{=Re}DLNoXu-e+qt8MFMyX?-5=>vhn;z2|NW-puS+0M@WX$}(>-ICT_gTgt#AM9;_tZHy z=i0Rf-p9|y2L|8aS{c6*-|5=W?PqNLThpt7#|zEiJzQ%ICS#VLYl&a_dH0}!e;t~^ zWA*%DGG_j#Xn%F8@3#gGd`4&n$F)RjFc~xdVcLdA^X|^VlQHu@L(e#!skYX@ z=Y(ePt=?z(ew>($ng4hFeVy)omiH6IWX$|e(ckdY_**vc8KD{clxwZQPrEks_qCJ$ zZRcJMyjy4npX^%Me#B(V^3SfCIefYD{DXMz&0m4KZR!S&%DppU@~U@cMtD=0r#k_HSqnR8GNbtS?=$M$(Z@SI7a9H zlG<7WzZ#mscX^*>es3`uGyk{r8-Lq>_vQRw{9b4VzuZk;QK-|_#@ZK{R=S}GymVJ<~(0+(7@-1X7HV^mH8FL zWX$~cRZZ*54H|g=&+5 z2A(7|gI9H}HJFT<|1&zk{8MeMfu9e};E8(vFc~xd6XkJIcs1~;p&3k`x_{O`d$XeG z2eDiOuM(QUC%9JL1rn1d%c_!59&1~n=MR%H^M8JpZUMgEP;20q^>0P_ z1^lpULyxs{%+%G-skZvV^Mq#bbKd8ueam6989M*X)mDFa%g_v--TN%>f{Mvlm+jo* z{}-3X65-XrONVCgrmmG|HN<4h{Kr$x_`ckrfhP*h;Kf`kbK!}}nEBr@efQsTquN>n z-x8X^lG%*=7|IIWWy1Cj~ z18*6c!Lxdwt-)l>{6EroC3Ah%8u(v6t~oGxQ}45E|6(#`{_joN{e9n8TWjEtLNoY7 z@3S?SjG6!8BRc;h)YcmK=+F#)*ZVB@dc|bS{MVMpI^os8>xX9WFI;O4CS&IR?u1?b z_te%J_`}c)UaRL1lQHvuP1pOc$8~=LzZIIn?|7fB!DP(*uaL)|!>fU>4$a_KU26>{ zW9I+Z@NWG)uC~^|PlaaipL+f<88iPY<#APbHSo2e8T_bgWv&o088iQ*Rdb9lSMIfo zj}Oh@KfBf%OvcQAE7kwlmm4(jwxJn(lxyW)yO@lbf4BBWeXMrNonUn8o0Mz8+@+Um3M)} zWX$|;((^hutF1Ngt)UsbV$UBYW9GlSuEb9U$ z)YcmK^w11m&igFiG8B_B^Iu3F3x`(&FBY1?C%M)dOvcRrEbT+i_WeqE*Ft=5Xa+CX z^M}cp`A;g3$-=9Frwq;DGhHk1T8PP*`5&SCY)AI)x53{8yL98sXKzYlmhq_grdzn2eeK67pCwyc&3!&{CNiBWxvN!-t`r~7Mj5u_55KnX8xDT-Yq7w@yYt0^X9<}Zs;9)G^a`)my+W9C1Z{(C3)|L#Ep zPZgTMao@W&n0xb?|98zlsrOmFMJgs^=6}D=Cm-LNTG>B{ z$(Z@iq?(z1xj_TZ7Mj67ajm?oBPL_!|ANkkU-a|h@~sqc?;9%y&)D;a$(Z?{CNHiZ zY7N|*W8C29JxBRgikOU<|C*{<%a<$P>JYCRn!%^K)*4L4%zrG^kL}BqcM-+ohGy^@ zu9a_fh{>4w->LKYyZpSq%w;CNH#CFC?D@lF%={0Q$06a>z=wrq@Exv|XSu{=%>0*B z%~HPHpn;bS&ESJvYYir2=Kr3qLEiW4k}`fS{wOqqm+1M!WX$}3FOT!XtAQ^H&0wCx zt>;%T88iR&<*`9{HSorv8T>of%CmrCGG_kcsHQ(3Jv@PX4Gdn-wbo!VX8up>dgmFx z?in=jbDmuGHG=ooftvm}TCS&G5t!k$8<;wkE@rN*H92{N^{Ik#ue$ch@Efz5uGyj)$z5j||_YWHQ_0SAH zu;&kxG4o$v9vg&L18*Ff!7sU1=IRoYG4mf+HRJhmga7GTYcLrze^Wj0P1G8A689PyJaDZwn2eeK zCA!~tso(b-H1HonGkBt&KTO8Ve{*?k5nc`4yDx3<#a`DMOvcQALe)>?%a!p-@rck2 z-psY~u8x?Dng8E(kMefEZ&}8l#dn2f@B}@7n2eeKKJwT%yc&4F&fV!4$a`dyVe>^#?1dFjiKG_<7(ypruf#- z4E{;aA0}hwznDB053dGZDl~&{bgkUq6q7OYpG-BA`*LOcO*~a-1~2Mb`IeZNjG6zR zH2`;|j|-N$uEf`bX7Hpvf0&G!|DN*LE4&(bpU@1x!nHEjm6(i~|HP`%uw8v`zJc|4 z*thS}!+Z4nVKQd^Dj((XRqOe~WX$|W%+W0{Qf;k)CkxHsX!+VEj@Wk#_-nA2xG0T6-%$@(KYHJOAMra2A#QQAcdtx$X{`<!H;^M<@q!*88iP= zrq}vcTWd}gpAnkD|L{J`yR2d|X8!wVzJPtz)*6_(1d8VK3Y_eHmh~?tW9I*wo}uNt zC$$EC%b&F!7`(UVDBtQ9lQHu*Jx@EaKUZ7Mf5el7X7H=tXL-I+OvcQAJv~FazCTx6 z<~kH_6q>;kd7rJpWX${z*L(*@_#6o3`B?GMp&7ic_gUsT6q7OYzg6=g+!pg9H1O@A z8T_2L24gBBG z4Cb70j+#|h!pz$b@h@aL|zKEDtdGk=wj^7+GYJ%5;tng3dIb_=Ynw${Mw zg=X-c^LF)h{lI&&K-smx}o7&>TB)l4U^3V)k+qKqUGG_iyPt)apMs2Nud*6UFctp=1CS&G*y?k%z`NKDdX7E$4 zmHQ)NGG_k2)iL@!wY3I5KQx1{>-ocE%=~{UkG;dIf!ojw{*7zpT~IL@GygSJvz9Mc z?*EF{4b9-aTq|=SiOHDxPp$Kf@A-Mhpn<0i&EPe9{xBIc|K;?)&+`7>&!B;S5SqbL zd7rJpWX$~E(mBA}eqK38Wh2i>YYYn_nXa>LOeU|69#bnI< zvv+)W-)B94)?{Gty546we-o22^WR_hix2So#$~QCaqqsg!E1V-W&bQDW9Gksyf*Cl z!<&R=@P4k9xyHm~%=|aiIm~8iYYohKR?!SzzvmB=G4tnH(uI5e@M57EyoqbA!DP(* z7tt8+qA}Loz)OT?a6C)e8cfE_e`0xz2(Jd7G&F-3cC9s-jG6zuV|M%h`P9}Lc)`#N zww^ys#>{_Qd5jlc4Lo6J2G8SKYcLrz|AmHk`4?7OYv9E~GkBbyKTO8VpL1CYuLd3& zn!yXYR{p+XGG_kwj?v}6Pi?J%9}LalIF~Kw&+;c@=6}9CE(os%zBn|4?{Td>A1Eec z=D&$*HudGoTxQ}eLNoaHuC)e}G4o$g^$YoO<@s>&qM;eQv1?^6Gcg%6f9A1ZevMiK zGrvaBe6EcJdj2pOGk@j?x^wjI?_6u(dqOjq`8DeKIZVdP|7Y?zEW8@{@X!pt-L>+q zdNCO@|IJmig)dj;N)vAtn!$&ap&lQs~^Z$iv4)^5-4SZB+24C!2 zx&I|5W9HAj0q$AU8kl<)Mf3X?Kkxa&WX$|Ws-C$(C5-z_r$3GG_iesD4LZu6(ONyh~^XpY2+i zi%m?%%zr`EEac0T{ik@*&58c-&z)b z8k)ho&CzvGw;yY8uihF1fx z6Pm$qxz-v?#>{`08N2+us;xEfPeL4g5UFZLm+FApD6Pm%l@jlD=hM0_*|MTDP{9jO8 zYv7kdGx$sIvo)BEng9Co*dV+bc;nCve$KTrf03Asng92v>he#cw${MYhi344J%5;t zng35G>HPOrTWjDpG=mwtsrxsWjG6x;np=5MpJRE@z)OT?@Lt|$8DA2UG4sD(V+c2> ztu^q?p&7ie_gSt_#bnI<=aI*};nlzkgl6z{uC)e}G4toU7VlX1cc?Y+`=J>;ch4Ut zW9C1(Jf;Y*2A(=JgX6mvW&fssCu8QnoW?_z_i>Rj{wDrGXa-N_eU@)ciOHDxzdcU3 zUfxmr?fMbFADY3uCsDUgn2eeKpGWKbuT)!W;A=uN_$}|VtRFEMGk@mcJ1@Nc&$$Ax z@Vat;P)x?mze_*r^Q-)(=MR%H^M7R4u7|&?tu^ptp&2~)>|K3b|L{Dn4L$#vbLOso zF16Jko;NguV=lQe|B3o1W0wD6jkiDI-e}1F{O8m@d@kRwm%p!g-p~w=d+lYeVf9bO%>R1r!*B5YdfESrZw}4iIlRyE_Z5>d z^UwC-?9XrVeeuBH>%7mh{}+=n^IujEXDz3;*1#)hp z1HTcP!OM7`t-)l>{C60?^W9Nxt$}w5&ES{4&(>fvX8w$QGbUeaV8-N&=Hv6*d!Oa{ zQB20npSc5=)1cPCYd5~me0~GQ(oCS&HGJ%i2j*vpR<{xEYIRDYO^ng0?RgI&_c zeFqJ^OlSr#<$ad-qs3&*{CU@UiqSo515X{A!HavJW&Q*)88iRRb<~ev@ve0_e^CEq z%=}MO2PdhmHSnpS`CP6$^^TA5&aMqTe(flaox-bucMZ+p6I>g$`CYXO9H!mwx6hZt z+P#1Kd?~y`&mSgZwtiGT%Ht=xC0P0_@4stdGG_kVD;nwBU3tD#JXvT4Z|+)ozDT@< zYeUz6_6`E?BfKzX7qH|qIPMjd=S$^F#w`Eu<#B#^HSk5D8T^cEW&SZS88iQP^&5H5 ze>Y`(So~pV2LG<-50f$Tzd;^1hF1gM5}Lv9xK_r8#bnIXa;jns&1b!88iQN{1;dK629D^ zftL==;I&;V&(Da-nEB75npu6hK?Bbbn!$^?R^|s5lQHvW-^W}awFcfj_KOD3-1CRY znE8L#{SW)(`uBy&nE6kt-wWT0sWtGF{#zOtypwCiU%azxL-#+AX?tc)(drK~r)bf9 ze$h$XtMzxD$e88-Q0wy}U$15SS^Q~e20z;SeZgeR{MVDm`r*~U8--@@2dT4?-Gv_n!)_`>faY8W9Gk!&H*-!bCCw-K4DqT;Njk9YcLrzf4&=VPi*TA ze1B*LZ|phB{a-N|Gyk{r19)3)t%2VQ&EWWMK>3z~`X^)N|6PAyZ+f5Q{;!yfng4`3 zhECKwM#H`1s=-@&U2E`Gt_}TtJ*3~u!~VM&H1Iz{Gk5~`D$n1F$(ZFoLmp>_R|B6D zn!yjcR^GoBlQHxEk!rT|{DY}d3LAz!(`0-57PeRVBfC{8u(|S89biso6t8MFM^J^Bab|48&{@K>&t`9H;E%=~|( znk{{~vi}ip9h$-SyH@VcipiMyt7Md~AGhfF!(`0-7uNb*#Mf(?KS9iMB4s&)SMjpt-)l>{8c{6e_su$emgz@lQHw3ZMv?9+11t>c&^Y4{<&+d!M|{A z=--#`4DJRh%U*_)>uNIoYt9qa1TS{UwX8D)Uz|oRwYYn_iXa=w3eYOUZG4r288{V91YYjY4 zXa+CteU|Y{_1U9WBA*KKA0Bi=MLgCB6MJbx>G(6yoa|Lt|Xvx8svlvs&(%ABgXeZ_==y(iyw3kEwbdVf zH#CF4@IK4?^cd`V2k%zsgNEEZl3%(vppa{k@;_q?t(n2ec!b`0Wpw22?9 z1_m$E^M}cp`QNN<_!i%;2Mv5%Xa=wEeU|xM#bnIECL8c=4V;OvcP#7NdOpz1RC} z4JKpef8eCu0tczBHSnRK8GNw@x9a#9e2HsA_dnaoWBc%G;GIG<_yE_+{L*4FX8G4p z&6>X4pn=y3&ERcaYYir2=KmiJqJ5#Z*1%tdX7K7gf0&G!|4H&VIlLP9w9pLxw`;Az zWX$}})49>_dgn;+1)&*yV$UBYW9I*vjy<3EjzRDjp&9&J@3S?SjG6!R<96HU3~Fl) zJacFU|I7O<_eaEJ%>2L9c*TEx+@c(R#b1YJ@O0j1YcLrzf4=4OieLAa`JctFhi32> z-e)=fipiMy-z1Nl!>fUB4b9;AmQR`gS^rMP%>O?+NBY9go67bt{wg$sZ}dLP{FY)e zX8tE>e|WO*7Y7Y|T4)CU+xslrznF}f|99Pgp6GqH29q)Ke^cj3Z>g;{FyB`wntyBI z)!z0AzvkM|{pS|rcmD-HQd|AuABSe}8=j+_Ux~?><=;@-*haqHmFsKqrlA?Ux%XL~ z4-}Iz^S@r_8#nlQM|nP6d~;|9Gk1ACzQAP6{F#?xq3~+p-g%9|*LhueK3q)3%>TP? zKMVByVKQd^XK6mAvwdEra{VGcH#CFqpT0{}*AM)FYeTo6Rpha1cs20qp&5LpYvuYy zOvWrfa}O~mQmuiR6RBuEKhnxQf0&G!|9v{QxW9Lf0Y4O)!OV$N*AGm_%>T%Vy7hUK z+FAo28=ArQdY|R|N=(MgpJ(5BCcoCeJdR@3VaWQB20npSkaulfTx$6ZU?; zFwf-I^#hYJ^M6L$bN?Ay_<7&f%l!7@alFsgU@~U@*>8m33)d%QIfI|}KFj>}Vlrm_ zztuI!d463|-k%kpADY4Q_xxcpX8t$p7<7vtm&)~#__ojt{*Cup-k%kdG4p>(V?-~j ztu^p#p&5LW_gSuw#AM9;zw7>udjoa*fytQp|5q6}Kd3eEH=cE1@SVN&1K;J^(ES_F zBJUht4ZK@u27l>VdB0dp#w)DWGG_jNlE)R{)xcMUX7J;# zwFZ+h^WR_f2l#U3{=1mxd&+VK|IzEp{Sh%4GygGFGnOw`o-Y-T6Pm&MxmNDKi^-Vz z^DZd&hiVOcZEyRBhxhzpGG_iu%VU}FYT)HVGdSJ_Z4D-4=Kq0yU>~ZjH8A&distus zV$PNFevtYnW9EOHe2?$>!zYDi@cXX)|8sxm*q%R3#w`EBI)*Od$JO$Dk$CaY44!U^ zu7kS&fv0zE=>Fk)UC-X&*R|#RQ+#u11~24&mgkGaWX$p}HgT6{akaGuUMe($uk$|3 z`KOqSng7HSb^asN)*5)y&4wzoKgou0?7M{6<`t7;N5WYcLrz|3&1n zXm~a75}_IVvTNo2L@^mN|HpI<^0?Ys1M_{gqWQPh7Vi1OWX$~kqwD=I{JOtf|BAl~ z&EQ8pN4dWvCS&G5w>;(vuLhn!G=u-`TDkrelQHxEzRt&{@$<4We}#DZ&{_1jUjC0;|k^aRJ>_u20!jO%JET5#>{_q zo$t-z=Y4|)o;x&yH}F2o^{JSQnLo#V&Pi$w%sENX{QP7#@3S?SjG2En2i<}?uUW*; zb;|j(m~)c4|Afhy`R}OX=}vxJE$@GccMZ+p`MuB9U@~U@x9J%7*ErTT@ExHUyo2{y z-v1JlG4tnH)kVXrftLu);9FfQ@4t)5nEAh=i#s^$51`I9m8Z{;xv zuLeFKG=pDut?WO=WX$}RQO&Zx+@OJ12+iPqT`Tv$#AM9;XI0H?zTBXJ=M2r@rClrE z&k~a{^H<3*t;+hWZ3FAF;oIkL;aPhAFc~xdopp@f#gE(N{X6mQp&2|=Z~Pyg*|nkP zC$q_8_V8+8=4mLo4BpA>%KLF*GG_UQsb(}^uB;#N@X!pN)wS~ct(c6N|9yI1@qT}9 zvE2U>KNOn5-?-KqOvcRrAG%-gsNXjz-=7jc5t_mG_WWToX8z~veC7f_uNgG(#i1Ge zcki=&e@aZo%>S38cN^TfYHJPro6rpYz4uw>M-`JX^PgB7`v|qQ2A(uDgU|6kTZ74% z`G42n7thAk;|om2%>QX^W6$_@SLUA=KNp(86Zmhbyk91s(6ynzuOG`}>+ove?Lss7 zDc8#U^I|e)`JdPJ_JVJBWqvd9%b^*(RnH$LW9GlIJXQ&>23{>RgP(J)%x@+pW9EN~ zt`Sc4>xT0EAn_TY8N5=@A0}hwf0lkDJgZe};B)=AG%)yN@3VYANKD4e|0?}PuJ+$e zdHz{^U1$cM>3x>*Z7~@$|I2g_<#NBTGHBpGg=X-T-e-CKSxm;vKl?^A-)rXkG-Wye zR?Vf}XKOGSGyjpg2ARaKOUnGK;>klZ_%hd8gUOir-=XV;JN>$$%x^5dCp3dc^!#Bm zX8!l<8sP!IZWuK1!=V{`yZ2e#?!7l@F!#1=ewd7z z|NJ^YE}*v7zzc_F@JF7by#FXBW9Bc5Q9i$&&-*OjuMv~+{|o=Idj7CBqi@f>$xFN9 z4?6mR+L{4gB{YM#cC9sd8`p*&-)Gjp&C;uZXAjNb6R$FV}_d+vxM9&{4W9EOWJZ=lG2EIKsgWq(m%r7A(W9EOFYEJj% z1`T{xXa@hqwetNwF&Q)eom8{4FIUFL#Jh!N@Tsn~29q)KUqd2D%>36`df2!BTUTwZfj0=v;H7*1Fc~xd1DEXl4^mre;6p<*cx~^q%wHrXW9EOx z5}p5$aS zz;}ga@Fm`7YcLrz|7REN{GU@>Yv30{Gx)FGXZgOin2eeK&EWsK)*4L4 z%>OvmAMeWz8u+Bp48F;=@_dMxjG6!Ds@cMqE8l++Zxx!s$GX-UOvcQAPSwxl%a!?Q z#q)+{@Mf-+@4tx2nEC&Ap>F&6N^PxyzX{FYIePvu88iO}3t<#{%Kizzc_F@XM~1`y*m9X8vQSX1FgmXyCC!Gk8AN%Jr9+ zjG6xv^LOk2Nwu{GekL???)i@{CS&G*jy!%DUJd-~&S;ImyT->(sqG4o$QH4FN3g9ctCG=sNrt<0|_CS&IRzAlnKP+M!@k3%zf{+>Tf z#>{^Md2AS74ZKNc2EXT8dH+jH#>{`XYR2^C1`XVVX7Kv1mG`s6WX$~Un77+L?^IiB z;Cn(dc#NJuOvcQAad|8eUJbl-Xa?WzS{eTllQHvuex5G>3uf2*xE@Ry+({KK9(>7mYHJNVR%ixa z(DR4MnE78bQ|EuJ+FAqO5SqcGd7rI0yEb(E^Q{>=|F_jvfB3!748Gd?Ec1_v$(ZHe za=OlcE48%--X=7I-}FAq_>!26ng57sI{%SsYYjYEXa@ht`)my+W9C2Q)SdrSYHJPr z{m=}a*!wK=lZ(li`Oi01=Rd#NS_3Z>n!!_epRK`U%=|}8sr93_){GQS7Mj8HdY`Sq zWX$~Eo1*i7Uu~^{KMKv@iM`LVe#B(V{O^{>J>k{B_lIWiyRMb-Z7~@$|5+#R^3SHW z*1&UyX7F7-f0&G!{}}QZ9$pPRc4!9A;#zAk88iPeC++f&rMA|<MO>M1#_Xy44;ofJNpIJ=C%zp)WtQcMmymDv;@8Vi(Fc~xd{U`47AE36@zz2tB z@bW!>n2eeKm=kLKtF1L-iN^`e;QhSM^8SLDjG6!Q<8}TosI4{d%b^)O-1{u+Urff# z|32O0zF%#vfgcLZ;OD&0a{ehMW9I*O)8&6cZLNWy4$a_uz0dM~oS2N6|8DZwJ-ixt z&(I8h%(d2FGG_iO=qBZgYHJO=a%cwc+Vh9WnEBtS=XLM$=XM7Td~aw5^PQP`e;FoY z=6|T}fir(`t$}~hyFU)!;eECSlQHw(MjqRSR|D@5ntyBI5Z79R$(Z>cGkUlE9ILk0 zz$b)e@YX$ln2eeKs`B_@cs1}Ep&5L%Ypua#%=`y>hHk%jmac&h49(zGdj2pOGyl)K z)idnhYHJPrWoQPs-eihF1fx6Pm%FxmM1f#bnI1vOq5Jz@qqf$-*N0~COg(>?jG6y${^@c}yQ(4Lnn524CP>8GjR#G4o$x zx-S2UYHJO=a%cum+w+IXnE5X}ZRfv;+FAoI9-6_+d!Oa}N=(Mg|9`s1|Jtwn%l8Gu zqxJmZgjbbYXYkxTf0&G!|19#DHM|;lj?fIg$hFpBGG_i)YK-M7wY3JmHZ+50?)k%H%>4hQ z@sQ7aT%>G2;{SwZ@SnZUGQWYCjG6z1^0+9x8u-%C4F1%$vi*q3nE9`vnl*j7GQXdA zozM)vz_oJx5|c6WA6qqzFE?o5@j^3rb=O*h$(Z@yI{1@-DJfA5hW9EN^#<-63aj!uG9}}9vXLz5j!DP(*XO+in;nl!% zhGy{LuC)e}G4p@ky7lvd+FAp@9Gbzi^!#BmX8!BSW4-Wd;0;4F_&L|g_?wuFng2Md z8P}I9&)1132+iPiTr2ZGi^-Vz|81gf{oJm$*1&g#W^mKfVM3eDiZ zx>lZ_6q7OYA5S&o`*P*^DDgz08GNd1<@sST88iO}GzR;ikIR<(@8U;7GkDydKTO8V ze}8!#5MB*@aA*eK?^?P4E+%8-kjF^m>|J@qH=l#7} z19P9DXa+Ce^M}cp`Oho=`TV}Ypn(?*&EUISE8pJ~lQHxE%Q)S3bF11~1OF{FgPD7! zu78+}ng8DM*eARico3Swx470COvcQA5!Em1%MBWMiO>xGscWslWX$}pZ@Tq!gW6gH z-yE933-|nCGG_j}$b)++wFdr4&mX?dwK6}Fn2eeKBC1)`mn-W>%=?pNIe(XOXRm7w zCS&IR+1TCs`CM(SfxigN;DvksFc~xdQ{{15cs1~up&9%y*UI>$n2eeKhhuj6KT=z3 z;7>y{_>`VMOvcQAb$Rf8h*|@$-SdZ;TfhFkU@~U@**9GHp35V{yZ^SboWZMkpRK`U z%={OV$Kv7Dz)OW@@cpipJO7K^WQ`sn}$~dZxNcoC%M)dOvcRrn$f$z;k9aO4SYjr25;Q+hsl`v zzcgCs|FYUz12bo4(R}{QtG&T~tX8z}CJnDBoE;VT23qmva zIoHbdk@$Jn2HLxldf2dRjEnKE&0;x&f9qPAe_l++EdNBRF<-8H|4YnsSY+p)r;xecYwI-ywb`G=mT7`NL$){1=kP!r|4xi-l(JfU>3C-XSTr1~4Vlrm_2dd^EU#`5rDLynbgRgL{ zHJFT<{}`$t?#q?;o5W*>X7B;7mG?KrWX$~kq4AJMeO#o>-z9z`G;{9xk1i%-=0Alz zrVOtJ{$6MX|J}7Rf0vkyng6deUh!)mw-_|=d7&9RdCwmvW9DxfqnOyoEd~udNoWS2 z>wUHclQHw>+MY3oS_3oYP&6NZn8^EV4JKpeKZ~xxXZ7pyGQK39BQ%2s^Ij&HG)_c!(LWX$}RR?RZu)xgV# zW^l|URIV@d?_|vUFVq>)MSk5`o*xij8k)gNd7ou|X)zfy|Lx?leRwtSPN5lmfotXd zil(uKT#!S_3~7n!zjg{9!U?{)fxsi12FQqeCeNn2eb}SK2E5e;prKtmhAtG4r2Y&)dx5&)t;g>%?=1X7JXomHENM+qgD# zeBdEnFF)+p&4UL1M`#Am=3Zs~Z7~_M{JYEJC*jq=dxd83gRZp(lQHvOQT0FY<;whN z;#ER3csJKtgUOirU#sU~uJh+&%J-wiH-={L3O#?AjG6y&@;E-c8u+Bp48F#-^8IKr z88iP4RI{NkH)!BZLNoYS*UJ1PVlrm_x9fSEJN&tuGCzj+?$8WgzvmB=G4r2B9@B0fs}4L(Vx$kerpA88WC~0wnbn6_9KK ze~Kb1S&*b;L4qhjL6M-64G1V%QOQAlRn-2R(`(IHzG1ER{KNXJJ?HMTx!)VA`&L&^ z)H#yf;#^4w?-`oG69)b;88iQ7biQI)KW|a?ZxOE$n!&qz&)#4%X8wQDG5+Iz+&}8z zCqpxMY46z^OvcRrQ#!^!#E<(&9ej9b2LI7}_6CzN^Uv0Ju-@a(eylq(_+anZ8%)N` ze;;}58(tm!;m{2Jy=%R}WX$}(qvP4{`f+X9zgm2DXa?^+@Q2Bm`LlL`H5Ii6W=%!W ze0{~Yy=U3KT1>{we>)v7Z|}#=qYmCFG=o`FQRjy+88iQTbi918A2*lp7x8aGGk9C? zS=Q%>$(Z?XERRjXtAjTW&EQ|VR=!`vWX${z(t3u2eO<$-gAWbO;Ee|UFc~xd`Q@=d zcy;i?p&5LjYrVl_%=}N)dV{a}x`R;%e?2sVCk*^yGG_i;%VV4H>fr4|Gx!wOdV|TB z`TtAjNM4R}B^~@)Xa;XJ@Q2Bm`F~O#2ZmP%e=0PC|LIz9Fc~xd*;PM>KW@~)bBAW| zCtNG%|HWj?{IAhDifjG6MY(=Ne0^vJ&o=Of$(Z@?A&))7tAqCm&ETtDE7y;R$(Z?X zr}GKh`+0@(`6J#bG=p~^_`_t({O6FzoZ;2M^Mq#bwyu@WA2As-|4Vc};Zi@ZQ1)*W z|1dOzXCL^(WX$}xlE>EJ)xq0^X7I(XmHivVWX$~krDO1y{kVM8!LNm8@RkFAn2eeK z+d5u;$B&!K`APAALo@iF-m|>F#AM9;zbB6i!mEQX3eDiRTr1}%#bnI<_t!D_0e)Ow z_9qvAJT!yPANa#$%=~|#V{neeYYlv*AFGcH{)qQ1`;&{wnE7umj}L@b2X7gg!I!z# z8%)N`|2iG-U+>5LqYl0?G=n!A_`_t({Fl)2@{)esT=uUJFB6)h*BR93 z2PR|Yf2!t?U-fxqnLmhGA6)%mezU9oFc~xd-89GB-RFIy4&Ey?gHQ1sW&R*0W9I*e z<};7_yr$egMf``*44&vcdxOcC`L806Rl}=;R}anLhg~c8PZ5(b^S?~|26WsHoQ9c`p^vimutPjWX${zSN#$GxKRhQ&qsNj!B=}-ng5H) znEB7Bn(_X)Q3nt1i)HX(Ue_B;#?1dYeZfDkvDUzU3(epe2L3P^Gyjjtde+MxcGk=v#_WH&}2L3P^Gk?=>1T*{Z24($* zc(%|C9y?!aP~TthG_Fnh`^AGg-~N!FcQ5P5#E*t%@J!ybtltomG0Q)LJZ2294rZNW zd7QxycwJdPCMIL%KT+%PcJp<4qYmCPG=rxf_`_t({Qs)+?N9r8_fZEw7n;Glde3tH zSxm;v|6F;T7hWBFL1+g5#kJmGGG_i?(fRgM{Ji_9ga0oygU=cG!(`0-H{_fozLIK&+Csmc>B-{-fZ9xlQHvOTI&gy@pXk|{h@gI&?2LH{q za{qcU88iPyRKr}g*1)V&E1JPq5By;=X8zyq+Vk@rjkN|oD>Q=_9{9s#%=|ah9C9O{ zSC;)%#H{bB`QbCXXW3s}OvcQAZp|U*@p)z0A5}adG=n$r9A$qMF&Q)e&+2^9=lr}; zS-&biCNzWR@}6aXR52Md|BG~v=wgkv2EHsbgFoXv%lcI@88iRqbw1|>Kd&?D;J=4v z@b|rESzjS0W9HA^cI>%VYv64Ez304VZ!j4%|MN88KHulvqYh^MN_m{GWns^~IzNHQ znECG|-@OO^@P45ge6DM~!DP(*zoGf+H+|k(j=#ibgl6!b1Amx|ng8+fI3c_`_~g(G zKFzgq{3Rx1=6{fC4)({D-`B*4hGy__uJs0!G4tO;^?Ul`%Js|QeL^$%K-bFeYhp5H z{;z93{D#I_1HT=b!MhLqVKQd^$I9cl@ao_bLo@g_*Ls7=nE9)GvgiMwANa#$%>3Wc z9P-~9YYjZc=dvS%f8ttMzbC%MwMpmyU(|e$wJOygKE>yPBZJ@e9OeE&Vlrm=vpE>^ zu`PVAHZu4N-m~nVDJEm){};{2{_69xQ3pR8n!%fT&)#4%X8y0~eDdplUb*a_DSj(7 zgP-!Ay}@M6{5O%urs37W9|+B0_SUJNpD-CS|D804+}Y=q<@}*|VrT|$>^*yf$(Z?n zO7p!#eBM{qw}=l9&EOrqXE}c;CS&Hmt=6k-=j&F={qMv(hGy`=-m|Q45tA|V|EboK z{LI&tj5_%C&HB`pO=;OW8$+zGkACJS@u5>lQHvuL-UO{ecmzZ;CDhZm^}6Q z*H^s{yQqHGcw7fFmnj(x=A3r*g2|I*eL}ev7Cz z@IU;uI5PNs1Amx|ng8wbxFfte_|DJ_j@Np**NFa|jG6zLsyQpXI{4hs48F~^a;>A7 zjG6zIs@cjPSN1v-ZyTEL)&5=A%C(?kGG_iNne1bsEe8HD88iR4^d5ZM-Z!j4%|4xsa zF1$K;hR_V&$+fZ{_Fc`O!Q9n6}p@;HOP>~-b07BLw!|6}xi{Jg&}M;&~8Xa+Ab@Q2Bm`O9Lm zKOc_vp5csJ*!l@;$mo z9ehY=25&#`hsl`vFR$ORR~Y=B4X+%U!JqV= zil3t^_sSK&FEoR9_MYYVLQKZY|HnEvcY~j!E7#JCZw}4imAq$fFc~xdRpha1cy;jV zp&5L=Yh|sHn2eeKSk+A9k1N-Ti>C|C;FVqL4JKpezlhGwE$Zj!%5RP0B|VZE@ z#>{_9osZi}W37R=4b9+%y=QMQ88iR2bv|w#KSwv};Ppc@cnj}Y_QDpEG4p31W%hTj zH8A@-7tQy2e!utZ4JKpe|Eku@zNWF(z;A|TF#9{#_ZLjY%zr<5d?>s+c>mB0e#N!2 zmyno@ng1H9S<@dk>fp6QGk9Ou%5QaIGG_kQ&d|P3f26V2z&{Sn;ME8IFc~xdZ%yC) z&(K(F;O~ZJFnjja=N~3x=6`{HJHOC>LmzeU#i1E|y7%l2CS&Hmtj1X8$Jp@d;4U@t*pftKjPY?^XF%E#_Ty? zLsIS~EPgRGgZZ7IzJFmdX8Cv0>uqO$-Id?E#1lg^_!;k6?jm8Im%cl4g+w=OXmGyjF;v2b{G@M57Ee4}foVnE6jo4g1E_8h9c18X3%QBK7qHlQHvuROc%m^Ya#? z4*p|k2G8d`%lS_+88iP2nvwI(V7T48GR2vKNV%jG6z#`o4I?zc)r5{QJ-hUVPvW zlQHvW-PZTQtAhu75E;z5v-Z}t9*ZnUkuIQ`3C+l88iQD}s!@ylYX|r0@BMLQ z{wzK+G=nd3tz640CS&HmzG^n`$CdMA;*CQy_;A!K%wHvwJ-=OV;193w+NASO z)8C70p=t(r@OLx#jKSX*{O~nfgkdDak&;q{Ag$fe{*nr3ZL%Uq|eW5nghS?^Ww6WPW)DA2FHEZ%kLxVPsS|& zviiPT&cFA{@wIrx&QBbZ|LgiZKg~baM;&~6Xa@5=U%ww=GG_iGy#_w* zuZwc8Bk^ZL^Lv4R&3pC+lQHxEkzNDW`Rk(0f5bP0W^nI4C+}Y1pOeQ?;nl&P56$3f zT`Th+F&VS`o2h1Vf83~pw+PMP&$`wdOvcP#<&*vSv+2MeCS&G5$J*@yb84(L@I0Xz ze70-7!RNR(>HF)bwVMCY8mm8iY-k40?q0pYWX$rikNMo&mHx13;HN0nUFc~xd&n(^iKdZ6Uz(@CM$qTx%yL zW9C1jJjRDt2hSXu!AH8*8%)N`f9oY%{%thY8hHEA44z@&50f$T|MU{g|45Cs2L4=V z25;p(%eB5@GG_kcF57r3pD@VYpnk8pF%VEB=6Z9OvWt#-?WD3?;2|j{Ljz~ ze$;#R29q)KKT;l_39k-5Dl~&%bgeg-jG6y*^R?$^oW@!M&lsA)pC0(bWX$}}ny2}n zt+Cd?=Y?i)=RJFa$(Z@iK3DUfLu0Lh=MK%_GrecI)<{go%>R3HHh=cIs5S6K`nRGP zJe&9I4JKpe|L7de|1piV2L5Ac2A}UedxOcC`R^-_{lcq*KN6b3kGNKT-w~5B^Pg?@ zmVb7QwFaImG=ujU_`_t({BNAC`QN0m*1)%fX7H@uvp1NGnLm4UuNYn(yh>;W-{4wV ze<&tn=0E?eE&l=A9Yv8j& zGk8t!S$@A0lQHvOM;_~jR|j)1=<+y&SsPT(zrke8{NEhc^1r3A*1-P`&0zNQtNt(< zGynPJu|RlrFne{>{O}uI*Bea6%>PHzwfxs+=JXG4nr89><4Q2cHz0!S}k>8%)N`e?HYu@W+*VNs1Q?&ER8Q>kTGj=Fhr} z#iwb{Q>}rQ3eDho2mUY_Gym)wF|HT8YOMD(cv0_J_EHp+G4o$l9;<~{2d@#D!9Q@V zH<*l>KYOJ7U~13W!B>Q4@G1j;n2eeK=ca1DM`^4z@aID__)_m#_Tm(iG4tO{9-D_( z2X7IY!Jl=loPQRRG4r2BHC$^_Yv6J2H8OZp*UDZ7Vlrm_ztryqzw+M=%3f6BdqOjK z?7$x;W9EOVJiZ!U9X$A5!r;5SuIxo6CS&IR&=l?O%k_t~27XNcRy2c88Ti9w%=|Bs z$Hn3GKkudVpx5;VlQHw>x11yWapnAj_;aBd%>9$<=O;|Y%zqfqf%Gx!qMChzxal~4BXJ39^h zVKQd<->=W}wf%FwoZk?y7n;FuxK_U3#c#Sc>G3t+4SZ+S3^3nWMf2~kwcM+m-w=~A z%YTPHZ-4HeyXE}3_^!|l<~ysteqb_Y{s+qApz!M8Lqaq7cGt@Jb1@k+|1aw^{44&s zKI-7FhGsC=S=Rh888iQ@^m)j==4uT*Shr>Hm%L}WK3z=4%%9KVyZv)()WP?LX7H7R z&u5s7ng6YNKi=l=%TWjaJT!yjv$!{yjG6y-^4LDSI(Vnh4E~vGy}@M6{NL;QciVwK zOvcQAas7>!@V{HR*Q|Ky&^Pe-@K5%Rm28E&l=Q?z_MYYUYcUx!|GzHU z{GZlXYvAWXGx%@bv+TtwCS&Hm@xsl26OFY7-aIse|KdH%`Y16OGygLeZ2o6ytTpht zp&7i9_bhwyh{>4w-=phc@Ad0q%e}tDzX{FY?|RR&KZBTzng2!dxH!Bz__ELp{2GG_jV>U{NKe%^Z2!F^~3FE{Xq$(Z@?Adelx ztAlq5&EP{^>kTGj=D(`ySM$e>I(UuH4Bp@HL?syvo2I zCS&Hmj69YNuMS=zG=nd9tv8sAng8oLU;T!kw=R1@ir)^+;H3xtFc~xd738sEcy;jL zx?6)^^SZJZq?nAE|30&fdG~+&YOFQzheI=X`GG%7#?1ewnVbL38fy*w)6fjw+k5r~ zlQHw3MIN(;R|n4#n!z`^R<1u1lQHw(QafU8rLoq)+lFTF%maUzjG6zhbq@ROITvzhW|G{`1OXzVPZ`&eNC28O;3)>+vH@#?1f9>Du#umBv~F zbAG(~!}EBK-e59j{+r5ovw=VS!O#r8!nNLDGG_iqb}j#BG}apUsL%}FWZ(~zG4tO@ z9vg>O2X7Xd!Jl@mH<*l>|8&!~{Nps%8kp;(i)QeK1Amx|ng2I*j^dks-lFU!Ej}YO zgFDYret#E}G4ucF)GhzdG}apU_RtJI&3l%;q{U>+{JD?)6@Ff!?2k9;IS=EU$1UEo z>{TizW9EO>lr2AdG1eNG>${5P*Lrauzxw`y$(Z?HsAEjdmDU>g68&5ChtE`=>JO7K z^Z#;-KjteMYYqI>&&8UMH3C-Y#Tr1ZPiXV1u(&P7!YQ4e7eBD9WKTZ6}&-9fqj zOMGN#2Cp&jhsl`vpQ8EXsXnh9b@10hGx%`tS+4&QlQHw3N*+^(R|iiUn!#Ujtv8sA zng4E@PwwvX%5twn@m`^s^T2;fF&Q)ei!~p+#OGzB4*o%C22b>!R|R~DUb8LS}yXs-e59j{#R;_ca_ik%KSupZDNi?<@Cm6Tcps z!B=?CGCvWMG4sD&bG$n=)*ATE&#0c+=1fX3ao- zeZpkS{C}eP(k(u38g=lkp&7h^_bk_6h{>4w%VM(UZ#R3--e59j{y&+%J>V9NwFbU5 zG=raWt?Z8>e%`f7=WlcA-{v0F!1IM>@XfB3{9-a@`Onh(@oaxzmg5WYd7&9R=fEE( zW9I*i-Y?Jk`)1U^FN9|BnclM;Ux>+=`ClpzK3{4LeEGm1e%iI(U@~U@FX3t<#{%Ki!3&3G@ZVi4_p%j}G4tnI?&agNrh``s&EN?Gf0&G! zKl`Tq!QYpo4t_i|gX3E6^8KRzWX$~eEc?Ik>R_%TFOM_$F|X?lCS&G**A(sj`%8_r z2L5$u2FGVvZ!j4%{}=Un@;Con`QQ7i-|0PjgUOir%XYFq-(K(>lefS6ipsN+=NfhJ zs-YSDE7y91?{;m{&$s)O=YG#s*2ju}7n;E^;l%r(!Z@{;O&}xth-_%lurtMrZ~)=<5HT4u|8Hr&#QDKm1Ao`& zQX_*`@t$RVE+%8<|B60OUiHtFQ3t;fn!%@g&$7Rzn2eeK_VU;vygGR2&;f%zsDuvOcNSz`I6IgU@rV>`x^oW9I*Ny$4_N z_hngMA^ulr2JbNNhsl`vpDmAb!mESN56$5C953rD^zUTM{I^!kHsRI5+lOZGS+4a4 zlQHvG`DB0oZ#D3T$(Z>cuXA)K_<6fg2cI08!N;uE8r1ne{CU?V{e0sdzW2_;kR z_{*Ug%-+ZK^$(LV^M6_2L9h7tQaQgTemyjUPx7AS`d={_GyiFH3^lDESC#7{#Qcs| z9%t~syk|MTCnjU&-|IVW&*f3jKw@8#cBBZK*EufBd@GG_i~ zwvUG~d{@*O_+0&4(F~sGJ&#`C&3<{xj+MH;uIho;5Us`OUHV z!~g5|$Nlu*_#yxAF86X4?;o1MWU|8b4A27WR$ zgU|7vy}@M6{Kv~+r1h>3`?}Y1{iFD?&2m5Lm{GivB z>mS8r%>0+vei|$Iz8YnHxOi~i9)oS*50f$T-&JcoCJxq+zIy-JT5eY=kT7r!DP(*Z_qL9jecA^>foP*X7E_=S?1?r zGG_ks%45Fp>fi-JGx*1@^#+qM^S@SWJbvWsKFa-Z#6J$r;CTlAFc~xd#k7WbagDVG zUMe($ukoJc{y1VXX8w=r82>Rp?l1f2i2oRx!Has&a{ZK;jG6yL9q;ev$Ni%Y-ZM0V zAMu`L{~R$HGyl2eF;94P@PyC|-qp3%J;nl%Qgl6#lu9f}S#AM9;pVT>qr{Y{g2R|K}!3z)kVKQd^oa;X{ygK-Z&;JuXn2eeK zXXNqO@ao{BLo@g>*UIm|Vlrm_)2gQP$BjC8`p^tM(zUWbr$AjU%>3`u8ixBd)*ASC zp&8r{{9!U?{zu5853deBGBktlb*=n;#bnI<=TXhP{W9EPV zl!ZYE%=}kV z&HMauqYhp(G=r~ltv8sAnZLHHAG20_8I7qm@H(Lx%sQ0%{Q{FQ^OwbBpWj}?dzSsB z#bnIra}`jy671K$&x!LPg48~lcAlb-*asDImSPy_E7n!$IuR`!n)lQGMGy^g0i zR;xAeO@6F3GI-a4KTO8V{|)_~_@@7^IO^bcLNoX}@7Wtn#?1c&%_mRvdF7~szYvfm37X7GvLv#cK$lQHuj zFOQkRtAm**md6=3+^zg{zp76G;{Wzy-g`5W9I)E zeV?+IUaf(T_V3z}!DGE=IsYRjW9Gk=Jhl$64&E*_gPEt)zb{P2%>OWb-*GS5S_6;# zyKrRimfo{Bn2eeK;__G`ygHcg`SLh}5B0jfrwi&EUlb{xBIc z|2Om<^rn9=mCsM{JE0lO-bVHLhsl`v%VM&>A7A&LQal)~?Z5YvAibGkA#& znrVH0;3Zv~bpCVbDy{x7jnyCSLo@g)?^))bVlrm=zp;Gt|E9)T1D_F^!H0OyvcHX( zjG6yTOEiDeSZm-}Lo@g^?^&)-7n3pbKTE&&o$bH-mGf`n^FlM2`)t(bA0}hwKc74% zgjWYI7@EOnx>nA=iOHDx-!XT4etxd8*1&g#X7IcNf0&G!|KjpkBD^|y>CgGhi33%1Amx|ng12~jo?cE-Jo1wCcY*#gLn3xy}@M6{68y? z&xKb99}}9vm%CQ3FB6k7^WRK0oBQL+{prN)FH;`pd(C{t>&pIbVlrm_{BE?(ZxnW9I*H9nXG3W37P?3eDh|2mUY_Gymn~u|jxt@XDbX z{4v*hgUOirU#(-nYy7yd%&)}Pg=X+_1Amx|nLpLHP#yVbDK0olPu1z|BK6#H;{{@ZJAO3P^29LaF+5cQj#w`C& zc542&Xsk8xt)UrwlJ_j@+r?ze{Fl~~xQxbH11}$%!8d!)a(%RzjG6zZHfi|}(O7HX z!$UK8DeqbCUnVAF=KuALoBwGVYYlvQXa*nbJE zi^-VzAGA)(f3U_{10Nci!LtwiVKQd^zgfHa|5jtIfgcRb-~+v9Z!j4%|Gng~cX)O1 zexVtBziVZEh?tC-|Ce;f%zuL=oBxIyYYn_f zXa@hxd-evCG4tPeiRQnF###e!9-6`Hd(YlrGG_kM$Ya{@>fmvq8N88e<@#SS88iQ@ z7jOBm(O7HX>q0Yl?7$x;W9EPEV$J_NjkN~8AT)!o@}6b>ASPqxf7znVpX&!|4Sa?E zt!M_H<2}pzYB3oz|9uu|{`+dIHSmW+Gx$>PS?-S`CS&Hmo7Qvg?&~_s^+DpjLNj=8 z?^*Vz6_YXZ|Mjdb|2-OO4SauS22b>!<@z8o88iPMY7OM&zAkdq!B>T5@ZH|C?C&Zj zW9Gksj+Zy|k!n!9Vbx<^D=yGG_kQk897*k2TgB_@>YdUf+9`_pg|Yng515 z-r2~Hd&=>(c+=1fzRr7=-#5i%%>2hq)AF-Esn)>!4puaSH}Ib2_*zWH%zyi-n*REynFe67e5%9!TgR?{b4d@{?lqc-}$`0tnU&}ADY3j z7NmT?t3Met{~x!fXUq*6YYlvJXug-wG~Tl}n2edfUczJav-i8}AK=*s{xH7-)aM5# zW9Bc5$v%G3OTOeN>-Y3vGG_k2Jfs!mS5q%<^AzQ1ic5W37R&56$3Xyl1)oT};Nzf1U%I|GXM&4LpBn24C$x z%kM8@GG_hhlXbG+}^V{n2eeK2S3*Qx6oK?;H^V5_(1Pj=I3HEX8vy+ z(EQ)jSZm;SLNoXS-m_dkE+%8{}_$620kt{gKzSly}@M6{O{kn`Ts^^t$`m1&ETWFXIcL#CS&G* zl#aoV)>v!cV?#6eKJQu9?}^En`ER{r%fF4rS_5w%n!%s*p1r|j%>1X{q503CvDUyd zg=X+p-m^EDjG6!Ew{QN(YOFQz385K0&U^L-lQHvub-U*On#NiKzZsgr$9T{3`6eb~ z=6{JiE)A~^{$Xeazv5aseiV~2^PgWe3;5&8{e#2{hi34_uJs0!G4nrd+xGl?Lu0Lh zzZIIn69)b;88iQ-<*`h7b@1|`8T@tEdV|TB`QNIOi??a4HSo_vGkB?iKTO8Ve=T{u zKfF44-OvpFnQP_vT1>{w|B(;2=l@ZSwFdq}Xa=u2@Q2Bm`MgUOirkKMTCpGIS?fu{@2;Ijw*Fc~xdJ#;>8Pd~3V z>fn7sGk9w6*&9s8%zu{ETK-uz)*5(@&yaSPxKsReWsX8H)xpz-X7J}-EBgbB$(Z?{yL8Kcp2k`OUl5u( z5B#STlQHvuLFemU^z(LQe?0L^p&5LR_blg^#AM9;Us|l?|A)p}1HT-a!OwfovOk`f zjG6!4^7wUlb?|+m8T@zG%KoBaGG_k!FWT}Spt07#9}msoUk&_WGG_iy>m1iJ8fy*w zd}s!L#C!GzlQHvOa^aSLDUG!TUN$s?|LQ%<{U60-%=`~osQDkNvDUyxgl6y(-m|QK z6O%FXe{R9%|GdUp1OF{FgFodx%k`ULGG_kU$Ya~^>fjwhGx%B8dV|TB`Tt0Jgj^SU zg>>)@p&7jOz#k@K=0C4I<_oV5ULZ7suXU|An2ec!KVi(f{~KwnHSlLbGkBhXKTO8V ze+7B07+xK`N@xZj;aWL=A|_+zKlOYq|5%N+2JS*Lc=>@pOvcRrRb3DAnqL=EjxWS- zhGy_o-m^EDjG6z@@;D~EI{3KI41UG6a(p2sW9I*Rt;hR=ugfdfw~8MR&ETU3{xBIc z|K;Sde0X*6N}(D2m}}+wRxuef|0ic^f8VDx)*ATf&;dmF&Q&|t~+02 zy7u2uYvA{XX7F4Cf0&G!|F+XK-|aNk8hFRh41S;Y>x0B(%=~9o z%`E=7a(%sc_RtKT=vw)GO-#njUnT#)ou7Yk!W8ee_?yO>0scp522VYItFPzh;jykw zdVc;Id0ZP_9ejOg2EX81*`HiY#_aj|vTDBKk1Ojd#9s}~;HzCL=g-At%=~AXv;Fs) z###f<8k)gh8u-Ix%=~{ad-MOH###ek8JfZ4y=PgUFD7H=fBUS>{|=3{2EH>igD>-* zy}@M6{9l@-`Ts*>t$|+-&EVU-XSu(Rn2eeKnKL&3vozKk_}tJ8{=4@q$1h?sX8y~_ zW7+WP;1xnM_`9x^{Vm00%=}-_kBu*CtTpgUp&7jNz#k@K=D(smRtm2UUNtm>pLeYs zKZ?ni`ER8kC%4vEYvAodGkAr8KTO8V|NT?9zwg=_YYn_!Xa;ZTJ|DF0|zDr}Rf$t8@;Hf=F`TP`*b#2nm&*T5oz5!0q zSpDIXLo@gn-m^EDj9LD_|GW9Wq_Nh({|e3E>OSlJTWwb|K?iR zUtLVb%>V0}c$}uO*1)HSX7G*!f0&G!|H_(NtfH~j!0!vq;IDblvVKxb#>{`iXWH|> zk;YmBZyK7xD|ye}U@~U@m;a^tU!k$qz*mQ6@CM$qtPc^BG4ub)6V3k?jkN~8H8g{N z=snB*NyTK${8#x?^IuhCt$|k$&ET88XIbAXCS&HmtcDG}an;=gHW?BXBuk_e0yjHZ|^;OgUOirFD;K{!mERq56$3PTr2nI z6_YXZzw_Rf|1OQS2EIEqgO?ik!(`0-e<+X3!>fa@3eDhOxK=*@#bnI<=TprDf83~p z7YxndAGlW5*NMrP`Jedf_WYcrvDUy}49(zq2mUY_Gye;J-u%C>vDUzsgl6yw-m~oA zD<)&+zufK3e|e3y23{#NgD>!&<^IKDGG_kA-P-(**H~-dlR`6iS?^h{UlWrt^MCkf z&HoXNwFdruXa*naJ@I&6S+`m#x#>{`_A2GI~kv&LEjPYliA1HETie^|1D=X|DS5CHSler8T8WX${@JH7e;USq9+{}h_RKk=Tu!DP(*$H`;* z@ao|4p&9(BYrVl_%>4KGYRkW;###gK6Pm%(4g6s;X8tRl+Wc42SZm-_Lo;}H?^)I- zh{>4w?{Z4>-&JF+fp-th;1#@Qx&NJ*jG6zkUvB=(X{&)#4%X8u!;n*UghwFd4&Gx#X)S=Jwl$(Z?He0cM}L}RUie-N6% zQ+dzw`;?fBng8sEHUBv@)*5*3&4w-+pNGze8iKf$t2>;Mu%qZ!j4% z|34nm{Qsn}*1%7MX7Fv^vz*@(lQHvOP#z0~R|hW|n!$f?tv8sAng4D3xBRzjtTpg2 zLNj=Qfj>;f%>Sr;oBz=oYYlvCXa?WvJ$r-6nE8+0yZKL}vDU!Tg=X;Qyk}XzDkfv* z|K#q?|0#{N27Wp;gQxbM<@}YHjG6y8c543L)L3iaGeR@?3GZ2c9~6@@^IvZ3=Fj!L zwFX{E|5h}EPxGE-{~R$HGym#H|DO=IvpU###fv6Pm$0de3tFA|_+z zzwz?Te-n+h2Hre0gJ1Wa<@ymZ88iRcBz_c#4_YzZK2kZ+g$( zU@~U@f0?m){8eMEfu9Y{;CDPnZ!j4%|LbRH{y)}OYv7wgGx#a**&9s8%zuJB<`1t9 zUMMt!uXC+jA1x+h=Kq^Oblu9f32F&Q)e z(^c~=e_Z+e6n`f)gKu@M9RG^RnEC5)Va(?KxUxT_c#F^s{-$f?^HWU5%wHv1H8JMh z>+7eGsF(M<>jU9U2mUY_Gk?~0OfzM3tu^p;p&9&d*Ls6l!;<;$y+aGMkH%U9e<(DA z_uZ}4*Y_8^pKFuO|L5JN)z7D~`ojx^X7FC#vp1NGS^m|wYX0xjSZm-lLo;|D@7Wtn z#>{`F4Vu4ctTphgp&7iY_bm615R){_;RrS0umgj#;@z~G| zUcq~o^V?!FX8xP$c!cAtS_5yPe=C~7W4vcM{uO)1^4OL({{PkG8o#Eo`onLAX7Hxo zv+N%$CS#WWWAgZTcy;iBp&9&&YvuX{F&Q)eOP6T*FVk3S;LAfZ_@e`Vn2eeKN((pt zl{MBHc(u?BzQlW$`$vn(nEB7PK=YqnW37Sb3eDgZy=QMQ88iRv9<|)BcINq7@A5c< zxwmos{DjGv`7f*Eh2{LXq5S?LUNJO-XYiiA!DP(*C(P0^&abi7zzc) zW9I+F_~!ql###gaH8g{{_h)^6U@~U@S5MpguhCd*;Ojy&_|M+6H<*l>|F`6EMtF7b zcSAGyD%Z;XV`4I9{+noGu&Ksc1AibigHIp$!(`0-pPiyTKhJ5bHSmj}8N9Lg>J z1M+=v;153%n!*2et;|2gWX$|OrJ6(hab4wXZIjmP4AmE{Jk_X_+Q?$H<*l> z|4n)W+^n(Iz&{Pm;8nb5*&kR;#>`(9ll}g^(R-HrCyL3K`M;vq^{eq(@8CB=Gx$S; z*FXGW*Cu^`eN!HM*47O0w+H_4%dYhXlQGM`;@I{dxst|O1FssI!QUA8!(`0-U)Ag3 zHGf@{`KS2J&3W$>vJ9NSm%_guKu*ZlBau1)&-#bnIh8;62OvPca!Y|LJCJ{^K;(8hFOg4F0tD>Hxhi34+-m^EDjG6x@^m+S9|J)sQ@WG)Oyqovz4JKpe zzpm!n>-oI9e7=b{49(!UmqTwb88iPW@L(*@|CD0x&sQGj_v%~6>&oYwn2eeK9-71K z>GPVhep0+oXa#`hKT%`#hxZ80;CsDix&O78j9LD7 z_Gv!cF?+XvE1JQ(c+ax_M@+`d|Mnf4#~m7L4SZ*42EXk&dV|TB`JX3`^TVry zFAUA#+gvN_GsR@g{CCqIe|L?w2Hq<)gU=oK!(`0-58I?YKiof~*1#kEThR=j=snB+ z31Tv4{$JX-`F~kst$|Ms&EP}5XL)^!$(Z@yzM=lU8f(oR;yXh#_>11NH<*l>|5@ud z|FbpL8u+}>48F~KmcOrX|hn!$6pS8p&G zv;3=0X#T5dtTpf&p&9&`_bmH6iOHDxPcM%d!mER43eDhETr1~)#AM9;pO~-Ze^O(u zf&Uts!Q%%0Fc~xd%jEHc@ao_zLNoZ!u9fruVlrm_pPIMjKSX1#fe#PO;7bSoFc~xd z_2jXBcy;hbp&5LzYvuk;Vlrm_OU%>qFR8KCz{`YY@VWzkn2eeKeDatOULCw(Xa+Ct zS~));CS&G5m5!08_T%Pq|8()Rp&2~yz#k@K=Ff5S(SBT8uD=i;8=5(L&vO5CF&Q)e z8D?$IKgZ9t1~&a$(G32a_bk_6h{>4we_@v9|3!_p2L4KD22bxjdxOcC`M+k(|8U7lvl=UtKHve~QVN`R}fpJ^XRy{Dye%&jw{u4FU8u$yL8N7)1>H$p__)vv{*m|W4JKpef9Mp=|1gcU2JS;M z_$cpLuHO`sG4pTkV{{GHm$=<8fy(aOK1k4v~8=e=QrS!U7K|N zInUOueqN2$AD%xngJ<-f<@akb8MFKwZPolY)>v!c%|bJHZtq#{{~{)1=KsqroByvg z)*ASp&RPTn*W6wYYlvHXa?`;J1v`IhRJ}+w=3F###eE5}Lu&4g6s;X8t!X z(ENX*vDUyp3(er)dC#(bOiaei|C1A%|A8874g9Il48F;GmiwcL$(Z@CFlX~$QDd!v zR|(DFPk7JXU@~U@Yv_1^E&rApYYn_jXa=wDJ$r-6 znE4+zuK6FXvDUz&&NA?L$N-r*1+%R-->4N z3*NKrzbz(X=Fhco7f#XsJ8BJlacBm!jg1`gbyB z{<_?1%v9mk!PA81_iEkBwQ~PHF&Q)eU$>`a%sm=w4SauS22U~YcXn;k<40Lc_VMrC z-m~0)Sxm+(|3O!@qJuTo8u-xA44(1IR$u?V@OalI&7bWN$9{3UUXItu-~+v9*}qOq z#w`Cwf7m=erm@z*pA6059lU2*ex?eK0P#p*B$u7WX$}3eM0lUM`Nvl?+?x3uX)e1KZ%%(ng1g4STwvk zc!|&qzT36({uPrk^Z)j-E&q2k)*AS%&)=)^e###g48JfW#@t$S>88I0%|Ec6Lb$E5~w4oV%n``C!OH9Vh|FjRb{G98p zHSo9eZ$&fbf&Y|ZGG_i8Z`S-b(O7HX%|kQz>)x~6|5r@L%zwhB&3}H4wFX`&G=n$t zo@ITMn2eeK%9}L*RW#Nb_W3t?vgMy!W37Sb3(eqNy=QMQ88iQFn*C&7A3dk{Ec?%k z$(Z@eezK3>^_5tz$)3FHqYqf4b@-^pngRYqXa=9OW~;CM@X4-Cdi?&RKBJ!U&#kh5 zk@)G*4Bp>+_6CzNdwzCZt>u}hvDUzQgl6y)-m~mqBqn3#{}KI$vcJY!1Ai194zWM(}W37Ro3C-XSdC%TpGG_j7k8S?%Xsk8xe?v3) zN$*+KCy2?I`F~U%9}BMz{$ywdzvWt4Um+%A=KqVSTmCyW)*AR%p&5L@z#k@K=Ktgr z&HpKlwFZ7VG=qQcJ$r-6nECTt)c3=ygD(lq;3r%w?_V()Gk^9DSkE8#zxOwY-=fO> zq4XFsX8ylxPtTYKG}apU;m{0T$8${H{s!-Le*0VR*&9s8EWgVCf1BU_eX-WzC5<%$ z{IAdq-eQSXUq3(LEnS;*etYzyt^OE|)gL}CG=u-KjXL;+&@ELCHP#yV6QLQ*p6B)R4JKpeKW?_>KfT6U1CI~Q z;QhU4Ier(DG4nrS*5==9tTphFp&2}#_v{TOW9GmAEY1G_jkN~;cxVP6?mc^h$(Z@? zJ#+KlM`NvlKNOn5AMu{$_X{x@GyhYq`F~Yot%1KDn!$T{&$7R+n2eeKPiAWVw`i<2 z@U5X4e2Vw%4JKpezmw*uJNvw~+`mISF*Jj3_MYYZs+f$K{}=U%`X!CE20kS;gLm|v z<^COFGG_h{PTQWJhcwn2_|eb|<~pAG{({Mv`7^g>&R=U_=KMwT`Tqmnvp1NGnSXW- z4%g${Ft+`-RezW{f6Wh*G4s#Xn6cjMf`LDLt!w4_eK8p`|7)gh8L!n?YvAicGx(f= zKTO8Ve_eU37heB!f1azot~Z#Bng4ZDw*1#?tTphBp&87cJoWj9$(Z>sDUYSXtAp96 ztvt@)A9-E5K1)o-%)h0d{OhNd82H0v%=~$+ux7H>z^s|9`QeXG!)vzek0kztYmIsEUebH^29q&+em^;l=gkmyg{(sOP_>UTE4gBZO4F0V5>bV~Qr$_b>cU*Cu^^9xsm*!mEQ%4$a_;UF!`d zW0qg#ll}Z0H}HqanE9Wj@1wK*d#UU{BR(%QgP(P+H~2Z%CVhS`)ob`NjWq*&d1wZo z>0V|388I2N{2Rz)!|>|hO+qvH64%Q9r{_pkqUw_~alQHw3Td%Eo2Cp%ALTCoF zk7j*+!W%`MW=y0WGv;;S8~(Z&b@1Dv89bMJ^#+qM%m1J}9ty7xel#?LUvsTDn2eeK zsjB~~Kd#K5#a|E2;0IhQ^D8kKGylz0v$;R+f8T%P6t64uXE7Nwf0a!3`&Ub5#?-$r zOvcQA_X(}T9vW*6ymx5kykM)Z{!@yla&6N0FMG|*7+xK0p&7iJYh`~$F&VS`!CS&G5amM!g+)ZPxf%go};9b0DS-&ABW9GlC zJeCWu4qh=dgLieUtS=IiG4sE2hL-;-jkN~8HZ+5m8Ti9w%={12IgrEsyhyqJPCN?D z;48dmIX^5WW9HwFYx%i;uhzhy(Z3bV;6uG{^w9gpwq$K~bxl6Ych1|Q)) zdxOcC`OmNU*aAK;8+Gu)p&7iR_blg^#AM9;PtknoRG&AM`#X!j7Mj5myk~DP88iR( z>`(sj`&YbYxxcfRjG6z`su}B#8+C9On!!7{R<17=@9f&7^M?!cA8?_@ngQncr)YjG zG?jbx29q(%|6ZS;?|F`L{h*kPng3ck26?~6S_7{en!!hE23|j(;m^1>>GSitUJsmK zsQ&QV{#qFsyr%c;4JKoj|2lbGA6^}NV`v7y=31Gbi^-VzXM6awpFj6$ERQqzM+1MD zjG6y5I$trZ###f93(a88oz>?bCS&IRUSB_By=U1UKupHWe;J+IT6S=b3tk~KgJ&50 zec>5hoAmWFn>=O@uMVCoG=rCRt=xY>OvWt#zjVIqWk2sV>fqNxGkDg4KTO8V|Gl0+ z{HOQq4JKpeKZELL^v9L`{lpfU!SD6_;nsRRZ{x4)Q3r1yn!(e1&vN`CCS#U=ad|8e zULCx2Xa;ZPTDg8%OvcRrdwLCD;IHd)|5Ncrp&7i`z#k@K=0B%AhHIqZc?bUR`L31w zpNh$t`Rga{F$?4h-3e|HLWHmC^t{&UG4>jKCu2O%k9R!e2X$rcRkP;l-MjDZzN@RPR|8KJ zn!zzwsXU*epOZ1m|FSmFE3vH``1Q~X9?!=t>*tHfnEBr#k6Xj5f&Ubm!7sU1-d`*x zW9Gk$YIgO0<^2)jJwh}1kFJ&PH^pSk{B?;xY%1?p)_)UE8yb&@4BOeY^8JXIjG4bK zafeOp{RR!J=?7(B92l(I1H<=En2edfY)5$i*H_}h{b4d@{^x6e3wrtCi$e2rHO>j^ z=R5pO=ZCrk8Kz5}x-A-b{GLC2o@-@(shEseewB>y_R;0b@a+SWG4mf?eNB}ycu2%{7z{8{_C$?E8ky> z$(Z>+q?(7l-#4$n@w(TI*!!cv6|{v_kLx49`RbC863x& z)?hMb+h;L(EFNAByi{lguj*P^pGQo_%wHuVy#FuS^M}d!KjA-3&mW%FwV|Jn`;XH7 z@BpSCS&Hmi;j`I z#<8-2_Xy2ku2ZW&OvcPVy9dJkkWG62@XoH4&v!8yGk@*6BmDQZe$O8!W9GlRw(%aZ zts8jn&E{)P4LUBv(0<@q@A z;-MMLJ%RfBg~^!tAERHuvAtsmd_rgjFXUsE=i|g=%>37p$GYLwz#D{S@X@Z7`L|*+ zX8tM};r(aroiln3Tm9i%LNj;{ z_bT@{#AM9!Z!C{Z!mEKd56$4;yVe>^#?1eZGj#cHQCn-^+e0&WqnfVE3C-Y#Tx$&`W9C1jE{0}OTWjE1Lo;}co{HLF^`~A+Kw${Kihi34mK4$rTTujEy{|a5q z{Z?(Qfv*nD;OTtK)?hMb{^RKTzH$9~zjA*}Y@r!^xsTZzOvcRrCS6$FthUy`y?Ma~ zkL_cY`(t7k}u!N2z$}6!DOV4#Z(Kir-(;Gg=K zt-)l>{AZHK%;D9*vxR2x!LF6}%ZSOC`G3(Jeun);ZLNWO^QsJu-y949(#CeazNiGG_jh>v%hbA9u_8C*r9?Gk6;xv#h@@CS&IR z(1hLge^_m;fgcOa;K_W{_ZeMYR}pBsY) zUOhB}r|S8`WX$}J(HxRveO^g<{!V;CXa=w3W3~p9G4o$jHzU_lTWjETLo@hjAG4hQ zi^-Vzuc2f3ntog#H1Im18N7y%S-w9KlQHw>vt(00u9x{a;w?fmcy%AMHJFT<|Ft@v z|IUx=W&L*X4WStvpCx5}j>acr=0Cxx-TptJ+FAoo5}Lu+_?Tt=b}<<<|D*MJag2X% zl=laTj}OgY^D$e4$(Z@CB9B$WtAY9cuk`cp0*~^#^8O$(88iROM((!Hxf8btb%>W-B9GhMYhdu8_xpwScWvnQm&FL5zx~0-EcXY*WX$qEsIedF zWq=qLNoYxu9f4zn2eeK0;*Zi`wbd+kW?3IbOvcRrQ+;-R*82>F{}P(P|LNTyfXSHo zKO>K4!>fT`2+iP6Tx$&`W9I*7eV)GOpR48hGVzC@8T@q5A0}hwKZ!gh4X*~CA~b_p z=dT{$U@~U@e0K7gUTa`J(~IVx?-To&t-)l>{AbWHd`3U64;pxu&nE7+x zjG6y(qj!Js-&0#_;1xqNnC}^Cewd7z|6Mv>u@+#hf$#HU z*}&jseax~xn3#;2KhF|0x)!N5@Ytale5a3D?hlB`nE5}alD z1g*hj%=~3B!pG-leay1Hx|oca|G#t$`*$468hDr=%LWF|-#dQ73%EA){Qq?wuio(E zR(b!6`0daP{-@_?4JKoj|GV;-KfD@vq0kI|&9&BGGG_kk>wCcsdfyMiJRey4`Llxa z_55KnX8vR9crunBR|X9{ZfFLt=Q+yzt;A%^{14ap{1JX$KWN~iLo>MXFJ6@ML?!H4;nt-)l>{1=qRLgCfGi-u{=d~R^2#_?Ht;o} z8N5KxA0}hwzlY9O_w@7DK?Cm-n!#82n61HN%>4J!F^Y4^S_2RKST-`A{(#Gynhg`1Xj8S>8`ACS&G*(L&t_zfxOk;9rMk@ZVi4 z?>7{G>Dtia+a&tgq`ew=iqH)HrEBH+7cm*L{8uj6<-ba8t%0u%&ESc9{xBIc{~hJA zQ+PG-E}6lQHwZb>7bZHnp_|z9Te)AM`QH_nTreX8v=@WA5;3;Q2x`_!ig7{BSWDGyi+$ z>GI#Jw${K8gl6!ZJ%5;tng4@xcm5Bltu^qYp&5L)k6G4#7Lzga|9Gy>{}Z*f2L3!W zgCFoQ%l%<788iPa<*`+GHSo5f8T^rJWqn{V88iQbbUZ)UkL!a5J}fkYf6()X$(Z@? zrsFxs@>&D$<;VJg!3X-7t-)l>{O6I!yy4Zr^M_{euCA5!?Zsrw{I}F+#8&>fQP$@a zZyTDybNBpVGG_ks%VUA?YT$)KGx!ItmGwErWX$|O)-}W@aV^on%wI44d@lQUd;TyP zGyn1BYdwE>qR_55KnX8s3uf4;*GQd?`_ zLqjw8YR}OcOvcP#79)Ipbbyapp5GUf@qfa9<=*)ryozf>&mRs^2LAmu1AK&M9TN1qXy7G6Gk7D{%KShv88iQJ zRWqLV8#M3)p)q}R*ut*029q)KSNRCiJx?>A`RB||g#K-bFokC=>^|L=5<@jAcnSk^Zd-x!*~i}d_qGG_jN(hhouA6Lry zZ{oW{Gx%B`v#f6{CS&IRb9tN*UJZP9Xa?WzT3P>1OvcP#|J-35lWPr}9iLC{`NL$) z{8j$Hc6^?8!)}D{sI3{`8A3DoSbccbzc2VW*M|Q6uC`X^zq;D$53d!P!PEGdW&J2I z8ME#4=?b0yXKHH={Fl%SUe(7e&liZvnEBtZWaodQ+FAqO9GbzO_?YGUBQY5>|C4mR zf3jcq4;uKC&{1=+A%fGPNS_3Z@n!)qzJ>q6VHQG=rb@G0XQ;Vlrm_**j!;pX@Kj@3vj(XYhDFW?6qm zOvcQA`Efgs71Y)mc%{$`KEuas4JKpezl<&tmQ`D8;N?Rz_uOvcRr1bLhoUJZP5Xa+yyT6sUCn2eeKda7C9`wbd+qtFaK-nH`n z4lx-s{~5;Ww$F@eYYjY0Xa=v_^M}cp`LD0}U>o?nut5WF9Gbz?`lQHvOO4mC}`*lybeiSbkn!#VY*7`e7$e8(OYe0=ZQul9~ zP;KdF@RB`$n2eeKJ)PCCd)3w&_<_(29@ob#pO0cPX8y7m;q%YCeav!yTTI6P3IFT; zUQ#*#5#Qk2(DTnT7VkowskUZ-&k4=oU38EJ)xg_@X7I_bmG#@jWX$}}*3GJO)YcmKywD8ZvgZ$zG4tPZo^Jc> zrMA|<`-W!lSw3c&A1fwf=FfTMM00oJ)Eaow&yTKF!B$4JKpef2}-z7hVl~Ludv+#t-)l>{5PGt%fFf0S_A(eG=rD& zG0Xdp#AM9;FVp$b<$m5&o-Y$$8JfYH_?YGW!eTOJ{&(se=`OXk2EI2mgD>?l%kyPo zGG_jZ=`(b3|6Cn3@KT`}e20(O8cfE_f8nOv{)?!sHSpr08N8^E*&0m7%zxBTJO9zt z)*848&ESQ6%(A|Xn2eeK+4>AU$3Iug@l$+WXap``-9qA1K%2& z!DsoH<@hNkW9C1GJoHZ;zJ4IAQ^Beke3Osa8cfE_U*#iw{-9I3;p+#&WX$||Z}Wq` zUCZ{|1KtDmjC)ux;*_gqT!qL zv%3A^nS1^)88iP`^$VCyZLNXl49(!{e9ZFxJ24qEe_4$1?{^j-vo)BEng7N5zV#CS z-gVHxJRe*7`LnWP_VUAHxi<9oyS03`>G{Lkhh{Kq2iN@vCS#VL=VE8^zso@b&mNk= zTltvf{TE^~X8!-}_K&qN%KI-gJ{dFrTXhfNHovb>zTXkw5t_kYy4D)}57&ln|3<$X zepfXEJWl-H48Fy^%J(~BGG_UCcOdUHtTiz2G%T9G-*5~cvo)BEng4|P9Wno)*1)X4 zT>W9*X;}9kn2eeKtNIVte+z$ zW0rp*oi8oy=S}7Qr{BO`bx*OHj z8u;eW3})_rJ-)$Y%>1{I#}C4*fwvCL;Okv0$4@aCGyem1GJBBPS_2;%n!%g*{9!U? z{xj(0bVjwc2A(A}gL!94-99iGGyku3zBjCYjw&7{G=r!2G0Xi`F&Q)exAl4Vj(_fz z`48gvLNoY3z4K3)jG6x{`aF8oKbHm#{6=U7zvW|=`43_;X8wGx_TO;;PucT_Uv{lE zn2eeK3Hm%b(La~U`@6*_hi333J%5;tng7rA0m+<%S_7Z0pB2sLCmio%mizx=GG_k& z?dR|5K4xn$88iQnwLg5~`$d_bEdD$+gO~7qwl$dh+?oHswGaHq_lrRTkJR&rKXR?i z{}huk^M6vlPxbuaXG1giU#_(VlQHw(UG;l-zd-}<9h$*UxYim>#?1d6?E~-nelcj^ z_d_#yx1K*t#>{^)d9c24t$~;7`NMC!)*4L4%>O*?Z|D1dH)!BrhGy`hJ%5;tnZGQC zsaw65(ZJe0s>V`O!_M_FTZ74%`Tt(u5#QwB8xI=zkD(cSaPRyOKE$=5=bt<19^H<9 z-)_*rJBMcQjXq{;Fd4J_>yFp`gV$4AYv2t-GkAL+vo)BEng69a-@DAu`^x*N#lH>B z;B|b=a{pFL#?1e4ozEQM=QZW|KJn3^8T=a`v%H^LOvcRr8U4NR_g`z^7yNH&VDMo+ zW_i9(OvcRrW$kaT_zd`5oH~M*fIlmR(9GbyT`k1Z3WX!hz zueA^S#`lY|{-^lz&rE7@2<65GD_Y2M7(R$xsz@xi1bpPB-|3=OaY6f^e{j6xd*4v&wW@|7Rv;6<< z_Sw_NEdF9LX8!N!8suHSE-B|H;`c){c>i90nCqm>KYK?5?`xRfvknY?+s7>DCt@;Y z{{QXvncK%~4JKpeKaWmE=2cs3;Q2!{n0s?||A&7Wb=rEQ9yV-A;Zka=KfG*c2G8wY zCBK-AS$_y;~_c|K80#?1fJ z+dBW#)YcmK^w11G+sAATCS&G5i#%oxuLhnYG=ooZtvo*>CS&IR;*DMYm(LFT3O#oOvcQAd)4gV{RR#E!_W*q*|jo%NleDff65!W z?K73yS_4lTn!(%k{9!U?{%>E``M;yK*1+$DX7Cg~W@|7RGygq**ZJ?Iw${M=hGy_v zK4!T;CMIL%KeIe$39km8Jv4*&aIMUb5|c6W-|Lz#|K4hA4ZL4y2G7*SC-bpF?>tu^rV zp&9(Fk6E7Y5R)N1~)=v;G5t_k&aILK0E+%8<|IhP> z4gcT2)YcmK>(C5dxaSX(G4r289&?6Q1J4th!C$#n)@KuwG4p@vye|LCYHJPrT4)B( z-t&janECHIHFL$lH-%U)$%>U2&681f{wFdq$G=oR)`NL$){Qq@Uw|)Mtw${MIdj9ac zu9fv&#bnI4wk9K00e{{9A1|Bms zgZJ+F!(`0-Pd}ma|GC;)1D_R|!K3<^t-)l>{Fjx-a^cm$D}-k7&s=K_CS&IR#qnMK zzo@M>@ZUo-c$uC*OvcQA-(x%f{nXYPc>mB0{@lkb@9z_nG4uc1F`fV4)z%vLtI!PI z$H#09CS&IRJ9%6eUJZO>Xa@h)wbo!VX8zM3)#aZ-ZLNW44$a_ed;TyPGyi)I>-_Ik zTWjD4LNj^wln2eeK zUpDLf|Ejjuz+Z-D@ZvsZYcLrz|H(G({3lmiYv8FuGx!T1vo)BEng4e;>HOzcTWjEj zLNj<$AG0->jG6!B8+ZOwsI4{d)S($XpO4uZOvcRr^^H3JH`LY|`0daPp3KKA?MbFct+v*{=Z0qRqdsPtA0;MZ z=6}a(o&TL`YYlu)Xa=9@W3~p9G4o$k9*c!n11}kx!GChCHJFT<{~IfH`QKDqYv6Z6 zGkB4nKTO8V|Ip<-|HIVQ8u-Z241V3mYz-!3=D(~wmJ6>2ULiDt4{@zEn2edfE!O3q zKy9soCl1ZvWqSTF88iQP7ViAtRa^x%KZwbg`G2us=l>VAwFdrsXa>LS zW0v_>Vlrm_r^@5B@M_@GLo@hu*UI&sn2eeK_^L7QH)!CALNl0k`0D&3n2eeKYx8&8 z=XJHU27W6vgU9nR%lchnGG_iu%44bUYT#u|&F8>E=YYqHyXa+CQ z^M}cp`ClN93&X2{e-)a+@440*OvcQ=QT>?SuRLEY9w#(|&v&ggn2eeK&GU8J=MQRY z4SZ{829MG6hsl`vuON>V!>fT;4$a`3Tr1!2i^-VzKRa)i|2eg_27WO#gO~65!(`0- zzblXV!>fT83eDhWTr2CRiOHDxzd28r|1Gt(27Wg*gL#ic{riQ z^fUMkuPfJgVlrm_!&Ebp_bcDuiAN31;9XrS?-vl0G4o%2u5SCRp|;k*Ylmj=*K>FE zb^E|%%>1{Wv#Z}mZLNW~56$4!e9UtHUrff#f2KJ)|C!a+8hEzQ4BpDeEcZ9WWX${z zoW1iuNNufw4-L)W8GX#wU@~U@+t1ed@1VBUz&{Ml-~)Wj@_eY6jG6!U<*`zDHSnsT z8N8iqt-)l>{5P4k%fG4GS_89=Y0(T`vF8tyG4ucVES>)uYHJOAc4!7~>^WM4$(Z@C zE06WUtARHR&EV5rE6+cQ$(Z@ip_)0p-=Kl#3C-YjTr1BviOHDx-!^l%eQsAKL)xhJ0X7Kl2YYir2=D*YoUH+xj)*5)Z&K@|UfIWN4JKpe|N3N|{~Ky+4g7X!29M=qmh~URWX$}3G->C5 zlG<7W|0FbnU-L1`{YfzyGynT1>HHs1TWjElLo@h9AG0->jG6!b@;D&88kpyMOFx6} z^SahxGG_jpsD4xLS3ZBmTZCrtz_s%JcQF|=|H)J{x%Vsg=fzWnX7I+YmCs)>88iRS zC+@cY7iwz_{I}2yp0wu=lQHw(P9EEbR|D@9n!%sB)*4L4%zuZ8y8Jt;tu^q@p&7hw z&mSgZ=D)5y)(fu&-Y_(Sw|A{Pe=R0s=D(KTO8V|2FIVZ&zDu;5$Pz_!A$qyq`i$#?1fw@>nUn z8hF*v434$f%K4#wPR7jtuJOD4cdM;6@O_~fyrPfU8cfE_|9p8|5MB*@QD_F==~{XJ zwU~^V|2C@G*82?_xVJ8X!RL8hYcLrz|F6gGw$HHfx^{Stc$Cl#-n!=xlQHvORsO4~ ztu^qPp&9%i*II+gnE9VSPM7-vwY3JmC^Umt>G{KC%={0O$3fxMz=wur@OiG4?Jp){ z=0CS;=J9@m2L5hn1|Q&BxqcUuG4r27HB)-O^8BWFn$QfM%eB^EGG_kIj@@m4-ic6a zVBU#PG=D$BuXeh_)@Pc z^Jm0l%>36>&05}X(7?R^p!&lHdR=)xi zKCPIHng6<~S17lv)g~3S6ge~mqIi6YuC#CVKEsq|ASR?i1!;b@Zq5u z{H$x``6)3OGym_YW_j;7XyEUMX7E9-wFZ+h^KVo?ruQq~ABo2a&EVx+YYir2=KqQA z2z{!y*1%tcX7Ct2f0&G!{}b|fGQ1l2na~XW*tOPRGG_j>t9}meSLWx4=MK%_$6ad; zCS&H$x*#8n(e0a@M_=*LNoX>*UJ2PF&Q)evqtOkpRKmmz~_c$@Hjnxn2eeK z-$(8Izf@am;D3f@@R>elncpHNW9EOQJgy3_2EH~lga77QYcLrz|J78#y7w#ZHx#cG zn!&$ytu>g8nLlfdJvU11|L}{U8N6!GA0}hw&sy_0hF1gM9Gbzg)>t`z)6dD6`Ts~Y zCxur7|0FbnW3BnJ{*``C#>~G}%^YS#9Cg9ctNG=pPJ zrgDE+KPO}6|H#PQ@AXl&wFZ77G=talF{W0rpv)vxOP%J&Q6H9|A^aMxOc z$(Z?nqJPS#YHJPrMQ8@E-1CRYnEAgVk5|L1f!_$t;E!D^=ONXVG4nrPH5Yila{okpQD_EV?^-#2 zipiMyAElb3z2BgLj|Yb-;m2JYdVIcr(A7Vnw)(>lhi35IK4y8oOiacs|MQD<{x7JlHSo)!8GN6Q zS-u|>lQHvOMc0F?`gLJB{)^WL&EV&J%+_EsX8sTBdgKwmE-CXL#E*w&@X9`B`F>eU z#>{_dc`OrN4g9^(41UP9GXFtL#>{^L)lBI91`Rw(Xa+CkT6w>ln2eeK8@k?k)31BV z{C4p>p&4vFf0&G!|Ml{?A-o#+rqB$2-L*2mT};Nz|1i}Y?)?T0d{k%#U*}r6|0X75 z=D)6L*7JVl{+oEi&%KbMn88iP+bdC9`+FApD z5t_kM_55KnX8t$HFqWSx+Ch#%K z`b%OmX8u>|eEupwuOBq%=-iC_JP;-y4GMaX8seYeq!%eo*xuX7Mj5exK`fZBqn3#|L5*kIP5*OwFdq$ zG=nGX`NL$){GXHu*FUueezxZizw26Ae@0Bk%>QiFoa6n<`!U5_Ka_rcE%AicmGw`= zWX$|eP|b{W9HAb0oN?G2IiWjXny^&V$UBYW9F~&|F!FvDYdbuQd={?(}rg7benXE>hTkv z-nF6EFNf(O@Nl)&A3iEHgL!tn`om<*w$FaEb$ME~wFW*QG=mTIG0XXzn2eeKpPSDA zJ+-w4{xCFy_w_MbgUOirb8WyiORa&qW+|Fqzr5>XmgAe4jF~^z23)h$8klRA>JM|x zQnx=$#>}5<1Fl(W4a_x5^@q7;ss1n-Gk>lPxMry}FxM>AALg2+`om<*{JA#Znx)pj zT(eYvm}{2m50f$T=h}d4mRbXI%~Jhgu34%-OvcQgYXh!XY7NXaOZA7jW~u%#88d&b z4Y+2hH89sK)gR`XrTW8U%>21F;F_h@z+AIbf0%2Q>JO7K^XJ-tYnECAbInryVXj%K zKTO8VpKAlIS!xZ;HB0q}xn`;UFc~v{t_`?msWmXyEY%<8nx*=~WX$}zHsG42*1%k| zRDYOjmg*0aG4tozfNPdo19Qz%{b8wb)a?&{d;K!7XLX|YuG+eN;6J-I^!$oz1Fl)> z_J_Z{ei=4wM{T>EdfO1@nx*caFxM<~`@{S9`U<__+CZnu!@s|Pxn`;UFxM>AA0}h{ z-MO)VYlD^a|7#7*HB0q}xn`;UFc~xd|JScy_Ww<{VGdAR|Bdj$p&5MYbzObkKJaO- z4c-1f(0aLB`ntJ;2Hqw#g9kol*?+`j%(nj{r*(NARayJn2eeKXeV|4 zqpPho@R*?){IHK%=2wWxnE5|_bm#w!+FAoYADY3V`j}Xa?`#W0vEan2eeK%Q|qqqPEt+ zuZL#v&wR|XzN?swng7hob@^veTWjFiLo@g#AG55VEGA>-f6yYG|G{c&4SZN=2G8VU zmifSR(`Tt98t%1J|&ES`O%<}goCS&IR`8b{b7iwz_{I}2y{>sNJ?=KLOG4r2d z%+7yGwY3JGCNzUT^D)cwxneSA{=B=9cS_b8xHm7`-!D12k6GSNCnjU&ztI?7{*Bev z8hEqN4CbAZ_524WW9C1HJmw6q2A(H0gEw@ooPUbRnEC&6bnQQCYt6sJUx#M!>^*;& zjG6x<@_0178u*FO4F1Zsvj2$5nE9WnnzOv$pn-o8n!yjdR?e@)WX$|`QO&O2ue`rT zyhmsTpW#|-Fc~xdg;c+=_Zu|uVxbwlvuox3HDWSm{*7wJ^nT^}6fyJfOFx4b^t#qy zGG_iy==<&`{d@0013wd*!DICNVKQd^7t7<4@M_>oLo@hs*UIxFVlrm_hpXlY?^oUr zE-rTz0ugotMZxGtI^B=lj z^YHsW?}7@MfWXd;c)DMWe&cFdg29&kupe^18CV zlbCy)+3{^_T|;f-*HvYG74i0=8N6-p`VQXCwW0S9Pnfz3aiZFq0X{i2gSYZA%leRF zGG_Ug)HT{te%)5ypDtcDG=q=#G0XfPF&Q)eyL63qx7u0*-xr#}OZb@O{pn&dX8y~{ zW4Z8Z;1xnM_)gc#`X^#CX8!ML63(C1)*ASO&6Vlrm_Uyj@5|A*RI z1OF>DgE#K^!(`0-e=U#SgjWM!9-6^_cda#;jG6x-sz22GmG{4hj|k1+OI&LWCS&G5 zpX$Hs{RR!ZU}y#(>{@yMi-S__?RrS_AJBn!z*rm}UKEF&Q)eyL3P8ZojWqKHtUn zg=X;XK4y9UshEtJ|M~K`AiNs*qRCun=rV@q$-496WM z?9{7)cM0v=`IE6N{-1jO>o0G1Uvm9bZQTdpFGDkU(!IMc!0P7{_4dCU}E4LoaT24C-5c|KZ9#?1fM zy2tw)zwbL};LAfZc!r)oOvcRrEP0$AUJZP1Xa-;6TDkuwCS&G*`IO!Ezd~)Tfv*b9 z;4^#vFc~xd&!*`7KUZ68;J=1u@MS(`xxXPMW9C1v7QvZMZLNV92+iP6eazNiGG_j} zP2A<*U2Uy__X^G6d3?;)U@~U@)5v4m@M_@cLo;|+*UJ0F#AM9;-W;5kDx_(Rvq{7f+!GyipTzm)Z_YYn`C z-%A}BJWJ0XCS&IR%vjy_e^za+fw|9GG=tanG0XE!Vlrm_jeN)K`NQLcX7JOlwFZ+h z^S@d50RQ0k10j0 z&9UBZ(7-2zX7DwxwFZ+h^IuE#YkR-4zNmP;&wbo!VX8tp%en#&%Xy92wGk8tc z%KD;WGG_iC>VE7;eqVObz@LU@@bo=@n2eeKZSuH1yc(GM*QKA|%Vurpdi;mUnE9U| z-xGWO@X4VWe5-5a{U%~EX8xP2W()5(XyC0vGx&Jd%KQN_88iPyRI{k}EAQ76FArYuN<1e ztT{0J{6Rk_W9EOoCdS;Lw${MRk1U$cm0aG(Yz-!3=D&%2H|_buTZCrtb*`254a8*3 z{MXTZ%XNL;W%+y;ZxEWn8~6NSGG_jh$z$^HYT&6tGnloN>-LAqnEAh~Ii#<|T+#-9 zJv4)PPQCiWWX$~UlE>ZQ)xh_KX7Ed{mFF+SWX$|`RLxG_uRLES-X%1H?{uwve*UIx{Vlrm_ldEP5?^oV$BAz-lgI95_HJFT<|AD%%dQk8F zDtu^Y22a-Whsl`vZz7LP!>fU}2+iOFTr2PQ5tA|VpGP(GdcX4gk$C>l4Bpta@_s!r z88iPWR5PXbE6>-6rwPsAxm_#IABoAB`M=hko)3FnZLNXd3eDijd;TyPGymVn+ove%R)2w1J}y+iR$_xFx(A`1a5Y{)=m^!DP(* zw^RN0-fz&rJB4QOA6#nd0Y}+4SZ>620!mw zYcLrz|6NtToA(g8ng95zH}5xS;E6&rczM^#{Q)rwdortF1Ng zVxbv4Ue6yUW9C1HJmw6q2A(H0gBNtIJYOs(W9C1FYNqsl<@!ZDO=t$s?pirN5tA|V z|C);l?^iyf#iN8~@Z_$Q^#R0W%>3V!|66Kn4g79s2LH#k^8Q>g88iP|Rdbv78#M48 zp&9&!Ypua#%>2(%{n_5Hyx&cHZfFMI;#zAk88iP?RKKeCEAOWeuMwKTXS!D2?frzR(Ol+_mz4 zE-@K1|7S1m@;|4x*1#`@X7HRnf0&G!|CsU^E4&(b+|Ueu#| z8u;PR3|_7050f$TKl}X7{~Wco20kw|gYWY(%lnnYWX$|e(juQHtF1NgDWMsBmXBH9 zFCZpk=0D@vUH+NW)*5)$&LWX$}ZIknsV&#J98@C%_CJWJ0XCS&G*?@v1a`_$GN_`%Q&e%i+@ z^MAx-%>0)*sqwjF^m>|1~Fe{@1FlHSqPJ8N9TQS)NZ3lQHxE zp*(gDuLj;NG=r~ptz2J=$(Z@iqMBK~-=Kl#2+iP~Tx$&`W9EPD3ElSjo!VLh-w>L? zGxz*qGG_j>%44?hYT!9TGx!?U%KRTO88iRoj_dM&Pi?J%R}9VIS$h6388iP|kL~<# zQ(J4`J3=#fSs$}Cn2eeKg7R1>yc&4X&UZCd> zlQHvuc8AXYIkmM0elawIFZD57gUOirU!X;zFH~D=;9rGi@H0MUIe!+DG4sDyYmnZj zw${K8hGy{jK4xn$88iQrXYIDnkJZ*1_|(u0zQ@Nb$2TzbIPzz>9G@asNinV&2sW9Hv}r}H1E ztu^q0p&5L)k6GSNDkfv*zoF*aZ{+jt2MxSwXa?`+W0v=ui^-Vze>7#6|6{ea2L3EG zgE#OoTZ74%`G2kXwhsl`vk1CJR!mELs z&3`4u*?5|+FAoY9GbzS^!#BmX8wmx(D@&xw${K$hGy`6K4!Uo6q7OY zpFkcHhF1em5}Lt>xYim>#?1c>&9{Hk=iQg%oA{m347Q#>OvcRr@Nv8C!}>e520mIp zE1JQt`whsl`v z&nSQfP|8upq2L5Yk2G7v*hsl`vPbrV7!mEL&4b9+B zT`SKwiOHDx|8=Y`|KHTs8kqHQisozOOwsd)$(Z@?B;OzQ{NY_gGx#sAmG8&JWX$~k zI;Qfg9iCtOkI)R>vF8tyG4mf=9^-^p1CJk?!GCeB+R!qjs|4`K&=Kad?S$t$@20!jvSsz$T#>{_P)okbe z1`WJpXa*nRS~)(8$(Z?%u9`8t-=KlV3eDhcTx$&`W9I+f7~SvpeYLd){wOqqN9*~+ zWX$||cirKmcjMF=_^8nQ{d#})F0*A&G)=txql^IF*JkYS%TJJGG_j_kJRly ze^Og(;JZRIcv&B_+`kf&G4nrJ9zPDR20k@3gKu-KHJFT<|N5%m!21mvc;nD~uK!7{ zmHQiFGG_i$tA_dgwFaKfy~_Gm;`Ll>4JKpe|6#ZJhkc~B*1(^JX7E%!f0&G!|1afn zQFt}*C7~Jofoo-cteA|M|Ea1u&HD`+`1H^WzRA`R<3cm|6xUjV z$(Z@?t@?eu-=Klp&5euD#>`*k!$$Icga6U>w^?iQ9zQP|H1PeQ89Y_*{1BenwW0GLvS&y)m+zK6e>m2f zYz-!3wtXg*$7JEvz*B~1@TRVn_pgb`nECUrn#Xi5R%_rVLo=9lBJ1ZnOvcQAB6&<4 zUJX21Xa>i-YRda5^m8(1{{PbX(!c$@Y0$vKdj9Z)uC)e}G4p>-zOVQE;kQCF_@Az| z29q)K-&6H_dA~A$K)i2g2EXcBnLjKhW9C1$YR2(?g9aWyG=ukWt;`<~lQHwZX4LKv z_gb~J2JSs~Yw%b-f0&G!|C;h$tLG1|8=ApayH>uR6_YXZ|Jx{C{=ciOHSkxV8N5c% zA0}hwf2KUn3a@ZhgSoi5}Ltrty1Rq>gQz4{NL9H%Li&}4g7Iv2LH&%Ec1)R zWX$}Z)92RnYHJPrQfLOh=VP`8lQHu@Odf}aR|6jvn!(Sy*7`f2$(Z@8e1t!L5AFHG zWX$|G(eZXuKkg11c#F^sUaa@|1uyQ}(9hrfbv!x1k1OT*Q1QW`8N9KNS)MNzlQGLb zkvt|2uLhnhG=m4OmG$4mWX${rI-czB$CW_?9~7Fw6ZZUJGG_j(=5oQb6ToYamd|hY;|JAkf`6wo1=D)LQ zcJY3L2Hrh1gRgR}HJFT<|AMMt$omZ%c+t=d{-JBF!DP(*RX)PU=LLHHFc~xdyY>6x zU2U}nzTbbB1B3VI?Vs?Tt_?jtFDeiAzv>S!+4G0Fk5#WPU@~U;KhwYWbN_dj?+3-~ zAElq~D~tG;t-)l>{O^_5eLa8p!O#r;)V1>cpqPxA|JJJ6#`~4`Ly5N!&ER`nEAxxQ zWX$|kGQ#`MRy}{1jG6xu+MfLWY7M-MZ|i}<{7(P3e!q+Rn61HN%<{AC_?^}onBQs9 z{?Gn?XPv#DBYHJOAOK1kK?_-wrb;V@N{HL6@^Pfs>t%0Wv&EVhrn61HN%>3`uJJjx1 zTWjElLNj;@AG0->jG6!5ns2s`&pRvkSH*2;2H)#rwg!_i^Pf#O9%oluYv8#;Gk7l_ zv)o@5lQHw(dZKRoZ=<%>z}tsr@T@*&YcLrz|CuK2{AX5MYv9>JGk7Z>v%FtVOvcQg zwMSVKwbsC_iCQ#YA9Y3_v%G&tOvcRrcHN}?liFGX-xZp{tchCxeql0Z{)dj&ZJ)!` z)*AT8&rYcLrz|Cx2|I*Zy`1J53s!OTsm+aD%l=0BsZ2WRr@!t(r-c-GJip2^2-4JKpe zf1s|X4)W`&K?5Hen!z*pnC1B?F&Q)e>^owfTe z3(eqrT`R{oF&Q)e-|2kgIzR6iH1Lg~8N6Z7A0}hwe~LW#{i3=$1LwJ z6O%FXXJ6UJe{bddN8E;H@JX(f`3d5aT^qW8zNyc+xBPRj+&>rh-pgum>?`H`N4{jt z^7CHJ=k%p)t$|+*&EPjYN4bA4CS&HmzV?R=e7`93H^du}7JJ^N&>f!QaE=KJSGK4xn$88iR??fr8JeTFXSpR48i zTHJf@mcdW-^22<0o8_NWUfjQ~HSm-%rooH5R<5tbWX$}3sL$w~{d0TJz`KQJ@FYEd zn2ec!_8kh}r+nm}RRe=}@-fTvm0~hx{^QHT!mEKN3eDg@yH@6ZipiMy|F`?kcs+lZ zjG6xjlXN3|sJ7O?pM+-c3{!OV_52f_(Y2w+wx^E&gD<63Jl z88d(0O}n07cYgExa~JLT!(`0-kJjhiG5)z%_J8s5p&7i6=P2(#6_YXZpG_XKhgSp7 z6`H|ExmNanF&Q)ezw7hvOaI&(G%)jrN{^ueMa+Lajk(@^Uv~u!Qb;STZ74%`7f#K@uk$( z8kqUhMf17T-}f43ccs1|?p&871Ry}`!$(Z?{Cy(>PtAT$Rn!)j1V0peBBx|YcLrz|FLyE9LJA~W&WOc{Ll>Mok4Z`!{7A& zpksABInIwOg9bh^G=q6gtNO!a%<`YCzn35T-%VLRL40ax26ODL{xBIcf8IrLkMGyz z`)e`x5lcUVPx3L#^}Cping7$;2cGf$V$i_Phh}iRi=upgtsG>`{FxiUoQ+xo^F4XZ z4?pE&mi7I_WX$|;(EfI#?|0?>kK&s{GkC$CKTO8Ve=B)x9bOH*U1$bh?^=2PqnM1D zze+~KTO8V|8e>9`B!V;r(;ZmKXa|Tzd%gJ z%>NSA{M!2s8u+r%41UbD)?hMb{->(`H1GG#&o^D{b!Gj3F&Q)eO;od~_bc;P#ao1C z@F}j1*z--RseX0uH)!CsLNj<{*UJ1=F&VS`OQ>c^?^o_0in$M3`Wd{c*R}r65He=| zDj(tF^Wr^!n2eeK)~ese`+f8LsGs%rfB1CQh8~}nmG5#re|Uw^4BpDM^8LPeYuASQ zPokeq+N*(eTW$FBSunqcdj111+v_VF(&(Q!{P`?+)aYmM#ICgllQG-=udC<{wY3I* zJ2Zp0l3C3UZ|&O9?X#Wk(J?=x`olZvXGJskH6OFQzfw%bEdN0Fxb|0DYhb>|tN!q| zK4$s+5|c6WKUd#zoTs+dz!!#QaO*kB{Aw{7GyjF0+s zH3au}Y7M+>@A?8>sOJxpG4r2Z9y5ej1J4|q!ArPSu7Aa3%>1)87T(i+o!)yd4W6#& z50f$TKUiLesI4{d;h`D)u4`re0Wldfe^bo_-fz&r6NhH-L9Vq1lQHwZT-R_{#I;-l zUlp3c+JuG4sDn9+!t#178`M!4J4rz8@EpG4tP5HM@Dg@_rWa zo}n3hscU8Z3NaZo|JhVCyZ0;e_r!CBX7DbqmG`rV$(Z^7N*`7itF1NgZ$dM8)}B91 z#?1dm@;E8H8u%xn8GMmz<@;YT88iQ#RkMrtE6*2*cMr|r6J2W!CS&HmjOv&5er0`K z@$#V={6p8u^95ouX8v=iW=`)nXyAE5Gk9s&%KExuGG_ifEApkEca;0v;(vx_@a#Q* zn2eeKt@5}nyc+n9&39$(Z@?sG6O;UwOZ(c$d%&-q*F(U@~U@8>)UI?^o7u6my+a`Wd`~*Om9H zipiMye_u5#dA~se$F<79uT?hiy0U(zn2eeK*s9TK&HwNE1}pabVKQd^Dj(tNqp^Da zFc~xdPqZ;URad`V~qKjm7v|0yP8=D(k6TJKl>zQhNFX7GismGw`=WX$|`(?#0uYHJO=S7-+B z+w+IXnE78nPxt$}L2a#pZwk%eU46{*e4m(%ng42YcK)lYtu^pkp&5Lgk6GTYEhb~; zfAN%^|0QZ`4SZ>62CwR4mirH4GG_ko=)(D3wY3I*KQx1XHm20iRWX$|OlJCbofB3V|4E~pEt-)l>{2v&*%m1L-S_3~4 zn!z9T{9!U?{`<;fzwm0{{X;YOe%D%q$(Z>ssQQJxUwQsiyl7|!@8eo|KZTf#ng1&~ zAA8l$%LWbnMrZ~v(DR4MnE78LkC?Y!)(??(ea|0$*|pYSGG_kAs{T0dSH9mAbN*fW z`MLPjURTx+5tA|V-%K@|d%r;gZyB1w$GBF`-^66h{MS~^I^J*4!0U%*@TRVn^?$@< z%>4N-WODB}XyBjG6!W^0*+p8u+5n z41UG6@_db$jF~_8owxOV-@HE9d0y8VOvcQAA=NMJ{mS>h;>AKUcx%^2Y<)0�{Iu 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

I^XM3a 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

a7bSLK%2k?WPTyA$B8!KIyk2c88^k*INax}yBS z1Ht3KbHM$pr0tbYULGXeVT(5rY(9dp68PMohO z##%mjBDh4ThhYEB)oh>k4l<7O;EUEXx4==}1h4!Kb9yU>ak#s2Ib_4WA7d>BJQG~{ zHG0W`Q4X)}WjoWL&jdezn7R1REZE6`9VyT8(APZ6`W7gk=fOvvV?L15t&ZielLtF; z9ru72n9_NQ_?_zE;Y)1aTn~?yQ4e!W^|07DZoPIP83ze&?C+9D-eH90*BNTk* z73QsQy{dp8yT*Jecn0_wRe|XULHYC&JKr;(gA)%2kNgMoey}rzxN0v&1GrvE|Go(N zCw^mn4D4?K&-F9_2J`MhOW#&ngZgsp4zP=W775}MYyV$SIJPwZLIQS=xn8)y!b`5-0YX)zy8O_;~ z)A>Pr<|Dv;z#A&ZLPsWeDELfpskbrU-IQUiYLEuxsGrO?fAJ=ylc>k`< z=b#=g0iQpBxy18Zz)ufiejn_-3!X8Uc{J+7N8ke=X1<1gR!0%I&lu)e(Ek8FZyfWV z&|aLW9x1;u>q+K1&KnMXYXciLI_rJ<~0sPYM;J+?regO6Z$uFwwwRRQr*5L8rKhVt# zb=1OnGr(ikGXE947jc!}eB@X9wMU?j+`xJd*q;nuHJ^C`{Qn&AF58(`gMJ106K^u_ z3cd@xa0l}!DR0LyLjMIV+?Kl4oWGa2XI0y|YnBRl?;N{Ed2}OFS8XHGt;_AA5bd~k!uCylLzSo&saNh3Vem9u+fStkM4}gav zUyp%L{E_wbQBS55SLKt4^hn&k4EpW2SRaG)ZUz7B7v@gjhlx9?Kc}ESssd3uB+gXj zs`6U|KEU|x?Rm(L%cxfyP4(&vvaiw~If<{Yr2jXAhiWHb2ieuUD3DhAH0W_zw8{n# z)lQrADa7xTuMY<~&e!MQ=6n^Ek*`grd^M-@s`6?60NYPO`Sbvv5AKHgHWIwXFxHD- znhBmagt?l>RL2VN-9wqTWUOr`uF7ZdJ}ytGpVEGH*q8Qu0CwsQXFD&z&L!}J;NO7X z1m8A-^^YPw0aP(meygj%l8%Moal}=6a*!TrzfGV&u#@fB;!p4?y*Xe!0zc3Td?Bq) zQO7IBr=|@9f4d5E3*yyD;A`j^J#|Q&KNEa!E#?oS{^x-|H-h;D@HfESA7MTc3H=a! z{50lIaW=Hi#m+M3oym`@<2rb+x0o+MMc3(Dm77NQz|?Uh*7(wb!8_l} z7V{b`*HXX-zr+cd0Nx(_3-IZ%GZK9GJl4MtJ`23w0_NYK9F~FCSjK!S_;&EmS1@k{ z{yup8Lgo*ko?if8bq}ZiGo zylS3Q9lc?vz-0eX==;IW5SD9?fxB#EJ72@jbl53^9ZI%wEQ9|0Ev!#KLN|ji-^F|& z>gNIQTZMex3#eVG<23k5HPEJGGp@@w;BN0Qe-P!V1#vlecjoeZ)A%b*^C7OvP1|qp zR}-Kgae(beeW(w=9Kp<`|ao`0VCvsAR|7zlpjK`u9mTOJ2@&O~`4zcaz(&as^tXfGSU zzg80wbnG%dHSHbZDxEn5rWseGMK0}VO~!4rrp z`+2Yr_og+4e#d#PpV`p&g1!KHa%;x%2=wow9=;4d1w5+@=W8R%;U#eYZp^;}Ujcrl zCv&-vw|R4}Jr@8rtbZ@W}D3?}2pA0UtAgxy<)22LJL2=0Bs| zZ3XW}Z|qgaM4a~!_}NL!tD`(GfLHyTuVYQ&LEWP_$9UtO42G9*bRX(1y zXi6O&z^jAbpci4QV*_|&@Lu#TV|8@Ld3y-Q^@=lot7${P*Qs|G(=nIkJJd0WxVm0B zC}*nn#_X3G~2|SwK)U1x5jZbP0;NkRsXLUp(o#(&{PBWMMehuE>J?1YU z{l9{LK(E49#{yl^k8{dN$fuq~kyr_XFeF3<{6_tsrayt^s=^TZ0wgAtl%v|Ew5#R^t z*+_M?Li#6x`_jU1b^HiBv%szOnWuo~f!C*H;OZCvz6t!5`#0EUP09_A7%gY{~o#?9>AvM+=zMu^+rWc;nX0SAgFK{ss6* z@JGSBw_*Jj@Lb}m{EJck^rLaChTfePRjUKbKC}biO=)GKIvz({_XX_uy~q8F*!d0m z-L!U59lMNA8c)-Wb#>lE=p|mNMqHK8I9hC|j<^mD_8a4Ry$v3n$Gk55!ztLwhaGZ{#&I3`dzP@iBCfBjhZ(z+ zc?$Gi)S;{Vp54g&U6f}f;;MWKVPDFp9`wu9jRQKqg#F&&&+cG;6zLxZJH@ag?d} zKd>F#=>q4gj`3HTb`(4ryczgs;A6oLfL{i0@&((OjRf5yuF5&Dh|59p6+}z))O9KR zlJys1Cl36Li_E1zO#(l8nfV2je=G2v>c$Nn9dX_P#MOBVa9%0@3E)NG_cdGCY1MLE{bhyQ#O`aI|`pb2&>r{2e?JT-s4s6zdbg<+>z+XM&6W=>VP$ zF8O_sxJplEe@>6g+f0Ez7kcVOjbjmbKDb=>ZLl+R7~9#4diXx{h0semdaXT*~J@*ol3N?Z`Urap3L8 zGcS+y&xV~$*pd9M0nY}P^4Slb3oiZ9Iq-aw{%7K<{FCSKd6%OctTCLgLg?jsRU)qR z=NGYl4bqtkeKGXpUW_9X`f(s^vg0eqbZgGYa-Q!2V9~0&sFK#&Hn* zoQasGMy%~`gS2s^#OT`n@0dFkQc|G2{ZRn(u!;Fqp3SLLpb1>nxb%pZV$Epek? zFs0{R@Iq7ii@=M)r5tX-e)R8be;}V$bBkm9ZeMe`VLC^X`lhQJ$8<=2izfY@>Q$;6 z>&^9Qb{X|*zNuc-B>Sp<&W9amltX9mh3;&>57OTs{3iH1@G;=aJXrrG_!RKGYRqTo z{EIo@{XCiPbYi}QxGMjgAMML$7xeDItUm_*r{JMJ%u{jRAHh3}RCoOdB{qg^1s z5^uZ#eO5izOZ_|y{%(EdyRF9QwbR7!R8QXPz)YrvBwbqQw+V|NY)=iebW+H?-$8>@werP ztLswdQPvmY7d4=dgkIv1R^aL25?AzxorzDgozXb&IPmMwFdqay6Lzvp_E$jP>si)c zgnkcr;~C7=x*v6%fSnxJk@)00=!@pE{%4kJ)+(IeQ}dYb1`h_GJD>R@;8lsMa?XSO zVDRSP1*Y@f3p+htV>{E)PDemr1if6ZXQ3}z#`=NC?_%h+D862jubt3eT*-PK&1u>} z@Mf!+e~I?;33$R9=C30CUxB|1{sS74UX}A3iStVQR)M&xCk=M6ovA#m(vqQ1hhFMK zN9gzLV|}qZpLh`TStk9H&~G@x`dY56UkH5;^fb&jjyJ&bOuP`h09@kIE8s=oavhzk zaelREE@z1YD}qOYOI)1>o(>*_^mGBw0+%>vC~;M8pWWnqje&j=^f}N=y!r}w9=ODB zTVW^Pk1tdr>dAiS3!sx@v6@0j0tDGw2P|X3o9`{?!pEO~XPJ?HG zi@*92_G9a_eNU8|OAXF%tp?0j;<`i-SLx4z9jOng(0>AbBGTCj`aI~Ro;(Cz050`y z3V0E?)Xzn*AJWd-NQsO?w?MDO+Lz}M=&QG9Jv~iq9A7~n3B9DpLN{VmzS6G&nxQ|MnRtkJ%z!>@f>&|xTI$#@jLai>j$xYb3Z%3jDB{l zsh{0!oHtA>0H^N2I10cofxCep2iM~J8ASBw!4tsIjI_((=_dV;;Db$iOD!({tg3t+ zeQ@4z;;KBKAI14a^VX_EpAEhA7cC7QrVTaO?+iO9Cb6BmXs3gq&xRh=UmHu@QTfaI zt25Ksj+}Q5rB|i%8*uY=*;U4M8EHE2B&74^b8LSi%3+p~PP#vy&gCQZ@OAJUaPcSa zz|K8O*p4R(^keArpqKPN8p-8f050**H_#V?i{Eymfv3vvrcG=gk85h>!S8#M`8X74 zGI71kSqwTu_@_WFwXlKcsjWF&l})b;Nl;AYjeJGz{L+#0nY=M>(Y$4Dz`&dIh{%HlbxY2Fxhz+ z`d`0i{WD1Ce`TSl^y!VKf+3Vkm00pP>H^TDOu zo`Ib%F>Gf8^e;nyz;xa%;3rM|2zW8L#5tG1{hD*RNq(JZxT@N3B)GK42=H`pDd$x1 zEO4nmnc&$b{lnn7;L^UPg6D$=BEPQ^SLNBY4VT0BxbC~5FN9v=!xP}e;8M=t!OmK> zK$?!eu;WeHSN7fdG9QchtqO5f4t_1Te58G;VpKd4TfW8QNsSgLC---oaGGBBCdaV`bOU7k4q3=A8?bn5U zm%4o3<1aJkzoO^di5vACcBCAtgQuH#OYkgk$!`{THn=CsXFPF7amCYR@Hxa)`JCF% z>1+i%d9a_^mQyZq*D7$oZp@`U?gdXY@zb#Xx91*`zF168mGsq7V6XS4Ne?Q zT$Nik^x_{HLVx`#>#suJ75ZH0%OPLG!1KXF!Jh#y1ebDN3|<5-`Q1U>Xum)5c~9a3 zd;q=Hoy$k+^H!dQC<{2lO4IPYlUs$LC#l&_cc z%d?JCl5Z~r1x&f>0bpd*Cigj0Nhsp!HdA9ocn-lV>rKZ-qGNGCO!*15*JfC0478aoV*TR0W3gqaJ zbnb^fei7@JLVpVSLg=M``5yX1(2IR*6E2^8=%w5$5?ARN_^Q4ABtBJs8uWh9OM03^zZQB51B|0P_!lNV7(8Mr z+uzP|?J?r2K1Z6$XEyX7L;p7POQF}Gm-@2{`j?j3+y4OiqFm0er2iuH9hS3R?EegX z0rXOy0U2CAKI%a>I;1=+6F2-D^in^YK))DzDbMcE=Rhz1c{ub9SF-&{7UMM9MCkKp zar*hUnl=ym-K*^N%b_oTUh3yt&^KPqdU+1+F!Y5c{g=>hTEqI6ES#Pnpf7@6{FQf8 zE}vHGSU(N=2;!=IicR_y=#Q>veIE49q1RA8V!t2sBl1~42l}DV` zJ>H`pkfh@QCocaw&}W&_(;oUgJM8s+q0fe%f2(O@z|%~AAlKlbn%^VbKO&jh0&ss5 zUk)Asj$~?^z=OaguGj${3NG{K`@thk`lH|pCjF=2iQtmXufXeoOL}gAC!6g52A*cJ z@6lXc7m5?WbuNA_7`z!crpdKR;6rx;=a?rT!|%b)D%g?hbsqXFpR@i0 z*!dRveCWmhxVPYXUSLXR3~@*KO@=;k3+Gqj|Bm39;K3;8!Qj~@{bcZ5@KER%5_fdo zmBdx~THd|S}z8D^bjW9V)zd#c49kY zo@f3t?6eH9820_tgST|t10L0l^$&qRk94+x{hPB{KN0#K;Ok#tKD#{sq94*Z0O`c^ zzjic}?KfG+`tGnZ7Ix-<%lP_f*vW<+X%~6WH{QT@r2pLj-p$0{27eg53(k8Cd>1&k zdQJNRJT#x}Plo;$_{-qWf&0>gmAYQ>8(BXF+_N+DMc_Z7d?HD&u44}JCH|y7?7VcC z?W~2JHsBc_Fn=5Mttaf{!j81lk(r(ya4Sl|; z{P#iswFm2WKz|JS0+aq4^eenrzZLnq1>VQop1Zc@a`W?HJ{ArujJPVdLfGfrX<8EW z&xEl4A=qyUUTor>!S5-@ddctouwM-O{9Ah75&DoYd;M(a{l4J#DEc+fA1lv9^1BOs zTDU#`0K8EIb4h;@_zDxh4(?ll_4`q;^fp{RiAaxJ-wMQ4{rtEt>(`@vYJyj+$2>Kh zf6)|n(qTv9;l9v!>&E)!urmz&XK<;vlfjpFXFa(i<5&p(1Gw6cPaSK(llrl~KI+w8 z@L~5dmpJMZ@MBrbpM?Hv;;NoxA^qYXT-tIubQ!?xY$zLi!6eqd0sE7|f1k>{5BLM<*Lpw2d=%oMg``*I za1!|vKl}#ld@zmmJ(14+;IV2$20Gfp&T-f&h8<~l-$Fn9IeR;n_FQiJpJ)Ce?1vLq z>CwJqe}ZOB`@*xnS1#)xLB6hn9|BKu<6qS7!1`b3vpxv+Q(!+5_Jd)k6YTiE%=$#| z0pJGw4rhA1+Vb|^Ycj032>jI%)P+BCT_HAQ+{1K za(c=avitLo&_EVUIgw2`<1~jeaLpML7xVG{3GU1fVTtha*X*f@cY2`fQ$Z7 z@P;3={xT})6!5q!%%`G5noV5gw*dK-alsnsC;!g+6*zAJc!I_T=7WC%UI2b0l7Dd# z_KRR&+OvJO)}KcG83lc!N&g&pCb;U6;Qq+h z&)^FlV0}Aqk4&zIUp&aX7I-=Ez=xQxhW&})yTNne|Em!<+9T5G1APnVJB(mElfk<| zp9{S&_;BctLVpDO3GhYPY)AIfmQsRF-QV7+*XMUekqt5emL#HtRn@IaedD%B>Lgxpin-3+Si6 z$odaq{~qu@bC@qeeusenG?)1|&`$!tIFI>M^pCTN8|?+>^@Dy5^bfzn`WZ;)Ztxom znST!bG1$?*;&vf^_!{&l7O`IZ%q{TduQLA(>G$Zu^{~=n=G|bw9QY{kV5BDjeA*J$ zN5W19_^M^hE1-UM1K~98l-oiW+{2+L@t<1^Y8OI6mCEzmedX2ccj*+JFckRmM*?b$@k#vTG zp9XJ_^Hu~;c$4+AA5nGi&1xeiI;4L|2hZEZd_3%QBd*euj`Z+vHElTb<=p@KJ_=mg%Ng+g@33C> zUAzW9ZXa{mZ`0C^^P6SLZ#Z!kZ*+W*_43?qBKY7#%%wfH2Jdl%xx|O}f~XI=0C;9Kci&C?c4wV$spFnE}ji~HI*tu`O& zxpa)}%WI-mgJ*xjydLbo4gNa#RJ4~u;;R1m`K21lK5mgTb!UAn^awLG zKjJE1E8h(^EabpWMd%ZtmwqP=`da7MK82~q(GvV|@HfHxgC`fU{sr){;O~MD0-pk2 z?L6yqz-NH30hjUPQt(5cvtHuo9mI|Hh4f4O@Gt%j*HT3z=^KUh6AM|~{vDbeJeW58mKS2K`^cl#nXHU*=G4xWNal}>m+$v`Kn~<;O z;A_8QJ`EMFAME(~ry9yI=*NO5f|moI4Lb{Ou^m5*6PJMh+KR82FY5Vr*vW()X}=#q zzt)NM8bzY45X(#_$6@3Z!Peb-B>>p`bOZD-I>cgPkZp?9?XwJ ze?Pca8|Jf+ud(1&y_nOx_>5x)aa9jmvj`$sRK8;~JS70ZKChAo^*%xPTKZCeRzZSstArkicK;Ji> z^@C9l$3h>Ag9>RqHcPKzthne)S}CxlfS-{&@@L&2Zih;9b(0%Q)hG;;P&-k*`pc z!$jz{BdnMG(`JJYC}1x8gDnS-LpwSNJ3C=N8}{Y89|z9`mwxA4*ml8?+ z>przT^CoD&p~O}C^I?a7OV6W2|4uh1DX`NT{HN~B-^7Xgf#+c$ScvO50rm?`_UA(X z?W3HdJ|~T`lb)Feh>I1aLW+pXHicy3J+8{JoXTu*NS`v zfu9@B`f%7uBCg8EO)dPUgIb7jbb!8ZHtX*L?+?Bc+z<9g!A>OXNIiKD`VEh=ooTT1 zDtO(|%wxgVf%h@-o#0P`r$PTI_%`s*!HdBcjA8qqfNRu|sqz^ymbpLLZ!mbyB<9~j zUtRQ*nLmx|*p#>`w{+x}OPih>fd0l*)?bF5A<$=;^iP53fQLc<8tm-PWjk^m-xR)_ z`4Z?0!RIYzUK4)!OYpE`%-z6$1D|-9x#YLpy_~N+Q#xyd7l2E9YzJNh&ek+-5V#h^ z^{O1w`6PHKxEJ^W;_A9YonQ-xP_H(EZzyCg`|0fkU$dI|M%4e0U_TM|rCOdy>t!86R1Di` zbAkC3jgM>49|qr#dg9!l^=B@#ei+UhPF$5k0nRJskOE!=F5{F=u(Rhow(}|MX9@q6 zc@fg{DENXK%w^w(r@@`RWltjQdLDQn{JD%@UMH^7S&Z~ZJ9-ED?Z2>nR|}u`0`yu4 zU*AZi=U3=o`;GM!rW%Lu04|>&!P8(Tinuy&B|}zU0dEMN1s-N$ zeX0}xA{)Gu&Rm{fm_S^eHx1{N{LY1bkqhh3!p;ilGohFMr~o`0yb{v$DR?e;1o#i& z`QXxT`V8dqi3#EJ9*4dfc)wxHtARHM{|Wk+!0!e3tHk;dDCcbAD!+v|uaxt2=%0*a z{b(mPG#lJ0n|V{%UkyGsj=8kcUEtHeCqjQ1+@&(>FCaZ9!7s-%r+0%J#})9{YRo%e zyznb=qkba&(%#G6&*e5Uk@deI{guFnB{7${G=aFX<5n)!I3K2gwWiSLC$pZav2kRA z`=>CMd7*p3FVR6`hxTW_9@jA!y!`#lze9dEgL@8Qz6$&p_-61d zr1MkaDqlm9FJxEy0s70P_T@=8>{R(YH|#OZ)v9ygAx+9q2!Ck?i1j<6KMZ{q z^b${Agx>cE>wiRf-he&_dWl1PAL4Z8n$BAVJP$kucA61a?d8(fY`;9prw{an&`bRp z4PI=rKMQug(78THT)Gl^EiBbIqxi$O!9&3%{hz^(?$36bAe~pCPlR5|-}*4;HxpdS zxe{@euXlaeP7ds(5_dEY-wgV4VXR*deP8hX;FrNifWH&LdReD23;gQ}%-ci19(++0 z^B&;4h^u;)R*B2U1N;;4*5KmLi@|%D^d3VvzhhI_{==wOzToH8ixTLNekU4yTwUfT zpsx*{S&#W(@HFBooda-QSEREG^xNyR-WT;}AoSVLOT6&}^zSufz3juk5Im>}^NFyt z1$J^_N9y4b=wHZS{SVN84*e?VWxVhUcmcT79~nO`Xv217Jy^(4F3-B{n9KfP3B*-7 z6q)kX6kLns>nQz8U+_q9ssCfZ(@i`VJPTav^J?&Ha8H!~KH`q*^I_tu{b(o7bT~n8o^)ujLJ@Sf97LQLBqf=4q?6x`b6+WLz(XeZwcOe81t5H z{EP0yRe7#Ldc+TmfIe?D>+@h|GV}$|OF1uuK79=9<-LdNpf7@6>fw9P_jru;?Oo4_-{r92OVXPfL_1kVMR^3<|9U-{rt zZsoxbfJ?b0gBO8II%QuSErs(X^HCk4j|7);9!y--pD~TO#zvuho&cX`;&Z^agP*eU zAFKtR-JI=w4!$3JR9o0b{C14EQQwdr$=5aFj@rvVpr6)&^CkLV3cMZZqlqi~X^rjm z4T-D#USG@Uk>}t#fwy17d?ot90kD$^J92#|fDbm=p9`J?F4r-ixTAEwMO>xlS@ohE zI%GZPF>sGv%%9?7){cYE5{`6!0Uq=g>#IZm9dT6-t($Q<_=0; z1Uv^^@^ue!mHv$P_`LO@9|Zn5IE8b@F$#9_U`PC?Jl|9RF4y-t*y-{S+n)_P>tUw| zda1VupuYh9kInFYuGl-y6(&*@yE>@P|T}%e?n3 z*ztoM=|_S_b9oLc$9kDpj3ut}n+Uz6zcKWuLs_4J^mGER5XM}_WdmR*9d@LhP5{p| z@wwnx;8Gv*!E?YvaNa}Uc_#h^aYyy%8$%za%||;zn5kVSuG&##G^f8G?7NO(9u&h| z{7ESIa`2wer-J_iUIqPE8{(=wi#w$n%3$aRLO&vj?O#TH8w0&xChLQs&jn8emwtRT z?1a{1J7=KZ1AYTs=5Id&@0H5>XP`d^ehysv{cGT7(^xNl`#11W^_k21uCTF=%U}H7 z)kds0`@Pr8@OybCzgL;;tLqiqjO}zn`jdzo?X*j(K|;V~AN68z_CoZYH`s}|pY1e< zegOFChnc?(|27u({kpP!@rSdaj~~f;nLk+s-WEI^_SeErBJ9ZZeHT0vJP`UK@NCn0 zZ-M8Uc+g{94*B5HertjkfP2DzYvPXDOLyq~x^sTT&Is^Ga7pL0;OXGfewTu0flK}0 z4W47Ne*!!gJQV5t4m=-R;&#t*j?*7RT-B4fJ$zkc9bFvw`)ir^!Szi8f9yr(G>vQ= z9f_-YmEGIEUJZu+4D@T!ejkHA7kVkT7oflNR+wS85$vxNJK%C%c7Q)Sm-W4%e-HdT zcmnuIaQAtve+B;M5^ZebE}$Plf%P&?iDK_1yn)w$mD1;+$&Wy};!cVQzXDzeF70$Hcrmz?!%=Xz``C_@ z!)5SDaM9}%xZKjfrTi;^XM#)ptP7qEF7>T5c&>>LA+G9ezf)X3r%|3$pwEY1{K+Ed zkA24aHmE<_p)WM)KO*kvy2v{1VHenrr1LE7PXw=u^jrsD1>P3?cbwO6Fqfy;344Oe zEdgBGOA>fGIG>&RHSjF(5ZHeZJO^C-^CaS`+>X0&&Fl~T3*f1)%;Qi#uM&4u4$ELa z5B58{vZ3|hS~lnF3Iea4!pAXhh<17qJbeQ50-X1x=qK9iFNl5;^M%lVWAHF-l_}o4 z1)gu>ZWJI{v>+}0OdliR3GST!An=@v%<&pdtrBrnZkN;xQt9}Z*LXnWJ6yFy|l;a(6{tw{qL}!2YoU0A>ccpZxO(H3LA{$5cn?e z&%jTB&kJO|Bo8o5A`Qk^ZjGCz{SX47@(L3-r$rcT}He!~RDvu>F3}F9NUi zBJ&lvUTa`K&y>!6W!OJr=tH$F@Z0FFwNnNU)3&323jdtAs&8GF@_D->Jy*b&?`EC} zeiQuHPnpX)bMG9s6Kx4Ml;LPE<-o7}$oe0_tAH=R!rTMxv>|vSjqQvwtZ7Q|7xqgnsWH)@R`Yd<7n@UK~t^tUtK{J_s8~$n(w~lenClzsLH~IBx{_ zJzp|kjdWHAKXik6BzSZ1HxDs?8tLf){_%Ir17Uv%xc-&B{qf*Ujxx_d`<)5i`&Z@{ zP@YS{_k7G;;?K9i%N=Jf&xxD?_e8ytc;+kcdp=>kJm2~Y_^@K;4_b_3)%+%NxjlS> z`HRR`4EX*c=5tUE^}yF%V*V5CbOK+0j(Iuo`@oB^k<3}}QQ!~$!uso+9Bndj!~dY3 zh~Hia{ad$Ke;N7>;4A;Zya2oacG6%+;-626JMuplU}wB~ku)8jA-_L@R|sH!1l(r| zm)jX%<`hmCMA3_he#3pL<8lZl?xIOFr)e_pRDrni=MCHNdF$f5^}t7g z*8}eXz81VX_;B!(;1Xv(1@6?A?N^3=0eAwq*vTiZ?kDC<>uV?zp?}lh^jy!UT>cVg zegvKm&b3|Bu7VeWOWfl86qj2uxLn5y;C`R6eJQC_@I-LYcOtIJ?Mf%k*Ak>N>Z;@N z&w?H8EZdiH$~f5RJ(BIzLc5p_-gqc;iF00s9Y5Id!g;qr|Lh~Imwv4f`bg*{Uyr48 zIi!P2zAi(bW#Udxvp&aUCmcKvT>Nb^_;zsdGabMSP4*uEF9w(E`y_Ey&M%GPe96Aw zFA{gu-erA=`#9Fi`(&k_{CtkfAHxFe71-Z0f%Q`UE5R>3!93K33wjfA)$X(+wj<^L zK5<9s`55|X=UFf1aE-XiSKdsvzZBQ;SLpMgmpC(oCP)qc11|Ns7I-1Jlv``?VsNQ% z{lT@*?d#!qa6fQK=ZoNx;8K6qf~T46><7;Tm-L?n&jOcm-%aqxOm_UHaek+Pi+`&E zJ|A4t*%Uk=P;2|jg=ZLH861I@9i@Xmg5B!Bi%%?;DCV0fF%q2cK z4E`v%JTG5F+)+KbLfm+68h$SW_OF9SKFj_v2fQ9Na7T7z9-zl^PLEu#Ukp3sKQHig z7asg9=XdA|)go3r)NS_$6=;*ck!-6S%aOX~b1If3$(m+Zp=#(EEMC z>6GiZk+`G$?lAQ9UNF-*`UCI-rt!-e@FMU8oc98_+j<^hxq)8?_XCG})~r+k)csI@ z6ORNBF!3hDRel$2j2mN;F-NDa*7lMnQ{}H?xT-vqo3_h>lH}>@{0Xz|0>|_vE z<m-mgiZpldWv}l?973kY}k=>%KpQ-CcX}KhMs0S z(!cM5omJ3_Upfw603L#J`iXuvj-0mzcmcSS^L^ka!Nq@$Bkm}j)1Xhh&gn!kYjeQ=Kf>-iu!^F6`}op(2MIkC z=~6`LNRW;o0Tls3f^?(=MLH6YE>Z>Qgr-zQ=|~A3X`&##M5KcPf&xl;clY|<{$!uT z_xvH|lPmYm&d$!vIXOwf|Bze#FY!p+)}uY~)c?`Xhd9y9Z|-*2f1GpO>xa)O<@7(! z%KrZj{$&-pJugW9iSj>Gl_w&f6F*W-o)#~KpRfM3*Tiqtl-utGYKlLqEgz6b?Tp0x zz9MhQ^%{yFtuOD5Ps1C$Do=nf#kWPs7tqeNuE%v@R9xGd8yL}e}dP=hv9Yl zD_;u#6z_xE&k4@Q7Y|VWBd+ha_)OYq>(PF^_#ovI(GTbFmj}z2bKE=lP29#|(sAmy z*iWg$aYOJUljNzXU(|JPoD|;j^g39c{4Z0KxASd)XZlQTKVRRRI;E&%#*K4PuB0r`UX5&Q-GMLhXB<)?AI8sN3J z%gc~&h0k3t{{`=k58WVNgMWlq{8m1S`jcFbt3Ri^?v0Z$u5Sbzg)i{vJx|XwYw;M| z#`!k&*HWo{e}O5KgW5cnxHx<@J`eT!QaDQ#|z=v zkLb8JxsK&r_txL?#hxCw;jYKkZ_TK4;+*QtrcQS}#TEG@jyocrIuqjYS@HPiu6x(Z z`R?iKvI-By?YeBm>)^J|?8Uc*j8gq3u0ksa^NR!<2Nne6jT_2fhin@lXgqg4=%MMLczS)#*b0GI$@{#zS@2z3U!RUf12) z(}Mhd@}sEJ4u2zq>Mz2(*is6YKv%5Iw|O%mDK52O?8+)o&9(pJQe445g&=u z4bEeHD(?1(|H%5O?w9Dmc@@HA@aE*pxgJ;htHtAWsS~=lrC-6ue-peEo{su$T=)9F zN@MlI61=~kclUeSbbW0;A4&c)`N8BT;}u?4ooe_3{Ixga`mf`x!6WgS?0>f7Wtu8k z6yJ-tY%cFe{p0vf{12|LrGX68+o!iL2BVPb7 z(_UVL_LRn3;M4Isc*?HIKcLQlDLQUQC;1%O|2p|Zk@EWFBk+dr$w%W|@P)nP_InTd z;wO5__fvluey6W|KIc0TzdTU>I_;l}cl%KOIsP?1Wstlez6IZi&%_Vm4~HoqgI{(% zu5tbw`PZf>Z|}pokI(!}UV}P`=+E%ga$84I;*;0N&yvrGXWu0M9nbB0T(QHd!z1z`uUO8WK;xADr)i0{^CSC`B2Y&}|jPD5K zTjDt`sE+$>3;)pppNrf1zK=h`!^jW7t6Wr_@%R}00B+-LI-cv2@<+)p#_!;^?^=lu zxUBq8@>_7{io74b5ATP6j~~P9UR8b<{tKS&n%wTY-|&xdcRBDMf8lwqE8mUrmVBzN z`zJT#4e)1N_pWcuEnQ!GT{kcJlfNoof_yPN`Azvwj#~jgfG@yn;XQ6CZ}-vbc%s|# za^xfMig;1{UA!$mmiF|;fB#)|EI-n9@4O-yw~^GDKtAUk! ze1<<%rvP=n#b3m0;`{J^cocpL|0_`E5}x}{)$c(5Ha-lmivNZ0z{BuF({$Yv-&38} z@HF_F_uC{u;oqub?Z>9=Zl_+$BQ>et7!K9T3ao8x8iQg}z# zy?uVyS2RK>@AM$wp8PN5d;9s!PUu~Y=fe0%@^ziuzPyhQ$2a05@dT2VIYA93G?2l@zKonEcOp zrEyHV?0ACo@*b1=xRf#Y=_C zYmo1a-_0lg4j<%tT-Rk7`4a_|x99uQ@S26>bE&fcuUAA~lm7V{A6i^)>&`m-NeTI@ zw0}3=ptSrY>imE&FDrLn2Js(J&uAZ2y@K4v+gb8uD$2hme;w~#MQ%TDa@X~^`r#q@ zWmT20Po1PQbY1S_;dnZ{PMGqA@T_=u+@7c8!>8h}kbe&U1)qtR#|KqY{d)9IE&RnA za(f^6Yxs9B%e#v8o%B>B{Jl`lhk2E>yeLVjxl<@1pri~oY3r#*A< zoeh=mLH-MTVGdwr=4o~E_@81?7e z({V50)}Jqt@7q@Se&lQ7cW@ggui_!?mH&eLTlg0IW!nD^o}i=hzu{e7k8Aw&A^$=* z<-@2y81IR{h>yk>2mDj~Y`|yXnYydK)%gOi6Yv%Iz<_VSzX|vb{Bpn#;yELqKJIb6 z5pMItFZkR*{#X2H!0+R!dZ@nDNjOW_{Vm-6_Ll!hjbFvBAD+Q;zxQ;VJa{+U@`dsF z0WX6e4|ruf&HJiv>rPF)5gtZ6U&SZjJ@ICElAceuvn~Dx?oP}8qbq(h;JxrsAE=J~ zy!;S6XK%T^J}}XBf4|MX>k#94y6bU`=ehCtQooM-euG9lBcRS2*S-0n+yEWd+P^uT zI^V_PhpAI(sOmJKA7b$dxV>I<6TgVN+a&+-7yjWe)v@bdi}h|LUXpyG*=qm!fTzJT z3|F0X?-U(lZHyf+`DSQL| z!Z^9zUpw(Wcnk7}@FVzK{1pDdc-1+{d0oaEPLvZixg;`ThT zFdjZrdHcI6FW|>#%Wc1O4zCd{kEDMpPae^*v@>U=4;*Z0v)tZCQP1_b*1^}vpJX0rMEl>yi)~Y#NJo#3_zc{>-}fHAV7u~{$w%QI?~tFw z$KZeNk>|mux*k_MFWy!Ex7??^y*@TCp8PWEZ$7AeYwEAU^L#J2{r@JsE}or!*on6} zr2KtHk00>2evsRJdJ6CI<0h`0k(N_V#hbKO+d}llt-VJ{jFM*%HkKyI;6(>~ZN&reX~ycE7Mfe!E( zzi~r(+ZQEay>9obyddq#fPajCPo1oI^P9>q!t>$@Z_DQ5Kjb^9 zQx)%VPj2I_E`AzsnOOB-cir31N8Ni%K%KY9S9qv8OE|B0U5{(t=;_x<>x8~l&QBI5 zKZrW@AF0kJd<352v3wZE{S+VjL~gGm&B0INdC4!ve@v(=yOH{9tWF|%JA4a%2efFV@A)gvwl~MV%HF z8`3z7eThvONu$-lMp9jN`!f$Z`sbS3xpX%nl_7uz~ zx7RD?;k^RB6yJs0^Qo11@%&HM-;DReS8&|#@S+8jcZZ+<_z~Za&u84m;;D-&zn1Ir zE8e}3++|x4cz*nsvhq(k zZV9}1Ie8xP74RwLG%uT>TU6ZhO4f4f?#J{SRfFO#h#JM4PAcxjAl+ zRXT1%+FuS2-6>zh0UF_ZzLVR&y(RwQL3vZ=rLOoVhvb8)KLG#ifP6MS%60$!x9_W+ zsqp!DES?VEgx|u`Kh9SCs|xY~V&@oMtfKrZegn_&ntWp-eIlVdfqVUvtc-k7Qh5meN>2If zVy7rxBfI<$yprqQc)0bEuH!TK8{{8^DE|ucXFKxAhbnK^*TzFAZsTDP`7k^S^{3$x zxQ(locqDG^IpDf?z9)03JyDGROXSCsx9jM*PgK2pg&fLfr2QH2IrPs4&MGbK(ccr>LYl8)!d6;<(oTwaGVmMftsqx7Ost$=mhq zPkwuK+BSp0PTOv}`7t=h}OIc^@;z4Hy{d~N(xAir>~^6zjV8{^w& z%Fp8+@id#|>l{4>;XCoh^z%g5z2io5T)VGr{Th#FrOq<)D{#Ayc2U2f7DLp4^XEhK4p*G{m_3@$1iV} z+w0*?UHAIo7WHksy+^*tr^+v8ei%(Yy>|n;4_g-&;H7ZupARZ?eR1pO&D77aRQ2uq zoAHU%sc-8}diTckJPNmYtSBBG$k%Y)>(5b}LjAf! z{r@^nQ}QbU?SBtH6sSMAHvJj!G31j^R==gC{^xioZv7eKdR+6QSJrE1_3zY9_i+Bh z=DjfLa9cPw?~NvJ^WHwUzE|f2UYt4?@g#dgebIj%=L!BSzLk8sujuEMIxp-0BCdP& zFOeTjzA7HMPnDkz9sJy*iaftja^6AK5BcJ(*^7XmzlC9ABM*Jk7PClpWUOSyt>K_}2Wy$|V{yFM| zxWQ|Yx8q!tJ7QgZ0uWl<4qFFf1^DksS`$> z4EQ|qHIgV_I)Og17LQ6UZ^`<#8$Xj?eusT~wt;GA1odqko+5uJlk)a`kTT@^kazD8 z|8bT4J*mS-;q4$x_7?L8jVk@^MHIzQRQngPBN@gK9szjZ!y=s`#ni1<=;-J^Lhzy zQ&GN&{(lt@tt7vMzk?^OEN_hW#+%~yezu9Od+iUSJvqp)Z77ex^=#d7mXVLbZC>4l zN8_2P6YIKnUelYXJty!7`1^0lizm=0(yms1PE+}pjFbGXd+m$~9JdPj2CbAoME&}B zt_b-B#^*bDf{t?gzTrpIkEOotqh{gGT3ug#mE)|X&hGalCmARE@wp$!yU?Dqc$!}F zj}zzXR`dW z1ZvMf{Pn@|WYix={YdKDIA2V@)o032;CwgZZ+#@+!f_8!XC!rOeZNe8=V;}ZCQzXS zYjs}H#mvC-L`xkbjHc z!b|)p4`UrqvR>`!c2wSjd~W<4{u=Y`bFO>+6A?JC+ISRh*Q+%i9q|6H$Mw9x_Wv>D zY34us|2mh|PIo%>AET*X_&Z$}TYneeVYuC2oAC(TuGewbz3WoDP(HtI`UI+fjeHb& z8&`=ps2`>Vj++}_5y+Rv_XP5d@#6uv=kK?0YiAcX@3pht1NB2X#=~Ihq~EK4u=~PZ zM=gb0KiKQu;Q^mP{WlA%9}1>cKiKP{k>qVWe@(tkS>;OQ^@-=ey-rZrGD1V7@GLw8b`RvqLL;j13$|qvo+(kZ;yzK*HU61R&_?`TU18TpG!_*t& z&f9%-h`ilL+1$L>&tZpD$BtVD4-a?)JOa1#>hS+LZWMVtZePES`}>#pJsW-KpAoKm z{a>iD`lnq&ePRlJqoKSKzQnKNuFF5F{kGoia6PVmvwnymZ|$+y6W)45^=&@+k>hrL zQ|`VD=s$kJvow{@!|&oPn#rr+iQSE*cV5%*=eSRw!Pin}A^B%r_pVFS(WkF(Rr0;t ztNyQyw{Uz{3;8Yf0}*)Jj`B$IJ@GSL<-n`gGVdGEZUaa$Ko;jw}IAJjk6NyoM4O({03KfijHcGCV(JhF?tE9YzTr*lmG znU#DQ^3U{Aem;4--$TjUIB($Q|7%=@leclz#LfG^51ii*WA|4Zj=R3Mj{6?R?S&WX zD^HD&!prrOmuLJ;$GZ=dA55qdTZ&hSl1Ec#JAP)cd?9sC;X{VW2hl&jx$e)y7u9ce zy^?QH|0fu(d?fiCc=HkRn)q{g5AyTzDtKn{?)2_IUd89&?eW&Gd+k{fXitCgNk;0p zOUO^ccaE0#pdS|DWyi>eC)5|LrT!l3r=rde0 zJYEX7`Q#zqG?0I0tNOY6MjiL6qenr!_$K*fUau>QXWA{V%?(@!&v0DcJAvvn#hdSw z>%WfE1s{M{U;stA?wxNG?X>;LKl{c&`)!}O0=M>X3rLN@@ z%3r4+THwzomOsF|yY5}z2##y#Yy14jKzl}!kHYPI=i}pXJ70TVuqaSx6Ya^IR_)o# z1-5auE|5P$zEE!RT=%OS_YirzzKOQ0-)@s{o={(q#dYs|Z;`ik!QSVP{^rx`g^k-% zxQ$!e4}=HuC8-~YXQ!QY@$tCza~s$HYy3x(xAAZLy_Kc&`;{9~Khm%7{+`vq?{oXm zb#MG!?4|s5@?-Hsz2)|MpJw6->&dq=u9jNUoJZ<68xI@Zyw}g^aqH)! zcq!cGhkyDrkiSJf61RS{@fn5N{b=KJJZ|ktxkLT1ymo%S;cqY=?7oW*)XD4Sz4osN z)Tu9Ts-Y}60 z+4ICu+GFQ+&CPq~TMD=Fka(xA*Y7)2Cye%l;JtRrbB5>>rSX2l<#p-*>iEPn@=>(& zO}y3sc_io66<_nAJci@iJP=MhZ5|j({(0I{gZwmn`&iY}rwE9Ilf zAHat$lkZ{vKZ}35M1G6&x`oeMEdQPQ_BjDB$H> z_vV=ki*#If`|Uq!;YU}?7vs&SbBj85-QOpl4<&E&v#mQ3fjXDThvC_1PlDa*w@BRjEr;v>HJ^_spO`u}pKtwH?X>y4 zuv^FL&-uT|FEAde;GdqCze}Bl_!GPX9)Y)~P8GZdKH`$<%)^J{8!yYRB+(~6!;9dP z$S-l-yMM!zX(wju?+)@2k5uPd+J6Mk;S}&I*t~HWfA*I0m3U(CC%)iU`C#fK+oS&3 zmsE9z)1J(Dqh#_txa~_LX{U`hyY3@#TSx4EkHPJJ52gP65Y@Mz!?N`&n!JsNGL}!M z{2z?ldid1D^6zM;y$;YiiQIl(yDj-h&TA?C&>QcOQhDo#;dt&ea`(rp{l_G{U|RW| zfU|GFHXg0h^;?MJY;U2Sq(e{pbzD!>QqIQcig~7|{SVi@elGp0u2(0n%aeGH zn`U3!=atQMuTH^8)k( z8SS5dztc%R4`1TCcRxm^S3l>#ci`i3yS`_sv$BKge8q8Zk&hFH>c_!xH zVe#b0#pBcC@rCjD*RFei?;t(rWyjs%dx(=fzs}d@!`*lYo{DxJp-w1uY~OVr4-5D$ zJR;za@BxALq&%SOzJ9#M$sLZH179{lUK%ffH~3V(opBY0r=KEEzt4S_(M}r=WATvzkH*Ibd?h|L;9K$NfFHsa1w0mC5%Amix_~D-sP@MM zJcI8cPGPREomVJcD&QsY@&SJd4-0q$*W>v5fLDcAkqFY)(VeuZf2)Sym_nL2J!CZ^Z$;S1yy@d!L-nf$GkD%2G} z)Iq+B`h8sY#@oUM>YrrzNb+gAD!(0{jvxF?J~pvF@j2dLl6(T^`z5}pubf@IvjI=i zPyQG6_u#*6l6PWW`U%gmR(_c4@-zO*M7izfui#Ae*>skIyxwWT><(od8kMKRS z6Z%l&DwOtg!@~kT0FMax$F6(#U7Ee>Pa7xG@!fbV^%vq_>{Gro{l5awa8Uj{=ld;Q z{YQBs#?MZ?Ya-2HC8&Q0uXR}Y(bPGGA37$#Or4AP+7t2>sa5DE-re{u4YJAItr_h0{Mt22$leF;4AUj?D}g#W$VUh2Jcq~NQPinOoqQjv{k&T4G_X2>^KC}{L-K{G)0X^# zKt7WE=j65PaGd`5KKwcAjH1pW>e%?1O#VLkvgD)j5`)x!tMeswRs`y7ApaJ5tFsfI z5U6vQI_m;;&XM07sB;a!8>n-iIx&GdiBIS{=8aPOOLAW6@NnGDD;GWxf0=wqd<&i# zuZ17R8{n<*(7`&cU6&zvO?)Z&+4wDdHNGBSI7D^Yu>ahTcOEJqLjEK^Ww_k-bvNQnJGr{st6Z}9vVyC3?GOZe}pCfqWKhGi`OFIkW5qae=P^UWnLUFmR3yod( z#$jmJ@_swgbKiA#J+9}W_B<|gW!16gclJCk4_=A$vgdKlaeIDb&*R?3gU{po2l4}H z|CoT=^RHO}x93M+;uUC*J%723XTk0H%R@Z){H0J8oo`<9|LoiQsNZb<|7YJG@PGF0 z0sm*;9`Jwm?RW^swdYMycoc5?d8e=16Wq^-;-TbiKOYuw+s{Yfc3!rh?-+2~&qv|G z{d{OYwWkipwf%fYoZIxD{d^Q2+|Nh!SDnt(vHkph-0IkVJ{GS?-uCl32dIwaZ9iX! z>zj-GNXA<`yd^#b--g@!zHDE;_a%*!7UUO@FIZJRj{ET|e07+7HhJ5JhX&ed`|#JQ zDPNep?ZXQM^0p7}Pu})>whxcSZJ%lT@WRxw>u&q-1LST0Z2Ry;FRMLP$M)f+0(ER3 zUW&Zcv3+>^KpoqMmk-oAcU<${q(B|phkqBSWBc&1KpoqM|4BZ$4}Z4$)91B=>(v+^ zNB{qTpINE=BW}DWuK(Bkd2y@q!TIwR9-KdmZBsrte^$nW^Jo1)-saDi0k`?HTflAp z9E1nw&vkfk{ycyO=g<3iaQ=)4To;=^I|kh5&&Yt={MjeqHh)IpAzUw;Kcn#|+~&{F zftnwJ^Jf?yO5Wzrh=AMt8HL+@Wb^09fZO~TjR)t?un*Oq;QTofw|UH74~fQu^Jml` z)d|j@H*l+C^QRM~d~p7(j9cF3&urT@K7;dTSv)v@PQrup=Zqby6P!Qq;lcTH_%7vx z^JiF~oi=|K*sXkU{;Uzm+x%Idd~p8kf!n-i^Jg9E*mbx0b2fRK_iX+=5~ySIXLz8_ zhU1#|66{g?t&Yu~<#20{&7VyJb!`4@8>nOR=k!1wn?EB0b!`6JO+Gk({u!ua^Jo6= z)P9>kQ^o4M+Gf-hnUPF4SQ*#-^PbJ0 zF?bYi^Jmy#%^Sh_GXf7KZ}VqVz-|7F#_c|``EyagZT^hGgY##^5VfZc$F=?EBHZRN zn?Gal;QSf=k?I8J&(uTZR>$VgP&_z)wg}{H{;bIL4bGo$;x>QU>&&b0Y@CPaPq-XASl zn^&U(b!=WukWcLo&a0(xJ1?78TjDmaR*luXnx}y3oZxkjaQuEDc?t$@H#|Xc`FZBy z;rK6QqX26 z)d{W_#Yf7mj;$AAcyPTK5Xjqlv7hT3TraNTwqDq}Q0oVc!{EB`>W}i^y08Qft_u~8 zC?8xGq5|!-b>SF!ebxW13qu2WTNj>?53UOZeo_US_iSAlNuA_eFIyKHk+=EW)`by) zI<_v157e=BVO5}xtqa!zb!=Uj8mMFILe`^dzqQBKg$B5tm#quYfjYJ>^dlc!7ZwNV z*!KsI;+g3m`~KiHya8_CA1rrF?X>>4?+>=Xmy);d4<e)w&?H$D;Xcvf}R;LGsb=j2vr7d{AYmRw(O4L^Qa`JvQ#g6F*~;Is@ZdVwCXlyvuxG&S{Zzy7;QOg21@iX(s0FxYQOB`$ z^E4h@H?!Q*c?H+aqIhuKd;`x*f7-ek6SyC3-P{v!TQ?5{+}6$G0k?HC77yXLwr)D3 zbf!_by-%qZ?X-C~mwVm4_lIP@t@C}JysfiQ)CsP$(Re6%TW4beZtH9;o}9d`vsVIc z>#Q?c?GLWA(Rdx|*gAU!xAoE1S?6Qb39hrTcyOJqKSp`0W9w`L9$aT<2J*Jf)}lXy z>uej`<`a8f7K7XKGJF5e3EYlb!o6PJ_ucjcjvI!@;$iepy5qXOnSR&xwK@&Rhko+( z`L@Et@F?ooexLz$g8P9t?x=onKkzjk+z*8Pp}dVl`~F3A;Jj=GQIE!n!~m+b6t2-r8gPgu#J2woix&)UkcSm*j){gfoFU_WUvB zeYMk`KlbCgOv7#bkHXjBuhO5>@Wc;P=ODfe{}JzxZ^0YNLhX;oI<@c(KIFZ%eFC ze1uOf6pCo`~G_oJh+ax#e?hk2Y7HD z9~Q{ldOZcV^Rnl&3j+C7obPJ99_PCie}b37ZGA8Kj?P!J+5fHY9dKLU4^k%@FGC%B zKl5RHFmCT>e!Y$A>s4s?_sRdHanc_T?i0r2!F|HFxa|{8(Vo+|&HuKJ#{}l#tK|P6 zKQy5l`T+0SUhS+w`;%T&J2&Ak;aTy&acfTjJZA^hvGGtEe>31O;}h}D+!wb0i5ROZ zlAPn({-Z~*Y+*R$E$u~-1aS@cyQn1Oi(_!Z|QRiLe+4$)yxA)yG$Fug7ZzjJ3 z@AQG(`tvCMHQt*1W!Js+H-_^~&i!&9kDbKzW!$E?q`Wg3C!gJQZ(VQ(=(wGzUmEX( zhjIaG;G?3Hx8Gy=CiO!1ss`@8#>kE=zR)2;C^3UKA0Wavf*Z!4j zRi_;7sexbHEk8{C_V}ht^3k+&5MKN8(>@db0sn~nYW(#p%G>WtIgD4lCjXfH6@0*T zxsAg|c;jE?BNOQhGG5VnoxCMa$8{-=w@RoTY)0z8jQ0rm8+iM>s$=(Qdwls{@=?_3 zhnM|Z-ih(~F+S&sJT2pY8J;?^+LIpNiRVnhP8+xP2d+;quf=iCxcRvDC)cS{C9m>> z$fvog{@I8(!%N~>@+qH@<2J?%<(JPR{{g+G*Y<($tc<%oz42gs=Hb?!-EMvV=j(aja&p>vBA(;gKL6e- z9XAzu>;HtS_|xb?sN{9^;$_W5>Q-p1{^*uK3>AaB=eAa2*oUT0g42lwH>;kFOA z{>-~3?*1%`2m7-%ZvAQ3cL*N5zESg@zP`4vofCuI;O@x#Pi`ALe~4Z%2C`;K?@1yWlCWEB}7L^SB<@{8N~G z)4i&bojPUk_i)?qRmMNT^;M2j8{dFep-yA`9v+6bblrbH`Fvd$+sC#cUv8f&+qjCv zyW=*l22!U$pw0-qaKIE}Hx2mD zu6yGl#eVgV_5ZKmsMNSUPYlCDaeJN^5pa8+ z7=_z)x95o?18&a~qw(?7x1VDTTd4Nb!R>kCNZjrVd!87L+y38vjy39Y)#*%~&)g?g z-u-n0w>tJb(fLC8;Pb@FxaIA6;x?|Y?LR}}89%m8mCmg3lZy7(I#n6B`Otpuqc?8r zk^S8LNIWZb?C0+1;5J{``n4Vpu3x(Y_1p1!&T-uO-+nGWG>h8bkmK6V#dpVR;R z!h`qAcX;rAxr^KVV(V9yXLQ`)`W3--iQ>5S^Y10d_r&ez-{;|NaQpf9Bw1CzE?&sJ zj^2FoDn1a;epJ2>xBa<zuCM)v@E+_nUskXH&<1E`Crp<>%w}bMg7I%V*;DbMc$; zs(1z3*&?sj=Mc<7GXc=&?$?5U{w`ID%jG4Zs=?z`>Pln>r_2XVXa?Dt)y zcv<O6$F2YEeoS3M#|_?(&LYj9QMBLg$7jjgePQ?AG~DhxyT8uk!TW1y zO&!)qQ;(?~P~0hqh3@DB~>*|FZSd z-UUD2Ufz*978Szb3cy8sobEd~h-ID(5xX_smYzqqqD6rq^Meg|5dnKP;tA^b*yvee8PI zy?su)RyuA$>g>i}#BF{!iAUl#KU~BI%+#4=&jfafC zd;OE%S#`>;EDen(AL{14>oTHO9zWQccqzPAr2HXX0bl-!{32cx&ofTG(e|tO#;Nk> z$iIXC*iF71?}8u5s}r^TzyLgNW##vBzl_F9H&A{&b!Ortsbl-4<@mzB%GV~p9{<}> z{bSVMj-MSMuY(`OdwwdfMx9^q7b~m&%jAE<3v*%Z?^Hg*KdGzyBkCl-qw6v(gX({V zXU4}BRemjA5Z^jj`3`tFe9kM%+uz%&h1cFCf0KL@{H1d8P}<)Hzf?$W`?qfR#~yDGoNzeUD+&M*l zYkD1b2cNirkI(ypFX`|b_;1gu{&oBj{&`x}vH3j3U0ts~Uy$41nazs7n@PToI(c1B z;JCA3`WA@(DM!AZAbr69naiFZr8UFUL~*U&mi9#&&fEq`Kmkqc6rsY`?oKi zCRBC4r_M)sSYNrl-ZCD)_LAysBfk)j{Yi&jyr$ox`d2YecS(}!Rr*4AEACWd{=$dc^5B=PaLcKC-{qa zB;zM7UKxL@w(8h^pdMb8`~6k&&G7bRRNwwSQ3w3v=T#>k3;adKVHC%;b-5?`+kKR` zeQcEL-uGWZ|6+lnf5wncP2R@Cbo>hIg1zr ze-wY1N^bLiEdIj))v>?N_&eTjhUodCBvT+iI7h-%iAm0E#&3)7wZ;IdGetZ#ci{CGx^Kw7*AMd&Uv=js97MKRBQ|JE^k`AJkp>vG@;o zwS3C2#DB&M3|0Pl>fglQn=Vg@Kf)WPlaHoOihH__YigeHp*mNnRDNkH24CbsiN_p=S8eg@hz2G841ZqIY4;Jez$OK{u;uKV}<1KsaU@s;HJ(;l0jci^X4$F(bV zoS*QXp{k#m_FVAmr*)zlmGdjx{Bzg$%ud*!I&OLL3GVAUMzP~4O2J_X;!__TRrJ|5Xs^_P%ej^E|_4#PL#rzR@@JiZ%$ znQ=7`{{e3@O!;r{Q+TBj@?Y?)cyq>^t?z%~C%8|qkWchL*LU-Ks-yopP6pQ#I9Z(W zJf9`*WG6qeu=>sFm&8ZcliTkVtb!l@PClA(RTnSE{4j_EGsYUm4o((a=+ut(Lw#99d%nXjS5kf*`4jkHe$Ut|$@Gao z@RK*6^fkh^D&YlyM%D?_VOsPqs{< zFUa_}`gzyxygt<63yR?NtL68-byDRk;Xi+*@uuEzoVxg#QF4u5$9WxZ|FL|B$~f)t zJTujAk@)-g7RE^qdpMRg;mstAq2|ntm`fW4$43E@r^S@Ueo4512p27Y7`BBAM`pGczMal1-tuw7c zd+Oj7QfS_=zX#e7?>I{5TZlSu;G;j$dD-*yHhB5mS^eY!>i5E@A5;I>JTL-pP#~9| z|B(D7eDE~gNA~+L=ixc|eq}Yz|a5)z7Ox()?h54M%V*(>@J-+A{(2AJgkO5B z1|Gog<1by%c-VsP&zitpAOH7}_=)bj$iRJ+-F0t0efWN;|3$U=(&Bjcw9opo0)GL2 zyf}w19r2fa=YxO!(=;CMLY<#tb-ttM=l*!!2)$xsf8XjO*Zun_@b@?-lHa;X_o?mz z$C-zx8!P#mHm&geUk&7ccTzunVEi1R&Z*s5{NyU~H}F5(=knz-?e}&?UVnBPqU#cc z=fek_*8thh2BH*x;vLN=rK$f4{weGANxYTSxuE{n)p4Aj_=Ekr-`^lV0{?Kk){*S& zE0(zK^=FM`x?dRn&RX(ir)yra*KPLUMYgLSK4d;Thp%d+ekjXvf5q!>(RppL10+!Y z%qpns(h*OK?>enJw-xJhA^d7XooQa`m++kr{`F5d`Pe*peAQKOoVW3pUXa-HyUzIO z%PIZ*Eou$KH^k_^-iS}YQ%_KxW?bK;_|{_DKfFNuH{(-gspaml@gL<6$9Y55-?juKB#WhNDv!uf0^) zaT9f_X)WJXW>2G(>R<& z{WbVsWp!Qb_4YmZsA9_7agXD@PbuGmI@j@#$+}-EaNNiE)G=!3H{>(A-_Y^;dF_kp z&#QPb+~IkLjsHrnd;1(`xQ-Y~z7F|N)_r?E_!d6AneMo$-qz{5+w5{j;4qiOT4FTl2Yn_}}%oAL*Z1{B~R2zv1L>yY8KD>cBet z(9i$tfc$TU#A;`$z+lNvyi9fcJA5majWB{zL3`=-`ICP_}4#e zmK>9M(X-bB%i>2Lgd|d**?{LXzNsF{3CvDt7uZ4KyiFcJ=J-GI+gI~KXqRA z{oH!^+o#I-1*YUxoeua{?L&Qdh3Dym@Xir}eq7&Kc%kju?>)nDzrbIar+LiQ@iln1 zamx47VVxg*=YxO!bJ2CL-y#El7x-E{`Nz~>HBS9sgIXEgUo_$MXGkHfv$lQ}!T%bm z@n-w{3V2gqj|xeoLJjbq@2LJj`k@t`pZ=`Gar@$bcGCSd8K303cV1zE@vzwU5GQP& zW*)lJS%t4_EKf|GZPfpxM{!?le|Qvc^{eKS2-F7xmP59>Dpgb02gUh93$dnNEmc;>)9{0qGGL|u1XW%uX5@EdQaPCn}F#`C4txV3%S4ZKOJ+w>FIK#zFLr%H$oD_1D|?=N9lXd7s&j_x z(hRTorriFXNPGO$oWg#EQhM6#oOOS3N?gxF$B|FQ`;+H#-1+#dp(>D%hOWh@B+z{R zBl!dP(ke-ODapKa9?$nc^R2y(dJ`XWKc}CsPCJvOQorq-s`0j*^UaJmE~)cvNqchP zhga%4)}}or@L`A4o-G>gPF1|gT8;Be`n1ysKUYa3q#AWP5bprEMU+TO;xC~6R&nk<82Ur%ysX)>a#AWw;ksO`GwDE{LJ9E3DRg>RV%0KwSzkO z@J&0_&JXdI@EH-Bm(nm!Ucu*F*NkzT`mONBSJlqpjL%;9qh0dfnLo$jVVgBCt*6dx zd~M)$*CqHq=2eYe$61Y^9i|!SYp(lld|Pd;JNEs=>v+3ia(jOF1W$WdGwM|O;TiV_ zy1jX<#6>0{0 zpiY0hWZ-%3Xgql_wdWxHISW6_&-WFh&T>3vj_#Lc_;x(Hto#su0)N2oyGumV)B^UeW6ewq7*C!}+^Hw!XCWoyPs^pFZT5?@|w! zqy8s&_flGaM_d2kGbd`EsYI>Sc#XiixdXpBwzQwrSGn&a!q4~1?0ahF|Lb_a^Z9&l zLj8w$@^`gwv3){%_ZJ0t{j>O5sGqd=Gvvj~JgXx%rA`TaZXb=G2aL~Zc;Z>QaU=29 z@ukx=uF6wqUq>CcR&~{XnS2EKG2t2yRmu0jXV%c2SPmbCA4s76zyN#-zVD>=+t&Ui z_~Sp+evMwoIr_8Lp8tKUC*QG`&Z|H7`}g>eUZMUMP3KF0#^?0bco@TZ-M|l3dDc&k zBYzL?&+A3n-8oJw_Z#uvb!opu{m_wocKl$NTHYToinpAm{CK z6Se2O;?6<*^L47fmG)o3_m#=-C#y03|90J*ANB|4fi&(n_`LqS)I>An3F_y;BhKo2 zeTNsr2Qq&0;xFUZ8|c2X_uDkXw;s|scb{hZj}G_;tyTXCb%x;k(<;9gkH%l>oW_@3 z)LDby=XL2CWgRkQWt!* z4(oi3&*0|-^(vX;%rWn-{rQi&4V<<3q}ply3Najauj}6Ph0J`vGBNd!lOMHO>waDO z;fC*o{{4@;0r2{5+5D8g{>dGONs&4C&}=9Tb?Q97YiG_(#r z`=auNsB`_QcV7SdXhgm}fA_E-k@mj-Z@$0l-u<;PaDR=XPW=%Y52g6hXgv8ejps@D zxA^a`shxJccHv+1cRXL>em{f%kYD-z_;q|b&nt^i|1qBNzRp@-)<9G##x2e;rHjXqy9G6z47d9Y3YmZV#nD}{@`AX zpP`KBi+KL`)J~h$l{A*A2Fl-+Ni(LDd}RINm0&`oVo!%zs?Q7u3~4r(K-m-1Y0b@7oEyKAhbD{&i|6 zOF8v}wLb)ZBT+uTZZfV{QT*mu9rsCM9k&)f@ok;gBeB!OcRu*nKOea6oo{&H`Q{kv zbUmPvY4>k5J|>X{U~g)Di@%>Cy)T{gG~U_k`@asz|DGXVKC$XN=DdE#zo???-iiKv zjA!Tfgxmd|DMaHi^$cAX+ea0`AG1Gsj&W5DfAxU&8+FxO=PkTsIjvmo%L4wRJ03e- z`^>AfzaM`32aWT&YvG@bfPxTmp5?Ck=PtEgc3mUzU&Y=3 zZAZT8YW2@aKHURP_>Io1I39(cNpX2^}MQclH+#4YfsVjZO(D~;t9{` z!rmqSiR<3@O#Ytk6dRwPkzXFF`RXWjek7kGus=LbKE+v$lakzD*YFqlIq~Y$N#ZUj zUcVKetNVHoo&_(HSmVTg&MqH*c8lgWTQ5rCJKO5|vORRF;Pc;7J~#8p>-e`#)xotn z?)!Ky_7$t}!LEn$|Ns7HJoy3})nkMC5T z-GjH|^?`DHX)K^?~{5GDdpL$>;$4#Fz?&Ie7J+<@YSwB3xlkv$(bU(g>e}iYrp*n9S)+cu2!(u~y zu=mMa#J}c!Sq-Rj$9F#X*FQEP@7Jepwk>3Z)wB+2w`-YVAE39?bWABkOxB4@|am_Os zXlGG8^iR!`_CDw8_^IiduU0Zn8sXQtFI3I_J2Lp1UK%Ib-8s$&_{Ey){|M@gz#l$V zf7*OF9^bV|{U1#}+IRm{p8C&9*S+f)%5~)OI(y^EU-a`K&eXv3qrd!oYA5n5?JFwl zGB~N+Kk)61!-y|+U)1I3S$%)1DgFng$zQsr`{ESsuj#tq&cHtZRr0x;>vfMklms(186@CNHqGknQ28VKvTjuY^hRT`i5ZG7S-!nN+qe)5^WRjRUP<+dvv^dLdcb{ISdY9quXi{vZeJ&Z>)!bMI9m1X_b?arov;1Z zKQ+lGeJ9k{W?aZtR;NjR-!J0b@VDzG^S!(OU&k4WzZv+x@GN|LHm$S!$S=Xa?5BCA zA-)+uxJ2h`>+D|Fz5AtU;Q7u;^2L&>oo(reYj~OmsJ@Z{T|U zmNH!9Q~z~;f*Y^;S{lEFS7_(6c)wKId9J|A;WK#sWHMd{KgE2$o9p-nUhZ?+u;2Tfe4PxeC z?|W9`>IU8&&pA%d+{3wl2jD4sYaXu6F-G7Oc%P?MCC8cJ`@b5(|E?t8)!QR6quJDlK+2non@F5N7sfMw_V&rV0Uo{?!K^SaCdii zcXx;2?!jGxy9bBh79>b;h{4xg&t2a&nY_#on!V@gQ&p!$%ub8p^ueHevSrL zwshxl_?x?0KNMx0W`p-jrgi2t;=B?(B!nnCPW2ftO_1AEU+G}{Avyl73Yz+>hk3L)Nvh&3Sc)D_m+auKfEj(6g<>v(Sd$!c_ z+mmk;heh?ZQv{wTR3p6w1y_Ox>{dMs!W+2U%Rj08=HIU9Pe#jRlvB`;gJ0O8{7@6W z%{O)uJNvm#=^T6+`YiL52kd#XokpL;Y2=spPNRQ4O68`b+zaruS{0fAOohUAOOphg4Gk&Y=D$-~$`V z|L$Rk`CN0k7w3b>tHJ1>pnveURv)ZbyN8$w~*od;j^iNe*I*%D+Av(gvSq3iMHIH@D~*{j)tJ003VZG`E3?_7JPMW z`6nFy*#LjtOME^01Mn_m6c4JE z7_E6Q5A#C!4AO@^Qay*$t{CtIKdN1|;Yr~)iprmdX;)^$5&3Mw(Dywp`*wX;6P~=j z`nNsxX$epGgUYqX%iZAh;$=40^HIhi_y*RE_Bw&d@R#FMZZ7l-;RPS4{)%?T*#bX~ zAI72I1Ak6D+vBOT@XPs>x9xd`TkuarTkor z{@rHv!Ke-BhEqJ%)%5Qt%t>N!dXeC(!J_z2vg6h8&Kl}ji z#B(GXpmRkNJa#I?RJ%@()ft8%5%tA;^iu+rmu{i| z4F4xc{wxU($Raz1Soa3OGZ@YvKAR%w^W>!d^hs%f=A3Me|`z4a(igwB!izzr*d~;KN~zH$1l0D6AJ&8 z`>e;nE5fHQQoId@*E5_yd^VlXH>s!jH-ztoz+ZhYe-@=5$64M*dA>LL`S5s$lqWBd zuhzNT_@}M>qfzFr8_{10RXtB&=Lo#rF4@tyj&ly4`DtXMRCKxPZTNxCTJPEVKY=ff zCq6;DIT5nS|G)5iL^aAy0H471)yle#lLr2Jzt;IbGVkPq_vN}udC75#!Al=jzjvn} z>%cFzQ+-}WRKcy_Z@XySV%M2{4X1KGn+Y!W{8^m&0yEA+>;!P%^f~s~0I#r4f%YB! zco-h{xytE`g4c#8Y?#TA@$~Ny_@r90{{j6>mwWjnl=Bor*)^8L|OChrmyC zk7T$#pH>K7fa5jwg8O`3V?VKz$}b+8pie$VeydEmJ>kc4D8g^UN5I##7q{m{XTc9= z5Q;^wd3H&>FjKhlm$a1TbA3lNmXNQ=*+~)|v|KT|v%ZZa3@VsHN(+vBq z3}*LnDq}&T!*LeE*Tz=nUxxkd#(rYw3HKo?yE@KE z^c!X<{%!tw1dlvVepZw^&S&`T>zR$^x3o8YZuut~^MXBQ$pBxNSmQ!j$Z>MPclOh9 zR)6aGJv=_YtCoY;fUobT_J-17E#ZHzmOopd@8NRKpRxUZR~?LgT5Pp<8;%$c|0cTZ z+y0#izn4<|J`nqB;CD_a@NK((g701^{bA~P#N}Rng3|pvznw)tznuat9dUaH{+i!0 zZT$ZZ&v`)h!-K9`qy{`v3cH}q*bD{q`dAKm<39N^^ttb9H)n)VHb zf7?Rs8iC0?@M@D4Xb0hyT<*ogAiwe63jG?M1F#zX0C>)d@>m1vGsSR3KASb@>-o*s z2jEMn=MeU}0N;2az9DY&&F2>Ub8D@0@}YkM|2d}oX?cWvinqeOf{b!I`nd2v*Qg&y z!b9MfC#wf-JY}5{a?$xa}U0!l=4Y0_$!xt{l4EX5Bvj4Cm2 zy!-?8h`sN!zu|~{Hq+6k+@+bK9}QRnkG@KFic`Gv!`kNX28w~_^73Vm^=HCAe=rHTC%bKTuf~ z)SK?}BH)YuR{YFDAG5IhmaD(`YwV|l7Y);K)3@|j9(b|h>c`92DFTnbT)Z^Ag5mt( zv+02T_7Ley@ZBhQ{soHXA=GCod{=X=>mEkd4h!LlduhFD=ZkGF_trnx{LUMnL4T&c z+VvVczrwS3(>k^r_4ylqa5Ik-X`R%VXninop&$RHG-zuM^#cvhh!}uLJBX;V- ze=jXR%!Idw*W&sOmF_-g65ga{ETgpdQ_q0c?4xlspZctUpPi)qZ;#`CGMvJEHfPZ{ z+o1SVDUNdse(jp#-;Sf-;Qb0IerjXuZ}>!>QyPQ%#CH!gym{o8A)0@aF@7_^)8El} zxr?3L@M|O0zrE3yfLETXdKN<82EIQ7^AY6^b-9<%kNZ6jZH&>gv(IK8cCNKhdu<-r z0H0e|d9N7z9E5+v{WaC$*WpLc$&Ss3AK*<(t6gE}qZXBazU4abUhrV};J7+o7(=@< z!Aq1!!ZSq=}s27i56ezx^|0&mXsu8KOxi4-P31aO^I zKI)VRelwix4~6H3H;gZj6{p%1^j$gohh>Y8{Tb*mzPqX(s-Fked55Y za(~khN>2$d*-7+*hgp??M0Fb*&KWy85)sy*$}#ZG9u8I?he>W4JFYJ|>^S zg9@s>yWt<;zt>m%JcUPfFI4mVJZ7l$1>sp;?#@0=v4AT5!^Tu{~$Jw$!5B)Kh zo8u`ze_lpki}PTk(LaYzY^ZtAUACFeAMhuB*KbEJDS!3})l3~x!_P?x?{Z9e`yhEQ zGyLH(#oJwY5qLA6|Jj22RD!QNt_aV8zNO)ad^Ww&2k<Ni1OY=plYq)3~E{-ojj;j_7gzG)1N-#2{syUV?}TFCXZxYLPHN`AW=PJXM3J|?{T z&R|0tkq1)3FC2(wczyIaT<+Pg=NGr7&_`UU2_Y^8w}9W~cO{Kh$LRxaUPt{^pLOYY zc$~i!53%t74=(rO%JI8yb_M$2g6iM8lzR|x##E3e&;i* zp`ZIO&{)2Oe>%V`rPq8Nk#*xxc(FLL9~b>(c&+Se*J|py5FTZg^3PKEkMN!kLpRXZ$%#$ zK9zM&9_(j??-{NBDh4lNIDhzTs-b^cL*@47yO!`gNi}1BVuBnD-+nKSQI^nh!I=!N z)n`)@Za5;J%|!I!d9XoA z{I(1}rIPwRJqzyLF8Ahzg ztd4%p1NBrt?6iaDFQ2u#$9*#K9_srD3#y+%cs%T?yCA!K!3|{{_xqnMPG;e1xoN;v`X@G?xLv-X+V1u zz|Zjjdao%P+yY7MS;k^b^;FsW&7AhW2VCOmf&rpp!dp_+8{1x{} zbtj)Ea3^RlKWyzKeL?J}gGas6%Z|+hP2ijTo+r~CUYh#> zb6{sE{FmPq&o`Kt=fW#+AMyT3+F?2T$Zy{n&<#63!L!bmf9!ZX;qo9fzMBW=v%gY5 zUZ&hP@RG6AUz6D>g8Rdb=eO7;6oF@qgIwcZW3S`}sW=E-!r04P~U^QB*)# z_&(luW6#Idga6ERjCNcPfG>NY`DiNj9P4r~pTzh39ef7*#f|02(bRt(ygBzdmch{8;1Kdi2r^x z_TBrP{hrSsrJDTqI=&pdlm0CLzsz&k>~qGd!AEUXe+8m%0AKfw{5FAdI~e}o`V2)s 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 literal 0 HcmV?d00001 diff --git a/docker/data/java/放置fastbee-admin.jar包.txt b/docker/data/java/放置fastbee-admin.jar包.txt new file mode 100644 index 00000000..551af7e4 --- /dev/null +++ b/docker/data/java/放置fastbee-admin.jar包.txt @@ -0,0 +1 @@ +springboot打包后的文件 diff --git a/docker/data/mysql/initdb/fastbee2.0.sql b/docker/data/mysql/initdb/fastbee2.0.sql new file mode 100644 index 00000000..0c21e817 --- /dev/null +++ b/docker/data/mysql/initdb/fastbee2.0.sql @@ -0,0 +1,2607 @@ +/* + Navicat Premium Data Transfer + + Source Server : 81.71.97.58 + Source Server Type : MySQL + Source Server Version : 50743 + Source Host : 81.71.97.58:3306 + Source Schema : fastbee + + Target Server Type : MySQL + Target Server Version : 50743 + File Encoding : 65001 + + Date: 26/09/2023 22:22:29 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `table_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子表关联的外键名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '其它生成选项', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table +-- ---------------------------- + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `column_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', + `sort` int(11) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table_column +-- ---------------------------- + + +-- ---------------------------- +-- Table structure for iot_category +-- ---------------------------- +DROP TABLE IF EXISTS `iot_category`; +CREATE TABLE `iot_category` ( + `category_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '产品分类ID', + `category_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品分类名称', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '租户名称', + `is_sys` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否系统通用(0-否,1-是)', + `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父级ID', + `order_num` int(4) NULL DEFAULT NULL COMMENT '显示顺序', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`category_id`) USING BTREE, + INDEX `iot_category_index_tenant_id`(`tenant_id`) USING BTREE, + INDEX `iot_category_index_parent_id`(`parent_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '产品分类' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_category +-- ---------------------------- +INSERT INTO `iot_category` VALUES (1, '电工照明', 1, 'admin', 1, 0, 1, '0', '', '2022-03-01 11:44:37', '', '2023-04-10 01:12:48', '例如:通断器、开关、插座、窗帘、灯'); +INSERT INTO `iot_category` VALUES (2, '家居安防', 1, 'admin', 1, 0, 2, '0', '', '2021-12-18 14:46:52', '', '2021-12-18 14:49:48', '例如:智能门锁、摄像头、智能窗帘'); +INSERT INTO `iot_category` VALUES (3, '环境电器', 1, 'admin', 1, 0, 3, '0', '', '2021-12-18 14:50:24', '', '2023-04-10 01:12:53', '例如:加湿器、风扇、扫地机器人'); +INSERT INTO `iot_category` VALUES (4, '大家电', 1, 'admin', 1, 0, 4, '0', '', '2021-12-18 14:50:58', '', '2021-12-18 14:52:30', '例如:冰箱、热水器、电视'); +INSERT INTO `iot_category` VALUES (5, '厨房电器', 1, 'admin', 1, 0, 5, '0', '', '2021-12-18 14:51:42', '', '2021-12-18 14:52:35', '例如:油烟机、烤箱、电饭煲'); +INSERT INTO `iot_category` VALUES (6, '个护健康', 1, 'admin', 1, 0, 6, '0', '', '2021-12-18 14:52:15', '', '2021-12-18 14:52:40', '例如:洗衣机、按摩椅'); +INSERT INTO `iot_category` VALUES (7, '其他', 1, 'admin', 1, 0, 7, '0', '', '2021-12-18 14:52:54', '', '2021-12-20 15:04:33', '其他'); + +-- ---------------------------- +-- Table structure for iot_device +-- ---------------------------- +DROP TABLE IF EXISTS `iot_device`; +CREATE TABLE `iot_device` ( + `device_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '设备ID', + `device_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '设备名称', + `product_id` bigint(20) NOT NULL COMMENT '产品ID', + `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称', + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `user_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '租户名称', + `serial_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '设备编号', + `gw_dev_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '子设备网关编号', + `firmware_version` float(11, 2) NOT NULL COMMENT '固件版本', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '设备状态(1-未激活,2-禁用,3-在线,4-离线)', + `rssi` tinyint(11) NULL DEFAULT NULL COMMENT '信号强度(\r\n信号极好4格[-55— 0],\r\n信号好3格[-70— -55],\r\n信号一般2格[-85— -70],\r\n信号差1格[-100— -85])', + `is_shadow` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用设备影子(0=禁用,1=启用)', + `location_way` tinyint(1) NULL DEFAULT NULL COMMENT '定位方式(1=ip自动定位,2=设备定位,3=自定义)', + `things_model_value` json NULL COMMENT '物模型值', + `network_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设备所在地址', + `network_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设备入网IP', + `longitude` double(11, 6) NULL DEFAULT NULL COMMENT '设备经度', + `latitude` double(11, 6) NULL DEFAULT NULL COMMENT '设备纬度', + `active_time` datetime(0) NULL DEFAULT NULL COMMENT '激活时间', + `summary` json NULL COMMENT '设备摘要,格式[{\"name\":\"device\"},{\"chip\":\"esp8266\"}]', + `img_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片地址', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `is_simulate` tinyint(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否是模拟设备', + `slave_id` int(10) NULL DEFAULT NULL COMMENT '从机id', + PRIMARY KEY (`device_id`) USING BTREE, + UNIQUE INDEX `iot_device_index_serial_number`(`serial_number`) USING BTREE, + INDEX `iot_device_index_product_id`(`product_id`) USING BTREE, + INDEX `iot_device_index_tanant_id`(`tenant_id`) USING BTREE, + INDEX `iot_device_index_user_id`(`user_id`) USING BTREE, + INDEX `iot_device_index_create_time`(`create_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 141 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '设备' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_device +-- ---------------------------- +INSERT INTO `iot_device` VALUES (108, '★温湿度开关', 41, '★智能开关产品', 1, 'admin', 1, 'admin', 'D1ELV3A5TOJS', NULL, 1.00, 4, -51, 1, 1, '[{\"id\": \"irc\", \"name\": \"射频遥控\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"switch\", \"name\": \"设备开关\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"report_monitor\", \"name\": \"上报数据\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"humidity\", \"name\": \"空气湿度\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"co2\", \"name\": \"二氧化碳\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"light_color\", \"name\": \"灯光色值\", \"value\": \" , , , \", \"shadow\": \" , , , \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"gear\", \"name\": \"运行档位\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"reset\", \"name\": \"设备重启\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"status\", \"name\": \"上报状态\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"temperature\", \"name\": \"空气温度\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"message\", \"name\": \"屏显消息\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"brightness\", \"name\": \"室内亮度\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}]', ' 本机地址', '127.0.0.1', 113.128512, 23.027759, '2023-02-26 00:00:00', '{\"chip\": \"esp8266\", \"name\": \"wumei-smart\", \"author\": \"kerwincui\", \"create\": \"2022-06-06\", \"version\": 1.6}', NULL, '0', '', '2025-02-25 23:15:56', '', '2023-09-22 15:08:07', NULL, NULL, NULL); +INSERT INTO `iot_device` VALUES (109, '★网关设备', 55, '★网关产品', 1, 'admin', 1, 'admin', 'D1PGLPG58KZ2', NULL, 1.00, 4, -73, 1, 3, '[{\"id\": \"category_gear\", \"name\": \"运行档位\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"switch\", \"name\": \"设备开关\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"category_switch\", \"name\": \"设备开关\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"category_light\", \"ts\": \"2023-09-25 17:56:08.848\", \"name\": \"光照\", \"value\": \"68\", \"shadow\": \"68\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_report_monitor\", \"name\": \"上报监测数据\", \"value\": \" , , , , , , \", \"shadow\": \" , , , , , , \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"light_color\", \"name\": \"灯光色值\", \"value\": \" , , , \", \"shadow\": \" , , , \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"gear\", \"name\": \"运行档位\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"message\", \"name\": \"屏显消息\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"temperature\", \"ts\": \"2023-09-25 17:56:08.582\", \"name\": \"空气温度\", \"value\": \"23.69\", \"shadow\": \"23.69\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_irc\", \"name\": \"射频遥控\", \"value\": \" , , , , , , \", \"shadow\": \" , , , , , , \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"brightness\", \"ts\": \"2023-09-25 17:56:08.671\", \"name\": \"室内亮度\", \"value\": \"5387\", \"shadow\": \"5387\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"report_monitor\", \"name\": \"上报监测数据\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_switch\", \"ts\": \"2023-09-25 17:56:26.188\", \"name\": \"设备开关\", \"value\": \"1,1,1, ,1,1, \", \"shadow\": \"1,1,1, ,1,1, \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"category_temperature\", \"ts\": \"2023-09-25 17:56:09.203\", \"name\": \"空气温度-只读\", \"value\": \"95\", \"shadow\": \"95\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_co2\", \"ts\": \"2023-09-25 17:56:11.229\", \"name\": \"二氧化碳\", \"value\": \"3780,2612,2145,3988,5697, , \", \"shadow\": \"3780,2612,2145,3988,5697, , \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_gear\", \"ts\": \"2023-09-25 17:56:28.066\", \"name\": \"运行档位\", \"value\": \"0,0,0, ,0,0, \", \"shadow\": \"0,0,0, ,0,0, \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"category_humidity\", \"ts\": \"2023-09-25 17:56:09.025\", \"name\": \"空气湿度\", \"value\": \"90\", \"shadow\": \"90\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"category_report_monitor\", \"name\": \"上报监测数据\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"category_irc\", \"name\": \"射频遥控\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"reset\", \"name\": \"设备重启\", \"value\": \"\", \"shadow\": \"\", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_temperature\", \"ts\": \"2023-09-25 17:56:11.45\", \"name\": \"空气温度-只读\", \"value\": \"86,39,4,80,52, , \", \"shadow\": \"86,39,4,80,52, , \", \"isChart\": 0, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}]', '云南省曲靖市 移通', '183.225.206.92', 104.802435, 26.496407, '2023-02-26 00:00:00', '{\"chip\": \"esp8266\", \"name\": \"wumei-smart\", \"author\": \"kerwincui\", \"create\": \"2022-06-06\", \"version\": 1.6}', NULL, '0', '', '2025-02-25 23:17:31', '', '2023-09-25 23:14:52', NULL, NULL, NULL); +INSERT INTO `iot_device` VALUES (140, '¥视频监控', 88, '¥视频监控产品', 1, 'admin', 1, 'admin', '11010200001320000001', NULL, 1.00, 4, 0, 0, 1, NULL, '广东省 移通', '120.231.214.134', NULL, NULL, '2023-04-11 21:14:16', '{\"port\": 5060, \"firmware\": \"V5.7.4\", \"transport\": \"UDP\", \"streammode\": \"UDP\", \"hostaddress\": \"192.168.2.119:5060\", \"manufacturer\": \"Hikvision\"}', NULL, '0', '', '2023-04-11 21:12:35', '', '2023-04-11 22:11:01', NULL, 0, NULL); + +-- ---------------------------- +-- Table structure for iot_device_group +-- ---------------------------- +DROP TABLE IF EXISTS `iot_device_group`; +CREATE TABLE `iot_device_group` ( + `device_id` bigint(20) NOT NULL COMMENT '设备ID', + `group_id` bigint(20) NOT NULL COMMENT '分组ID', + PRIMARY KEY (`device_id`, `group_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '设备分组' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_device_group +-- ---------------------------- + +-- ---------------------------- +-- Table structure for iot_device_job +-- ---------------------------- +DROP TABLE IF EXISTS `iot_device_job`; +CREATE TABLE `iot_device_job` ( + `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注信息', + `device_id` bigint(20) NULL DEFAULT NULL COMMENT '设备ID', + `serial_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备编号', + `device_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设备名称', + `is_advance` tinyint(1) NULL DEFAULT NULL COMMENT '是否详细corn表达式(1=是,0=否)', + `actions` json NULL COMMENT '执行的动作集合', + `job_type` tinyint(1) NULL DEFAULT NULL COMMENT '任务类型(1=设备定时,2=设备告警,3=场景联动)', + `product_id` bigint(20) NULL DEFAULT NULL COMMENT '产品ID', + `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品名称', + `scene_id` bigint(20) NULL DEFAULT NULL COMMENT '场景联动ID', + `alert_id` bigint(20) NULL DEFAULT NULL COMMENT '告警ID', + `alert_trigger` json NULL COMMENT '定时告警触发器', + PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE, + INDEX `iot_device_job_index_device_id`(`device_id`) USING BTREE, + INDEX `iot_device_job_index_product_id`(`product_id`) USING BTREE, + INDEX `iot_device_job_index_scene_id`(`scene_id`) USING BTREE, + INDEX `iot_device_job_index_alert_id`(`alert_id`) USING BTREE, + INDEX `iot_device_job_index_serial_number`(`serial_number`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '设备定时' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_device_job +-- ---------------------------- +INSERT INTO `iot_device_job` VALUES (4, 'P', 'DEFAULT', '0 08 11 ? * 1,2,3,4,5,6,7', '2', '1', '0', 'admin', '2023-04-15 11:08:37', '', NULL, '', 108, 'D1ELV3A5TOJS', '★温湿度开关', 0, '[{\"id\": \"gear\", \"name\": \"运行档位\", \"type\": 2, \"value\": \"2\", \"deviceId\": 108, \"deviceName\": \"★温湿度开关\"}]', 1, 41, '★智能开关产品', NULL, NULL, NULL); +INSERT INTO `iot_device_job` VALUES (5, '告警定时触发', 'DEFAULT', '0 13 11 ? * 1,2,3,4,5,6,7', '2', '1', '0', '', '2023-04-15 11:14:06', '', NULL, '', NULL, NULL, '告警定时触发', 0, '[{\"id\": \"gear\", \"name\": \"运行档位\", \"type\": 2, \"value\": \"1\", \"productId\": 96, \"productName\": \"★网关产品\"}]', 2, 96, '★网关产品', NULL, 50, '{\"id\": \"temperature\", \"name\": \"空气温度\", \"type\": 1, \"jobId\": 0, \"value\": \"1\", \"params\": {}, \"source\": 2, \"status\": 1, \"alertId\": 50, \"operator\": \"=\", \"isAdvance\": 0, \"productId\": 96, \"productName\": \"★网关产品\", \"cronExpression\": \"0 13 11 ? * 1,2,3,4,5,6,7\"}'); + +-- ---------------------------- +-- Table structure for iot_device_log +-- ---------------------------- +DROP TABLE IF EXISTS `iot_device_log`; +CREATE TABLE `iot_device_log` ( + `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '设备监测信息ID', + `identity` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标识符', + `model_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '物模型名称', + `log_type` tinyint(1) NOT NULL COMMENT '类型(1=属性上报,2=调用功能,3=事件上报,4=设备升级,5=设备上线,6=设备离线)', + `log_value` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '日志值', + `device_id` bigint(20) NULL DEFAULT NULL COMMENT '设备ID', + `device_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备名称', + `serial_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备编号', + `is_monitor` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT 0 COMMENT '是否监测数据(1=是,0=否)', + `mode` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT 0 COMMENT '模式(1=影子模式,2=在线模式,3=其他)', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID', + `user_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户昵称', + `tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '租户名称', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `remark` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`log_id`) USING BTREE, + INDEX `iot_device_log_index_serial_number`(`serial_number`) USING BTREE, + INDEX `iot_device_log_index_tenant_id`(`tenant_id`) USING BTREE, + INDEX `iot_device_log_index_user_id`(`user_id`) USING BTREE, + INDEX `iot_device_log_index_device_id`(`device_id`) USING BTREE, + INDEX `index_serialNumber_createTime`(`serial_number`, `create_time`) USING BTREE, + INDEX `index_isMonitor_serialNumber_createTime`(`serial_number`, `is_monitor`, `create_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '设备日志' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_device_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for iot_device_template +-- ---------------------------- +DROP TABLE IF EXISTS `iot_device_template`; +CREATE TABLE `iot_device_template` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id', + `product_id` bigint(20) NULL DEFAULT NULL COMMENT '产品id', + `template_id` bigint(20) NULL DEFAULT NULL COMMENT '采集点模板id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 40 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '设备采集点模板关联对象' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_device_template +-- ---------------------------- +INSERT INTO `iot_device_template` VALUES (2, 112, 1); +INSERT INTO `iot_device_template` VALUES (3, 118, 4); +INSERT INTO `iot_device_template` VALUES (4, 120, 6); +INSERT INTO `iot_device_template` VALUES (5, 121, 1); +INSERT INTO `iot_device_template` VALUES (7, 123, 11); +INSERT INTO `iot_device_template` VALUES (33, 119, 2); +INSERT INTO `iot_device_template` VALUES (34, 121, 3); +INSERT INTO `iot_device_template` VALUES (35, 122, 3); +INSERT INTO `iot_device_template` VALUES (36, 125, 6); +INSERT INTO `iot_device_template` VALUES (38, 127, 7); +INSERT INTO `iot_device_template` VALUES (39, 128, 1); + +-- ---------------------------- +-- Table structure for iot_device_user +-- ---------------------------- +DROP TABLE IF EXISTS `iot_device_user`; +CREATE TABLE `iot_device_user` ( + `device_id` bigint(20) NOT NULL COMMENT '设备ID', + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '租户名称', + `device_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '设备名称', + `phonenumber` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号码', + `user_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', + `is_owner` tinyint(11) NOT NULL COMMENT '是否为设备所有者(0=否,1=是)', + `perms` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户物模型权限,多个以英文逗号分隔', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`device_id`, `user_id`) USING BTREE, + INDEX `iot_device_user_index_user_id`(`user_id`) USING BTREE, + INDEX `iot_device_user_index_tenant_id`(`tenant_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '设备用户' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_device_user +-- ---------------------------- +INSERT INTO `iot_device_user` VALUES (108, 1, 1, 'admin', '★温湿度开关', '15888888888', 'admin', 1, NULL, '0', '', '2023-02-25 23:15:57', '', NULL, NULL); +INSERT INTO `iot_device_user` VALUES (109, 1, 1, 'admin', '★网关设备', '15888888888', 'admin', 1, NULL, '0', '', '2023-02-25 23:17:32', '', NULL, NULL); +INSERT INTO `iot_device_user` VALUES (109, 3, 1, 'admin', '★网关设备', '15888888881', 'fastbee-t2', 0, 'ota,timer,log,monitor,statistic,reset,gear,switch', '0', '', '2023-09-03 01:17:03', '', '2023-09-03 11:05:06', NULL); +INSERT INTO `iot_device_user` VALUES (109, 7, 1, 'admin', '★网关设备', '18257292958', 'shenzehui', 0, NULL, '0', '', '2023-08-24 08:26:34', '', NULL, NULL); +INSERT INTO `iot_device_user` VALUES (109, 8, 1, 'admin', '★网关设备', '15752221201', 'shadow', 0, NULL, '0', '', '2023-08-24 08:25:44', '', NULL, NULL); +INSERT INTO `iot_device_user` VALUES (118, 1, 1, 'admin', '¥MODBUS网关设备', '15888888888', 'admin', 1, NULL, '0', '', '2023-02-28 16:49:18', '', NULL, NULL); +INSERT INTO `iot_device_user` VALUES (140, 1, 1, 'admin', '¥视频监控', '15888888888', 'admin', 1, NULL, '0', '', '2023-04-11 21:12:37', '', NULL, NULL); + +-- ---------------------------- +-- Table structure for iot_event_log +-- ---------------------------- +DROP TABLE IF EXISTS `iot_event_log`; +CREATE TABLE `iot_event_log` ( + `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '设备事件日志ID', + `identity` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标识符', + `model_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '物模型名称', + `log_type` tinyint(1) NOT NULL COMMENT '类型(3=事件上报,5=设备上线,6=设备离线)', + `log_value` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '日志值', + `device_id` bigint(20) NULL DEFAULT NULL COMMENT '设备ID', + `device_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备名称', + `serial_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备编号', + `is_monitor` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT 0 COMMENT '是否监测数据(1=是,0=否)', + `mode` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT 0 COMMENT '模式(1=影子模式,2=在线模式,3=其他)', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID', + `user_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户昵称', + `tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '租户名称', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `remark` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`log_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '事件日志' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_event_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for iot_function_log +-- ---------------------------- +DROP TABLE IF EXISTS `iot_function_log`; +CREATE TABLE `iot_function_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '设备功能日志ID', + `identify` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '标识符', + `fun_type` int(2) NOT NULL COMMENT '1==服务下发,2=属性获取,3.OTA升级', + `fun_value` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '日志值', + `message_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '消息id', + `device_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '设备名称', + `serial_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '设备编号', + `mode` int(2) NULL DEFAULT NULL COMMENT '模式(1=影子模式,2=在线模式,3=其他)', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', + `result_msg` varchar(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '下发结果描述', + `result_code` int(3) NULL DEFAULT NULL COMMENT '下发结果代码', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `remark` varchar(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `show_value` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '显示值', + `model_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '物模型名称', + `reply_time` datetime(0) NULL DEFAULT NULL COMMENT '设备回复时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `iot_function_log_id_uindex`(`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '设备服务下发日志' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_function_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for iot_group +-- ---------------------------- +DROP TABLE IF EXISTS `iot_group`; +CREATE TABLE `iot_group` ( + `group_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分组ID', + `group_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '分组名称', + `group_order` tinyint(11) NOT NULL DEFAULT 0 COMMENT '分组排序', + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `user_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`group_id`) USING BTREE, + INDEX `iot_group_index_user_id`(`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '设备分组' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_group +-- ---------------------------- +INSERT INTO `iot_group` VALUES (2, '卧室', 2, 1, 'admin', '0', '', '2021-12-29 13:12:42', '', '2023-04-09 22:37:06', '卧室设备'); +INSERT INTO `iot_group` VALUES (3, '厨房', 3, 1, 'admin', '0', '', '2021-12-29 13:12:59', '', '2021-12-29 13:13:48', '厨房设备'); +INSERT INTO `iot_group` VALUES (4, '书房', 4, 1, 'admin', '0', '', '2021-12-29 13:13:10', '', '2021-12-29 13:13:54', '书房设备'); +INSERT INTO `iot_group` VALUES (5, '卫生间', 5, 1, 'admin', '0', '', '2021-12-29 13:13:18', '', '2021-12-29 13:14:03', '卫生间设备'); +INSERT INTO `iot_group` VALUES (6, '走道', 6, 1, 'admin', '0', '', '2021-12-29 13:13:26', '', '2021-12-29 13:14:11', '走道设备'); + +-- ---------------------------- +-- Table structure for iot_product +-- ---------------------------- +DROP TABLE IF EXISTS `iot_product`; +CREATE TABLE `iot_product` ( + `product_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '产品ID', + `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称', + `protocol_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '协议编号', + `category_id` bigint(20) NOT NULL COMMENT '产品分类ID', + `category_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品分类名称', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '租户名称', + `is_sys` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否系统通用(0-否,1-是)', + `is_authorize` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用授权码(0-否,1-是)', + `mqtt_account` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'mqtt账号', + `mqtt_password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'mqtt密码', + `mqtt_secret` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品秘钥', + `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态(1-未发布,2-已发布)', + `things_models_json` json NULL COMMENT '物模型JSON(属性、功能、事件)', + `device_type` tinyint(1) NULL DEFAULT 1 COMMENT '设备类型(1-直连设备、2-网关设备、3-监控设备)', + `network_method` tinyint(1) NULL DEFAULT 1 COMMENT '联网方式(1=wifi、2=蜂窝(2G/3G/4G/5G)、3=以太网、4=其他)', + `vertificate_method` tinyint(1) NULL DEFAULT 1 COMMENT '认证方式(1-简单认证、2-加密认证、3-简单+加密)', + `img_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片地址', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `transport` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品支持的传输协议', + PRIMARY KEY (`product_id`) USING BTREE, + INDEX `iot_product_index_category_id`(`category_id`) USING BTREE, + INDEX `iot_product_index_tenant_id`(`tenant_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 131 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '产品' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_product +-- ---------------------------- +INSERT INTO `iot_product` VALUES (41, '★智能开关产品', 'JSON', 1, '电工照明', 1, 'admin', 1, 0, 'FastBee', 'P47T6OD5IPFWHUM6', 'KX3TSH4Q4OS835DO', 2, '{\"events\": [{\"id\": \"exception\", \"name\": \"设备发生异常\", \"type\": 3, \"order\": 0, \"regId\": \"exception\", \"isChart\": 0, \"datatype\": {\"type\": \"string\", \"maxLength\": 1024}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"height_temperature\", \"name\": \"环境温度过高\", \"type\": 3, \"order\": 0, \"regId\": \"height_temperature\", \"isChart\": 0, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}], \"functions\": [{\"id\": \"report_monitor\", \"name\": \"上报数据\", \"type\": 2, \"order\": 10, \"regId\": \"report_monitor\", \"isChart\": 0, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"message\", \"name\": \"屏显消息\", \"type\": 2, \"order\": 7, \"regId\": \"message\", \"isChart\": 0, \"datatype\": {\"type\": \"string\", \"maxLength\": 1024}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"light_color\", \"name\": \"灯光色值\", \"type\": 2, \"order\": 5, \"regId\": \"light_color\", \"isChart\": 0, \"datatype\": {\"type\": \"array\", \"arrayType\": \"integer\", \"arrayCount\": \"3\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"switch\", \"name\": \"设备开关\", \"type\": 2, \"order\": 9, \"regId\": \"switch\", \"isChart\": 0, \"datatype\": {\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"reset\", \"name\": \"设备重启\", \"type\": 2, \"order\": 6, \"regId\": \"reset\", \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"重启\", \"value\": \"restart\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"irc\", \"name\": \"射频遥控\", \"type\": 2, \"order\": 11, \"regId\": \"irc\", \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控学习\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"gear\", \"name\": \"运行档位\", \"type\": 2, \"order\": 8, \"regId\": \"gear\", \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"status\", \"name\": \"上报状态\", \"type\": 2, \"order\": 12, \"regId\": \"status\", \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"更新状态\", \"value\": \"update_status\"}]}, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}], \"properties\": [{\"id\": \"co2\", \"name\": \"二氧化碳\", \"type\": 1, \"order\": 2, \"regId\": \"co2\", \"isChart\": 1, \"datatype\": {\"max\": 6000, \"min\": 100, \"step\": 1, \"type\": \"integer\", \"unit\": \"ppm\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"brightness\", \"name\": \"室内亮度\", \"type\": 1, \"order\": 4, \"regId\": \"brightness\", \"isChart\": 1, \"datatype\": {\"max\": 10000, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"cd/m2\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"temperature\", \"name\": \"空气温度\", \"type\": 1, \"order\": 1, \"regId\": \"temperature\", \"isChart\": 1, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"humidity\", \"name\": \"空气湿度\", \"type\": 1, \"order\": 3, \"regId\": \"humidity\", \"isChart\": 1, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"%\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}]}', 1, 1, 3, NULL, '0', '', '2025-08-14 00:06:33', '', '2023-09-25 22:58:17', NULL, 'MQTT'); +INSERT INTO `iot_product` VALUES (55, '★网关产品', 'JSON', 1, '电工照明', 1, 'admin', 1, 0, 'FastBee', 'P467433O1MT8MXS2', 'KWF32S3H95LH14LO', 2, '{\"events\": [{\"id\": \"exception\", \"name\": \"设备发生异常\", \"type\": 3, \"order\": 0, \"regId\": \"exception\", \"isChart\": 0, \"datatype\": {\"type\": \"string\", \"maxLength\": 1024}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"height_temperature\", \"name\": \"环境温度过高\", \"type\": 3, \"order\": 0, \"regId\": \"height_temperature\", \"isChart\": 0, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}], \"functions\": [{\"id\": \"report_monitor\", \"name\": \"上报监测数据\", \"type\": 2, \"order\": 11, \"regId\": \"report_monitor\", \"isChart\": 0, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"reset\", \"name\": \"设备重启\", \"type\": 2, \"order\": 0, \"regId\": \"reset\", \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"重启\", \"value\": \"restart\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"message\", \"name\": \"屏显消息\", \"type\": 2, \"order\": 0, \"regId\": \"message\", \"isChart\": 0, \"datatype\": {\"type\": \"string\", \"maxLength\": 1024}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"light_color\", \"name\": \"灯光色值\", \"type\": 2, \"order\": 0, \"regId\": \"light_color\", \"isChart\": 0, \"datatype\": {\"type\": \"array\", \"arrayType\": \"integer\", \"arrayCount\": \"3\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"gear\", \"name\": \"运行档位\", \"type\": 2, \"order\": 7, \"regId\": \"gear\", \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"switch\", \"name\": \"设备开关\", \"type\": 2, \"order\": 8, \"regId\": \"switch\", \"isChart\": 0, \"datatype\": {\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}], \"properties\": [{\"id\": \"brightness\", \"name\": \"室内亮度\", \"type\": 1, \"order\": 0, \"regId\": \"brightness\", \"isChart\": 1, \"datatype\": {\"max\": 10000, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"cd/m2\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"temperature\", \"name\": \"空气温度\", \"type\": 1, \"order\": 0, \"regId\": \"temperature\", \"isChart\": 1, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"category\", \"name\": \"功能分组\", \"type\": 1, \"order\": 9, \"regId\": \"category\", \"isChart\": 0, \"datatype\": {\"type\": \"object\", \"params\": [{\"id\": \"category_light\", \"name\": \"光照\", \"order\": 1, \"isChart\": 1, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"category_humidity\", \"name\": \"空气湿度\", \"order\": 2, \"isChart\": 1, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"%\"}, \"isHistory\": 0, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"category_temperature\", \"name\": \"空气温度-只读\", \"order\": 3, \"isChart\": 0, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 1}, {\"id\": \"category_report_monitor\", \"name\": \"上报监测数据\", \"order\": 7, \"isChart\": 0, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"category_gear\", \"name\": \"运行档位\", \"order\": 5, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"category_switch\", \"name\": \"设备开关\", \"order\": 4, \"isChart\": 0, \"datatype\": {\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"category_irc\", \"name\": \"射频遥控\", \"order\": 6, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控配对\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}]}, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device\", \"name\": \"子设备\", \"type\": 1, \"order\": 10, \"regId\": \"device\", \"isChart\": 0, \"datatype\": {\"type\": \"array\", \"params\": [{\"id\": \"device_co2\", \"name\": \"二氧化碳\", \"order\": 0, \"isChart\": 1, \"datatype\": {\"max\": 6000, \"min\": 100, \"step\": 1, \"type\": \"integer\", \"unit\": \"ppm\", \"enumList\": [{\"text\": \"\", \"value\": \"\"}], \"arrayType\": \"int\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1, \"isSharePerm\": 0}, {\"id\": \"device_temperature\", \"name\": \"空气温度-只读\", \"order\": 4, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 1}, {\"id\": \"device_gear\", \"name\": \"运行档位\", \"order\": 6, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"device_switch\", \"name\": \"设备开关\", \"order\": 5, \"isChart\": 0, \"datatype\": {\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"device_report_monitor\", \"name\": \"上报监测数据\", \"order\": 9, \"isChart\": 0, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"device_irc\", \"name\": \"射频遥控\", \"order\": 1, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控学习\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}], \"arrayType\": \"object\", \"arrayCount\": \"5\"}, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}]}', 2, 2, 3, NULL, '0', '', '2025-02-25 22:51:39', '', '2023-09-16 11:46:43', NULL, 'MQTT'); +INSERT INTO `iot_product` VALUES (88, '¥视频监控产品', NULL, 2, '家居安防', 1, 'admin', 1, 0, 'FastBee', 'P0IB9M8A7J4R056V', 'K69914VL8175ZY21', 2, '{}', 3, 1, 3, NULL, '0', '', '2023-04-11 21:11:54', '', NULL, NULL, 'GB28181'); + +-- ---------------------------- +-- Table structure for iot_product_authorize +-- ---------------------------- +DROP TABLE IF EXISTS `iot_product_authorize`; +CREATE TABLE `iot_product_authorize` ( + `authorize_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '授权码ID', + `authorize_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '授权码', + `product_id` bigint(20) NOT NULL COMMENT '产品ID', + `device_id` bigint(20) NULL DEFAULT NULL COMMENT '设备ID', + `serial_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设备编号', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称', + `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态(1-未使用,2-使用中)', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NOT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`authorize_id`) USING BTREE, + INDEX `iot_product_authorize_index_product_id`(`product_id`) USING BTREE, + INDEX `iot_product_authorize_index_device_id`(`device_id`) USING BTREE, + INDEX `iot_product_authorize_index_serial_number`(`serial_number`) USING BTREE, + INDEX `iot_product_authorize_index_user_id`(`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '产品授权码表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_product_authorize +-- ---------------------------- + +-- ---------------------------- +-- Table structure for iot_protocol +-- ---------------------------- +DROP TABLE IF EXISTS `iot_protocol`; +CREATE TABLE `iot_protocol` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id', + `protocol_code` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '协议编码', + `protocol_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '协议名称', + `protocol_file_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '协议jar包,js包,c程序上传地址', + `protocol_type` int(11) NOT NULL DEFAULT 0 COMMENT '协议类型 0:未知 1:jar,2.js,3.c', + `jar_sign` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '协议文件摘要(文件的md5)', + `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', + `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', + `protocol_status` int(11) NOT NULL DEFAULT 0 COMMENT '0:草稿 1:启用 2:停用', + `del_flag` int(11) NOT NULL DEFAULT 0 COMMENT '0:正常 1:删除', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `UNIQUE_CODE`(`protocol_code`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '协议表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_protocol +-- ---------------------------- +INSERT INTO `iot_protocol` VALUES (1, 'JSON', 'JSON协议', '/', 0, '系统内置JSON编解码协议', '2023-03-01 05:46:43', '2023-04-10 14:42:12', 1, 0); +INSERT INTO `iot_protocol` VALUES (5, '商业版非标协议', '商业版本支持更多非标协议', '', 0, '商业版本支持更多非标协议', '2023-08-23 01:31:39', '2023-08-23 01:31:39', 1, 0); + +-- ---------------------------- +-- Records of iot_simulate_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for iot_social_platform +-- ---------------------------- +DROP TABLE IF EXISTS `iot_social_platform`; +CREATE TABLE `iot_social_platform` ( + `social_platform_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '第三方登录平台主键', + `platform` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '第三方登录平台', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT ' 0:启用 ,1:禁用', + `client_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '第三方平台申请Id', + `secret_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '第三方平台密钥', + `redirect_uri` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户认证后跳转地址', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记位(0代表存在,1代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者', + `create_time` datetime(0) NOT NULL COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `bind_uri` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '绑定注册登录uri,http://localhost/login?bindId=', + `redirect_login_uri` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '跳转登录uri,http://localhost/login?loginId=', + `error_msg_uri` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '错误提示uri,http://localhost/login?errorId=', + PRIMARY KEY (`social_platform_id`) USING BTREE, + UNIQUE INDEX `iot_social_platform_platform_uindex`(`platform`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '第三方登录平台控制' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_social_platform +-- ---------------------------- +INSERT INTO `iot_social_platform` VALUES (1, 'QQ', '0', '102005066', 'PhkaBYgZ99999', 'https://iot.wumei.live/auth/callback/qq', '0', 'admin', '2022-04-18 11:21:28', '2022-04-20 16:29:23', 'admin', NULL, 'http://localhost/login?bindId=', 'http://localhost/login?loginId=', 'http://localhost/login?errorId='); +INSERT INTO `iot_social_platform` VALUES (2, 'wechat_open_web', '0', 'wxd8e66af0d2ac0b9d', 'c1172c438d407d8ebce2ac0e314a18db', 'https://81.71.97.58/prod-api/auth/callback/wechat_open_web', '0', 'admin', '2023-08-23 11:41:37', '2023-09-14 17:16:25', 'admin', NULL, 'https://81.71.97.58/login?bindId=', 'https://81.71.97.58/login?loginId=', 'https://81.71.97.58/login?errorId='); +INSERT INTO `iot_social_platform` VALUES (3, 'wechat_open_mobile', '0', 'wx6be3f0d7bf7154e1', 'b6c1d0da60bd5250857d211cdc64fdc9', 'http://localhost', '0', 'admin', '2023-08-28 14:21:29', NULL, NULL, NULL, 'http://localhost', 'http://localhost', 'http://localhost'); +INSERT INTO `iot_social_platform` VALUES (4, 'wechat_open_mini_program', '0', 'wx5bfbadf52adc17f3', '1faddfc3fa6ab2f9ce937f41fcfc7c52', 'http://localhost', '0', 'admin', '2023-09-12 15:39:48', NULL, NULL, NULL, 'http://localhost', 'http://localhost', 'http://localhost'); + +-- ---------------------------- +-- Table structure for iot_social_user +-- ---------------------------- +DROP TABLE IF EXISTS `iot_social_user`; +CREATE TABLE `iot_social_user` ( + `social_user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '第三方系统用户表主键', + `uuid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '第三方系统的唯一ID', + `source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '第三方用户来源', + `access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户的授权令牌', + `expire_in` int(11) NULL DEFAULT NULL COMMENT '第三方用户的授权令牌的有效期(部分平台可能没有)', + `refresh_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '刷新令牌(部分平台可能没有)', + `open_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方用户的 open id(部分平台可能没有)', + `uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方用户的 ID(部分平台可能没有)', + `access_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '个别平台的授权信息(部分平台可能没有)', + `union_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方用户的 union id(部分平台可能没有)', + `scope` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方用户授予的权限(部分平台可能没有)', + `token_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '个别平台的授权信息(部分平台可能没有)', + `id_token` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'id token(部分平台可能没有)', + `mac_algorithm` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '小米平台用户的附带属性(部分平台可能没有)', + `mac_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '小米平台用户的附带属性(部分平台可能没有)', + `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户的授权code(部分平台可能没有)', + `oauth_token` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Twitter平台用户的附带属性(部分平台可能没有)', + `oauth_token_secret` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Twitter平台用户的附带属性(部分平台可能没有)', + `create_time` datetime(0) NOT NULL COMMENT '创建时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记位(0代表存在,2代表删除)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '绑定状态(0:未绑定,1:绑定)', + `sys_user_id` int(11) NULL DEFAULT NULL COMMENT '用户ID', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名', + `nickname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户昵称', + `avatar` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户头像', + `gender` tinyint(4) NULL DEFAULT NULL COMMENT '用户性别', + `source_client` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方用户来源客户端(web、app、小程序)', + PRIMARY KEY (`social_user_id`) USING BTREE, + UNIQUE INDEX `iot_social_user_pk`(`social_user_id`) USING BTREE, + UNIQUE INDEX `iot_social_user_unique_key`(`uuid`, `source`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 211 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '第三方登录用户' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_social_user +-- ---------------------------- +INSERT INTO `iot_social_user` VALUES (1, 'ojefY6BdTpoXOLjdpsFQXWixAG_Q', 'WECHAT_OPEN', '71_7qVQ56lx6qdC7mmArXFwQD8Nl6BTjayw4HJdfHdPoXS0sEHDffiSYa4k8dIK7XG7puk2asZ0s0Rj_Pk8ahqdDQICL4FumjWmXHm3ql2si-M', 7200, '71_rh7a79t0eJmC0JyJrQjABF3zZdkNhP7oAUm3Jj6Rk1skL_i4V3ITlM3ViYO0PA_NCKn9ba85pz2vttdloreR0lWmUxK-VOm3XaMt33vZ9a0', 'ojefY6BdTpoXOLjdpsFQXWixAG_Q', NULL, NULL, 'oL1Fu5x1fapbFrUGWUStT0Vs6f4I', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-08-23 11:48:04', 'System', '2023-09-15 17:23:12', 'System', '1', '1', 8, 'shadow', 'shadow', 'https://thirdwx.qlogo.cn/mmopen/vi_32/dNibaEkibxjJZSffkH5gQKtCg0pqfz39PGbPcQ8IhADianIaEYqibvD2JhrxYLMeQexBGVR6VOl9MR4gtsYiaxEqPFA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (2, 'ojefY6Pny526TwBwsyfUhzBB_szg', 'WECHAT_OPEN', '71_HlBJGUovm8cvZoEljoFkrAbRXtqt3mWNqxEOfMGsse-2Sie51YjkfJQbrSZySyIsf9sYTIwXj7EjbPO5GciN_xqEsSRCzyG6qIvUvkyNIBs', 7200, '71_Bc5n4-MS-25vBkt8p8BAxeuAZBawwmx4ryi-KCJxzi0OKY73HinwKYRTPZaw08kXgpD6zToRAjqIoRuyt-mNwEgfeN50hW8Unk5NuK4Bdpo', 'ojefY6Pny526TwBwsyfUhzBB_szg', NULL, NULL, 'oL1Fu589vTytNQy2okIKQnKBUmRU', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-08-24 08:22:53', 'System', NULL, NULL, '0', '0', NULL, '🌲', '🌲', 'https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLTLicc0w6SgPWibR5Z92j9AdW9aC4QxuFjQcJXcekbjc13fkHD7iaZc7CwEHtUq9FQalub6vOZ46LZA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (3, 'ojefY6AZPO1PPy9K4tWd8xdLWUss', 'WECHAT_OPEN', '71_x8HU8YdqqKMXts7KJ3T0hLOvmlP5YIi0pkTQ9bLA8vRusmEEUQFKyBpbG2UAFRDMEJvpp6cKGh9EGkiRdj7zSA4aHP2r-luXHSkAhP7zyvU', 7200, '71_AFMUcIv8tP4PGiHrOwJVN0B8bpCGyKXuG8ZCDiVGF5zaG10MTTLTmTJXNHJHmZzs3h6X9kbLY8sukNk83uj3QI3_J5SGOtihOUNMa9g7Ir0', 'ojefY6AZPO1PPy9K4tWd8xdLWUss', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-08-24 09:41:51', 'System', '2023-08-24 10:36:16', 'System', '0', '0', NULL, 'oh', 'oh', 'https://thirdwx.qlogo.cn/mmopen/vi_32/RNia2ASTn210r40Tb91yfWgmiaWXGPXF7rNnic5lkes9avGbZQ0365uZObT1JicIQpiba7MDuHicScKUxnYWWyTN5VAw/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (4, 'ojefY6JUjFaO7RBRqgcrRGLxPVFA', 'WECHAT_OPEN', '71_qkQqwgA9RYmL5oQASwBxwwR4loysQQc3YRqGJRJONSxpNrPLlLdNibDk5YINFYjfnCxwnhjVPQqhX7xHaGE_UZMX5e1JaWKCJdrgwP62LxY', 7200, '71_oEKp3JLiEtv5668rprSxidUBbcd30cZQ2Bbt_tL5XdWQX52Yb3po5t5ynFwlA4n-7dLt5rGR3E1FKb9Qw8Xso8SfSfF-4CBF9ZCjSxppIvI', 'ojefY6JUjFaO7RBRqgcrRGLxPVFA', NULL, NULL, 'oL1Fu55Rkr9A69wS6buTQz7zdkDc', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-08-24 09:58:59', 'System', NULL, NULL, '0', '0', NULL, 'shadow 张', 'shadow 张', 'https://thirdwx.qlogo.cn/mmopen/vi_32/EcUsiaR4Y1WkyibJXHDEPAiazbERr1BXAnzZWjh2SiayuawoEaT0icDzL2dZtuu0ia6Z7AJZZbiaxDJb8iaJxTnyk7Xicgw/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (5, 'ojefY6I66aL78LElFNjsA_rY7JIE', 'WECHAT_OPEN', '71_sanZ8NfbnEANzqUTQQAY6CRoafcBaV1eS4KPtcAv_rkOlunJQyVeJJzFbXSge3QxsCvljt65TTpyiLSifSjADJdaSZGtKzhF7IXlo5km2Po', 7200, '71_JbHfJV6zy02mK8ZnCKA3Yyhe2upHOqeah6IeZxzO3CKVAcOqH7CGbsk9GFsK3bqDD1SF8jp05ncC8XfkzR5BS4A3s_QIQjt44bviFckymtE', 'ojefY6I66aL78LElFNjsA_rY7JIE', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-08-24 11:49:31', 'System', '2023-08-24 14:10:29', 'System', '0', '0', NULL, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/tgaqAZ2oTMAZfF4cHRPib77yOLRSv9ibPibQfkQiclB8kwBuicB3vDcLfTnfU6HWZRNRqjmSXjWYYY5fNdOAR8CSxzg/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (6, '71420ce6-5300-4495-92da-6d1a4a7e2fdd', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 09:32:12', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (7, '6ec4d0be-bde5-466b-b3cf-5b3736d15ba7', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 09:40:17', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (8, 'ac2d836d-29fe-4e01-9f3d-bc54d4168855', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 09:45:52', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (9, 'ef2510ab-8fdd-4433-b0ff-1b57ef2f0fa9', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt10T_V0r-s6plNgUfVWrzns', NULL, NULL, 'oU5Yyt_J3cry6qhOzJE1qW-tdiVA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 09:47:34', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (10, 'b7c2ee2f-d644-46b9-812d-104b1d122fe0', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 09:50:43', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (11, '214e90ab-5b09-4aec-a6d1-4100c21db1b6', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 09:51:42', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (12, 'a23aec75-40df-4878-b33f-a1aacc6b45f6', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 09:53:12', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (13, '37de2b33-e690-40f6-a981-fc7182503606', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:00:02', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (14, '8c1e964e-9bb8-4876-bc92-6a41faaf2097', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:09:12', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (15, 'a7b77ebb-0815-4983-b0ad-b9b2a37593ca', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:09:59', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (16, '0ee69f21-448a-420f-a092-68418ae96c01', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:10:34', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (17, '0c928db4-03b5-40c9-9971-3b13d39ba4b8', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:11:41', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (18, '8f0daa3d-f332-423b-ad37-95e740a109e8', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:12:44', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (19, 'd15e0ae9-f49d-4e55-9965-79e260e8ffd0', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:13:33', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (20, 'b4da93b9-21c7-4e76-937b-2162024a9c6c', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:14:37', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (21, 'a16423aa-99ce-427e-89cf-a9f13955acec', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:15:54', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (22, '7771c72d-741f-4f66-bec4-414471ebb5db', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:16:34', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (23, '9def0641-b670-45cc-8297-6c3171f12025', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:17:36', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (24, 'e8f70c8b-bc52-4b38-aaf7-6a8df9ffb8cd', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:18:23', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (25, 'a359a333-4348-4786-973e-f15b9fa6ce94', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:19:15', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (26, '061154f9-ac4b-4035-a549-cd602422427a', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt10T_V0r-s6plNgUfVWrzns', NULL, NULL, 'oU5Yyt_J3cry6qhOzJE1qW-tdiVA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:19:55', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (27, '10003d18-0b00-458d-966e-3a54b218c83b', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:21:18', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (28, '376f2a15-662d-4820-bb62-683dd555fdbf', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:24:01', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (29, 'd4e4fe18-1f99-4361-b509-e464fdc806a2', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:24:42', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (30, '7b37261c-b420-45d5-8cd0-7ab6e4787621', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:25:17', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (31, '7635bed2-0d6e-4924-b9d7-af0235fc2ecc', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:25:26', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (32, '6aa3715d-b3a6-4b12-8bb4-1fc3af297d99', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:26:09', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (33, '0222ba55-f5a8-4218-a23d-949ecc78c405', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:26:52', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (34, '0bb2118c-b365-4dae-943e-84e0f8dca104', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:27:50', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (35, '5c065548-d171-44b8-a5bb-b93db08b22b3', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:28:12', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (36, '79429286-c4c7-4db8-9902-6f10ffd26e06', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:28:53', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (37, '4eb61991-8715-427b-b6a1-6e479f3faafc', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:29:44', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (38, 'cbcf9cfb-109f-4806-9bd0-5e9a4ba0c108', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:30:33', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (39, '810f0806-21e0-487b-b2fe-c9d037b20c81', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:31:28', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (40, '7da601d4-765c-40bf-aa2d-96bdef88c9ff', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:32:23', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (41, 'e3e29354-d06b-4d18-b172-a86e563a20f1', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:33:16', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (42, 'c73ece08-7a9e-462f-ad04-e5a5ce05a8b5', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:33:47', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (43, '7b48faf5-b023-46d7-9332-8ead5d82895e', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:34:27', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (44, 'aa8db705-654d-43d9-8ec2-3b090bb9685d', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:35:18', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (45, 'b3f319a4-a4aa-48bd-9a43-ff03b09e9b0f', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:36:18', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (46, '297e229a-545e-47a1-8acd-85708430d78d', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:37:10', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (47, '74d77e94-a9c2-4fca-9b47-e1c7ea0ab419', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:37:45', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (48, '0a750c6d-2e14-4e12-bd11-5ae390b04451', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:57:10', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (49, '6b353153-2eb0-4916-ad83-f5465ccd4480', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 10:57:55', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (50, '10be370a-38e0-4de4-822b-e6b1a07f0ff2', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 11:47:28', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (51, '8634fc78-e8d0-447f-af90-51fd29536ae4', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 15:40:06', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (52, '4e49726d-9078-47de-8752-5fac79a5b9b1', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 15:45:31', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (53, '77e28b94-5f6e-4dda-bc15-a411ce9423e8', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 15:49:07', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (54, '17b87cd8-6a14-4834-9d9e-e4121d563079', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 15:53:20', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (55, 'b2b7ddc7-6e48-4f24-9d03-8c481b6fc165', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 15:57:00', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (56, 'c394c827-3f3f-42c3-88db-b5e3edc5a3e8', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 15:58:51', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (57, '16bf6849-9619-4448-9b0f-1ad4a999e33f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 15:59:47', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (58, '8f19e5f6-e197-4b81-9585-ea3ea655dd2a', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:01:56', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (59, '647ce6e6-5aa4-4504-80db-fb1df687c0b6', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:03:22', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (60, '04f69ab8-5a84-495c-8dfa-7f19a1a32c63', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:05:03', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (61, '520bf6de-19a5-4b06-b905-6c61a37a1809', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:06:05', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (62, 'e70c584c-5d6f-4cdd-9d63-42606b21941f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:07:37', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (63, 'd85b3a8e-4917-470c-8412-9c7ccbdd26e6', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:08:13', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (64, '21e06b88-33cd-4ddc-9d3e-22a0cc79d8ab', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:09:43', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (65, '70903b36-f5da-4784-8505-9e0ee7842a7c', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:10:31', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (66, '4300b8fb-4d5a-4c83-b45f-f46de9070789', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:11:57', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (67, 'a83706e9-c606-4393-b46c-bd589102fa23', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:14:25', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (68, '03b705d7-cb9b-4176-ba52-82caee369ee5', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:16:11', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (69, '9c1aa75d-0afe-4d9b-93a4-82ff51476b83', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:18:05', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (70, 'd5153a89-5dca-4ce1-b225-cdf1f06734b3', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:20:23', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (71, '6f0dc304-3697-4d5e-b6f5-dcae95c6037d', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:23:43', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (72, '1a8d1436-b1fc-4648-8ef3-8986b200f609', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:25:12', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (73, '87c74066-e8db-4312-ba9c-8d4a58d65b88', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:26:02', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (74, '7c36eace-b7c5-405f-a2a1-b1fa95d7b526', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:26:36', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (75, '9147f792-55be-4ca6-824d-b8c4a42960b3', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:27:48', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (76, '2183b103-858d-4bb4-9111-83fc8ddf24c1', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:34:12', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (77, '9594b67d-6651-4237-887d-ebadfabc8ca3', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:35:55', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (78, '60649e01-d220-4bbc-a21c-211ce67bd9a7', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:36:29', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (79, '83aa1836-36c5-4e74-aebb-9263843ce8fa', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:36:41', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (80, 'd7dfb927-1f17-41f7-868b-6ee0b8ec2d2f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:40:14', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (81, '9898d830-f0f3-4dbd-a687-a49709b855de', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:42:14', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (82, 'e7a5b6b0-3e50-4892-b4cc-e628fb803be6', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:43:31', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (83, '34454957-3dfd-4819-8930-46daf47d2f81', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:45:03', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (84, '384b5ce9-5bf7-43b0-950d-496737c3a8dd', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:45:37', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (85, 'dd6de292-124f-44e6-a0fd-057cfeed410c', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:46:25', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (86, 'a370f0b0-fb7f-41cf-a4ed-eafb873cd50b', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:48:31', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (87, 'bfb06fff-b0bb-43a4-8cf0-bf4f4b3445f6', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:50:00', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (88, '53634812-48d2-420a-9e3c-2ac032b5d9cc', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:50:52', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (89, '994f638f-cf08-4846-9630-94bb509ab7db', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:51:27', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (90, '76813df6-4bdd-4add-981e-8e782a3b772a', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:52:16', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (91, 'df0c3f75-a865-4621-988d-ec494e9ea407', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:53:22', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (92, '07f1722d-d9d4-43f7-8f7e-81c6446d7b3f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:57:11', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (93, '1d91f1b5-a008-446a-ad12-3210e899c55d', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:57:50', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (94, '9b0f8585-4432-401a-9ae1-f363a158a133', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:58:27', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (95, '33b73d87-df3c-41b4-8abc-d2c51bf4657e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 16:59:41', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (96, '08daa4b5-b5e0-4217-8249-d47928afcf82', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:02:57', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (97, 'a1d11647-2316-4636-85ce-a589084c383a', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:03:27', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (98, 'c8579e89-0858-4ba7-9e00-f1ea2a208be8', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:06:37', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (99, 'd3837059-b25b-4221-9fd0-aed6f958b8a0', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:07:15', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (100, 'a47efa4b-e840-4e07-a710-459fa9f01e5e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:08:43', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (101, 'dca0f5d4-df0f-4d95-830e-2ae8aa60a550', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:15:11', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (102, 'be678468-abc2-48db-b34d-47e81352bf5c', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:16:49', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (103, 'ae4265e7-e192-46f5-8a9e-53d6ba6aee3e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:20:34', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (104, '232a0407-b8f0-40b2-bf70-b368aecc3f48', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:22:02', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (105, '09aa4d6e-471a-4890-98f1-85ec1f41d16d', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:23:05', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (106, '6dc0c49c-29a6-4292-bb59-d19d3c7dc11f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:23:49', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (107, 'aafb9719-a7e3-4c25-be9f-150fbc4e345d', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:25:22', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (108, 'ce799416-f0a8-4941-9f84-ff3bf5a5ae00', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:26:16', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (109, '38ad0b87-c569-4831-84ea-f45bfb1b06e6', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:28:00', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (110, 'a0ee9a9f-6f2f-49a2-80e1-f0976cb115d5', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:28:16', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (111, '42b6c87d-a031-4f7e-8670-09672fd00239', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:29:40', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (112, '39812b97-1a6d-4255-ba0f-86e8e6150bf7', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:29:55', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (113, '38df607a-72e4-45c5-9b9a-fda85114e7a8', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:30:43', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (114, '3d1dbb97-c0d4-4790-9bd1-57d2a26c945e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:34:02', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (115, 'f9544196-41ca-4f54-926e-2f43bd5482ef', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:34:31', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (116, 'b954f7a1-e544-4ac1-a103-54cfbc9ce982', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:35:13', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (117, '53484323-65ce-4720-91e6-51f81741df2d', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:36:26', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (118, 'cae0d43e-f1d9-427a-9e2e-a276848a9e6a', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:37:04', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (119, '3d1dd8c7-2d3d-46c7-aec0-8aeae75bd53c', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:38:24', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (120, 'd206b8cc-4663-4253-919c-eecbf4bdae2d', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:39:14', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (121, '30f22b8a-39f3-4088-a917-e7b0bb315d96', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:40:18', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (122, 'b58fa0aa-f173-4a25-b245-3eedae47c4bf', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:40:43', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (123, '6de207b2-2f61-465f-8e2d-7115220cfb0a', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:41:10', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (124, 'a2734f2b-41c2-4b5c-a9e7-0301482c2db1', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:42:30', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (125, '0142a300-7a9a-4a09-990e-f9d53363168c', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:43:54', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (126, 'a1207e54-0e14-424a-a485-9a560bce8058', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:49:37', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (127, 'cd2425fc-dab4-4f73-bc61-1b9f43920801', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:51:55', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (128, 'ee27889d-4dbb-4ed0-8184-81d0c56cee06', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:53:38', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (129, 'd85434f8-c11b-438c-890e-8e5732f91a22', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:55:11', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (130, '0cff5da9-3cd4-4363-80be-c3cccb523a95', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:57:34', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (131, '58cf157e-c55c-4cf4-90ee-6f9546ea60de', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:58:23', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (132, '3ad40393-bdc1-4cc5-90cb-c40c45737c07', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 17:59:36', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (133, '268d0dec-0c8c-4017-adf0-c87c7a5705f5', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:03:33', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (134, 'a925f086-1f57-4ffc-bb0b-656e27cac343', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:05:28', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (135, '0d344981-1748-4b0c-bd5e-38db0d9d4903', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:07:31', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (136, '545b520c-d306-4ae9-affa-ead01383de6b', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:07:44', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (137, '2cf65789-0d5a-4a04-a86b-71b4c4632fab', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:08:02', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (138, '69b4eb4c-89e3-4ff1-ba0a-ec181cfa269e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:11:22', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (139, 'eae37130-5acb-4a7c-a466-867202b5de22', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:12:07', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (140, '74471c0e-fb55-4545-b23a-944f56a01d9e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:13:54', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (141, '3dc79a1b-6974-4338-a05e-732a08c06d9f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:15:26', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (142, '1bb4277e-05dc-455a-86f1-a4d7a570a7c9', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:21:19', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (143, 'f6c85ba2-6d99-4509-9fce-e32762a3d9fc', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:25:01', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (144, '99f90484-cd36-4caf-b874-64cdec51c973', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:26:24', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (145, '254a881a-36c0-46a8-89c1-47ec0902cc1c', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:28:43', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (146, '40814010-a24d-448f-9841-ea26f75e3d4f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:29:17', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (147, 'b9d31023-b415-4a05-88be-e8f6077ba1c1', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-12 18:30:22', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (148, '8d98204f-cc93-4ae7-961a-ffc88f16ad22', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:02:29', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (149, 'cfa57e94-fa7b-4cd7-8b0e-f84c2a32517a', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:03:05', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (150, 'b0742424-3b90-4c92-91b6-da7d0c1042e4', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:04:31', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (151, '92fb0d86-db06-4bd2-88a6-2c5e5659c2dd', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:10:44', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (152, '157c9ab2-260f-4fc9-953c-244e66a416dc', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:14:04', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (153, '58250a3d-9d20-4c06-a161-b89a5cbe2205', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:17:25', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (154, '503ec9f6-9c51-494c-abe6-d2025b6d5de8', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:23:32', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (155, '7da9ee7e-00f1-400c-9e82-aa756d33c2f7', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:25:14', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (156, '576eb582-a62f-4de4-a7c6-5a79d06a317e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:26:11', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (157, '35fe81bd-a801-411e-a588-83e2073b53d1', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:36:01', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (158, '13cc3148-7818-4aae-b404-5aa5b21bcb43', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:37:12', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (159, 'c667755d-08bf-4575-8763-ece99a8d34ff', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:38:20', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (160, 'e9cb8b8f-0f5a-47f0-ac70-04b75341a2cd', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:40:18', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (161, '128cb9e9-52a8-4ecc-8b4f-14d0377a9bdb', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:41:53', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (162, 'e71e95b5-4d16-45d4-ad99-c719c971ee4f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:46:18', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (163, 'c22e9388-e8e1-4965-8689-67d614efa611', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:47:29', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (164, 'f3232bc6-a8d0-48c0-a08f-0f7ad79dfaa1', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:48:36', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (165, '0bd9b8c6-bfe6-41f3-80ad-2bad1f56348b', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:51:38', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (166, '4c04dbef-6f2d-48a7-a549-55089038e197', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:53:04', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (167, '2c3b82a0-1cdb-4ccf-80ec-41d49f5c1bcf', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:54:21', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (168, '20d05c1d-c3c2-4f89-8093-44b548165d42', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:55:38', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (169, '6364f00a-44f9-41c6-a462-1edf968fe4e5', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 09:59:29', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (170, '6598c9c5-9e50-432c-aaa2-636e0e8d44f9', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:07:53', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (171, '3909b811-7a5a-46c1-b390-6d21d8857670', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:10:11', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (172, 'd3da6d29-b931-4f25-ba5b-bd091af19ff5', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:21:05', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (173, '11040fcd-6f8b-470b-aedc-1411b36165c7', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:23:34', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (174, 'c3ac6479-d9c2-4205-a257-abefe814a842', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:26:47', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (175, 'f0cf37ba-eeeb-44ea-a870-8bc74c079d5c', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:39:49', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (176, 'babe0cad-db0c-4f07-b478-89f8d89bc197', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:42:21', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (177, 'df2b5aae-e7da-4793-8f42-d7025855208e', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:46:08', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (178, '4b6bd295-aa7c-4549-b82f-fd0d8be4a439', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:49:22', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (179, '2e3ffaa3-d499-46a7-aa1b-b2ae27ef4d32', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:50:20', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (180, '8670c605-1b89-4448-9de3-e4d15a1b0bad', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:52:38', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (181, 'fc90c9b0-c5d1-41b2-be40-1ea9ee2e52f2', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:53:25', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (182, '4cb82fc7-e322-439d-bd49-59e22b4ba8de', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:55:25', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (183, '9d4f9fd7-0564-4128-be27-25030761f141', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 10:58:06', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (184, 'bfe86e54-30e8-4c0c-ae49-497863b73708', 'WECHAT_OPEN_MOBILE', NULL, NULL, NULL, 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 11:00:58', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (185, '89953f9b-30af-446c-9682-27358d8f4d76', 'WECHAT_OPEN_MOBILE', '72_1zj9L8T0iKDEqORM5reOYHBG3nL_5jbvb3TfFjGQqw5jv9-0YmI02SgOto6PZXZ7Y1R0o8nm5EeJc8bR8547MfZMBbICbasV2YDtW0XbfSQ', 7200, '72_0Ae6bzB8bTMtnrrfuHkNDN37ko1GEOTLsbqbE3tbQAXNHNd6n_7-HIie0v_zC_clqDr4mOmJBOtkvjCzVHDWW7OS0pAdoDUovfy2n-Y7WD8', 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 11:01:17', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/NEJsVswPcQnxDy3UBXcVGIpMwvn2FmJ6I1k5DoNZk0UcZwQEm7lCewbdneEEfCeVkVNXOIQOXw8evKBea5MBdA/132', 0, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (186, '09277a77-53a8-4cf9-8396-0442d33166ab', 'WECHAT_OPEN_MOBILE', '72_StpVhV87sy7cSsbkVoOJyxCdtlD3JxcdxG5vO8vgZ1eR7C2mORJdxYynL9SJR__pD_rdt2IHbfcSIH2Fpw5wh-BVMu3TTKeESp6qD4Nl1go', 7200, '72_LbZu1ZoNlOHPoqHVRROZ_eGiaMHwqRE4dy3xa6QxpbvnlV5mfAiyyiI0wfUYcnCyruuudNtMlW50NBZNcAxBPeBu3TYILuhlA3rYzCgaNqo', 'oRrdQt10T_V0r-s6plNgUfVWrzns', NULL, NULL, 'oU5Yyt_J3cry6qhOzJE1qW-tdiVA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 11:03:08', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, 'oh', 'oh', 'https://thirdwx.qlogo.cn/mmopen/vi_32/5M4DYfvJP2dlsqQVmiclkxeGZrnnMf7hj6ryUR35INtKBicn7Whq0oPCdcJfotYxslSPGH2d8s2exvIicu8FYDXicg/132', 0, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (187, '79aca6b3-0552-4f19-8720-10efa034834f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-13 14:34:42', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (188, 'e4f08938-b416-4713-8c37-a157d006991f', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 12:03:46', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (189, '2392005b-1079-4e6b-9625-a295f5e482ec', 'WECHAT_OPEN_MOBILE', '72_Yg_G7_l9nv0ikzJ6Oe7h1q9bz5oU_cJ3TYUMhKxO2ZKudg1bYfhAYygNt95C_qRy_zqiAZVO8jYvxj89iQaRvl5dgKLJl4gAh2GZus6xYfw', 7200, '72_NWbKK4ucUpHoMmLTKSGxTKfMOau99ebYJoWHJkWtVndGLVB6SmwVSwOlavfbh1KHDKqh4RNw28FWl4SauyBCoicugrLnH528z3RyIqrYF9M', 'oRrdQt4tGXZURgaPWika1a7yRzOU', NULL, NULL, 'oU5YytwWSaDv2FD83GB_Ax1pbpzk', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 15:14:17', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/NEJsVswPcQnxDy3UBXcVGIpMwvn2FmJ6I1k5DoNZk0UcZwQEm7lCewbdneEEfCeVkVNXOIQOXw8evKBea5MBdA/132', 0, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (190, '13fec398-b9a0-4a3f-b878-bc892a0104b0', 'WECHAT_OPEN_MINI_PROGRAM', NULL, NULL, NULL, 'o02g45SvGqn2RyGeLcv0-OA3SxuU', NULL, NULL, 'oL1Fu5zL-AW5yb0w8naA7tB61vMo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 15:15:04', 'System', '2023-09-22 09:07:14', NULL, '1', '1', 6, NULL, NULL, NULL, NULL, 'wechat_open_mini_program'); +INSERT INTO `iot_social_user` VALUES (191, '338c3d89-a231-4b57-b5f0-cfe3d1f13850', 'WECHAT_OPEN_MOBILE', '72_4DWd6gR3GQIiXPpuagGrM5eILwEO4SfHWJIDwLMqp8I_2FJpBwdNL-Or9UhQ7T8BNKoV0GZ2lh9FaCHk_7LyABY3lmABBpee6Ok4W_KBX08', 7200, '72_iH1rgWvH35a-0O2aXSFSB9qWyXPF_JcChEpn-WFVeFzI1Scfw_1ZxhD8_tEZY5Wk5OMNCqh9WyOKBtO11pL0bUQIWyzYgoPiJHCA2NCrukw', 'oRrdQt10T_V0r-s6plNgUfVWrzns', NULL, NULL, 'oU5Yyt_J3cry6qhOzJE1qW-tdiVA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 15:34:45', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, 'oh', 'oh', 'https://thirdwx.qlogo.cn/mmopen/vi_32/5M4DYfvJP2dlsqQVmiclkxeGZrnnMf7hj6ryUR35INtKBicn7Whq0oPCdcJfotYxsla7j7Dvh5eWLLNxttY6gyYA/132', 0, 'wechat_open_mobile'); +INSERT INTO `iot_social_user` VALUES (192, 'oyyyv6RrMpgR22_BHD-Ne7TWsVMo', 'WECHAT_OPEN', '72_1RLeJ9QnQYJkiMs87FTBBMoK5h9ISBM3XZtPLveA6IetBtyejnDk5c7f-p0mC1RTHLxMkjC-e9KfX8l2y-0XqCPKav_0R20C-Tzbw95wlt0', 7200, '72_lcw1_ihZeBiAUFq4YPt3gc10tRBDMMhLKEsV-f7fZrZkd8xK5-tKbRXaCZL-Cbf4QkPbxnCPWb4svWODgBKMjUXc7g4W4qEkqgNg-4zllss', 'oyyyv6RrMpgR22_BHD-Ne7TWsVMo', NULL, NULL, 'oL1Fu5x1fapbFrUGWUStT0Vs6f4I', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 17:16:47', 'System', '2023-09-15 17:23:12', NULL, '1', '1', 8, 'shadow', 'shadow', 'https://thirdwx.qlogo.cn/mmopen/vi_32/74LllXzhnGtAwmn3AEwrRDYFegYX00yJphUlyk6iaQNYNWnLwSMuZ0JXnXicav8n01D0cgL9ptRrG4GX2NttSNcg/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (193, 'bd40330e-9ff0-4c2b-ba00-ff2c3a9cf9e3', 'wechat_open_web', '72_pg1i2Xl9vrW288PCqZybI56qq3-2Yin1o8nvKFAPCRx9OaS8HxJNHUVb6xuG5j_fQdwMecInJYxUpvTTUlJ659DsFOVYrr4RBCTI0sAEqBU', NULL, '72_v0sNSaJQyj8XUCk1bRPIl0A7TB8n4pN0mC807o7YGbPVXugt7aId7RAyb2hi9gsvd0aX2R4vAW-BnDtCTHPm_Un_AkW-mM8SYc44JuxMhOg', 'oyyyv6RrMpgR22_BHD-Ne7TWsVMo', NULL, NULL, 'oL1Fu5x1fapbFrUGWUStT0Vs6f4I', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 17:30:40', 'System', '2023-09-15 17:23:12', 'System', '1', '1', 8, 'shadow', 'shadow', 'https://thirdwx.qlogo.cn/mmopen/vi_32/74LllXzhnGtAwmn3AEwrRDYFegYX00yJphUlyk6iaQNYNWnLwSMuZ0JXnXicav8n01D0cgL9ptRrG4GX2NttSNcg/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (194, 'a8681dc9-f2cc-4316-a6a4-d8d43aa00e19', 'wechat_open_web', '72_44jRuqhWDZYQwgFJMFzJkNRKd3_w0m9npMlL7gv16EoEW2UZy6CbNfy_oSuhqMz28PnUHOJwAyC-Xv--LvNxSePhPu-K-FOajq-1BE10G2o', NULL, '72_wF_NsYq04JgoGpNVvq6EvbZjD7BDDz7XHpGfGA4bT61A_wf3ITbXSFhc57MJUwi_o-HhCfBJ9FnSEBu2nySYkDVTbQ457WZ-ZXDTkwo7OMc', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 18:13:09', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (195, '128d79bf-7573-40c6-bbca-ff5fcf2a0a71', 'wechat_open_web', '72_h2CaZanyW6eeDFw4jybBzdqYKIWBovGeEeB29G6WZEPDtZPiXANNrFRLEMmtd_HGLwv8YwqwBinOVTIxtrjwFcue_x_z9YJlgM5pfJFNHJA', NULL, '72_hK0QOqLAqq-5-0sbwA4_Kqs-nweY_HC0LTaprTL8n_nbZD8wwhPkil5b2-0Sk855gQ47NGTwczEAt-pCt8ZyZwkTEX0gtO6kcRp8Ajz2kew', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 18:13:47', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (196, '698dbf21-8b29-47fa-9946-19a82d067645', 'wechat_open_web', '72_smafRNdslVfgLL-x0nBV5JZO3jT_r3LJBwYw2HJQYpcGe7KKBSSYtIrqpsvVFY75Z7knhMefGlOf9r6s1sH9sjdmAq5EQAOCx2B5QexT3_U', NULL, '72_ongWXQyEHIhXich6claT-7BzZZJbTAb-0dlr245Ee8GO4I9MFplLxa9P5o8qGmgxWhh3h1HvpyYzCyIJ2xxMaS79GhdOhmv6ZJ0dyJN5tsI', 'oyyyv6RrMpgR22_BHD-Ne7TWsVMo', NULL, NULL, 'oL1Fu5x1fapbFrUGWUStT0Vs6f4I', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-14 18:49:36', 'System', '2023-09-15 17:23:12', 'System', '1', '1', 8, 'shadow', 'shadow', 'https://thirdwx.qlogo.cn/mmopen/vi_32/74LllXzhnGtAwmn3AEwrRDYFegYX00yJphUlyk6iaQNYNWnLwSMuZ0JXnXicav8n01D0cgL9ptRrG4GX2NttSNcg/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (197, 'f0fd123d-b82a-4eb9-a67a-fb81db6b739d', 'wechat_open_web', '72_eexrzOvM96xPvH3Lsl7viBOtnBHFDzFJdIz1d074PJxOhAB9qY0HE-NxnWm67afHT0zphQ4RyVEM1BOohhE32HN_D5yZVcMh24oMrSCPJYg', NULL, '72_W25_phPvOFAfeASpx050O28_pOfgtW0LsnuWYQZI6LIrMeVJnju7FrLTG5xuYG_awhD7crWRzpd-guJs2gZ3ZBVj7bSRtwIgSvgVRfzG0zs', 'oyyyv6RrMpgR22_BHD-Ne7TWsVMo', NULL, NULL, 'oL1Fu5x1fapbFrUGWUStT0Vs6f4I', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-15 11:49:37', 'System', '2023-09-15 17:23:12', 'System', '1', '1', 8, 'shadow', 'shadow', 'https://thirdwx.qlogo.cn/mmopen/vi_32/74LllXzhnGtAwmn3AEwrRDYFegYX00yJphUlyk6iaQNYNWnLwSMuZ0JXnXicav8n01D0cgL9ptRrG4GX2NttSNcg/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (198, '702797d1-04ef-4374-a618-aa2c3370135c', 'wechat_open_web', '72_BqSILWRpNzD35f9vkga9dMSHQp3bftJMa7eBpOXIepLh7zJVdBMUiPghVRz96hvtuCvvY7CryJtM5yuKx0tU4IJer4ZshmLHSw1Fl7jYtlo', NULL, '72_jJ0WZ-4r18IkeIs0YC6FfCS0QtCk9S5N1cqYeCIsKijORm2I1diDUE4zVLzYL5dUfxoVeUdHpYY8EyFBKQiWOzaGSECPPLw2bzQnigQzr-g', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-15 14:27:11', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (199, 'ebe3c9b0-6d17-4e7a-9d4b-a4d127e5f81e', 'wechat_open_web', '72_eahdqYL3gU93PJ1IWa6sIKwL4-XvLvCcMnkLYYI3au_8OQ2ZEwe5YHjnRKVzmXDkEfW_IUwCpSyGBLYaOS_ms4RfSI-TAH_s7lUnh_pwOpQ', NULL, '72_8RcuvSh7R88zZSjHyMfuROguXNJxl28CinaM0DMVnQdlvrLORUkT-ArLdWEY_ukrctsOppiY85xYUtZ8mRKit66-IMJauWckLptvbS6mVtk', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-15 16:14:33', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (200, 'a9865b55-498e-47e5-ab12-bfc028f9401a', 'wechat_open_web', '72_sDs8oTAz4diS5nsjQyO-y2aO2IXDYL0CkVFkHaA5gJDb1YCUqfmG9ejNR0-lsshtYwOOswE5s5hdIMkBXsUt_zuVK5nyTlJ3oi3sVrUEaP4', NULL, '72_Z9mP_wckNOwwmrA0eGB8lUB5CY23FvlLciZBegzfnyg10VW0GOe56QF0uM4rgtTha-kO7Uhasm2FIFdDdGKhriu8t1OYs2PEyYT-GOYauvA', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-15 16:16:30', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (201, '45ef2f02-0498-4a91-9b7e-7ec1fbba1f4f', 'wechat_open_web', '72_pj5qq79ny99dg-nnZztIDdBw6pxQUTOI7GC1-50zdFugMU3JhIUgoWKG_zISSOT63HSkuogl0GTSM7zV-7XaGRZoVvT3ks9e4No7qh4lmcM', NULL, '72_jJaohqyJXjiOai2Y1X2JGxinYVUpGYQhNrNRqRBEGDzY44zuPuNxJSIAvlXbJoZXwi57WfV2FxbLCfeUPCnBzypTR6MyAgnY7UBPzfnkO8E', 'oyyyv6RrMpgR22_BHD-Ne7TWsVMo', NULL, NULL, 'oL1Fu5x1fapbFrUGWUStT0Vs6f4I', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-15 17:22:53', 'System', '2023-09-15 17:23:12', 'System', '1', '1', 8, 'shadow', 'shadow', 'https://thirdwx.qlogo.cn/mmopen/vi_32/74LllXzhnGtAwmn3AEwrRDYFegYX00yJphUlyk6iaQNYNWnLwSMuZ0JXnXicav8n01D0cgL9ptRrG4GX2NttSNcg/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (202, '719938db-a623-427c-b0bb-f93ccc66e12e', 'wechat_open_web', '72_47aVnqUFSV_6B866IIt56eXQ4MCeaON9p6uNXDNd8tM9C1aDLc42MpMvPCh4gUJBr1CPk6W2BjaJdbp53mhvgJQ9mbVTHi3Rgt7S5lYa1uc', NULL, '72_ES4G1cNwL7SR5zxg7wSUtyh1JAMD3iHksu9PhfriYVa7BviNMKTBXq0XA92tRNDGTLbYyjpzXBsihDooqcYziiJjJNJZ8HV573kvdk5Js6g', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-15 18:01:00', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (203, '6c128697-f856-4cec-9b22-9c041e546aa9', 'wechat_open_web', '72_ouu4bb-uHrl6KXeQP_H_nI2cn0GBsiCAq4sJcwK0vEhi4DqPbvInOEpYwX1ljPsrxJ2a6iXf48A8SRDDT0G-jKPhs5qsI7MTUvylc3tIvIA', NULL, '72_8yFIgg2C-J3jomyS19ZQmPsNu_bwxoVe_pOjDQInuid5WH2SLBL5ul8NIXF4kFbBT5S1xDvQ9Wo0yGLgLg4kAwvGRRk2atyA9u85HLXRrCU', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 16:40:55', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (204, 'd78d0dfd-ea6a-419c-a95d-916f75ef8645', 'wechat_open_web', '72_In2RD2EUmBPN_cKpj_e_6WhSI0BFkOqOSGMAxPg8frEv3EExLiPv7H7p1VJFBoTXDRMUzxX4uBXJUanI3B38y2IO0T_T21WZWToph0Hqrfk', NULL, '72_ICxLSkfZYijpSu7nJwnOGVjwG0bLkwAlsKxMNYUAJF0O-hkVP44qlnSJjrEXvQ7tpId_-8uygb3EjfSYMBh1h5D-YtjYFTYgj-tQOcponpQ', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 16:48:25', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (205, '3057f429-575b-4116-b6c2-2be2ed0daa6a', 'wechat_open_web', '72_8RcuvSh7R88zZSjHyMfuRAU8ESiAbG5qYjyInId2yhXEwIsJ--rVPWI-ZuUTkJzBym4oNf7hFJtvwZWqv1S0H-poe26G0sU_ge92uPjC3J8', NULL, '72_j_d-U4TM9Uc6ZXfG_ckplSQX_umZya-Z-HssZe57QjB0rYvI0LP2nzWusHpAVu352zq7LXTNGd2X239O3wHqlPSJ9dstTukRWWYy3h0nnVQ', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 16:50:17', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (206, 'c0013cb3-7862-4477-b178-a1cf885ad278', 'wechat_open_web', '72_VO1uAiIQgD1l49wDcy5oqfq7Qp-e6qX8FDtdvgbGuib3T2JAZZrBC6wKunFue-O5fai49_Y2-Y_0NUldDAgGjFVGJ53FwA9sQH6W9yovX3Y', NULL, '72_ldWlbgKsd3GropvbdrgjzZMFOgKS8i8Cre678hFHSWlrGaQVjPR9WgRZftTWcQHA0vgDQM-wKERD7_LGC1qzKnxEeUPOH1cO_VztQ3ZCvM0', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 16:53:02', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (207, '243912df-6515-4821-a2d2-311869eb4b66', 'wechat_open_web', '72_nrEdUC4X_xkmBsNbtePmd4tyBTDyhAzb35Xp0ul9pUfRsMfG8GIVQrIvM-GIJXyvJ1n5BscRwmOKeZxxqfzKiQdq-WjWy0PVmKEJ7YV2p_8', NULL, '72_H4I7KKoI2DSFE3dSVXAzyGxz0OqTXT6d8kMvraXgA4nslgsCM6iLB_7d-aHGOhKjKOQbUAJb8-mOerc9YhfM1oPRb_nW4y1lvswt-QwXrRs', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 17:22:13', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (208, 'b14bbe72-eddb-4282-a42b-77281f61f27c', 'wechat_open_web', '72_eahdqYL3gU93PJ1IWa6sIHdTySn-4UB_nLAkQLGDSjY7CTMUE4EOSyKYEFSoZmq9Fs64RdAHCV3PJG4ifk_VlZaFkGopHrytcIScSIfyU6w', NULL, '72_8RcuvSh7R88zZSjHyMfuRKViN1EJKbd_ZCElj0V8epojZFlgv6LJZd_fBKE2hE3q9iUqj-0vPqndpMCdc-FfPUjbvDh4B5w1UtNv78wz1Ak', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 17:39:53', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (209, '56f25762-2dcc-4be2-a50e-934eac40e328', 'wechat_open_web', '72_GqYw5ylQK7W9nn_cd8keVairltJ1Fcyp9SsIORxMtkihL1iQecSo5Boclagxl-RXHnmdc7mo82DLkFkSqSTDn0JunfPAtAIyAZl5geONq88', NULL, '72_2PoE8DZBF2qybpGHXPHagdYdPtt3Un3YjomGW7pGF65KKYF8t-qd4scANEK1QguVv1ig6zEDvL7F7iFgNVGkkRTEicSq21-QyZ7jVul6J1Y', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 18:31:11', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); +INSERT INTO `iot_social_user` VALUES (210, '3a8b4ac4-8e24-4b23-b850-8fca2d90794b', 'wechat_open_web', '72_jJ0WZ-4r18IkeIs0YC6FfDOthAf9UIUNqALqUbYzBMirZuUh48M4AcVlp0Pjy4KbdA_OA1sWvkL1XWAcLa-KtqM-g-gF8Bz9DBfVUwcKGMU', NULL, '72_qfKdEHN3PH23LcmUsUrXoUmO2EkXUtRStVV_j7RabNi8Kuj8mhZYao9fZYCs_m_djArcug96q0TgX2Nxxnkk8LFOYQ26ODl0fy8ZLW6WW9c', 'oyyyv6arGVpFTY9CsqnSJtorlf-A', NULL, NULL, 'oL1Fu55rzFhAJtwkp2Cyl25PKHu0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-22 09:06:39', 'System', '2023-09-22 09:07:14', 'System', '1', '1', 6, '🍎', '🍎', 'https://thirdwx.qlogo.cn/mmopen/vi_32/1MKp7S9bHm212HicjST72CcvmbF1NCcY1SvXskO1vicrlIcuJt6jUBKcSgoOiaGBI2Jr7ic5ZjEpMNMA42joLjFBWA/132', NULL, 'wechat_open_web'); + +-- ---------------------------- +-- Table structure for iot_things_model +-- ---------------------------- +DROP TABLE IF EXISTS `iot_things_model`; +CREATE TABLE `iot_things_model` ( + `model_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '物模型ID', + `model_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '物模型名称', + `product_id` bigint(20) NOT NULL COMMENT '产品ID', + `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '租户名称', + `identifier` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标识符,产品下唯一', + `type` tinyint(1) NOT NULL COMMENT '模型类别(1-属性,2-功能,3-事件)', + `datatype` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据类型(integer、decimal、string、bool、array、enum)', + `specs` json NULL COMMENT '数据定义', + `is_chart` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否图表展示(0-否,1-是)', + `is_monitor` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否实时监测(0-否,1-是)', + `is_history` tinyint(1) NULL DEFAULT 0 COMMENT '是否历史存储(0-否,1-是)', + `is_readonly` tinyint(1) NULL DEFAULT 0 COMMENT '是否只读数据(0-否,1-是)', + `is_share_perm` tinyint(1) NULL DEFAULT 0 COMMENT '是否设备分享权限(0-否,1-是)', + `model_order` int(10) NULL DEFAULT 0 COMMENT '排序,值越大,排序越靠前', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `temp_slave_id` bigint(20) NULL DEFAULT NULL COMMENT '从机id', + `formula` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '计算公式', + `reverse_formula` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '控制公式', + `reg_addr` int(255) NULL DEFAULT NULL COMMENT '寄存器地址值', + `bit_option` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '位定义选项', + `value_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '解析类型 1.数值 2.选项', + `is_params` int(1) NULL DEFAULT NULL COMMENT '是否是计算参数', + `quantity` int(2) NULL DEFAULT NULL COMMENT '读取寄存器数量', + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'modbus功能码', + `parse_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'modbus解析类型', + PRIMARY KEY (`model_id`) USING BTREE, + INDEX `iot_things_model_index_product_id`(`product_id`) USING BTREE, + INDEX `iot_things_model_index_tenant_id`(`tenant_id`) USING BTREE, + INDEX `iot_things_model_index_model_order`(`model_order`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 500 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '物模型' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_things_model +-- ---------------------------- +INSERT INTO `iot_things_model` VALUES (113, '设备开关', 41, '温湿度智能开关', 1, 'admin', 'switch', 2, 'bool', '{\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}', 0, 0, 1, 0, 0, 9, '0', NULL, '2022-08-14 00:06:53', '', '2023-03-31 23:43:43', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (125, '空气温度', 41, '温湿度智能开关', 1, 'admin', 'temperature', 1, 'decimal', '{\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}', 1, 1, 1, 1, 0, 1, '0', NULL, '2022-11-05 23:56:21', '', '2023-03-31 23:44:21', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (126, '空气湿度', 41, '温湿度智能开关', 1, 'admin', 'humidity', 1, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"%\"}', 1, 1, 1, 1, 0, 3, '0', NULL, '2022-11-05 23:56:21', '', '2023-03-31 23:44:12', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (127, '二氧化碳', 41, '温湿度智能开关', 1, 'admin', 'co2', 1, 'integer', '{\"max\": 6000, \"min\": 100, \"step\": 1, \"type\": \"integer\", \"unit\": \"ppm\"}', 1, 1, 1, 1, 0, 2, '0', NULL, '2022-11-05 23:56:21', '', '2023-03-31 23:44:17', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (128, '室内亮度', 41, '温湿度智能开关', 1, 'admin', 'brightness', 1, 'integer', '{\"max\": 10000, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"cd/m2\"}', 1, 1, 1, 1, 0, 4, '0', NULL, '2022-11-05 23:56:21', '', '2023-03-31 23:44:08', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (129, '运行档位', 41, '温湿度智能开关', 1, 'admin', 'gear', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}', 0, 0, 1, 0, 0, 8, '0', NULL, '2022-11-05 23:56:21', '', '2023-03-31 23:43:49', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (130, '灯光色值', 41, '温湿度智能开关', 1, 'admin', 'light_color', 2, 'array', '{\"type\": \"array\", \"arrayType\": \"integer\", \"arrayCount\": \"3\"}', 0, 0, 1, 0, 0, 5, '0', NULL, '2022-11-05 23:56:21', '', '2023-09-25 22:57:42', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (131, '屏显消息', 41, '温湿度智能开关', 1, 'admin', 'message', 2, 'string', '{\"type\": \"string\", \"maxLength\": 1024}', 0, 0, 1, 0, 0, 7, '0', NULL, '2022-11-05 23:56:21', '', '2023-03-31 23:43:54', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (132, '上报数据', 41, '温湿度智能开关', 1, 'admin', 'report_monitor', 2, 'integer', '{\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}', 0, 0, 0, 0, 0, 10, '0', NULL, '2022-11-05 23:56:21', '', '2023-03-31 23:43:38', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (134, '环境温度过高', 41, '温湿度智能开关', 1, 'admin', 'height_temperature', 3, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}', 0, 0, 1, 0, 0, 0, '0', NULL, '2022-11-05 23:56:29', '', '2023-03-31 23:44:25', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (135, '设备发生异常', 41, '温湿度智能开关', 1, 'admin', 'exception', 3, 'string', '{\"type\": \"string\", \"maxLength\": 1024}', 0, 0, 1, 0, 0, 0, '0', NULL, '2022-11-05 23:56:29', '', '2023-03-31 23:44:29', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (161, '子设备', 96, '网关产品', 1, 'admin', 'device', 1, 'array', '{\"type\": \"array\", \"params\": [{\"id\": \"device_co2\", \"name\": \"二氧化碳\", \"order\": 0, \"isChart\": 1, \"datatype\": {\"max\": 6000, \"min\": 100, \"step\": 1, \"type\": \"integer\", \"unit\": \"ppm\", \"enumList\": [{\"text\": \"\", \"value\": \"\"}], \"arrayType\": \"int\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1, \"isSharePerm\": 0}, {\"id\": \"device_temperature\", \"name\": \"空气温度-只读\", \"order\": 4, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 1}, {\"id\": \"device_gear\", \"name\": \"运行档位\", \"order\": 6, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"device_switch\", \"name\": \"设备开关\", \"order\": 5, \"isChart\": 0, \"datatype\": {\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"device_report_monitor\", \"name\": \"上报监测数据\", \"order\": 9, \"isChart\": 0, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"device_irc\", \"name\": \"射频遥控\", \"order\": 1, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控学习\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}], \"arrayType\": \"object\", \"arrayCount\": \"5\"}', 0, 0, 0, 0, 1, 10, '0', NULL, '2023-02-25 22:51:53', '', '2023-09-25 23:13:21', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (162, '功能分组', 96, '网关产品', 1, 'admin', 'category', 1, 'object', '{\"type\": \"object\", \"params\": [{\"id\": \"category_light\", \"name\": \"光照\", \"order\": 1, \"isChart\": 1, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"category_humidity\", \"name\": \"空气湿度\", \"order\": 2, \"isChart\": 1, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"%\"}, \"isHistory\": 0, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"category_temperature\", \"name\": \"空气温度-只读\", \"order\": 3, \"isChart\": 0, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 1}, {\"id\": \"category_report_monitor\", \"name\": \"上报监测数据\", \"order\": 7, \"isChart\": 0, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"category_gear\", \"name\": \"运行档位\", \"order\": 5, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"category_switch\", \"name\": \"设备开关\", \"order\": 4, \"isChart\": 0, \"datatype\": {\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}, {\"id\": \"category_irc\", \"name\": \"射频遥控\", \"order\": 6, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控配对\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0, \"isSharePerm\": 1}]}', 0, 0, 0, 0, 1, 9, '0', NULL, '2023-02-25 22:51:53', '', '2023-09-03 11:03:24', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (163, '空气温度', 96, '网关产品', 1, 'admin', 'temperature', 1, 'decimal', '{\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}', 1, 1, 1, 1, 0, 0, '0', NULL, '2023-02-25 22:52:16', '', '2023-03-31 16:08:03', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (164, '设备开关', 96, '网关产品', 1, 'admin', 'switch', 2, 'bool', '{\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}', 0, 0, 1, 0, 1, 8, '0', NULL, '2023-02-25 22:52:16', '', '2023-09-03 11:03:30', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (165, '运行档位', 96, '网关产品', 1, 'admin', 'gear', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}', 0, 0, 1, 0, 1, 7, '0', NULL, '2023-02-25 22:52:16', '', '2023-09-03 11:03:41', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (166, '灯光色值', 96, '网关产品', 1, 'admin', 'light_color', 2, 'array', '{\"type\": \"array\", \"arrayType\": \"integer\", \"arrayCount\": \"3\"}', 0, 0, 1, 0, 0, 0, '0', NULL, '2023-02-25 22:52:16', '', '2023-03-31 16:08:09', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (167, '上报监测数据', 96, '网关产品', 1, 'admin', 'report_monitor', 2, 'integer', '{\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}', 0, 0, 1, 0, 1, 11, '0', NULL, '2023-02-25 22:52:16', '', '2023-09-03 11:03:11', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (168, '环境温度过高', 96, '网关产品', 1, 'admin', 'height_temperature', 3, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}', 0, 0, 1, 0, 0, 0, '0', NULL, '2023-02-25 22:52:16', '', '2023-03-31 16:08:15', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (169, '设备发生异常', 96, '网关产品', 1, 'admin', 'exception', 3, 'string', '{\"type\": \"string\", \"maxLength\": 1024}', 0, 0, 1, 0, 0, 0, '0', NULL, '2023-02-25 22:52:16', '', '2023-03-31 16:08:20', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (170, '屏显消息', 96, '网关产品', 1, 'admin', 'message', 2, 'string', '{\"type\": \"string\", \"maxLength\": 1024}', 0, 0, 1, 0, 1, 0, '0', NULL, '2023-02-25 22:52:35', '', '2023-09-03 11:03:55', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (171, '设备重启', 96, '网关产品', 1, 'admin', 'reset', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"重启\", \"value\": \"restart\"}]}', 0, 0, 1, 0, 1, 0, '0', NULL, '2023-02-25 22:52:35', '', '2023-09-03 11:03:48', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (174, '室内亮度', 96, '网关产品', 1, 'admin', 'brightness', 1, 'integer', '{\"max\": 10000, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"cd/m2\"}', 1, 1, 1, 1, 0, 0, '0', NULL, '2023-02-26 00:56:39', '', '2023-09-03 10:40:55', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (175, '设备重启', 41, '智能开关', 1, 'admin', 'reset', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"重启\", \"value\": \"restart\"}]}', 0, 0, 1, 0, 0, 6, '0', NULL, '2023-02-26 02:20:40', '', '2023-04-01 23:40:05', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (385, '射频遥控', 41, '★智能开关', 1, 'admin', 'irc', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控学习\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}', 0, 0, 1, 0, 0, 11, '0', 'admin', '2023-03-31 23:46:36', '', '2023-04-13 01:38:48', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (439, '上报状态', 41, '★智能开关产品', 1, 'admin', 'status', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"更新状态\", \"value\": \"update_status\"}]}', 0, 0, 0, 0, 0, 12, '0', 'admin', '2023-04-13 01:39:31', '', '2023-04-13 01:39:42', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model` VALUES (493, '漏水值', 112, '★MODBUS协议产品', 1, 'admin', '0', 1, 'integer', '{\"max\": 100, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"度\"}', 0, 0, 1, 0, 0, 0, '0', '', '2023-09-13 23:33:19', '', NULL, NULL, 1, NULL, NULL, 0, NULL, NULL, NULL, 1, '3', 'ushort'); +INSERT INTO `iot_things_model` VALUES (494, '温度', 112, '★MODBUS协议产品', 1, 'admin', '0', 1, 'integer', '{\"max\": 100, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"°\"}', 0, 0, 1, 0, 0, 0, '0', '', '2023-09-13 23:33:19', '', NULL, NULL, 2, NULL, NULL, 0, NULL, NULL, NULL, 1, '3', 'ushort'); +INSERT INTO `iot_things_model` VALUES (495, '电量', 112, '★MODBUS协议产品', 1, 'admin', '1', 1, 'integer', '{\"max\": 100, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"\"}', 0, 0, 1, 0, 0, 0, '0', '', '2023-09-13 23:33:19', '', NULL, NULL, 11, NULL, NULL, 1, NULL, NULL, NULL, 1, '3', 'ushort'); +INSERT INTO `iot_things_model` VALUES (499, '上报状态', 130, 'TCP测试设备', 1, 'admin', 'status', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"更新状态\", \"value\": \"update_status\"}]}', 0, 0, 0, 0, 1, 0, '0', 'admin', '2023-09-19 11:22:55', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for iot_things_model_template +-- ---------------------------- +DROP TABLE IF EXISTS `iot_things_model_template`; +CREATE TABLE `iot_things_model_template` ( + `template_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '物模型ID', + `template_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '物模型名称', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + `tenant_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '租户名称', + `identifier` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标识符,产品下唯一', + `type` tinyint(1) NOT NULL COMMENT '模型类别(1-属性,2-功能,3-事件)', + `datatype` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据类型(integer、decimal、string、bool、array、enum)', + `specs` json NULL COMMENT '数据定义', + `is_sys` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否系统通用(0-否,1-是)', + `is_chart` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否图表展示(0-否,1-是)', + `is_monitor` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否实时监测(0-否,1-是)', + `is_history` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否历史存储 (0-否,1-是)', + `is_readonly` tinyint(1) NULL DEFAULT 0 COMMENT '是否只读数据(0-否,1-是)', + `is_share_perm` tinyint(1) NULL DEFAULT 0 COMMENT '是否设备分享权限(0-否,1-是)', + `model_order` int(10) NULL DEFAULT 0 COMMENT '排序,值越大,排序越靠前', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `temp_slave_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '从机id', + `formula` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '计算公式', + `reverse_formula` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '控制公式', + `reg_addr` int(255) NULL DEFAULT NULL COMMENT '寄存器地址值', + `bit_option` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '位定义选项', + `value_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '解析类型 1.数值 2.选项', + `is_params` int(1) UNSIGNED ZEROFILL NULL DEFAULT NULL COMMENT '是否是计算参数,默认否 0=否,1=是', + `quantity` int(2) NULL DEFAULT NULL COMMENT '读取寄存器数量', + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'modbus功能码', + `old_identifier` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '旧的标识符', + `old_temp_slave_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '旧的从机id', + `parse_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'modbus解析类型', + PRIMARY KEY (`template_id`) USING BTREE, + INDEX `iot_things_model_template_index_tenant_id`(`tenant_id`) USING BTREE, + INDEX `iot_things_model_template_index_model_order`(`model_order`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 344 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '物模型模板' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of iot_things_model_template +-- ---------------------------- +INSERT INTO `iot_things_model_template` VALUES (1, '空气温度', 1, 'admin', 'temperature', 1, 'decimal', '{\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}', 1, 1, 1, 1, 1, 0, 4, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:12:06', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (2, '空气湿度', 1, 'admin', 'humidity', 1, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"%\"}', 1, 1, 1, 1, 1, 0, 3, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:12:02', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (3, '二氧化碳', 1, 'admin', 'co2', 1, 'integer', '{\"max\": 6000, \"min\": 100, \"step\": 1, \"type\": \"integer\", \"unit\": \"ppm\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:57', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (4, '室内亮度', 1, 'admin', 'brightness', 1, 'integer', '{\"max\": 10000, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"cd/m2\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:53', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (5, '设备开关', 1, 'admin', 'switch', 2, 'bool', '{\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}', 1, 0, 0, 1, 0, 0, 5, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:48', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (6, '运行档位', 1, 'admin', 'gear', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}', 1, 0, 0, 1, 0, 0, 6, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:43', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (7, '灯光色值', 1, 'admin', 'light_color', 2, 'array', '{\"type\": \"array\", \"arrayType\": \"integer\", \"arrayCount\": \"3\"}', 1, 0, 0, 1, 0, 0, 2, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:38', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (8, '屏显消息', 1, 'admin', 'message', 2, 'string', '{\"type\": \"string\", \"maxLength\": 1024}', 1, 0, 0, 1, 0, 0, 1, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:32', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (9, '上报监测数据', 1, 'admin', 'report_monitor', 2, 'integer', '{\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}', 1, 0, 0, 0, 0, 0, 9, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:25', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (10, '环境温度过高', 1, 'admin', 'height_temperature', 3, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}', 1, 0, 0, 1, 0, 0, 8, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:19', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (11, '设备发生异常', 1, 'admin', 'exception', 3, 'string', '{\"type\": \"string\", \"maxLength\": 1024}', 1, 0, 0, 1, 0, 0, 7, '0', 'admin', '2022-03-09 17:41:49', 'admin', '2023-04-10 01:11:16', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (12, '光照', 1, 'admin', 'light', 1, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}', 0, 1, 1, 1, 1, 0, 0, '0', 'wumei', '2022-05-07 09:41:17', 'admin', '2023-04-10 01:11:12', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (13, '压力', 1, 'admin', 'pressure', 1, 'decimal', '{\"max\": 200, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"帕斯卡\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2023-02-20 22:39:18', 'admin', '2023-04-10 01:11:05', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (14, '设备重启', 1, 'admin', 'reset', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"重启\", \"value\": \"restart\"}]}', 1, 0, 0, 1, 0, 0, 0, '0', 'admin', '2023-02-20 23:15:25', 'admin', '2023-04-10 01:11:08', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (15, '电池电压', 1, 'admin', 'voltage', 1, 'decimal', '{\"max\": 5, \"min\": 0, \"step\": 0.001, \"type\": \"decimal\", \"unit\": \"V\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2023-02-20 23:17:43', 'admin', '2023-04-10 01:10:56', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (16, '饮水量', 1, 'admin', 'shuiliang', 1, 'integer', '{\"max\": 500, \"min\": 80, \"step\": 1, \"type\": \"integer\", \"unit\": \"ML\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2023-02-20 23:18:39', 'admin', '2023-04-10 01:10:52', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (17, '灯光', 1, 'admin', 'light', 1, 'integer', '{\"max\": 1000, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"Lux\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2023-02-20 23:19:23', 'admin', '2023-04-10 01:10:49', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (18, '长度', 1, 'admin', 'length', 1, 'integer', '{\"max\": 2000, \"min\": 1, \"step\": 5, \"type\": \"integer\", \"unit\": \"M\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2023-02-20 23:20:03', 'admin', '2023-04-10 01:10:44', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (19, '心率', 1, 'admin', 'heart_rate', 1, 'integer', '{\"max\": 250, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2023-02-20 23:21:46', 'admin', '2023-04-10 01:12:40', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (20, '光照强度', 1, 'admin', 'light_level', 1, 'integer', '{\"max\": 89.2, \"min\": 2.5, \"step\": 0.1, \"type\": \"integer\", \"unit\": \"L/g\"}', 1, 1, 1, 1, 1, 0, 0, '0', 'admin', '2023-02-20 23:24:36', 'admin', '2023-04-10 01:10:35', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (21, '状态灯色', 1, 'admin', 'color', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"红色\", \"value\": \"0\"}, {\"text\": \"绿色\", \"value\": \"1\"}, {\"text\": \"蓝色\", \"value\": \"2\"}, {\"text\": \"黄色\", \"value\": \"3\"}]}', 1, 0, 0, 1, 0, 0, 0, '0', 'admin', '2023-02-20 23:26:24', 'admin', '2023-04-10 01:10:32', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (22, '子设备', 1, 'admin', 'device', 2, 'array', '{\"type\": \"array\", \"params\": [{\"id\": \"device_co2\", \"name\": \"二氧化碳\", \"order\": 0, \"isChart\": 1, \"datatype\": {\"max\": 6000, \"min\": 100, \"step\": 1, \"type\": \"integer\", \"unit\": \"ppm\", \"enumList\": [{\"text\": \"\", \"value\": \"\"}], \"arrayType\": \"int\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"device_temperature\", \"name\": \"空气温度-只读\", \"order\": 4, \"isChart\": 0, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\", \"enumList\": [{\"text\": \"\", \"value\": \"\"}], \"arrayType\": \"int\"}, \"isMonitor\": 0, \"isReadonly\": 1}, {\"id\": \"device_gear\", \"name\": \"运行档位\", \"order\": 6, \"datatype\": {\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_switch\", \"name\": \"设备开关\", \"order\": 5, \"datatype\": {\"type\": \"bool\", \"enumList\": [{\"text\": \"\", \"value\": \"\"}], \"trueText\": \"打开\", \"arrayType\": \"int\", \"falseText\": \"关闭\"}, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"device_report_monitor\", \"name\": \"上报监测数据\", \"order\": 9, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\", \"enumList\": [{\"text\": \"\", \"value\": \"\"}], \"arrayType\": \"int\"}, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}], \"arrayType\": \"object\", \"arrayCount\": 5}', 1, 0, 0, 0, 0, 0, 10, '0', 'admin', '2023-02-24 01:10:43', 'admin', '2023-04-13 01:33:38', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (23, '功能分组', 1, 'admin', 'group', 2, 'object', '{\"type\": \"object\", \"params\": [{\"id\": \"group_light\", \"name\": \"光照\", \"order\": 1, \"isChart\": 1, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}, \"isHistory\": 1, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"group_humidity\", \"name\": \"空气湿度\", \"order\": 2, \"isChart\": 1, \"datatype\": {\"max\": 100, \"min\": 0, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"%\"}, \"isMonitor\": 1, \"isReadonly\": 1}, {\"id\": \"group_temperature\", \"name\": \"空气温度-只读\", \"order\": 3, \"isChart\": 0, \"datatype\": {\"max\": 120, \"min\": -20, \"step\": 0.1, \"type\": \"decimal\", \"unit\": \"℃\"}, \"isMonitor\": 0, \"isReadonly\": 1}, {\"id\": \"group_report_monitor\", \"name\": \"上报监测数据\", \"order\": 7, \"datatype\": {\"max\": 10, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"次数\"}, \"isHistory\": 0, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"group_gear\", \"name\": \"运行档位\", \"order\": 5, \"datatype\": {\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"低速档位\", \"value\": \"0\"}, {\"text\": \"中速档位\", \"value\": \"1\"}, {\"text\": \"中高速档位\", \"value\": \"2\"}, {\"text\": \"高速档位\", \"value\": \"3\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"group_switch\", \"name\": \"设备开关\", \"order\": 4, \"datatype\": {\"type\": \"bool\", \"trueText\": \"打开\", \"falseText\": \"关闭\"}, \"isMonitor\": 0, \"isReadonly\": 0}, {\"id\": \"group_irc\", \"name\": \"红外遥控\", \"order\": 6, \"isChart\": 0, \"datatype\": {\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控学习\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}, \"isHistory\": 1, \"isMonitor\": 0, \"isReadonly\": 0}]}', 1, 0, 0, 0, 0, 0, 11, '0', 'admin', '2023-02-25 22:41:43', 'admin', '2023-08-30 15:29:34', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (201, '频率 ', 1, 'admin', 'frequency', 2, 'integer', '{\"max\": 65535, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"0.001Hz\"}', 1, 0, 0, 1, 0, 0, 0, '0', '', '2023-02-28 16:08:06', 'admin', '2023-04-10 03:37:11', NULL, '3#3', '%s*0.001', '', 27, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (225, '校验位', 1, 'admin', 'check', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"N\", \"value\": \"0\"}, {\"text\": \"O\", \"value\": \"1\"}, {\"text\": \"E\", \"value\": \"2\"}]}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-02-28 16:08:08', 'admin', '2023-04-10 21:36:01', NULL, '3#3', '', '', 771, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (226, '波特率', 1, 'admin', 'baud', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"select\", \"enumList\": [{\"text\": \"1200\", \"value\": \"0\"}, {\"text\": \"2400\", \"value\": \"1\"}, {\"text\": \"4800\", \"value\": \"2\"}, {\"text\": \"9600\", \"value\": \"3\"}, {\"text\": \"19200\", \"value\": \"4\"}]}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-02-28 16:08:09', 'admin', '2023-04-10 03:37:32', NULL, '3#3', '', '', 772, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (227, '电压', 1, 'admin', 'voltage', 1, 'integer', '{\"max\": 6, \"min\": 0.1, \"step\": 0.1, \"type\": \"integer\", \"unit\": \"v\"}', 1, 1, 1, 1, 1, 0, 0, '0', '', '2023-02-28 16:08:09', 'admin', '2023-04-10 03:37:16', NULL, '3#3', '', '', 773, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (236, '射频遥控', 1, 'admin', 'irc', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"遥控学习\", \"value\": \"FFXX01\"}, {\"text\": \"遥控清码\", \"value\": \"FFXX02\"}, {\"text\": \"打开开关\", \"value\": \"FFXX03\"}, {\"text\": \"关闭开关\", \"value\": \"FFXX04\"}, {\"text\": \"暂停\", \"value\": \"FFXX05\"}, {\"text\": \"锁定\", \"value\": \"FFXX06\"}]}', 1, 0, 0, 1, 0, 0, 0, '0', 'admin', '2023-03-31 23:46:20', 'admin', '2023-04-10 01:09:46', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (250, '漏水值', 1, 'admin', '0', 1, 'integer', '{\"max\": 100, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"度\"}', 1, 0, 0, 1, 0, 0, 0, '0', '', '2023-04-11 22:35:36', '', '2023-09-13 23:32:34', NULL, '1#1', NULL, NULL, 0, NULL, NULL, NULL, 1, '3', NULL, NULL, 'ushort'); +INSERT INTO `iot_things_model_template` VALUES (251, '温度', 1, 'admin', '0', 1, 'integer', '{\"max\": 100, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"°\"}', 1, 0, 0, 1, 0, 0, 0, '0', '', '2023-04-11 22:36:10', '', '2023-09-13 23:32:51', NULL, '1#2', NULL, NULL, 0, NULL, NULL, NULL, 1, '3', NULL, NULL, 'ushort'); +INSERT INTO `iot_things_model_template` VALUES (252, '电量', 1, 'admin', '1', 1, 'integer', '{\"max\": 100, \"min\": 1, \"step\": 1, \"type\": \"integer\", \"unit\": \"\"}', 1, 0, 0, 1, 0, 0, 0, '0', '', '2023-04-11 22:36:27', '', '2023-09-13 23:33:11', NULL, '1#11', NULL, NULL, 1, NULL, NULL, NULL, 1, '3', NULL, NULL, 'ushort'); +INSERT INTO `iot_things_model_template` VALUES (323, '上报状态', 1, 'admin', 'status', 2, 'enum', '{\"type\": \"enum\", \"showWay\": \"button\", \"enumList\": [{\"text\": \"更新状态\", \"value\": \"update_status\"}]}', 1, 0, 0, 0, 0, 1, 0, '0', 'admin', '2023-04-13 01:35:42', 'admin', '2023-09-03 10:50:16', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (324, 'X位移', 1, 'admin', 'x-shift', 1, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}', 1, 1, 1, 1, 1, 0, 0, '0', '', '2023-08-26 19:36:58', '', NULL, NULL, '2#1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (325, 'Y位移', 1, 'admin', 'y-shift', 1, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}', 1, 1, 1, 1, 1, 0, 0, '0', '', '2023-08-26 19:37:23', '', '2023-08-26 19:37:32', NULL, '2#1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (326, 'X位移', 1, 'admin', 'x-shift', 1, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}', 1, 1, 1, 1, 1, 0, 0, '0', '', '2023-08-26 19:38:31', '', NULL, NULL, '2#2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (327, 'Y位移', 1, 'admin', 'y-shift', 1, 'decimal', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"decimal\", \"unit\": \"mm\"}', 1, 1, 1, 1, 1, 0, 0, '0', '', '2023-08-26 19:38:51', '', NULL, NULL, '2#2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (328, '计件数量', 1, 'admin', '0', 1, 'integer', '{\"max\": 10000, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"\"}', 1, 0, 0, 0, 1, 0, 0, '0', '', '2023-08-28 15:05:25', '', NULL, NULL, '3#1', NULL, NULL, 0, NULL, NULL, NULL, 1, '3', NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (329, '参数1', 1, 'admin', '0', 1, 'integer', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"\"}', 1, 0, 0, 0, 1, 0, 0, '0', '', '2023-08-28 15:06:55', '', NULL, NULL, '3#2', NULL, NULL, 0, NULL, NULL, NULL, 1, '3', NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (330, '图片', 1, 'admin', 'image', 1, 'string', '{\"type\": \"string\", \"maxLength\": 10240}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-08-28 23:19:30', '', NULL, NULL, '2#1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (331, '回路状态', 10, 'jamon', 'loop_status', 1, 'array', '{\"type\": \"array\", \"arrayType\": \"integer\"}', 0, 0, 0, 0, 0, 0, 0, '0', '', '2023-08-29 18:21:38', '', NULL, NULL, '4#1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (332, '回路状态', 10, 'jamon', 'loop_status', 1, 'array', '{\"type\": \"array\", \"arrayType\": \"integer\"}', 0, 0, 0, 0, 0, 0, 0, '0', '', '2023-08-29 18:23:08', '', NULL, NULL, '4#2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (335, '湿度', 1, 'admin', '0', 1, 'integer', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"\"}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-08-30 14:05:38', '', '2023-08-30 14:58:28', NULL, '6#1', '%s/10', NULL, 0, NULL, NULL, NULL, 1, '3', NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (336, '温度', 1, 'admin', '1', 1, 'integer', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"°C\"}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-08-30 14:06:05', '', '2023-08-30 14:58:38', NULL, '6#1', '%s/10', NULL, 1, NULL, NULL, NULL, 1, '3', NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (341, '视频', 1, 'admin', 'video', 1, 'integer', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"\"}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-08-30 23:08:51', '', '2023-08-30 23:25:15', NULL, '2#1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (342, '图片', 1, 'admin', 'image', 1, 'string', '{\"type\": \"string\", \"maxLength\": 1024}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-08-30 23:21:48', '', '2023-08-30 23:25:22', NULL, '2#2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `iot_things_model_template` VALUES (343, '状态', 1, 'admin', 'status', 1, 'integer', '{\"max\": 100, \"min\": 0, \"step\": 1, \"type\": \"integer\", \"unit\": \"\"}', 1, 0, 0, 1, 1, 0, 0, '0', '', '2023-08-30 23:28:00', '', '2023-08-30 23:28:17', NULL, '2#1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for news +-- ---------------------------- +DROP TABLE IF EXISTS `news`; +CREATE TABLE `news` ( + `news_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '新闻ID', + `title` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标题', + `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '内容', + `img_url` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '封面', + `is_top` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否置顶(0-置顶 1-置顶)', + `is_banner` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否banner(0-是banner 1-不是banner)', + `category_id` bigint(20) NOT NULL COMMENT '分类ID', + `category_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '分类名称', + `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '新闻状态(0-未发布,1-已发布)', + `author` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '作者', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`news_id`) USING BTREE, + INDEX `news_index_category_id`(`category_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '新闻资讯' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of news +-- ---------------------------- +INSERT INTO `news` VALUES (1, '广告图一', '

请后台添加内容

', '/iot/tool/download?fileName=/profile/iot/118/2022-0424-215805.png', 0, 1, 2, '相关产品', 1, '物美智能', '0', '', '2022-05-12 12:13:40', '', '2022-05-12 12:13:40', '物美智能'); +INSERT INTO `news` VALUES (2, '广告图二', '

请后台添加内容

', '/iot/tool/download?fileName=/profile/iot/118/2022-0424-215852.png', 0, 1, 1, '新闻资讯', 1, '物美智能', '0', '', '2022-05-12 12:13:42', '', '2022-05-12 12:13:42', '物美智能'); +INSERT INTO `news` VALUES (3, '广告图三', '

后台添加内容

', '/iot/tool/download?fileName=/profile/iot/118/2022-0424-224553.png', 0, 1, 2, '相关产品', 1, '物美智能', '0', '', '2022-05-12 12:13:44', '', '2022-05-12 12:13:44', '物美智能'); +INSERT INTO `news` VALUES (4, '物美智能-快速搭建物联网和智能家居平台', '

物美智能 wumei-smart 是一个简单易用的生活物联网平台。可用于搭建物联网平台以及二次开发和学习。设备接入使用EMQX消息服务器,加密认证;后端采用Spring boot;前端采用Vue;移动端采用Uniapp;数据库采用Mysql和Redis;设备端支持ESP32、ESP8266、树莓派等;


系统功能介绍


1.权限管理: 用户管理、部门管理、岗位管理、菜单管理、角色管理、字典和参数管理等


2.系统监控: 操作日志、登录日志、系统日志、在线用户、服务监控、连接池监控、缓存监控等


3.产品管理: 产品、产品物模型、产品分类、产品固件、授权码等


4.设备管理: 控制、分组、定时、日志、统计、定位、OTA升级、影子模式、实时监测、加密认证等


5.EMQ管理: Mqtt客户端、监听器、消息主题、消息订阅、插件管理、规则引擎、资源


6.硬件 SDK: 支持WIFI和MQTT连接、物模型响应、实时监测、定时上报监测数据、AES加密、NTP时间等


7.物模型管理: 属性(设备状态和监测数据),功能(执行特定任务),事件(设备主动上报给云端)


8.其他(开发中):第三方登录,设备分享、设备告警、场景联动(进度50%),智能音箱、多租户、APP界面自定义(进度40%),时序数据库、分布式集群部署、Granfa监控(进度30%),视频流处理、桌面端模拟器/监控、安卓端模拟器/监控(进度20%)




硬件设备接入流程


1.设备认证:加密认证、简单认证和emqx支持的多种认证方式。

2.设备交互:发布和订阅物模型、设备信息、设备升级和时钟同步等mqtt主题

', '/iot/tool/download?fileName=/profile/iot/1/2022-0508-133031.png', 1, 0, 2, '相关产品', 1, '物美智能', '0', '', '2022-05-12 12:13:46', '', '2022-05-12 12:13:46', '物美智能'); +INSERT INTO `news` VALUES (5, '2022年中国物联网全景图产业链上中下游市场及企业剖析', '

后台添加内容

', '/iot/tool/download?fileName=/profile/iot/118/2022-0424-224151.png', 1, 0, 1, '新闻资讯', 1, '物美智能', '0', '', '2022-05-12 12:13:48', '', '2022-05-12 12:13:48', '物美智能'); +INSERT INTO `news` VALUES (6, 'Arm打造物联网全面解决方案 携手合作伙伴共探智能未来', '

后台添加内容

', '/iot/tool/download?fileName=/profile/iot/118/2022-0424-224352.png', 1, 0, 1, '新闻资讯', 1, '物美智能', '0', '', '2022-05-12 12:13:50', '', '2022-05-12 12:13:50', '物美智能'); +INSERT INTO `news` VALUES (7, '使用ESP32开发板,快速学习物联网开发', '

请后台添加内容

', '/iot/tool/download?fileName=/profile/iot/118/2022-0428-130824.jpg', 1, 0, 2, '相关产品', 1, '物美智能', '0', '', '2022-05-12 12:13:53', '', '2022-05-12 12:13:53', '物美智能'); +INSERT INTO `news` VALUES (8, '物联网赛道观察之无源物联网', '

无源物联网,即终端无外接能量源,采用获取环境能量的方式进行供能的物联网技术。在当前物联网技术发展条件下,终端覆盖率是一个亟待解决的问题,而无源物联网凭借其极低的部署和维护成本、灵活多变的应用场景成为解决更广范围内终端供能需求问题、实现“千亿级互联”愿景的关键。


无源物联网技术的发展最终有赖于环境能量采集、低功耗计算与反向散射等低功耗通讯技术的进步。目前无源物联网应用较为成熟的路线主要包括射频识别技术(RFID)与近场通信技术(NFC)两类,覆盖仓储物流、智能制造、智慧零售、资产管理、物业服务等多元应用场景。未来,随着物联网行业的碎片化整合以及以Bluetooth、5G、LoRa等为媒介进行能量采集与信息传输的技术路线的逐渐成熟,当前困扰行业的诸多问题将会逐步得到解决,随之而来的是更包罗多样的无源终端需求与极具潜力的应用场景。

', '/iot/tool/download?fileName=/profile/iot/118/2022-0424-215643.png', 1, 0, 1, '新闻资讯', 1, '物美智能', '0', '', '2022-05-12 12:13:55', '', '2022-05-12 12:13:55', '物美智能'); + +-- ---------------------------- +-- Table structure for news_category +-- ---------------------------- +DROP TABLE IF EXISTS `news_category`; +CREATE TABLE `news_category` ( + `category_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID', + `category_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '分类名称', + `order_num` int(2) NOT NULL COMMENT '显示顺序', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`category_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '新闻分类' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of news_category +-- ---------------------------- +INSERT INTO `news_category` VALUES (1, '新闻资讯', 3, '0', '', '2022-04-11 20:53:55', '', '2022-04-13 15:30:22', '新闻资讯信息'); +INSERT INTO `news_category` VALUES (2, '相关产品', 2, '0', '', '2022-04-11 20:54:16', '', '2022-04-13 15:30:15', '相关产品推荐'); + +-- ---------------------------- +-- Table structure for oauth_access_token +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_access_token`; +CREATE TABLE `oauth_access_token` ( + `token_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `token` blob NULL, + `authentication_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `authentication` blob NULL, + `refresh_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_access_token +-- ---------------------------- +INSERT INTO `oauth_access_token` VALUES ('d406d946aac7c24cd01a2df1105ec898', 0xACED0005737200436F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E636F6D6D6F6E2E44656661756C744F4175746832416363657373546F6B656E0CB29E361B24FACE0200064C00156164646974696F6E616C496E666F726D6174696F6E74000F4C6A6176612F7574696C2F4D61703B4C000A65787069726174696F6E7400104C6A6176612F7574696C2F446174653B4C000C72656672657368546F6B656E74003F4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F636F6D6D6F6E2F4F417574683252656672657368546F6B656E3B4C000573636F706574000F4C6A6176612F7574696C2F5365743B4C0009746F6B656E547970657400124C6A6176612F6C616E672F537472696E673B4C000576616C756571007E000578707372001E6A6176612E7574696C2E436F6C6C656374696F6E7324456D7074794D6170593614855ADCE7D002000078707372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000018AA760D163787372004C6F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E636F6D6D6F6E2E44656661756C744578706972696E674F417574683252656672657368546F6B656E2FDF47639DD0C9B70200014C000A65787069726174696F6E71007E0002787200446F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E636F6D6D6F6E2E44656661756C744F417574683252656672657368546F6B656E73E10E0A6354D45E0200014C000576616C756571007E0005787074001B56452D377744386D70414A34497A662D49345F456450316F31626F7371007E000977080000018AA760D12D78737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65536574801D92D18F9B80550200007872002C6A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65436F6C6C656374696F6E19420080CB5EF71E0200014C0001637400164C6A6176612F7574696C2F436F6C6C656374696F6E3B7870737200176A6176612E7574696C2E4C696E6B656448617368536574D86CD75A95DD2A1E020000787200116A6176612E7574696C2E48617368536574BA44859596B8B7340300007870770C000000043F400000000000027400047265616474000577726974657874000662656172657274001B70385A5F47384A7349327A33786575674430646A494B305A396B38, '2c27d3f4516a653753e8337094cf35e1', 'admin', 'admin-dueros', 0xACED0005737200416F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F417574683241757468656E7469636174696F6EBD400B02166252130200024C000D73746F7265645265717565737474003C4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F4F4175746832526571756573743B4C00127573657241757468656E7469636174696F6E7400324C6F72672F737072696E676672616D65776F726B2F73656375726974792F636F72652F41757468656E7469636174696F6E3B787200476F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E416273747261637441757468656E7469636174696F6E546F6B656ED3AA287E6E47640E0200035A000D61757468656E746963617465644C000B617574686F7269746965737400164C6A6176612F7574696C2F436F6C6C656374696F6E3B4C000764657461696C737400124C6A6176612F6C616E672F4F626A6563743B787000737200266A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654C697374FC0F2531B5EC8E100200014C00046C6973747400104C6A6176612F7574696C2F4C6973743B7872002C6A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65436F6C6C656374696F6E19420080CB5EF71E0200014C00016371007E00047870737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000007704000000007871007E000C707372003A6F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F41757468325265717565737400000000000000010200075A0008617070726F7665644C000B617574686F72697469657371007E00044C000A657874656E73696F6E7374000F4C6A6176612F7574696C2F4D61703B4C000B72656469726563745572697400124C6A6176612F6C616E672F537472696E673B4C00077265667265736874003B4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F546F6B656E526571756573743B4C000B7265736F7572636549647374000F4C6A6176612F7574696C2F5365743B4C000D726573706F6E7365547970657371007E0011787200386F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E426173655265717565737436287A3EA37169BD0200034C0008636C69656E74496471007E000F4C001172657175657374506172616D657465727371007E000E4C000573636F706571007E0011787074000C61646D696E2D647565726F73737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654D6170F1A5A8FE74F507420200014C00016D71007E000E7870737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C77080000001000000009740004636F64657400066E777064716174000A6772616E745F74797065740012617574686F72697A6174696F6E5F636F646574000573636F706574000A7265616420777269746574000D726573706F6E73655F74797065740004636F646574000C72656469726563745F75726974004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F65326566636666663936383964633462366166363764373865313039363934647400057374617465740020346635653763303462313731306262653836376535376431373434613534373874000D636C69656E745F7365637265747400205332456E65487864745E4D48684276384E23245E7479366E71244E5159324E6474000A647565726F735F7569647400203466356537633034623137313062626538363765353764313734346135343738740009636C69656E745F696474000C61646D696E2D647565726F7378737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65536574801D92D18F9B80550200007871007E0009737200176A6176612E7574696C2E4C696E6B656448617368536574D86CD75A95DD2A1E020000787200116A6176612E7574696C2E48617368536574BA44859596B8B7340300007870770C000000103F4000000000000274000472656164740005777269746578017371007E002E770C000000103F40000000000001737200426F72672E737072696E676672616D65776F726B2E73656375726974792E636F72652E617574686F726974792E53696D706C654772616E746564417574686F7269747900000000000002260200014C0004726F6C6571007E000F787074000A524F4C455F41444D494E787371007E00173F40000000000000770800000010000000007874004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F6532656663666666393638396463346236616636376437386531303936393464707371007E002E770C000000103F4000000000000174000F737065616B65722D73657276696365787371007E002E770C000000103F4000000000000171007E0020787372004F6F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E557365726E616D6550617373776F726441757468656E7469636174696F6E546F6B656E00000000000002260200024C000B63726564656E7469616C7371007E00054C00097072696E636970616C71007E00057871007E0003017372001F6A6176612E7574696C2E436F6C6C656374696F6E7324456D7074794C6973747AB817B43CA79EDE0200007870737200486F72672E737072696E676672616D65776F726B2E73656375726974792E7765622E61757468656E7469636174696F6E2E57656241757468656E7469636174696F6E44657461696C7300000000000002260200024C000D72656D6F74654164647265737371007E000F4C000973657373696F6E496471007E000F787074000F303A303A303A303A303A303A303A3170707372002E636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E6D6F64656C2E4C6F67696E55736572000000000000000102000B4C000762726F7773657271007E000F4C00066465707449647400104C6A6176612F6C616E672F4C6F6E673B4C000A65787069726554696D6571007E00434C000669706164647271007E000F4C000D6C6F67696E4C6F636174696F6E71007E000F4C00096C6F67696E54696D6571007E00434C00026F7371007E000F4C000B7065726D697373696F6E7371007E00114C0005746F6B656E71007E000F4C00047573657274002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973557365723B4C000675736572496471007E004378707400094368726F6D652031317372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000677371007E00470000018AAC097C437400093132372E302E302E31740008E58685E7BD9149507371007E00470000018AA6E3204374000A57696E646F77732031307371007E002E770C000000023F400000000000017400052A3A2A3A2A7874002439326462396566652D656438662D343965392D613839392D3664393431633333393237637372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E5379735573657200000000000000010200124C000661766174617271007E000F4C000764656C466C616771007E000F4C00046465707474002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973446570743B4C000664657074496471007E00434C0005656D61696C71007E000F4C00096C6F67696E446174657400104C6A6176612F7574696C2F446174653B4C00076C6F67696E497071007E000F4C00086E69636B4E616D6571007E000F4C000870617373776F726471007E000F4C000B70686F6E656E756D62657271007E000F5B0007706F73744964737400115B4C6A6176612F6C616E672F4C6F6E673B4C0006726F6C65496471007E00435B0007726F6C6549647371007E00554C0005726F6C657371007E00084C000373657871007E000F4C000673746174757371007E000F4C000675736572496471007E00434C0008757365724E616D6571007E000F78720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E000F4C000A63726561746554696D6571007E00544C0006706172616D7371007E000E4C000672656D61726B71007E000F4C000B73656172636856616C756571007E000F4C0008757064617465427971007E000F4C000A75706461746554696D6571007E0054787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED850787371007E00173F400000000000007708000000100000000078740009E7AEA1E79086E59198707070740000740001307372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E53797344657074000000000000000102000C4C0009616E636573746F727371007E000F4C00086368696C6472656E71007E00084C000764656C466C616771007E000F4C000664657074496471007E00434C0008646570744E616D6571007E000F4C0005656D61696C71007E000F4C00066C656164657271007E000F4C00086F726465724E756D7400134C6A6176612F6C616E672F496E74656765723B4C0008706172656E74496471007E00434C000A706172656E744E616D6571007E000F4C000570686F6E6571007E000F4C000673746174757371007E000F7871007E005670707371007E00173F40000000000000770800000010000000007870707070740009302C3130302C3130317371007E000B00000000770400000000787071007E004974000CE7A094E58F91E983A8E997A870740006E789A9E7BE8E737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E0048000000017371007E0047000000000000006570707400013171007E00497400103136343737303730374071712E636F6D7371007E005977080000018AA651C3B8787400093132372E302E302E3174000FE89C82E4BFA1E7AEA1E79086E5919874003C2432612431302451416F77377962733734666B53574A444A6B56544E656F6746376D686E69684637535445727437385078446848694E6E6F3449557574000B31353838383838383838387070707371007E000B000000017704000000017372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E537973526F6C65000000000000000102000D5A001164657074436865636B5374726963746C795A0004666C61675A00116D656E75436865636B5374726963746C794C00096461746153636F706571007E000F4C000764656C466C616771007E000F5B00076465707449647371007E00555B00076D656E7549647371007E00554C000B7065726D697373696F6E7371007E00114C0006726F6C65496471007E00434C0007726F6C654B657971007E000F4C0008726F6C654E616D6571007E000F4C0008726F6C65536F727471007E00604C000673746174757371007E000F7871007E005670707371007E00173F4000000000000077080000001000000000787070707000000074000131707070707371007E0047000000000000000174000561646D696E74000FE8B685E7BAA7E7AEA1E79086E5919871007E00687400013078740001307400013071007E007674000561646D696E71007E0076, '4cabc0e9bcfa34131342209bdaf275eb'); + +-- ---------------------------- +-- Table structure for oauth_approvals +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_approvals`; +CREATE TABLE `oauth_approvals` ( + `userId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `clientId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `scope` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `expiresAt` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0), + `lastModifiedAt` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0) +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_approvals +-- ---------------------------- +INSERT INTO `oauth_approvals` VALUES ('admin', 'admin-dueros', 'read', 'APPROVED', '2023-10-18 22:12:45', '2023-09-18 22:12:45'); +INSERT INTO `oauth_approvals` VALUES ('admin', 'admin-dueros', 'write', 'APPROVED', '2023-10-18 22:12:45', '2023-09-18 22:12:45'); + +-- ---------------------------- +-- Table structure for oauth_client_details +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_client_details`; +CREATE TABLE `oauth_client_details` ( + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '客户端ID', + `resource_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端所能访问的资源id集合,多个资源时用逗号(,)分隔', + `client_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端秘钥', + `scope` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限范围,可选值包括read,write,trust;若有多个权限范围用逗号(,)分隔', + `authorized_grant_types` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '授权模式,可选值包括authorization_code,password,refresh_token,implicit,client_credentials, 若支持多个grant_type用逗号(,)分隔', + `web_server_redirect_uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '回调地址', + `authorities` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限', + `access_token_validity` int(11) NULL DEFAULT NULL COMMENT '设定客户端的access_token的有效时间值(单位:秒)', + `refresh_token_validity` int(11) NULL DEFAULT NULL COMMENT '设定客户端的refresh_token的有效时间值(单位:秒)', + `additional_information` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '预留的字段,在Oauth的流程中没有实际的使用,可选,但若设置值,必须是JSON格式的数据', + `autoapprove` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设置用户是否自动Approval操作, 默认值为 \'false\', 可选值包括 \'true\',\'false\', \'read\',\'write\'. \n该字段只适用于grant_type=\"authorization_code\"的情况,当用户登录成功后,若该值为\'true\'或支持的scope值,则会跳过用户Approve的页面, 直接授权. ', + `type` tinyint(1) NULL DEFAULT NULL COMMENT '1=小度(DuerOS),2=天猫精灵(ALiGenie),3=小米小爱', + PRIMARY KEY (`client_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_client_details +-- ---------------------------- +INSERT INTO `oauth_client_details` VALUES ('admin-dueros', 'speaker-service', 'S2EneHxdt^MHhBv8N#$^ty6nq$NQY2Nd', 'read,write', 'authorization_code,refresh_token', 'https://xiaodu.baidu.com/saiya/auth/e2efcfff9689dc4b6af67d78e109694d', 'ROLE_ADMIN', 7200, 7200, NULL, 'false', 1); +INSERT INTO `oauth_client_details` VALUES ('fastbee-dueros', 'speaker-service', 'S2EneHxdt^MHhBv8N#$^ty6nq$NQY2Nc', 'read,write', 'authorization_code,refresh_token', 'https://xiaodu.baidu.com/saiya/auth/35dc8a5b53719ea6bbb7bd818ca8d5b6', 'ROLE_ADMIN', 7200, 7200, NULL, 'false', 1); +INSERT INTO `oauth_client_details` VALUES ('speaker', 'speaker-service', '$2a$10$jMEhxWXpc6KsMyFF0JJ3kuoVHOp.tEsTCvaJHnQqfGtYKo4.scv/m', 'read,write', 'client_credentials,password,authorization_code,implicit,refresh_token', 'https://xiaodu.baidu.com/saiya/auth/22c6bd1489c8396f00cc25bf2d9d0206', 'ROLE_ADMIN', 7200, 7200, NULL, 'false', 1); +INSERT INTO `oauth_client_details` VALUES ('tianmao', 'speaker-service', '$2a$10$jMEhxWXpc6KsMyFF0JJ3kuoVHOp.tEsTCvaJHnQqfGtYKo4.scv/m', 'read,write', 'authorization_code,refresh_token', '\r\nhttps://xiaodu.baidu.com/saiya/auth/22c6bd1489c8396f00cc25bf2d9d0206', 'ROLE_ADMIN', 7200, 7200, NULL, 'true', 2); +INSERT INTO `oauth_client_details` VALUES ('xiaoai', 'speaker-service', '$2a$10$jMEhxWXpc6KsMyFF0JJ3kuoVHOp.tEsTCvaJHnQqfGtYKo4.scv/m', 'read,write', 'authorization_code,refresh_token', 'https://xiaodu.baidu.com/saiya/auth/22c6bd1489c8396f00cc25bf2d9d0206', 'ROLE_ADMIN', 7200, 7200, NULL, 'true', 3); +INSERT INTO `oauth_client_details` VALUES ('xiaoyi', 'speaker-service', '$2a$10$jMEhxWXpc6KsMyFF0JJ3kuoVHOp.tEsTCvaJHnQqfGtYKo4.scv/m', 'read,write', 'authorization_code,refresh_token', 'https://xiaodu.baidu.com/saiya/auth/22c6bd1489c8396f00cc25bf2d9d0206', 'ROLE_ADMIN', 7200, 7200, NULL, 'false', 4); + +-- ---------------------------- +-- Table structure for oauth_client_token +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_client_token`; +CREATE TABLE `oauth_client_token` ( + `token_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `token` blob NULL, + `authentication_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_client_token +-- ---------------------------- + +-- ---------------------------- +-- Table structure for oauth_code +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_code`; +CREATE TABLE `oauth_code` ( + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `authentication` blob NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_code +-- ---------------------------- +INSERT INTO `oauth_code` VALUES ('mLAeh7', 0xACED0005737200416F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F417574683241757468656E7469636174696F6EBD400B02166252130200024C000D73746F7265645265717565737474003C4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F4F4175746832526571756573743B4C00127573657241757468656E7469636174696F6E7400324C6F72672F737072696E676672616D65776F726B2F73656375726974792F636F72652F41757468656E7469636174696F6E3B787200476F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E416273747261637441757468656E7469636174696F6E546F6B656ED3AA287E6E47640E0200035A000D61757468656E746963617465644C000B617574686F7269746965737400164C6A6176612F7574696C2F436F6C6C656374696F6E3B4C000764657461696C737400124C6A6176612F6C616E672F4F626A6563743B787000737200266A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654C697374FC0F2531B5EC8E100200014C00046C6973747400104C6A6176612F7574696C2F4C6973743B7872002C6A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65436F6C6C656374696F6E19420080CB5EF71E0200014C00016371007E00047870737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000007704000000007871007E000C707372003A6F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F41757468325265717565737400000000000000010200075A0008617070726F7665644C000B617574686F72697469657371007E00044C000A657874656E73696F6E7374000F4C6A6176612F7574696C2F4D61703B4C000B72656469726563745572697400124C6A6176612F6C616E672F537472696E673B4C00077265667265736874003B4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F546F6B656E526571756573743B4C000B7265736F7572636549647374000F4C6A6176612F7574696C2F5365743B4C000D726573706F6E7365547970657371007E0011787200386F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E426173655265717565737436287A3EA37169BD0200034C0008636C69656E74496471007E000F4C001172657175657374506172616D657465727371007E000E4C000573636F706571007E0011787074000C61646D696E2D647565726F73737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654D6170F1A5A8FE74F507420200014C00016D71007E000E7870737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F400000000000067708000000080000000474000D726573706F6E73655F74797065740004636F646574000C72656469726563745F75726974004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F6532656663666666393638396463346236616636376437386531303936393464740009636C69656E745F696471007E001474000573636F706574000A7265616420777269746578737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65536574801D92D18F9B80550200007871007E0009737200176A6176612E7574696C2E4C696E6B656448617368536574D86CD75A95DD2A1E020000787200116A6176612E7574696C2E48617368536574BA44859596B8B7340300007870770C000000103F4000000000000274000472656164740005777269746578017371007E0023770C000000103F40000000000001737200426F72672E737072696E676672616D65776F726B2E73656375726974792E636F72652E617574686F726974792E53696D706C654772616E746564417574686F7269747900000000000002260200014C0004726F6C6571007E000F787074000A524F4C455F41444D494E787371007E00173F40000000000000770800000010000000007874004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F6532656663666666393638396463346236616636376437386531303936393464707371007E0023770C000000103F4000000000000174000F737065616B65722D73657276696365787371007E0023770C000000103F4000000000000171007E001A787372004F6F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E557365726E616D6550617373776F726441757468656E7469636174696F6E546F6B656E00000000000002260200024C000B63726564656E7469616C7371007E00054C00097072696E636970616C71007E00057871007E0003017372001F6A6176612E7574696C2E436F6C6C656374696F6E7324456D7074794C6973747AB817B43CA79EDE0200007870737200486F72672E737072696E676672616D65776F726B2E73656375726974792E7765622E61757468656E7469636174696F6E2E57656241757468656E7469636174696F6E44657461696C7300000000000002260200024C000D72656D6F74654164647265737371007E000F4C000973657373696F6E496471007E000F787074000F303A303A303A303A303A303A303A3170707372002E636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E6D6F64656C2E4C6F67696E55736572000000000000000102000B4C000762726F7773657271007E000F4C00066465707449647400104C6A6176612F6C616E672F4C6F6E673B4C000A65787069726554696D6571007E00384C000669706164647271007E000F4C000D6C6F67696E4C6F636174696F6E71007E000F4C00096C6F67696E54696D6571007E00384C00026F7371007E000F4C000B7065726D697373696F6E7371007E00114C0005746F6B656E71007E000F4C00047573657274002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973557365723B4C000675736572496471007E003878707400094368726F6D652031317372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000677371007E003C0000018AAC097C437400093132372E302E302E31740008E58685E7BD9149507371007E003C0000018AA6E3204374000A57696E646F77732031307371007E0023770C000000023F400000000000017400052A3A2A3A2A7874002439326462396566652D656438662D343965392D613839392D3664393431633333393237637372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E5379735573657200000000000000010200124C000661766174617271007E000F4C000764656C466C616771007E000F4C00046465707474002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973446570743B4C000664657074496471007E00384C0005656D61696C71007E000F4C00096C6F67696E446174657400104C6A6176612F7574696C2F446174653B4C00076C6F67696E497071007E000F4C00086E69636B4E616D6571007E000F4C000870617373776F726471007E000F4C000B70686F6E656E756D62657271007E000F5B0007706F73744964737400115B4C6A6176612F6C616E672F4C6F6E673B4C0006726F6C65496471007E00385B0007726F6C6549647371007E004A4C0005726F6C657371007E00084C000373657871007E000F4C000673746174757371007E000F4C000675736572496471007E00384C0008757365724E616D6571007E000F78720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E000F4C000A63726561746554696D6571007E00494C0006706172616D7371007E000E4C000672656D61726B71007E000F4C000B73656172636856616C756571007E000F4C0008757064617465427971007E000F4C000A75706461746554696D6571007E0049787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED850787371007E00173F400000000000007708000000100000000078740009E7AEA1E79086E59198707070740000740001307372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E53797344657074000000000000000102000C4C0009616E636573746F727371007E000F4C00086368696C6472656E71007E00084C000764656C466C616771007E000F4C000664657074496471007E00384C0008646570744E616D6571007E000F4C0005656D61696C71007E000F4C00066C656164657271007E000F4C00086F726465724E756D7400134C6A6176612F6C616E672F496E74656765723B4C0008706172656E74496471007E00384C000A706172656E744E616D6571007E000F4C000570686F6E6571007E000F4C000673746174757371007E000F7871007E004B70707371007E00173F40000000000000770800000010000000007870707070740009302C3130302C3130317371007E000B00000000770400000000787071007E003E74000CE7A094E58F91E983A8E997A870740006E789A9E7BE8E737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E003D000000017371007E003C000000000000006570707400013171007E003E7400103136343737303730374071712E636F6D7371007E004E77080000018AA651C3B8787400093132372E302E302E3174000FE89C82E4BFA1E7AEA1E79086E5919874003C2432612431302451416F77377962733734666B53574A444A6B56544E656F6746376D686E69684637535445727437385078446848694E6E6F3449557574000B31353838383838383838387070707371007E000B000000017704000000017372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E537973526F6C65000000000000000102000D5A001164657074436865636B5374726963746C795A0004666C61675A00116D656E75436865636B5374726963746C794C00096461746153636F706571007E000F4C000764656C466C616771007E000F5B00076465707449647371007E004A5B00076D656E7549647371007E004A4C000B7065726D697373696F6E7371007E00114C0006726F6C65496471007E00384C0007726F6C654B657971007E000F4C0008726F6C654E616D6571007E000F4C0008726F6C65536F727471007E00554C000673746174757371007E000F7871007E004B70707371007E00173F4000000000000077080000001000000000787070707000000074000131707070707371007E003C000000000000000174000561646D696E74000FE8B685E7BAA7E7AEA1E79086E5919871007E005D7400013078740001307400013071007E006B74000561646D696E71007E006B); +INSERT INTO `oauth_code` VALUES ('1YESo2', 0xACED0005737200416F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F417574683241757468656E7469636174696F6EBD400B02166252130200024C000D73746F7265645265717565737474003C4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F4F4175746832526571756573743B4C00127573657241757468656E7469636174696F6E7400324C6F72672F737072696E676672616D65776F726B2F73656375726974792F636F72652F41757468656E7469636174696F6E3B787200476F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E416273747261637441757468656E7469636174696F6E546F6B656ED3AA287E6E47640E0200035A000D61757468656E746963617465644C000B617574686F7269746965737400164C6A6176612F7574696C2F436F6C6C656374696F6E3B4C000764657461696C737400124C6A6176612F6C616E672F4F626A6563743B787000737200266A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654C697374FC0F2531B5EC8E100200014C00046C6973747400104C6A6176612F7574696C2F4C6973743B7872002C6A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65436F6C6C656374696F6E19420080CB5EF71E0200014C00016371007E00047870737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000007704000000007871007E000C707372003A6F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F41757468325265717565737400000000000000010200075A0008617070726F7665644C000B617574686F72697469657371007E00044C000A657874656E73696F6E7374000F4C6A6176612F7574696C2F4D61703B4C000B72656469726563745572697400124C6A6176612F6C616E672F537472696E673B4C00077265667265736874003B4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F546F6B656E526571756573743B4C000B7265736F7572636549647374000F4C6A6176612F7574696C2F5365743B4C000D726573706F6E7365547970657371007E0011787200386F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E426173655265717565737436287A3EA37169BD0200034C0008636C69656E74496471007E000F4C001172657175657374506172616D657465727371007E000E4C000573636F706571007E0011787074000C61646D696E2D647565726F73737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654D6170F1A5A8FE74F507420200014C00016D71007E000E7870737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F400000000000067708000000080000000474000D726573706F6E73655F74797065740004636F646574000C72656469726563745F75726974004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F6532656663666666393638396463346236616636376437386531303936393464740009636C69656E745F696471007E001474000573636F706574000A7265616420777269746578737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65536574801D92D18F9B80550200007871007E0009737200176A6176612E7574696C2E4C696E6B656448617368536574D86CD75A95DD2A1E020000787200116A6176612E7574696C2E48617368536574BA44859596B8B7340300007870770C000000103F4000000000000274000472656164740005777269746578017371007E0023770C000000103F40000000000001737200426F72672E737072696E676672616D65776F726B2E73656375726974792E636F72652E617574686F726974792E53696D706C654772616E746564417574686F7269747900000000000002260200014C0004726F6C6571007E000F787074000A524F4C455F41444D494E787371007E00173F40000000000000770800000010000000007874004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F6532656663666666393638396463346236616636376437386531303936393464707371007E0023770C000000103F4000000000000174000F737065616B65722D73657276696365787371007E0023770C000000103F4000000000000171007E001A787372004F6F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E557365726E616D6550617373776F726441757468656E7469636174696F6E546F6B656E00000000000002260200024C000B63726564656E7469616C7371007E00054C00097072696E636970616C71007E00057871007E0003017372001F6A6176612E7574696C2E436F6C6C656374696F6E7324456D7074794C6973747AB817B43CA79EDE0200007870737200486F72672E737072696E676672616D65776F726B2E73656375726974792E7765622E61757468656E7469636174696F6E2E57656241757468656E7469636174696F6E44657461696C7300000000000002260200024C000D72656D6F74654164647265737371007E000F4C000973657373696F6E496471007E000F787074000F303A303A303A303A303A303A303A3170707372002E636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E6D6F64656C2E4C6F67696E55736572000000000000000102000B4C000762726F7773657271007E000F4C00066465707449647400104C6A6176612F6C616E672F4C6F6E673B4C000A65787069726554696D6571007E00384C000669706164647271007E000F4C000D6C6F67696E4C6F636174696F6E71007E000F4C00096C6F67696E54696D6571007E00384C00026F7371007E000F4C000B7065726D697373696F6E7371007E00114C0005746F6B656E71007E000F4C00047573657274002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973557365723B4C000675736572496471007E003878707400094368726F6D652031317372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000677371007E003C0000018AAC097C437400093132372E302E302E31740008E58685E7BD9149507371007E003C0000018AA6E3204374000A57696E646F77732031307371007E0023770C000000023F400000000000017400052A3A2A3A2A7874002439326462396566652D656438662D343965392D613839392D3664393431633333393237637372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E5379735573657200000000000000010200124C000661766174617271007E000F4C000764656C466C616771007E000F4C00046465707474002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973446570743B4C000664657074496471007E00384C0005656D61696C71007E000F4C00096C6F67696E446174657400104C6A6176612F7574696C2F446174653B4C00076C6F67696E497071007E000F4C00086E69636B4E616D6571007E000F4C000870617373776F726471007E000F4C000B70686F6E656E756D62657271007E000F5B0007706F73744964737400115B4C6A6176612F6C616E672F4C6F6E673B4C0006726F6C65496471007E00385B0007726F6C6549647371007E004A4C0005726F6C657371007E00084C000373657871007E000F4C000673746174757371007E000F4C000675736572496471007E00384C0008757365724E616D6571007E000F78720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E000F4C000A63726561746554696D6571007E00494C0006706172616D7371007E000E4C000672656D61726B71007E000F4C000B73656172636856616C756571007E000F4C0008757064617465427971007E000F4C000A75706461746554696D6571007E0049787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED850787371007E00173F400000000000007708000000100000000078740009E7AEA1E79086E59198707070740000740001307372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E53797344657074000000000000000102000C4C0009616E636573746F727371007E000F4C00086368696C6472656E71007E00084C000764656C466C616771007E000F4C000664657074496471007E00384C0008646570744E616D6571007E000F4C0005656D61696C71007E000F4C00066C656164657271007E000F4C00086F726465724E756D7400134C6A6176612F6C616E672F496E74656765723B4C0008706172656E74496471007E00384C000A706172656E744E616D6571007E000F4C000570686F6E6571007E000F4C000673746174757371007E000F7871007E004B70707371007E00173F40000000000000770800000010000000007870707070740009302C3130302C3130317371007E000B00000000770400000000787071007E003E74000CE7A094E58F91E983A8E997A870740006E789A9E7BE8E737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E003D000000017371007E003C000000000000006570707400013171007E003E7400103136343737303730374071712E636F6D7371007E004E77080000018AA651C3B8787400093132372E302E302E3174000FE89C82E4BFA1E7AEA1E79086E5919874003C2432612431302451416F77377962733734666B53574A444A6B56544E656F6746376D686E69684637535445727437385078446848694E6E6F3449557574000B31353838383838383838387070707371007E000B000000017704000000017372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E537973526F6C65000000000000000102000D5A001164657074436865636B5374726963746C795A0004666C61675A00116D656E75436865636B5374726963746C794C00096461746153636F706571007E000F4C000764656C466C616771007E000F5B00076465707449647371007E004A5B00076D656E7549647371007E004A4C000B7065726D697373696F6E7371007E00114C0006726F6C65496471007E00384C0007726F6C654B657971007E000F4C0008726F6C654E616D6571007E000F4C0008726F6C65536F727471007E00554C000673746174757371007E000F7871007E004B70707371007E00173F4000000000000077080000001000000000787070707000000074000131707070707371007E003C000000000000000174000561646D696E74000FE8B685E7BAA7E7AEA1E79086E5919871007E005D7400013078740001307400013071007E006B74000561646D696E71007E006B); +INSERT INTO `oauth_code` VALUES ('DhdDPY', 0xACED0005737200416F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F417574683241757468656E7469636174696F6EBD400B02166252130200024C000D73746F7265645265717565737474003C4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F4F4175746832526571756573743B4C00127573657241757468656E7469636174696F6E7400324C6F72672F737072696E676672616D65776F726B2F73656375726974792F636F72652F41757468656E7469636174696F6E3B787200476F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E416273747261637441757468656E7469636174696F6E546F6B656ED3AA287E6E47640E0200035A000D61757468656E746963617465644C000B617574686F7269746965737400164C6A6176612F7574696C2F436F6C6C656374696F6E3B4C000764657461696C737400124C6A6176612F6C616E672F4F626A6563743B787000737200266A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654C697374FC0F2531B5EC8E100200014C00046C6973747400104C6A6176612F7574696C2F4C6973743B7872002C6A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65436F6C6C656374696F6E19420080CB5EF71E0200014C00016371007E00047870737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000007704000000007871007E000C707372003A6F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F41757468325265717565737400000000000000010200075A0008617070726F7665644C000B617574686F72697469657371007E00044C000A657874656E73696F6E7374000F4C6A6176612F7574696C2F4D61703B4C000B72656469726563745572697400124C6A6176612F6C616E672F537472696E673B4C00077265667265736874003B4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F546F6B656E526571756573743B4C000B7265736F7572636549647374000F4C6A6176612F7574696C2F5365743B4C000D726573706F6E7365547970657371007E0011787200386F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E426173655265717565737436287A3EA37169BD0200034C0008636C69656E74496471007E000F4C001172657175657374506172616D657465727371007E000E4C000573636F706571007E0011787074000C61646D696E2D647565726F73737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654D6170F1A5A8FE74F507420200014C00016D71007E000E7870737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000674000573636F706574000A7265616420777269746574000D726573706F6E73655F74797065740004636F646574000C72656469726563745F75726974004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F65326566636666663936383964633462366166363764373865313039363934647400057374617465740020346635653763303462313731306262653836376535376431373434613534373874000A647565726F735F7569647400203466356537633034623137313062626538363765353764313734346135343738740009636C69656E745F696471007E001478737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65536574801D92D18F9B80550200007871007E0009737200176A6176612E7574696C2E4C696E6B656448617368536574D86CD75A95DD2A1E020000787200116A6176612E7574696C2E48617368536574BA44859596B8B7340300007870770C000000103F4000000000000274000472656164740005777269746578017371007E0027770C000000103F40000000000001737200426F72672E737072696E676672616D65776F726B2E73656375726974792E636F72652E617574686F726974792E53696D706C654772616E746564417574686F7269747900000000000002260200014C0004726F6C6571007E000F787074000A524F4C455F41444D494E787371007E00173F40000000000000770800000010000000007874004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F6532656663666666393638396463346236616636376437386531303936393464707371007E0027770C000000103F4000000000000174000F737065616B65722D73657276696365787371007E0027770C000000103F4000000000000171007E001C787372004F6F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E557365726E616D6550617373776F726441757468656E7469636174696F6E546F6B656E00000000000002260200024C000B63726564656E7469616C7371007E00054C00097072696E636970616C71007E00057871007E0003017372001F6A6176612E7574696C2E436F6C6C656374696F6E7324456D7074794C6973747AB817B43CA79EDE0200007870737200486F72672E737072696E676672616D65776F726B2E73656375726974792E7765622E61757468656E7469636174696F6E2E57656241757468656E7469636174696F6E44657461696C7300000000000002260200024C000D72656D6F74654164647265737371007E000F4C000973657373696F6E496471007E000F787074000F303A303A303A303A303A303A303A3170707372002E636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E6D6F64656C2E4C6F67696E55736572000000000000000102000B4C000762726F7773657271007E000F4C00066465707449647400104C6A6176612F6C616E672F4C6F6E673B4C000A65787069726554696D6571007E003C4C000669706164647271007E000F4C000D6C6F67696E4C6F636174696F6E71007E000F4C00096C6F67696E54696D6571007E003C4C00026F7371007E000F4C000B7065726D697373696F6E7371007E00114C0005746F6B656E71007E000F4C00047573657274002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973557365723B4C000675736572496471007E003C78707400094368726F6D652031317372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000677371007E00400000018AAC097C437400093132372E302E302E31740008E58685E7BD9149507371007E00400000018AA6E3204374000A57696E646F77732031307371007E0027770C000000023F400000000000017400052A3A2A3A2A7874002439326462396566652D656438662D343965392D613839392D3664393431633333393237637372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E5379735573657200000000000000010200124C000661766174617271007E000F4C000764656C466C616771007E000F4C00046465707474002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973446570743B4C000664657074496471007E003C4C0005656D61696C71007E000F4C00096C6F67696E446174657400104C6A6176612F7574696C2F446174653B4C00076C6F67696E497071007E000F4C00086E69636B4E616D6571007E000F4C000870617373776F726471007E000F4C000B70686F6E656E756D62657271007E000F5B0007706F73744964737400115B4C6A6176612F6C616E672F4C6F6E673B4C0006726F6C65496471007E003C5B0007726F6C6549647371007E004E4C0005726F6C657371007E00084C000373657871007E000F4C000673746174757371007E000F4C000675736572496471007E003C4C0008757365724E616D6571007E000F78720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E000F4C000A63726561746554696D6571007E004D4C0006706172616D7371007E000E4C000672656D61726B71007E000F4C000B73656172636856616C756571007E000F4C0008757064617465427971007E000F4C000A75706461746554696D6571007E004D787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED850787371007E00173F400000000000007708000000100000000078740009E7AEA1E79086E59198707070740000740001307372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E53797344657074000000000000000102000C4C0009616E636573746F727371007E000F4C00086368696C6472656E71007E00084C000764656C466C616771007E000F4C000664657074496471007E003C4C0008646570744E616D6571007E000F4C0005656D61696C71007E000F4C00066C656164657271007E000F4C00086F726465724E756D7400134C6A6176612F6C616E672F496E74656765723B4C0008706172656E74496471007E003C4C000A706172656E744E616D6571007E000F4C000570686F6E6571007E000F4C000673746174757371007E000F7871007E004F70707371007E00173F40000000000000770800000010000000007870707070740009302C3130302C3130317371007E000B00000000770400000000787071007E004274000CE7A094E58F91E983A8E997A870740006E789A9E7BE8E737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E0041000000017371007E0040000000000000006570707400013171007E00427400103136343737303730374071712E636F6D7371007E005277080000018AA651C3B8787400093132372E302E302E3174000FE89C82E4BFA1E7AEA1E79086E5919874003C2432612431302451416F77377962733734666B53574A444A6B56544E656F6746376D686E69684637535445727437385078446848694E6E6F3449557574000B31353838383838383838387070707371007E000B000000017704000000017372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E537973526F6C65000000000000000102000D5A001164657074436865636B5374726963746C795A0004666C61675A00116D656E75436865636B5374726963746C794C00096461746153636F706571007E000F4C000764656C466C616771007E000F5B00076465707449647371007E004E5B00076D656E7549647371007E004E4C000B7065726D697373696F6E7371007E00114C0006726F6C65496471007E003C4C0007726F6C654B657971007E000F4C0008726F6C654E616D6571007E000F4C0008726F6C65536F727471007E00594C000673746174757371007E000F7871007E004F70707371007E00173F4000000000000077080000001000000000787070707000000074000131707070707371007E0040000000000000000174000561646D696E74000FE8B685E7BAA7E7AEA1E79086E5919871007E00617400013078740001307400013071007E006F74000561646D696E71007E006F); + +-- ---------------------------- +-- Table structure for oauth_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_refresh_token`; +CREATE TABLE `oauth_refresh_token` ( + `token_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `token` blob NULL, + `authentication` blob NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_refresh_token +-- ---------------------------- +INSERT INTO `oauth_refresh_token` VALUES ('4cabc0e9bcfa34131342209bdaf275eb', 0xACED00057372004C6F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E636F6D6D6F6E2E44656661756C744578706972696E674F417574683252656672657368546F6B656E2FDF47639DD0C9B70200014C000A65787069726174696F6E7400104C6A6176612F7574696C2F446174653B787200446F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E636F6D6D6F6E2E44656661756C744F417574683252656672657368546F6B656E73E10E0A6354D45E0200014C000576616C75657400124C6A6176612F6C616E672F537472696E673B787074001B56452D377744386D70414A34497A662D49345F456450316F31626F7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000018AA760D12D78, 0xACED0005737200416F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F417574683241757468656E7469636174696F6EBD400B02166252130200024C000D73746F7265645265717565737474003C4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F4F4175746832526571756573743B4C00127573657241757468656E7469636174696F6E7400324C6F72672F737072696E676672616D65776F726B2F73656375726974792F636F72652F41757468656E7469636174696F6E3B787200476F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E416273747261637441757468656E7469636174696F6E546F6B656ED3AA287E6E47640E0200035A000D61757468656E746963617465644C000B617574686F7269746965737400164C6A6176612F7574696C2F436F6C6C656374696F6E3B4C000764657461696C737400124C6A6176612F6C616E672F4F626A6563743B787000737200266A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654C697374FC0F2531B5EC8E100200014C00046C6973747400104C6A6176612F7574696C2F4C6973743B7872002C6A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65436F6C6C656374696F6E19420080CB5EF71E0200014C00016371007E00047870737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000007704000000007871007E000C707372003A6F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E4F41757468325265717565737400000000000000010200075A0008617070726F7665644C000B617574686F72697469657371007E00044C000A657874656E73696F6E7374000F4C6A6176612F7574696C2F4D61703B4C000B72656469726563745572697400124C6A6176612F6C616E672F537472696E673B4C00077265667265736874003B4C6F72672F737072696E676672616D65776F726B2F73656375726974792F6F61757468322F70726F76696465722F546F6B656E526571756573743B4C000B7265736F7572636549647374000F4C6A6176612F7574696C2F5365743B4C000D726573706F6E7365547970657371007E0011787200386F72672E737072696E676672616D65776F726B2E73656375726974792E6F61757468322E70726F76696465722E426173655265717565737436287A3EA37169BD0200034C0008636C69656E74496471007E000F4C001172657175657374506172616D657465727371007E000E4C000573636F706571007E0011787074000C61646D696E2D647565726F73737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C654D6170F1A5A8FE74F507420200014C00016D71007E000E7870737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C77080000001000000009740004636F6465740006536C4B4F684C74000A6772616E745F74797065740012617574686F72697A6174696F6E5F636F646574000573636F706574000A7265616420777269746574000D726573706F6E73655F74797065740004636F646574000C72656469726563745F75726974004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F65326566636666663936383964633462366166363764373865313039363934647400057374617465740020346635653763303462313731306262653836376535376431373434613534373874000D636C69656E745F7365637265747400225332456E65487864745E4D48684276384E253233245E7479366E71244E5159324E6474000A647565726F735F7569647400203466356537633034623137313062626538363765353764313734346135343738740009636C69656E745F696474000C61646D696E2D647565726F7378737200256A6176612E7574696C2E436F6C6C656374696F6E7324556E6D6F6469666961626C65536574801D92D18F9B80550200007871007E0009737200176A6176612E7574696C2E4C696E6B656448617368536574D86CD75A95DD2A1E020000787200116A6176612E7574696C2E48617368536574BA44859596B8B7340300007870770C000000103F4000000000000274000472656164740005777269746578017371007E002E770C000000103F40000000000001737200426F72672E737072696E676672616D65776F726B2E73656375726974792E636F72652E617574686F726974792E53696D706C654772616E746564417574686F7269747900000000000002260200014C0004726F6C6571007E000F787074000A524F4C455F41444D494E787371007E00173F40000000000000770800000010000000007874004468747470733A2F2F7869616F64752E62616964752E636F6D2F73616979612F617574682F6532656663666666393638396463346236616636376437386531303936393464707371007E002E770C000000103F4000000000000174000F737065616B65722D73657276696365787371007E002E770C000000103F4000000000000171007E0020787372004F6F72672E737072696E676672616D65776F726B2E73656375726974792E61757468656E7469636174696F6E2E557365726E616D6550617373776F726441757468656E7469636174696F6E546F6B656E00000000000002260200024C000B63726564656E7469616C7371007E00054C00097072696E636970616C71007E00057871007E0003017372001F6A6176612E7574696C2E436F6C6C656374696F6E7324456D7074794C6973747AB817B43CA79EDE0200007870737200486F72672E737072696E676672616D65776F726B2E73656375726974792E7765622E61757468656E7469636174696F6E2E57656241757468656E7469636174696F6E44657461696C7300000000000002260200024C000D72656D6F74654164647265737371007E000F4C000973657373696F6E496471007E000F787074000F303A303A303A303A303A303A303A3170707372002E636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E6D6F64656C2E4C6F67696E55736572000000000000000102000B4C000762726F7773657271007E000F4C00066465707449647400104C6A6176612F6C616E672F4C6F6E673B4C000A65787069726554696D6571007E00434C000669706164647271007E000F4C000D6C6F67696E4C6F636174696F6E71007E000F4C00096C6F67696E54696D6571007E00434C00026F7371007E000F4C000B7065726D697373696F6E7371007E00114C0005746F6B656E71007E000F4C00047573657274002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973557365723B4C000675736572496471007E004378707400094368726F6D652031317372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000677371007E00470000018AAC097C437400093132372E302E302E31740008E58685E7BD9149507371007E00470000018AA6E3204374000A57696E646F77732031307371007E002E770C000000023F400000000000017400052A3A2A3A2A7874002439326462396566652D656438662D343965392D613839392D3664393431633333393237637372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E5379735573657200000000000000010200124C000661766174617271007E000F4C000764656C466C616771007E000F4C00046465707474002F4C636F6D2F666173746265652F636F6D6D6F6E2F636F72652F646F6D61696E2F656E746974792F537973446570743B4C000664657074496471007E00434C0005656D61696C71007E000F4C00096C6F67696E446174657400104C6A6176612F7574696C2F446174653B4C00076C6F67696E497071007E000F4C00086E69636B4E616D6571007E000F4C000870617373776F726471007E000F4C000B70686F6E656E756D62657271007E000F5B0007706F73744964737400115B4C6A6176612F6C616E672F4C6F6E673B4C0006726F6C65496471007E00435B0007726F6C6549647371007E00554C0005726F6C657371007E00084C000373657871007E000F4C000673746174757371007E000F4C000675736572496471007E00434C0008757365724E616D6571007E000F78720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E000F4C000A63726561746554696D6571007E00544C0006706172616D7371007E000E4C000672656D61726B71007E000F4C000B73656172636856616C756571007E000F4C0008757064617465427971007E000F4C000A75706461746554696D6571007E0054787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED850787371007E00173F400000000000007708000000100000000078740009E7AEA1E79086E59198707070740000740001307372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E53797344657074000000000000000102000C4C0009616E636573746F727371007E000F4C00086368696C6472656E71007E00084C000764656C466C616771007E000F4C000664657074496471007E00434C0008646570744E616D6571007E000F4C0005656D61696C71007E000F4C00066C656164657271007E000F4C00086F726465724E756D7400134C6A6176612F6C616E672F496E74656765723B4C0008706172656E74496471007E00434C000A706172656E744E616D6571007E000F4C000570686F6E6571007E000F4C000673746174757371007E000F7871007E005670707371007E00173F40000000000000770800000010000000007870707070740009302C3130302C3130317371007E000B00000000770400000000787071007E004974000CE7A094E58F91E983A8E997A870740006E789A9E7BE8E737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E0048000000017371007E0047000000000000006570707400013171007E00497400103136343737303730374071712E636F6D7371007E005977080000018AA651C3B8787400093132372E302E302E3174000FE89C82E4BFA1E7AEA1E79086E5919874003C2432612431302451416F77377962733734666B53574A444A6B56544E656F6746376D686E69684637535445727437385078446848694E6E6F3449557574000B31353838383838383838387070707371007E000B000000017704000000017372002D636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E656E746974792E537973526F6C65000000000000000102000D5A001164657074436865636B5374726963746C795A0004666C61675A00116D656E75436865636B5374726963746C794C00096461746153636F706571007E000F4C000764656C466C616771007E000F5B00076465707449647371007E00555B00076D656E7549647371007E00554C000B7065726D697373696F6E7371007E00114C0006726F6C65496471007E00434C0007726F6C654B657971007E000F4C0008726F6C654E616D6571007E000F4C0008726F6C65536F727471007E00604C000673746174757371007E000F7871007E005670707371007E00173F4000000000000077080000001000000000787070707000000074000131707070707371007E0047000000000000000174000561646D696E74000FE8B685E7BAA7E7AEA1E79086E5919871007E00687400013078740001307400013071007E007674000561646D696E71007E0076); + + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `blob_data` blob NULL COMMENT '存放持久化Trigger对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `QRTZ_BLOB_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'Blob类型的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_blob_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '日历名称', + `calendar` blob NOT NULL COMMENT '存放持久化calendar对象', + PRIMARY KEY (`sched_name`, `calendar_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '日历信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_calendars +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `cron_expression` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'cron表达式', + `time_zone_id` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '时区', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `QRTZ_CRON_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'Cron类型的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- +INSERT INTO `qrtz_cron_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME1', 'DEFAULT', '0/10 * * * * ?', 'Asia/Shanghai'); +INSERT INTO `qrtz_cron_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME2', 'DEFAULT', '0/15 * * * * ?', 'Asia/Shanghai'); +INSERT INTO `qrtz_cron_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME3', 'DEFAULT', '0/20 * * * * ?', 'Asia/Shanghai'); +INSERT INTO `qrtz_cron_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME4', 'SYSTEM', '0 0/4 * * * ? ', 'Asia/Shanghai'); +INSERT INTO `qrtz_cron_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME5', 'SYSTEM', '0 0/1 * * * ? ', 'Asia/Shanghai'); + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `entry_id` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度器实例id', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度器实例名', + `fired_time` bigint(13) NOT NULL COMMENT '触发的时间', + `sched_time` bigint(13) NOT NULL COMMENT '定时器制定的时间', + `priority` int(11) NOT NULL COMMENT '优先级', + `state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务组名', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否并发', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否接受恢复执行', + PRIMARY KEY (`sched_name`, `entry_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '已触发的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_fired_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '相关介绍', + `job_class_name` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行任务类名称', + `is_durable` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否持久化', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否并发', + `is_update_data` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否更新数据', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否接受恢复执行', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务详细信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- +INSERT INTO `qrtz_job_details` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME1', 'DEFAULT', NULL, 'com.fastbee.quartz.util.QuartzDisallowConcurrentExecution', '0', '1', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000F5441534B5F50524F5045525449455373720020636F6D2E666173746265652E71756172747A2E646F6D61696E2E5379734A6F6200000000000000010200084C000A636F6E63757272656E747400124C6A6176612F6C616E672F537472696E673B4C000E63726F6E45787072657373696F6E71007E00094C000C696E766F6B6554617267657471007E00094C00086A6F6247726F757071007E00094C00056A6F6249647400104C6A6176612F6C616E672F4C6F6E673B4C00076A6F624E616D6571007E00094C000D6D697366697265506F6C69637971007E00094C000673746174757371007E000978720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E00094C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C0006706172616D7371007E00034C000672656D61726B71007E00094C000B73656172636856616C756571007E00094C0008757064617465427971007E00094C000A75706461746554696D6571007E000C787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED85078707400007070707400013174000E302F3130202A202A202A202A203F74001172795461736B2E72794E6F506172616D7374000744454641554C547372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000000000001740018E7B3BBE7BB9FE9BB98E8AEA4EFBC88E697A0E58F82EFBC8974000133740001307800); +INSERT INTO `qrtz_job_details` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME2', 'DEFAULT', NULL, 'com.fastbee.quartz.util.QuartzDisallowConcurrentExecution', '0', '1', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000F5441534B5F50524F5045525449455373720020636F6D2E666173746265652E71756172747A2E646F6D61696E2E5379734A6F6200000000000000010200084C000A636F6E63757272656E747400124C6A6176612F6C616E672F537472696E673B4C000E63726F6E45787072657373696F6E71007E00094C000C696E766F6B6554617267657471007E00094C00086A6F6247726F757071007E00094C00056A6F6249647400104C6A6176612F6C616E672F4C6F6E673B4C00076A6F624E616D6571007E00094C000D6D697366697265506F6C69637971007E00094C000673746174757371007E000978720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E00094C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C0006706172616D7371007E00034C000672656D61726B71007E00094C000B73656172636856616C756571007E00094C0008757064617465427971007E00094C000A75706461746554696D6571007E000C787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED85078707400007070707400013174000E302F3135202A202A202A202A203F74001572795461736B2E7279506172616D7328277279272974000744454641554C547372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000000000002740018E7B3BBE7BB9FE9BB98E8AEA4EFBC88E69C89E58F82EFBC8974000133740001317800); +INSERT INTO `qrtz_job_details` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME3', 'DEFAULT', NULL, 'com.fastbee.quartz.util.QuartzDisallowConcurrentExecution', '0', '1', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000F5441534B5F50524F5045525449455373720020636F6D2E666173746265652E71756172747A2E646F6D61696E2E5379734A6F6200000000000000010200084C000A636F6E63757272656E747400124C6A6176612F6C616E672F537472696E673B4C000E63726F6E45787072657373696F6E71007E00094C000C696E766F6B6554617267657471007E00094C00086A6F6247726F757071007E00094C00056A6F6249647400104C6A6176612F6C616E672F4C6F6E673B4C00076A6F624E616D6571007E00094C000D6D697366697265506F6C69637971007E00094C000673746174757371007E000978720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E00094C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C0006706172616D7371007E00034C000672656D61726B71007E00094C000B73656172636856616C756571007E00094C0008757064617465427971007E00094C000A75706461746554696D6571007E000C787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017DBE4ED85078707400007070707400013174000E302F3230202A202A202A202A203F74003872795461736B2E72794D756C7469706C65506172616D7328277279272C20747275652C20323030304C2C203331362E3530442C203130302974000744454641554C547372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000000000003740018E7B3BBE7BB9FE9BB98E8AEA4EFBC88E5A49AE58F82EFBC8974000133740001317800); +INSERT INTO `qrtz_job_details` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME4', 'SYSTEM', NULL, 'com.fastbee.quartz.util.QuartzJobExecution', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000F5441534B5F50524F5045525449455373720020636F6D2E666173746265652E71756172747A2E646F6D61696E2E5379734A6F6200000000000000010200084C000A636F6E63757272656E747400124C6A6176612F6C616E672F537472696E673B4C000E63726F6E45787072657373696F6E71007E00094C000C696E766F6B6554617267657471007E00094C00086A6F6247726F757071007E00094C00056A6F6249647400104C6A6176612F6C616E672F4C6F6E673B4C00076A6F624E616D6571007E00094C000D6D697366697265506F6C69637971007E00094C000673746174757371007E000978720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E00094C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C0006706172616D7371007E00034C000672656D61726B71007E00094C000B73656172636856616C756571007E00094C0008757064617465427971007E00094C000A75706461746554696D6571007E000C787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B59741903000078707708000001869759B0B878707400007070707400013074000E3020302F34202A202A202A203F2074002070726F7047657453657276696365496D706C2E666574636850726F706572747974000653595354454D7372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000047400126D6F64627573E4BA91E7ABAFE8BDAEE8AFA274000131740001307800); +INSERT INTO `qrtz_job_details` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME5', 'SYSTEM', NULL, 'com.fastbee.quartz.util.QuartzDisallowConcurrentExecution', '0', '1', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000F5441534B5F50524F5045525449455373720020636F6D2E666173746265652E71756172747A2E646F6D61696E2E5379734A6F6200000000000000010200084C000A636F6E63757272656E747400124C6A6176612F6C616E672F537472696E673B4C000E63726F6E45787072657373696F6E71007E00094C000C696E766F6B6554617267657471007E00094C00086A6F6247726F757071007E00094C00056A6F6249647400104C6A6176612F6C616E672F4C6F6E673B4C00076A6F624E616D6571007E00094C000D6D697366697265506F6C69637971007E00094C000673746174757371007E000978720029636F6D2E666173746265652E636F6D6D6F6E2E636F72652E646F6D61696E2E42617365456E7469747900000000000000010200074C0008637265617465427971007E00094C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C0006706172616D7371007E00034C000672656D61726B71007E00094C000B73656172636856616C756571007E00094C0008757064617465427971007E00094C000A75706461746554696D6571007E000C787074000561646D696E7372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000187118D07E078707400007070707400013174000E3020302F31202A202A202A203F207400286465766963654A6F622E74696D696E6755706461746544657669636553746174757353746174757374000653595354454D7372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000000000005740012E8AEBEE5A487E5AE9AE697B6E4BBBBE58AA174000131740001307800); + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `lock_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '悲观锁名称', + PRIMARY KEY (`sched_name`, `lock_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '存储的悲观锁信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- +INSERT INTO `qrtz_locks` VALUES ('RuoyiScheduler', 'STATE_ACCESS'); +INSERT INTO `qrtz_locks` VALUES ('RuoyiScheduler', 'TRIGGER_ACCESS'); + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + PRIMARY KEY (`sched_name`, `trigger_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '暂停的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_paused_trigger_grps +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '实例名称', + `last_checkin_time` bigint(13) NOT NULL COMMENT '上次检查时间', + `checkin_interval` bigint(13) NOT NULL COMMENT '检查间隔时间', + PRIMARY KEY (`sched_name`, `instance_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '调度器状态表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- +INSERT INTO `qrtz_scheduler_state` VALUES ('RuoyiScheduler', 'beecue1680023933011', 1680023961720, 15000); + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `repeat_count` bigint(7) NOT NULL COMMENT '重复的次数统计', + `repeat_interval` bigint(12) NOT NULL COMMENT '重复的间隔时间', + `times_triggered` bigint(10) NOT NULL COMMENT '已经触发的次数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '简单触发器的信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_simple_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `str_prop_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第一个参数', + `str_prop_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第二个参数', + `str_prop_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第三个参数', + `int_prop_1` int(11) NULL DEFAULT NULL COMMENT 'int类型的trigger的第一个参数', + `int_prop_2` int(11) NULL DEFAULT NULL COMMENT 'int类型的trigger的第二个参数', + `long_prop_1` bigint(20) NULL DEFAULT NULL COMMENT 'long类型的trigger的第一个参数', + `long_prop_2` bigint(20) NULL DEFAULT NULL COMMENT 'long类型的trigger的第二个参数', + `dec_prop_1` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第一个参数', + `dec_prop_2` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第二个参数', + `bool_prop_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第一个参数', + `bool_prop_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第二个参数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '同步机制的行锁表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_simprop_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器的名字', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器所属组的名字', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_job_details表job_name的外键', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_job_details表job_group的外键', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '相关介绍', + `next_fire_time` bigint(13) NULL DEFAULT NULL COMMENT '上一次触发时间(毫秒)', + `prev_fire_time` bigint(13) NULL DEFAULT NULL COMMENT '下一次触发时间(默认为-1表示不触发)', + `priority` int(11) NULL DEFAULT NULL COMMENT '优先级', + `trigger_state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器状态', + `trigger_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器的类型', + `start_time` bigint(13) NOT NULL COMMENT '开始时间', + `end_time` bigint(13) NULL DEFAULT NULL COMMENT '结束时间', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日程表名称', + `misfire_instr` smallint(2) NULL DEFAULT NULL COMMENT '补偿执行的策略', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + INDEX `sched_name`(`sched_name`, `job_name`, `job_group`) USING BTREE, + CONSTRAINT `QRTZ_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '触发器详细信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- +INSERT INTO `qrtz_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME1', 'DEFAULT', 'TASK_CLASS_NAME1', 'DEFAULT', NULL, 1680023970000, 1680023960000, 5, 'WAITING', 'CRON', 1680023946000, 0, NULL, 2, ''); +INSERT INTO `qrtz_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME2', 'DEFAULT', 'TASK_CLASS_NAME2', 'DEFAULT', NULL, 1680023955000, -1, 5, 'PAUSED', 'CRON', 1680023947000, 0, NULL, 2, ''); +INSERT INTO `qrtz_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME3', 'DEFAULT', 'TASK_CLASS_NAME3', 'DEFAULT', NULL, 1680023960000, -1, 5, 'PAUSED', 'CRON', 1680023948000, 0, NULL, 2, ''); +INSERT INTO `qrtz_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME4', 'SYSTEM', 'TASK_CLASS_NAME4', 'SYSTEM', NULL, 1680024000000, -1, 5, 'WAITING', 'CRON', 1680023950000, 0, NULL, -1, ''); +INSERT INTO `qrtz_triggers` VALUES ('RuoyiScheduler', 'TASK_CLASS_NAME5', 'SYSTEM', 'TASK_CLASS_NAME5', 'SYSTEM', NULL, 1680024000000, -1, 5, 'WAITING', 'CRON', 1680023951000, 0, NULL, -1, ''); + + +-- ---------------------------- +-- Table structure for sys_auth_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_auth_user`; +CREATE TABLE `sys_auth_user` ( + `auth_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '授权ID', + `uuid` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '第三方平台用户唯一ID', + `user_id` bigint(20) NOT NULL COMMENT '系统用户ID', + `login_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录账号', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户昵称', + `avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址', + `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户邮箱', + `source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户来源', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`auth_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '第三方授权表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_auth_user +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `config_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键名', + `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键值', + `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`config_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_config +-- ---------------------------- +INSERT INTO `sys_config` VALUES (1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2021-12-15 21:36:18', '', NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow'); +INSERT INTO `sys_config` VALUES (2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', '2021-12-15 21:36:18', '', NULL, '初始化密码 123456'); +INSERT INTO `sys_config` VALUES (3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', '2021-12-15 21:36:18', '', NULL, '深色主题theme-dark,浅色主题theme-light'); +INSERT INTO `sys_config` VALUES (5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'true', 'Y', 'admin', '2021-12-15 21:36:18', 'admin', '2021-12-24 22:43:33', '是否开启注册用户功能(true开启,false关闭)'); +INSERT INTO `sys_config` VALUES (6, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', '2023-03-10 23:29:21', '', NULL, '是否开启验证码功能(true开启,false关闭)'); + +-- ---------------------------- +-- Table structure for sys_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id', + `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父部门id', + `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '祖级列表', + `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称', + `order_num` int(4) NULL DEFAULT 0 COMMENT '显示顺序', + `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 110 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dept +-- ---------------------------- +INSERT INTO `sys_dept` VALUES (100, 0, '0', '蜂信物联', 0, 'FastBee', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', 'admin', '2023-02-26 23:06:24'); +INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '北京总公司', 1, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', 'admin', '2022-03-09 16:49:53'); +INSERT INTO `sys_dept` VALUES (102, 100, '0,100', '深圳分公司', 2, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', 'admin', '2023-02-26 23:06:07'); +INSERT INTO `sys_dept` VALUES (103, 101, '0,100,101', '研发部门', 1, '物美', '15888888888', '164770707@qq.com', '1', '0', 'admin', '2021-12-15 21:36:18', 'admin', '2022-02-01 23:12:40'); +INSERT INTO `sys_dept` VALUES (104, 101, '0,100,101', '市场部门', 2, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', '', NULL); +INSERT INTO `sys_dept` VALUES (105, 101, '0,100,101', '测试部门', 3, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', '', NULL); +INSERT INTO `sys_dept` VALUES (106, 101, '0,100,101', '财务部门', 4, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', '', NULL); +INSERT INTO `sys_dept` VALUES (107, 101, '0,100,101', '运维部门', 5, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', '', NULL); +INSERT INTO `sys_dept` VALUES (108, 102, '0,100,102', '市场部门', 1, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', '', NULL); +INSERT INTO `sys_dept` VALUES (109, 102, '0,100,102', '财务部门', 2, '物美', '15888888888', '164770707@qq.com', '0', '0', 'admin', '2021-12-15 21:36:18', '', NULL); + +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `dict_code` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `dict_sort` int(4) NULL DEFAULT 0 COMMENT '字典排序', + `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典标签', + `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', + `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表格回显样式', + `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_code`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 408 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict_data +-- ---------------------------- +INSERT INTO `sys_dict_data` VALUES (1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '性别男'); +INSERT INTO `sys_dict_data` VALUES (2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '性别女'); +INSERT INTO `sys_dict_data` VALUES (3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '性别未知'); +INSERT INTO `sys_dict_data` VALUES (4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '显示菜单'); +INSERT INTO `sys_dict_data` VALUES (5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '隐藏菜单'); +INSERT INTO `sys_dict_data` VALUES (6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '默认分组'); +INSERT INTO `sys_dict_data` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '系统分组'); +INSERT INTO `sys_dict_data` VALUES (12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '系统默认是'); +INSERT INTO `sys_dict_data` VALUES (13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '系统默认否'); +INSERT INTO `sys_dict_data` VALUES (14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '通知'); +INSERT INTO `sys_dict_data` VALUES (15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '公告'); +INSERT INTO `sys_dict_data` VALUES (16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '关闭状态'); +INSERT INTO `sys_dict_data` VALUES (18, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '新增操作'); +INSERT INTO `sys_dict_data` VALUES (19, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '修改操作'); +INSERT INTO `sys_dict_data` VALUES (20, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '删除操作'); +INSERT INTO `sys_dict_data` VALUES (21, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '授权操作'); +INSERT INTO `sys_dict_data` VALUES (22, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '导出操作'); +INSERT INTO `sys_dict_data` VALUES (23, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '导入操作'); +INSERT INTO `sys_dict_data` VALUES (24, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '强退操作'); +INSERT INTO `sys_dict_data` VALUES (25, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '生成操作'); +INSERT INTO `sys_dict_data` VALUES (26, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '清空操作'); +INSERT INTO `sys_dict_data` VALUES (27, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (28, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (100, 1, '属性', '1', 'iot_things_type', '', 'primary', 'Y', '0', 'admin', '2021-12-12 16:41:15', 'admin', '2021-12-15 22:49:37', ''); +INSERT INTO `sys_dict_data` VALUES (101, 2, '功能', '2', 'iot_things_type', '', 'success', 'Y', '0', 'admin', '2021-12-12 16:43:33', 'admin', '2021-12-14 16:33:11', ''); +INSERT INTO `sys_dict_data` VALUES (102, 3, '事件', '3', 'iot_things_type', NULL, 'warning', 'Y', '0', 'admin', '2021-12-12 16:46:04', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (103, 1, '整数', 'integer', 'iot_data_type', '', '', 'Y', '0', 'admin', '2021-12-12 20:20:46', 'admin', '2021-12-14 16:09:56', ''); +INSERT INTO `sys_dict_data` VALUES (104, 2, '小数', 'decimal', 'iot_data_type', NULL, 'default', 'Y', '0', 'admin', '2021-12-12 20:21:21', 'admin', '2021-12-15 22:51:07', NULL); +INSERT INTO `sys_dict_data` VALUES (105, 3, '布尔', 'bool', 'iot_data_type', NULL, 'default', 'Y', '0', 'admin', '2021-12-12 20:22:12', 'admin', '2021-12-15 22:51:02', NULL); +INSERT INTO `sys_dict_data` VALUES (106, 4, '枚举', 'enum', 'iot_data_type', NULL, 'default', 'Y', '0', 'admin', '2021-12-12 20:22:37', 'admin', '2021-12-15 22:50:57', NULL); +INSERT INTO `sys_dict_data` VALUES (107, 5, '字符串', 'string', 'iot_data_type', NULL, 'default', 'Y', '0', 'admin', '2021-12-12 20:22:54', 'admin', '2021-12-15 22:50:52', NULL); +INSERT INTO `sys_dict_data` VALUES (108, 1, '是', '1', 'iot_yes_no', '', 'default', 'Y', '0', 'admin', '2021-12-12 20:25:14', 'admin', '2022-01-02 13:39:09', ''); +INSERT INTO `sys_dict_data` VALUES (109, 2, '否', '0', 'iot_yes_no', '', 'default', 'Y', '0', 'admin', '2021-12-12 20:25:25', 'admin', '2022-01-02 13:39:15', ''); +INSERT INTO `sys_dict_data` VALUES (110, 6, '数组', 'array', 'iot_data_type', NULL, 'default', 'Y', '0', 'admin', '2021-12-13 18:18:04', 'admin', '2021-12-15 22:50:42', NULL); +INSERT INTO `sys_dict_data` VALUES (111, 1, '未发布', '1', 'iot_product_status', NULL, 'info', 'N', '0', 'admin', '2021-12-19 15:01:18', 'admin', '2021-12-19 15:01:55', NULL); +INSERT INTO `sys_dict_data` VALUES (112, 2, '已发布', '2', 'iot_product_status', NULL, 'success', 'N', '0', 'admin', '2021-12-19 15:01:43', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (113, 1, '直连设备', '1', 'iot_device_type', NULL, 'default', 'N', '0', 'admin', '2021-12-19 15:03:49', 'admin', '2021-12-19 15:10:13', NULL); +INSERT INTO `sys_dict_data` VALUES (114, 2, '网关设备', '2', 'iot_device_type', NULL, 'default', 'N', '0', 'admin', '2021-12-19 15:04:28', 'admin', '2023-02-09 16:25:46', NULL); +INSERT INTO `sys_dict_data` VALUES (116, 1, 'WIFI', '1', 'iot_network_method', NULL, 'default', 'N', '0', 'admin', '2021-12-19 15:07:35', 'admin', '2021-12-22 00:11:19', NULL); +INSERT INTO `sys_dict_data` VALUES (117, 2, '蜂窝(2G/3G/4G/5G)', '2', 'iot_network_method', NULL, 'default', 'N', '0', 'admin', '2021-12-19 15:08:30', 'admin', '2022-01-14 02:12:27', NULL); +INSERT INTO `sys_dict_data` VALUES (118, 3, '以太网', '3', 'iot_network_method', NULL, 'default', 'N', '0', 'admin', '2021-12-19 15:09:08', 'admin', '2022-01-14 02:12:39', NULL); +INSERT INTO `sys_dict_data` VALUES (119, 1, '简单认证', '1', 'iot_vertificate_method', NULL, 'default', 'N', '0', 'admin', '2021-12-19 15:13:16', 'admin', '2022-06-05 00:14:48', NULL); +INSERT INTO `sys_dict_data` VALUES (120, 2, '加密认证', '2', 'iot_vertificate_method', NULL, 'default', 'N', '0', 'admin', '2021-12-19 15:13:26', 'admin', '2022-06-05 00:14:57', NULL); +INSERT INTO `sys_dict_data` VALUES (122, 1, 'ESP8266/Arduino', '1', 'iot_device_chip', NULL, 'default', 'N', '0', 'admin', '2021-12-24 15:54:52', 'admin', '2021-12-24 16:07:31', NULL); +INSERT INTO `sys_dict_data` VALUES (123, 3, 'ESP32/Arduino', '2', 'iot_device_chip', NULL, 'default', 'N', '0', 'admin', '2021-12-24 15:55:04', 'admin', '2021-12-24 16:07:26', NULL); +INSERT INTO `sys_dict_data` VALUES (124, 2, 'ESP8266/RTOS', '3', 'iot_device_chip', NULL, 'default', 'N', '0', 'admin', '2021-12-24 15:56:08', 'admin', '2021-12-24 16:07:17', NULL); +INSERT INTO `sys_dict_data` VALUES (127, 4, 'ESP32/ESP-IDF', '4', 'iot_device_chip', NULL, 'default', 'N', '0', 'admin', '2021-12-24 16:07:54', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (128, 5, '树莓派/Python', '5', 'iot_device_chip', NULL, 'default', 'N', '0', 'admin', '2021-12-24 16:08:31', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (129, 0, '未激活', '1', 'iot_device_status', NULL, 'warning', 'N', '0', 'admin', '2021-12-27 22:21:04', 'admin', '2021-12-27 22:22:09', NULL); +INSERT INTO `sys_dict_data` VALUES (130, 0, '禁用', '2', 'iot_device_status', NULL, 'danger', 'N', '0', 'admin', '2021-12-27 22:21:22', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (131, 0, '在线', '3', 'iot_device_status', NULL, 'success', 'N', '0', 'admin', '2021-12-27 22:21:42', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (132, 0, '离线', '4', 'iot_device_status', NULL, 'info', 'N', '0', 'admin', '2021-12-27 22:22:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (133, 0, '启用', '1', 'iot_is_enable', NULL, 'success', 'N', '0', 'admin', '2022-01-12 23:25:08', 'admin', '2022-01-12 23:25:30', NULL); +INSERT INTO `sys_dict_data` VALUES (134, 0, '禁用', '0', 'iot_is_enable', NULL, 'info', 'N', '0', 'admin', '2022-01-12 23:25:19', 'admin', '2022-01-12 23:25:38', NULL); +INSERT INTO `sys_dict_data` VALUES (135, 0, '提醒通知', '1', 'iot_alert_level', NULL, 'success', 'N', '0', 'admin', '2022-01-13 14:58:10', 'admin', '2022-01-13 14:58:31', NULL); +INSERT INTO `sys_dict_data` VALUES (136, 0, '轻微问题', '2', 'iot_alert_level', NULL, 'warning', 'N', '0', 'admin', '2022-01-13 14:59:00', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (137, 0, '严重警告', '3', 'iot_alert_level', NULL, 'danger', 'N', '0', 'admin', '2022-01-13 14:59:16', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (138, 0, '不需要处理', '1', 'iot_process_status', NULL, 'default', 'N', '0', 'admin', '2022-01-13 15:06:03', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (139, 0, '未处理', '2', 'iot_process_status', NULL, 'default', 'N', '0', 'admin', '2022-01-13 15:06:14', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (140, 0, '已处理', '3', 'iot_process_status', NULL, 'default', 'N', '0', 'admin', '2022-01-13 15:06:24', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (141, 1, '属性上报', '1', 'iot_device_log_type', NULL, 'primary', 'N', '0', 'admin', '2022-01-13 15:10:32', 'admin', '2022-03-13 00:20:25', NULL); +INSERT INTO `sys_dict_data` VALUES (142, 3, '事件上报', '3', 'iot_device_log_type', NULL, 'danger', 'N', '0', 'admin', '2022-01-13 15:10:43', 'admin', '2022-03-13 00:21:00', NULL); +INSERT INTO `sys_dict_data` VALUES (143, 2, '功能调用', '2', 'iot_device_log_type', NULL, 'warning', 'N', '0', 'admin', '2022-01-13 15:10:55', 'admin', '2022-03-13 00:20:32', NULL); +INSERT INTO `sys_dict_data` VALUES (144, 4, '设备升级', '4', 'iot_device_log_type', NULL, 'success', 'N', '0', 'admin', '2022-01-13 15:11:08', 'admin', '2022-03-13 00:21:06', NULL); +INSERT INTO `sys_dict_data` VALUES (145, 5, '设备上线', '5', 'iot_device_log_type', NULL, 'success', 'N', '0', 'admin', '2022-01-13 15:11:23', 'admin', '2022-03-13 00:21:26', NULL); +INSERT INTO `sys_dict_data` VALUES (146, 6, '设备离线', '6', 'iot_device_log_type', NULL, 'info', 'N', '0', 'admin', '2022-01-13 15:11:32', 'admin', '2022-03-13 00:21:13', NULL); +INSERT INTO `sys_dict_data` VALUES (147, 4, '其他', '4', 'iot_network_method', NULL, 'default', 'N', '0', 'admin', '2022-01-14 02:12:49', 'admin', '2022-01-14 02:13:03', NULL); +INSERT INTO `sys_dict_data` VALUES (148, 6, '安卓/Android', '6', 'iot_device_chip', NULL, 'default', 'N', '0', 'admin', '2022-01-16 12:39:27', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (149, 7, '其他', '7', 'iot_device_chip', NULL, 'default', 'N', '0', 'admin', '2022-01-16 12:39:55', 'admin', '2022-01-16 12:40:13', NULL); +INSERT INTO `sys_dict_data` VALUES (150, 1, '小度平台', '1', 'oauth_platform', NULL, 'primary', 'N', '0', 'admin', '2022-02-07 20:29:23', 'admin', '2022-02-07 22:24:28', NULL); +INSERT INTO `sys_dict_data` VALUES (151, 2, '天猫精灵', '2', 'oauth_platform', NULL, 'danger', 'N', '0', 'admin', '2022-02-07 20:29:41', 'admin', '2022-02-07 22:23:14', NULL); +INSERT INTO `sys_dict_data` VALUES (152, 3, '小米小爱', '3', 'oauth_platform', NULL, 'success', 'N', '0', 'admin', '2022-02-07 20:30:07', 'admin', '2022-02-07 22:23:24', NULL); +INSERT INTO `sys_dict_data` VALUES (153, 4, '其他平台', '4', 'oauth_platform', NULL, 'warning', 'N', '0', 'admin', '2022-02-07 22:23:52', 'admin', '2022-02-07 22:24:02', NULL); +INSERT INTO `sys_dict_data` VALUES (154, 1, '微信登录', 'WECHAT', 'iot_social_platform', NULL, 'default', 'N', '0', 'admin', '2022-04-20 16:41:33', 'admin', '2023-09-22 10:27:54', NULL); +INSERT INTO `sys_dict_data` VALUES (155, 2, 'QQ登录', 'QQ', 'iot_social_platform', NULL, 'default', 'N', '0', 'admin', '2022-04-20 16:42:46', 'admin', '2023-09-22 10:28:03', NULL); +INSERT INTO `sys_dict_data` VALUES (156, 0, '启用', '0', 'iot_social_platform_status', NULL, 'success', 'N', '0', 'admin', '2022-04-20 17:02:48', 'admin', '2022-05-12 17:39:40', '启用'); +INSERT INTO `sys_dict_data` VALUES (157, 1, '未启用', '1', 'iot_social_platform_status', NULL, 'info', 'N', '0', 'admin', '2022-04-20 17:03:15', 'admin', '2022-05-21 13:44:13', '禁用'); +INSERT INTO `sys_dict_data` VALUES (158, 3, '支付宝', 'ALIPAY', 'iot_social_platform', NULL, 'default', 'N', '0', 'admin', '2022-05-12 17:49:24', 'admin', '2022-05-12 17:50:21', NULL); +INSERT INTO `sys_dict_data` VALUES (159, 1, '自动定位', '1', 'iot_location_way', NULL, 'success', 'N', '0', 'admin', '2022-05-21 13:46:51', 'admin', '2022-05-21 13:53:23', 'IP定位,精确到城市'); +INSERT INTO `sys_dict_data` VALUES (160, 2, '设备定位', '2', 'iot_location_way', NULL, 'warning', 'N', '0', 'admin', '2022-05-21 13:46:51', 'admin', '2022-05-21 13:49:21', '最精确定位'); +INSERT INTO `sys_dict_data` VALUES (161, 3, '自定义位置', '3', 'iot_location_way', NULL, 'primary', 'N', '0', 'admin', '2022-05-21 13:48:50', 'admin', '2022-05-21 13:55:45', '位置自定义'); +INSERT INTO `sys_dict_data` VALUES (162, 3, '简单+加密', '3', 'iot_vertificate_method', NULL, 'default', 'N', '0', 'admin', '2022-06-05 00:15:46', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (163, 1, '未使用', '1', 'iot_auth_status', NULL, 'info', 'N', '0', 'admin', '2022-06-07 17:39:22', 'admin', '2022-06-07 17:40:10', NULL); +INSERT INTO `sys_dict_data` VALUES (164, 2, '已使用', '2', 'iot_auth_status', NULL, 'success', 'N', '0', 'admin', '2022-06-07 17:40:01', 'admin', '2022-06-07 23:21:49', NULL); +INSERT INTO `sys_dict_data` VALUES (165, 7, '对象', 'object', 'iot_data_type', NULL, 'default', 'N', '0', 'admin', '2023-02-09 16:20:57', 'admin', '2023-02-09 16:21:08', NULL); +INSERT INTO `sys_dict_data` VALUES (166, 3, '监控设备', '3', 'iot_device_type', NULL, 'default', 'N', '0', 'admin', '2023-02-09 16:26:00', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (198, 0, 'MQTT', 'MQTT', 'iot_transport_type', NULL, 'default', 'N', '0', 'admin', '2023-02-28 16:35:40', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (199, 1, 'TCP', 'TCP', 'iot_transport_type', NULL, 'default', 'N', '0', 'admin', '2023-02-28 16:35:51', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (201, 2, 'UDP', 'UDP', 'iot_transport_type', NULL, 'default', 'N', '0', 'admin', '2023-02-28 16:36:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (230, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2023-03-10 23:28:32', '', NULL, '其他操作'); +INSERT INTO `sys_dict_data` VALUES (231, 0, '事件上报', '3', 'iot_event_type', NULL, 'danger', 'N', '0', 'admin', '2023-03-29 00:25:28', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (232, 0, '设备上线', '5', 'iot_event_type', NULL, 'success', 'N', '0', 'admin', '2023-03-29 00:25:52', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (233, 0, '设备离线', '6', 'iot_event_type', NULL, 'info', 'N', '0', 'admin', '2023-03-29 00:26:09', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (234, 0, '服务下发', '1', 'iot_function_type', NULL, 'primary', 'N', '0', 'admin', '2023-03-29 00:38:26', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (235, 0, '属性获取', '2', 'iot_function_type', NULL, 'success', 'N', '0', 'admin', '2023-03-29 00:38:44', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (237, 0, '读写', '0', 'iot_data_read_write', NULL, 'primary', 'N', '0', 'admin', '2023-04-09 02:12:05', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (238, 0, '只读', '1', 'iot_data_read_write', NULL, 'info', 'N', '0', 'admin', '2023-04-09 02:12:19', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (239, 0, '全部设备', '1', 'oat_update_limit', NULL, 'default', 'N', '0', 'admin', '2023-04-09 23:57:06', 'admin', '2023-04-11 11:53:57', NULL); +INSERT INTO `sys_dict_data` VALUES (240, 1, '指定设备', '2', 'oat_update_limit', NULL, 'default', 'N', '0', 'admin', '2023-04-11 11:53:28', 'admin', '2023-04-11 11:53:52', NULL); +INSERT INTO `sys_dict_data` VALUES (241, 4, 'GB28181', 'GB28181', 'iot_transport_type', NULL, 'primary', 'N', '0', 'admin', '2023-05-12 14:25:39', 'admin', '2023-05-12 14:26:09', NULL); +INSERT INTO `sys_dict_data` VALUES (242, 1, '02(读离散量输入)', '2', 'iot_modbus_status_code', NULL, 'default', 'N', '0', 'admin', '2023-07-03 10:16:48', 'admin', '2023-07-03 10:17:35', NULL); +INSERT INTO `sys_dict_data` VALUES (243, 3, '04(读输入寄存器)', '4', 'iot_modbus_status_code', NULL, 'default', 'N', '0', 'admin', '2023-07-03 10:17:18', 'admin', '2023-07-03 10:17:58', NULL); +INSERT INTO `sys_dict_data` VALUES (247, 4, '微信开放平台网站应用', 'wechat_open_web', 'iot_social_platform', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (248, 5, '微信开放平台移动应用', 'wechat_open_mobile', 'iot_social_platform', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:29:14', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (249, 6, '微信开放平台小程序', 'wechat_open_mini_program', 'iot_social_platform', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:38:12', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (250, 0, '16位 无符号', 'ushort', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:11:54', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (251, 1, '16位 有符号', 'short', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:12:26', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (252, 2, '32位 有符号(ABCD)', 'long-ABCD', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:12:53', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (253, 3, '32位 有符号(CDAB)', 'long-CDAB', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:13:21', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (254, 4, '32位 无符号(ABCD)', 'ulong-ABCD', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:13:42', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (255, 5, '32位 无符号(CDAB)', 'ulong-CDAB', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:14:06', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (256, 6, '32位 浮点数(ABCD)', 'float-ABCD', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:14:28', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (257, 7, '32位 浮点数(CDAB)', 'float-CDAB', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:14:50', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (258, 8, '位', 'bit', 'iot_modbus_data_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 14:15:13', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (259, 0, '电灯', 'LIGHT', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (260, 0, '空调', 'AIR_CONDITION', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (261, 0, '窗帘', 'CURTAIN', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (262, 0, '窗纱', 'CURT_SIMP', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (263, 0, '插座', 'SOCKET', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (264, 0, '开关', 'SWITCH', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (265, 0, '冰箱', 'FRIDGE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (266, 0, '净水器', 'WATER_PURIFIER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (267, 0, '加湿器', 'HUMIDIFIER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (268, 0, '除湿器', 'DEHUMIDIFIER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (269, 0, '电磁炉', 'INDUCTION_COOKER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (270, 0, '空气净化器', 'AIR_PURIFIER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (271, 0, '洗衣机', 'WASHING_MACHINE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (272, 0, '热水器', 'WATER_HEATER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (273, 0, '燃气灶', 'GAS_STOVE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (274, 0, '电视机', 'TV_SET', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (275, 0, '网络盒子', 'OTT_BOX', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (276, 0, '油烟机', 'RANGE_HOOD', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (277, 0, '电风扇', 'FAN', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (278, 0, '投影仪', 'PROJECTOR', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (279, 0, '扫地机器人', 'SWEEPING_ROBOT', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (280, 0, '热水壶', 'KETTLE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (281, 0, '微波炉', 'MICROWAVE_OVEN', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (282, 0, '压力锅', 'PRESSURE_COOKER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (283, 0, '电饭煲', 'RICE_COOKER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (284, 0, '破壁机', 'HIGH_SPEED_BLENDER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (285, 0, '新风机', 'AIR_FRESHER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (286, 0, '晾衣架', 'CLOTHES_RACK', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (287, 0, '烤箱设备', 'OVEN', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (288, 0, '蒸烤箱', 'STEAM_OVEN', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (289, 0, '蒸箱', 'STEAM_BOX', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (290, 0, '电暖器', 'HEATER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (291, 0, '开窗器', 'WINDOW_OPENER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (292, 0, '摄像头', 'WEBCAM', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (293, 0, '相机', 'CAMERA', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (294, 0, '机器人', 'ROBOT', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (295, 0, '打印机', 'PRINTER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (296, 0, '饮水机', 'WATER_COOLER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (297, 0, '鱼缸', 'FISH_TANK', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (298, 0, '浇花器', 'WATERING_DEVICE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (299, 0, '机顶盒', 'SET_TOP_BOX', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (300, 0, '香薰机', 'AROMATHERAPY_MACHINE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (301, 0, 'DVD', 'DVD', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (302, 0, '鞋柜', 'SHOE_CABINET', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (303, 0, '走步机', 'WALKING_MACHINE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (304, 0, '跑步机', 'TREADMILL', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (305, 0, '床', 'BED', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (306, 0, '浴霸', 'YUBA', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (307, 0, '花洒', 'SHOWER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (308, 0, '浴缸', 'BATHTUB', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (309, 0, '消毒柜', 'DISINFECTION_CABINET', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (310, 0, '洗碗机', 'DISHWASHER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (311, 0, '沙发品类', 'SOFA', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (312, 0, '门铃', 'DOOR_BELL', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (313, 0, '电梯', 'ELEVATOR', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (314, 0, '体重秤', 'WEIGHT_SCALE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (315, 0, '体脂秤', 'BODY_FAT_SCALE', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (316, 0, '壁挂炉', 'WALL_HUNG_GAS_BOILER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (317, 0, '特定设备的组合场景', 'SCENE_TRIGGER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, '描述特定设备的组合场景,设备之间没有相互关联,无特定操作顺序。 例如“打开睡眠模式”包括关灯和锁上房门,但是关灯和锁上房门之间没有必然联系,可以先关灯然后锁上房门,也可以先锁上房门后关灯'); +INSERT INTO `sys_dict_data` VALUES (318, 0, '特定设备的组合场景', 'ACTIVITY_TRIGGER', 'dueros_related_device', NULL, 'default', 'N', '0', 'admin', '2023-08-23 11:28:15', '', NULL, '描述特定设备的组合场景。场景中的设备必须以指定顺序操作。如“观看优酷视频”场景中必须先打开电视机,然后打开HDMI1'); +INSERT INTO `sys_dict_data` VALUES (319, 0, '打开', 'turnOn', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (320, 0, '关闭', 'turnOff', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (321, 0, '定时打开', 'timingTurnOn', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (322, 0, '定时关闭', 'timingTurnOff', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (323, 0, '暂停', 'pause', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (324, 0, '继续', 'continue', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (325, 0, '设置颜色', 'setColor', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (326, 0, '设置灯光色温', 'setColorTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (327, 0, '增高灯光色温', 'incrementColorTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (328, 0, '降低灯光色温', 'decrementColorTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (329, 0, '设置灯光亮度', 'setBrightnessPercentage', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (330, 0, '调亮灯光', 'incrementBrightnessPercentage', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (331, 0, '调暗灯光', 'decrementBrightnessPercentage', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (332, 0, '设置功率', 'setPower', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (333, 0, '增大功率', 'incrementPower', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (334, 0, '减小功率', 'decrementPower', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (335, 0, '升高温度', 'incrementTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (336, 0, '降低温度', 'decrementTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (337, 0, '设置温度', 'setTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (338, 0, '增加风速', 'incrementFanSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (339, 0, '减小风速', 'decrementFanSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (340, 0, '设置风速', 'setFanSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (341, 0, '设置档位', 'setGear', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (342, 0, '设置模式', 'setMode', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (343, 0, '取消设置的模式', 'unSetMode', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (344, 0, '定时设置模式', 'timingSetMode', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (345, 0, '定时取消设置的模式', 'timingUnsetMode', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (346, 0, '调高音量', 'incrementVolume', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (347, 0, '调低音量', 'decrementVolume', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (348, 0, '设置音量', 'setVolume', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (349, 0, '设置静音状态', 'setVolumeMute', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (350, 0, '上一个频道', 'decrementTVChannel', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (351, 0, '下一个频道', 'incrementTVChannel', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (352, 0, '设置频道', 'setTVChannel', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (353, 0, '返回上个频道', 'returnTVChannel', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (354, 0, '开始充电', 'chargeTurnOn', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (355, 0, '停止充电', 'chargeTurnOff', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (356, 0, '查询开关状态', 'getTurnOnState', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (357, 0, '查询油量', 'getOilCapacity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (358, 0, '查询电量', 'getElectricityCapacity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (359, 0, '上锁/解锁', 'setLockState', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (360, 0, '查询锁状态', 'getLockState', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (361, 0, '设置吸力', 'setSuction', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (362, 0, '设置水量', 'setWaterLevel', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (363, 0, '设置清扫位置', 'setCleaningLocation', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (364, 0, '执行自定义复杂动作', 'setComplexActions', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (365, 0, '设置移动方向', 'setDirection', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (366, 0, '打印', 'submitPrint', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (367, 0, '查询PM2.5', 'getAirPM25', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (368, 0, '查询PM10', 'getAirPM10', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (369, 0, '查询二氧化碳含量', 'getCO2Quantity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (370, 0, '查询空气质量', 'getAirQualityIndex', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (371, 0, '查询温度(当前温度和目标温度)', 'getTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (372, 0, '查询当前温度', 'getTemperatureReading', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (373, 0, '查询目标温度', 'getTargetTemperature', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (374, 0, '查询湿度', 'getHumidity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (375, 0, '查询目标湿度', 'getTargetHumidity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (376, 0, '查询水质', 'getWaterQuality', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (377, 0, '查询设备所有状态', 'getState', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (378, 0, '查询剩余时间', 'getTimeLeft', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (379, 0, '查询运行状态', 'getRunningStatus', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (380, 0, '查询运行时间', 'getRunningTime', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (381, 0, '查询设备所在位置', 'getLocation', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (382, 0, '设备定时', 'setTimer', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (383, 0, '取消设备定时', 'timingCancel', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (384, 0, '设备复位', 'reset', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (385, 0, '升高高度', 'incrementHeight', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (386, 0, '降低高度', 'decrementHeight', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (387, 0, '设置摆风角度', 'setSwingAngle', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (388, 0, '查询风速', 'getFanSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (389, 0, '设置湿度模式', 'setHumidity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (390, 0, '增大湿度', 'incrementHumidity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (391, 0, '降低湿度', 'decrementHumidity', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (392, 0, '增大雾量', 'incrementMist', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (393, 0, '见效雾量', 'decrementMist', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (394, 0, '设置雾量', 'setMist', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (395, 0, '设备启动', 'startUp', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (396, 0, '设置电梯楼层', 'setFloor', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (397, 0, '电梯按下', 'decrementFloor', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (398, 0, '电梯按上', 'incrementFloor', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (399, 0, '增加速度', 'incrementSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (400, 0, '降低速度', 'decrementSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (401, 0, '设置速度', 'setSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (402, 0, '获取速度', 'getSpeed', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (403, 0, '获取跑步信息', 'getMotionInfo', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (404, 0, '打开灶眼', 'turnOnBurner', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (405, 0, '关闭灶眼', 'turnOffBurner', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (406, 0, '定时打开灶眼', 'timingTurnOnBurner', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (407, 0, '定时关闭灶眼', 'timingTurnOffBurner', 'dueros_operate_type', NULL, 'default', 'N', '0', 'admin', '2023-09-22 10:35:15', '', NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `dict_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_id`) USING BTREE, + UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 134 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict_type +-- ---------------------------- +INSERT INTO `sys_dict_type` VALUES (1, '用户性别', 'sys_user_sex', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '用户性别列表'); +INSERT INTO `sys_dict_type` VALUES (2, '菜单状态', 'sys_show_hide', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '菜单状态列表'); +INSERT INTO `sys_dict_type` VALUES (3, '系统开关', 'sys_normal_disable', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '系统开关列表'); +INSERT INTO `sys_dict_type` VALUES (4, '任务状态', 'sys_job_status', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '任务状态列表'); +INSERT INTO `sys_dict_type` VALUES (5, '任务分组', 'sys_job_group', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '任务分组列表'); +INSERT INTO `sys_dict_type` VALUES (6, '系统是否', 'sys_yes_no', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '系统是否列表'); +INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '通知类型列表'); +INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '通知状态列表'); +INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '操作类型列表'); +INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '登录状态列表'); +INSERT INTO `sys_dict_type` VALUES (100, '物模型类别', 'iot_things_type', '0', 'admin', '2021-12-12 16:39:47', 'admin', '2021-12-15 22:49:19', '属性、动作、事件'); +INSERT INTO `sys_dict_type` VALUES (101, '数据类型', 'iot_data_type', '0', 'admin', '2021-12-12 20:16:48', 'admin', '2021-12-12 20:17:54', 'integer、decimal、bool、string、enum'); +INSERT INTO `sys_dict_type` VALUES (102, '是否', 'iot_yes_no', '0', 'admin', '2021-12-12 20:24:51', 'admin', '2021-12-19 15:12:35', '是、否'); +INSERT INTO `sys_dict_type` VALUES (103, '产品状态', 'iot_product_status', '0', 'admin', '2021-12-19 15:00:13', '', NULL, '未发布、已发布(不能修改)'); +INSERT INTO `sys_dict_type` VALUES (104, '设备类型', 'iot_device_type', '0', 'admin', '2021-12-19 15:03:06', '', NULL, '直连设备、网关子设备、网关设备'); +INSERT INTO `sys_dict_type` VALUES (105, '联网方式', 'iot_network_method', '0', 'admin', '2021-12-19 15:07:12', 'admin', '2022-01-14 02:11:58', 'wifi、蜂窝(2G/3G/4G/5G)、以太网、其他'); +INSERT INTO `sys_dict_type` VALUES (106, '认证方式', 'iot_vertificate_method', '0', 'admin', '2021-12-19 15:11:48', 'admin', '2022-06-05 12:57:02', '1=简单认证、2=加密认证、3=简单+加密'); +INSERT INTO `sys_dict_type` VALUES (107, '设备芯片', 'iot_device_chip', '0', 'admin', '2021-12-24 15:53:27', 'admin', '2022-01-22 00:14:23', 'ESP8266、ESP32、树莓派'); +INSERT INTO `sys_dict_type` VALUES (109, '设备状态', 'iot_device_status', '0', 'admin', '2021-12-27 22:19:55', 'admin', '2021-12-27 22:20:13', '未激活、禁用、在线、离线'); +INSERT INTO `sys_dict_type` VALUES (110, '是否启用', 'iot_is_enable', '0', 'admin', '2022-01-12 23:24:01', 'admin', '2022-01-12 23:24:15', '启用、禁用'); +INSERT INTO `sys_dict_type` VALUES (111, '告警类型', 'iot_alert_level', '0', 'admin', '2022-01-13 14:56:44', 'admin', '2022-01-13 15:04:46', '1=提醒通知,2=轻微问题,3=严重警告'); +INSERT INTO `sys_dict_type` VALUES (112, '处理状态', 'iot_process_status', '0', 'admin', '2022-01-13 15:04:06', 'admin', '2022-01-13 15:06:39', '1=不需要处理,2=未处理,3=已处理'); +INSERT INTO `sys_dict_type` VALUES (113, '设备日志类型', 'iot_device_log_type', '0', 'admin', '2022-01-13 15:09:49', 'admin', '2022-03-13 00:22:43', '1=属性上报,2=调用功能,3=事件上报,4=设备升级,5=设备上线,6=设备离线'); +INSERT INTO `sys_dict_type` VALUES (114, 'Oauth开放平台', 'oauth_platform', '0', 'admin', '2022-02-07 20:27:48', 'admin', '2022-05-21 13:44:50', '1=小度,2=天猫精灵,3=小爱,4=其他'); +INSERT INTO `sys_dict_type` VALUES (115, '第三方登录平台', 'iot_social_platform', '0', 'admin', '2022-04-12 15:28:13', 'admin', '2022-04-12 15:37:48', 'Wechat、QQ、'); +INSERT INTO `sys_dict_type` VALUES (116, '第三方登录平台状态', 'iot_social_platform_status', '0', 'admin', '2022-04-20 17:02:13', 'admin', '2022-04-20 17:02:23', '第三方登录平台状态'); +INSERT INTO `sys_dict_type` VALUES (117, '设备定位方式', 'iot_location_way', '0', 'admin', '2022-05-21 13:45:16', 'admin', '2022-05-21 13:46:06', '1=IP自动定位,2=设备定位,3=自定义'); +INSERT INTO `sys_dict_type` VALUES (118, '授权码状态', 'iot_auth_status', '0', 'admin', '2022-06-07 17:38:56', '', NULL, '1=未分配,2=使用中'); +INSERT INTO `sys_dict_type` VALUES (119, 'SipID状态', 'sip_gen_status', '0', 'admin', '2023-02-19 15:43:36', 'admin', '2023-02-19 15:45:54', '1=未使用,2=使用中'); +INSERT INTO `sys_dict_type` VALUES (120, '监控设备类型', 'video_type', '0', 'admin', '2023-02-22 01:06:38', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (121, '通道类型', 'channel_type', '0', 'admin', '2023-02-22 01:11:51', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (122, '轮询方式', 'data_collect_type', '0', 'admin', '2023-02-28 13:55:45', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (123, '批量采集时间', 'iot_modbus_poll_time', '0', 'admin', '2023-02-28 14:38:21', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (124, '寄存器功能码', 'iot_modbus_status_code', '0', 'admin', '2023-02-28 15:19:02', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (125, '传输协议类型', 'iot_transport_type', '0', 'admin', '2023-02-28 16:35:20', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (126, '设备事件类型', 'iot_event_type', '0', 'admin', '2023-03-29 00:24:51', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (127, '指令下发类型', 'iot_function_type', '0', 'admin', '2023-03-29 00:37:51', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (128, '读写类型', 'iot_data_read_write', '0', 'admin', '2023-04-09 02:11:14', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (129, '升级范围', 'oat_update_limit', '0', 'admin', '2023-04-09 23:51:45', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (130, '云存储平台类型', 'oss_platform_type', '0', 'admin', '2023-04-12 00:26:09', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (131, 'modbus数据类型', 'iot_modbus_data_type', '0', 'admin', '2023-09-04 13:54:17', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (132, '小度音箱关联设备', 'dueros_related_device', '0', 'admin', '2023-09-22 09:45:15', 'admin', '2023-09-22 09:45:15', '小度音箱支持的设备、场景类型,在设备下配置关联'); +INSERT INTO `sys_dict_type` VALUES (133, '小度音箱操作类型', 'dueros_operate_type', '0', 'admin', '2023-09-22 09:45:15', 'admin', '2023-09-22 09:45:15', '小度音箱智能家居设备操作类型,在产品物模型下配置'); + +-- ---------------------------- +-- Table structure for sys_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注信息', + PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_job +-- ---------------------------- +INSERT INTO `sys_job` VALUES (2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_job` VALUES (4, 'modbus云端轮询', 'SYSTEM', 'propGetServiceImpl.fetchProperty', '0 0/1 * * * ? ', '1', '0', '0', 'admin', '2023-02-28 17:28:03', 'admin', '2023-04-08 22:07:42', ''); +INSERT INTO `sys_job` VALUES (5, '设备定时任务', 'SYSTEM', 'deviceJob.timingUpdateDeviceStatusStatus', '0 0/1 * * * ? ', '1', '1', '1', 'admin', '2023-03-24 10:57:48', 'admin', '2023-03-31 21:14:55', ''); + +-- ---------------------------- +-- Table structure for sys_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串', + `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日志信息', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '异常信息', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_job_log +-- ---------------------------- +INSERT INTO `sys_job_log` VALUES (1, 'modbus云端轮询', 'SYSTEM', 'propGetServiceImpl.fetchProperty', 'modbus云端轮询 总共耗时:2毫秒', '0', '', '2023-09-26 22:22:00'); +INSERT INTO `sys_job_log` VALUES (2, '监控在线状态更新', 'SYSTEM', 'deviceJob.updateSipDeviceOnlineStatus(90)', '监控在线状态更新 总共耗时:8毫秒', '0', '', '2023-09-26 22:22:00'); +INSERT INTO `sys_job_log` VALUES (3, 'modbus云端轮询', 'SYSTEM', 'propGetServiceImpl.fetchProperty', 'modbus云端轮询 总共耗时:1毫秒', '0', '', '2023-09-26 22:23:00'); + +-- ---------------------------- +-- Table structure for sys_logininfor +-- ---------------------------- +DROP TABLE IF EXISTS `sys_logininfor`; +CREATE TABLE `sys_logininfor` ( + `info_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户账号', + `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作系统', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '提示消息', + `login_time` datetime(0) NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`info_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_logininfor +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', + `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父菜单ID', + `order_num` int(4) NULL DEFAULT 0 COMMENT '显示顺序', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '路由地址', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径', + `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由参数', + `is_frame` int(1) NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)', + `is_cache` int(1) NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '菜单图标', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3050 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 4, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'system', 'admin', '2021-12-15 21:36:18', 'admin', '2023-09-16 16:42:52', '系统管理目录'); +INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 5, 'monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', '2021-12-15 21:36:18', 'admin', '2023-08-24 17:21:20', '系统监控目录'); +INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 6, 'tool', NULL, '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', '2021-12-15 21:36:18', 'admin', '2023-08-24 17:21:28', '系统工具目录'); +INSERT INTO `sys_menu` VALUES (4, '蜂信物联', 0, 9, 'http://fastbee.cn', NULL, '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', '2021-12-15 21:36:18', 'admin', '2023-08-24 17:21:59', '若依官网地址'); +INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', '2021-12-15 21:36:18', '', NULL, '用户管理菜单'); +INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', '2021-12-15 21:36:18', '', NULL, '角色管理菜单'); +INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', '2021-12-15 21:36:18', '', NULL, '菜单管理菜单'); +INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', '2021-12-15 21:36:18', '', NULL, '部门管理菜单'); +INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', '2021-12-15 21:36:18', '', NULL, '岗位管理菜单'); +INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', '2021-12-15 21:36:18', '', NULL, '字典管理菜单'); +INSERT INTO `sys_menu` VALUES (106, '参数设置', 1, 7, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', '2021-12-15 21:36:18', '', NULL, '参数设置菜单'); +INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', '2021-12-15 21:36:18', '', NULL, '通知公告菜单'); +INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', '2021-12-15 21:36:18', '', NULL, '日志管理菜单'); +INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', '2021-12-15 21:36:18', '', NULL, '在线用户菜单'); +INSERT INTO `sys_menu` VALUES (110, '定时任务', 2, 2, 'job', 'monitor/job/index', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', '2021-12-15 21:36:18', '', NULL, '定时任务菜单'); +INSERT INTO `sys_menu` VALUES (111, '数据监控', 2, 3, 'druid', 'monitor/druid/index', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', '2021-12-15 21:36:18', '', NULL, '数据监控菜单'); +INSERT INTO `sys_menu` VALUES (112, '服务监控', 2, 4, 'server', 'monitor/server/index', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', '2021-12-15 21:36:18', '', NULL, '服务监控菜单'); +INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', '2021-12-15 21:36:18', '', NULL, '缓存监控菜单'); +INSERT INTO `sys_menu` VALUES (114, '表单构建', 3, 1, 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', '2021-12-15 21:36:18', '', NULL, '表单构建菜单'); +INSERT INTO `sys_menu` VALUES (115, '代码生成', 3, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', '2021-12-15 21:36:18', '', NULL, '代码生成菜单'); +INSERT INTO `sys_menu` VALUES (116, '系统接口', 3, 3, 'swagger', 'tool/swagger/index', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', '2021-12-15 21:36:18', '', NULL, '系统接口菜单'); +INSERT INTO `sys_menu` VALUES (124, '缓存列表', 2, 6, 'cacheList', 'monitor/cache/list', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', '2023-03-10 23:22:42', '', NULL, '缓存列表菜单'); +INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', '2021-12-15 21:36:18', '', NULL, '操作日志菜单'); +INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', '2021-12-15 21:36:18', '', NULL, '登录日志菜单'); +INSERT INTO `sys_menu` VALUES (1001, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1002, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1003, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1004, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1005, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1006, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1007, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1008, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1009, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1010, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1011, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1012, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1013, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1014, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1015, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1016, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1017, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1018, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1019, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1020, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1021, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1022, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1023, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1024, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1025, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1026, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1027, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1028, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1029, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1030, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1031, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1032, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1033, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1034, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1035, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1036, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1037, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1038, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1039, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1040, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1041, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1042, '日志导出', 500, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1043, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1044, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1045, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1049, '任务查询', 110, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1050, '任务新增', 110, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1051, '任务修改', 110, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1052, '任务删除', 110, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1053, '状态修改', 110, 5, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1054, '任务导出', 110, 7, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1055, '生成查询', 115, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1056, '生成修改', 115, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1057, '生成删除', 115, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1058, '导入代码', 115, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1059, '预览代码', 115, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1060, '生成代码', 115, 5, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1065, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', '2023-03-10 23:23:04', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2000, '设备管理', 0, 0, 'iot', NULL, NULL, 1, 0, 'M', '0', '0', '', 'iot', 'admin', '2021-12-15 23:57:06', 'admin', '2021-12-26 23:55:54', ''); +INSERT INTO `sys_menu` VALUES (2049, '通用物模型', 2000, 1, 'template', 'iot/template/index', NULL, 1, 0, 'C', '0', '0', 'iot:template:list', 'model', 'admin', '2021-12-16 00:41:28', 'admin', '2021-12-26 23:56:09', '通用物模型菜单'); +INSERT INTO `sys_menu` VALUES (2050, '通用物模型查询', 2049, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:template:query', '#', 'admin', '2021-12-16 00:41:28', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2051, '通用物模型新增', 2049, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:template:add', '#', 'admin', '2021-12-16 00:41:28', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2052, '通用物模型修改', 2049, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:template:edit', '#', 'admin', '2021-12-16 00:41:28', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2053, '通用物模型删除', 2049, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:template:remove', '#', 'admin', '2021-12-16 00:41:28', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2054, '通用物模型导出', 2049, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:template:export', '#', 'admin', '2021-12-16 00:41:28', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2001, '产品分类', 2000, 2, 'category', 'iot/category/index', NULL, 1, 0, 'C', '0', '0', 'iot:category:list', 'category', 'admin', '2021-12-16 00:40:02', 'admin', '2021-12-26 23:56:20', '产品分类菜单'); +INSERT INTO `sys_menu` VALUES (2002, '产品分类查询', 2001, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:category:query', '#', 'admin', '2021-12-16 00:40:02', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2003, '产品分类新增', 2001, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:category:add', '#', 'admin', '2021-12-16 00:40:02', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2004, '产品分类修改', 2001, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:category:edit', '#', 'admin', '2021-12-16 00:40:02', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2005, '产品分类删除', 2001, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:category:remove', '#', 'admin', '2021-12-16 00:40:02', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2006, '产品分类导出', 2001, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:category:export', '#', 'admin', '2021-12-16 00:40:02', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2043, '产品管理', 2000, 3, 'product', 'iot/product/index', NULL, 1, 0, 'C', '0', '0', 'iot:product:list', 'product', 'admin', '2021-12-16 00:41:18', 'admin', '2021-12-26 23:58:44', '产品菜单'); +INSERT INTO `sys_menu` VALUES (2044, '产品查询', 2043, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:product:query', '#', 'admin', '2021-12-16 00:41:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2045, '产品新增', 2043, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:product:add', '#', 'admin', '2021-12-16 00:41:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2046, '产品修改', 2043, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:product:edit', '#', 'admin', '2021-12-16 00:41:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2047, '产品删除', 2043, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:product:remove', '#', 'admin', '2021-12-16 00:41:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2048, '产品导出', 2043, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:product:export', '#', 'admin', '2021-12-16 00:41:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2019, '设备分组', 2000, 4, 'group', 'iot/group/index', NULL, 1, 0, 'C', '0', '0', 'iot:group:list', 'group', 'admin', '2021-12-16 00:40:31', 'admin', '2021-12-26 23:56:54', '设备分组菜单'); +INSERT INTO `sys_menu` VALUES (2020, '设备分组查询', 2019, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:group:query', '#', 'admin', '2021-12-16 00:40:31', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2021, '设备分组新增', 2019, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:group:add', '#', 'admin', '2021-12-16 00:40:31', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2022, '设备分组修改', 2019, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:group:edit', '#', 'admin', '2021-12-16 00:40:31', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2023, '设备分组删除', 2019, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:group:remove', '#', 'admin', '2021-12-16 00:40:31', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2024, '设备分组导出', 2019, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:group:export', '#', 'admin', '2021-12-16 00:40:31', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2007, '设备管理', 2000, 5, 'device', 'iot/device/index', NULL, 1, 0, 'C', '0', '0', 'iot:device:list', 'device', 'admin', '2021-12-16 00:40:12', 'admin', '2022-01-08 15:47:14', '设备菜单'); +INSERT INTO `sys_menu` VALUES (2008, '设备查询', 2007, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:device:query', '#', 'admin', '2021-12-16 00:40:12', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2009, '设备新增', 2007, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:device:add', '#', 'admin', '2021-12-16 00:40:12', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2010, '设备修改', 2007, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:device:edit', '#', 'admin', '2021-12-16 00:40:12', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2011, '设备删除', 2007, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:device:remove', '#', 'admin', '2021-12-16 00:40:12', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2012, '设备导出', 2007, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:device:export', '#', 'admin', '2021-12-16 00:40:12', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3007, '协议管理', 2000, 6, 'protocol', 'iot/protocol/index', NULL, 1, 0, 'C', '0', '0', 'iot:protocol:list', 'connect', 'admin', '2023-02-28 11:26:54', 'admin', '2023-04-12 22:02:14', '协议菜单'); +INSERT INTO `sys_menu` VALUES (3008, '协议查询', 3007, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:protocol:query', '#', 'admin', '2023-02-28 11:26:54', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3009, '协议新增', 3007, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:protocol:add', '#', 'admin', '2023-02-28 11:26:54', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3010, '协议修改', 3007, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:protocol:edit', '#', 'admin', '2023-02-28 11:26:54', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3011, '协议删除', 3007, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:protocol:remove', '#', 'admin', '2023-02-28 11:26:54', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3012, '协议导出', 3007, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:protocol:export', '#', 'admin', '2023-02-28 11:26:55', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2104, 'EMQ管理', 0, 8, 'http://81.71.97.58:18083/', NULL, NULL, 0, 0, 'M', '0', '0', '', 'mq', 'admin', '2022-02-26 00:42:12', 'admin', '2023-09-26 00:07:24', ''); +INSERT INTO `sys_menu` VALUES (2123, '新闻分类', 1, 10, 'newsCategory', 'iot/newsCategory/index', NULL, 1, 0, 'C', '0', '0', 'iot:newsCategory:list', 'category', 'admin', '2022-04-11 16:47:27', 'admin', '2022-05-12 17:20:51', '新闻分类菜单'); +INSERT INTO `sys_menu` VALUES (2124, '新闻分类查询', 2123, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:newsCategory:query', '#', 'admin', '2022-04-11 16:47:27', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2125, '新闻分类新增', 2123, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:newsCategory:add', '#', 'admin', '2022-04-11 16:47:27', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2126, '新闻分类修改', 2123, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:newsCategory:edit', '#', 'admin', '2022-04-11 16:47:27', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2127, '新闻分类删除', 2123, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:newsCategory:remove', '#', 'admin', '2022-04-11 16:47:27', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2128, '新闻分类导出', 2123, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:newsCategory:export', '#', 'admin', '2022-04-11 16:47:27', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2129, '新闻资讯', 1, 11, 'news', 'iot/news/index', NULL, 1, 0, 'C', '0', '0', 'iot:news:list', 'documentation', 'admin', '2022-04-11 16:47:46', 'admin', '2022-05-12 17:20:58', '新闻资讯菜单'); +INSERT INTO `sys_menu` VALUES (2130, '新闻资讯查询', 2129, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:news:query', '#', 'admin', '2022-04-11 16:47:46', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2131, '新闻资讯新增', 2129, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:news:add', '#', 'admin', '2022-04-11 16:47:46', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2132, '新闻资讯修改', 2129, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:news:edit', '#', 'admin', '2022-04-11 16:47:46', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2133, '新闻资讯删除', 2129, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:news:remove', '#', 'admin', '2022-04-11 16:47:46', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2134, '新闻资讯导出', 2129, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:news:export', '#', 'admin', '2022-04-11 16:47:46', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2136, '产品授权码查询', 2043, 6, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:authorize:query', '#', 'admin', '2022-04-11 17:17:53', 'admin', '2022-06-04 21:21:40', ''); +INSERT INTO `sys_menu` VALUES (2137, '产品授权码新增', 2043, 7, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:authorize:add', '#', 'admin', '2022-04-11 17:17:53', 'admin', '2022-06-04 21:21:59', ''); +INSERT INTO `sys_menu` VALUES (2138, '产品授权码修改', 2043, 8, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:authorize:edit', '#', 'admin', '2022-04-11 17:17:53', 'admin', '2022-06-04 21:22:08', ''); +INSERT INTO `sys_menu` VALUES (2139, '产品授权码删除', 2043, 9, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:authorize:remove', '#', 'admin', '2022-04-11 17:17:53', 'admin', '2022-06-04 21:22:26', ''); +INSERT INTO `sys_menu` VALUES (2140, '产品授权码导出', 2043, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:authorize:export', '#', 'admin', '2022-04-11 17:17:53', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2141, '三方登录', 1, 12, 'platform', 'iot/platform/index', NULL, 1, 1, 'C', '0', '0', 'iot:platform:list', 'cloud', 'admin', '2022-04-11 18:55:34', 'admin', '2023-08-23 11:26:52', ''); +INSERT INTO `sys_menu` VALUES (2142, '平台查询', 2142, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'iot:platform:query', '#', 'admin', '2022-04-11 19:10:28', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2147, '设备分享', 2007, 6, '', NULL, NULL, 1, 0, 'F', '0', '0', 'iot:device:share', '#', 'admin', '2022-06-10 01:08:40', 'admin', '2022-06-10 01:10:46', ''); +INSERT INTO `sys_menu` VALUES (2148, '设备定时', 2007, 7, '', NULL, NULL, 1, 0, 'F', '0', '0', 'iot:device:timer', '#', 'admin', '2022-06-10 01:10:30', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2149, '大屏展示', 3047, 5, 'https://iot.fastbee.cn/bigScreen', NULL, NULL, 0, 0, 'M', '0', '0', '', 'monitor-a', 'admin', '2022-08-13 22:32:11', 'admin', '2023-08-23 23:11:11', ''); +INSERT INTO `sys_menu` VALUES (3031, 'Netty管理', 0, 3, 'netty', NULL, NULL, 1, 0, 'M', '0', '0', '', 'mq', 'admin', '2022-02-26 00:42:12', 'admin', '2023-09-26 00:11:57', ''); +INSERT INTO `sys_menu` VALUES (3032, '客户端', 3031, 1, 'client', 'iot/netty/clients', NULL, 1, 0, 'C', '0', '0', 'monitor:server:list', 'client', 'admin', '2022-02-26 00:45:39', 'admin', '2023-08-23 23:38:08', ''); +INSERT INTO `sys_menu` VALUES (3033, '事件日志', 2000, 1, 'log', 'iot/log/index', NULL, 1, 0, 'F', '0', '0', 'iot:event:list', '#', 'admin', '2023-03-28 14:23:52', '', NULL, '事件日志菜单'); +INSERT INTO `sys_menu` VALUES (3034, '事件日志查询', 3033, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:event:query', '#', 'admin', '2023-03-28 14:23:52', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3035, '事件日志新增', 3033, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:event:add', '#', 'admin', '2023-03-28 14:23:52', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3036, '事件日志修改', 3033, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:event:edit', '#', 'admin', '2023-03-28 14:23:52', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3037, '事件日志删除', 3033, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:event:remove', '#', 'admin', '2023-03-28 14:23:52', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3038, '事件日志导出', 3033, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'iot:event:export', '#', 'admin', '2023-03-28 14:23:52', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (3047, '数据可视化', 0, 7, 'screen', NULL, NULL, 1, 0, 'M', '0', '0', '', 'monitor-a', 'admin', '2023-08-23 23:09:28', 'admin', '2023-08-24 17:21:48', ''); +INSERT INTO `sys_menu` VALUES (3048, 'Mqtt统计', 3031, 2, 'mqtt', 'iot/netty/mqtt', NULL, 1, 0, 'C', '0', '0', 'monitor:server:list', 'monitor', 'admin', '2023-08-23 23:40:28', 'admin', '2023-08-23 23:40:38', ''); + +-- ---------------------------- +-- Table structure for sys_notice +-- ---------------------------- +DROP TABLE IF EXISTS `sys_notice`; +CREATE TABLE `sys_notice` ( + `notice_id` int(4) NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题', + `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)', + `notice_content` longblob NULL COMMENT '公告内容', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`notice_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '通知公告表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_notice +-- ---------------------------- +INSERT INTO `sys_notice` VALUES (1, 'FastBeeV1.2版本发布', '2', 0x3C703EE8BF99E698AFE6B58BE8AF95E58685E5AEB9EFBC8CE696B0E78988E69CACE58A9FE883BDEFBC9A3C2F703E3C6F6C3E3C6C693EE694AFE68C81E5A49AE7A79FE688B73C2F6C693E3C6C693EE694AFE68C81E8AEBEE5A487E58886E4BAAB3C2F6C693E3C6C693EE694AFE68C81E697B6E5BA8FE695B0E68DAEE5BA933C2F6C693E3C6C693EE7AE80E58D95E8AEA4E8AF81E5928CE58AA0E5AF86E8AEA4E8AF81E7BB9FE4B8803C2F6C693E3C2F6F6C3E, '0', 'admin', '2021-12-15 21:36:18', 'admin', '2023-09-26 21:21:30', '管理员'); +INSERT INTO `sys_notice` VALUES (2, 'FastBee sdk支持树莓派', '1', 0x3C703EE8BF99E698AFE6B58BE8AF95E58685E5AEB9EFBC8CE79BAEE5898D73646BE694AFE68C81E79A84E78988E69CAC3A3C2F703E3C703E3C62723E3C2F703E3C703E3C62723E3C2F703E3C6F6C3E3C6C693E41726475696E6F20657370383236363C2F6C693E3C6C693E41726475696E6F2065737033323C2F6C693E3C6C693E6573702D6964663C2F6C693E3C6C693E72617370626572727920E6A091E88E93E6B4BE3C2F6C693E3C2F6F6C3E, '0', 'admin', '2021-12-15 21:36:18', 'admin', '2023-09-26 21:21:41', '管理员'); + +-- ---------------------------- +-- Table structure for sys_oper_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oper_log`; +CREATE TABLE `sys_oper_log` ( + `oper_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '操作日志ID', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '模块标题', + `business_type` int(2) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)', + `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '方法名称', + `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求方式', + `operator_type` int(1) NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)', + `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作人员', + `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称', + `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求URL', + `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作地点', + `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求参数', + `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '返回参数', + `status` int(1) NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)', + `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '错误消息', + `oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + PRIMARY KEY (`oper_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_oper_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_post`; +CREATE TABLE `sys_post` ( + `post_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', + `post_sort` int(4) NOT NULL COMMENT '显示顺序', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`post_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_post +-- ---------------------------- +INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, '0', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, '0', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, '0', 'admin', '2021-12-15 21:36:18', '', NULL, ''); +INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, '0', 'admin', '2021-12-15 21:36:18', '', NULL, ''); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称', + `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色权限字符串', + `role_sort` int(4) NOT NULL COMMENT '显示顺序', + `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示', + `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`role_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', 1, 1, '0', '0', 'admin', '2021-12-15 21:36:18', '', NULL, '超级管理员'); +INSERT INTO `sys_role` VALUES (2, '设备租户', 'tenant', 2, '5', 1, 1, '0', '0', 'admin', '2021-12-16 16:41:30', 'admin', '2023-04-12 19:53:34', '管理产品和设备'); +INSERT INTO `sys_role` VALUES (3, '普通用户', 'general', 3, '5', 1, 1, '0', '0', 'admin', '2021-12-15 21:36:18', 'admin', '2023-02-22 08:17:37', '设备的最终用户,只能管理设备和分组'); +INSERT INTO `sys_role` VALUES (4, '游客', 'visitor', 4, '1', 1, 1, '0', '0', 'admin', '2021-12-16 16:44:30', 'admin', '2023-04-12 22:11:46', '只能查询和新增系统数据'); +INSERT INTO `sys_role` VALUES (5, '管理员', 'manager', 5, '1', 1, 1, '0', '0', 'admin', '2022-06-10 13:54:29', 'admin', '2023-04-12 19:50:29', '普通管理员'); + +-- ---------------------------- +-- Table structure for sys_role_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_dept`; +CREATE TABLE `sys_role_dept` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `dept_id` bigint(20) NOT NULL COMMENT '部门ID', + PRIMARY KEY (`role_id`, `dept_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和部门关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role_dept +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `menu_id` bigint(20) NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`, `menu_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- +INSERT INTO sys_role_menu VALUES (2, 1); +INSERT INTO sys_role_menu VALUES (2, 4); +INSERT INTO sys_role_menu VALUES (2, 107); +INSERT INTO sys_role_menu VALUES (2, 1036); +INSERT INTO sys_role_menu VALUES (2, 2000); +INSERT INTO sys_role_menu VALUES (2, 2001); +INSERT INTO sys_role_menu VALUES (2, 2002); +INSERT INTO sys_role_menu VALUES (2, 2003); +INSERT INTO sys_role_menu VALUES (2, 2004); +INSERT INTO sys_role_menu VALUES (2, 2005); +INSERT INTO sys_role_menu VALUES (2, 2006); +INSERT INTO sys_role_menu VALUES (2, 2007); +INSERT INTO sys_role_menu VALUES (2, 2008); +INSERT INTO sys_role_menu VALUES (2, 2009); +INSERT INTO sys_role_menu VALUES (2, 2010); +INSERT INTO sys_role_menu VALUES (2, 2011); +INSERT INTO sys_role_menu VALUES (2, 2012); +INSERT INTO sys_role_menu VALUES (2, 2019); +INSERT INTO sys_role_menu VALUES (2, 2020); +INSERT INTO sys_role_menu VALUES (2, 2021); +INSERT INTO sys_role_menu VALUES (2, 2022); +INSERT INTO sys_role_menu VALUES (2, 2023); +INSERT INTO sys_role_menu VALUES (2, 2024); +INSERT INTO sys_role_menu VALUES (2, 2043); +INSERT INTO sys_role_menu VALUES (2, 2044); +INSERT INTO sys_role_menu VALUES (2, 2045); +INSERT INTO sys_role_menu VALUES (2, 2046); +INSERT INTO sys_role_menu VALUES (2, 2047); +INSERT INTO sys_role_menu VALUES (2, 2048); +INSERT INTO sys_role_menu VALUES (2, 2049); +INSERT INTO sys_role_menu VALUES (2, 2050); +INSERT INTO sys_role_menu VALUES (2, 2051); +INSERT INTO sys_role_menu VALUES (2, 2052); +INSERT INTO sys_role_menu VALUES (2, 2053); +INSERT INTO sys_role_menu VALUES (2, 2054); +INSERT INTO sys_role_menu VALUES (2, 2129); +INSERT INTO sys_role_menu VALUES (2, 2130); +INSERT INTO sys_role_menu VALUES (2, 2136); +INSERT INTO sys_role_menu VALUES (2, 2137); +INSERT INTO sys_role_menu VALUES (2, 2138); +INSERT INTO sys_role_menu VALUES (2, 2139); +INSERT INTO sys_role_menu VALUES (2, 2140); +INSERT INTO sys_role_menu VALUES (2, 2147); +INSERT INTO sys_role_menu VALUES (2, 2148); +INSERT INTO sys_role_menu VALUES (3, 1); +INSERT INTO sys_role_menu VALUES (3, 4); +INSERT INTO sys_role_menu VALUES (3, 107); +INSERT INTO sys_role_menu VALUES (3, 1036); +INSERT INTO sys_role_menu VALUES (3, 2000); +INSERT INTO sys_role_menu VALUES (3, 2007); +INSERT INTO sys_role_menu VALUES (3, 2008); +INSERT INTO sys_role_menu VALUES (3, 2009); +INSERT INTO sys_role_menu VALUES (3, 2010); +INSERT INTO sys_role_menu VALUES (3, 2011); +INSERT INTO sys_role_menu VALUES (3, 2012); +INSERT INTO sys_role_menu VALUES (3, 2019); +INSERT INTO sys_role_menu VALUES (3, 2020); +INSERT INTO sys_role_menu VALUES (3, 2021); +INSERT INTO sys_role_menu VALUES (3, 2022); +INSERT INTO sys_role_menu VALUES (3, 2023); +INSERT INTO sys_role_menu VALUES (3, 2024); +INSERT INTO sys_role_menu VALUES (3, 2067); +INSERT INTO sys_role_menu VALUES (3, 2068); +INSERT INTO sys_role_menu VALUES (3, 2085); +INSERT INTO sys_role_menu VALUES (3, 2086); +INSERT INTO sys_role_menu VALUES (3, 2087); +INSERT INTO sys_role_menu VALUES (3, 2088); +INSERT INTO sys_role_menu VALUES (3, 2089); +INSERT INTO sys_role_menu VALUES (3, 2090); +INSERT INTO sys_role_menu VALUES (3, 2129); +INSERT INTO sys_role_menu VALUES (3, 2130); +INSERT INTO sys_role_menu VALUES (3, 2147); +INSERT INTO sys_role_menu VALUES (3, 2148); +INSERT INTO sys_role_menu VALUES (3, 2168); +INSERT INTO sys_role_menu VALUES (3, 2169); +INSERT INTO sys_role_menu VALUES (3, 2170); +INSERT INTO sys_role_menu VALUES (3, 2171); +INSERT INTO sys_role_menu VALUES (3, 2172); +INSERT INTO sys_role_menu VALUES (4, 1); +INSERT INTO sys_role_menu VALUES (4, 2); +INSERT INTO sys_role_menu VALUES (4, 3); +INSERT INTO sys_role_menu VALUES (4, 4); +INSERT INTO sys_role_menu VALUES (4, 100); +INSERT INTO sys_role_menu VALUES (4, 101); +INSERT INTO sys_role_menu VALUES (4, 102); +INSERT INTO sys_role_menu VALUES (4, 103); +INSERT INTO sys_role_menu VALUES (4, 104); +INSERT INTO sys_role_menu VALUES (4, 105); +INSERT INTO sys_role_menu VALUES (4, 106); +INSERT INTO sys_role_menu VALUES (4, 107); +INSERT INTO sys_role_menu VALUES (4, 108); +INSERT INTO sys_role_menu VALUES (4, 109); +INSERT INTO sys_role_menu VALUES (4, 110); +INSERT INTO sys_role_menu VALUES (4, 111); +INSERT INTO sys_role_menu VALUES (4, 112); +INSERT INTO sys_role_menu VALUES (4, 113); +INSERT INTO sys_role_menu VALUES (4, 114); +INSERT INTO sys_role_menu VALUES (4, 115); +INSERT INTO sys_role_menu VALUES (4, 116); +INSERT INTO sys_role_menu VALUES (4, 500); +INSERT INTO sys_role_menu VALUES (4, 501); +INSERT INTO sys_role_menu VALUES (4, 1001); +INSERT INTO sys_role_menu VALUES (4, 1008); +INSERT INTO sys_role_menu VALUES (4, 1013); +INSERT INTO sys_role_menu VALUES (4, 1017); +INSERT INTO sys_role_menu VALUES (4, 1021); +INSERT INTO sys_role_menu VALUES (4, 1026); +INSERT INTO sys_role_menu VALUES (4, 1031); +INSERT INTO sys_role_menu VALUES (4, 1036); +INSERT INTO sys_role_menu VALUES (4, 1040); +INSERT INTO sys_role_menu VALUES (4, 1043); +INSERT INTO sys_role_menu VALUES (4, 1046); +INSERT INTO sys_role_menu VALUES (4, 1049); +INSERT INTO sys_role_menu VALUES (4, 1055); +INSERT INTO sys_role_menu VALUES (4, 2000); +INSERT INTO sys_role_menu VALUES (4, 2001); +INSERT INTO sys_role_menu VALUES (4, 2002); +INSERT INTO sys_role_menu VALUES (4, 2003); +INSERT INTO sys_role_menu VALUES (4, 2007); +INSERT INTO sys_role_menu VALUES (4, 2008); +INSERT INTO sys_role_menu VALUES (4, 2009); +INSERT INTO sys_role_menu VALUES (4, 2019); +INSERT INTO sys_role_menu VALUES (4, 2020); +INSERT INTO sys_role_menu VALUES (4, 2021); +INSERT INTO sys_role_menu VALUES (4, 2043); +INSERT INTO sys_role_menu VALUES (4, 2044); +INSERT INTO sys_role_menu VALUES (4, 2045); +INSERT INTO sys_role_menu VALUES (4, 2049); +INSERT INTO sys_role_menu VALUES (4, 2050); +INSERT INTO sys_role_menu VALUES (4, 2051); +INSERT INTO sys_role_menu VALUES (4, 2104); +INSERT INTO sys_role_menu VALUES (4, 2123); +INSERT INTO sys_role_menu VALUES (4, 2124); +INSERT INTO sys_role_menu VALUES (4, 2125); +INSERT INTO sys_role_menu VALUES (4, 2129); +INSERT INTO sys_role_menu VALUES (4, 2130); +INSERT INTO sys_role_menu VALUES (4, 2131); +INSERT INTO sys_role_menu VALUES (4, 2136); +INSERT INTO sys_role_menu VALUES (4, 2137); +INSERT INTO sys_role_menu VALUES (4, 2141); +INSERT INTO sys_role_menu VALUES (4, 2147); +INSERT INTO sys_role_menu VALUES (4, 2148); +INSERT INTO sys_role_menu VALUES (4, 2149); +INSERT INTO sys_role_menu VALUES (4, 3007); +INSERT INTO sys_role_menu VALUES (4, 3008); +INSERT INTO sys_role_menu VALUES (4, 3009); +INSERT INTO sys_role_menu VALUES (4, 3031); +INSERT INTO sys_role_menu VALUES (4, 3032); +INSERT INTO sys_role_menu VALUES (4, 3033); +INSERT INTO sys_role_menu VALUES (4, 3034); +INSERT INTO sys_role_menu VALUES (4, 3035); +INSERT INTO sys_role_menu VALUES (4, 3047); +INSERT INTO sys_role_menu VALUES (5, 1); +INSERT INTO sys_role_menu VALUES (5, 2); +INSERT INTO sys_role_menu VALUES (5, 3); +INSERT INTO sys_role_menu VALUES (5, 4); +INSERT INTO sys_role_menu VALUES (5, 100); +INSERT INTO sys_role_menu VALUES (5, 101); +INSERT INTO sys_role_menu VALUES (5, 102); +INSERT INTO sys_role_menu VALUES (5, 103); +INSERT INTO sys_role_menu VALUES (5, 104); +INSERT INTO sys_role_menu VALUES (5, 105); +INSERT INTO sys_role_menu VALUES (5, 106); +INSERT INTO sys_role_menu VALUES (5, 107); +INSERT INTO sys_role_menu VALUES (5, 108); +INSERT INTO sys_role_menu VALUES (5, 109); +INSERT INTO sys_role_menu VALUES (5, 110); +INSERT INTO sys_role_menu VALUES (5, 111); +INSERT INTO sys_role_menu VALUES (5, 112); +INSERT INTO sys_role_menu VALUES (5, 113); +INSERT INTO sys_role_menu VALUES (5, 114); +INSERT INTO sys_role_menu VALUES (5, 115); +INSERT INTO sys_role_menu VALUES (5, 116); +INSERT INTO sys_role_menu VALUES (5, 124); +INSERT INTO sys_role_menu VALUES (5, 500); +INSERT INTO sys_role_menu VALUES (5, 501); +INSERT INTO sys_role_menu VALUES (5, 1001); +INSERT INTO sys_role_menu VALUES (5, 1002); +INSERT INTO sys_role_menu VALUES (5, 1003); +INSERT INTO sys_role_menu VALUES (5, 1004); +INSERT INTO sys_role_menu VALUES (5, 1005); +INSERT INTO sys_role_menu VALUES (5, 1006); +INSERT INTO sys_role_menu VALUES (5, 1007); +INSERT INTO sys_role_menu VALUES (5, 1008); +INSERT INTO sys_role_menu VALUES (5, 1009); +INSERT INTO sys_role_menu VALUES (5, 1010); +INSERT INTO sys_role_menu VALUES (5, 1011); +INSERT INTO sys_role_menu VALUES (5, 1012); +INSERT INTO sys_role_menu VALUES (5, 1013); +INSERT INTO sys_role_menu VALUES (5, 1014); +INSERT INTO sys_role_menu VALUES (5, 1015); +INSERT INTO sys_role_menu VALUES (5, 1016); +INSERT INTO sys_role_menu VALUES (5, 1017); +INSERT INTO sys_role_menu VALUES (5, 1018); +INSERT INTO sys_role_menu VALUES (5, 1019); +INSERT INTO sys_role_menu VALUES (5, 1020); +INSERT INTO sys_role_menu VALUES (5, 1021); +INSERT INTO sys_role_menu VALUES (5, 1022); +INSERT INTO sys_role_menu VALUES (5, 1023); +INSERT INTO sys_role_menu VALUES (5, 1024); +INSERT INTO sys_role_menu VALUES (5, 1025); +INSERT INTO sys_role_menu VALUES (5, 1026); +INSERT INTO sys_role_menu VALUES (5, 1027); +INSERT INTO sys_role_menu VALUES (5, 1028); +INSERT INTO sys_role_menu VALUES (5, 1029); +INSERT INTO sys_role_menu VALUES (5, 1030); +INSERT INTO sys_role_menu VALUES (5, 1031); +INSERT INTO sys_role_menu VALUES (5, 1032); +INSERT INTO sys_role_menu VALUES (5, 1033); +INSERT INTO sys_role_menu VALUES (5, 1034); +INSERT INTO sys_role_menu VALUES (5, 1035); +INSERT INTO sys_role_menu VALUES (5, 1036); +INSERT INTO sys_role_menu VALUES (5, 1037); +INSERT INTO sys_role_menu VALUES (5, 1038); +INSERT INTO sys_role_menu VALUES (5, 1039); +INSERT INTO sys_role_menu VALUES (5, 1040); +INSERT INTO sys_role_menu VALUES (5, 1041); +INSERT INTO sys_role_menu VALUES (5, 1042); +INSERT INTO sys_role_menu VALUES (5, 1043); +INSERT INTO sys_role_menu VALUES (5, 1044); +INSERT INTO sys_role_menu VALUES (5, 1045); +INSERT INTO sys_role_menu VALUES (5, 1046); +INSERT INTO sys_role_menu VALUES (5, 1047); +INSERT INTO sys_role_menu VALUES (5, 1048); +INSERT INTO sys_role_menu VALUES (5, 1049); +INSERT INTO sys_role_menu VALUES (5, 1050); +INSERT INTO sys_role_menu VALUES (5, 1051); +INSERT INTO sys_role_menu VALUES (5, 1052); +INSERT INTO sys_role_menu VALUES (5, 1053); +INSERT INTO sys_role_menu VALUES (5, 1054); +INSERT INTO sys_role_menu VALUES (5, 1055); +INSERT INTO sys_role_menu VALUES (5, 1056); +INSERT INTO sys_role_menu VALUES (5, 1057); +INSERT INTO sys_role_menu VALUES (5, 1058); +INSERT INTO sys_role_menu VALUES (5, 1059); +INSERT INTO sys_role_menu VALUES (5, 1060); +INSERT INTO sys_role_menu VALUES (5, 1065); +INSERT INTO sys_role_menu VALUES (5, 2000); +INSERT INTO sys_role_menu VALUES (5, 2001); +INSERT INTO sys_role_menu VALUES (5, 2002); +INSERT INTO sys_role_menu VALUES (5, 2003); +INSERT INTO sys_role_menu VALUES (5, 2004); +INSERT INTO sys_role_menu VALUES (5, 2005); +INSERT INTO sys_role_menu VALUES (5, 2006); +INSERT INTO sys_role_menu VALUES (5, 2007); +INSERT INTO sys_role_menu VALUES (5, 2008); +INSERT INTO sys_role_menu VALUES (5, 2009); +INSERT INTO sys_role_menu VALUES (5, 2010); +INSERT INTO sys_role_menu VALUES (5, 2011); +INSERT INTO sys_role_menu VALUES (5, 2012); +INSERT INTO sys_role_menu VALUES (5, 2019); +INSERT INTO sys_role_menu VALUES (5, 2020); +INSERT INTO sys_role_menu VALUES (5, 2021); +INSERT INTO sys_role_menu VALUES (5, 2022); +INSERT INTO sys_role_menu VALUES (5, 2023); +INSERT INTO sys_role_menu VALUES (5, 2024); +INSERT INTO sys_role_menu VALUES (5, 2043); +INSERT INTO sys_role_menu VALUES (5, 2044); +INSERT INTO sys_role_menu VALUES (5, 2045); +INSERT INTO sys_role_menu VALUES (5, 2046); +INSERT INTO sys_role_menu VALUES (5, 2047); +INSERT INTO sys_role_menu VALUES (5, 2048); +INSERT INTO sys_role_menu VALUES (5, 2049); +INSERT INTO sys_role_menu VALUES (5, 2050); +INSERT INTO sys_role_menu VALUES (5, 2051); +INSERT INTO sys_role_menu VALUES (5, 2052); +INSERT INTO sys_role_menu VALUES (5, 2053); +INSERT INTO sys_role_menu VALUES (5, 2054); +INSERT INTO sys_role_menu VALUES (5, 2104); +INSERT INTO sys_role_menu VALUES (5, 2123); +INSERT INTO sys_role_menu VALUES (5, 2124); +INSERT INTO sys_role_menu VALUES (5, 2125); +INSERT INTO sys_role_menu VALUES (5, 2126); +INSERT INTO sys_role_menu VALUES (5, 2127); +INSERT INTO sys_role_menu VALUES (5, 2128); +INSERT INTO sys_role_menu VALUES (5, 2129); +INSERT INTO sys_role_menu VALUES (5, 2130); +INSERT INTO sys_role_menu VALUES (5, 2131); +INSERT INTO sys_role_menu VALUES (5, 2132); +INSERT INTO sys_role_menu VALUES (5, 2133); +INSERT INTO sys_role_menu VALUES (5, 2134); +INSERT INTO sys_role_menu VALUES (5, 2136); +INSERT INTO sys_role_menu VALUES (5, 2137); +INSERT INTO sys_role_menu VALUES (5, 2138); +INSERT INTO sys_role_menu VALUES (5, 2139); +INSERT INTO sys_role_menu VALUES (5, 2140); +INSERT INTO sys_role_menu VALUES (5, 2141); +INSERT INTO sys_role_menu VALUES (5, 2147); +INSERT INTO sys_role_menu VALUES (5, 2148); +INSERT INTO sys_role_menu VALUES (5, 2149); +INSERT INTO sys_role_menu VALUES (5, 3007); +INSERT INTO sys_role_menu VALUES (5, 3008); +INSERT INTO sys_role_menu VALUES (5, 3009); +INSERT INTO sys_role_menu VALUES (5, 3010); +INSERT INTO sys_role_menu VALUES (5, 3011); +INSERT INTO sys_role_menu VALUES (5, 3012); +INSERT INTO sys_role_menu VALUES (5, 3031); +INSERT INTO sys_role_menu VALUES (5, 3032); +INSERT INTO sys_role_menu VALUES (5, 3033); +INSERT INTO sys_role_menu VALUES (5, 3034); +INSERT INTO sys_role_menu VALUES (5, 3035); +INSERT INTO sys_role_menu VALUES (5, 3036); +INSERT INTO sys_role_menu VALUES (5, 3037); +INSERT INTO sys_role_menu VALUES (5, 3038); +INSERT INTO sys_role_menu VALUES (5, 3047); + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号', + `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称', + `user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '00' COMMENT '用户类型(00系统用户)', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户邮箱', + `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码', + `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', + `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime(0) NULL DEFAULT NULL COMMENT '最后登录时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES (1, 103, 'admin', '蜂信管理员', '00', '164770707@qq.com', '15888888888', '0', '', '$2a$10$QAow7ybs74fkSWJDJkVTNeogF7mhnihF7STErt78PxDhHiNno4IUu', '0', '0', '120.231.214.134', '2023-09-26 21:22:50', 'admin', '2021-12-15 21:36:18', '', '2023-09-26 21:22:50', '管理员'); +INSERT INTO `sys_user` VALUES (2, 100, 'fastbee-t1', '蜂信租户壹', '00', '', '15888888880', '0', '', '$2a$10$BAWId9C2Nrcwklzl1Ikoau4iqL8XRGvfRjq6Wl.PXWpzwAw0sXMdK', '0', '0', '61.145.97.26', '2023-08-29 14:52:27', 'admin', '2022-04-15 16:21:25', 'admin', '2023-08-29 14:52:26', NULL); +INSERT INTO `sys_user` VALUES (3, 100, 'fastbee-t2', '蜂信租户贰', '00', '', '15888888881', '0', '', '$2a$10$1zMlbW7hGpzA59gpzWGO/ObeASziQ296evjMjHrYdZnxKBLU4WUum', '0', '0', '127.0.0.1', '2022-06-12 00:54:28', 'admin', '2022-04-15 16:22:08', 'admin', '2022-06-12 00:54:30', NULL); +INSERT INTO `sys_user` VALUES (4, 100, 'fastbee-u1', '蜂信用户壹', '00', '', '15888888882', '0', '', '$2a$10$691RJMXZ9HM4sgNTExLPfO5Nw6J6cWgCvcoF9V.jKMnPk5o/8c9VS', '0', '0', '127.0.0.1', '2023-04-12 22:26:39', 'admin', '2022-04-15 16:22:37', 'admin', '2023-04-12 22:26:39', NULL); +INSERT INTO `sys_user` VALUES (5, 100, 'fastbee-u2', '蜂信用户贰', '00', '', '15888888883', '0', '', '$2a$10$x3rM39rewwbi7ayvriGMEOKUHoPCqcL2CYXPLTJRCWYPVvykFIYJq', '0', '0', '127.0.0.1', '2022-06-12 00:55:45', 'admin', '2022-04-15 16:23:13', 'admin', '2022-06-12 00:55:46', NULL); +INSERT INTO `sys_user` VALUES (6, 100, 'fastbee', '游客账号', '00', '', '15888888884', '0', '', '$2a$10$kKeZptrTnSlm0fencX4U2eq.QiaukDs.DckiUsMCwVTxh0IS2LRQ.', '0', '0', '127.0.0.1', '2023-09-21 18:39:29', 'admin', '2022-03-09 16:49:19', 'admin', '2023-09-21 18:39:28', NULL); +INSERT INTO `sys_user` VALUES (7, NULL, 'shenzehui', 'shenzehui', '00', '', '18257292958', '0', '', '$2a$10$UYKWiQF.VWfVvuksS/DMiO234Mwtz.niU7cM/noFgwLVRl7Jjt5pa', '0', '2', '39.189.61.11', '2023-04-16 14:18:09', '', '2023-04-16 14:17:59', '', '2023-04-16 14:18:08', NULL); +INSERT INTO `sys_user` VALUES (8, NULL, 'shadow', 'shadow', '00', '165456465465@qq.com', '15752221201', '0', '', '$2a$10$FXSw4fufDjecEhMxYjji3.7PkrpwkliCBoQO.h8nW0Nhk0bPpxS6u', '0', '2', '39.130.41.108', '2023-09-15 17:21:33', '', '2023-08-23 11:34:23', '', '2023-09-15 17:21:32', NULL); +INSERT INTO `sys_user` VALUES (9, NULL, 'guanshubiao', 'guanshubiao', '00', '', '15217628961', '0', '', '$2a$10$J9kJeP/dzc/SYq8Ev1rFXOigPdN50Kq8MkCX9j56/fQwDXAUkAPYi', '0', '2', '61.145.97.26', '2023-08-29 17:33:16', '', '2023-08-29 14:56:19', '', '2023-08-29 17:33:16', NULL); +INSERT INTO `sys_user` VALUES (10, NULL, 'jamon', 'jamon', '00', '', '13717112711', '0', '', '$2a$10$LMASUfB9IngDi47fQ9Eh7u003VNNh4DcjdPHMyvAQ4mdLXhQgvnpu', '0', '2', '61.145.97.26', '2023-09-01 09:06:23', '', '2023-08-29 15:06:39', '', '2023-09-01 09:06:23', NULL); +INSERT INTO `sys_user` VALUES (11, 101, 'fastbee123', 'fastbee123', '00', '', '18231210622', '0', '', '$2a$10$qpLuw5yAIDLV/.UCIaWRROxhtI2nYpJe/.tbIKwSmy2Pxm.vc26Ri', '0', '2', '27.187.242.251', '2023-08-31 16:22:40', 'admin', '2023-08-31 16:22:21', '', '2023-08-31 16:22:40', NULL); +INSERT INTO `sys_user` VALUES (12, NULL, 'shadow', 'shadow', '00', '', '15752221201', '0', '', '$2a$10$QEYxDoFO6e3wuksc2d7XIOJe0UBzY0EkYR3fKfp8pYfM5bWI4.VO6', '0', '2', '39.130.41.179', '2023-09-19 10:11:00', '', '2023-09-19 10:10:49', '', '2023-09-19 10:11:00', NULL); + +-- ---------------------------- +-- Table structure for sys_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `post_id` bigint(20) NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`user_id`, `post_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_post +-- ---------------------------- +INSERT INTO `sys_user_post` VALUES (1, 1); +INSERT INTO `sys_user_post` VALUES (6, 4); + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`, `role_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES (1, 1); +INSERT INTO `sys_user_role` VALUES (2, 2); +INSERT INTO `sys_user_role` VALUES (3, 2); +INSERT INTO `sys_user_role` VALUES (4, 3); +INSERT INTO `sys_user_role` VALUES (5, 3); +INSERT INTO `sys_user_role` VALUES (6, 4); + +SET FOREIGN_KEY_CHECKS = 1; + +-- 优化点:添加网站应用个人中心微信绑定配置 +INSERT INTO `sys_dict_data` (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (7, '微信开放平台网站应用个人中心绑定', 'wechat_open_web_bind', 'iot_social_platform', NULL, 'default', 'N', '0', 'admin', '2023-10-09 11:28:15', '', NULL, NULL); diff --git a/docker/data/nginx/h5/放置移动端h5打包文件.txt b/docker/data/nginx/h5/放置移动端h5打包文件.txt new file mode 100644 index 00000000..e69de29b diff --git a/docker/data/nginx/nginx-emqx.conf b/docker/data/nginx/nginx-emqx.conf new file mode 100644 index 00000000..ac928c83 --- /dev/null +++ b/docker/data/nginx/nginx-emqx.conf @@ -0,0 +1,91 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + gzip on; + gzip_min_length 1k; + gzip_buffers 16 64K; + gzip_http_version 1.1; + gzip_comp_level 5; + gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml; + gzip_vary on; + gzip_proxied expired no-cache no-store private auth; + gzip_disable "MSIE [1-6]\."; + + # Http跳转Https + # server { + # listen 80; + # server_name localhost; + # location / { + # rewrite ^(.*) https://$server_name$1 permanent; + # } + # } + + server { + listen 80; + + # SSL 默认访问端口号为443 + listen 443 ssl; + server_name localhost; + charset utf-8; + + # 证书文件的路径 + ssl_certificate /usr/share/nginx/ssl/fastbee.crt; + # 私钥文件的路径 + ssl_certificate_key /usr/share/nginx/ssl/fastbee.key; + ssl_session_timeout 10m; + # 请按照以下协议配置 + ssl_protocols TLSv1.2 TLSv1.3; + # 请按照以下套件配置,配置加密套件,写法遵循openssl 标准 + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; + ssl_prefer_server_ciphers on; + + # 前端 + location / { + root /usr/share/nginx/html; + try_files $uri $uri/ /index.html; + index index.html index.htm; + } + + # H5移动端 + location /h5 { + alias /usr/share/nginx/h5/; + try_files $uri $uri/ /index.html; + index index.html index.htm; + } + + # 后端接口 + location /prod-api/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://java:8080/; + } + + # wss连接代理到ws + location /mqtt { + proxy_pass http://emqx:8083/mqtt; + proxy_read_timeout 60s; + proxy_set_header Host $host; + proxy_set_header X-Real_IP $remote_addr; + proxy_set_header X-Forwarded-for $remote_addr; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'Upgrade'; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } +} \ No newline at end of file diff --git a/docker/data/nginx/nginx.conf b/docker/data/nginx/nginx.conf index accaaecb..163655f5 100644 --- a/docker/data/nginx/nginx.conf +++ b/docker/data/nginx/nginx.conf @@ -20,17 +20,49 @@ http { gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; + # Http跳转Https + # server { + # listen 80; + # server_name localhost; + # location / { + # rewrite ^(.*) https://$server_name$1 permanent; + # } + # } + server { - listen 80; + listen 80; + + # SSL 默认访问端口号为443 + listen 443 ssl; server_name localhost; charset utf-8; + # 证书文件的路径 + ssl_certificate /usr/share/nginx/ssl/fastbee.crt; + # 私钥文件的路径 + ssl_certificate_key /usr/share/nginx/ssl/fastbee.key; + ssl_session_timeout 10m; + # 请按照以下协议配置 + ssl_protocols TLSv1.2 TLSv1.3; + # 请按照以下套件配置,配置加密套件,写法遵循openssl 标准 + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; + ssl_prefer_server_ciphers on; + + # 前端 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; index index.html index.htm; } + + # H5移动端 + location /h5 { + alias /usr/share/nginx/h5/; + try_files $uri $uri/ /index.html; + index index.html index.htm; + } + # 后端接口 location /prod-api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; @@ -39,12 +71,16 @@ http { proxy_pass http://java:8080/; } - location /api/v4/ { - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header REMOTE-HOST $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_pass http://emqx:8081/api/v4/; + # wss连接代理到ws + location /mqtt { + proxy_pass http://java:8083/mqtt; + proxy_read_timeout 60s; + proxy_set_header Host $host; + proxy_set_header X-Real_IP $remote_addr; + proxy_set_header X-Forwarded-for $remote_addr; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'Upgrade'; } error_page 500 502 503 504 /50x.html; diff --git a/docker/data/nginx/ssl/fastbee.crt b/docker/data/nginx/ssl/fastbee.crt new file mode 100644 index 00000000..37221757 --- /dev/null +++ b/docker/data/nginx/ssl/fastbee.crt @@ -0,0 +1,68 @@ +-----BEGIN CERTIFICATE----- +MIIGujCCBaKgAwIBAgIQCEZHO+Au3dO0pmMgFV+CXDANBgkqhkiG9w0BAQsFADBf +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMR4wHAYDVQQDExVHZW9UcnVzdCBDTiBSU0EgQ0EgRzEw +HhcNMjEwNzI2MDAwMDAwWhcNMjIwODI1MjM1OTU5WjB+MQswCQYDVQQGEwJDTjES +MBAGA1UECAwJ5bm/5Lic55yBMRIwEAYDVQQHDAnmt7HlnLPluIIxMDAuBgNVBAoM +J+a3seWcs+W4guWTgemBk+mkkOmlrueuoeeQhuaciemZkOWFrOWPuDEVMBMGA1UE +AwwMKi5waW4tZGFvLmNuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +rMBuC6MXRP7NaP5ux7nZmuOy2wKY6xWk/i2POrfGSnX0IeY7phoGliH2EBa+UyCA +rj5B960UYDkpAmh5uCmDOO1Zs4VPwdoyj+OA6Up/LJXVg/txFvZfDkpk7lTjAQz4 +OcYXxv+iMxDkpEnnlLRsUlUs2JdQUAXEzjwlKVVUqzEZ+9QY+BLb88bDQEBjaE4+ +JH95/oRJAby3OH/AXljswh0VUbj3S8pAbiI6f8xoWSn9mjPSGIlABYDgWma2T0RD +9F7sbY7JS/1njPA67i8vzVRMnpkMvYLt4a2qG1THUpFysmT0R2OOb8DlOZiPhnZk +xEvUGeDx8y34FSucWLQTvwIDAQABo4IDUTCCA00wHwYDVR0jBBgwFoAUkZ9eMRWu +EJ+tYMH3wcyqSDQvDCYwHQYDVR0OBBYEFDrSDW+dz8TXCfrIPED7lQX1IGM5MCMG +A1UdEQQcMBqCDCoucGluLWRhby5jboIKcGluLWRhby5jbjAOBgNVHQ8BAf8EBAMC +BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMHUGA1UdHwRuMGwwNKAy +oDCGLmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9HZW9UcnVzdENOUlNBQ0FHMS5j +cmwwNKAyoDCGLmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9HZW9UcnVzdENOUlNB +Q0FHMS5jcmwwPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0 +cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMG8GCCsGAQUFBwEBBGMwYTAhBggrBgEF +BQcwAYYVaHR0cDovL29jc3AuZGNvY3NwLmNuMDwGCCsGAQUFBzAChjBodHRwOi8v +Y3JsLmRpZ2ljZXJ0LWNuLmNvbS9HZW9UcnVzdENOUlNBQ0FHMS5jcnQwDAYDVR0T +AQH/BAIwADCCAX8GCisGAQQB1nkCBAIEggFvBIIBawFpAHYARqVV63X6kSAwtaKJ +afTzfREsQXS+/Um4havy/HD+bUcAAAF64K3X/QAABAMARzBFAiBOmRovvmyKDMxG +fA3H6aFk/x8ce6THZVe4bTW4gEDDJwIhANKatQg5dedqYI78Fevo3ZEUEYUyMB1V +ml1AajGZm/ebAHcAUaOw9f0BeZxWbbg3eI8MpHrMGyfL956IQpoN/tSLBeUAAAF6 +4K3YDgAABAMASDBGAiEAmVXJCrNphalqawzCGHqLOHIbDUEH0S2mXOG/4jpQsKgC +IQDxC3C/aVX/D8CRj3py4OvD3PSkmP5+ZtvLsZDYEliYQQB2AEHIyrHfIkZKEMah +OglCh15OMYsbA+vrS8do8JBilgb2AAABeuCt15EAAAQDAEcwRQIhANIAPeLjWGRz +Qm11rXG9VeBazY520LJ39puYjr4ovR4tAiBwU9cJ5esSS6hOtLrSkhLCeg4i3isp +w30Hn1D77Um2UzANBgkqhkiG9w0BAQsFAAOCAQEAGPOc0d869d9C1YkbdSBwJtoh +BMkf2RFlPSIlGUacELN6gSHP37CIe7CVcwTAS+bDUGRtTD5+8loa96pbLoloEqfD +7Z7js9LE8anXazye/4W81ko3lThUq9PO0B+udKWWrhhD9wC9sfj5u22ruUN/8oyJ +OeMIYj5Xi8RTFH1QgXtg3BX3oKgRWPsib+1BgLQQgchsV709DhlT1oAI4x69JL57 +K5m5eVyK5eY3Y93+5GEQLxMhxJPpBbDbsieBHvvFzZ9sFxRLSW6YlRYPKcCMd80a ++uHNq69hXv4ZBkmoJV9PI7NJDD1e6RmRYj1v9vMarM2rhcL4yYZ1y7LiT5BkkA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIQCgRw0Ja8ihLIkKbfgm7sSzANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0xOTA2MjAxMjI3NThaFw0yOTA2MjAxMjI3NThaMF8xCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xHjAcBgNVBAMTFUdlb1RydXN0IENOIFJTQSBDQSBHMTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALFJ+j1KeZVG4jzgQob23lQ8PJUNhY31ufZihuUx +hYc6HSU4Lw0fxfA43a9DpJl74M3E6F1ZRBOfJ+dWnaiyYD0PxRIQd4wJisti4Uad +vz61IYY/oQ/Elxk/X7GFDquYuxCSyBdHtTVMXCxFSvQ2C/7jWZFDfGGKKNoQSiJy +wDe8iiHbUOakLMmXmOTZyWJnFdR/TH5YNTiMKCNUPHAleG4IigGxDyL/gbwrdDNi +bDA4lUNhD0xNvPjQ8BNKqm5HWDvirUuHdC+4hpi0GJO34O3iiRV16YmWTuVFNboU +LDZ0+PQtctJnatpuZKPGyKX6jCpPvzzPw/EhNDlpEdrYHZMCAwEAAaOCAc4wggHK +MB0GA1UdDgQWBBSRn14xFa4Qn61gwffBzKpINC8MJjAfBgNVHSMEGDAWgBQD3lA1 +VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYB +BQUHAwEGCCsGAQUFBwMCMA8GA1UdEwEB/wQFMAMBAf8wMQYIKwYBBQUHAQEEJTAj +MCEGCCsGAQUFBzABhhVodHRwOi8vb2NzcC5kY29jc3AuY24wRAYDVR0fBD0wOzA5 +oDegNYYzaHR0cDovL2NybC5kaWdpY2VydC1jbi5jb20vRGlnaUNlcnRHbG9iYWxS +b290Q0EuY3JsMIHOBgNVHSAEgcYwgcMwgcAGBFUdIAAwgbcwKAYIKwYBBQUHAgEW +HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgYoGCCsGAQUFBwICMH4MfEFu +eSB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNl +IG9mIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCBsb2NhdGVkIGF0IGh0dHBz +Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9ycGEtdWEwDQYJKoZIhvcNAQELBQADggEBABfg +eXrxIrtlixBv+KMDeqKxtNJbZiLDzJBkGCd4HI63X5eS6BElJBn6mI9eYVrr7qOL +Tp7WiO02Sf1Yrpaz/ePSjZ684o89UAGpxOfbgVSMvo/a07n/220jUWLxzaJhQNLu +lACXwwWsxYf8twP8glkoIHnUUNTlhsyyl1ZzvVC4bDpI4hC6QkJGync1MNqYSMj8 +tZbhQNw3HdSmcTO0Nc/J/pK2VZc6fFbKBgspmzdHc6jMKG2t4lisXEysS3wPcg0a +Nfr1Odl5+myh3MnMK08f6pTXvduLz+QZiIh8IYL+Z6QWgTZ9e2jnV8juumX1I8Ge +7cZdtNnTCB8hFfwGLUA= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/docker/data/nginx/ssl/fastbee.key b/docker/data/nginx/ssl/fastbee.key new file mode 100644 index 00000000..68958d9e --- /dev/null +++ b/docker/data/nginx/ssl/fastbee.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEArMBuC6MXRP7NaP5ux7nZmuOy2wKY6xWk/i2POrfGSnX0IeY7 +phoGliH2EBa+UyCArj5B960UYDkpAmh5uCmDOO1Zs4VPwdoyj+OA6Up/LJXVg/tx +FvZfDkpk7lTjAQz4OcYXxv+iMxDkpEnnlLRsUlUs2JdQUAXEzjwlKVVUqzEZ+9QY ++BLb88bDQEBjaE4+JH95/oRJAby3OH/AXljswh0VUbj3S8pAbiI6f8xoWSn9mjPS +GIlABYDgWma2T0RD9F7sbY7JS/1njPA67i8vzVRMnpkMvYLt4a2qG1THUpFysmT0 +R2OOb8DlOZiPhnZkxEvUGeDx8y34FSucWLQTvwIDAQABAoIBAAdXly9bCCZZ8540 +9vDGklwStcuFib0VsQSCKGZx4LVrdZI3RQbwCW86FElmXg9BM2O0dUmy8bAnqpMi +oGgjKfBlp6+8lVsDP62wsqe3qQraqpxIauvZ65WIGrZ42LxDskBQwTpakdwJXMTE +Xoy9Ollcq2JG1BZo/sG9+d2O3EfGS/yCb0PemXMN+1L3Lds4LaVbWhkJTvRMYpQU +m4wdRnAoKW1GKhFy9mvZ70HROPgmZ+jJkj63ZiOQyIpH1XlM6POdJCJx70ppZ6PP +ckjwvaV7wrrIYxK/tIWfDk4V+VxMc5tFJtjrNB/FwDAqBm9ltT1LjfN/j/cpQtZ7 +xk3kKSkCgYEA2Zo9tOMGdU/1lOZJ2MGQ2kRAeNfcgA/ZA7FlIAoqMc52/OrIiO4u +oAWJ5VkQNhgXazbEMl8ifI3fnSCcEjIcL3zVqIdFAeTOv+Wg1quK/TVENiG1uVnc +Kr/YCbuD0DLXgZ/Szm0+dwYxcRHb5oHpsE0XNl0mEpQUnCbxrSYOKNsCgYEAyzwk +bXczNjx90phzbIYqHG7LmZvWWKa7mqISL8RvyXhhzy9fXoBKhUtkC6XazYaYCO6F +mvSRT9BT/sRV9YgoOONHxscNMv7I2mKg8R6TDIFS/tq3E4A35YMvbVo4k/LfzExZ +FKis6KuUfnA216++CaVAfIRTLSHsO4K2Hw6wE+0CgYEAimB3lSw50yhB96pqk5ik +UOjORwqegiGR07Nfp3xPUNUG/dcgJ1Ov+rsK8fotQPkZC2kMYyv0dliSNw2hskCD +g/9Sr5U14PpsL8QK//ierl7NPc86DOCEDftpmubP7/ok6Z2FJRh7fJ1Hm6vLt04u +GZssg7nAmFfqs1JgpcdpgbkCgYAOo+F35TtSL99ceVDvQ2brL2wJP7mcHz6qb/xh +ZoQq/joFg8MZ+qHjoj+tux/c6FIxaoVDWVTSbA5w7tHGYy2Kk4zLG/Gud74eRTaU +yAANyY8h/r1rcTQVm3KiLPqgZcGLZQCRxWjXRezngsvgk69b4ISZs6qOOMBctRjL +efJjLQKBgFGdU3jg/+MctfR7N2yj3DHfPw6eya+yCjuY01S5E0oEJSE3yiLw7vPQ +kHeyZ5cEXD9y7VTCsfuYqsEwxKViBRc8xyyS7kYEEORLz/sAVU2V3TN7aKVinrEn +MnKh1m2n4wno3AE4huJFbPuXqJO3iUkfhIuLkCFyZtEd72JFO9ns +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/docker/data/nginx/ssl/放置ssl证书.txt b/docker/data/nginx/ssl/放置ssl证书.txt new file mode 100644 index 00000000..e69de29b diff --git a/docker/data/nginx/vue/放置前端打包文件.txt b/docker/data/nginx/vue/放置前端打包文件.txt new file mode 100644 index 00000000..e69de29b diff --git a/docker/data/nginx/www/部署官网.txt b/docker/data/nginx/www/部署官网.txt new file mode 100644 index 00000000..e69de29b diff --git a/docker/data/tdengine/tdengine文件.txt b/docker/data/tdengine/tdengine文件.txt new file mode 100644 index 00000000..e69de29b diff --git a/docker/settings.xml b/docker/settings.xml new file mode 100644 index 00000000..ce9ba05e --- /dev/null +++ b/docker/settings.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + aliyun + central + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public + + + + + + + + + + + + diff --git a/docker/sources.list b/docker/sources.list new file mode 100644 index 00000000..5613ea80 --- /dev/null +++ b/docker/sources.list @@ -0,0 +1,11 @@ +deb http://mirrors.cloud.tencent.com/ubuntu/ bionic main restricted universe multiverse +# deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic main restricted universe multiverse +deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse +# deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse +deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse +# deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse +deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-security main restricted universe multiverse +# deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-security main restricted universe multiverse + +# deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse +# deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse diff --git a/sdk/Arduino/Arduino-ESP32/Helper.cpp b/sdk/Arduino/Arduino-ESP32/Helper.cpp index acaa1005..f49702d6 100644 --- a/sdk/Arduino/Arduino-ESP32/Helper.cpp +++ b/sdk/Arduino/Arduino-ESP32/Helper.cpp @@ -461,7 +461,7 @@ String getTime() } delay(500); } - return ""; + return "1672524366000"; } //打印提示信息 diff --git a/sdk/Arduino/Arduino-ESP8266/Helper.cpp b/sdk/Arduino/Arduino-ESP8266/Helper.cpp index a782d8e1..92ba5932 100644 --- a/sdk/Arduino/Arduino-ESP8266/Helper.cpp +++ b/sdk/Arduino/Arduino-ESP8266/Helper.cpp @@ -450,7 +450,7 @@ String getTime() } delay(500); } - return ""; + return "1672524366000"; } //打印提示信息 diff --git a/sdk/Arduino/FastBeeArduino/Apconfig.cpp b/sdk/Arduino/FastBeeArduino/Apconfig.cpp index 3c91c5e9..3e8bb79f 100644 --- a/sdk/Arduino/FastBeeArduino/Apconfig.cpp +++ b/sdk/Arduino/FastBeeArduino/Apconfig.cpp @@ -8,7 +8,7 @@ #include "ApConfig.h" -String randomName = "wumei-device" + (String)random(1000); +String randomName = "fastbee-device" + (String)random(1000); const char *ap_ssid = randomName.c_str(); //开放式网络,不设置密码 const char *ap_password = ""; diff --git a/sdk/Arduino/FastBeeArduino/Config.cpp b/sdk/Arduino/FastBeeArduino/Config.cpp index 85899cf5..df1d2849 100644 --- a/sdk/Arduino/FastBeeArduino/Config.cpp +++ b/sdk/Arduino/FastBeeArduino/Config.cpp @@ -38,29 +38,29 @@ String pEventTopic = "/event/post"; /********************************** begin 可配置的项 **********************************/ // wifi信息 -char *wifiSsid = "MERCURY100"; -char *wifiPwd = "164770707"; +char *wifiSsid = ""; +char *wifiPwd = ""; char *userId = "1"; // 产品启用授权码,则授权码不能为空 char *authCode = ""; // 设备信息配置 -char *deviceNum = "D1H2584G22Q2"; -char *productId = "41"; +char *deviceNum = "D1FJTWOT3HIB"; +char *productId = "588"; float firmwareVersion = 1.0; // 经度和纬度可选,如果产品使用设备定位,则必须传 float latitude = 0; float longitude = 0; // Mqtt配置 -char *mqttHost = "43.143.82.218"; +char *mqttHost = "fastbee.cn"; int mqttPort = 1883; -char *mqttUserName = "wumei-smart"; -char *mqttPwd = "P47T6OD5IPFWHUM6"; -char mqttSecret[17] = "KX3TSH4Q4OS835DO"; +char *mqttUserName = "FastBee"; +char *mqttPwd = "P63653937TRQ8F27"; +char mqttSecret[17] = "KV52PPZ813EFCQD8"; // NTP地址(用于获取时间,修改为自己部署项目的接口地址) -String ntpServer = "http://wumei.live:8080/iot/tool/ntp?deviceSendTime="; +String ntpServer = "http://fastbee.cn:8080/iot/tool/ntp?deviceSendTime="; /********************************** end 可配置的项 **********************************/ diff --git a/sdk/Arduino/FastBeeArduino/FastBeeArduino.ino b/sdk/Arduino/FastBeeArduino/FastBeeArduino.ino index 1c63d676..221b55ca 100644 --- a/sdk/Arduino/FastBeeArduino/FastBeeArduino.ino +++ b/sdk/Arduino/FastBeeArduino/FastBeeArduino.ino @@ -57,6 +57,7 @@ void loop() { // 发布模拟数据,测试用 publishSimulateDataClient(); } + ESP.wdtFeed(); // 喂软件看门狗,防止程序跑偏 } /* diff --git a/sdk/Arduino/FastBeeArduino/User.cpp b/sdk/Arduino/FastBeeArduino/User.cpp index 3aa75ef0..e24239bc 100644 --- a/sdk/Arduino/FastBeeArduino/User.cpp +++ b/sdk/Arduino/FastBeeArduino/User.cpp @@ -97,7 +97,7 @@ String randomPropertyData() { int randInt = 0; StaticJsonDocument<1024> doc; JsonObject objTmeperature = doc.createNestedObject(); - objTmeperature["id"] = "temperature"; + objTmeperature["id"] = "light_current"; randFloat = random(1000, 3000); objTmeperature["value"] = (String)(randFloat / 100); objTmeperature["remark"] = (String)millis(); @@ -159,7 +159,7 @@ void processFunction(String msg) { // 匹配云端定义的功能 const char *id = object["id"]; const char *value = object["value"]; - if (strcmp(id, "switch") == 0) { + if (strcmp(id, "light_switch") == 0) { printMsg("开关 switch:" + (String)value); if (strcmp(value, "1") == 0) { // 打开继电器 diff --git a/sdk/Arduino/FastBeeGateway/Config.cpp b/sdk/Arduino/FastBeeGateway/Config.cpp index b6ba180b..5137c1c4 100644 --- a/sdk/Arduino/FastBeeGateway/Config.cpp +++ b/sdk/Arduino/FastBeeGateway/Config.cpp @@ -38,29 +38,29 @@ String pEventTopic = "/event/post"; /********************************** begin 可配置的项 **********************************/ // wifi信息 -char *wifiSsid = "MERCURY100"; -char *wifiPwd = "FastBee"; -char *userId = "1"; +char *wifiSsid = (char*)"MERCURY100"; +char *wifiPwd = (char*)"FastBee"; +char *userId = (char*)"1"; // 产品启用授权码,则授权码不能为空 -char *authCode = ""; +char *authCode = (char*)""; // 设备信息配置 -char *deviceNum = "D1PGLPG58KZ2"; -char *productId = "96"; +char *deviceNum = (char*)"D1PGLPG58K88"; +char *productId = (char*)"96"; float firmwareVersion = 1.0; // 经度和纬度可选,如果产品使用设备定位,则必须传 float latitude = 0; float longitude = 0; // Mqtt配置 -char *mqttHost = "43.143.82.218"; +char *mqttHost = (char*)"iot.fastbee.cn"; int mqttPort = 1883; -char *mqttUserName = "FastBee"; -char *mqttPwd = "P467433O1MT8MXS2"; +char *mqttUserName = (char*)"FastBee"; +char *mqttPwd = (char*)"P467433O1MT8MXS2"; char mqttSecret[17] = "KWF32S3H95LH14LO"; // NTP地址(用于获取时间,修改为自己部署项目的接口地址) -String ntpServer = "http://wumei.live:8080/iot/tool/ntp?deviceSendTime="; +String ntpServer = "http://fastbee.cn:8080/iot/tool/ntp?deviceSendTime="; /********************************** end 可配置的项 **********************************/ diff --git a/sdk/Arduino/FastBeeGateway/Mqtt.cpp b/sdk/Arduino/FastBeeGateway/Mqtt.cpp index f079180a..5bed6f0b 100644 --- a/sdk/Arduino/FastBeeGateway/Mqtt.cpp +++ b/sdk/Arduino/FastBeeGateway/Mqtt.cpp @@ -67,9 +67,9 @@ void publishProperty(String msg) { // 4.发布功能 void publishFunction(String msg) { - printMsg("发布功能:" + prefix + pFunctionTopic); + printMsg("发布属性(功能):" + prefix + pPropertyTopic); printMsg("消息:" + msg); - mqttClient.publish((prefix + pFunctionTopic).c_str(), msg.c_str()); + mqttClient.publish((prefix + pPropertyTopic).c_str(), msg.c_str()); } // 5.发布事件 diff --git a/sdk/Arduino/FastBeeGateway/User.cpp b/sdk/Arduino/FastBeeGateway/User.cpp index f1c2075f..a671b57c 100644 --- a/sdk/Arduino/FastBeeGateway/User.cpp +++ b/sdk/Arduino/FastBeeGateway/User.cpp @@ -72,7 +72,8 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) { printMsg("当前时间:" + String(now, 0)); } else if (strcmp(topic, (prefix + sPropertyTopic).c_str()) == 0 || strcmp(topic, (prefix + sPropertyOnline).c_str()) == 0) { printMsg("订阅到属性指令..."); - processProperty(data); + printMsg("新版本属性和功能合并为功能主题..."); + // processProperty(data); } else if (strcmp(topic, (prefix + sFunctionTopic).c_str()) == 0 || strcmp(topic, (prefix + sFunctionOnline).c_str()) == 0) { printMsg("订阅到功能指令..."); processFunction(data); @@ -437,6 +438,8 @@ void processFunction(String msg) { delay(1000); } } + // 处理子设备的数据上报 + processSubDeviceReport(id, value); } // 最后发布功能,服务端订阅存储(重要) publishFunction(msg); diff --git a/sdk/合宙/air780e/lua/WeiMeiApp.lua b/sdk/合宙/air780e/lua/WeiMeiApp.lua new file mode 100644 index 00000000..f94f0211 --- /dev/null +++ b/sdk/合宙/air780e/lua/WeiMeiApp.lua @@ -0,0 +1,113 @@ +--- 模块功能:物美MQTT应用 +-- @author 杜兴杰 +-- @module 物美MQTT应用 +-- @license MIT +-- @copyright 杜兴杰 +-- @email 1066950103@qq.com +-- @release 2022.8.5 + +module(..., package.seeall) + +local VERSION = "0.1" +local m_strUserId = "1" +local m_strLongitude = "0" +local m_strLatitude = "0" + +local m_nTemperature = 25 +--local m_nVoltval = 4.0 + + +local rtos_bsp = rtos.bsp() +function adc_pin() -- 根据不同开发板,设置ADC编号 + if rtos_bsp == "AIR101" then -- Air101开发板ADC编号 + return 0,1,255,255,adc.CH_CPU ,adc.CH_VBAT + elseif rtos_bsp == "AIR103" then -- Air103开发板ADC编号 + return 0,1,2,3,adc.CH_CPU ,adc.CH_VBAT + elseif rtos_bsp == "AIR105" then -- Air105开发板ADC编号 + return 0,5,6,255,255,255 + elseif rtos_bsp == "ESP32C3" then -- ESP32C3开发板ADC编号 + return 0,1,2,3,adc.CH_CPU , 255 + elseif rtos_bsp == "ESP32C2" then -- ESP32C2开发板ADC编号 + return 0,1,2,3,adc.CH_CPU , 255 + elseif rtos_bsp == "ESP32S3" then -- ESP32S3开发板ADC编号 + return 0,1,2,3,adc.CH_CPU , 255 + elseif rtos_bsp == "EC618" then --Air780E开发板ADC编号 + return 0,1,255,255,adc.CH_CPU ,adc.CH_VBAT + else + log.info("main", "define ADC pin in main.lua") + return 0, 0,0,0,0,0 + end +end +local adc_pin_0,adc_pin_1,adc_pin_2,adc_pin_3,adc_pin_temp,adc_pin_vbat=adc_pin() + +--模块温度返回回调函数 +--@temp温度,srting类型,如果要对该值进行运算,可以使用带float的固件将该值转为number +local function getTemperatureCb(temp) + m_nTemperature = temp +end + +--- ADC读取测试 +-- @return 无 +-- @usage read() +local function read0() + --ADC0接口用来读取电压 + local ADC_ID = 0 + local adcval,voltval = adc.get(adc_pin_0) + log.info("testAdc0.read",adcval,(voltval-(voltval%3))/3,voltval) + -- 输出计算得出的原始电压值 + m_nVoltval = voltval/3 * 3127 / 1000 + log.info("testAdc0.Vbat", m_nVoltval) +end + +--2秒循环查询模块温度 +--sys.timerLoopStart(misc.getTemperature,1000,getTemperatureCb) +--sys.timerLoopStart(read0,1000) + +-- 开启对应的adc通道 +adc.open(adc_pin_0) + + + +function FunctionData() + local jsonStr = "" +end + +function PropertyData() + local jsonData = {{ + id= "temperature", + value= m_nTemperature , + remark="温度信息" + },{ + id= "voltage", + value= m_nVoltval, + remark="电压信息" + }} + local jsonStr = json.encode(jsonData) + return jsonStr +end + +function InformationData() + local jsonData = { + rssi = mobile.rssi(), + firmwareVersion = VERSION, + status = 3 , + userId = m_strUserId , + longitude = m_strLongitude , + latitude = m_strLatitude, + summary = { + name= "device", + chip = "air724", + author = "duxingjie", + version=0.1, + create = "2022-08-07" + } + } + local jsonStr = json.encode(jsonData) + return jsonStr +end + +return { + InformationData = InformationData, + PropertyData = PropertyData, + FunctionData = FunctionData +} diff --git a/sdk/合宙/air780e/lua/WeiMeiComAuth.lua b/sdk/合宙/air780e/lua/WeiMeiComAuth.lua new file mode 100644 index 00000000..3450ac74 --- /dev/null +++ b/sdk/合宙/air780e/lua/WeiMeiComAuth.lua @@ -0,0 +1,184 @@ +--- 模块功能:物美MQTT认证 +-- @author 杜兴杰 +-- @module 物美MQTT通信 +-- @license MIT +-- @copyright 杜兴杰 +-- @email 1066950103@qq.com +-- @release 2022.8.4 + +module(..., package.seeall) + +local m_strEncryptionMode +local m_strProductId +local m_strDeviceId +local m_strUserId +local m_strUser +local m_strPassword +local m_nTimeout +local m_strIp +local m_strDeviceAuthorizationCode = nil +local m_strProductPassword = nil +local m_InitCallback = nil + +local m_strOutPassword +local m_strClientId +local m_nTimeSyncFlag + +local function CreateCommunicationPassword() + if m_strEncryptionMode == "S" then + if nil == m_strDeviceAuthorizationCode then + m_strOutPassword = m_strPassword + else + m_strOutPassword = m_strPassword .. "&" .. m_strDeviceAuthorizationCode + end + return true + end + + if m_strEncryptionMode == "E" then + m_strOutPassword = AesPassword() + return true + end + return false +end + +local function Callback(nResult) + log.info("Callback" .. nResult) + if m_InitCallback ~= nil then + m_InitCallback(nResult) + end +end + +local function ParameterCheck() + + return true +end + + + +local function CreatedClientId() + m_strClientId = m_strEncryptionMode .. "&" .. m_strDeviceId .. "&" .. m_strProductId .. "&" .. m_strUserId +end + +local function httpCallbackFun(result,prompt,head,body) + log.info("GetTimeHttp.cbFnc",result,prompt) + if result and body then + log.info("GetTimeHttp.cbFnc"..body.."bodyLen="..body:len()) + local nDeviceRunTickMs = 1000--rtos.tick() * 5 + + local nEnd = string.find(body,'}') + local outStr= string.sub(body,1,nEnd-4) .. '}' + log.info("----outStr " .. outStr) + + local jsonObj = json.decode(outStr) --bug json 64 转换不支持 + local nDeviceSendTime = jsonObj["deviceSendTime"] + local nServerSendTime = jsonObj["serverSendTime"] + local nServerRecvTime = jsonObj["serverRecvTime"] + log.info("nDeviceSendTime=" .. nDeviceSendTime) + log.info("nServerSendTime=" .. nServerSendTime) + log.info("nServerRecvTime=" .. nServerRecvTime) + + local nSyncTime = nServerRecvTime --秒为单位 --(nServerRecvTime + nServerSendTime + nDeviceRunTickMs - nDeviceSendTime)/2 --这里运算有问题 可能存在数据移除了 + log.info("nSyncTime=" .. nSyncTime) + rtc.set(nSyncTime) + --创建客户端ID + CreatedClientId() + --创建密码 + CreateCommunicationPassword() + Callback(1) + m_nTimeSyncFlag = 1 + end +end + + function SyncTime() + local nDeviceRunTickMs = 1000--rtos.tick() * 5 + local strUrl = "http://" .. m_strIp .. ":8080/iot/tool/ntp?deviceSendTime=" .. nDeviceRunTickMs + log.info("strUrl" .. strUrl) + --http.request("GET",strUrl,nil,nil,nil,nil,httpCallbackFun) + local code, headers, body = http.request("GET", strUrl).wait() + log.info("http.get", code, headers, body) + httpCallbackFun(code,"NULL",headers,body) +end + +local function GetCurrentTime() + local nCurrentTime = os.time() + log.info("GetCurrentTime= " .. nCurrentTime) + return nCurrentTime +end + +function AesPassword() + local nCurrentTime = GetCurrentTime() + local nExpireTime = m_nTimeout + nCurrentTime --这里存在bug 数据溢出了 + + local strAesSource = nil + if nil == m_strDeviceAuthorizationCode then + strAesSource = m_strPassword .. "&" .. nExpireTime .. "000" + else + strAesSource = m_strPassword .. "&" .. nExpireTime .. "000" .."&" .. m_strDeviceAuthorizationCode + end + --加密内容: mqtt密码 & expireTime & 授权码(可选) + --加密模式:CBC;填充方式:Pkcs5Padding;密钥:1234567890123456;密钥长度:128 bit;偏移量:1234567890666666 + log.info("strAesSource=".. strAesSource .. " m_strProductPassword=" ..m_strProductPassword) + local encodeStr = crypto.cipher_encrypt("AES-128-CBC", "PKCS7", strAesSource, m_strProductPassword, "wumei-smart-open") --todo 密码验证 + log.info("AesPassword strAesSource" .. strAesSource .. " encodeStr " .. encodeStr ) + log.info("AES", "aes-128-cbc", encodeStr:toHex()) + encodeStr = crypto.base64_encode(encodeStr) + log.info("AesPassword strAesSource" .. strAesSource .. " encodeStrbase64 " .. encodeStr ) + return encodeStr + +end + +--- mqtt认证初始化 +-- @string strEncryptionMode,string类型,认证类型:S=简单认证,E=加密认证 +-- @string strProductId,string类型,物美里面定义的产品ID +-- @string strDeviceId,string类型,设备ID 一般用imei +-- @string strUserId,string类型,用户ID +-- @string strUser,string类型,用户 +-- @string strPassword,string类型,密码 +-- @number nTimeout,number类型,延迟秒为单位 +-- @string strIp,string类型,Ip +-- @string strDeviceAuthorizationCode,string类型 设备认证码 不用不填 +-- @string strProductPassword,string类型 产品密码 +-- @return nil +function Init(strEncryptionMode,strProductId,strDeviceId,strUserId,strUser,strPassword,nTimeout,strIp,strDeviceAuthorizationCode,strProductPassword,callback) + m_strEncryptionMode = strEncryptionMode + m_strProductId = strProductId + m_strDeviceId = strDeviceId + m_strUserId = strUserId + m_strUser = strUser + m_strPassword = strPassword + m_nTimeout = nTimeout + m_strIp = strIp + m_strDeviceAuthorizationCode = strDeviceAuthorizationCode + m_strProductPassword = strProductPassword + m_nTimeSyncFlag = 0 + m_InitCallback = callback + --if ParameterCheck() == false then + -- Callback(0) + -- end + SyncTime() +end + +function GetUser() + return m_strUser +end + +function GetPassword() + return m_strOutPassword +end + +function GetClientId() + return m_strClientId +end + +function GetIP() + return m_strIp +end + + +return { + GetUser = GetUser, + GetPassword = GetPassword, + GetClientId = GetClientId, + GetIP = GetIP, + Init=Init +} diff --git a/sdk/合宙/air780e/lua/WeiMeiComInteraction.lua b/sdk/合宙/air780e/lua/WeiMeiComInteraction.lua new file mode 100644 index 00000000..530cdcd0 --- /dev/null +++ b/sdk/合宙/air780e/lua/WeiMeiComInteraction.lua @@ -0,0 +1,304 @@ +--- 模块功能:物美MQTT交互 +-- @author 杜兴杰 +-- @module 物美MQTT通信 +-- @license MIT +-- @copyright 杜兴杰 +-- @email 1066950103@qq.com +-- @release 2022.8.5 + +module(..., package.seeall) + +local m_strProductId +local m_strDeviceNum + +local m_tMessageQueue = {} + +local m_callbackPropertyData = nil +local m_callbackFunctionData = nil +local m_callbackEventData = nil +local m_callbackDeviceInformationData = nil + +local m_timePropertyId = 0 +local m_timeFunctionId = 0 +local m_timeEventId = 0 + +local m_nMonitorCount = 0 +local m_nMonitorTime = 0 +local m_timeMonitorId = 0 + +local function GetSubscriberDeviceInformation() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/info/get" +end + +local function GetSubscriberDeviceInOta() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/ota/get" +end + +local function GetSubscriberDeviceProperty() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/property/get" +end + +local function GetSubscriberDevicePropertyOnline() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/property-online/get" +end + +local function GetSubscriberDeviceFunction() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/function/get" +end + +local function GetSubscriberDeviceFunctionOnline() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/function-online/get" +end + +local function GetSubscriberDeviceMonitor() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/monitor/get" +end + +local function GetSubscriberDeviceNtp() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/ntp/get" +end + +local function GetPublishDeviceInformation() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/info/post" +end + +local function GetPublishDeviceProperty() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/property/post" +end + +local function GetPublishDeviceFunction() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/function/post" +end + +local function GetPublishDeviceEvent() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/event/post" +end + +local function GetPublishDeviceNtp() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/ntp/post" +end + +local function GetPublishMonitorProperty() + return "/" .. m_strProductId .. "/" .. m_strDeviceNum .. "/monitor/post" +end + +local function PropertyPush() + if m_callbackPropertyData ~= nil then + local strTopic = GetPublishDeviceProperty() + local strMessage = m_callbackPropertyData() + local nQos = 1 + table.insert(m_tMessageQueue,{topic=strTopic,payload=strMessage,qosr=nQos}) + log.info("------------------PropertyPush---------------") + end +end + +local function FunctionPush() + if m_callbackFunctionData ~= nil then + local strTopic = GetPublishDeviceFunction() + local strMessage = m_callbackFunctionData() + local nQos = 1 + table.insert(m_tMessageQueue,{topic=strTopic,payload=strMessage,qosr=nQos}) + log.info("------------------FunctionPush---------------") + end +end + +local function EventPush() + if m_callbackEventData ~= nil then + local strTopic = GetPublishDeviceEvent() + local strMessage = m_callbackEventData() + local nQos = 1 + table.insert(m_tMessageQueue,{topic=strTopic,payload=strMessage,qosr=nQos}) + log.info("------------------EventPush---------------") + end +end + +local function MonitorPush() + if m_callbackPropertyData ~= nil then + local strTopic = GetPublishMonitorProperty() + local strMessage = m_callbackPropertyData() + local nQos = 1 + table.insert(m_tMessageQueue,{topic=strTopic,payload=strMessage,qosr=nQos}) + log.info("------------------MonitorPush---------------") + end +end + +local function DeviceMonitorTimeCallback() + MonitorPush() + if m_nMonitorCount ~= 0 then + m_nMonitorCount = m_nMonitorCount -1 + m_timeMonitorId = sys.timerStart( + DeviceMonitorTimeCallback + ,m_nMonitorTime) + else + sys.timerStop(m_timeMonitorId) + m_timeMonitorId= 0 + end + log.info("----m_nMonitorCount=" .. m_nMonitorCount) +end + +local function DeviceInformationPush() + if m_callbackDeviceInformationData ~= nil then + local strTopic = GetPublishDeviceInformation() + local strMessage = m_callbackDeviceInformationData() + local nQos = 1 + table.insert(m_tMessageQueue,{topic=strTopic,payload=strMessage,qosr=nQos}) + end +end + +--- mqtt交互初始化 +-- @string strProductId,string类型,产品ID +-- @string strDeviceNum,string类型,设备号 IMEI +-- @return nil +function Init(strProductId,strDeviceNum) + m_strProductId = strProductId + m_strDeviceNum = strDeviceNum +end + +--- mqtt交互延时初始化 +-- @return nil +function DelayInit() + DeviceInformationPush(); +end +--- mqtt 获取待发送数据 一次取出一天且删除 +-- @return bResult false 没有数据 true 有数据 +-- @return strMessage 要发送的数据 +-- @return strTopic 要发送的主题 +-- @return nQos 发送消息级别 +function GetData() + local bResult = false + local strMessage ="" + local strTopic ="" + local nQos = 0 + if #m_tMessageQueue>0 then + local outMsg = table.remove(m_tMessageQueue,1) + bResult = true + strMessage = outMsg.payload + strTopic = outMsg.topic + nQos = outMsg.qosr + end + return bResult,strMessage,strTopic,nQos +end + +--- mqtt 设置属性的获取获取函数,内部调用发送的时候会执行这个函数 这个函数外部实现 +-- @function callback,函数类型, 数据函 +function SetCallbackPropertyData(callback) + m_callbackPropertyData = callback +end + +--- mqtt 设置功能的获取获取函数,内部调用发送的时候会执行这个函数 这个函数外部实现 +-- @function callback,函数类型, 数据函 +function SetCallbackFunctionData(callback) + m_callbackFunctionData = callback +end + +--- mqtt 设置事件的获取获取函数,内部调用发送的时候会执行这个函数 这个函数外部实现 +-- @function callback,函数类型, 数据函 +function SetCallbackEventData(callback) + m_callbackEventData = callback +end + +--- mqtt 设置设备信息获取函数,这个函数外部实现 +-- @function callback,函数类型, 数据函 +function SetCallbackInformationData(callback) + m_callbackDeviceInformationData = callback +end + +--- mqtt 设置属性发布 +-- @number nTime,数字类型, 0停止定时器 其他值开启定时器 +function SetPropertyPush(nTime) + if m_timePropertyId ~= 0 then + sys.timerStop(m_timePropertyId) + m_timePropertyId = 0 + end + if nTime~= 0 then + m_timePropertyId = sys.timerLoopStart(PropertyPush,nTime) + end +end + +--- mqtt 设置功能发布 +-- @number nTime,数字类型, 0停止定时器 其他值开启定时器 +function SetFunctionPush(nTime) + if m_timeFunctionId ~= 0 then + sys.timerStop(m_timeFunctionId) + m_timeFunctionId = 0 + end + if nTime~= 0 then + m_timeFunctionId = sys.timerLoopStart(FunctionPush,nTime) + end +end + +--- mqtt 设置事件发布 +-- @number nTime,数字类型, 0停止定时器 其他值开启定时器 +function SetEventPush(nTime) + if m_timeEventId ~= 0 then + sys.timerStop(m_timeEventId) + m_timeEventId = 0 + end + if nTime~= 0 then + m_timeEventId = sys.timerLoopStart(EventPush,nTime) + end +end + +--- mqtt 获取要订阅的所有主题 +-- @return tSubscriber,表类型, topic 主题 qos级别 +function GetSubscriberAll() + local tSubscriber ={} + table.insert(tSubscriber,{topic=GetSubscriberDeviceInformation(),qos=1}) + table.insert(tSubscriber,{topic=GetSubscriberDeviceProperty(),qos=1}) + table.insert(tSubscriber,{topic=GetSubscriberDevicePropertyOnline(),qos=1}) + table.insert(tSubscriber,{topic=GetSubscriberDeviceFunction(),qos=1}) + table.insert(tSubscriber,{topic=GetSubscriberDeviceFunctionOnline(),qos=1}) + table.insert(tSubscriber,{topic=GetSubscriberDeviceMonitor(),qos=1}) + table.insert(tSubscriber,{topic=GetSubscriberDeviceNtp(),qos=1}) + return tSubscriber +end + +--- mqtt接受数据 +-- @string topic,string类型,接收到的主题 +-- @string message,string类型,消息内容 +-- @return nil +function OnRecvData(topic , message) + if topic == GetSubscriberDeviceInformation() then + DeviceInformationPush(); + elseif topic == GetSubscriberDeviceInOta() then + local jsonObj = json.decode(message) + local strVersion = jsonObj["version"] + local strUrl = jsonObj["downloadUrl"] + elseif topic == GetSubscriberDeviceProperty() then + PropertyPush(); + elseif topic == GetSubscriberDevicePropertyOnline() then + PropertyPush(); + elseif topic == GetSubscriberDeviceFunction() then + FunctionPush(); + elseif topic == GetSubscriberDeviceFunctionOnline() then + FunctionPush(); + elseif topic == GetSubscriberDeviceMonitor() then + local jsonObj = json.decode(message) + m_nMonitorCount = jsonObj["count"] + m_nMonitorTime = jsonObj["interval"] + if m_timeMonitorId ~= 0 then + sys.timerStop(m_timeMonitorId) + m_timeMonitorId = 0 + end + m_timeMonitorId = sys.timerStart( + DeviceMonitorTimeCallback + ,m_nMonitorTime) + elseif topic == GetSubscriberDeviceNtp() then + log.info("--DeviceNtp---" .. message) + end +end + +return { + Init = Init, + DelayInit = DelayInit, + SetCallbackPropertyData = SetCallbackPropertyData, + SetCallbackFunctionData = SetCallbackFunctionData, + SetCallbackEventData=SetCallbackEventData, + SetCallbackInformationData=SetCallbackInformationData, + SetPropertyPush =SetPropertyPush, + SetFunctionPush =SetFunctionPush, + SetEventPush=SetEventPush, + GetSubscriberAll=GetSubscriberAll, + OnRecvData=OnRecvData, + GetData = GetData +} diff --git a/sdk/合宙/air780e/lua/WuMeiTest.lua b/sdk/合宙/air780e/lua/WuMeiTest.lua new file mode 100644 index 00000000..be264846 --- /dev/null +++ b/sdk/合宙/air780e/lua/WuMeiTest.lua @@ -0,0 +1,130 @@ +--- 模块功能:物美MQTT测试 +-- @author 杜兴杰 +-- @module 物美MQTT通信测试 +-- @license MIT +-- @copyright 杜兴杰 +-- @email 1066950103@qq.com +-- @release 2022.8.5 +module(..., package.seeall) +WeiMeiComAuth = require"WeiMeiComAuth" +WeiMeiComInteraction = require"WeiMeiComInteraction" +WeiMeiApp = require"WeiMeiApp" +--require"misc" +--require"mqtt" + +--[[特别注意, 使用mqtt库需要下列语句]] +_G.sysplus = require("sysplus") + +local ready = false + +--物美配置参数相关配置 +local m_strEncryptionMode = "E" +local m_strProductId = 253 +local m_strDeviceId = nil +local m_strUserId = "1" -- admin +local m_strMqttUser = "FastBee" +local m_strMqttPassword = "P77A4MMCA20V0D0K" +local m_strProductPassword = "K4PAICCX042H88E6" --产品密码 +local m_nMqttAuthenticationTimeout = 24*60*60*1 --24小时 +local m_strMqttIp = "www.fastbee.cn" +local m_strDeviceAuthorizationCode = nill--= "A25040D2E34B483DA371B5F9A315BB43" --设备授权码 + +local mqttc = nil +local m_mqttFlag = 0 + +function AuthenticationResultCallback(nResult) + if nResult == 1 then + log.info("---AuthenticationResultCallback---ok") + WeiMeiComInteraction.Init(m_strProductId,m_strDeviceId) + m_mqttFlag = 1 + end +end + +local function MqttInit() + WeiMeiComAuth.Init(m_strEncryptionMode,m_strProductId,m_strDeviceId,m_strUserId,m_strMqttUser,m_strMqttPassword,m_nMqttAuthenticationTimeout,m_strMqttIp,m_strDeviceAuthorizationCode,m_strProductPassword,AuthenticationResultCallback) +end + +-- 订阅所有主题 +local function GetSubscriberAll() + local tSubscriber = WeiMeiComInteraction.GetSubscriberAll() + while #tSubscriber > 0 do + local ouSubscriber = table.remove(tSubscriber,1) + mqttc:subscribe(ouSubscriber.topic,ouSubscriber.qos) --todo 可能订阅数量有限 + --if m_mqttClient:subscribe({[ouSubscriber.topic]=ouSubscriber.qos}) == nil then + -- log.info("subscribe eeror ") + -- return false + --end + end + return true +end + +--- MQTT连接是否处于激活状态 +-- @return 激活状态返回true,非激活状态返回false +-- @usage mqttTask.isReady() +function isReady() + return ready +end + +--启动MQTT客户端任务 +sys.taskInit( + function() + + local retryConnectCnt = 0 + sys.waitUntil("IP_READY", 50000) + + --创建一个MQTT客户端 + m_strDeviceId = mobile.imei() + MqttInit() + while m_mqttFlag == 0 do + sys.wait(50) + end + log.info("ClientId=" .. WeiMeiComAuth.GetClientId() ) + log.info("User=" .. WeiMeiComAuth.GetUser() ) + log.info("Password=" .. WeiMeiComAuth.GetPassword() ) + log.info("Ip=" .. WeiMeiComAuth.GetIP() ) + + mqttc = mqtt.create(nil,WeiMeiComAuth.GetIP(), 1883, false, ca_file) + mqttc:auth(WeiMeiComAuth.GetClientId(),WeiMeiComAuth.GetUser(),WeiMeiComAuth.GetPassword()) -- client_id必填,其余选填 + mqttc:keepalive(30) -- 默认值240s + mqttc:autoreconn(true, 3000) -- 自动重连机制 + + mqttc:on(function(mqtt_client, event, data, payload) + -- 用户自定义代码 + log.info("mqtt", "event", event, mqtt_client, data, payload) + if event == "conack" then + --连接成功 + sys.publish("mqtt_conack") + if GetSubscriberAll() == true then + WeiMeiComInteraction.SetCallbackInformationData(WeiMeiApp.InformationData) + WeiMeiComInteraction.SetCallbackPropertyData(WeiMeiApp.PropertyData) + WeiMeiComInteraction.SetPropertyPush(1000*30) --30秒钟定时上传一次属性 + WeiMeiComInteraction.DelayInit() + end + elseif event == "recv" then + log.info("mqtt", "downlink", "topic", data, "payload", payload) + WeiMeiComInteraction.OnRecvData(data,payload); + elseif event == "sent" then + log.info("mqtt", "sent", "pkgid", data) + -- elseif event == "disconnect" then + -- 非自动重连时,按需重启mqttc + -- mqtt_client:connect() + end + end) + + mqttc:connect() + sys.waitUntil("mqtt_conack") --todo 超时重启 + while true do + -- mqttc自动处理重连 + result,strMessage,strTopic,nQos = WeiMeiComInteraction.GetData() + if result == true then + local mqttResult = mqttc:publish(strTopic,strMessage,nQos) + if not mqttResult then + break + end + end + sys.wait(50) + end + mqttc:close() + mqttc = nil + end +) diff --git a/sdk/合宙/air780e/lua/main.lua b/sdk/合宙/air780e/lua/main.lua new file mode 100644 index 00000000..738a7895 --- /dev/null +++ b/sdk/合宙/air780e/lua/main.lua @@ -0,0 +1,31 @@ +--- 模块功能:lvgldemo +-- @module main +-- @author 杜兴杰 +-- @release 2023.03.15 + +-- LuaTools需要PROJECT和VERSION这两个信息 +PROJECT = "wumeiAir780" +VERSION = "0.0.1" + +log.info("main", PROJECT, VERSION) + +-- sys库是标配 +_G.sys = require("sys") + + + +--添加硬狗防止程序卡死 +if wdt then + wdt.init(9000)--初始化watchdog设置为9s + sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗 +end + + +require "WuMeiTest" + +-- 用户代码已结束--------------------------------------------- +-- 结尾总是这一句 +sys.run() +-- sys.run()之后后面不要加任何语句!!!!! + + diff --git a/sdk/合宙/air780e/lua/mainAir724.lua b/sdk/合宙/air780e/lua/mainAir724.lua new file mode 100644 index 00000000..ad537ba4 --- /dev/null +++ b/sdk/合宙/air780e/lua/mainAir724.lua @@ -0,0 +1,65 @@ + +--必须在这个位置定义PROJECT和VERSION变量 +--PROJECT:ascii string类型,可以随便定义,只要不使用,就行 +--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 +PROJECT = "DTU" +VERSION = "1.0.0" + +--加载日志功能模块,并且设置日志输出等级 +--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可 +require "log" +LOG_LEVEL = log.LOGLEVEL_TRACE +--[[ +如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数 +如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如: +1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可 +2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可 +--]] +--log.openTrace(true,1,115200) + +require "sys" + +require "net" +--每1分钟查询一次GSM信号强度 +--每1分钟查询一次基站信息 +net.startQueryAll(60000, 60000) + +--此处关闭RNDIS网卡功能 +--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失 +--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可 +--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能 +ril.request("AT+RNDISCALL=1,1") + +--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200) +--此功能模块不是必须的,根据项目需求决定是否加载 +--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突 +--使用说明参考demo/console下的《console功能使用说明.docx》 +--require "console" +--console.setup(2, 115200) + +--加载网络指示灯和LTE指示灯功能模块 +--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚 +--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4 +require "netLed" +pmd.ldoset(2,pmd.LDO_VLCD) +netLed.setup(true,pio.P0_1,pio.P0_4) +--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值 +--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长 +--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭 + +--加载错误日志管理功能模块【强烈建议打开此功能】 +--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api +require "errDump" +errDump.request("udp://dev_msg1.openluat.com:12425", nil, true) + +--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】 +--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update +PRODUCT_KEY = "7wazHLKGOdfjrSoG5tXOr4uUg7D5wT9k" +--require "update" +--update.request() + +--加载MQTT功能测试模块 +require "WuMeiTest" +--启动系统框架 +sys.init(0, 0) +sys.run() diff --git a/sdk/合宙/air780e/lua/mainVscode.lua b/sdk/合宙/air780e/lua/mainVscode.lua new file mode 100644 index 00000000..f1ed9f0c --- /dev/null +++ b/sdk/合宙/air780e/lua/mainVscode.lua @@ -0,0 +1,10 @@ +PROJECT = 'test' +VERSION = '2.0.0' +require 'log' +LOG_LEVEL = log.LOGLEVEL_TRACE +require 'sys' +require "WuMeiTest" + + +sys.init(0, 0) +sys.run() diff --git a/springboot/.gitignore b/springboot/.gitignore index a9894fa7..0a02aec9 100644 --- a/springboot/.gitignore +++ b/springboot/.gitignore @@ -1,6 +1,6 @@ ###################################################################### # Build Tools - +.yml .gradle /build/ !gradle/wrapper/gradle-wrapper.jar diff --git a/springboot/README.md b/springboot/README.md index 61938265..5f27be08 100644 --- a/springboot/README.md +++ b/springboot/README.md @@ -1,86 +1,10 @@ -## 平台简介 - -若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 - -* 前端采用Vue、Element UI。 -* 后端采用Spring Boot、Spring Security、Redis & Jwt。 -* 权限认证使用Jwt,支持多终端认证系统。 -* 支持加载动态权限菜单,多方式轻松权限控制。 -* 高效率开发,使用代码生成器可以一键生成前后端代码。 -* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 -* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 -* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) -* 特别鸣谢:[element](https://github.com/ElemeFE/element),[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://github.com/elunez/eladmin-web)。 -* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   -* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)   - -## 内置功能 - -1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 -2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 -3. 岗位管理:配置系统用户所属担任职务。 -4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 -5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 -6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 -7. 参数管理:对系统动态配置常用参数。 -8. 通知公告:系统通知公告信息发布维护。 -9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 -10. 登录日志:系统登录日志记录查询包含登录异常。 -11. 在线用户:当前系统中活跃用户状态监控。 -12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 -13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 -14. 系统接口:根据业务代码自动生成相关的api接口文档。 -15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 -16. 缓存监控:对系统的缓存信息查询,命令统计等。 -17. 在线构建器:拖动表单元素生成相应的HTML代码。 -18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 - -## 在线体验 - -- admin/admin123 -- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 - -演示地址:http://vue.ruoyi.vip -文档地址:http://doc.ruoyi.vip - -## 演示图 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -## 若依前后端分离交流群 - -QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) 点击按钮入群。 \ No newline at end of file +### 一、项目目录 +   fastbee-admin ------------- 主程序入口
+   fastbee-common ---------- 公共模块
+   fastbee-framework -------- 开发框架
+   fastbee-gateway ----------- 消息通道转发
+   fastbee-open-api ---------- 系统开放接口
+   fastbee-plugs --------------- 拓展插件
+   fastbee-protocol ------------ 编解码协议
+   fastbee-server --------------- 传输层服务端 (netty-mqtt)
+   fastbee-service -------------- 核心业务处理
diff --git a/springboot/bin/run.bat b/springboot/bin/run.bat index b0557be3..0de1f6f7 100644 --- a/springboot/bin/run.bat +++ b/springboot/bin/run.bat @@ -4,11 +4,11 @@ echo [��Ϣ] ʹ��Jar��������Web���̡� echo. cd %~dp0 -cd ../wumei-admin/target +cd ../fastbee-admin/target set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -java -jar %JAVA_OPTS% wumei-admin.jar +java -jar %JAVA_OPTS% fastbee-admin.jar cd bin pause \ No newline at end of file diff --git a/springboot/fastbee-admin/pom.xml b/springboot/fastbee-admin/pom.xml new file mode 100644 index 00000000..0cb74acd --- /dev/null +++ b/springboot/fastbee-admin/pom.xml @@ -0,0 +1,112 @@ + + + + fastbee + com.fastbee + 3.8.5 + + 4.0.0 + jar + fastbee-admin + + + web服务入口 + + + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + io.springfox + springfox-boot-starter + + + + + io.swagger + swagger-models + 1.6.2 + + + + + mysql + mysql-connector-java + + + + + com.fastbee + fastbee-framework + + + + + com.fastbee + fastbee-quartz + + + + + com.fastbee + fastbee-generator + + + + + com.fastbee + fastbee-open-api + + + + com.fastbee + boot-strap + + + + com.fastbee + gateway-boot + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.1.RELEASE + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 + + false + ${project.artifactId} + + + + ${project.artifactId} + + + diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeApplication.java b/springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeApplication.java new file mode 100644 index 00000000..945d7de5 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeApplication.java @@ -0,0 +1,20 @@ +package com.fastbee; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 启动程序 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +public class FastBeeApplication +{ + public static void main(String[] args) + { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(FastBeeApplication.class, args); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeServletInitializer.java b/springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeServletInitializer.java new file mode 100644 index 00000000..76586e58 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/FastBeeServletInitializer.java @@ -0,0 +1,18 @@ +package com.fastbee; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author ruoyi + */ +public class FastBeeServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(FastBeeApplication.class); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CaptchaController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CaptchaController.java new file mode 100644 index 00000000..bce23720 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CaptchaController.java @@ -0,0 +1,99 @@ +package com.fastbee.web.controller.common; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import com.google.code.kaptcha.Producer; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.utils.sign.Base64; +import com.fastbee.common.utils.uuid.IdUtils; +import com.fastbee.system.service.ISysConfigService; + +/** + * 验证码操作处理 + * + * @author ruoyi + */ +@Api(tags = "验证码操作") +@RestController +public class CaptchaController +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService configService; + /** + * 生成验证码 + */ + @ApiOperation("获取验证码") + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException + { + AjaxResult ajax = AjaxResult.success(); + boolean captchaEnabled = configService.selectCaptchaEnabled(); + ajax.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) + { + return ajax; + } + + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 生成验证码 + String captchaType = RuoYiConfig.getCaptchaType(); + if ("math".equals(captchaType)) + { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } + else if ("char".equals(captchaType)) + { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try + { + ImageIO.write(image, "jpg", os); + } + catch (IOException e) + { + return AjaxResult.error(e.getMessage()); + } + + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CommonController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CommonController.java new file mode 100644 index 00000000..97ea214b --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/common/CommonController.java @@ -0,0 +1,171 @@ +package com.fastbee.web.controller.common; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.file.FileUploadUtils; +import com.fastbee.common.utils.file.FileUtils; +import com.fastbee.framework.config.ServerConfig; + +/** + * 通用请求处理 + * + * @author ruoyi + */ +@Api(tags = "通用请求处理") +@RestController +@RequestMapping("/common") +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + private static final String FILE_DELIMETER = ","; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @ApiOperation("文件下载") + @GetMapping("/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.checkAllowDownload(fileName)) + { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求(单个) + */ + @ApiOperation("单个文件上传") + @PostMapping("/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + ajax.put("originalFilename", file.getOriginalFilename()); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @ApiOperation("多个文件上传") + @PostMapping("/uploads") + public AjaxResult uploadFiles(List files) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + for (MultipartFile file : files) + { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/download/resource") + @ApiOperation("本地资源通用下载") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + if (!FileUtils.checkAllowDownload(resource)) + { + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/CacheController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/CacheController.java new file mode 100644 index 00000000..fe38cdd0 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/CacheController.java @@ -0,0 +1,131 @@ +package com.fastbee.web.controller.monitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.domain.SysCache; + +/** + * 缓存监控 + * + * @author ruoyi + */ +@Api(tags = "缓存监控") +@RestController +@RequestMapping("/monitor/cache") +public class CacheController +{ + @Autowired + private RedisTemplate redisTemplate; + + private final static List caches = new ArrayList(); + { + caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); + caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息")); + caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典")); + caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码")); + caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交")); + caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理")); + caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数")); + } + + @ApiOperation("获取缓存信息") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } + + @ApiOperation("缓存列表") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getNames") + public AjaxResult cache() + { + return AjaxResult.success(caches); + } + + @ApiOperation("键名列表") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getKeys/{cacheName}") + public AjaxResult getCacheKeys(@PathVariable String cacheName) + { + Set cacheKeys = redisTemplate.keys(cacheName + "*"); + return AjaxResult.success(cacheKeys); + } + + @ApiOperation("缓存内容") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getValue/{cacheName}/{cacheKey}") + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) + { + String cacheValue = redisTemplate.opsForValue().get(cacheKey); + SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); + return AjaxResult.success(sysCache); + } + + @ApiOperation("清理缓存名称") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheName/{cacheName}") + public AjaxResult clearCacheName(@PathVariable String cacheName) + { + Collection cacheKeys = redisTemplate.keys(cacheName + "*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } + + @ApiOperation("清理缓存键名") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheKey/{cacheKey}") + public AjaxResult clearCacheKey(@PathVariable String cacheKey) + { + redisTemplate.delete(cacheKey); + return AjaxResult.success(); + } + + @ApiOperation("清理所有缓存内容") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheAll") + public AjaxResult clearCacheAll() + { + Collection cacheKeys = redisTemplate.keys("*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/ServerController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/ServerController.java new file mode 100644 index 00000000..27510ed8 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/ServerController.java @@ -0,0 +1,31 @@ +package com.fastbee.web.controller.monitor; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.framework.web.domain.Server; + +/** + * 服务器监控 + * + * @author ruoyi + */ +@Api(tags = "服务器监控") +@RestController +@RequestMapping("/monitor/server") +public class ServerController +{ + @ApiOperation("获取服务器信息") + @PreAuthorize("@ss.hasPermi('monitor:server:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Server server = new Server(); + server.copyTo(); + return AjaxResult.success(server); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysLogininforController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysLogininforController.java new file mode 100644 index 00000000..e2e0fc07 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysLogininforController.java @@ -0,0 +1,91 @@ +package com.fastbee.web.controller.monitor; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.framework.web.service.SysPasswordService; +import com.fastbee.system.domain.SysLogininfor; +import com.fastbee.system.service.ISysLogininforService; + +/** + * 系统访问记录 + * + * @author ruoyi + */ +@Api(tags = "日志管理:登录日志") +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController +{ + @Autowired + private ISysLogininforService logininforService; + + @Autowired + private SysPasswordService passwordService; + + @ApiOperation("获取列表登录信息") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor) + { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @ApiOperation("导出登录日志列表") + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysLogininfor logininfor) + { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + util.exportExcel(response, list, "登录日志"); + } + + @ApiOperation("批量删除登录日志") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) + { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @ApiOperation("清空登录日志信息") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return success(); + } + + @ApiOperation("账户解锁") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public AjaxResult unlock(@PathVariable("userName") String userName) + { + passwordService.clearLoginRecordCache(userName); + return success(); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysOperlogController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysOperlogController.java new file mode 100644 index 00000000..d6ad7141 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysOperlogController.java @@ -0,0 +1,77 @@ +package com.fastbee.web.controller.monitor; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.domain.SysOperLog; +import com.fastbee.system.service.ISysOperLogService; + +/** + * 操作日志记录 + * + * @author ruoyi + */ +@Api(tags = "日志管理:操作日志") +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController +{ + @Autowired + private ISysOperLogService operLogService; + + @ApiOperation("获取操作日志列表") + @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog) + { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @ApiOperation("导出操作日志") + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysOperLog operLog) + { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + util.exportExcel(response, list, "操作日志"); + } + + @ApiOperation("批量删除操作日志") + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) + { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @ApiOperation("清空操作日志") + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return success(); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysUserOnlineController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysUserOnlineController.java new file mode 100644 index 00000000..68d132d6 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,98 @@ +package com.fastbee.web.controller.monitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.domain.SysUserOnline; +import com.fastbee.system.service.ISysUserOnlineService; + +/** + * 在线用户监控 + * + * @author ruoyi + */ +@Api(tags = "在线用户监控") +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController +{ + @Autowired + private ISysUserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @ApiOperation("获取在线用户列表") + @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) + { + Collection keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) + { + LoginUser user = redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) + { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) + { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + } + else if (StringUtils.isNotEmpty(ipaddr)) + { + if (StringUtils.equals(ipaddr, user.getIpaddr())) + { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + } + else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) + { + if (StringUtils.equals(userName, user.getUsername())) + { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } + } + else + { + userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 强退用户 + */ + @ApiOperation("强制退出在线用户") + @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) + { + redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); + return success(); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysConfigController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysConfigController.java new file mode 100644 index 00000000..c7e38561 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysConfigController.java @@ -0,0 +1,146 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.domain.SysConfig; +import com.fastbee.system.service.ISysConfigService; + +/** + * 参数配置 信息操作处理 + * + * @author ruoyi + */ +@Api(tags = "参数设置") +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController +{ + @Autowired + private ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @ApiOperation("获取参数配置列表") + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(SysConfig config) + { + startPage(); + List list = configService.selectConfigList(config); + return getDataTable(list); + } + + @ApiOperation("导出参数配置列表") + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:config:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysConfig config) + { + List list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "参数数据"); + } + + /** + * 根据参数编号获取详细信息 + */ + @ApiOperation("根据参数编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) + { + return success(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + */ + @ApiOperation("根据参数键名查询参数值") + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) + { + return success(configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @ApiOperation("新增参数配置") + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) + { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) + { + return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setCreateBy(getUsername()); + return toAjax(configService.insertConfig(config)); + } + + /** + * 修改参数配置 + */ + @ApiOperation("修改参数配置") + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysConfig config) + { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) + { + return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setUpdateBy(getUsername()); + return toAjax(configService.updateConfig(config)); + } + + /** + * 删除参数配置 + */ + @ApiOperation("批量删除参数配置") + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) + { + configService.deleteConfigByIds(configIds); + return success(); + } + + /** + * 刷新参数缓存 + */ + @ApiOperation("刷新参数缓存") + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + configService.resetConfigCache(); + return success(); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDeptController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDeptController.java new file mode 100644 index 00000000..25775982 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDeptController.java @@ -0,0 +1,142 @@ +package com.fastbee.web.controller.system; + +import java.util.List; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDept; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.service.ISysDeptService; + +/** + * 部门信息 + * + * @author ruoyi + */ +@Api(tags = "部门管理") +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController +{ + @Autowired + private ISysDeptService deptService; + + /** + * 获取部门列表 + */ + @ApiOperation("获取部门列表") + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return success(depts); + } + + /** + * 查询部门列表(排除节点) + */ + @ApiOperation("查询部门列表(排除节点)") + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) + { + List depts = deptService.selectDeptList(new SysDept()); + depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + return success(depts); + } + + /** + * 根据部门编号获取详细信息 + */ + @ApiOperation("根据部门编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) + { + deptService.checkDeptDataScope(deptId); + return success(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @ApiOperation("新增部门") + @PreAuthorize("@ss.hasPermi('system:dept:add')") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) + { + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) + { + return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + dept.setCreateBy(getUsername()); + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @ApiOperation("修改部门") + @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) + { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) + { + return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + else if (dept.getParentId().equals(deptId)) + { + return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) + { + return error("该部门包含未停用的子部门!"); + } + dept.setUpdateBy(getUsername()); + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + */ + @ApiOperation("根据部门编号删除部门") + @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable Long deptId) + { + if (deptService.hasChildByDeptId(deptId)) + { + return warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) + { + return warn("部门存在用户,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictDataController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictDataController.java new file mode 100644 index 00000000..7fa03d78 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictDataController.java @@ -0,0 +1,121 @@ +package com.fastbee.web.controller.system; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDictData; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.service.ISysDictDataService; +import com.fastbee.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController +{ + @Autowired + private ISysDictDataService dictDataService; + + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictData dictData) + { + startPage(); + List list = dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) + { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, list, "字典数据"); + } + + /** + * 查询字典数据详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) + { + return success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) + { + List data = dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) + { + data = new ArrayList(); + } + return success(data); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictData dict) + { + dict.setCreateBy(getUsername()); + return toAjax(dictDataService.insertDictData(dict)); + } + + /** + * 修改保存字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictData dict) + { + dict.setUpdateBy(getUsername()); + return toAjax(dictDataService.updateDictData(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) + { + dictDataService.deleteDictDataByIds(dictCodes); + return success(); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictTypeController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictTypeController.java new file mode 100644 index 00000000..3ca77c31 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysDictTypeController.java @@ -0,0 +1,144 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDictType; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ +@Api(tags = "字典管理") +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController +{ + @Autowired + private ISysDictTypeService dictTypeService; + + @ApiOperation("获取字典分页列表") + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictType dictType) + { + startPage(); + List list = dictTypeService.selectDictTypeList(dictType); + return getDataTable(list); + } + + @ApiOperation("导出字典列表") + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictType dictType) + { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "字典类型"); + } + + /** + * 查询字典类型详细 + */ + @ApiOperation("查询字典类型详细") + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) + { + return success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @ApiOperation("新增字典类型") + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) + { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) + { + return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setCreateBy(getUsername()); + return toAjax(dictTypeService.insertDictType(dict)); + } + + /** + * 修改字典类型 + */ + @ApiOperation("新增字典类型") + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictType dict) + { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) + { + return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setUpdateBy(getUsername()); + return toAjax(dictTypeService.updateDictType(dict)); + } + + /** + * 删除字典类型 + */ + @ApiOperation("删除字典类型") + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) + { + dictTypeService.deleteDictTypeByIds(dictIds); + return success(); + } + + /** + * 刷新字典缓存 + */ + @ApiOperation("刷新字典缓存") + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + dictTypeService.resetDictCache(); + return success(); + } + + /** + * 获取字典选择框列表 + */ + @ApiOperation("获取字典选择框列表") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List dictTypes = dictTypeService.selectDictTypeAll(); + return success(dictTypes); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysIndexController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysIndexController.java new file mode 100644 index 00000000..1920037e --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysIndexController.java @@ -0,0 +1,29 @@ +package com.fastbee.web.controller.system; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.utils.StringUtils; + +/** + * 首页 + * + * @author ruoyi + */ +@RestController +public class SysIndexController +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** + * 访问首页,提示语 + */ + @RequestMapping("/") + public String index() + { + return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysLoginController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysLoginController.java new file mode 100644 index 00000000..a11308b7 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysLoginController.java @@ -0,0 +1,97 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import java.util.Set; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysMenu; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginBody; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.framework.web.service.SysLoginService; +import com.fastbee.framework.web.service.SysPermissionService; +import com.fastbee.system.service.ISysMenuService; + +/** + * 登录验证 + * + * @author ruoyi + */ +@Api(tags = "登录验证") +@RestController +public class SysLoginController +{ + @Autowired + private SysLoginService loginService; + + @Autowired + private ISysMenuService menuService; + + @Autowired + private SysPermissionService permissionService; + @Value("${server.broker.enabled}") + private Boolean enabled; + + /** + * 登录方法 + * + * @param loginBody 登录信息 + * @return 结果 + */ + @ApiOperation("用户登录") + @PostMapping("/login") + public AjaxResult login(@RequestBody LoginBody loginBody) + { + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @ApiOperation("获取用户信息") + @GetMapping("getInfo") + public AjaxResult getInfo() + { + SysUser user = SecurityUtils.getLoginUser().getUser(); + // 角色集合 + Set roles = permissionService.getRolePermission(user); + // 权限集合 + Set permissions = permissionService.getMenuPermission(user); + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + ajax.put("mqtt",enabled); + return ajax; + } + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @ApiOperation("获取路由信息") + @GetMapping("getRouters") + public AjaxResult getRouters() + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuTreeByUserId(userId); + return AjaxResult.success(menuService.buildMenus(menus)); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysMenuController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysMenuController.java new file mode 100644 index 00000000..f63493e0 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysMenuController.java @@ -0,0 +1,153 @@ +package com.fastbee.web.controller.system; + +import java.util.List; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysMenu; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.service.ISysMenuService; + +/** + * 菜单信息 + * + * @author ruoyi + */ +@Api(tags = "菜单管理") +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController +{ + @Autowired + private ISysMenuService menuService; + + /** + * 获取菜单列表 + */ + @ApiOperation("获取菜单列表") + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menus); + } + + /** + * 根据菜单编号获取详细信息 + */ + @ApiOperation("根据菜单编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) + { + return success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @ApiOperation("获取菜单下拉树列表") + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + */ + @ApiOperation("加载对应角色菜单列表树") + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) + { + List menus = menuService.selectMenuList(getUserId()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ajax; + } + + /** + * 新增菜单 + */ + @ApiOperation("新增菜单") + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + menu.setCreateBy(getUsername()); + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @ApiOperation("修改菜单") + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + else if (menu.getMenuId().equals(menu.getParentId())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + menu.setUpdateBy(getUsername()); + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + */ + @ApiOperation("删除菜单") + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") Long menuId) + { + if (menuService.hasChildByMenuId(menuId)) + { + return warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) + { + return warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } +} \ No newline at end of file diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java new file mode 100644 index 00000000..da21a916 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java @@ -0,0 +1,100 @@ +package com.fastbee.web.controller.system; + +import java.util.List; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.system.domain.SysNotice; +import com.fastbee.system.service.ISysNoticeService; + +/** + * 公告 信息操作处理 + * + * @author ruoyi + */ +@Api(tags = "通知公告") +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController +{ + @Autowired + private ISysNoticeService noticeService; + + /** + * 获取通知公告列表 + */ + @ApiOperation("获取通知公告列表") + @PreAuthorize("@ss.hasPermi('system:notice:list')") + @GetMapping("/list") + public TableDataInfo list(SysNotice notice) + { + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 根据通知公告编号获取详细信息 + */ + @ApiOperation("根据通知公告编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable Long noticeId) + { + return success(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @ApiOperation("新增通知公告") + @PreAuthorize("@ss.hasPermi('system:notice:add')") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysNotice notice) + { + notice.setCreateBy(getUsername()); + return toAjax(noticeService.insertNotice(notice)); + } + + /** + * 修改通知公告 + */ + @ApiOperation("修改通知公告") + @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysNotice notice) + { + notice.setUpdateBy(getUsername()); + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + */ + @ApiOperation("删除通知公告") + @PreAuthorize("@ss.hasPermi('system:notice:remove')") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable Long[] noticeIds) + { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysPostController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysPostController.java new file mode 100644 index 00000000..29b3f2c1 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysPostController.java @@ -0,0 +1,141 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.domain.SysPost; +import com.fastbee.system.service.ISysPostService; + +/** + * 岗位信息操作处理 + * + * @author ruoyi + */ +@Api(tags = "岗位管理") +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController +{ + @Autowired + private ISysPostService postService; + + /** + * 获取岗位列表 + */ + @ApiOperation("获取岗位列表") + @PreAuthorize("@ss.hasPermi('system:post:list')") + @GetMapping("/list") + public TableDataInfo list(SysPost post) + { + startPage(); + List list = postService.selectPostList(post); + return getDataTable(list); + } + + @ApiOperation("导出岗位列表") + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:post:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysPost post) + { + List list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "岗位数据"); + } + + /** + * 根据岗位编号获取详细信息 + */ + @ApiOperation("根据岗位编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) + { + return success(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @ApiOperation("新增岗位") + @PreAuthorize("@ss.hasPermi('system:post:add')") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) + { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setCreateBy(getUsername()); + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @ApiOperation("修改岗位") + @PreAuthorize("@ss.hasPermi('system:post:edit')") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysPost post) + { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setUpdateBy(getUsername()); + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + */ + @ApiOperation("删除岗位") + @PreAuthorize("@ss.hasPermi('system:post:remove')") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable Long[] postIds) + { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + */ + @ApiOperation("获取岗位选择框列表") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List posts = postService.selectPostAll(); + return success(posts); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysProfileController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysProfileController.java new file mode 100644 index 00000000..8b3a257f --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysProfileController.java @@ -0,0 +1,163 @@ +package com.fastbee.web.controller.system; + +import com.fastbee.common.annotation.Log; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.enums.SocialPlatformType; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.file.FileUploadUtils; +import com.fastbee.common.utils.file.MimeTypeUtils; +import com.fastbee.framework.web.service.TokenService; +import com.fastbee.iot.domain.UserSocialProfile; +import com.fastbee.iot.service.IUserSocialProfileService; +import com.fastbee.system.service.ISysUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 个人信息 业务处理 + * + * @author ruoyi + */ +@Api(tags = "个人中心") +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private TokenService tokenService; + + @Autowired + private IUserSocialProfileService iUserSocialProfileService; + + /** + * 个人信息 + */ + @ApiOperation("获取个人信息") + @GetMapping + public AjaxResult profile() + { + LoginUser loginUser = getLoginUser(); + SysUser user = loginUser.getUser(); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); + ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + List socialProfileList = iUserSocialProfileService.selectUserSocialProfile(loginUser.getUserId()); + UserSocialProfile userSocialProfile = socialProfileList.stream().filter(s -> SocialPlatformType.listWechatPlatform.contains(s.getSourceClient()) && "1".equals(s.getStatus())).findFirst().orElse(null); + ajax.put("socialGroup", socialProfileList); + ajax.put("wxBind", userSocialProfile != null); + return ajax; + } + + /** + * 修改用户 + */ + @ApiOperation("修改个人信息") + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) + { + LoginUser loginUser = getLoginUser(); + SysUser sysUser = loginUser.getUser(); + user.setUserName(sysUser.getUserName()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUserId(sysUser.getUserId()); + user.setPassword(null); + user.setAvatar(null); + user.setDeptId(null); + if (userService.updateUserProfile(user) > 0) + { + // 更新缓存用户信息 + sysUser.setNickName(user.getNickName()); + sysUser.setPhonenumber(user.getPhonenumber()); + sysUser.setEmail(user.getEmail()); + sysUser.setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + */ + @ApiOperation("重置密码") + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) + { + LoginUser loginUser = getLoginUser(); + String userName = loginUser.getUsername(); + String password = loginUser.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) + { + return error("修改密码失败,旧密码错误"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) + { + return error("新密码不能与旧密码相同"); + } + if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) + { + // 更新缓存用户密码 + loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + */ + @ApiOperation("头像上传") + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception + { + if (!file.isEmpty()) + { + LoginUser loginUser = getLoginUser(); + String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + // 更新缓存用户头像 + loginUser.getUser().setAvatar(avatar); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return error("上传图片异常,请联系管理员"); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRegisterController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRegisterController.java new file mode 100644 index 00000000..2bb1c580 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRegisterController.java @@ -0,0 +1,42 @@ +package com.fastbee.web.controller.system; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.RegisterBody; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.web.service.SysRegisterService; +import com.fastbee.system.service.ISysConfigService; + +/** + * 注册验证 + * + * @author ruoyi + */ +@Api(tags = "注册账号") +@RestController +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @ApiOperation("注册账号") + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) + { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) + { + return error("当前系统没有开启注册功能!"); + } + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRoleController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRoleController.java new file mode 100644 index 00000000..0ddef4bf --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysRoleController.java @@ -0,0 +1,282 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDept; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.framework.web.service.SysPermissionService; +import com.fastbee.framework.web.service.TokenService; +import com.fastbee.system.domain.SysUserRole; +import com.fastbee.system.service.ISysDeptService; +import com.fastbee.system.service.ISysRoleService; +import com.fastbee.system.service.ISysUserService; + +/** + * 角色信息 + * + * @author ruoyi + */ +@Api(tags = "角色管理") +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysDeptService deptService; + + @ApiOperation("获取角色分页列表") + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/list") + public TableDataInfo list(SysRole role) + { + startPage(); + List list = roleService.selectRoleList(role); + return getDataTable(list); + } + + @ApiOperation("导出角色列表") + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:role:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysRole role) + { + List list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(SysRole.class); + util.exportExcel(response, list, "角色数据"); + } + + /** + * 根据角色编号获取详细信息 + */ + @ApiOperation("根据角色编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable Long roleId) + { + roleService.checkRoleDataScope(roleId); + return success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @ApiOperation("新增角色") + @PreAuthorize("@ss.hasPermi('system:role:add')") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) + { + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setCreateBy(getUsername()); + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @ApiOperation("修改角色") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setUpdateBy(getUsername()); + + if (roleService.updateRole(role) > 0) + { + // 更新缓存用户权限 + LoginUser loginUser = getLoginUser(); + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) + { + loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); + loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); + tokenService.setLoginUser(loginUser); + } + return success(); + } + return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @ApiOperation("修改保存数据权限") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @ApiOperation("修改角色状态") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + role.setUpdateBy(getUsername()); + return toAjax(roleService.updateRoleStatus(role)); + } + + /** + * 删除角色 + */ + @ApiOperation("删除角色") + @PreAuthorize("@ss.hasPermi('system:role:remove')") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) + { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @ApiOperation("获取角色选择框列表") + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + return success(roleService.selectRoleAll()); + } + + /** + * 查询已分配用户角色列表 + */ + @ApiOperation("查询已分配用户角色列表") + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUser user) + { + startPage(); + List list = userService.selectAllocatedList(user); + return getDataTable(list); + } + + /** + * 查询未分配用户角色列表 + */ + @ApiOperation("查询未分配用户角色列表") + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUser user) + { + startPage(); + List list = userService.selectUnallocatedList(user); + return getDataTable(list); + } + + /** + * 取消授权用户 + */ + @ApiOperation("取消授权用户") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) + { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + */ + @ApiOperation("批量取消授权用户") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) + { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + */ + @ApiOperation("批量选择用户授权") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) + { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + */ + @ApiOperation("获取对应角色部门树列表") + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/deptTree/{roleId}") + public AjaxResult deptTree(@PathVariable("roleId") Long roleId) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); + return ajax; + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java new file mode 100644 index 00000000..09c534c3 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java @@ -0,0 +1,274 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDept; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.service.ISysDeptService; +import com.fastbee.system.service.ISysPostService; +import com.fastbee.system.service.ISysRoleService; +import com.fastbee.system.service.ISysUserService; + +/** + * 用户信息 + * + * @author ruoyi + */ +@Api(tags = "用户管理") +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysDeptService deptService; + + @Autowired + private ISysPostService postService; + + /** + * 获取用户列表 + */ + @ApiOperation("获取用户分页列表") + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(SysUser user) + { + startPage(); + List list = userService.selectUserList(user); + return getDataTable(list); + } + + @ApiOperation("导出用户列表") + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:user:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUser user) + { + List list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(SysUser.class); + util.exportExcel(response, list, "用户数据"); + } + + @ApiOperation("批量导入用户") + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil(SysUser.class); + List userList = util.importExcel(file.getInputStream()); + String operName = getUsername(); + String message = userService.importUser(userList, updateSupport, operName); + return success(message); + } + + + @ApiOperation("下载用户导入模板") + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) + { + ExcelUtil util = new ExcelUtil(SysUser.class); + util.importTemplateExcel(response, "用户数据"); + } + + /** + * 根据用户编号获取详细信息 + */ + @ApiOperation("根据用户编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = { "/", "/{userId}" }) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) + { + userService.checkUserDataScope(userId); + AjaxResult ajax = AjaxResult.success(); + List roles = roleService.selectRoleAll(); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("posts", postService.selectPostAll()); + if (StringUtils.isNotNull(userId)) + { + SysUser sysUser = userService.selectUserById(userId); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); + } + return ajax; + } + + /** + * 新增用户 + */ + @ApiOperation("新增用户") + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) + { + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) + { + return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setCreateBy(getUsername()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @ApiOperation("修改用户") + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) + { + return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + */ + @ApiOperation("删除用户") + @PreAuthorize("@ss.hasPermi('system:user:remove')") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + if (ArrayUtils.contains(userIds, getUserId())) + { + return error("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @ApiOperation("重置用户密码") + @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setUpdateBy(getUsername()); + return toAjax(userService.resetPwd(user)); + } + + /** + * 状态修改 + */ + @ApiOperation("修改用户状态") + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUserStatus(user)); + } + + /** + * 根据用户编号获取授权角色 + */ + @ApiOperation("根据用户编号获取授权角色") + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping("/authRole/{userId}") + public AjaxResult authRole(@PathVariable("userId") Long userId) + { + AjaxResult ajax = AjaxResult.success(); + SysUser user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + ajax.put("user", user); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + return ajax; + } + + /** + * 用户授权角色 + */ + @ApiOperation("为用户授权角色") + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public AjaxResult insertAuthRole(Long userId, Long[] roleIds) + { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return success(); + } + + /** + * 获取部门树列表 + */ + @ApiOperation("获取部门树列表") + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/deptTree") + public AjaxResult deptTree(SysDept dept) + { + return success(deptService.selectDeptTreeList(dept)); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/SwaggerController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/SwaggerController.java new file mode 100644 index 00000000..94f0e3e4 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/SwaggerController.java @@ -0,0 +1,24 @@ +package com.fastbee.web.controller.tool; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.fastbee.common.core.controller.BaseController; + +/** + * swagger 接口 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/tool/swagger") +public class SwaggerController extends BaseController +{ + @PreAuthorize("@ss.hasPermi('tool:swagger:view')") + @GetMapping() + public String index() + { + return redirect("/swagger-ui.html"); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController.java new file mode 100644 index 00000000..f05f972a --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController.java @@ -0,0 +1,185 @@ +package com.fastbee.web.controller.tool; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.R; +import com.fastbee.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +import javax.annotation.Resource; + +/** + * swagger 用户测试方法 + * + * @author ruoyi + */ +@Api("swagger 用户测试方法") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public R> userList() + { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return R.ok(users.get(userId)); + } + else + { + return R.fail("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return R.fail("用户不存在"); + } + users.remove(user.getUserId()); + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return R.ok(); + } + else + { + return R.fail("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController2.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController2.java new file mode 100644 index 00000000..971bf220 --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/controller/tool/TestController2.java @@ -0,0 +1,44 @@ +package com.fastbee.web.controller.tool; + +import com.fastbee.common.annotation.Anonymous; +import com.fastbee.iot.mapper.DeviceMapper; +import com.fastbee.iot.model.DeviceRelateAlertLogVO; +import com.fastbee.iot.service.IDeviceService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 测试类 + * @author fastb + * @date 2023-09-13 11:42 + */ +@Anonymous +@RestController +@RequestMapping("/test2") +public class TestController2 { + + @Resource + private IDeviceService deviceService; + @Resource + private DeviceMapper deviceMapper; + + @GetMapping("/add") + public void add() + { + Set deviceNumbers = new HashSet<>(); + deviceNumbers.add("D1PGLPG58K88"); + deviceNumbers.add("D1F0L7P84D8Z"); + deviceNumbers.add("D1F0L7P84D8Z_2"); + List deviceRelateAlertLogVOList = deviceMapper.selectDeviceBySerialNumbers(deviceNumbers); + Map deviceRelateAlertLogVOMap = deviceRelateAlertLogVOList.stream().collect(Collectors.toMap(DeviceRelateAlertLogVO::getSerialNumber, Function.identity())); + } +} diff --git a/springboot/fastbee-admin/src/main/java/com/fastbee/web/core/config/SwaggerConfig.java b/springboot/fastbee-admin/src/main/java/com/fastbee/web/core/config/SwaggerConfig.java new file mode 100644 index 00000000..ab6bb7be --- /dev/null +++ b/springboot/fastbee-admin/src/main/java/com/fastbee/web/core/config/SwaggerConfig.java @@ -0,0 +1,125 @@ +package com.fastbee.web.core.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.fastbee.common.config.RuoYiConfig; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2的接口配置 + * + * @author ruoyi + */ +@Configuration +public class SwaggerConfig +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** 是否开启swagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** 设置请求的统一前缀 */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("com.fastbee.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() + { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("FastBee物联网平台接口文档") + // 描述 + .description("描述:FastBee物联网平台") + // 作者信息 + .contact(new Contact(ruoyiConfig.getName(), null, null)) + // 版本 + .version("版本号:" + ruoyiConfig.getVersion()) + .build(); + } +} diff --git a/springboot/fastbee-admin/src/main/resources/META-INF/spring-devtools.properties b/springboot/fastbee-admin/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 00000000..37e7b580 --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson2.*.jar \ No newline at end of file diff --git a/springboot/fastbee-admin/src/main/resources/application-dev.yml b/springboot/fastbee-admin/src/main/resources/application-dev.yml new file mode 100644 index 00000000..952efd5a --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/application-dev.yml @@ -0,0 +1,82 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost/fastbee?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 + # 从库数据源 + slave: + enabled: false # 从数据源开关/默认关闭 + url: + username: + password: + initialSize: 5 # 初始连接数 + minIdle: 10 # 最小连接池数量 + maxActive: 20 # 最大连接池数量 + maxWait: 60000 # 配置获取连接等待超时的时间 + timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最小生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 # 配置一个连接在池中最大生存的时间,单位是毫秒 + validationQuery: SELECT 1 FROM DUAL # 配置检测连接是否有效 + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: fastbee + login-password: fastbee + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + # redis 配置 + redis: + host: localhost # 地址 + port: 6379 # 端口,默认为6379 + database: 1 # 数据库索引 + #password: fastbee # 密码 + timeout: 10s # 连接超时时间 + lettuce: + pool: + min-idle: 0 # 连接池中的最小空闲连接 + max-idle: 8 # 连接池中的最大空闲连接 + max-active: 8 # 连接池的最大数据库连接数 + max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制) + # mqtt 配置 + mqtt: + username: fastbee # 账号 + password: fastbee # 密码 + host-url: tcp://localhost:1883 # mqtt连接tcp地址 + client-id: ${random.int} # 客户端Id,不能相同,采用随机数 ${random.value} + default-topic: test # 默认主题 + timeout: 30 # 超时时间 + keepalive: 30 # 保持连接 + clearSession: true # 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息) + +# 日志配置 +logging: + level: + com.fastbee: debug + org.springframework: warn + +# Swagger配置 +swagger: + enabled: true # 是否开启swagger + pathMapping: /dev-api # 请求前缀 diff --git a/springboot/fastbee-admin/src/main/resources/application-prod.yml b/springboot/fastbee-admin/src/main/resources/application-prod.yml new file mode 100644 index 00000000..24932e86 --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/application-prod.yml @@ -0,0 +1,83 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://177.7.0.11/fastbee?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: fastbee + # 从库数据源 + slave: + enabled: false # 从数据源开关/默认关闭 + url: + username: + password: + + initialSize: 5 # 初始连接数 + minIdle: 10 # 最小连接池数量 + maxActive: 20 # 最大连接池数量 + maxWait: 60000 # 配置获取连接等待超时的时间 + timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最小生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 # 配置一个连接在池中最大生存的时间,单位是毫秒 + validationQuery: SELECT 1 FROM DUAL # 配置检测连接是否有效 + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: fastbee + login-password: fastbee + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + # redis 配置 + redis: + host: 177.7.0.10 # 地址 + port: 6379 # 端口,默认为6379 + database: 0 # 数据库索引 + password: fastbee # 密码 + timeout: 10s # 连接超时时间 + lettuce: + pool: + min-idle: 0 # 连接池中的最小空闲连接 + max-idle: 8 # 连接池中的最大空闲连接 + max-active: 8 # 连接池的最大数据库连接数 + max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制) + # mqtt 配置 + mqtt: + username: fastbee # 账号(仅用于后端自认证) + password: fastbee # 密码(仅用于后端自认证) + host-url: tcp://177.7.0.12:1883 # 连接消息服务器地址 + client-id: ${random.int} # 客户端Id,不能相同,采用随机数 ${random.value} + default-topic: test # 默认主题 + timeout: 30 # 超时时间 + keepalive: 30 # 保持连接 + clearSession: true # 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息) + +# 日志配置 +logging: + level: + com.fastbee: error + org.springframework: warn + +# Swagger配置 +swagger: + enabled: true # 是否开启swagger + pathMapping: /prod-api # 请求前缀 diff --git a/springboot/fastbee-admin/src/main/resources/application.yml b/springboot/fastbee-admin/src/main/resources/application.yml new file mode 100644 index 00000000..079f0bd6 --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/application.yml @@ -0,0 +1,98 @@ +# 项目相关配置 +fastbee: + name: fastbee # 名称 + version: 3.8.5 # 版本 + copyrightYear: 2023 # 版权年份 + demoEnabled: true # 实例演示开关 + # 文件路径,以uploadPath结尾 示例( Windows配置 D:/uploadPath,Linux配置 /uploadPath) + profile: /uploadPath + addressEnabled: true # 获取ip地址开关 + captchaType: math # 验证码类型 math 数组计算 char 字符验证 + +# 开发环境配置 +server: + port: 8080 # 服务器的HTTP端口,默认为8080 + servlet: + context-path: / # 应用的访问路径 + tomcat: + uri-encoding: UTF-8 # tomcat的URI编码 + accept-count: 1000 # 连接数满后的排队数,默认为100 + threads: + max: 800 # tomcat最大线程数,默认为200 + min-spare: 100 # Tomcat启动初始化的线程数,默认值10 + # 基于netty的服务器 + broker: + must-pass: false # 客户端连接是否需要密码 + enabled: true # mqttBroker类型选择, true: 基于netty的mqttBroker和webSocket false: emq的mqttBroker + broker-node: node1 + port: 1883 + websocket-port: 8083 + websocket-path: /mqtt + keep-alive: 70 # 默认的全部客户端心跳上传时间 + +# Spring配置 +spring: + # 环境配置,dev=开发环境,prod=生产环境 + profiles: + active: dev # 环境配置,dev=开发环境,prod=生产环境 + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + # 文件上传 + servlet: + multipart: + max-file-size: 10MB # 单个文件大小 + max-request-size: 20MB # 设置总上传的文件大小 + # 服务模块 + devtools: + restart: + enabled: true # 热部署开关 + task: + execution: + pool: + core-size: 20 # 最小连接数 + max-size: 200 # 最大连接数 + queue-capacity: 3000 # 最大容量 + keep-alive: 60 + +#集群配置 +cluster: + enable: true + type: redis + + +# 用户配置 +user: + password: + maxRetryCount: 5 # 密码最大错误次数 + lockTime: 10 # 密码锁定时间(默认10分钟) + +# token配置 +token: + header: Authorization # 令牌自定义标识 + secret: abcdefghijklfastbeesmartrstuvwxyz # 令牌密钥 + expireTime: 1440 # 令牌有效期(默认30分钟)1440为一天 + +# mybatis-plus配置 +mybatis-plus: + typeAliasesPackage: com.fastbee.**.domain # 搜索指定包别名 + mapperLocations: classpath*:mapper/**/*Mapper.xml # 配置mapper的扫描,找到所有的mapper.xml映射文件 + configLocation: classpath:mybatis/mybatis-config.xml # 加载全局的配置文件 + global-config: + db-config: + id-type: AUTO # 自增 ID + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# 防止XSS攻击 +xss: + enabled: true # 过滤开关 + excludes: /system/notice # 排除链接(多个用逗号分隔) + urlPatterns: /system/*,/monitor/*,/tool/* # 匹配链接 diff --git a/springboot/fastbee-admin/src/main/resources/banner.txt b/springboot/fastbee-admin/src/main/resources/banner.txt new file mode 100644 index 00000000..b8ebf46d --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Application Version: ${fastbee.version} +Spring Boot Version: ${spring-boot.version} \ No newline at end of file diff --git a/springboot/fastbee-admin/src/main/resources/i18n/messages.properties b/springboot/fastbee-admin/src/main/resources/i18n/messages.properties new file mode 100644 index 00000000..4098fc92 --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/i18n/messages.properties @@ -0,0 +1,37 @@ +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=用户不存在/密码错误 +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +user.logout.success=退出成功 + +length.not.valid=长度必须在{min}到{max}个字符之间 + +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.password.not.valid=* 5-50个字符 + +user.email.not.valid=邮箱格式错误 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 + +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 + +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] diff --git a/springboot/fastbee-admin/src/main/resources/logback.xml b/springboot/fastbee-admin/src/main/resources/logback.xml new file mode 100644 index 00000000..44322024 --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/logback.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + ${log.pattern} + + + + + + + ${log.path}/sys-debug.log + + + + ${log.path}/sys-debug.%d{yyyy-MM-dd}.log + + 10 + + + ${log.pattern} + + + + DEBUG + + ACCEPT + + DENY + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 10 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 30 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 30 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/springboot/fastbee-admin/src/main/resources/mybatis/mybatis-config.xml b/springboot/fastbee-admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 00000000..ac47c038 --- /dev/null +++ b/springboot/fastbee-admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/springboot/fastbee-common/pom.xml b/springboot/fastbee-common/pom.xml new file mode 100644 index 00000000..70ba5cb8 --- /dev/null +++ b/springboot/fastbee-common/pom.xml @@ -0,0 +1,197 @@ + + + + fastbee + com.fastbee + 3.8.5 + + 4.0.0 + + fastbee-common + + + common通用工具 + + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.baomidou + mybatis-plus-boot-starter + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.5.2 + + + + + com.alibaba.fastjson2 + fastjson2 + + + + + commons-io + commons-io + + + + + commons-fileupload + commons-fileupload + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + io.jsonwebtoken + jjwt + + + + + javax.xml.bind + jaxb-api + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + eu.bitwalker + UserAgentUtils + + + + + javax.servlet + javax.servlet-api + + + org.projectlombok + lombok + + + + io.swagger + swagger-annotations + 1.6.2 + compile + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + compile + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + compile + + + + cn.hutool + hutool-all + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + + com.google.guava + guava + + + + + + + + + com.alibaba + easyexcel-core + + + + + diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Anonymous.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Anonymous.java new file mode 100644 index 00000000..77d90ef0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Anonymous.java @@ -0,0 +1,19 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 匿名访问不鉴权注解 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Anonymous +{ +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataScope.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataScope.java new file mode 100644 index 00000000..ee5bb173 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataScope.java @@ -0,0 +1,33 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据权限过滤注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope +{ + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataSource.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataSource.java new file mode 100644 index 00000000..045786be --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DataSource.java @@ -0,0 +1,28 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.fastbee.common.enums.DataSourceType; + +/** + * 自定义多数据源切换注解 + * + * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource +{ + /** + * 切换数据源名称 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DictFormat.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DictFormat.java new file mode 100644 index 00000000..5536474f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/DictFormat.java @@ -0,0 +1,22 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * 实现将字典数据的值,格式化成字典数据的标签 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface DictFormat { + + /** + * 例如说,SysDictTypeConstants、InfDictTypeConstants + * + * @return 字典类型 + */ + String value(); + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excel.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excel.java new file mode 100644 index 00000000..157c8825 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excel.java @@ -0,0 +1,187 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import com.fastbee.common.utils.poi.ExcelHandlerAdapter; + +/** + * 自定义导出Excel数据注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出时在excel中每个列的高度 单位为字符 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽 单位为字符 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出类型(0数字 1字符串 2图片) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出列头背景色 + */ + public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; + + /** + * 导出列头字体颜色 + */ + public IndexedColors headerColor() default IndexedColors.WHITE; + + /** + * 导出单元格背景色 + */ + public IndexedColors backgroundColor() default IndexedColors.WHITE; + + /** + * 导出单元格字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excels.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excels.java new file mode 100644 index 00000000..b258cd0d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + public Excel[] value(); +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Log.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Log.java new file mode 100644 index 00000000..2526dd45 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/Log.java @@ -0,0 +1,46 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.enums.OperatorType; + +/** + * 自定义操作日志记录注解 + * + * @author ruoyi + * + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log +{ + /** + * 模块 + */ + public String title() default ""; + + /** + * 功能 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + public boolean isSaveRequestData() default true; + + /** + * 是否保存响应的参数 + */ + public boolean isSaveResponseData() default true; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RateLimiter.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RateLimiter.java new file mode 100644 index 00000000..a41daf17 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RateLimiter.java @@ -0,0 +1,40 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.enums.LimitType; + +/** + * 限流注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter +{ + /** + * 限流key + */ + public String key() default CacheConstants.RATE_LIMIT_KEY; + + /** + * 限流时间,单位秒 + */ + public int time() default 60; + + /** + * 限流次数 + */ + public int count() default 100; + + /** + * 限流类型 + */ + public LimitType limitType() default LimitType.DEFAULT; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RepeatSubmit.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RepeatSubmit.java new file mode 100644 index 00000000..1785e572 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/RepeatSubmit.java @@ -0,0 +1,31 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解防止表单重复提交 + * + * @author ruoyi + * + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit +{ + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + public int interval() default 5000; + + /** + * 提示消息 + */ + public String message() default "不允许重复提交,请稍候再试"; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/SysProtocol.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/SysProtocol.java new file mode 100644 index 00000000..19d4a71d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/annotation/SysProtocol.java @@ -0,0 +1,21 @@ +package com.fastbee.common.annotation; + +import java.lang.annotation.*; + +/** + * 表示系统内部协议解析器 + * @author gsb + * @date 2022/10/24 10:33 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysProtocol { + + /*协议名*/ + String name() default ""; + /*协议编码*/ + String protocolCode() default ""; + //协议描述 + String description() default ""; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/config/DeviceTask.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/config/DeviceTask.java new file mode 100644 index 00000000..46a96655 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/config/DeviceTask.java @@ -0,0 +1,104 @@ +package com.fastbee.common.config; + +import com.fastbee.common.constant.FastBeeConstant; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 设备报文处理线程池 + * @author bill + */ +@Configuration +@EnableAsync +@ConfigurationProperties(prefix = "spring.task.execution.pool") +@Data +public class DeviceTask { + + private int coreSize; + + private int maxSize; + + private int queueCapacity; + + private int keepAlive; + + /*设备状态池*/ + @Bean(FastBeeConstant.TASK.DEVICE_STATUS_TASK) + public Executor deviceStatusTaskExecutor() { + return builder(FastBeeConstant.TASK.DEVICE_STATUS_TASK); + } + + /*平台自动获取线程池(例如定时获取设备信息)*/ + @Bean(FastBeeConstant.TASK.DEVICE_FETCH_PROP_TASK) + public Executor deviceFetchTaskExecutor() { + return builder(FastBeeConstant.TASK.DEVICE_FETCH_PROP_TASK); + } + + /*设备回调信息(下发指令(服务)设备应答信息)*/ + @Bean(FastBeeConstant.TASK.DEVICE_REPLY_MESSAGE_TASK) + public Executor deviceReplyTaskExecutor() { + return builder(FastBeeConstant.TASK.DEVICE_REPLY_MESSAGE_TASK); + } + + /*设备主动上报(设备数据有变化主动上报)*/ + @Bean(FastBeeConstant.TASK.DEVICE_UP_MESSAGE_TASK) + public Executor deviceUpMessageTaskExecutor() { + return builder(FastBeeConstant.TASK.DEVICE_UP_MESSAGE_TASK); + } + + /*指令下发(服务下发)*/ + @Bean(FastBeeConstant.TASK.FUNCTION_INVOKE_TASK) + public Executor functionInvokeTaskExecutor() { + return builder(FastBeeConstant.TASK.FUNCTION_INVOKE_TASK); + } + + /*内部消费线程*/ + @Bean(FastBeeConstant.TASK.MESSAGE_CONSUME_TASK) + public Executor messageConsumeTaskExecutor() { + return builder(FastBeeConstant.TASK.MESSAGE_CONSUME_TASK); + } + + @Bean(FastBeeConstant.TASK.MESSAGE_CONSUME_TASK_PUB) + public Executor messageConsumePubTaskExecutor(){ + return builder(FastBeeConstant.TASK.MESSAGE_CONSUME_TASK_PUB); + } + + @Bean(FastBeeConstant.TASK.MESSAGE_CONSUME_TASK_FETCH) + public Executor messageConsumeFetchTaskExecutor(){ + return builder(FastBeeConstant.TASK.MESSAGE_CONSUME_TASK_FETCH); + } + + @Bean(FastBeeConstant.TASK.DELAY_UPGRADE_TASK) + public Executor delayedTaskExecutor(){ + return builder(FastBeeConstant.TASK.DELAY_UPGRADE_TASK); + } + + /*设备其他消息处理*/ + @Bean(FastBeeConstant.TASK.DEVICE_OTHER_TASK) + public Executor deviceOtherTaskExecutor(){ + return builder(FastBeeConstant.TASK.DEVICE_OTHER_TASK); + } + + /*组装线程池*/ + private ThreadPoolTaskExecutor builder(String threadNamePrefix){ + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(coreSize); + executor.setMaxPoolSize(maxSize); + executor.setKeepAliveSeconds(keepAlive); + executor.setQueueCapacity(queueCapacity); + // 线程池对拒绝任务的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy()); + //线程池名的前缀 + executor.setThreadNamePrefix(threadNamePrefix); + executor.initialize(); + return executor; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/config/RuoYiConfig.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/config/RuoYiConfig.java new file mode 100644 index 00000000..f8e1cb77 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/config/RuoYiConfig.java @@ -0,0 +1,135 @@ +package com.fastbee.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取项目相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "fastbee") +public class RuoYiConfig +{ + /** 项目名称 */ + private String name; + + /** 版本 */ + private String version; + + /** 版权年份 */ + private String copyrightYear; + + /** 实例演示开关 */ + private boolean demoEnabled; + + /** 上传路径 */ + private static String profile; + + /** 获取地址开关 */ + private static boolean addressEnabled; + + /** 验证码类型 */ + private static String captchaType; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + this.copyrightYear = copyrightYear; + } + + public boolean isDemoEnabled() + { + return demoEnabled; + } + + public void setDemoEnabled(boolean demoEnabled) + { + this.demoEnabled = demoEnabled; + } + + public static String getProfile() + { + return profile; + } + + public void setProfile(String profile) + { + RuoYiConfig.profile = profile; + } + + public static boolean isAddressEnabled() + { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) + { + RuoYiConfig.addressEnabled = addressEnabled; + } + + public static String getCaptchaType() { + return captchaType; + } + + public void setCaptchaType(String captchaType) { + RuoYiConfig.captchaType = captchaType; + } + + /** + * 获取导入上传路径 + */ + public static String getImportPath() + { + return getProfile() + "/import"; + } + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() + { + return getProfile() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() + { + return getProfile() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() + { + return getProfile() + "/upload"; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/CacheConstants.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/CacheConstants.java new file mode 100644 index 00000000..0f85d649 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/CacheConstants.java @@ -0,0 +1,49 @@ +package com.fastbee.common.constant; + +/** + * 缓存的key 常量 + * + * @author ruoyi + */ +public class CacheConstants +{ + /** + * 登录用户 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 登录用户 redis key + */ + public static final String LOGIN_USERID_KEY = "login_userId:"; + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 防重提交 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + + /** + * 登录账户密码错误次数 redis key + */ + public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/Constants.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/Constants.java new file mode 100644 index 00000000..c3b5ed04 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/Constants.java @@ -0,0 +1,142 @@ +package com.fastbee.common.constant; + +import io.jsonwebtoken.Claims; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public class Constants +{ + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * www主域 + */ + public static final String WWW = "www."; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ + public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.fastbee" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.fastbee.common.utils.file", "com.fastbee.common.config" }; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/FastBeeConstant.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/FastBeeConstant.java new file mode 100644 index 00000000..d14fab2c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/FastBeeConstant.java @@ -0,0 +1,252 @@ +package com.fastbee.common.constant; + +/** + * 常量 + * @author bill + */ +public interface FastBeeConstant { + + interface SERVER{ + String UFT8 = "UTF-8"; + String GB2312 = "GB2312"; + + + String MQTT = "mqtt"; + String PORT = "port"; + String ADAPTER = "adapter"; + String FRAMEDECODER ="frameDecoder"; + String DISPATCHER = "dispatcher"; + String DECODER = "decoder"; + String ENCODER = "encoder"; + String MAXFRAMELENGTH = "maxFrameLength"; + String SLICER = "slicer"; + String DELIMITERS = "delimiters"; + String IDLE = "idle"; + String WS_PREFIX = "web-"; + String WM_PREFIX = "server-"; + String FAST_PHONE = "phone-"; + + /*MQTT平台判定离线时间 keepAlive*1.5 */ + Long DEVICE_PING_EXPIRED = 90000L; + } + + interface CLIENT{ + //加盐 + String TOKEN = "fastbee-smart!@#$123"; + } + + /*webSocket配置*/ + interface WS{ + String HEART_BEAT = "heartbeat"; + String HTTP_SERVER_CODEC = "httpServerCodec"; + String AGGREGATOR = "aggregator"; + String COMPRESSOR = "compressor"; + String PROTOCOL = "protocol"; + String MQTT_WEBSOCKET = "mqttWebsocket"; + String DECODER = "decoder"; + String ENCODER = "encoder"; + String BROKER_HANDLER = "brokerHandler"; + + } + + interface TASK{ + /**设备上下线任务*/ + String DEVICE_STATUS_TASK = "deviceStatusTask"; + /**设备主动上报任务*/ + String DEVICE_UP_MESSAGE_TASK = "deviceUpMessageTask"; + /**设备回调任务*/ + String DEVICE_REPLY_MESSAGE_TASK = "deviceReplyMessageTask"; + /**设备下行任务*/ + String DEVICE_DOWN_MESSAGE_TASK = "deviceDownMessageTask"; + /**服务调用(指令下发)任务*/ + String FUNCTION_INVOKE_TASK = "functionInvokeTask"; + /**属性读取任务,区分服务调用*/ + String DEVICE_FETCH_PROP_TASK = "deviceFetchPropTask"; + /** + * 设备其他消息处理 + */ + String DEVICE_OTHER_TASK = "deviceOtherMsgTask"; + /**消息消费线程*/ + String MESSAGE_CONSUME_TASK = "messageConsumeTask"; + /*内部消费线程publish*/ + String MESSAGE_CONSUME_TASK_PUB = "messageConsumeTaskPub"; + /*内部消费线程Fetch*/ + String MESSAGE_CONSUME_TASK_FETCH = "messageConsumeTaskFetch"; + /*OTA升级延迟队列*/ + String DELAY_UPGRADE_TASK = "delayUpgradeTask"; + + } + + interface MQTT{ + //*上报平台前缀*//* + String UP_TOPIC_SUFFIX = "post"; + //*下发设备前缀*//* + String DOWN_TOPIC_SUFFIX = "get"; + + /*模拟设备后缀*/ + String PROPERTY_GET_SIMULATE = "simulate"; + + String PREDIX = "/+/+"; + + String DUP = "dup"; + String QOS = "qos"; + String RETAIN = "retain"; + String CLEAN_SESSION = "cleanSession"; + + /*集群方式*/ + String REDIS_CHANNEL = "redis"; + String ROCKET_MQ = "rocketmq"; + } + + /*集群,全局发布的消息类型*/ + interface CHANNEL { + /*设备状态*/ + String DEVICE_STATUS = "device_status"; + /*平台读取属性*/ + String PROP_READ = "prop_read"; + /*推送消息*/ + String PUBLISH = "publish"; + /*服务下发*/ + String FUNCTION_INVOKE = "function_invoke"; + /*事件*/ + String EVENT = "event"; + /*other*/ + String OTHER = "other"; + /*Qos1 推送应答*/ + String PUBLISH_ACK = "publish_ack"; + /*Qos2 发布消息收到*/ + String PUB_REC = "pub_rec"; + /*Qos 发布消息释放*/ + String PUB_REL = "pub_rel"; + /*Qos2 发布消息完成*/ + String PUB_COMP = "pub_comp"; + + String UPGRADE = "upgrade"; + + /*-------------------------ROCKETMQ-------------------------*/ + String SUFFIX = "group"; + /*设备状态*/ + String DEVICE_STATUS_GROUP = DEVICE_STATUS +SUFFIX; + String PROP_READ_GROUP = PROP_READ + SUFFIX; + /*服务下发*/ + String FUNCTION_INVOKE_GROUP = FUNCTION_INVOKE + SUFFIX; + /*推送消息*/ + String PUBLISH_GROUP = PUBLISH + SUFFIX; + /*Qos1 推送应答*/ + String PUBLISH_ACK_GROUP = PUBLISH_ACK +SUFFIX; + /*Qos2 发布消息收到*/ + String PUB_REC_GROUP = PUB_REC + SUFFIX; + /*Qos 发布消息释放*/ + String PUB_REL_GROUP = PUB_REL + SUFFIX; + /*Qos2 发布消息完成*/ + String PUB_COMP_GROUP = PUB_COMP + SUFFIX; + /*OTA升级*/ + String UPGRADE_GROUP = UPGRADE + SUFFIX; + } + + + + /**redisKey 定义*/ + interface REDIS{ + /*redis全局前缀*/ + String GLOBAL_PREFIX_KEY = "fastbee:"; + /*设备在线状态*/ + String DEVICE_STATUS_KEY = "device:status"; + /*在线设备列表*/ + String DEVICE_ONLINE_LIST = "device:online:list"; + /*设备实时状态key*/ + String DEVICE_RUNTIME_DATA = "device:runtime:"; + /*通讯协议参数*/ + String DEVICE_PROTOCOL_PARAM = "device:param:"; + /**设备消息id缓存key*/ + String DEVICE_MESSAGE_ID = "device:messageid"; + /**固件版本key*/ + String FIRMWARE_VERSION = "device:firmware:"; + + /**采集点变更记录缓存key*/ + String COLLECT_POINT_CHANGE = "collect:point:change:"; + /**属性下发回调*/ + String PROP_READ_STORE = "prop:read:store:"; + /**sip*/ + String RECORDINFO_KEY = "sip:recordinfo:"; + String DEVICEID_KEY = "sip:deviceid:"; + String STREAM_KEY = "sip:stream:"; + String SIP_CSEQ_PREFIX = "sip:CSEQ:"; + String DEFAULT_SIP_CONFIG = "sip:config"; + String DEFAULT_MEDIA_CONFIG = "sip:mediaconfig"; + + + /**当前连接数*/ + String MESSAGE_CONNECT_COUNT = "messages:connect:count"; + /**总保留消息*/ + String MESSAGE_RETAIN_TOTAL = "message:retain:total"; + + /**主题数*/ + String MESSAGE_TOPIC_TOTAL = "message:topic:total"; + /*发送消息数*/ + String MESSAGE_SEND_TOTAL = "message:send:total"; + /*接收消息数*/ + String MESSAGE_RECEIVE_TOTAL = "message:receive:total"; + /*连接次数*/ + String MESSAGE_CONNECT_TOTAL = "message:connect:total"; + /**认证次数*/ + String MESSAGE_AUTH_TOTAL = "message:auth:total"; + /**订阅次数*/ + String MESSAGE_SUBSCRIBE_TOTAL = "message:subscribe:total"; + + /**今日接收消息*/ + String MESSAGE_RECEIVE_TODAY = "message:receive:today"; + /**今日发送消息*/ + String MESSAGE_SEND_TODAY = "message:send:today"; + + + // 物模型值命名空间:Key:TSLV:{productId}_{deviceNumber} HKey:{identity#V/identity#S/identity#M/identity#N} + /** + * v-值 + * s-影子值 + * m-是否为检测值 + * n-名称 + */ + String DEVICE_PRE_KEY = "TSLV:"; + + // 物模型命名空间:Key:TSL:{productId} + String TSL_PRE_KEY ="TSL:"; + + /**modbus缓存指令*/ + String POLL_MODBUS_KEY = "poll:modbus"; + + + } + + interface TOPIC{ + /*属性上报*/ + String PROP = "properties"; + //事件 + String EVENT = "events"; + //功能 + String FUNCTION = "functions"; + /*非OTA消息回复*/ + String MSG_REPLY = "message/reply"; + /*OTA升级回复*/ + String UPGRADE_REPLY = "upgrade/reply"; + String SUB_UPGRADE_REPLY = "sub/upgrade/reply"; + /*网关子设备结尾*/ + String SUB = "/sub"; + } + + interface PROTOCOL { + String ModbusRtu = "MODBUS-RTU"; + String YinErDa = "YinErDa"; + String JsonObject = "JSONOBJECT"; + String JsonArray = "JSON"; + String ModbusRtuPak = "MODBUS-RTU-PAK"; + String FlowMeter = "FlowMeter"; + String RJ45 = "RJ45"; + String ModbusToJson = "MODBUS-JSON"; + String ModbusToJsonFY = "MODBUS-JSON-FY"; + String JsonObject_ChenYi = "JSONOBJECT-CHENYI"; + + + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/GenConstants.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/GenConstants.java new file mode 100644 index 00000000..028d3a1c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/GenConstants.java @@ -0,0 +1,117 @@ +package com.fastbee.common.constant; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public class GenConstants +{ + /** 单表(增删改查) */ + public static final String TPL_CRUD = "crud"; + + /** 树表(增删改查) */ + public static final String TPL_TREE = "tree"; + + /** 主子表(增删改查) */ + public static final String TPL_SUB = "sub"; + + /** 树编码字段 */ + public static final String TREE_CODE = "treeCode"; + + /** 树父编码字段 */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** 树名称字段 */ + public static final String TREE_NAME = "treeName"; + + /** 上级菜单ID字段 */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** 上级菜单名称字段 */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** 数据库字符串类型 */ + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 数据库文本类型 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + + /** 数据库时间类型 */ + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + + /** 数据库数字类型 */ + public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal" }; + + /** 页面不需要编辑字段 */ + public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + + /** 页面不需要显示的列表字段 */ + public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time" }; + + /** 页面不需要查询字段 */ + public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark" }; + + /** Entity基类字段 */ + public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; + + /** Tree基类字段 */ + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; + + /** 文本框 */ + public static final String HTML_INPUT = "input"; + + /** 文本域 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 下拉框 */ + public static final String HTML_SELECT = "select"; + + /** 单选框 */ + public static final String HTML_RADIO = "radio"; + + /** 复选框 */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** 日期控件 */ + public static final String HTML_DATETIME = "datetime"; + + /** 图片上传控件 */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** 文件上传控件 */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** 富文本控件 */ + public static final String HTML_EDITOR = "editor"; + + /** 字符串类型 */ + public static final String TYPE_STRING = "String"; + + /** 整型 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 长整型 */ + public static final String TYPE_LONG = "Long"; + + /** 浮点型 */ + public static final String TYPE_DOUBLE = "Double"; + + /** 高精度计算类型 */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** 时间类型 */ + public static final String TYPE_DATE = "Date"; + + /** 模糊查询 */ + public static final String QUERY_LIKE = "LIKE"; + + /** 相等查询 */ + public static final String QUERY_EQ = "EQ"; + + /** 需要 */ + public static final String REQUIRE = "1"; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/HttpStatus.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/HttpStatus.java new file mode 100644 index 00000000..e54d8790 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/HttpStatus.java @@ -0,0 +1,105 @@ +package com.fastbee.common.constant; + +/** + * 返回状态码 + * + * @author ruoyi + */ +public class HttpStatus +{ + /** + * 操作成功 + */ + public static final int SUCCESS = 200; + + /** + * 对象创建成功 + */ + public static final int CREATED = 201; + + /** + * 请求已经被接受 + */ + public static final int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + public static final int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + public static final int MOVED_PERM = 301; + + /** + * 重定向 + */ + public static final int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + public static final int BAD_REQUEST = 400; + + /** + * 未授权 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + public static final int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + public static final int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + public static final int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + public static final int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 用户不存在 + */ + public static final int USER_NO_EXIST = 450; + + /** + * 系统内部错误 + */ + public static final int ERROR = 500; + + /** + * 接口未实现 + */ + public static final int NOT_IMPLEMENTED = 501; + + /** + * 不弹窗显示 + */ + public static final int NO_MESSAGE_ALERT = 502; + + + /** + * 系统警告消息 + */ + public static final int WARN = 601; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ProductAuthConstant.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ProductAuthConstant.java new file mode 100644 index 00000000..fa487e44 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ProductAuthConstant.java @@ -0,0 +1,41 @@ +package com.fastbee.common.constant; + +/** + * + * @author fastb + * @date 2023-08-03 10:20 + */ +public class ProductAuthConstant { + + /** + * 产品设备认证方式-简单认证 + */ + public static final Integer AUTH_WAY_SIMPLE = 1; + /** + * 产品设备认证方式-简单认证 + */ + public static final Integer AUTH_WAY_ENCRYPT = 2; + /** + * 产品设备认证方式-简单认证 + */ + public static final Integer AUTH_WAY_SIMPLE_AND_ENCRYPT = 3; + + /** + * 产品设备客户端ID认证类型-简单认证 + */ + public static final String CLIENT_ID_AUTH_TYPE_SIMPLE = "S"; + + /** + * 产品设备客户端ID认证类型-简单认证 + */ + public static final String CLIENT_ID_AUTH_TYPE_ENCRYPT = "E"; + /** + * 设备授权 + */ + public static final Integer AUTHORIZE = 1; + /** + * 设备没有授权 + */ + public static final Integer NO_AUTHORIZE = 1; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ScheduleConstants.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ScheduleConstants.java new file mode 100644 index 00000000..62d07f01 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/ScheduleConstants.java @@ -0,0 +1,50 @@ +package com.fastbee.common.constant; + +/** + * 任务调度通用常量 + * + * @author ruoyi + */ +public class ScheduleConstants +{ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 执行目标key */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 默认 */ + public static final String MISFIRE_DEFAULT = "0"; + + /** 立即触发执行 */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** 触发一次执行 */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** 不触发立即执行 */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status + { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/SipConstants.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/SipConstants.java new file mode 100644 index 00000000..f304dc88 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/SipConstants.java @@ -0,0 +1,9 @@ +package com.fastbee.common.constant; + +public class SipConstants { + public static final String MESSAGE_CATALOG = "Catalog"; + public static final String MESSAGE_KEEP_ALIVE = "Keepalive"; + public static final String MESSAGE_DEVICE_INFO = "DeviceInfo"; + public static final String MESSAGE_RECORD_INFO = "RecordInfo"; + public static final String MESSAGE_MEDIA_STATUS = "MediaStatus"; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/UserConstants.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/UserConstants.java new file mode 100644 index 00000000..ad6f4a3d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/constant/UserConstants.java @@ -0,0 +1,78 @@ +package com.fastbee.common.constant; + +/** + * 用户常量信息 + * + * @author ruoyi + */ +public class UserConstants +{ + /** + * 平台内系统用户的唯一标志 + */ + public static final String SYS_USER = "SYS_USER"; + + /** 正常状态 */ + public static final String NORMAL = "0"; + + /** 异常状态 */ + public static final String EXCEPTION = "1"; + + /** 用户封禁状态 */ + public static final String USER_DISABLE = "1"; + + /** 角色封禁状态 */ + public static final String ROLE_DISABLE = "1"; + + /** 部门正常状态 */ + public static final String DEPT_NORMAL = "0"; + + /** 部门停用状态 */ + public static final String DEPT_DISABLE = "1"; + + /** 字典正常状态 */ + public static final String DICT_NORMAL = "0"; + + /** 是否为系统默认(是) */ + public static final String YES = "Y"; + + /** 是否菜单外链(是) */ + public static final String YES_FRAME = "0"; + + /** 是否菜单外链(否) */ + public static final String NO_FRAME = "1"; + + /** 菜单类型(目录) */ + public static final String TYPE_DIR = "M"; + + /** 菜单类型(菜单) */ + public static final String TYPE_MENU = "C"; + + /** 菜单类型(按钮) */ + public static final String TYPE_BUTTON = "F"; + + /** Layout组件标识 */ + public final static String LAYOUT = "Layout"; + + /** ParentView组件标识 */ + public final static String PARENT_VIEW = "ParentView"; + + /** InnerLink组件标识 */ + public final static String INNER_LINK = "InnerLink"; + + /** 校验返回结果码 */ + public final static String UNIQUE = "0"; + public final static String NOT_UNIQUE = "1"; + + /** + * 用户名长度限制 + */ + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 密码长度限制 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + public static final int PASSWORD_MAX_LENGTH = 20; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/controller/BaseController.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/controller/BaseController.java new file mode 100644 index 00000000..b331ba3b --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/controller/BaseController.java @@ -0,0 +1,216 @@ +package com.fastbee.common.core.controller; + +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.page.PageDomain; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.core.page.TableSupport; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.PageUtils; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.sql.SqlUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import javax.annotation.Resource; +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; + +/** + * web层通用数据处理 + * + * @author ruoyi + */ +public class BaseController +{ + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource + private RedisCache redisCache; + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) + { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() + { + @Override + public void setAsText(String text) + { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() + { + PageUtils.startPage(); + } + + /** + * 设置请求排序数据 + */ + protected void startOrderBy() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.orderBy(orderBy); + } + } + + /** + * 清理分页的线程变量 + */ + protected void clearPage() + { + PageUtils.clearPage(); + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 返回成功 + */ + public AjaxResult success() + { + return AjaxResult.success(); + } + + /** + * 返回失败消息 + */ + public AjaxResult error() + { + return AjaxResult.error(); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(String message) + { + return AjaxResult.success(message); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(Object data) + { + return AjaxResult.success(data); + } + + /** + * 返回失败消息 + */ + public AjaxResult error(String message) + { + return AjaxResult.error(message); + } + + /** + * 返回警告消息 + */ + public AjaxResult warn(String message) + { + return AjaxResult.warn(message); + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) + { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected AjaxResult toAjax(boolean result) + { + return result ? success() : error(); + } + + /** + * 页面跳转 + */ + public String redirect(String url) + { + return StringUtils.format("redirect:{}", url); + } + + /** + * 获取用户缓存信息 + * 由于不同端不能获取最新用户信息,所以优先以用户id缓存key获取用户信息 + */ + public LoginUser getLoginUser() + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long userId = loginUser.getUserId(); + if (userId != null) { + String userKey = CacheConstants.LOGIN_USERID_KEY + userId; + return redisCache.getCacheObject(userKey); + } + return loginUser; + } + + /** + * 获取登录用户id + */ + public Long getUserId() + { + return getLoginUser().getUserId(); + } + + /** + * 获取登录部门id + */ + public Long getDeptId() + { + return getLoginUser().getDeptId(); + } + + /** + * 获取登录用户名 + */ + public String getUsername() + { + return getLoginUser().getUsername(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/AjaxResult.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/AjaxResult.java new file mode 100644 index 00000000..9db8ee4e --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/AjaxResult.java @@ -0,0 +1,214 @@ +package com.fastbee.common.core.domain; + +import java.util.HashMap; +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.utils.StringUtils; + +/** + * 操作消息提醒 + * + * @author ruoyi + */ +public class AjaxResult extends HashMap +{ + private static final long serialVersionUID = 1L; + + /** 状态码 */ + public static final String CODE_TAG = "code"; + + /** 返回内容 */ + public static final String MSG_TAG = "msg"; + + /** 数据对象 */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() + { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) + { + super.put(DATA_TAG, data); + } + } + + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data,int total) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) + { + super.put(DATA_TAG, data); + } + super.put("total",total); + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() + { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) + { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data,int total) + { + return new AjaxResult(HttpStatus.SUCCESS, "操作成功", data,total); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) + { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) + { + return new AjaxResult(HttpStatus.SUCCESS, msg, data); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult warn(String msg) + { + return AjaxResult.warn(msg, null); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult warn(String msg, Object data) + { + return new AjaxResult(HttpStatus.WARN, msg, data); + } + + /** + * 返回错误消息 + * + * @return 错误消息 + */ + public static AjaxResult error() + { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(String msg) + { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 错误消息 + */ + public static AjaxResult error(String msg, Object data) + { + return new AjaxResult(HttpStatus.ERROR, msg, data); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(int code, String msg) + { + return new AjaxResult(code, msg, null); + } + + /** + * 方便链式调用 + * + * @param key 键 + * @param value 值 + * @return 数据对象 + */ + @Override + public AjaxResult put(String key, Object value) + { + super.put(key, value); + return this; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseDO.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseDO.java new file mode 100644 index 00000000..be3e6486 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseDO.java @@ -0,0 +1,43 @@ +package com.fastbee.common.core.domain; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 基类,时间类型改为LocalDateTime + * @author fastb + * @date 2023-08-22 9:11 + */ +@Data +public class BaseDO implements Serializable { + private static final long serialVersionUID = 1L; + + /** 创建者 */ + @ApiModelProperty("创建者") + private String createBy; + + /** 创建时间 */ + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 更新者 */ + @ApiModelProperty("更新者") + private String updateBy; + + /** 更新时间 */ + @ApiModelProperty("更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 逻辑删除 */ + @ApiModelProperty("逻辑删除") + @TableLogic + private Boolean delFlag; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseEntity.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseEntity.java new file mode 100644 index 00000000..3bc489d5 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/BaseEntity.java @@ -0,0 +1,126 @@ +package com.fastbee.common.core.domain; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; + +/** + * Entity基类 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 搜索值 */ + @ApiModelProperty("搜索值") + @JsonIgnore + private String searchValue; + + /** 创建者 */ + @ApiModelProperty("创建者") + private String createBy; + + /** 创建时间 */ + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 更新者 */ + @ApiModelProperty("更新者") + private String updateBy; + + /** 更新时间 */ + @ApiModelProperty("更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** 备注 */ + @ApiModelProperty("备注") + private String remark; + + /** 请求参数 */ + @ApiModelProperty("请求参数") + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private Map params; + + public String getSearchValue() + { + return searchValue; + } + + public void setSearchValue(String searchValue) + { + this.searchValue = searchValue; + } + + public String getCreateBy() + { + return createBy; + } + + public void setCreateBy(String createBy) + { + this.createBy = createBy; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } + + public String getUpdateBy() + { + return updateBy; + } + + public void setUpdateBy(String updateBy) + { + this.updateBy = updateBy; + } + + public Date getUpdateTime() + { + return updateTime; + } + + public void setUpdateTime(Date updateTime) + { + this.updateTime = updateTime; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public Map getParams() + { + if (params == null) + { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) + { + this.params = params; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/CommonResult.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/CommonResult.java new file mode 100644 index 00000000..0ce5b111 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/CommonResult.java @@ -0,0 +1,112 @@ +package com.fastbee.common.core.domain; + +import com.fastbee.common.enums.GlobalErrorCodeConstants; +import com.fastbee.common.exception.ErrorCode; +import com.fastbee.common.exception.ServiceException; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.util.Assert; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 通用返回 + * + * @param 数据泛型 + */ +@Data +public class CommonResult implements Serializable { + + /** + * 错误码 + * + * @see ErrorCode#getCode() + */ + private Integer code; + /** + * 返回数据 + */ + private T data; + /** + * 错误提示,用户可阅读 + * + * @see ErrorCode#getMsg() () + */ + private String msg; + + /** + * 将传入的 result 对象,转换成另外一个泛型结果的对象 + * + * 因为 A 方法返回的 CommonResult 对象,不满足调用其的 B 方法的返回,所以需要进行转换。 + * + * @param result 传入的 result 对象 + * @param 返回的泛型 + * @return 新的 CommonResult 对象 + */ + public static CommonResult error(CommonResult result) { + return error(result.getCode(), result.getMsg()); + } + + public static CommonResult error(Integer code, String message) { + Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 必须是错误的!"); + CommonResult result = new CommonResult<>(); + result.code = code; + result.msg = message; + return result; + } + + public static CommonResult error(ErrorCode errorCode) { + return error(errorCode.getCode(), errorCode.getMsg()); + } + + public static CommonResult success(T data) { + CommonResult result = new CommonResult<>(); + result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); + result.data = data; + result.msg = ""; + return result; + } + + public static boolean isSuccess(Integer code) { + return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isSuccess() { + return isSuccess(code); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isError() { + return !isSuccess(); + } + + // ========= 和 Exception 异常体系集成 ========= + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + */ + public void checkError() throws ServiceException { + if (isSuccess()) { + return; + } + // 业务异常 + throw new ServiceException(code, msg); + } + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + * 如果没有,则返回 {@link #data} 数据 + */ + @JsonIgnore // 避免 jackson 序列化 + public T getCheckedData() { + checkError(); + return data; + } + + public static CommonResult error(ServiceException serviceException) { + return error(serviceException.getCode(), serviceException.getMessage()); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageParam.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageParam.java new file mode 100644 index 00000000..b1873e70 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageParam.java @@ -0,0 +1,25 @@ +package com.fastbee.common.core.domain; + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +public class PageParam implements Serializable { + + private static final Integer PAGE_NO = 1; + private static final Integer PAGE_SIZE = 10; + + @NotNull(message = "页码不能为空") + @Min(value = 1, message = "页码最小值为 1") + private Integer pageNo = PAGE_NO; + + @NotNull(message = "每页条数不能为空") + @Min(value = 1, message = "每页条数最小值为 1") + @Max(value = 100, message = "每页条数最大值为 100") + private Integer pageSize = PAGE_SIZE; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageResult.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageResult.java new file mode 100644 index 00000000..97b8b843 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/PageResult.java @@ -0,0 +1,42 @@ +package com.fastbee.common.core.domain; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Api(tags = "分页结果") +@Data +public final class PageResult implements Serializable { + + @ApiModelProperty(value = "数据", required = true) + private List list; + + @ApiModelProperty(value = "总量", required = true) + private Long total; + + public PageResult() { + } + + public PageResult(List list, Long total) { + this.list = list; + this.total = total; + } + + public PageResult(Long total) { + this.list = new ArrayList<>(); + this.total = total; + } + + public static PageResult empty() { + return new PageResult<>(0L); + } + + public static PageResult empty(Long total) { + return new PageResult<>(total); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/R.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/R.java new file mode 100644 index 00000000..fe572876 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/R.java @@ -0,0 +1,115 @@ +package com.fastbee.common.core.domain; + +import java.io.Serializable; +import com.fastbee.common.constant.HttpStatus; + +/** + * 响应信息主体 + * + * @author ruoyi + */ +public class R implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 成功 */ + public static final int SUCCESS = HttpStatus.SUCCESS; + + /** 失败 */ + public static final int FAIL = HttpStatus.ERROR; + + private int code; + + private String msg; + + private T data; + + public static R ok() + { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) + { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(T data, String msg) + { + return restResult(data, SUCCESS, msg); + } + + public static R fail() + { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) + { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) + { + return restResult(data, FAIL, "操作失败"); + } + + public static R fail(T data, String msg) + { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) + { + return restResult(null, code, msg); + } + + private static R restResult(T data, int code, String msg) + { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } + + public static Boolean isError(R ret) + { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) + { + return R.SUCCESS == ret.getCode(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/SortingField.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/SortingField.java new file mode 100644 index 00000000..685d73ff --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/SortingField.java @@ -0,0 +1,56 @@ +package com.fastbee.common.core.domain; + +import java.io.Serializable; + +/** + * 排序字段 DTO + * + * 类名加了 ing 的原因是,避免和 ES SortField 重名。 + */ +public class SortingField implements Serializable { + + /** + * 顺序 - 升序 + */ + public static final String ORDER_ASC = "asc"; + /** + * 顺序 - 降序 + */ + public static final String ORDER_DESC = "desc"; + + /** + * 字段 + */ + private String field; + /** + * 顺序 + */ + private String order; + + // 空构造方法,解决反序列化 + public SortingField() { + } + + public SortingField(String field, String order) { + this.field = field; + this.order = order; + } + + public String getField() { + return field; + } + + public SortingField setField(String field) { + this.field = field; + return this; + } + + public String getOrder() { + return order; + } + + public SortingField setOrder(String order) { + this.order = order; + return this; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TenantBaseDO.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TenantBaseDO.java new file mode 100644 index 00000000..06ef2c62 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TenantBaseDO.java @@ -0,0 +1,20 @@ +package com.fastbee.common.core.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 拓展多租户的 BaseDO 基类 + * + * @author fastbee + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class TenantBaseDO extends BaseDO { + + /** + * 多租户编号 + */ + private Long tenantId; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeEntity.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeEntity.java new file mode 100644 index 00000000..11e3b667 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeEntity.java @@ -0,0 +1,79 @@ +package com.fastbee.common.core.domain; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tree基类 + * + * @author ruoyi + */ +public class TreeEntity extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 父菜单名称 */ + private String parentName; + + /** 父菜单ID */ + private Long parentId; + + /** 显示顺序 */ + private Integer orderNum; + + /** 祖级列表 */ + private String ancestors; + + /** 子部门 */ + private List children = new ArrayList<>(); + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeSelect.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeSelect.java new file mode 100644 index 00000000..cbb874b8 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/TreeSelect.java @@ -0,0 +1,77 @@ +package com.fastbee.common.core.domain; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fastbee.common.core.domain.entity.SysDept; +import com.fastbee.common.core.domain.entity.SysMenu; + +/** + * Treeselect树结构实体类 + * + * @author ruoyi + */ +public class TreeSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 节点ID */ + private Long id; + + /** 节点名称 */ + private String label; + + /** 子节点 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() + { + + } + + public TreeSelect(SysDept dept) + { + this.id = dept.getDeptId(); + this.label = dept.getDeptName(); + this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(SysMenu menu) + { + this.id = menu.getMenuId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getLabel() + { + return label; + } + + public void setLabel(String label) + { + this.label = label; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDept.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDept.java new file mode 100644 index 00000000..d4883954 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDept.java @@ -0,0 +1,219 @@ +package com.fastbee.common.core.domain.entity; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 部门表 sys_dept + * + * @author ruoyi + */ +@ApiModel(value = "SysDept", description = "部门表 sys_dept") +public class SysDept extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 部门ID */ + @ApiModelProperty("部门ID") + private Long deptId; + + /** 父部门ID */ + @ApiModelProperty("父部门ID") + private Long parentId; + + /** 祖级列表 */ + @ApiModelProperty("祖级列表") + private String ancestors; + + /** 部门名称 */ + @ApiModelProperty("部门名称") + private String deptName; + + /** 显示顺序 */ + @ApiModelProperty("显示顺序") + private Integer orderNum; + + /** 负责人 */ + @ApiModelProperty("负责人") + private String leader; + + /** 联系电话 */ + @ApiModelProperty("联系电话") + private String phone; + + /** 邮箱 */ + @ApiModelProperty("邮箱") + private String email; + + /** 部门状态:0正常,1停用 */ + @ApiModelProperty("部门状态:0正常,1停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志(0代表存在 2代表删除)") + private String delFlag; + + /** 父部门名称 */ + @ApiModelProperty("父部门名称") + private String parentName; + + /** 子部门 */ + @ApiModelProperty("子部门") + private List children = new ArrayList(); + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getLeader() + { + return leader; + } + + public void setLeader(String leader) + { + this.leader = leader; + } + + @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") + public String getPhone() + { + return phone; + } + + public void setPhone(String phone) + { + this.phone = phone; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", getDeptId()) + .append("parentId", getParentId()) + .append("ancestors", getAncestors()) + .append("deptName", getDeptName()) + .append("orderNum", getOrderNum()) + .append("leader", getLeader()) + .append("phone", getPhone()) + .append("email", getEmail()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictData.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictData.java new file mode 100644 index 00000000..8f3d1f54 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictData.java @@ -0,0 +1,189 @@ +package com.fastbee.common.core.domain.entity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.annotation.Excel.ColumnType; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author ruoyi + */ +@ApiModel(value = "SysDictData", description = "字典数据表 sys_dict_data") +public class SysDictData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典编码 */ + @ApiModelProperty("字典编码") + @Excel(name = "字典编码", cellType = ColumnType.NUMERIC) + private Long dictCode; + + /** 字典排序 */ + @ApiModelProperty("字典排序") + @Excel(name = "字典排序", cellType = ColumnType.NUMERIC) + private Long dictSort; + + /** 字典标签 */ + @ApiModelProperty("字典标签") + @Excel(name = "字典标签") + private String dictLabel; + + /** 字典键值 */ + @ApiModelProperty("字典键值") + @Excel(name = "字典键值") + private String dictValue; + + /** 字典类型 */ + @ApiModelProperty("字典类型") + @Excel(name = "字典类型") + private String dictType; + + /** 样式属性(其他样式扩展) */ + @ApiModelProperty("样式属性(其他样式扩展)") + private String cssClass; + + /** 表格字典样式 */ + @ApiModelProperty("表格字典样式") + private String listClass; + + /** 是否默认(Y是 N否) */ + @ApiModelProperty("是否默认(Y是 N否)") + @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") + private String isDefault; + + /** 状态(0正常 1停用) */ + @ApiModelProperty("状态(0正常 1停用)") + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public Long getDictCode() + { + return dictCode; + } + + public void setDictCode(Long dictCode) + { + this.dictCode = dictCode; + } + + public Long getDictSort() + { + return dictSort; + } + + public void setDictSort(Long dictSort) + { + this.dictSort = dictSort; + } + + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + public String getDictLabel() + { + return dictLabel; + } + + public void setDictLabel(String dictLabel) + { + this.dictLabel = dictLabel; + } + + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + public String getDictValue() + { + return dictValue; + } + + public void setDictValue(String dictValue) + { + this.dictValue = dictValue; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + public String getCssClass() + { + return cssClass; + } + + public void setCssClass(String cssClass) + { + this.cssClass = cssClass; + } + + public String getListClass() + { + return listClass; + } + + public void setListClass(String listClass) + { + this.listClass = listClass; + } + + public boolean getDefault() + { + return UserConstants.YES.equals(this.isDefault); + } + + public String getIsDefault() + { + return isDefault; + } + + public void setIsDefault(String isDefault) + { + this.isDefault = isDefault; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictType.java new file mode 100644 index 00000000..eee07a37 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysDictType.java @@ -0,0 +1,104 @@ +package com.fastbee.common.core.domain.entity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.annotation.Excel.ColumnType; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 字典类型表 sys_dict_type + * + * @author ruoyi + */ +@ApiModel(value = "SysDictType", description = "字典类型表 sys_dict_type") +public class SysDictType extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典主键 */ + @ApiModelProperty("字典主键") + @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) + private Long dictId; + + /** 字典名称 */ + @ApiModelProperty("字典名称") + @Excel(name = "字典名称") + private String dictName; + + /** 字典类型 */ + @ApiModelProperty("字典类型") + @Excel(name = "字典类型") + private String dictType; + + /** 状态(0正常 1停用) */ + @ApiModelProperty("状态(0正常 1停用)") + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public Long getDictId() + { + return dictId; + } + + public void setDictId(Long dictId) + { + this.dictId = dictId; + } + + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") + public String getDictName() + { + return dictName; + } + + public void setDictName(String dictName) + { + this.dictName = dictName; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysMenu.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysMenu.java new file mode 100644 index 00000000..feee0421 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysMenu.java @@ -0,0 +1,279 @@ +package com.fastbee.common.core.domain.entity; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 菜单权限表 sys_menu + * + * @author ruoyi + */ +@ApiModel(value = "SysMenu", description = "菜单权限表 sys_menu") +public class SysMenu extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 菜单ID */ + @ApiModelProperty("菜单ID") + private Long menuId; + + /** 菜单名称 */ + @ApiModelProperty("菜单名称") + private String menuName; + + /** 父菜单名称 */ + @ApiModelProperty("父菜单名称") + private String parentName; + + /** 父菜单ID */ + @ApiModelProperty("父菜单ID") + private Long parentId; + + /** 显示顺序 */ + @ApiModelProperty("显示顺序") + private Integer orderNum; + + /** 路由地址 */ + @ApiModelProperty("路由地址") + private String path; + + /** 组件路径 */ + @ApiModelProperty("组件路径") + private String component; + + /** 路由参数 */ + @ApiModelProperty("路由参数") + private String query; + + /** 是否为外链(0是 1否) */ + @ApiModelProperty("是否为外链(0是 1否)") + private String isFrame; + + /** 是否缓存(0缓存 1不缓存) */ + @ApiModelProperty("是否缓存(0缓存 1不缓存)") + private String isCache; + + /** 类型(M目录 C菜单 F按钮) */ + @ApiModelProperty("类型(M目录 C菜单 F按钮)") + private String menuType; + + /** 显示状态(0显示 1隐藏) */ + @ApiModelProperty("显示状态(0显示 1隐藏)") + private String visible; + + /** 菜单状态(0正常 1停用) */ + @ApiModelProperty("菜单状态(0正常 1停用)") + private String status; + + /** 权限字符串 */ + @ApiModelProperty("权限字符串") + private String perms; + + /** 菜单图标 */ + @ApiModelProperty("菜单图标") + private String icon; + + /** 子菜单 */ + @ApiModelProperty("子菜单") + private List children = new ArrayList(); + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") + public String getMenuName() + { + return menuName; + } + + public void setMenuName(String menuName) + { + this.menuName = menuName; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public String getIsFrame() + { + return isFrame; + } + + public void setIsFrame(String isFrame) + { + this.isFrame = isFrame; + } + + public String getIsCache() + { + return isCache; + } + + public void setIsCache(String isCache) + { + this.isCache = isCache; + } + + @NotBlank(message = "菜单类型不能为空") + public String getMenuType() + { + return menuType; + } + + public void setMenuType(String menuType) + { + this.menuType = menuType; + } + + public String getVisible() + { + return visible; + } + + public void setVisible(String visible) + { + this.visible = visible; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") + public String getPerms() + { + return perms; + } + + public void setPerms(String perms) + { + this.perms = perms; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysRole.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysRole.java new file mode 100644 index 00000000..1e4d23bf --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysRole.java @@ -0,0 +1,257 @@ +package com.fastbee.common.core.domain.entity; + +import java.util.Set; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.annotation.Excel.ColumnType; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 角色表 sys_role + * + * @author ruoyi + */ +@ApiModel(value = "SysRole", description = "角色表 sys_role") +public class SysRole extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 角色ID */ + @ApiModelProperty("角色ID") + @Excel(name = "角色序号", cellType = ColumnType.NUMERIC) + private Long roleId; + + /** 角色名称 */ + @ApiModelProperty("角色名称") + @Excel(name = "角色名称") + private String roleName; + + /** 角色权限 */ + @ApiModelProperty("角色权限") + @Excel(name = "角色权限") + private String roleKey; + + /** 角色排序 */ + @ApiModelProperty("角色排序") + @Excel(name = "角色排序") + private Integer roleSort; + + /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ + @ApiModelProperty(value = "数据范围", notes = "(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)") + @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */ + @ApiModelProperty(value = "菜单树选择项是否关联显示", notes = "( 0:父子不互相关联显示 1:父子互相关联显示)") + private boolean menuCheckStrictly; + + /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */ + @ApiModelProperty(value = "部门树选择项是否关联显示", notes = "(0:父子不互相关联显示 1:父子互相关联显示 )") + private boolean deptCheckStrictly; + + /** 角色状态(0正常 1停用) */ + @ApiModelProperty("角色状态(0正常 1停用)") + @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + /** 用户是否存在此角色标识 默认不存在 */ + private boolean flag = false; + + /** 菜单组 */ + @ApiModelProperty("菜单组") + private Long[] menuIds; + + /** 部门组(数据权限) */ + @ApiModelProperty("部门组") + private Long[] deptIds; + + /** 角色菜单权限 */ + @ApiModelProperty("角色菜单权限") + private Set permissions; + + public SysRole() + { + + } + + public SysRole(Long roleId) + { + this.roleId = roleId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public boolean isAdmin() + { + return isAdmin(this.roleId); + } + + public static boolean isAdmin(Long roleId) + { + return roleId != null && 1L == roleId; + } + + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") + public String getRoleName() + { + return roleName; + } + + public void setRoleName(String roleName) + { + this.roleName = roleName; + } + + @NotBlank(message = "权限字符不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") + public String getRoleKey() + { + return roleKey; + } + + public void setRoleKey(String roleKey) + { + this.roleKey = roleKey; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getRoleSort() + { + return roleSort; + } + + public void setRoleSort(Integer roleSort) + { + this.roleSort = roleSort; + } + + public String getDataScope() + { + return dataScope; + } + + public void setDataScope(String dataScope) + { + this.dataScope = dataScope; + } + + public boolean isMenuCheckStrictly() + { + return menuCheckStrictly; + } + + public void setMenuCheckStrictly(boolean menuCheckStrictly) + { + this.menuCheckStrictly = menuCheckStrictly; + } + + public boolean isDeptCheckStrictly() + { + return deptCheckStrictly; + } + + public void setDeptCheckStrictly(boolean deptCheckStrictly) + { + this.deptCheckStrictly = deptCheckStrictly; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + public Long[] getMenuIds() + { + return menuIds; + } + + public void setMenuIds(Long[] menuIds) + { + this.menuIds = menuIds; + } + + public Long[] getDeptIds() + { + return deptIds; + } + + public void setDeptIds(Long[] deptIds) + { + this.deptIds = deptIds; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("roleName", getRoleName()) + .append("roleKey", getRoleKey()) + .append("roleSort", getRoleSort()) + .append("dataScope", getDataScope()) + .append("menuCheckStrictly", isMenuCheckStrictly()) + .append("deptCheckStrictly", isDeptCheckStrictly()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysUser.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysUser.java new file mode 100644 index 00000000..6ccbf8e1 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/entity/SysUser.java @@ -0,0 +1,346 @@ +package com.fastbee.common.core.domain.entity; + +import java.util.Date; +import java.util.List; +import javax.validation.constraints.*; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.annotation.Excel.ColumnType; +import com.fastbee.common.annotation.Excel.Type; +import com.fastbee.common.annotation.Excels; +import com.fastbee.common.core.domain.BaseEntity; +import com.fastbee.common.xss.Xss; + +/** + * 用户对象 sys_user + * + * @author ruoyi + */ +@ApiModel(value = "SysUser", description = "用户对象 sys_user") +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** 部门ID */ + @ApiModelProperty("部门ID") + @Excel(name = "部门编号", type = Type.IMPORT) + private Long deptId; + + /** 用户账号 */ + @ApiModelProperty("用户账号") + @Excel(name = "登录名称") + private String userName; + + /** 用户昵称 */ + @ApiModelProperty("用户昵称") + @Excel(name = "用户名称") + private String nickName; + + /** 用户邮箱 */ + @ApiModelProperty("用户邮箱") + @Excel(name = "用户邮箱") + private String email; + + /** 手机号码 */ + @ApiModelProperty("手机号码") + @Excel(name = "手机号码") + private String phonenumber; + + /** 用户性别 */ + @ApiModelProperty("用户性别") + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** 用户头像 */ + @ApiModelProperty("用户头像") + private String avatar; + + /** 密码 */ + @ApiModelProperty("密码") + private String password; + + /** 帐号状态(0正常 1停用) */ + @ApiModelProperty("帐号状态(0正常 1停用)") + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + /** 最后登录IP */ + @ApiModelProperty("最后登录IP") + @Excel(name = "最后登录IP", type = Type.EXPORT) + private String loginIp; + + /** 最后登录时间 */ + @ApiModelProperty("最后登录时间") + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + /** 部门对象 */ + @ApiModelProperty("部门对象") + @Excels({ + @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) + }) + private SysDept dept; + + /** 角色对象 */ + @ApiModelProperty("角色对象") + private List roles; + + /** 角色组 */ + @ApiModelProperty("角色组") + private Long[] roleIds; + + /** 岗位组 */ + @ApiModelProperty("岗位组") + private Long[] postIds; + + /** 角色ID */ + @ApiModelProperty("角色ID") + private Long roleId; + + public SysUser() + { + + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + public String getNickName() + { + return nickName; + } + + public void setNickName(String nickName) + { + this.nickName = nickName; + } + + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") + public String getPhonenumber() + { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + public String getSex() + { + return sex; + } + + public void setSex(String sex) + { + this.sex = sex; + } + + public String getAvatar() + { + return avatar; + } + + public void setAvatar(String avatar) + { + this.avatar = avatar; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getLoginIp() + { + return loginIp; + } + + public void setLoginIp(String loginIp) + { + this.loginIp = loginIp; + } + + public Date getLoginDate() + { + return loginDate; + } + + public void setLoginDate(Date loginDate) + { + this.loginDate = loginDate; + } + + public SysDept getDept() + { + return dept; + } + + public void setDept(SysDept dept) + { + this.dept = dept; + } + + public List getRoles() + { + return roles; + } + + public void setRoles(List roles) + { + this.roles = roles; + } + + public Long[] getRoleIds() + { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) + { + this.roleIds = roleIds; + } + + public Long[] getPostIds() + { + return postIds; + } + + public void setPostIds(Long[] postIds) + { + this.postIds = postIds; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindLoginBody.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindLoginBody.java new file mode 100644 index 00000000..806c615d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindLoginBody.java @@ -0,0 +1,22 @@ +package com.fastbee.common.core.domain.model; + +/** + * 用户登录对象 + * + * @author ruoyi + */ +public class BindLoginBody extends LoginBody +{ + /** + * 绑定id + */ + private String bindId; + + public String getBindId() { + return bindId; + } + + public void setBindId(String bindId) { + this.bindId = bindId; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindRegisterBody.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindRegisterBody.java new file mode 100644 index 00000000..5a4353d0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/BindRegisterBody.java @@ -0,0 +1,21 @@ +package com.fastbee.common.core.domain.model; + +/** + * 用户注册对象 + * + * @author ruoyi + */ +public class BindRegisterBody extends RegisterBody { + /** + * 绑定id + */ + private String bindId; + + public String getBindId() { + return bindId; + } + + public void setBindId(String bindId) { + this.bindId = bindId; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginBody.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginBody.java new file mode 100644 index 00000000..c2569882 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginBody.java @@ -0,0 +1,82 @@ +package com.fastbee.common.core.domain.model; + +/** + * 用户登录对象 + * + * @author ruoyi + */ +public class LoginBody +{ + /** + * 用户名 + */ + private String username; + + /** + * 用户密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid; + + /** + * 手机号 + */ + private String phonenumber; + + public String getPhonenumber() { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) { + this.phonenumber = phonenumber; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getUuid() + { + return uuid; + } + + public void setUuid(String uuid) + { + this.uuid = uuid; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginUser.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginUser.java new file mode 100644 index 00000000..07324faa --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/LoginUser.java @@ -0,0 +1,266 @@ +package com.fastbee.common.core.domain.model; + +import java.util.Collection; +import java.util.Set; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fastbee.common.core.domain.entity.SysUser; + +/** + * 登录用户身份权限 + * + * @author ruoyi + */ +public class LoginUser implements UserDetails +{ + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 权限列表 + */ + private Set permissions; + + /** + * 用户信息 + */ + private SysUser user; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } + + public LoginUser() + { + } + + public LoginUser(SysUser user, Set permissions) + { + this.user = user; + this.permissions = permissions; + } + + public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) + { + this.userId = userId; + this.deptId = deptId; + this.user = user; + this.permissions = permissions; + } + + @JSONField(serialize = false) + @Override + public String getPassword() + { + return user.getPassword(); + } + + @Override + public String getUsername() + { + return user.getUserName(); + } + + /** + * 账户是否未过期,过期无法验证 + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonExpired() + { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonLocked() + { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isCredentialsNonExpired() + { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isEnabled() + { + return true; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getExpireTime() + { + return expireTime; + } + + public void setExpireTime(Long expireTime) + { + this.expireTime = expireTime; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + public SysUser getUser() + { + return user; + } + + public void setUser(SysUser user) + { + this.user = user; + } + + @Override + public Collection getAuthorities() + { + return null; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/RegisterBody.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/RegisterBody.java new file mode 100644 index 00000000..750f0e2c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/domain/model/RegisterBody.java @@ -0,0 +1,11 @@ +package com.fastbee.common.core.domain.model; + +/** + * 用户注册对象 + * + * @author ruoyi + */ +public class RegisterBody extends LoginBody +{ + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DashDeviceTotalDto.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DashDeviceTotalDto.java new file mode 100644 index 00000000..53fd0041 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DashDeviceTotalDto.java @@ -0,0 +1,22 @@ +package com.fastbee.common.core.iot.response; + +import lombok.Data; + +/** + * 大屏设备总览数据 + * @author bill + */ +@Data +public class DashDeviceTotalDto { + + /*设备总数*/ + private Integer total; + /*在线设备总数*/ + private Integer onlineCount; + /*离线设备总数*/ + private Integer OfflineCount; + /*未激活设备数*/ + private Integer unActiveCount; + + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DeCodeBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DeCodeBo.java new file mode 100644 index 00000000..87c57d9e --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/DeCodeBo.java @@ -0,0 +1,26 @@ +package com.fastbee.common.core.iot.response; + +import lombok.Data; + +/** + * @author gsb + * @date 2023/4/8 15:43 + */ +@Data +public class DeCodeBo { + + /**原始报文*/ + private String payload; + /**从机编号*/ + private Integer slaveId; + /**寄存器地址*/ + private Integer address; + /**功能码*/ + private Integer code; + /**读取个数*/ + private Integer count; + /**写入值*/ + private Integer writeData; + /**读写类型 1-解析 2-读指令 3-写指令 */ + private Integer type; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/IdentityAndName.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/IdentityAndName.java new file mode 100644 index 00000000..3ef267c7 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/iot/response/IdentityAndName.java @@ -0,0 +1,70 @@ +package com.fastbee.common.core.iot.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 物模型值的项 + * + * @author kerwincui + * @date 2021-12-16 + */ +@NoArgsConstructor +@AllArgsConstructor +@Data +public class IdentityAndName +{ + + public IdentityAndName(String id,String value){ + this.id=id; + this.value=value; + } + + public IdentityAndName(String id,Integer isHistory){ + this.id=id; + this.isHistory=isHistory; + } + + public IdentityAndName(String id, Integer isHistory, String specs, String name, Integer type){ + this.id = id; + this.isHistory = isHistory; + this.dataType = specs; + this.name = name; + this.type = type; + } + + /** 物模型唯一标识符 */ + private String id; + /** 物模型值 */ + private Object value; + + private Integer isChart; + + /**是否监控*/ + private Integer isHistory; + /** + * 数据定义 + */ + private String dataType; + /**物模型名称*/ + private String name; + /** + * 物模型类型 + */ + private Integer type; + /** + * 是否是参数 + */ + private Integer isParams; + + private String formula; + + private Integer slaveId; + + private Integer tempSlaveId; + + private Integer quantity; + + private String code; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReplyBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReplyBo.java new file mode 100644 index 00000000..21b0a62f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReplyBo.java @@ -0,0 +1,17 @@ +package com.fastbee.common.core.mq; + +import lombok.Data; + +/** + * @author bill + */ +@Data +public class DeviceReplyBo { + + /*设备下发消息id*/ + private String messageId; + /*标识符*/ + private String id; + /**下发值*/ + private String value; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReport.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReport.java new file mode 100644 index 00000000..83b6e9f9 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReport.java @@ -0,0 +1,104 @@ +package com.fastbee.common.core.mq; + +import com.fastbee.common.core.mq.message.SubDeviceMessage; +import com.fastbee.common.core.protocol.Message; +import com.fastbee.common.core.thingsModel.ThingsModelValuesInput; +import com.fastbee.common.enums.FunctionReplyStatus; +import com.fastbee.common.enums.ServerType; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + + +/** + * 设备上行数据model + * + * @author bill + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class DeviceReport extends Message { + + /** + * 设备编号 + */ + private String serialNumber; + /** + * 产品ID + */ + private Long productId; + /** + * 平台时间 + */ + private Date platformDate; + /** + * 寄存器地址 + */ + private String hexAddress; + /** + * 物模型标识符 + */ + private String identifier; + /** + * 消息id + */ + private String messageId; + /** + * 设备主动上报的消息体 + * key 物模型Identifier + * value 物模型设备对应值 + */ + private ThingsModelValuesInput valuesInput; + /** + * 消息id或 消息流水号 + */ + private String serNo; + /** + * 值是否监控,如果监控表示需要历史存储,该值来自物模型 + */ + private Integer isMonitor; + /** ================网关子设备====================*/ + /** + * 网关子设备编号 + */ + private List subDeviceCodes; + /** + * 网关子设备消息 + */ + private List subDeviceMessages; + /** ================回调数据====================*/ + + /** + * 是否设备回复数据 + */ + private Boolean isReply = false; + + /** + * 设备回复消息 + */ + private String replyMessage; + /** + * 设备回复状态 + */ + private FunctionReplyStatus status; + /** + * 从机编号 + */ + private Integer slaveId; + /** + * 服务器类型 + */ + private ServerType serverType; + /** + * 寄存器地址 + */ + private int address; + + private String protocolCode; + + private Long userId; + private String userName; + private String deviceName; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReportBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReportBo.java new file mode 100644 index 00000000..502d3cf6 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceReportBo.java @@ -0,0 +1,74 @@ +package com.fastbee.common.core.mq; + +import com.fastbee.common.core.mq.message.PropRead; +import com.fastbee.common.core.thingsModel.ThingsModelValuesInput; +import com.fastbee.common.enums.FunctionReplyStatus; +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.enums.ThingsModelType; +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 设备上报 + * @author bill + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceReportBo { + + /*设备编号或IMEI号*/ + private String serialNumber; + /*产品ID*/ + private Long productId; + /*4G物联网卡CCID*/ + private String ccId; + /*topic*/ + private String topicName; + /*mqtt消息中的packetId*/ + private Long packetId; + /*上报时间*/ + private Date platformDate; + /*物模型类型 1=-属性,2-功能,3-事件 */ + private ThingsModelType type; + /*上报数据*/ + private byte[] data; + /*1-设备数据上报 2- 下发指令给设备,设备应答数据*/ + private Integer reportType; + /*消息id*/ + private String messageId; + /* modbus协议消息回调,记录数据*/ + private PropRead prop; + /*解析后组装好的数据*/ + private ThingsModelValuesInput valuesInput; + /*处理的消息服务类型*/ + private ServerType serverType; + private Integer slaveId; + + /** + * 是否设备回复数据 + */ + private Boolean isReply = false; + + /** + * 设备回复消息 + */ + private String replyMessage; + /** + * 设备回复状态 + */ + private FunctionReplyStatus status; + /** + * 寄存器地址 + */ + private int address; + + private String protocolCode; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceStatusBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceStatusBo.java new file mode 100644 index 00000000..160e7263 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/DeviceStatusBo.java @@ -0,0 +1,35 @@ +package com.fastbee.common.core.mq; + +import com.fastbee.common.enums.DeviceStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 设备状态 + * @author bill + */ +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class DeviceStatusBo { + /** + * 设备客户端id + */ + private String serialNumber; + /**是否活跃*/ + private DeviceStatus status; + /**消息时间*/ + private Date timestamp; + /*host*/ + private String hostName; + /*port*/ + private Integer port; + + private String ip; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/InvokeReqDto.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/InvokeReqDto.java new file mode 100644 index 00000000..dfb23108 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/InvokeReqDto.java @@ -0,0 +1,62 @@ +package com.fastbee.common.core.mq; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.utils.DateUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Map; + +/** + * @author gsb + * @date 2022/12/5 11:26 + */ +@Data +public class InvokeReqDto { + + @NotNull(message = "设备编号不能为空") + @ApiModelProperty(value = "设备编号") + private String serialNumber; + + @NotNull(message = "标识符不能为空") + @ApiModelProperty(value = "标识符") + private String identifier; + /**消息体*/ + @ApiModelProperty(value = "消息体") + private JSONObject value; + /**远程消息体*/ + @ApiModelProperty(value = "远程调用消息体") + private Map remoteCommand; + /**设备超时时间*/ + @ApiModelProperty(value = "设备超时响应时间,默认10s") + private Integer timeOut = 10; + + @ApiModelProperty(value = "下发物模型类型") + @NotNull + private Integer type; + + @ApiModelProperty(value = "是否是影子模式") + @NotNull + private Boolean isShadow; + + private String dataType; + + @NotNull(message = "产品id不能为空") + @ApiModelProperty(value = "产品id") + private Long productId; + /**从机编号*/ + private Integer slaveId; + /** + * 显示的值 + */ + private String showValue; + + /** + * 物模型名称 + */ + private String modelName; + + private Date timestamp = DateUtils.getNowDate(); +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MQSendMessageBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MQSendMessageBo.java new file mode 100644 index 00000000..d9b09779 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MQSendMessageBo.java @@ -0,0 +1,51 @@ +package com.fastbee.common.core.mq; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.core.protocol.modbus.ModbusCode; +import com.fastbee.common.enums.ThingsModelType; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 服务(指令)下发对象 + * + * @author bill + */ +@Data +@NoArgsConstructor +public class MQSendMessageBo { + + /*设备编号*/ + private String serialNumber; + /*下发属性标识符*/ + private String identifier; + /*寄存器地址 10进制*/ + private String hexAddress; + /*topic*/ + private JSONObject command; + private String topicName; + /*产品ID*/ + private Long productId; + /*物模型类型 1=-属性,2-功能,3-事件,4-属性和功能*/ + private ThingsModelType type; + /*下发的数据*/ + private JSONObject value; + /*协议编号 例如:modbus-rtu*/ + private String protocolCode; + /*messageId生成放到调用接口的时候生成*/ + private String messageId; + /*流水号,针对某些协议没有消息流水号无法区分下发的消息和上报的消息是否对应*/ + private String serialNo; + /*从机id*/ + private Integer slaveId; + /**显示值*/ + private String showValue; + private String modelName; + private ModbusCode code; + /*是否是影子模式*/ + private Boolean isShadow; + /*传输协议*/ + private String transport; + + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MessageReplyBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MessageReplyBo.java new file mode 100644 index 00000000..4b4a2eb0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/MessageReplyBo.java @@ -0,0 +1,51 @@ +package com.fastbee.common.core.mq; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 设备消息回调或者下发指令值 + * + * @author gsb + * @date 2022/5/11 9:27 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MessageReplyBo { + + + private String id; + /** + * 消息回执的messageId,和下行消息呼应 + */ + private String messageId; + /** + * 设备处理消息的状态 + */ + private Integer status; + /** + * 抵达服务器时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date timestamp; + /** + * 设备上报的时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date deviceTimestamp; + /** + * 回执消息内容 + */ + private String body; + /*产品编号*/ + private Long productId; + /*设备编号*/ + private String serialNumber; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceData.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceData.java new file mode 100644 index 00000000..8d5c092c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceData.java @@ -0,0 +1,49 @@ +package com.fastbee.common.core.mq.message; + +import com.fastbee.common.core.protocol.Message; +import com.fastbee.common.core.protocol.modbus.ModbusCode; +import io.netty.buffer.ByteBuf; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 消息解析model + * @author gsb + * @date 2022/10/10 15:53 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Builder +public class DeviceData extends Message { + + /*topic*/ + private String topicName; + + /*设备编号*/ + private String serialNumber; + + /*原数据*/ + private byte[] data; + + private ByteBuf buf; + + /*消息类型 1.设备上报数据 2.设备回调数据*/ + private int messageType; + + /*下发数据model*/ + private DeviceDownMessage downMessage; + + private Object body; + /*MQTT OR 其他*/ + private int type; + + /*Modbus*/ + private ModbusCode code; + + private PropRead prop; + /*是否使用modbus客户端模拟测试*/ + private boolean isEnabledTest; + /**产品id*/ + private Long productId; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceDownMessage.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceDownMessage.java new file mode 100644 index 00000000..3db2f571 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceDownMessage.java @@ -0,0 +1,69 @@ +package com.fastbee.common.core.mq.message; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.core.protocol.modbus.ModbusCode; +import com.fastbee.common.enums.ServerType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 设备下发指令model + * + * @author gsb + * @date 2022/10/10 16:18 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceDownMessage { + + private String messageId; + /** + * 时间戳,单位毫秒 + */ + private Long timestamp; + /** + * 消息体 + */ + private Object body; + /*下发的指令,服务调用的时候就是服务标识符*/ + private String identifier; + /*产品id*/ + private Long productId; + /** + * 设备编码 + */ + private String serialNumber; + /*网关设备编码*/ + String subSerialNumber; + /** + * true: 表示是一条发往网关子设备的指令 + * 默认是false + */ + Boolean subFlag = false; + /** + * 从机编号 + */ + private Integer slaveId; + private ModbusCode code; + private int count; + private int address; + private String protocolCode; + + private List values; + private String topic; + private String subCode; + private ServerType serverType; + + public DeviceDownMessage(List values, String topic, String subCode,String transport) { + this.values = values; + this.topic = topic; + this.subCode = subCode; + this.serverType = ServerType.explain(transport); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceFunctionMessage.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceFunctionMessage.java new file mode 100644 index 00000000..df0d5784 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceFunctionMessage.java @@ -0,0 +1,33 @@ +package com.fastbee.common.core.mq.message; + +import lombok.Data; + +/** + * 平台下发指令数据model + * @author bill + */ +@Data +public class DeviceFunctionMessage { + + /*流水号,兼容modbus标准协议没有消息流水号*/ + private String seqNo; + /*平台时间*/ + private Long pfTimestamp; + /*下发的消息体*/ + private Object body; + /*下发的指令物模型标识符*/ + private String identifier; + /*下发的数据寄存器地址*/ + private String hexAddress; + /*产品ID*/ + private Long productId; + /*设备编号*/ + private String serialNumber; + /*网关设备编号*/ + private String protocolCode; + + /*是否有子设备 0-否,1-是*/ + private Integer hasSub; + /*子设备从机编号 例如 02 编号从机。通过主机集控下发的指定从机编号*/ + private String subDeviceCode; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceMessage.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceMessage.java new file mode 100644 index 00000000..9af912f5 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/DeviceMessage.java @@ -0,0 +1,20 @@ +package com.fastbee.common.core.mq.message; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 集群消息 + * @author bill + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DeviceMessage { + + /*数据*/ + private T data; + + private int nodeId; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/InstructionsMessage.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/InstructionsMessage.java new file mode 100644 index 00000000..78b3a0d0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/InstructionsMessage.java @@ -0,0 +1,20 @@ +package com.fastbee.common.core.mq.message; + +import lombok.Data; + +/** + * 指令下发组将的model + * @author bill + */ +@Data +public class InstructionsMessage { + + /*下发的数据*/ + private byte[] message; + + /*MQTt-下发的topic*/ + private String topicName; + + /*设备编号*/ + private String serialNumber; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/MqttBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/MqttBo.java new file mode 100644 index 00000000..311f0af7 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/MqttBo.java @@ -0,0 +1,26 @@ +package com.fastbee.common.core.mq.message; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author bill + */ +@Data +public class MqttBo { + + /*主题*/ + private String topic; + /*数据*/ + private String data; + /*消息质量*/ + private int qos = 1; + /*发送方向*/ + private String direction; + /*时间*/ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date ts; +} + diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/PropRead.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/PropRead.java new file mode 100644 index 00000000..9f949e08 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/PropRead.java @@ -0,0 +1,39 @@ +package com.fastbee.common.core.mq.message; + +import com.fastbee.common.core.protocol.modbus.ModbusCode; +import lombok.Data; + +/** + * @author gsb + * @date 2022/12/9 10:15 + */ +@Data +public class PropRead { + + /**设备编号*/ + private String serialNumber; + /**寄存器起始地址*/ + private int address; + /** + * 读取寄存器个数 + */ + private int count; + /**数据结果长度计算值*/ + private int length; + /** + * 从机地址 + */ + private int slaveId; + /** + * 读取个数 + */ + private int quantity; + /** + * 数据 + */ + private String data; + /** + * 功能码 + */ + private ModbusCode code; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/ProtocolDto.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/ProtocolDto.java new file mode 100644 index 00000000..8e45f222 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/ProtocolDto.java @@ -0,0 +1,21 @@ +package com.fastbee.common.core.mq.message; + +import lombok.Data; + +/** + * 协议bean + * @author gsb + * @date 2022/10/25 14:54 + */ +@Data +public class ProtocolDto { + + /**协议编号*/ + private String code; + private String name; + /*外部协议url*/ + private String protocolUrl; + private String description; + /**协议类型 协议类型 0:系统协议 1:jar,2.js,3.c*/ + private Integer protocolType; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/SubDeviceMessage.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/SubDeviceMessage.java new file mode 100644 index 00000000..47940924 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/message/SubDeviceMessage.java @@ -0,0 +1,18 @@ +package com.fastbee.common.core.mq.message; + +import lombok.Data; + +/** + * 网关子设备model + * @author gsb + * @date 2022/10/10 10:18 + */ +@Data +public class SubDeviceMessage { + /*子设备编号或编码*/ + private String serialNumber; + /*数据*/ + private byte[] data; + /*消息id*/ + private String messageId; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaReplyMessage.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaReplyMessage.java new file mode 100644 index 00000000..0ac4408d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaReplyMessage.java @@ -0,0 +1,17 @@ +package com.fastbee.common.core.mq.ota; + +import lombok.Data; + +/** + * OTA升级回复model + * @author gsb + * @date 2022/10/24 17:20 + */ +@Data +public class OtaReplyMessage { + + private String messageId; + // 200成功 其他。。 + private int code; + private String msg; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeBo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeBo.java new file mode 100644 index 00000000..41f98343 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeBo.java @@ -0,0 +1,46 @@ +package com.fastbee.common.core.mq.ota; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * OTA远程升级 + * @author gsb + * @date 2022/10/10 10:22 + */ +@Data +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class OtaUpgradeBo { + + /**OTAId*/ + private Long otaId; + @NotNull(message = "上传地址为空") + private String otaUrl; + @NotNull(message = "固件版本号不能为空") + private String firmwareVersion; + private String firmwareName; + @NotNull(message = "流水号不能为空") + private String seqNo; + @NotNull(message = "产品ID不能为空") + private Long productId; + private String signType = "16md5"; + @NotNull(message = "签名不能为空") + private String signCode; + /*产品名称*/ + private String productName; + private String fileBase64; + private Integer pushType; + /*设备编码,逐个升级*/ + private String serialNumber; + private String deviceName; + /*任务ID*/ + private Long taskId; + /*消息id*/ + private String messageId; + /*平台描述消息*/ + private String msg; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeDelayTask.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeDelayTask.java new file mode 100644 index 00000000..9142c2a8 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/mq/ota/OtaUpgradeDelayTask.java @@ -0,0 +1,54 @@ +package com.fastbee.common.core.mq.ota; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fastbee.common.utils.DateUtils; +import lombok.Data; +import org.springframework.lang.NonNull; + +import java.lang.reflect.Member; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; + +/** + * ota升级发送,实现Delayed延时接口 + * + * @author bill + */ +@Data +public class OtaUpgradeDelayTask implements Delayed { + + /*固件id*/ + private Long firmwareId; + private List devices; + /*任务id*/ + private Long taskId; + /*开始升级时间*/ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + + + /** + * 设置延迟执行时间 开始升级时间 -当前时间 + * + * @param unit + * @return + */ + @Override + public long getDelay(TimeUnit unit) { + return startTime.getTime() - DateUtils.getTimestamp(); + } + + @Override + public int compareTo(Delayed o) { + OtaUpgradeDelayTask delayTask = (OtaUpgradeDelayTask) o; + //比较 + long diff = this.startTime.getTime() - delayTask.startTime.getTime(); + if (diff <= 0) { + return -1; + } else { + return 1; + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/PageDomain.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/PageDomain.java new file mode 100644 index 00000000..6d2cd75d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/PageDomain.java @@ -0,0 +1,101 @@ +package com.fastbee.common.core.page; + +import com.fastbee.common.utils.StringUtils; + +/** + * 分页数据 + * + * @author ruoyi + */ +public class PageDomain +{ + /** 当前记录起始索引 */ + private Integer pageNum; + + /** 每页显示记录数 */ + private Integer pageSize; + + /** 排序列 */ + private String orderByColumn; + + /** 排序的方向desc或者asc */ + private String isAsc = "asc"; + + /** 分页参数合理化 */ + private Boolean reasonable = true; + + public String getOrderBy() + { + if (StringUtils.isEmpty(orderByColumn)) + { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() + { + return pageNum; + } + + public void setPageNum(Integer pageNum) + { + this.pageNum = pageNum; + } + + public Integer getPageSize() + { + return pageSize; + } + + public void setPageSize(Integer pageSize) + { + this.pageSize = pageSize; + } + + public String getOrderByColumn() + { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) + { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() + { + return isAsc; + } + + public void setIsAsc(String isAsc) + { + if (StringUtils.isNotEmpty(isAsc)) + { + // 兼容前端排序类型 + if ("ascending".equals(isAsc)) + { + isAsc = "asc"; + } + else if ("descending".equals(isAsc)) + { + isAsc = "desc"; + } + this.isAsc = isAsc; + } + } + + public Boolean getReasonable() + { + if (StringUtils.isNull(reasonable)) + { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) + { + this.reasonable = reasonable; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableDataInfo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableDataInfo.java new file mode 100644 index 00000000..d84cb2c0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.fastbee.common.core.page; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author ruoyi + */ +public class TableDataInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 总记录数 */ + private long total; + + /** 列表数据 */ + private List rows; + + /** 消息状态码 */ + private int code; + + /** 消息内容 */ + private String msg; + + /** + * 表格数据对象 + */ + public TableDataInfo() + { + } + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, int total) + { + this.rows = list; + this.total = total; + } + + public long getTotal() + { + return total; + } + + public void setTotal(long total) + { + this.total = total; + } + + public List getRows() + { + return rows; + } + + public void setRows(List rows) + { + this.rows = rows; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableSupport.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableSupport.java new file mode 100644 index 00000000..3bb552f4 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/page/TableSupport.java @@ -0,0 +1,56 @@ +package com.fastbee.common.core.page; + +import com.fastbee.common.core.text.Convert; +import com.fastbee.common.utils.ServletUtils; + +/** + * 表格数据处理 + * + * @author ruoyi + */ +public class TableSupport +{ + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 分页参数合理化 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/Message.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/Message.java new file mode 100644 index 00000000..741e1241 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/Message.java @@ -0,0 +1,33 @@ +package com.fastbee.common.core.protocol; + +import io.netty.buffer.ByteBuf; +import lombok.Data; + +import java.io.Serializable; + +/** + * 基础消息 + * + * @author bill + */ +@Data +public class Message implements Serializable { + + /*获取客户端id*/ + public String clientId; + /*消息类型*/ + public String messageId; + /*消息流水号*/ + public String serNo; + /**消息通道id*/ + public String channelId; + + public ByteBuf payload; + + /** + * 是否数据和注册包都封装到一起 + */ + private Boolean isPackage = false; + + private Object body; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/modbus/ModbusCode.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/modbus/ModbusCode.java new file mode 100644 index 00000000..f7ffaaf6 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/protocol/modbus/ModbusCode.java @@ -0,0 +1,87 @@ +package com.fastbee.common.core.protocol.modbus; + +import com.fastbee.common.exception.ServiceException; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Modbus功能码 + * @author bill + * + * {bit 位操作} + * 线圈寄存器: bit对应一个信号的开关状态。功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。对应上面的功能码也就是:0x01 0x05 0x0f + * 离散输入寄存器:离散输入寄存器就 是 只读线圈寄存器,每个bit表示一个开关量,是不能够写的。 功能码: 0x02 + * + * {byte 字节操作} + * 保持寄存器: 两个byte,可读写的 写也分为单个写和多个写对应的三个:0x03 0x06 0x10 + * 输入寄存器: 和保持寄存器类似,只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。对应的功能码: 0x04 + * + */ +@Getter +@AllArgsConstructor +public enum ModbusCode { + + Read01("读线圈",(byte) 0x01), // 读线圈(读写位模式) + Read02("读离散量输入",(byte) 0x02), // 读离散量输入(位只读模式) + Read03("读保持寄存器",(byte) 0x03), // 读保持寄存器(字节读写模式) + Read04("读输入寄存器",(byte) 0x04), // 读输入寄存器(字节只读模式) + + Write05("写单个线圈(读写位模式)",(byte) 0x05), // 写单个线圈(读写位模式) + Write06("写多个线圈",(byte) 0x06), // 写单个保持寄存器 + Write0F("写多个线圈",(byte) 0x0F), // 写多个线圈 + Write10("写多个保持寄存器",(byte) 0x10) // 写多个保持寄存器 + ; + + private String desc; + private byte code; + + public static ModbusCode getInstance(int code) { + switch ((byte)code) { + case 0x01: + return Read01; + case 0x02: + return Read02; + case 0x03: + return Read03; + case 0x04: + return Read04; + + case 0x05: + return Write05; + case 0x06: + return Write06; + case 0x0F: + return Write0F; + case 0x10: + return Write10; + + default: + throw new ServiceException("功能码[" + code + "],未定义"); + } + } + + public static String getDes(int code){ + switch ((byte)code) { + case 0x01: + return Read01.desc; + case 0x02: + return Read02.desc; + case 0x03: + return Read03.desc; + case 0x04: + return Read04.desc; + case 0x05: + return Write05.desc; + case 0x06: + return Write06.desc; + case 0x0F: + return Write0F.desc; + case 0x10: + return Write10.desc; + + default: + return "UNKOWN"; + } + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisCache.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisCache.java new file mode 100644 index 00000000..aa2f01fb --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisCache.java @@ -0,0 +1,735 @@ +package com.fastbee.common.core.redis; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import org.apache.commons.lang3.BooleanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.data.redis.support.atomic.RedisAtomicLong; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static java.util.regex.Pattern.compile; + +/** + * spring redis 工具类 + * + * @author ruoyi + **/ +@SuppressWarnings(value = {"unchecked", "rawtypes"}) +@Component +public class RedisCache { + @Autowired + public RedisTemplate redisTemplate; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public boolean deleteObject(final Collection collection) { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) { + return redisTemplate.keys(pattern); + } + + /** + * 是否存在key + * + * @param key 缓存key + * @return true:存在key ;false:key不存在或者已过期 + */ + public boolean containsKey(String key) { + return redisTemplate.hasKey(key); + } + + + /** + * 递增 + * + * @param key 键 + * @param delta 要增加几(大于0) + * @return + */ + public long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * redis 计数器自增 + * + * @param key key + * @param liveTime 过期时间,null不设置过期时间 + * @return 自增数 + */ + public Long incr2(String key, long liveTime) { + RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); + Long increment = entityIdCounter.getAndIncrement(); + + if (increment == 0 && liveTime > 0) {//初始设置过期时间 + entityIdCounter.expire(liveTime, TimeUnit.HOURS); + } + + return increment; + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sAdd(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) expire(key, time); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除set集合值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 添加一个元素, zset与set最大的区别就是每个元素都有一个score,因此有个排序的辅助功能; zadd + * + * @param key 键 + * @param value 值 + * @param score 分数 + */ + public boolean zSetAdd(String key, String value, double score) { + try { + Boolean aBoolean = stringRedisTemplate.opsForZSet().add(key, value, score); + return BooleanUtils.isTrue(aBoolean); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除一个zset有序集合的key的一个或者多个值 + * zrem key member [member ...] :移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。 + * + * @param key 集合的键key + * @param values 需要移除的value + * @return + */ + public boolean zRem(String key, Object... values) { + try { + Long aLong = stringRedisTemplate.opsForZSet().remove(key, values); + return aLong != null ? true : false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 + * + * @param key String + * @param start double 最小score + * @param end double 最大score + */ + public Long zRemBySocre(String key, double start, double end) { + try { + return stringRedisTemplate.opsForZSet().removeRangeByScore(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 判断value在zset中的排名 zrank命令 + * + * @param key 键 + * @param value 值 + * @return score 越小排名越高; + */ + public Long zRank(String key, String value) { + try { + return stringRedisTemplate.opsForZSet().rank(key, value); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 查询zSet集合中指定顺序的值, 0 -1 表示获取全部的集合内容 zrange + * + * @param key 键 + * @param start 开始 + * @param end 结束 + * @return 返回有序的集合,score小的在前面 + */ + public Set zRange(String key, int start, int end) { + try { + return stringRedisTemplate.opsForZSet().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 + * 有序集成员按 score 值递增(从小到大)次序排列。 + * + * @param key String + * @param start double 最小score + * @param end double 最大score + */ + public Set zRangeByScore(String key, double start, double end) { + try { + return stringRedisTemplate.opsForZSet().rangeByScore(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 返回set集合的长度 + * + * @param key + * @return + */ + public Long zSize(String key) { + try { + return stringRedisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据前缀获取所有的key + * 例如:pro_* + */ + public Set getListKeyByPrefix(String prefix) { + Set keys = redisTemplate.keys(prefix.concat("*")); + return keys; + } + + /** + * 匹配获取键值对,ScanOptions.NONE为获取全部键对 + * + * @param key + * @param options + * @return + */ + public Cursor> hashScan(String key, ScanOptions options) { + return redisTemplate.opsForHash().scan(key, options); + } + + /** + * 获取所有键值对集合 + * + * @param key + */ + public Map hashEntity(String key) { + return redisTemplate.boundHashOps(key).entries(); + } + + /** + * 以map集合的形式添加键值对 + * + * @param key + * @param maps + */ + public void hashPutAll(String key, Map maps) { + redisTemplate.opsForHash().putAll(key, maps); + } + + /** + * 以map集合的形式添加键值对 + * + * @param key + * @param maps + */ + public void hashPutAllObj(String key, Map maps) { + redisTemplate.opsForHash().putAll(key, maps); + } + + /** + * 批量获取设备物模型值 + * + * @param keys 键的集合 + * @param hkeyCondition 筛选字段 + * @return + */ + public Map hashGetAllByKeys(Set keys, String hkeyCondition) { + return (Map) redisTemplate.execute((RedisCallback) con -> { + Iterator it = keys.iterator(); + Map mapList = new HashMap<>(); + while (it.hasNext()) { + String key = it.next(); + Map result = con.hGetAll(key.getBytes()); + Map ans; + if (CollectionUtils.isEmpty(result)) { + return new HashMap<>(0); + } + ans = new HashMap<>(result.size()); + for (Map.Entry entry : result.entrySet()) { + String field = new String((byte[]) entry.getKey()); + if (!"".equals(hkeyCondition)) { + if (field.endsWith(hkeyCondition)) { + ans.put(new String((byte[]) entry.getKey()), new String((byte[]) entry.getValue())); + } + } else { + ans.put(new String((byte[]) entry.getKey()), new String((byte[]) entry.getValue())); + } + } + mapList.put(key, ans); + } + return mapList; + }); + } + + /** + * 批量获取匹配触发器的物模型值(定时告警使用) + * + * @param keys 键的集合 + * @param operator 操作符 + * @param triggerValue 触发的值 + * @return + */ + public Map hashGetAllMatchByKeys(Set keys, String operator, String id, String triggerValue) { + return (Map) redisTemplate.execute((RedisCallback) con -> { + Iterator it = keys.iterator(); + Map mapList = new HashMap<>(); + while (it.hasNext()) { + String key = it.next(); + Map result = con.hGetAll(key.getBytes()); + if (CollectionUtils.isEmpty(result)) { + return new HashMap<>(0); + } + for (Map.Entry entry : result.entrySet()) { + String field = new String((byte[]) entry.getKey()); + // 获取物模型值并且匹配规则,获取值的类型和匹配规则后续还要仔细测了然后优化 + if (field.equals(id) || field.equals(id + "#V")) { + String valueStr = new String((byte[]) entry.getValue()); + JSONObject jsonObject = JSONObject.parseObject((String) JSON.parse(valueStr)); + String value = (String) jsonObject.get("value"); + if (ruleResult(operator, value, triggerValue)) { + mapList.put(key, value); + } + } + } + } + return mapList; + }); + } + + /** + * 根据key集合获取字符串 + * + * @param keys 键的集合 + * @return + */ + public Map getStringAllByKeys(Set keys) { + return (Map) redisTemplate.execute((RedisCallback) con -> { + Iterator it = keys.iterator(); + Map mapList = new HashMap<>(); + while (it.hasNext()) { + String key = it.next(); + byte[] result = con.get(key.getBytes()); + if (result == null) { + return new HashMap<>(0); + } + String ans = new String((byte[]) result); + mapList.put(key, ans); + } + return mapList; + }); + } + + /** + * 根据条件返回所有键 + * + * @param query + * @return + */ + public List scan(String query) { + Set keys = (Set) redisTemplate.execute((RedisCallback>) connection -> { + Set keysTmp = new HashSet<>(); + Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(query).count(1000).build()); + while (cursor.hasNext()) { + keysTmp.add(new String(cursor.next())); + } + return keysTmp; + }); + return new ArrayList<>(keys); + } + + /** + * 规则匹配结果 + * + * @param operator 操作符 + * @param value 上报的值 + * @param triggerValue 触发器的值 + * @return + */ + private boolean ruleResult(String operator, String value, String triggerValue) { + boolean result = false; + if ("".equals(value)) { + return result; + } + // 操作符比较 + switch (operator) { + case "=": + result = value.equals(triggerValue); + break; + case "!=": + result = !value.equals(triggerValue); + break; + case ">": + if (isNumeric(value) && isNumeric(triggerValue)) { + result = Double.parseDouble(value) > Double.parseDouble(triggerValue); + } + break; + case "<": + if (isNumeric(value) && isNumeric(triggerValue)) { + result = Double.parseDouble(value) < Double.parseDouble(triggerValue); + } + break; + case ">=": + if (isNumeric(value) && isNumeric(triggerValue)) { + result = Double.parseDouble(value) >= Double.parseDouble(triggerValue); + } + break; + case "<=": + if (isNumeric(value) && isNumeric(triggerValue)) { + result = Double.parseDouble(value) <= Double.parseDouble(triggerValue); + } + break; + case "contain": + result = value.contains(triggerValue); + break; + case "notcontain": + result = !value.contains(triggerValue); + break; + default: + break; + } + return result; + } + + /** + * 判断字符串是否为整数或小数 + */ + private boolean isNumeric(String str) { + Pattern pattern = compile("[0-9]*\\.?[0-9]+"); + Matcher isNum = pattern.matcher(str); + if (!isNum.matches()) { + return false; + } + return true; + } + + public void publish(Object message, String channel) { + try { + redisTemplate.convertAndSend(channel, message); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setHashValue(final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + + /** + * 删除Hash中的数据 + * + * @param key + * @param hkey + */ + public void delHashValue(final String key, final String hkey) { + HashOperations hashOperations = redisTemplate.opsForHash(); + hashOperations.delete(key, hkey); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java new file mode 100644 index 00000000..fbc745d1 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java @@ -0,0 +1,84 @@ +package com.fastbee.common.core.redis; + +import com.fastbee.common.constant.FastBeeConstant; + +/** + * 缓存key生成器 + * + * @author bill + */ +public class RedisKeyBuilder { + + /**设备在线列表缓存key*/ + public static String buildDeviceOnlineListKey(){ + return FastBeeConstant.REDIS.DEVICE_ONLINE_LIST; + } + + /**设备实时数据key*/ + public static String buildDeviceRtCacheKey(String serialNumber){ + return FastBeeConstant.REDIS.DEVICE_RUNTIME_DATA + serialNumber; + } + + /** + * 设备通讯协议参数 + */ + public static String buildDeviceRtParamsKey(String serialNumber){ + return FastBeeConstant.REDIS.DEVICE_PROTOCOL_PARAM + serialNumber; + } + + /**固件版本缓存key*/ + public static String buildFirmwareCachedKey(Long firmwareId){ + return FastBeeConstant.REDIS.FIRMWARE_VERSION + firmwareId; + } + + /**属性读取回调缓存key*/ + public static String buildPropReadCacheKey(String serialNumber){ + return FastBeeConstant.REDIS.PROP_READ_STORE + serialNumber; + } + + /** + * 物模型值命名缓存key + * Key:TSLV:{productId}_{deviceNumber} HKey:{identity#V/identity#S/identity#M/identity#N} + */ + public static String buildTSLVCacheKey(Long productId,String serialNumber){ + return FastBeeConstant.REDIS.DEVICE_PRE_KEY + productId + "_" + serialNumber.toUpperCase(); + } + + /** + * 物模型缓存key + * 物模型命名空间:Key:TSL:{productId} hkey: identity value: thingsModel + */ + public static String buildTSLCacheKey(Long productId){ + return FastBeeConstant.REDIS.TSL_PRE_KEY + productId; + } + + /**录像缓存key*/ + public static String buildSipRecordinfoCacheKey(String recordKey){ + return FastBeeConstant.REDIS.RECORDINFO_KEY + recordKey; + } + + /**设备id缓存key*/ + public static String buildSipDeviceidCacheKey(String id){ + return FastBeeConstant.REDIS.DEVICEID_KEY + id; + } + /**ipCSEQ缓存key*/ + public static String buildStreamCacheKey(String steamId){ + return FastBeeConstant.REDIS.STREAM_KEY + steamId; + } + + /**ipCSEQ缓存key*/ + public static String buildSipCSEQCacheKey(String CSEQ){ + return FastBeeConstant.REDIS.SIP_CSEQ_PREFIX + CSEQ; + } + + /**modbus指令缓存可以*/ + public static String buildModbusCacheKey(Long productId){ + return FastBeeConstant.REDIS.POLL_MODBUS_KEY + productId; + } + + /*缓存设备下发指令消息ID*/ + public static String buildDownMessageIdCacheKey(String serialNumber){ + return FastBeeConstant.REDIS.DEVICE_MESSAGE_ID; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyDefine.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyDefine.java new file mode 100644 index 00000000..d550069a --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyDefine.java @@ -0,0 +1,113 @@ +package com.fastbee.common.core.redis; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +import java.time.Duration; + +/** + * Redis Key 定义类 + * + * @author fastbee + */ +@Data +public class RedisKeyDefine { + + @Getter + @AllArgsConstructor + public enum KeyTypeEnum { + + STRING("String"), + LIST("List"), + HASH("Hash"), + SET("Set"), + ZSET("Sorted Set"), + STREAM("Stream"), + PUBSUB("Pub/Sub"); + + /** + * 类型 + */ + @JsonValue + private final String type; + + } + + @Getter + @AllArgsConstructor + public enum TimeoutTypeEnum { + + FOREVER(1), // 永不超时 + DYNAMIC(2), // 动态超时 + FIXED(3); // 固定超时 + + /** + * 类型 + */ + @JsonValue + private final Integer type; + + } + + /** + * Key 模板 + */ + private final String keyTemplate; + /** + * Key 类型的枚举 + */ + private final KeyTypeEnum keyType; + /** + * Value 类型 + * + * 如果是使用分布式锁,设置为 {@link java.util.concurrent.locks.Lock} 类型 + */ + private final Class valueType; + /** + * 超时类型 + */ + private final TimeoutTypeEnum timeoutType; + /** + * 过期时间 + */ + private final Duration timeout; + /** + * 备注 + */ + private final String memo; + + private RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, + TimeoutTypeEnum timeoutType, Duration timeout) { + this.memo = memo; + this.keyTemplate = keyTemplate; + this.keyType = keyType; + this.valueType = valueType; + this.timeout = timeout; + this.timeoutType = timeoutType; + // 添加注册表 + RedisKeyRegistry.add(this); + } + + public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, Duration timeout) { + this(memo, keyTemplate, keyType, valueType, TimeoutTypeEnum.FIXED, timeout); + } + + public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, TimeoutTypeEnum timeoutType) { + this(memo, keyTemplate, keyType, valueType, timeoutType, Duration.ZERO); + } + + /** + * 格式化 Key + * + * 注意,内部采用 {@link String#format(String, Object...)} 实现 + * + * @param args 格式化的参数 + * @return Key + */ + public String formatKey(Object... args) { + return String.format(keyTemplate, args); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyRegistry.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyRegistry.java new file mode 100644 index 00000000..4cd9f7a3 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyRegistry.java @@ -0,0 +1,28 @@ +package com.fastbee.common.core.redis; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link RedisKeyDefine} 注册表 + */ +public class RedisKeyRegistry { + + /** + * Redis RedisKeyDefine 数组 + */ + private static final List DEFINES = new ArrayList<>(); + + public static void add(RedisKeyDefine define) { + DEFINES.add(define); + } + + public static List list() { + return DEFINES; + } + + public static int size() { + return DEFINES.size(); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/CharsetKit.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/CharsetKit.java new file mode 100644 index 00000000..eaf58bec --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/CharsetKit.java @@ -0,0 +1,86 @@ +package com.fastbee.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import com.fastbee.common.utils.StringUtils; + +/** + * 字符集工具类 + * + * @author ruoyi + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/Convert.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/Convert.java new file mode 100644 index 00000000..528b19b4 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/Convert.java @@ -0,0 +1,1000 @@ +package com.fastbee.common.core.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import com.fastbee.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 类型转换器 + * + * @author ruoyi + */ +public class Convert +{ + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return BigDecimal.valueOf((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) + { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) + { + char[] c = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) + { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/IntArrayValuable.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/IntArrayValuable.java new file mode 100644 index 00000000..60c22cd2 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/IntArrayValuable.java @@ -0,0 +1,13 @@ +package com.fastbee.common.core.text; + +/** + * 可生成 Int 数组的接口 + */ +public interface IntArrayValuable { + + /** + * @return int 数组 + */ + int[] array(); + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/KeyValue.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/KeyValue.java new file mode 100644 index 00000000..39e98942 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/KeyValue.java @@ -0,0 +1,20 @@ +package com.fastbee.common.core.text; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Key Value 的键值对 + * + * @author 芋道源码 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class KeyValue { + + private K key; + private V value; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/StrFormatter.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/StrFormatter.java new file mode 100644 index 00000000..5453375c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/text/StrFormatter.java @@ -0,0 +1,92 @@ +package com.fastbee.common.core.text; + +import com.fastbee.common.utils.StringUtils; + +/** + * 字符串格式化 + * + * @author ruoyi + */ +public class StrFormatter +{ + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 格式化字符串
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/NeuronModel.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/NeuronModel.java new file mode 100644 index 00000000..f5d877f5 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/NeuronModel.java @@ -0,0 +1,44 @@ +package com.fastbee.common.core.thingsModel; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * Neuron-JSON格式协议 + * @author gsb + * @date 2023/5/31 16:36 + */ +@Data +public class NeuronModel { + + /** + * 产品节点 + */ + private String node; + + /** + * 网关编号 + */ + private String group; + /** + * 上报时间 + */ + private Date timestamp; + + /** + * 上报JSON + */ + private JSONObject values; + /** + * 错误集合 + */ + private JSONObject errors; + /** + * 上报属性值集合 + */ + private List items; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java new file mode 100644 index 00000000..a8127bdf --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java @@ -0,0 +1,109 @@ +package com.fastbee.common.core.thingsModel; + +import com.fastbee.common.utils.DateUtils; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; + +import java.util.Date; + +/** + * 物模型值的项 + * + * @author kerwincui + * @date 2021-12-16 + */ +@AllArgsConstructor +public class ThingsModelSimpleItem +{ + /** 物模型唯一标识符 */ + private String id; + + /** 物模型值 */ + private String value; + + /** + * 更新时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date ts; + + private Integer slaveId; + + /** 备注 **/ + private String remark; + + private String timestamp; + + private boolean isBit = false; + + public ThingsModelSimpleItem(String id, String value , String remark){ + this.id=id; + this.value=value; + this.remark=remark; + } + + public ThingsModelSimpleItem(String id, String value ,Integer slaveId, String remark){ + this.id=id; + this.value=value; + this.slaveId = slaveId; + this.remark=remark; + } + + public boolean isBit() { + return isBit; + } + + public void setBit(boolean bit) { + isBit = bit; + } + + public Integer getSlaveId() { + return slaveId; + } + + public void setSlaveId(Integer slaveId) { + this.slaveId = slaveId; + } + + public Date getTs() { + return ts; + } + + public void setTs(Date ts) { + this.ts = ts != null ? ts : DateUtils.getNowDate(); + } + + public ThingsModelSimpleItem(){} + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java new file mode 100644 index 00000000..b40caf1e --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java @@ -0,0 +1,76 @@ +package com.fastbee.common.core.thingsModel; + +import java.util.List; + +/** + * 设备输入物模型值参数 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ThingsModelValuesInput +{ + /** 产品ID **/ + private Long productId; + + private Long deviceId; + + /** 设备ID **/ + private String deviceNumber; + + /** 设备物模型值的字符串格式 **/ + private String stringValue; + + /** 设备物模型值的集合 **/ + private List thingsModelSimpleItem; + + private Integer slaveId; + + public Integer getSlaveId() { + return slaveId; + } + + public void setSlaveId(Integer slaveId) { + this.slaveId = slaveId; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(String stringValue) { + this.stringValue = stringValue; + } + + public String getDeviceNumber() { + return deviceNumber; + } + + public void setDeviceNumber(String deviceNumber) { + this.deviceNumber = deviceNumber; + } + + public List getThingsModelValueRemarkItem() { + return thingsModelSimpleItem; + } + + public void setThingsModelValueRemarkItem(List thingsModelSimpleItem) { + this.thingsModelSimpleItem = thingsModelSimpleItem; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessStatus.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessStatus.java new file mode 100644 index 00000000..4c5bb7fe --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessStatus.java @@ -0,0 +1,20 @@ +package com.fastbee.common.enums; + +/** + * 操作状态 + * + * @author ruoyi + * + */ +public enum BusinessStatus +{ + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessType.java new file mode 100644 index 00000000..01aca531 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.fastbee.common.enums; + +/** + * 业务操作类型 + * + * @author ruoyi + */ +public enum BusinessType +{ + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空数据 + */ + CLEAN, +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/CommonStatusEnum.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/CommonStatusEnum.java new file mode 100644 index 00000000..111808f6 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/CommonStatusEnum.java @@ -0,0 +1,36 @@ +package com.fastbee.common.enums; + +import com.fastbee.common.core.text.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 通用状态枚举 + + */ +@Getter +@AllArgsConstructor +public enum CommonStatusEnum implements IntArrayValuable { + + ENABLE(0, "开启"), + DISABLE(1, "关闭"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getStatus).toArray(); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataEnum.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataEnum.java new file mode 100644 index 00000000..08d4e5be --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataEnum.java @@ -0,0 +1,37 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author gsb + * @date 2023/6/3 14:09 + */ +@Getter +@AllArgsConstructor +public enum DataEnum { + + DECIMAL("decimal", "十进制"), + DOUBLE("double", "双精度"), + ENUM("enum","枚举"), + BOOLEAN("boolean","布尔类型"), + INTEGER("integer","整形"), + OBJECT("object", "对象"), + STRING("string","字符串"), + ARRAY("array","数组"); + + String type; + String msg; + + public static DataEnum convert(String type){ + for (DataEnum value : DataEnum.values()) { + if (Objects.equals(value.type, type)){ + return value; + } + } + return DataEnum.STRING; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataSourceType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataSourceType.java new file mode 100644 index 00000000..e1e40e16 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DataSourceType.java @@ -0,0 +1,19 @@ +package com.fastbee.common.enums; + +/** + * 数据源 + * + * @author ruoyi + */ +public enum DataSourceType +{ + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DeviceStatus.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DeviceStatus.java new file mode 100644 index 00000000..7528d752 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/DeviceStatus.java @@ -0,0 +1,36 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum DeviceStatus { + + UNACTIVATED(1,"NOTACTIVE","未激活"), + FORBIDDEN(2,"DISABLE","禁用"), + ONLINE(3,"ONLINE","在线"), + OFFLINE(4,"OFFLINE","离线"); + + private int type; + private String code; + private String description; + + public static DeviceStatus convert(int type){ + for (DeviceStatus value : DeviceStatus.values()) { + if (value.type == type){ + return value; + } + } + return null; + } + + public static DeviceStatus convert(String code){ + for (DeviceStatus value : DeviceStatus.values()) { + if (value.code.equals(code)){ + return value; + } + } + return null; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ExceptionCode.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ExceptionCode.java new file mode 100644 index 00000000..88a74025 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ExceptionCode.java @@ -0,0 +1,23 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +/** + * @author gsb + * @date 2022/11/3 11:05 + */ +@Getter +@AllArgsConstructor +public enum ExceptionCode { + + SUCCESS(200,"成功"), + TIMEOUT(400,"超时"), + OFFLINE(404,"设备断线"), + FAIL(500,"失败"); + ; + + public int code; + public String desc; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/FunctionReplyStatus.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/FunctionReplyStatus.java new file mode 100644 index 00000000..26ebf530 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/FunctionReplyStatus.java @@ -0,0 +1,21 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备回调状态 + * @author bill + */ +@Getter +@AllArgsConstructor +public enum FunctionReplyStatus { + SUCCESS(200,"设备执行成功"), + FAIl(201,"指令执行失败"), + UNKNOWN(204,"设备超时未回复"), + NORELY(203, "指令下发成功"); + + int code; + String message; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/GlobalErrorCodeConstants.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/GlobalErrorCodeConstants.java new file mode 100644 index 00000000..db80a3b9 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/GlobalErrorCodeConstants.java @@ -0,0 +1,52 @@ +package com.fastbee.common.enums; + + +import com.fastbee.common.exception.ErrorCode; + +/** + * 全局错误码枚举 + * 0-999 系统异常编码保留 + * + * 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status + * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的 + * 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。 + * + * @author fastbee + */ +public interface GlobalErrorCodeConstants { + + ErrorCode SUCCESS = new ErrorCode(0, "成功"); + + // ========== 客户端错误段 ========== + + ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确"); + ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录"); + ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限"); + ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到"); + ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); + ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 + ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); + + // ========== 服务端错误段 ========== + + ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常"); + ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启"); + + // ========== 自定义错误段 ========== + ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求 + ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作"); + + ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); + + /** + * 是否为服务端错误,参考 HTTP 5XX 错误码段 + * + * @param code 错误码 + * @return 是否 + */ + static boolean isServerErrorCode(Integer code) { + return code != null + && code >= INTERNAL_SERVER_ERROR.getCode() && code <= INTERNAL_SERVER_ERROR.getCode() + 99; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/HttpMethod.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/HttpMethod.java new file mode 100644 index 00000000..7e085a28 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/HttpMethod.java @@ -0,0 +1,36 @@ +package com.fastbee.common.enums; + +import java.util.HashMap; +import java.util.Map; +import org.springframework.lang.Nullable; + +/** + * 请求方式 + * + * @author ruoyi + */ +public enum HttpMethod +{ + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; + + private static final Map mappings = new HashMap<>(16); + + static + { + for (HttpMethod httpMethod : values()) + { + mappings.put(httpMethod.name(), httpMethod); + } + } + + @Nullable + public static HttpMethod resolve(@Nullable String method) + { + return (method != null ? mappings.get(method) : null); + } + + public boolean matches(String method) + { + return (this == resolve(method)); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/IErrorCode.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/IErrorCode.java new file mode 100644 index 00000000..becbc41f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/IErrorCode.java @@ -0,0 +1,14 @@ +package com.fastbee.common.enums; + +/** + * 常用API返回对象接口 + */ +public interface IErrorCode { + + /**返回码*/ + int getCode(); + + /**返回信息*/ + String getMessage(); + +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/LimitType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/LimitType.java new file mode 100644 index 00000000..82d8d484 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/LimitType.java @@ -0,0 +1,20 @@ +package com.fastbee.common.enums; + +/** + * 限流类型 + * + * @author ruoyi + */ + +public enum LimitType +{ + /** + * 默认策略全局限流 + */ + DEFAULT, + + /** + * 根据请求者IP进行限流 + */ + IP +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ModbusDataType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ModbusDataType.java new file mode 100644 index 00000000..e719614d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ModbusDataType.java @@ -0,0 +1,38 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author gsb + * @date 2023/9/4 14:46 + */ +@Getter +@AllArgsConstructor +public enum ModbusDataType { + + + U_SHORT("ushort","16位 无符号"), + SHORT("short","16位 有符号"), + LONG_ABCD("long-ABCD","32位 有符号(ABCD)"), + LONG_CDAB("long-CDAB","32位 有符号(CDAB)"), + U_LONG_ABCD("ulong-ABCD","32位 无符号(ABCD)"), + U_LONG_CDAB("ulong-CDAB","32位 无符号(CDAB)"), + FLOAT_ABCD("float-ABCD","32位 浮点数(ABCD)"), + FLOAT_CDAB("float-CDAB","32位 浮点数(CDAB)"), + BIT("bit","位"); + + String type; + String msg; + + public static ModbusDataType convert(String type){ + for (ModbusDataType value : ModbusDataType.values()) { + if (Objects.equals(value.type,type)){ + return value; + } + } + return ModbusDataType.U_SHORT; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OTAUpgrade.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OTAUpgrade.java new file mode 100644 index 00000000..b9d5871a --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OTAUpgrade.java @@ -0,0 +1,37 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * OTA升级状态 + * @author gsb + * @date 2022/10/24 17:29 + */ +@AllArgsConstructor +@Getter +public enum OTAUpgrade { + + + AWAIT(0, "等待升级","未推送固件到设备"), + SEND(1, "已发送","已发送设备"), + REPLY(2, "升级中","设备OTA升级中"), + SUCCESS(3, "成功","升级成功"), + FAILED(4, "失败","升级失败"), + STOP(5, "停止","设备离线停止推送"), + UNKNOWN(404, "未知","未知错误码"); + Integer status; + String subMsg; + String des; + + public static OTAUpgrade parse(Integer code){ + for (OTAUpgrade item: OTAUpgrade.values()){ + if(item.status.equals(code)){ + return item; + } + } + + return UNKNOWN; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OperatorType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OperatorType.java new file mode 100644 index 00000000..934801b0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.fastbee.common.enums; + +/** + * 操作人类别 + * + * @author ruoyi + */ +public enum OperatorType +{ + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ResultCode.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ResultCode.java new file mode 100644 index 00000000..86b293c9 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ResultCode.java @@ -0,0 +1,37 @@ +package com.fastbee.common.enums; + +import com.fastbee.common.constant.HttpStatus; +import lombok.AllArgsConstructor; + +/** + * API返回对象 + */ +@AllArgsConstructor +public enum ResultCode implements IErrorCode { + + SUCCESS(HttpStatus.SUCCESS,"请求成功"), + FAILED(HttpStatus.ERROR,"系统内部错误"), + ACCEPTED(HttpStatus.ACCEPTED,"请求已接收"), + REDIRECT(HttpStatus.SEE_OTHER,"重定向"), + UNAUTHORIZED(HttpStatus.UNAUTHORIZED,"暂未登录或token过期"), + FORBIDDEN(HttpStatus.FORBIDDEN,"没有相关权限或授权过期"), + NOT_FOUND(HttpStatus.NOT_FOUND,"资源未找到"), + PARSE_MSG_EXCEPTION(4018, "解析协议异常"), + TIMEOUT(502, "响应超时!"), + FIRMWARE_VERSION_UNIQUE_ERROR(4022, "产品下已存在该版本固件"), + FIRMWARE_SEQ_UNIQUE_ERROR(4023, "产品下已存在该升级序列号"), + FIRMWARE_TASK_UNIQUE_ERROR(4024, "任务名已存在"), + REPLY_TIMEOUT(4001, "超时未回执"), + INVALID_USER_APP(4002, "用户信息不存在"), + INVALID_MQTT_USER(1003, "内部mqtt服务用户异常"), + DECODE_PROTOCOL_EXCEPTION(1000, "解析协议异常"), + MQTT_TOPIC_INVALID(1001, "MQTT订阅topic格式非法"); + + private int code; + private String message; + + public int getCode(){return code;} + + public String getMessage(){return message;} + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ServerType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ServerType.java new file mode 100644 index 00000000..dec6b955 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ServerType.java @@ -0,0 +1,36 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author gsb + * @date 2022/9/15 9:10 + */ +@Getter +@AllArgsConstructor +public enum ServerType { + + MQTT(1, "MQTT","MQTT-BROKER"), + COAP(2, "COAP","COAP-SERVER"), + TCP(3, "TCP","TCP-SERVER"), + UDP(4, "UDP","UDP-SERVER"), + WEBSOCKET(5,"WEBSOCKET","WEBSOCKET-SERVER"), + GB28181(6,"GB28181","SIP-SERVER"), + OTHER(999,"WEBSOCKET","MQTT-BROKER"); + + private int type; + private String code; + private String des; + + + + public static ServerType explain(String code) { + for (ServerType value : ServerType.values()) { + if (value.code.equals(code)) { + return value; + } + } + return ServerType.MQTT; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/SocialPlatformType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/SocialPlatformType.java new file mode 100644 index 00000000..e419b49f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/SocialPlatformType.java @@ -0,0 +1,68 @@ +package com.fastbee.common.enums; + +import java.util.Arrays; +import java.util.List; + +/** + * 第三方登录平台枚举 + * + * @author json + */ +public enum SocialPlatformType { + WECHAT_OPEN_WEB("wechat_open_web", "微信开放平台网站应用"), + WECHAT_OPEN_WEB_BIND("wechat_open_web_bind", "微信开放平台网站应用个人中心绑定"), + WECHAT_OPEN_MOBILE("wechat_open_mobile", "微信开放平台移动应用"), + WECHAT_OPEN_MINI_PROGRAM("wechat_open_mini_program", "微信开放平台小程序"), + QQ_OPEN_WEB("qq_open_web", "QQ互联网站应用"), + QQ_OPEN_APP("qq_open_app", "QQ互联移动应用"), + QQ_OPEN_MINI_PROGRAM("qq_open_mini_program", "QQ互联小程序"); +// ALIPAY_OPEN_WEB("alipay_open_web", ""), +// ALIPAY_OPEN_APP("alipay_open_app", ""), +// ALIPAY_OPEN_MINI_PROGRAM("alipay_open_mini_program", ""); + + public String sourceClient; + + public String desc; + + SocialPlatformType(String sourceClient, String desc) { + this.sourceClient = sourceClient; + this.desc = desc; + } + + // 查询微信绑定来源集合 + public static final List listWechatPlatform = Arrays.asList(WECHAT_OPEN_WEB.sourceClient, WECHAT_OPEN_MOBILE.sourceClient, WECHAT_OPEN_MINI_PROGRAM.sourceClient); + + public static String getDesc(String sourceClient) { + for (SocialPlatformType socialPlatformType : SocialPlatformType.values()) { + if (socialPlatformType.getSourceClient().equals(sourceClient)) { + return socialPlatformType.getDesc(); + } + } + return null; + } + + public static SocialPlatformType getSocialPlatformType(String sourceClient) { + for (SocialPlatformType socialPlatformType : SocialPlatformType.values()) { + if (socialPlatformType.getSourceClient().equals(sourceClient)) { + return socialPlatformType; + } + } + return null; + } + + public String getSourceClient() { + return sourceClient; + } + + public void setSourceClient(String sourceClient) { + this.sourceClient = sourceClient; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ThingsModelType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ThingsModelType.java new file mode 100644 index 00000000..ed0c3330 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/ThingsModelType.java @@ -0,0 +1,50 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 物模型类型 + * + * @author bill + */ +@Getter +@AllArgsConstructor +public enum ThingsModelType { + + PROP(1, "PROPERTY", "属性","properties"), + SERVICE(2, "FUNCTION", "服务","functions"), + EVENT(3, "EVENT", "事件","events"),; + + int code; + String type; + String name; + String list; + + public static ThingsModelType getType(int code) { + for (ThingsModelType value : ThingsModelType.values()) { + if (value.code == code) { + return value; + } + } + return ThingsModelType.PROP; + } + + public static ThingsModelType getType(String type) { + for (ThingsModelType value : ThingsModelType.values()) { + if (value.type.equals(type)) { + return value; + } + } + return ThingsModelType.PROP; + } + + public static String getName(int code) { + for (ThingsModelType value : ThingsModelType.values()) { + if (value.code == code) { + return value.list; + } + } + return ThingsModelType.PROP.list; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/TopicType.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/TopicType.java new file mode 100644 index 00000000..3f64f2ae --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/TopicType.java @@ -0,0 +1,62 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * topic类型 + * @author gsb + */ +@Getter +@AllArgsConstructor +public enum TopicType { + + /** + * @param type 0:标记是订阅主题 1:标记是发布属性 + * @param order 排序 + * @param topicSuffix topic后缀 + * @param msg 描述信息 + */ + + /*** 通用设备上报主题(平台订阅) ***/ + PROPERTY_POST(0,1,"/property/post", "订阅属性"), + EVENT_POST(0,2,"/event/post", "订阅事件"), + FUNCTION_POST(0,3,"/function/post", "订阅功能"), + INFO_POST(0,4,"/info/post","订阅设备信息"), + NTP_POST(0,5,"/ntp/post","订阅时钟同步"), + SERVICE_INVOKE_REPLY(0,8,"/service/reply", "订阅功能调用返回结果"), + FIRMWARE_UPGRADE_REPLY(0,9,"/upgrade/reply", "订阅设备OTA升级结果"), + + + /*** 通用设备订阅主题(平台下发)***/ + FUNCTION_GET(1,17,"/function/get", "发布功能"), + PROPERTY_GET(1,12,"/property/get" ,"发布设备属性读取"), + FIRMWARE_SET(1,14, "/upgrade/set","发布OTA升级"), + STATUS_POST(1,11,"/status/post","发布状态"), + NTP_GET(1,15,"/ntp/get","发布时钟同步"), + INFO_GET(1,18,"/info/get","发布设备信息"), + + + /*** 视频监控设备转协议发布 ***/ + DEV_INFO_POST(3,19,"/info/post","设备端发布设备信息"), + DEV_EVENT_POST(3,20,"/event/post","设备端发布事件"), + DEV_FUNCTION_POST(3,21,"/function/post", "设备端发布功能"), + DEV_PROPERTY_POST(3,22,"/property/post", "设备端发布属性"), + + + /*** webSocket转发前端使用 ***/ + WS_SERVICE_INVOKE(2,16,"/ws/service", "WS服务调用"), + + + /*** 模拟设备使用 ***/ + PROPERTY_GET_SIMULATE(4,23,"/property/get/simulate" ,"发布属性读取"), + PROPERTY_SET_SIMULATE(4,13, "/property/set/simulate","发布属性写入"), + WS_SERVICE_INVOKE_SIMULATE(2,24,"/ws/post/simulate", "模拟设备WS推送"), + PROPERTY_POST_SIMULATE(2,25,"/property/simulate/post", "订阅属性"); + + Integer type; + Integer order; + String topicSuffix; + String msg; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/UserStatus.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/UserStatus.java new file mode 100644 index 00000000..7ea86c2d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.fastbee.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum UserStatus +{ + OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); + + private final String code; + private final String info; + + UserStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/VerifyTypeEnum.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/VerifyTypeEnum.java new file mode 100644 index 00000000..74202c25 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/enums/VerifyTypeEnum.java @@ -0,0 +1,23 @@ +package com.fastbee.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 验证类型枚举 + * @author fastb + * @date 2023-08-30 15:04 + */ +@Getter +@NoArgsConstructor +@AllArgsConstructor +public enum VerifyTypeEnum { + + PASSWORD(1, "账号密码验证"), + SMS(2, "短信验证"); + + private Integer verifyType; + + private String desc; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/DemoModeException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/DemoModeException.java new file mode 100644 index 00000000..ca1872f2 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/DemoModeException.java @@ -0,0 +1,15 @@ +package com.fastbee.common.exception; + +/** + * 演示模式异常 + * + * @author ruoyi + */ +public class DemoModeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public DemoModeException() + { + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ErrorCode.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ErrorCode.java new file mode 100644 index 00000000..5d145d73 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ErrorCode.java @@ -0,0 +1,28 @@ +package com.fastbee.common.exception; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 错误码对象 + * + */ +@Data +@Accessors(chain = true) +public class ErrorCode { + + /** + * 错误码 + */ + private final Integer code; + /** + * 错误提示 + */ + private final String msg; + + public ErrorCode(Integer code, String message) { + this.code = code; + this.msg = message; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/GlobalException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/GlobalException.java new file mode 100644 index 00000000..f6bf8e42 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/GlobalException.java @@ -0,0 +1,58 @@ +package com.fastbee.common.exception; + +/** + * 全局异常 + * + * @author ruoyi + */ +public class GlobalException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public GlobalException() + { + } + + public GlobalException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public GlobalException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() + { + return message; + } + + public GlobalException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServerException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServerException.java new file mode 100644 index 00000000..459fdbc0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServerException.java @@ -0,0 +1,60 @@ +package com.fastbee.common.exception; + +import com.fastbee.common.enums.GlobalErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 服务器异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServerException extends RuntimeException { + + /** + * 全局错误码 + * + * @see GlobalErrorCodeConstants + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServerException() { + } + + public ServerException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServerException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServerException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServerException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceException.java new file mode 100644 index 00000000..2cab2144 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceException.java @@ -0,0 +1,80 @@ +package com.fastbee.common.exception; + +/** + * 业务异常 + * + * @author ruoyi + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public ServiceException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public ServiceException(Integer code, String message) + { + this.code = code; + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceExceptionUtil.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceExceptionUtil.java new file mode 100644 index 00000000..0fe5b4db --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/ServiceExceptionUtil.java @@ -0,0 +1,125 @@ +package com.fastbee.common.exception; + +import com.fastbee.common.enums.GlobalErrorCodeConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * {@link ServiceException} 工具类 + * + * 目的在于,格式化异常信息提示。 + * 考虑到 String.format 在参数不正确时会报错,因此使用 {} 作为占位符,并使用 {@link #doFormat(int, String, Object...)} 方法来格式化 + * + * 因为 {@link #MESSAGES} 里面默认是没有异常信息提示的模板的,所以需要使用方自己初始化进去。目前想到的有几种方式: + * + * 1. 异常提示信息,写在枚举类中,例如说,cn.iocoder.oceans.user.api.constants.ErrorCodeEnum 类 + ServiceExceptionConfiguration + * 2. 异常提示信息,写在 .properties 等等配置文件 + * 3. 异常提示信息,写在 Apollo 等等配置中心中,从而实现可动态刷新 + * 4. 异常提示信息,存储在 db 等等数据库中,从而实现可动态刷新 + */ +@Slf4j +public class ServiceExceptionUtil { + + /** + * 错误码提示模板 + */ + private static final ConcurrentMap MESSAGES = new ConcurrentHashMap<>(); + + public static void putAll(Map messages) { + ServiceExceptionUtil.MESSAGES.putAll(messages); + } + + public static void put(Integer code, String message) { + ServiceExceptionUtil.MESSAGES.put(code, message); + } + + public static void delete(Integer code, String message) { + ServiceExceptionUtil.MESSAGES.remove(code, message); + } + + // ========== 和 ServiceException 的集成 ========== + + public static ServiceException exception(ErrorCode errorCode) { + String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg()); + return exception0(errorCode.getCode(), messagePattern); + } + + public static ServiceException exception(ErrorCode errorCode, Object... params) { + String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg()); + return exception0(errorCode.getCode(), messagePattern, params); + } + + /** + * 创建指定编号的 ServiceException 的异常 + * + * @param code 编号 + * @return 异常 + */ + public static ServiceException exception(Integer code) { + return exception0(code, MESSAGES.get(code)); + } + + /** + * 创建指定编号的 ServiceException 的异常 + * + * @param code 编号 + * @param params 消息提示的占位符对应的参数 + * @return 异常 + */ + public static ServiceException exception(Integer code, Object... params) { + return exception0(code, MESSAGES.get(code), params); + } + + public static ServiceException exception0(Integer code, String messagePattern, Object... params) { + String message = doFormat(code, messagePattern, params); + return new ServiceException(code, message); + } + + public static ServiceException invalidParamException(String messagePattern, Object... params) { + return exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), messagePattern, params); + } + + // ========== 格式化方法 ========== + + /** + * 将错误编号对应的消息使用 params 进行格式化。 + * + * @param code 错误编号 + * @param messagePattern 消息模版 + * @param params 参数 + * @return 格式化后的提示 + */ + @VisibleForTesting + public static String doFormat(int code, String messagePattern, Object... params) { + StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50); + int i = 0; + int j; + int l; + for (l = 0; l < params.length; l++) { + j = messagePattern.indexOf("{}", i); + if (j == -1) { + log.error("[doFormat][参数过多:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + if (i == 0) { + return messagePattern; + } else { + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + } else { + sbuf.append(messagePattern, i, j); + sbuf.append(params[l]); + i = j + 2; + } + } + if (messagePattern.indexOf("{}", i) != -1) { + log.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + } + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/UtilException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/UtilException.java new file mode 100644 index 00000000..c39a5337 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/UtilException.java @@ -0,0 +1,26 @@ +package com.fastbee.common.exception; + +/** + * 工具类异常 + * + * @author ruoyi + */ +public class UtilException extends RuntimeException +{ + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) + { + super(e.getMessage(), e); + } + + public UtilException(String message) + { + super(message); + } + + public UtilException(String message, Throwable throwable) + { + super(message, throwable); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/base/BaseException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/base/BaseException.java new file mode 100644 index 00000000..6f6005d4 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/base/BaseException.java @@ -0,0 +1,97 @@ +package com.fastbee.common.exception.base; + +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.StringUtils; + +/** + * 基础异常 + * + * @author ruoyi + */ +public class BaseException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 所属模块 + */ + private String module; + + /** + * 错误码 + */ + private String code; + + /** + * 错误码对应的参数 + */ + private Object[] args; + + /** + * 错误消息 + */ + private String defaultMessage; + + public BaseException(String module, String code, Object[] args, String defaultMessage) + { + this.module = module; + this.code = code; + this.args = args; + this.defaultMessage = defaultMessage; + } + + public BaseException(String module, String code, Object[] args) + { + this(module, code, args, null); + } + + public BaseException(String module, String defaultMessage) + { + this(module, null, null, defaultMessage); + } + + public BaseException(String code, Object[] args) + { + this(null, code, args, null); + } + + public BaseException(String defaultMessage) + { + this(null, null, null, defaultMessage); + } + + @Override + public String getMessage() + { + String message = null; + if (!StringUtils.isEmpty(code)) + { + message = MessageUtils.message(code, args); + } + if (message == null) + { + message = defaultMessage; + } + return message; + } + + public String getModule() + { + return module; + } + + public String getCode() + { + return code; + } + + public Object[] getArgs() + { + return args; + } + + public String getDefaultMessage() + { + return defaultMessage; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileException.java new file mode 100644 index 00000000..e7fbb650 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileException.java @@ -0,0 +1,19 @@ +package com.fastbee.common.exception.file; + +import com.fastbee.common.exception.base.BaseException; + +/** + * 文件信息异常类 + * + * @author ruoyi + */ +public class FileException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public FileException(String code, Object[] args) + { + super("file", code, args, null); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileNameLengthLimitExceededException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 00000000..b2ad8db2 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,16 @@ +package com.fastbee.common.exception.file; + +/** + * 文件名称超长限制异常类 + * + * @author ruoyi + */ +public class FileNameLengthLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) + { + super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileSizeLimitExceededException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 00000000..cca7413d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,16 @@ +package com.fastbee.common.exception.file; + +/** + * 文件名大小限制异常类 + * + * @author ruoyi + */ +public class FileSizeLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) + { + super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/InvalidExtensionException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/InvalidExtensionException.java new file mode 100644 index 00000000..0a75787b --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/file/InvalidExtensionException.java @@ -0,0 +1,81 @@ +package com.fastbee.common.exception.file; + +import java.util.Arrays; +import org.apache.commons.fileupload.FileUploadException; + +/** + * 文件上传 误异常类 + * + * @author ruoyi + */ +public class InvalidExtensionException extends FileUploadException +{ + private static final long serialVersionUID = 1L; + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) + { + super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() + { + return allowedExtension; + } + + public String getExtension() + { + return extension; + } + + public String getFilename() + { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidVideoExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttAuthorizationException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttAuthorizationException.java new file mode 100644 index 00000000..d2644a50 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttAuthorizationException.java @@ -0,0 +1,17 @@ +package com.fastbee.common.exception.iot; + +import com.fastbee.common.exception.GlobalException; +import lombok.NoArgsConstructor; + +/** + * mqtt客户端权限校验异常 + * @author gsb + * @date 2022/10/8 14:11 + */ +@NoArgsConstructor +public class MqttAuthorizationException extends GlobalException { + + public MqttAuthorizationException(String messageId){ + super(messageId); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttClientUserNameOrPassException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttClientUserNameOrPassException.java new file mode 100644 index 00000000..683f7e39 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/iot/MqttClientUserNameOrPassException.java @@ -0,0 +1,17 @@ +package com.fastbee.common.exception.iot; + +import com.fastbee.common.exception.GlobalException; +import lombok.NoArgsConstructor; + +/** + * mqtt客户端校验 用户名或密码错误 + * @author gsb + * @date 2022/10/8 14:15 + */ +@NoArgsConstructor +public class MqttClientUserNameOrPassException extends GlobalException { + + public MqttClientUserNameOrPassException(String message){ + super(message); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/job/TaskException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/job/TaskException.java new file mode 100644 index 00000000..60cb410f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/job/TaskException.java @@ -0,0 +1,34 @@ +package com.fastbee.common.exception.job; + +/** + * 计划策略异常 + * + * @author ruoyi + */ +public class TaskException extends Exception +{ + private static final long serialVersionUID = 1L; + + private Code code; + + public TaskException(String msg, Code code) + { + this(msg, code, null); + } + + public TaskException(String msg, Code code, Exception nestedEx) + { + super(msg, nestedEx); + this.code = code; + } + + public Code getCode() + { + return code; + } + + public enum Code + { + TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaException.java new file mode 100644 index 00000000..f8d1544d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaException.java @@ -0,0 +1,16 @@ +package com.fastbee.common.exception.user; + +/** + * 验证码错误异常类 + * + * @author ruoyi + */ +public class CaptchaException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException() + { + super("user.jcaptcha.error", null); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaExpireException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaExpireException.java new file mode 100644 index 00000000..fd6401d6 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/CaptchaExpireException.java @@ -0,0 +1,16 @@ +package com.fastbee.common.exception.user; + +/** + * 验证码失效异常类 + * + * @author ruoyi + */ +public class CaptchaExpireException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaExpireException() + { + super("user.jcaptcha.expire", null); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserException.java new file mode 100644 index 00000000..d1d180f6 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserException.java @@ -0,0 +1,18 @@ +package com.fastbee.common.exception.user; + +import com.fastbee.common.exception.base.BaseException; + +/** + * 用户信息异常类 + * + * @author ruoyi + */ +public class UserException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public UserException(String code, Object[] args) + { + super("user", code, args, null); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordNotMatchException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 00000000..54333f1a --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,16 @@ +package com.fastbee.common.exception.user; + +/** + * 用户密码不正确或不符合规范异常类 + * + * @author ruoyi + */ +public class UserPasswordNotMatchException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordNotMatchException() + { + super("user.password.not.match", null); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordRetryLimitExceedException.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordRetryLimitExceedException.java new file mode 100644 index 00000000..c5d1812d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/exception/user/UserPasswordRetryLimitExceedException.java @@ -0,0 +1,16 @@ +package com.fastbee.common.exception.user; + +/** + * 用户错误最大次数异常类 + * + * @author ruoyi + */ +public class UserPasswordRetryLimitExceedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) + { + super("user.password.retry.limit.exceed", new Object[] { retryLimitCount, lockTime }); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/PropertyPreExcludeFilter.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/PropertyPreExcludeFilter.java new file mode 100644 index 00000000..e8fbcd5c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/PropertyPreExcludeFilter.java @@ -0,0 +1,24 @@ +package com.fastbee.common.filter; + +import com.alibaba.fastjson2.filter.SimplePropertyPreFilter; + +/** + * 排除JSON敏感属性 + * + * @author ruoyi + */ +public class PropertyPreExcludeFilter extends SimplePropertyPreFilter +{ + public PropertyPreExcludeFilter() + { + } + + public PropertyPreExcludeFilter addExcludes(String... filters) + { + for (int i = 0; i < filters.length; i++) + { + this.getExcludes().add(filters[i]); + } + return this; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatableFilter.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatableFilter.java new file mode 100644 index 00000000..ed8bdda6 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatableFilter.java @@ -0,0 +1,52 @@ +package com.fastbee.common.filter; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.springframework.http.MediaType; +import com.fastbee.common.utils.StringUtils; + +/** + * Repeatable 过滤器 + * + * @author ruoyi + */ +public class RepeatableFilter implements Filter +{ + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) + { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) + { + chain.doFilter(request, response); + } + else + { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() + { + + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatedlyRequestWrapper.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatedlyRequestWrapper.java new file mode 100644 index 00000000..53429f37 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/RepeatedlyRequestWrapper.java @@ -0,0 +1,76 @@ +package com.fastbee.common.filter; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import com.fastbee.common.utils.http.HttpHelper; +import com.fastbee.common.constant.Constants; + +/** + * 构建可重复读取inputStream的request + * + * @author ruoyi + */ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper +{ + private final byte[] body; + + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException + { + super(request); + request.setCharacterEncoding(Constants.UTF8); + response.setCharacterEncoding(Constants.UTF8); + + body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8); + } + + @Override + public BufferedReader getReader() throws IOException + { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() + { + @Override + public int read() throws IOException + { + return bais.read(); + } + + @Override + public int available() throws IOException + { + return body.length; + } + + @Override + public boolean isFinished() + { + return false; + } + + @Override + public boolean isReady() + { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) + { + + } + }; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssFilter.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssFilter.java new file mode 100644 index 00000000..e5ec9238 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssFilter.java @@ -0,0 +1,75 @@ +package com.fastbee.common.filter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.enums.HttpMethod; + +/** + * 防止XSS攻击的过滤器 + * + * @author ruoyi + */ +public class XssFilter implements Filter +{ + /** + * 排除链接 + */ + public List excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String tempExcludes = filterConfig.getInitParameter("excludes"); + if (StringUtils.isNotEmpty(tempExcludes)) + { + String[] url = tempExcludes.split(","); + for (int i = 0; url != null && i < url.length; i++) + { + excludes.add(url[i]); + } + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) + { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) + { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) + { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() + { + + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssHttpServletRequestWrapper.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 00000000..a514cf91 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,111 @@ +package com.fastbee.common.filter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.html.EscapeUtil; + +/** + * XSS过滤处理 + * + * @author ruoyi + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper +{ + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) + { + super(request); + } + + @Override + public String[] getParameterValues(String name) + { + String[] values = super.getParameterValues(name); + if (values != null) + { + int length = values.length; + String[] escapesValues = new String[length]; + for (int i = 0; i < length; i++) + { + // 防xss攻击和过滤前后空格 + escapesValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapesValues; + } + return super.getParameterValues(name); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + // 非json类型,直接返回 + if (!isJsonRequest()) + { + return super.getInputStream(); + } + + // 为空,直接返回 + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isEmpty(json)) + { + return super.getInputStream(); + } + + // xss过滤 + json = EscapeUtil.clean(json).trim(); + byte[] jsonBytes = json.getBytes("utf-8"); + final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes); + return new ServletInputStream() + { + @Override + public boolean isFinished() + { + return true; + } + + @Override + public boolean isReady() + { + return true; + } + + @Override + public int available() throws IOException + { + return jsonBytes.length; + } + + @Override + public void setReadListener(ReadListener readListener) + { + } + + @Override + public int read() throws IOException + { + return bis.read(); + } + }; + } + + /** + * 是否是Json请求 + * + * @param request + */ + public boolean isJsonRequest() + { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Arith.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Arith.java new file mode 100644 index 00000000..bea66b58 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Arith.java @@ -0,0 +1,114 @@ +package com.fastbee.common.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 精确的浮点数运算 + * + * @author ruoyi + */ +public class Arith +{ + + /** 默认除法运算精度 */ + private static final int DEF_DIV_SCALE = 10; + + /** 这个类不能实例化 */ + private Arith() + { + } + + /** + * 提供精确的加法运算。 + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。 + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) + { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。 + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = BigDecimal.ONE; + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/BeanMapUtilByReflect.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/BeanMapUtilByReflect.java new file mode 100644 index 00000000..aa6feabd --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/BeanMapUtilByReflect.java @@ -0,0 +1,73 @@ +package com.fastbee.common.utils; + +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BeanMapUtilByReflect { + + /** + * 对象转Map + * @param object + * @return + * @throws IllegalAccessException + */ + public static Map beanToMap(Object object) throws IllegalAccessException { + Map map = new HashMap(); + Field[] fields = object.getClass().getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + map.put(field.getName(), field.get(object)); + } + return map; + } + + /** + * bean转item对象 + * @param object + * @return + * @throws IllegalAccessException + */ + public static List beanToItem(Object object) throws IllegalAccessException { + List result = new ArrayList<>(); + Field[] fields = object.getClass().getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + ThingsModelSimpleItem item = new ThingsModelSimpleItem(); + item.setId(field.getName()); + item.setValue(field.get(object)+""); + item.setTs(DateUtils.getNowDate()); + result.add(item); + } + return result; + } + + /** + * map转对象 + * @param map + * @param beanClass + * @param + * @return + * @throws Exception + */ + public static T mapToBean(Map map, Class beanClass) throws Exception { + T object = beanClass.newInstance(); + Field[] fields = object.getClass().getDeclaredFields(); + for (Field field : fields) { + int mod = field.getModifiers(); + if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) { + continue; + } + field.setAccessible(true); + if (map.containsKey(field.getName())) { + field.set(object, map.get(field.getName())); + } + } + return object; + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/CaculateUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/CaculateUtils.java new file mode 100644 index 00000000..02795f5c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/CaculateUtils.java @@ -0,0 +1,360 @@ +package com.fastbee.common.utils; + +import com.fastbee.common.exception.ServiceException; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.codec.binary.Hex; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 字符串公式计算工具 + */ +public class CaculateUtils { + + /** + * /* + * 暂时只支持加减乘除及括号的应用 + */ + private static final String symbol = "+-,*/,()"; + + + /** + * 公式计算 字符串 + * + * @param exeStr + */ + public static BigDecimal execute(String exeStr, Map replaceMap) { + //替换掉占位符 + exeStr = caculateReplace(exeStr, replaceMap); + exeStr = exeStr.replaceAll("\\s*", ""); + List suffixList = suffixHandle(exeStr); + return caculateAnalyse(suffixList); + + } + + /** + * 公式计算 后序list + * + * @param suffixList + * @return + */ + public static BigDecimal caculateAnalyse(List suffixList) { + + BigDecimal a = BigDecimal.ZERO; + BigDecimal b = BigDecimal.ZERO; + // 构建一个操作数栈 每当获得操作符号时取出最上面两个数进行计算。 + Stack caculateStack = new Stack(); + if (suffixList.size() > 1) { + + for (int i = 0; i < suffixList.size(); i++) { + String temp = suffixList.get(i); + if (symbol.contains(temp)) { + b = caculateStack.pop(); + a = caculateStack.pop(); + a = caculate(a, b, temp.toCharArray()[0]); + caculateStack.push(a); + } else { + if (isNumber(suffixList.get(i))) { + caculateStack.push(BigDecimal.valueOf(Double.parseDouble(suffixList.get(i)))); + } else { + throw new RuntimeException("公式异常!"); + } + } + } + } else if (suffixList.size() == 1) { + String temp = suffixList.get(0); + if (isNumber(temp)) { + a = BigDecimal.valueOf(Double.parseDouble(temp)); + } else { + throw new RuntimeException("公式异常!"); + } + } + return a; + } + + + /** + * 计算 使用double 进行计算 如果需要可以在这里使用bigdecimal 进行计算 + * + * @param a + * @param b + * @param symbol + * @return + */ + public static BigDecimal caculate(BigDecimal a, BigDecimal b, char symbol) { + + switch (symbol) { + case '+': { + return a.add(b).stripTrailingZeros(); + } + case '-': + return a.subtract(b).stripTrailingZeros(); + case '*': + return a.multiply(b); + case '/': + return a.divide(b).stripTrailingZeros(); + default: + throw new RuntimeException("操作符号异常!"); + } + + } + + /** + * 字符串直接 转 后序 + */ + public static List suffixHandle(String exeStr) { + StringBuilder buf = new StringBuilder(); + Stack stack = new Stack(); + char[] exeChars = exeStr.toCharArray(); + List res = new ArrayList(); + for (char x : exeChars) { + // 判断是不是操作符号 + if (symbol.indexOf(x) > -1) { + // 不管怎样先将数据添加进列表 + if (buf.length() > 0) { + // 添加数据到res + String temp = buf.toString(); + // 验证是否为数 + if (!isNumber(temp)) throw new RuntimeException(buf.append(" 格式不对").toString()); + + // 添加到结果列表中 + res.add(temp); + // 清空临时buf + buf.delete(0, buf.length()); + } + if (stack.size() > 0) { + + //2.判断是不是开是括号 + if (x == '(') { + stack.push(x); + continue; + } + //3.判断是不是闭合括号 + if (x == ')') { + while (stack.size() > 0) { + char con = (char) stack.peek(); + if (con == '(') { + stack.pop(); + continue; + } else { + res.add(String.valueOf(stack.pop())); + } + } + continue; + } + // 取出最后最近的一个操作符 + char last = (char) stack.peek(); + if (compare(x, last) > 0) { + stack.push(x); + } else if (compare(x, last) <= 0) { + if (last != '(') { + res.add(String.valueOf(stack.pop())); + } + stack.push(x); + } + } else { + stack.push(x); + } + } else { + buf.append(x); + } + } + if (buf.length() > 0) res.add(buf.toString()); + while (stack.size() > 0) { + res.add(String.valueOf(stack.pop())); + } + return res; + + } + + + /** + * 比较两个操作符号的优先级 + * + * @param a + * @param b + * @return + */ + public static int compare(char a, char b) { + if (symbol.indexOf(a) - symbol.indexOf(b) > 1) { + return 1; + } else if (symbol.indexOf(a) - symbol.indexOf(b) < -1) { + return -1; + } else { + return 0; + } + } + + + /** + * 判断是否为数 字符串 + * + * @param str + * @return + */ + public static boolean isNumber(String str) { + Pattern pattern = Pattern.compile("[0-9]+\\.{0,1}[0-9]*"); + Matcher isNum = pattern.matcher(str); + return isNum.matches(); + } + + public static String caculateReplace(String str, Map map) { + for (Map.Entry entry : map.entrySet()) { + str = str.replaceAll(entry.getKey(), entry.getValue()==null ? "1" : entry.getValue()); + } + return str; + } + + public static String toFloat(byte[] bytes) throws IOException { + ByteArrayInputStream mByteArrayInputStream = new ByteArrayInputStream(bytes); + DataInputStream mDataInputStream = new DataInputStream(mByteArrayInputStream); + try { + float v = mDataInputStream.readFloat(); + return String.format("%.6f",v); + }catch (Exception e){ + throw new ServiceException("modbus16转浮点数错误"); + } + finally { + mDataInputStream.close(); + mByteArrayInputStream.close(); + } + } + + /** + * 转16位无符号整形 + * @param value + * @return + */ + public static String toUnSign16(long value) { + long unSigned = value & 0xFFFF; + return unSigned +""; // 将字节数组转换为十六进制字符串 + } + + /** + * 32位有符号CDAB数据类型 + * @param value + * @return + */ + public static String toSign32_CDAB(long value) { + byte[] bytes = intToBytes2((int) value); + return bytesToInt2(bytes)+""; + } + + /** + * 32位无符号ABCD数据类型 + * @param value + * @return + */ + public static String toUnSign32_ABCD(long value) { + return Integer.toUnsignedString((int) value); + } + + /** + * 32位无符号CDAB数据类型 + * @param value + * @return + */ + public static String toUnSign32_CDAB(long value) { + byte[] bytes = intToBytes2((int) value); + int val = bytesToInt2(bytes); + return Integer.toUnsignedString(val); + } + + /** + * 转32位浮点数 ABCD + * @param bytes + * @return + */ + public static float toFloat32_ABCD(byte[] bytes) { + int intValue = (bytes[0] << 24) | ((bytes[1] & 0xFF) << 16) | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF); + return Float.intBitsToFloat(intValue); + } + + /** + * 转32位浮点数 CDAB + * @param bytes + * @return + */ + public static Float toFloat32_CDAB(byte[] bytes) { + int intValue = ((bytes[2] & 0xFF) << 24) | ((bytes[3] & 0xFF) << 16) | ((bytes[0] & 0xFF) << 8) | ((bytes[1] & 0xFF)) ; + return Float.intBitsToFloat(intValue); + } + + /** + * byte数组中取int数值,本方法适用于(低位在后,高位在前)的顺序。和intToBytes2()配套使用 + */ + public static int bytesToInt2(byte[] src) { + return (((src[2] & 0xFF) << 24) | ((src[3] & 0xFF) << 16) | ((src[0] & 0xFF) << 8) | (src[1] & 0xFF)); + } + + /** + * 将int数值转换为占四个字节的byte数组,本方法适用于(高位在前,低位在后)的顺序。 和bytesToInt2()配套使用 + */ + public static byte[] intToBytes2(int value) { + byte[] src = new byte[4]; + src[0] = (byte) ((value >> 24) & 0xFF); + src[1] = (byte) ((value >> 16) & 0xFF); + src[2] = (byte) ((value >> 8) & 0xFF); + src[3] = (byte) (value & 0xFF); + return src; + } + + + public static void main(String[] args) throws IOException { + Map map = new HashMap<>(); + map.put("%s", "180"); + String caculate = caculateReplace("%s*2", map); + System.out.println(caculate); + System.out.println(execute("%s*10",map)); + + String s4 = toUnSign16(-1); + System.out.println("转16位无符号:"+s4); + + String s1 = toSign32_CDAB(40100); + System.out.println("转32位有符号-CDAB序"+s1); + + String s2 = toUnSign32_ABCD(-10); + System.out.println("转32位无符号-ABCD序:"+s2); + + String s3 = toUnSign32_CDAB(123456789); + System.out.println("转32位无符号-CDAB序:"+s3); + + String hexToBytes = "41EE8000"; + byte[] bytes = ByteBufUtil.decodeHexDump(hexToBytes); + + float v1 = toFloat32_ABCD(bytes); + System.out.println("转32位浮点型-ABCD序:"+v1); + + String hexToBytes1= "800041EE"; + long i = Long.parseLong(hexToBytes1, 16); + System.out.println(i); + byte[] bytes1 = ByteBufUtil.decodeHexDump(hexToBytes1); + + float v2 = toFloat32_CDAB(bytes1); + System.out.println("转32位浮点型-CDAB序:"+v2); + + int signedShort = -32627; // 16位有符号整形 + // 将有符号短整型转换为无符号短整型 + int unSignedInt = signedShort & 0xFFFF; + // 输出结果 + System.out.println(unSignedInt); // 输出: 0 + + long l = Long.parseLong("00501F40", 16); + System.out.println(l); + + int val1 = -6553510; + byte[] bytes2 = intToBytes2(val1); + int i1 = bytesToInt2(bytes2); + System.out.println(i1); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DateUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DateUtils.java new file mode 100644 index 00000000..1da888b3 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DateUtils.java @@ -0,0 +1,233 @@ +package com.fastbee.common.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.Random; + +import org.apache.commons.lang3.time.DateFormatUtils; + +/** + * 时间工具类 + * + * @author ruoyi + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + public static String SS_MM_HH_DD_HH_YY = "ssmmHHddMMyy"; + + public static String YY_MM_DD_HH_MM_SS = "yy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() + { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() + { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTimeYY(Date date) + { + return DateFormatUtils.format(date, YY_MM_DD_HH_MM_SS); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) + { + if (str == null) + { + return null; + } + try + { + return parseDate(str.toString(), parsePatterns); + } + catch (ParseException e) + { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算两个时间差 + */ + public static String getDatePoor(Date endDate, Date nowDate) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + public static long getTimestamp(){ + return System.currentTimeMillis(); + } + + public static long getTimestampSeconds(){ + return System.currentTimeMillis()/1000; + } + + public static String generateRandomHex(int length) { + Random random = new Random(); + StringBuilder sb = new StringBuilder(length); + // 添加"D"作为开头 + sb.append("D"); + for (int i = 1; i < length; i++) { + int randomInt = random.nextInt(16); // 生成0到15的随机整数 + char hexChar = Character.toUpperCase(Character.forDigit(randomInt, 16)); // 将整数转换为十六进制字符并转为大写 + sb.append(hexChar); + } + return sb.toString(); + } + + public static void main(String[] args) { + Date date = DateUtils.dateTime(SS_MM_HH_DD_HH_YY, "434123181121"); + String s = DateUtils.dateTimeYY(date); + System.out.println(s); + + String s1 = generateRandomHex(12); + System.out.println(s1); + + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DictUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DictUtils.java new file mode 100644 index 00000000..c849fad0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DictUtils.java @@ -0,0 +1,186 @@ +package com.fastbee.common.utils; + +import java.util.Collection; +import java.util.List; +import com.alibaba.fastjson2.JSONArray; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.core.domain.entity.SysDictData; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.utils.spring.SpringUtils; + +/** + * 字典工具类 + * + * @author ruoyi + */ +public class DictUtils +{ + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) + { + JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(arrayCache)) + { + return arrayCache.toList(SysDictData.class); + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) + { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) + { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.isNotNull(datas)) + { + if (StringUtils.containsAny(separator, dictValue)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) + { + return CacheConstants.SYS_DICT_KEY + configKey; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DigestUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DigestUtils.java new file mode 100644 index 00000000..2f8ff025 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/DigestUtils.java @@ -0,0 +1,75 @@ +package com.fastbee.common.utils; + +import com.fastbee.common.utils.uuid.IdUtils; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.Validate; + +import java.io.IOException; +import java.io.InputStream; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.security.SecureRandom; + +@NoArgsConstructor +public class DigestUtils { + private static SecureRandom random = new SecureRandom(); + private static IdUtils idUtils = new IdUtils(0,0); + + public static String getId(){ + return String.valueOf(Math.abs(random.nextLong())); + } + + public static String nextId(){ + return String.valueOf(idUtils.nextId()); + } + + + public static byte[] genSalt(int numBytes) { + Validate.isTrue(numBytes > 0, "numBytes argument must be a positive integer (1 or larger)", (long)numBytes); + byte[] bytes = new byte[numBytes]; + random.nextBytes(bytes); + return bytes; + } + + public static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) { + try { + MessageDigest digest = MessageDigest.getInstance(algorithm); + if(salt != null) { + digest.update(salt); + } + + byte[] result = digest.digest(input); + + for(int i = 1; i < iterations; ++i) { + digest.reset(); + result = digest.digest(result); + } + + return result; + } catch (GeneralSecurityException var7) { + throw ExceptionUtils.unchecked(var7); + } + } + + public static byte[] digest(InputStream input, String algorithm) throws IOException { + try { + MessageDigest messageDigest = MessageDigest.getInstance(algorithm); + int bufferLength = 8192; + byte[] buffer = new byte[bufferLength]; + + for(int read = input.read(buffer, 0, bufferLength); read > -1; read = input.read(buffer, 0, bufferLength)) { + messageDigest.update(buffer, 0, read); + } + + return messageDigest.digest(); + } catch (GeneralSecurityException var6) { + throw ExceptionUtils.unchecked(var6); + } + } + + public static void main(String[] args) { + for (int i = 0; i < 10; i++) { + System.out.println(nextId()); + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/EncodeUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/EncodeUtils.java new file mode 100644 index 00000000..ce195ea8 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/EncodeUtils.java @@ -0,0 +1,157 @@ +package com.fastbee.common.utils; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringEscapeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.crypto.codec.Hex; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.regex.Pattern; + +public class EncodeUtils { + + private static final Logger logger = LoggerFactory.getLogger(EncodeUtils.class); + private static final String DEFAULT_URL_ENCODING = "UTF-8"; + private static final char[] BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); + private static Pattern p1 = Pattern.compile("<\\s*(script|link|style|iframe)([\\s\\S]+?)<\\/\\s*\\1\\s*>", 2); + private static Pattern p2 = Pattern.compile("\\s*on[a-z]+\\s*=\\s*(\"[^\"]+\"|'[^']+'|[^\\s]+)\\s*(?=>)", 2); + private static Pattern p3 = Pattern.compile("\\s*(href|src)\\s*=\\s*(\"\\s*(javascript|vbscript):[^\"]+\"|'\\s*(javascript|vbscript):[^']+'|(javascript|vbscript):[^\\s]+)\\s*(?=>)", 2); + private static Pattern p4 = Pattern.compile("epression\\((.|\\n)*\\);?", 2); + private static Pattern p5 = Pattern.compile("(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)", 2); + + public EncodeUtils() { + } + + public static String encodeHex(byte[] input) { + return new String(Hex.encode(input)); + } + + public static byte[] decodeHex(String input) { + try { + return Hex.decode(input); + } catch (Exception var2) { + throw ExceptionUtils.unchecked(var2); + } + } + + public static String encodeBase64(byte[] input) { + return new String(Base64.encodeBase64(input)); + } + + public static String encodeBase64(String input) { + try { + return new String(Base64.encodeBase64(input.getBytes("UTF-8"))); + } catch (UnsupportedEncodingException var2) { + return ""; + } + } + + public static byte[] decodeBase64(String input) { + return Base64.decodeBase64(input.getBytes()); + } + + public static String decodeBase64String(String input) { + try { + return new String(Base64.decodeBase64(input.getBytes()), "UTF-8"); + } catch (UnsupportedEncodingException var2) { + return ""; + } + } + + public static String encodeBase62(byte[] input) { + char[] chars = new char[input.length]; + + for(int i = 0; i < input.length; ++i) { + chars[i] = BASE62[(input[i] & 255) % BASE62.length]; + } + + return new String(chars); + } + + public static String encodeHtml(String html) { + return StringEscapeUtils.escapeHtml4(html); + } + + public static String decodeHtml(String htmlEscaped) { + return StringEscapeUtils.unescapeHtml4(htmlEscaped); + } + + public static String encodeXml(String xml) { + return StringEscapeUtils.escapeXml(xml); + } + + public static String decodeXml(String xmlEscaped) { + return StringEscapeUtils.unescapeXml(xmlEscaped); + } + + public static String encodeUrl(String part) { + return encodeUrl(part, "UTF-8"); + } + + public static String encodeUrl(String part, String encoding) { + if(part == null) { + return null; + } else { + try { + return URLEncoder.encode(part, encoding); + } catch (UnsupportedEncodingException var3) { + throw ExceptionUtils.unchecked(var3); + } + } + } + + public static String decodeUrl(String part) { + return decodeUrl(part, "UTF-8"); + } + + public static String decodeUrl(String part, String encoding) { + try { + return URLDecoder.decode(part, encoding); + } catch (UnsupportedEncodingException var3) { + throw ExceptionUtils.unchecked(var3); + } + } + + public static String decodeUrl2(String part) { + return decodeUrl(decodeUrl(part)); + } + + public static String xssFilter(String text) { + if(text == null) { + return null; + } else { + String oriValue = StringUtils.trim(text); + String value = p1.matcher(oriValue).replaceAll(""); + value = p2.matcher(value).replaceAll(""); + value = p3.matcher(value).replaceAll(""); + value = p4.matcher(value).replaceAll(""); + if(!StringUtils.startsWithIgnoreCase(value, "") && !StringUtils.startsWithIgnoreCase(value, "", ">"); + } + + if(logger.isInfoEnabled() && !value.equals(oriValue)) { + logger.info("xssFilter: {} to {}", text, value); + } + + return value; + } + } + + public static String sqlFilter(String text) { + if(text != null) { + String value = p5.matcher(text).replaceAll(""); + if(logger.isWarnEnabled() && !value.equals(text)) { + logger.warn("sqlFilter: {} to {}", text, value); + return ""; + } else { + return value; + } + } else { + return null; + } + } +} + diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtil.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtil.java new file mode 100644 index 00000000..927ac860 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtil.java @@ -0,0 +1,39 @@ +package com.fastbee.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 错误信息处理类。 + * + * @author ruoyi + */ +public class ExceptionUtil +{ + /** + * 获取exception的详细错误信息。 + */ + public static String getExceptionMessage(Throwable e) + { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + return sw.toString(); + } + + public static String getRootErrorMessage(Exception e) + { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) + { + return ""; + } + String msg = root.getMessage(); + if (msg == null) + { + return "null"; + } + return StringUtils.defaultString(msg); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtils.java new file mode 100644 index 00000000..7c355cb1 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ExceptionUtils.java @@ -0,0 +1,53 @@ +package com.fastbee.common.utils; + +import lombok.NoArgsConstructor; + +import javax.servlet.http.HttpServletRequest; +import java.io.PrintWriter; +import java.io.StringWriter; + +@NoArgsConstructor +public class ExceptionUtils { + + + public static Throwable getThrowable(HttpServletRequest request) { + Throwable ex = null; + if(request.getAttribute("exception") != null) { + ex = (Throwable)request.getAttribute("exception"); + } else if(request.getAttribute("javax.servlet.error.exception") != null) { + ex = (Throwable)request.getAttribute("javax.servlet.error.exception"); + } + + return ex; + } + + public static String getStackTraceAsString(Throwable e) { + if(e == null) { + return ""; + } else { + StringWriter stringWriter = new StringWriter(); + e.printStackTrace(new PrintWriter(stringWriter)); + return stringWriter.toString(); + } + } + + public static boolean isCausedBy(Exception ex, Class... causeExceptionClasses) { + for(Throwable cause = ex.getCause(); cause != null; cause = cause.getCause()) { + Class[] var3 = causeExceptionClasses; + int var4 = causeExceptionClasses.length; + + for(int var5 = 0; var5 < var4; ++var5) { + Class causeClass = var3[var5]; + if(causeClass.isInstance(cause)) { + return true; + } + } + } + + return false; + } + + public static RuntimeException unchecked(Exception e) { + return e instanceof RuntimeException?(RuntimeException)e:new RuntimeException(e); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/LogUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/LogUtils.java new file mode 100644 index 00000000..413031d7 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/LogUtils.java @@ -0,0 +1,18 @@ +package com.fastbee.common.utils; + +/** + * 处理并记录日志文件 + * + * @author ruoyi + */ +public class LogUtils +{ + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MapUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MapUtils.java new file mode 100644 index 00000000..e5951298 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MapUtils.java @@ -0,0 +1,66 @@ +package com.fastbee.common.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.fastbee.common.core.text.KeyValue; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * Map 工具类 + * + * @author 芋道源码 + */ +public class MapUtils { + + /** + * 从哈希表表中,获得 keys 对应的所有 value 数组 + * + * @param multimap 哈希表 + * @param keys keys + * @return value 数组 + */ + public static List getList(Multimap multimap, Collection keys) { + List result = new ArrayList<>(); + keys.forEach(k -> { + Collection values = multimap.get(k); + if (CollectionUtil.isEmpty(values)) { + return; + } + result.addAll(values); + }); + return result; + } + + /** + * 从哈希表查找到 key 对应的 value,然后进一步处理 + * 注意,如果查找到的 value 为 null 时,不进行处理 + * + * @param map 哈希表 + * @param key key + * @param consumer 进一步处理的逻辑 + */ + public static void findAndThen(Map map, K key, Consumer consumer) { + if (CollUtil.isEmpty(map)) { + return; + } + V value = map.get(key); + if (value == null) { + return; + } + consumer.accept(value); + } + + public static Map convertMap(List> keyValues) { + Map map = Maps.newLinkedHashMapWithExpectedSize(keyValues.size()); + keyValues.forEach(keyValue -> map.put(keyValue.getKey(), keyValue.getValue())); + return map; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Md5Utils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Md5Utils.java new file mode 100644 index 00000000..d2e3b2d5 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Md5Utils.java @@ -0,0 +1,82 @@ +package com.fastbee.common.utils; + +import lombok.NoArgsConstructor; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; + +@NoArgsConstructor +public class Md5Utils { + private static final String MD5 = "MD5"; + private static final String DEFAULT_ENCODING = "UTF-8"; + + + + public static String md5(String input) { + return md5((String) input, 1); + } + + public static String md5(String input, int iterations) { + try { + return EncodeUtils.encodeHex(DigestUtils.digest(input.getBytes("UTF-8"), "MD5", (byte[]) null, iterations)); + } catch (UnsupportedEncodingException var3) { + return ""; + } + } + + public static byte[] md5(byte[] input) { + return md5((byte[]) input, 1); + } + + public static byte[] md5(byte[] input, int iterations) { + return DigestUtils.digest(input, "MD5", (byte[]) null, iterations); + } + + public static byte[] md5(InputStream input) throws IOException { + return DigestUtils.digest(input, "MD5"); + } + + public static boolean isMd5(String str) { + int cnt = 0; + for (int i = 0; i < str.length(); ++i) { + switch (str.charAt(i)) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + ++cnt; + if (32 <= cnt) return true; + break; + case '/': + if ((i + 10) < str.length()) {// "/storage/" + char ch1 = str.charAt(i + 1); + char ch2 = str.charAt(i + 8); + if ('/' == ch2 && ('s' == ch1 || 'S' == ch1)) return true; + } + default: + cnt = 0; + break; + } + } + return false; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MessageUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MessageUtils.java new file mode 100644 index 00000000..b28412f1 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/MessageUtils.java @@ -0,0 +1,26 @@ +package com.fastbee.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import com.fastbee.common.utils.spring.SpringUtils; + +/** + * 获取i18n资源文件 + * + * @author ruoyi + */ +public class MessageUtils +{ + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) + { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/PageUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/PageUtils.java new file mode 100644 index 00000000..8de87f8d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/PageUtils.java @@ -0,0 +1,35 @@ +package com.fastbee.common.utils; + +import com.github.pagehelper.PageHelper; +import com.fastbee.common.core.page.PageDomain; +import com.fastbee.common.core.page.TableSupport; +import com.fastbee.common.utils.sql.SqlUtil; + +/** + * 分页工具类 + * + * @author ruoyi + */ +public class PageUtils extends PageHelper +{ + /** + * 设置请求分页数据 + */ + public static void startPage() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + + /** + * 清理分页的线程变量 + */ + public static void clearPage() + { + PageHelper.clearPage(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/SecurityUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/SecurityUtils.java new file mode 100644 index 00000000..dd3e1470 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/SecurityUtils.java @@ -0,0 +1,120 @@ +package com.fastbee.common.utils; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.exception.ServiceException; + +/** + * 安全服务工具类 + * + * @author ruoyi + */ +public class SecurityUtils +{ + /** + * 用户ID + **/ + public static Long getUserId() + { + try + { + return getLoginUser().getUserId(); + } + catch (Exception e) + { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取部门ID + **/ + public static Long getDeptId() + { + try + { + return getLoginUser().getDeptId(); + } + catch (Exception e) + { + throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户账户 + **/ + public static String getUsername() + { + try + { + return getLoginUser().getUsername(); + } + catch (Exception e) + { + throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() + { + try + { + return (LoginUser) getAuthentication().getPrincipal(); + } + catch (Exception e) + { + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取Authentication + */ + public static Authentication getAuthentication() + { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 生成BCryptPasswordEncoder密码 + * + * @param password 密码 + * @return 加密字符串 + */ + public static String encryptPassword(String password) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 判断密码是否相同 + * + * @param rawPassword 真实密码 + * @param encodedPassword 加密后字符 + * @return 结果 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ServletUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ServletUtils.java new file mode 100644 index 00000000..0eef316b --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ServletUtils.java @@ -0,0 +1,228 @@ +package com.fastbee.common.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import cn.hutool.extra.servlet.ServletUtil; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.text.Convert; + +/** + * 客户端工具类 + * + * @author ruoyi + */ +public class ServletUtils +{ + /** + * 获取String参数 + */ + public static String getParameter(String name) + { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) + { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) + { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) + { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) + { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) + { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParams(ServletRequest request) + { + final Map map = request.getParameterMap(); + return Collections.unmodifiableMap(map); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParamMap(ServletRequest request) + { + Map params = new HashMap<>(); + for (Map.Entry entry : getParams(request).entrySet()) + { + params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); + } + return params; + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() + { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() + { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + */ + public static void renderString(HttpServletResponse response, String string) + { + try + { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.contains("application/json")) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); + } + + /** + * 内容编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 内容解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + public static String getClientIP() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + return ServletUtil.getClientIP(request); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/StringUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/StringUtils.java new file mode 100644 index 00000000..b6e6742e --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/StringUtils.java @@ -0,0 +1,674 @@ +package com.fastbee.common.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.springframework.util.AntPathMatcher; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.text.StrFormatter; + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + /** + * 空字符串 + */ + private static final String NULLSTR = ""; + + /** + * 下划线 + */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + if (str == null) { + return NULLSTR; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + if (start > str.length()) { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + if (str == null) { + return NULLSTR; + } + + if (end < 0) { + end = str.length() + end; + } + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return NULLSTR; + } + + if (start < 0) { + start = 0; + } + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + if (isEmpty(params) || isEmpty(template)) { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && StringUtils.isBlank(string)) { + continue; + } + if (trim) { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的set列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param set 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) { + if (isEmpty(collection) || isEmpty(array)) { + return false; + } else { + for (String str : array) { + if (collection.contains(str)) { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + if (isEmpty(cs) || isEmpty(searchCharSequences)) { + return false; + } + for (CharSequence testStr : searchCharSequences) { + if (containsIgnoreCase(cs, testStr)) { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (i > 0) { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } else { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { + sb.append(SEPARATOR); + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) { + final StringBuilder sb = new StringBuilder(size); + if (s != null) { + final int len = s.length(); + if (s.length() <= size) { + for (int i = size - len; i > 0; i--) { + sb.append(c); + } + sb.append(s); + } else { + return s.substring(len - size, len); + } + } else { + for (int i = size; i > 0; i--) { + sb.append(c); + } + } + return sb.toString(); + } + + /*将字符串转小写,首字母大写,其他小写*/ + public static String upperCase(String str) { + char[] ch = str.toLowerCase().toCharArray(); + if (ch[0] >= 'a' && ch[0] <= 'z') { + ch[0] = (char) (ch[0] - 32); + } + return new String(ch); + } + + public static String toString(Object value) { + if (value == null) { + return "null"; + } + if (value instanceof ByteBuf) { + return ByteBufUtil.hexDump((ByteBuf) value); + } + if (!value.getClass().isArray()) { + return value.toString(); + } + + StringBuilder root = new StringBuilder(32); + toString(value, root); + return root.toString(); + } + + public static StringBuilder toString(Object value, StringBuilder builder) { + if (value == null) { + return builder; + } + + builder.append('['); + int start = builder.length(); + + if (value instanceof long[]) { + long[] array = (long[]) value; + for (long t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof int[]) { + int[] array = (int[]) value; + for (int t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof short[]) { + short[] array = (short[]) value; + for (short t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof byte[]) { + byte[] array = (byte[]) value; + for (byte t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof char[]) { + char[] array = (char[]) value; + for (char t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof double[]) { + double[] array = (double[]) value; + for (double t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof float[]) { + float[] array = (float[]) value; + for (float t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof boolean[]) { + boolean[] array = (boolean[]) value; + for (boolean t : array) { + builder.append(t).append(','); + } + + } else if (value instanceof String[]) { + String[] array = (String[]) value; + for (String t : array) { + builder.append(t).append(','); + } + + } else if (isArray1(value)) { + Object[] array = (Object[]) value; + for (Object t : array) { + toString(t, builder).append(','); + } + + } else if (value instanceof Object[]) { + Object[] array = (Object[]) value; + for (Object t : array) { + builder.append(t).append(','); + } + } + + int end = builder.length(); + if (end <= start) { + builder.append(']'); + } else { + builder.setCharAt(end - 1, ']'); + } + return builder; + } + + private static boolean isArray1(Object value) { + Class componentType = value.getClass().getComponentType(); + if (componentType == null) { + return false; + } + return componentType.isArray(); + } + + public static String leftPad(String str, int size, char ch) { + int length = str.length(); + int pads = size - length; + if (pads > 0) { + char[] result = new char[size]; + str.getChars(0, length, result, pads); + while (pads > 0) { + result[--pads] = ch; + } + return new String(result); + } + return str; + } + + /** + * 获取字符串中的数字 + * @param str + * @return + */ + public static Integer matcherNum(String str){ + Pattern pattern = Pattern.compile("\\d+"); + Matcher matcher = pattern.matcher(str); + while (matcher.find()){ + return Integer.parseInt(matcher.group()); + } + return 0; + } + + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Threads.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Threads.java new file mode 100644 index 00000000..bdba4628 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/Threads.java @@ -0,0 +1,99 @@ +package com.fastbee.common.utils; + +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 线程相关工具类. + * + * @author ruoyi + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍然超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ValidationUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ValidationUtils.java new file mode 100644 index 00000000..34cfd92a --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ValidationUtils.java @@ -0,0 +1,55 @@ +package com.fastbee.common.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import org.springframework.util.StringUtils; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validation; +import javax.validation.Validator; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * 校验工具类 + * + * @author fastbee + */ +public class ValidationUtils { + + private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$"); + + private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"); + + private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*"); + + public static boolean isMobile(String mobile) { + return StringUtils.hasText(mobile) + && PATTERN_MOBILE.matcher(mobile).matches(); + } + + public static boolean isURL(String url) { + return StringUtils.hasText(url) + && PATTERN_URL.matcher(url).matches(); + } + + public static boolean isXmlNCName(String str) { + return StringUtils.hasText(str) + && PATTERN_XML_NCNAME.matcher(str).matches(); + } + + public static void validate(Object object, Class... groups) { + Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + Assert.notNull(validator); + validate(validator, object, groups); + } + + public static void validate(Validator validator, Object object, Class... groups) { + Set> constraintViolations = validator.validate(object, groups); + if (CollUtil.isNotEmpty(constraintViolations)) { + throw new ConstraintViolationException(constraintViolations); + } + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/VerifyCodeUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/VerifyCodeUtils.java new file mode 100644 index 00000000..9b1de74b --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/VerifyCodeUtils.java @@ -0,0 +1,228 @@ +package com.fastbee.common.utils; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.OutputStream; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Random; +import javax.imageio.ImageIO; + +/** + * 验证码工具类 + * + * @author ruoyi + */ +public class VerifyCodeUtils +{ + // 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符 + public static final String VERIFY_CODES = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ"; + + private static Random random = new SecureRandom(); + + /** + * 使用系统默认字符源生成验证码 + * + * @param verifySize 验证码长度 + * @return + */ + public static String generateVerifyCode(int verifySize) + { + return generateVerifyCode(verifySize, VERIFY_CODES); + } + + /** + * 使用指定源生成验证码 + * + * @param verifySize 验证码长度 + * @param sources 验证码字符源 + * @return + */ + public static String generateVerifyCode(int verifySize, String sources) + { + if (sources == null || sources.length() == 0) + { + sources = VERIFY_CODES; + } + int codesLen = sources.length(); + Random rand = new Random(System.currentTimeMillis()); + StringBuilder verifyCode = new StringBuilder(verifySize); + for (int i = 0; i < verifySize; i++) + { + verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1))); + } + return verifyCode.toString(); + } + + /** + * 输出指定验证码图片流 + * + * @param w + * @param h + * @param os + * @param code + * @throws IOException + */ + public static void outputImage(int w, int h, OutputStream os, String code) throws IOException + { + int verifySize = code.length(); + BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + Random rand = new Random(); + Graphics2D g2 = image.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color[] colors = new Color[5]; + Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, + Color.ORANGE, Color.PINK, Color.YELLOW }; + float[] fractions = new float[colors.length]; + for (int i = 0; i < colors.length; i++) + { + colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)]; + fractions[i] = rand.nextFloat(); + } + Arrays.sort(fractions); + + g2.setColor(Color.GRAY);// 设置边框色 + g2.fillRect(0, 0, w, h); + + Color c = getRandColor(200, 250); + g2.setColor(c);// 设置背景色 + g2.fillRect(0, 2, w, h - 4); + + // 绘制干扰线 + Random random = new Random(); + g2.setColor(getRandColor(160, 200));// 设置线条的颜色 + for (int i = 0; i < 20; i++) + { + int x = random.nextInt(w - 1); + int y = random.nextInt(h - 1); + int xl = random.nextInt(6) + 1; + int yl = random.nextInt(12) + 1; + g2.drawLine(x, y, x + xl + 40, y + yl + 20); + } + + // 添加噪点 + float yawpRate = 0.05f;// 噪声率 + int area = (int) (yawpRate * w * h); + for (int i = 0; i < area; i++) + { + int x = random.nextInt(w); + int y = random.nextInt(h); + int rgb = getRandomIntColor(); + image.setRGB(x, y, rgb); + } + + shear(g2, w, h, c);// 使图片扭曲 + + g2.setColor(getRandColor(100, 160)); + int fontSize = h - 4; + Font font = new Font("Algerian", Font.ITALIC, fontSize); + g2.setFont(font); + char[] chars = code.toCharArray(); + for (int i = 0; i < verifySize; i++) + { + AffineTransform affine = new AffineTransform(); + affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), + (w / verifySize) * i + fontSize / 2, h / 2); + g2.setTransform(affine); + g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10); + } + + g2.dispose(); + ImageIO.write(image, "jpg", os); + } + + private static Color getRandColor(int fc, int bc) + { + if (fc > 255) { + fc = 255; + } + if (bc > 255) { + bc = 255; + } + int r = fc + random.nextInt(bc - fc); + int g = fc + random.nextInt(bc - fc); + int b = fc + random.nextInt(bc - fc); + return new Color(r, g, b); + } + + private static int getRandomIntColor() + { + int[] rgb = getRandomRgb(); + int color = 0; + for (int c : rgb) + { + color = color << 8; + color = color | c; + } + return color; + } + + private static int[] getRandomRgb() + { + int[] rgb = new int[3]; + for (int i = 0; i < 3; i++) + { + rgb[i] = random.nextInt(255); + } + return rgb; + } + + private static void shear(Graphics g, int w1, int h1, Color color) + { + shearX(g, w1, h1, color); + shearY(g, w1, h1, color); + } + + private static void shearX(Graphics g, int w1, int h1, Color color) + { + + int period = random.nextInt(2); + + boolean borderGap = true; + int frames = 1; + int phase = random.nextInt(2); + + for (int i = 0; i < h1; i++) + { + double d = (double) (period >> 1) + * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); + g.copyArea(0, i, w1, 1, (int) d, 0); + if (borderGap) + { + g.setColor(color); + g.drawLine((int) d, i, 0, i); + g.drawLine((int) d + w1, i, w1, i); + } + } + + } + + private static void shearY(Graphics g, int w1, int h1, Color color) + { + + int period = random.nextInt(40) + 10; // 50; + + boolean borderGap = true; + int frames = 20; + int phase = 7; + for (int i = 0; i < w1; i++) + { + double d = (double) (period >> 1) + * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); + g.copyArea(i, 0, 1, h1, 0, (int) d); + if (borderGap) + { + g.setColor(color); + g.drawLine(i, (int) d, i, 0); + g.drawLine(i, (int) d + h1, i, h1); + } + + } + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanUtils.java new file mode 100644 index 00000000..f0917602 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanUtils.java @@ -0,0 +1,110 @@ +package com.fastbee.common.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 工具类 + * + * @author ruoyi + */ +public class BeanUtils extends org.springframework.beans.BeanUtils +{ + /** Bean方法名中属性名开始的下标 */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** * 匹配getter方法的正则表达式 */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** * 匹配setter方法的正则表达式 */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean属性复制工具方法。 + * + * @param dest 目标对象 + * @param src 源对象 + */ + public static void copyBeanProp(Object dest, Object src) + { + try + { + copyProperties(src, dest); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + public static List getSetterMethods(Object obj) + { + // setter方法列表 + List setterMethods = new ArrayList(); + + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + + // 查找setter方法 + + for (Method method : methods) + { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) + { + setterMethods.add(method); + } + } + // 返回setter方法列表 + return setterMethods; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + public static List getGetterMethods(Object obj) + { + // getter方法列表 + List getterMethods = new ArrayList(); + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + // 查找getter方法 + for (Method method : methods) + { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) + { + getterMethods.add(method); + } + } + // 返回getter方法列表 + return getterMethods; + } + + /** + * 检查Bean方法名中的属性名是否相等。
+ * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + public static boolean isMethodPropEquals(String m1, String m2) + { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanValidators.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanValidators.java new file mode 100644 index 00000000..050a5ab4 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/bean/BeanValidators.java @@ -0,0 +1,24 @@ +package com.fastbee.common.utils.bean; + +import java.util.Set; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; + +/** + * bean对象属性验证 + * + * @author ruoyi + */ +public class BeanValidators +{ + public static void validateWithException(Validator validator, Object object, Class... groups) + throws ConstraintViolationException + { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) + { + throw new ConstraintViolationException(constraintViolations); + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/collection/CollectionUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/collection/CollectionUtils.java new file mode 100644 index 00000000..6194100b --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/collection/CollectionUtils.java @@ -0,0 +1,232 @@ +package com.fastbee.common.utils.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; + +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * @author gsb + * @date 2022/9/15 16:52 + */ +public class CollectionUtils { + + /*数组复制*/ + public static String[] copy(String[] source){ + if(isEmpty(source)){ + return null; + } + int len = source.length; + String[] arr = new String[len]; + for(int i=0; i < len; i ++){ + arr[i] = source[i]; + } + return arr; + } + + + /*数组连接*/ + public static String concat(String[] source, String split){ + if(isEmpty(source)){ + return null; + } + String result = ""; + for(int i=0; i < source.length; i ++){ + result = result.concat(source[i]); + if(i != source.length - 1){ + result = result.concat(split); + } + } + return result; + } + + public static boolean isEmpty(String[] source){ + if(null == source){ + return true; + } + if(0 == source.length){ + return true; + } + return false; + } + + public static boolean containsAny(Object source, Object... targets) { + return Arrays.asList(targets).contains(source); + } + + public static boolean isAnyEmpty(Collection... collections) { + return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty); + } + + public static List filterList(Collection from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(predicate).collect(Collectors.toList()); + } + + public static List distinct(Collection from, Function keyMapper) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return distinct(from, keyMapper, (t1, t2) -> t1); + } + + public static List distinct(Collection from, Function keyMapper, BinaryOperator cover) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return new ArrayList<>(convertMap(from, keyMapper, Function.identity(), cover).values()); + } + + public static List convertList(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertList(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static Set convertSet(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Set convertSet(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Map convertMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, Function.identity()); + } + + public static Map convertMap(Collection from, Function keyFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, Function.identity(), supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, mergeFunction, HashMap::new); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1, supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.toMap(keyFunc, valueFunc, mergeFunction, supplier)); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(t -> t, Collectors.toList()))); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream() + .collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toList()))); + } + + // 暂时没想好名字,先以 2 结尾噶 + public static Map> convertMultiMap2(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet()))); + } + + + public static boolean containsAny(Collection source, Collection candidates) { + return org.springframework.util.CollectionUtils.containsAny(source, candidates); + } + + public static T getFirst(List from) { + return !CollectionUtil.isEmpty(from) ? from.get(0) : null; + } + + public static T findFirst(List from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return null; + } + return from.stream().filter(predicate).findFirst().orElse(null); + } + + public static > V getMaxValue(List from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + T t = from.stream().max(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static > V getMinValue(List from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + T t = from.stream().min(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static > V getSumValue(List from, Function valueFunc, BinaryOperator accumulator) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + return from.stream().map(valueFunc).reduce(accumulator).get(); + } + + public static void addIfNotNull(Collection coll, T item) { + if (item == null) { + return; + } + coll.add(item); + } + + public static Collection singleton(T deptId) { + return deptId == null ? Collections.emptyList() : Collections.singleton(deptId); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/DateUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/DateUtils.java new file mode 100644 index 00000000..2b48cd92 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/DateUtils.java @@ -0,0 +1,173 @@ +package com.fastbee.common.utils.date; + +import cn.hutool.core.date.LocalDateTimeUtil; + +import java.time.*; +import java.util.Calendar; +import java.util.Date; + +/** + * 时间工具类 + * + * @author fastbee + */ +public class DateUtils { + + /** + * 时区 - 默认 + */ + public static final String TIME_ZONE_DEFAULT = "GMT+8"; + + /** + * 秒转换成毫秒 + */ + public static final long SECOND_MILLIS = 1000; + + public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + + public static final String FORMAT_HOUR_MINUTE_SECOND = "HH:mm:ss"; + + /** + * 将 LocalDateTime 转换成 Date + * + * @param date LocalDateTime + * @return LocalDateTime + */ + public static Date of(LocalDateTime date) { + // 将此日期时间与时区相结合以创建 ZonedDateTime + ZonedDateTime zonedDateTime = date.atZone(ZoneId.systemDefault()); + // 本地时间线 LocalDateTime 到即时时间线 Instant 时间戳 + Instant instant = zonedDateTime.toInstant(); + // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 + return Date.from(instant); + } + + /** + * 将 Date 转换成 LocalDateTime + * + * @param date Date + * @return LocalDateTime + */ + public static LocalDateTime of(Date date) { + // 转为时间戳 + Instant instant = date.toInstant(); + // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 + return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); + } + + @Deprecated + public static Date addTime(Duration duration) { + return new Date(System.currentTimeMillis() + duration.toMillis()); + } + + public static boolean isExpired(Date time) { + return System.currentTimeMillis() > time.getTime(); + } + + public static boolean isExpired(LocalDateTime time) { + LocalDateTime now = LocalDateTime.now(); + return now.isAfter(time); + } + + public static long diff(Date endTime, Date startTime) { + return endTime.getTime() - startTime.getTime(); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day) { + return buildTime(year, mouth, day, 0, 0, 0); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @param hour 小时 + * @param minute 分钟 + * @param second 秒 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day, + int hour, int minute, int second) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, mouth - 1); + calendar.set(Calendar.DAY_OF_MONTH, day); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒 + return calendar.getTime(); + } + + public static Date max(Date a, Date b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a.compareTo(b) > 0 ? a : b; + } + + public static LocalDateTime max(LocalDateTime a, LocalDateTime b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a.isAfter(b) ? a : b; + } + + /** + * 计算当期时间相差的日期 + * + * @param field 日历字段.
eg:Calendar.MONTH,Calendar.DAY_OF_MONTH,
Calendar.HOUR_OF_DAY等. + * @param amount 相差的数值 + * @return 计算后的日志 + */ + public static Date addDate(int field, int amount) { + return addDate(null, field, amount); + } + + /** + * 计算当期时间相差的日期 + * + * @param date 设置时间 + * @param field 日历字段 例如说,{@link Calendar#DAY_OF_MONTH} 等 + * @param amount 相差的数值 + * @return 计算后的日志 + */ + public static Date addDate(Date date, int field, int amount) { + if (amount == 0) { + return date; + } + Calendar c = Calendar.getInstance(); + if (date != null) { + c.setTime(date); + } + c.add(field, amount); + return c.getTime(); + } + + /** + * 是否今天 + * + * @param date 日期 + * @return 是否 + */ + public static boolean isToday(LocalDateTime date) { + return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now()); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/LocalDateTimeUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/LocalDateTimeUtils.java new file mode 100644 index 00000000..a761c412 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/date/LocalDateTimeUtils.java @@ -0,0 +1,63 @@ +package com.fastbee.common.utils.date; + +import cn.hutool.core.date.LocalDateTimeUtil; + +import java.time.Duration; +import java.time.LocalDateTime; + +/** + * 时间工具类,用于 {@link LocalDateTime} + * + * @author fastbee + */ +public class LocalDateTimeUtils { + + /** + * 空的 LocalDateTime 对象,主要用于 DB 唯一索引的默认值 + */ + public static LocalDateTime EMPTY = buildTime(1970, 1, 1); + + public static LocalDateTime addTime(Duration duration) { + return LocalDateTime.now().plus(duration); + } + + public static boolean beforeNow(LocalDateTime date) { + return date.isBefore(LocalDateTime.now()); + } + + public static boolean afterNow(LocalDateTime date) { + return date.isAfter(LocalDateTime.now()); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @return 指定时间 + */ + public static LocalDateTime buildTime(int year, int mouth, int day) { + return LocalDateTime.of(year, mouth, day, 0, 0, 0); + } + + public static LocalDateTime[] buildBetweenTime(int year1, int mouth1, int day1, + int year2, int mouth2, int day2) { + return new LocalDateTime[]{buildTime(year1, mouth1, day1), buildTime(year2, mouth2, day2)}; + } + + /** + * 判断当前时间是否在该时间范围内 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 是否 + */ + public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime) { + if (startTime == null || endTime == null) { + return false; + } + return LocalDateTimeUtil.isIn(LocalDateTime.now(), startTime, endTime); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileTypeUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileTypeUtils.java new file mode 100644 index 00000000..8b6cf08f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileTypeUtils.java @@ -0,0 +1,76 @@ +package com.fastbee.common.utils.file; + +import java.io.File; +import org.apache.commons.lang3.StringUtils; + +/** + * 文件类型工具类 + * + * @author ruoyi + */ +public class FileTypeUtils +{ + /** + * 获取文件类型 + *

+ * 例如: fastbee.txt, 返回: txt + * + * @param file 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(File file) + { + if (null == file) + { + return StringUtils.EMPTY; + } + return getFileType(file.getName()); + } + + /** + * 获取文件类型 + *

+ * 例如: fastbee.txt, 返回: txt + * + * @param fileName 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(String fileName) + { + int separatorIndex = fileName.lastIndexOf("."); + if (separatorIndex < 0) + { + return ""; + } + return fileName.substring(separatorIndex + 1).toLowerCase(); + } + + /** + * 获取文件类型 + * + * @param photoByte 文件字节码 + * @return 后缀(不含".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java new file mode 100644 index 00000000..b5a7ed32 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java @@ -0,0 +1,232 @@ +package com.fastbee.common.utils.file; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.exception.file.FileNameLengthLimitExceededException; +import com.fastbee.common.exception.file.FileSizeLimitExceededException; +import com.fastbee.common.exception.file.InvalidExtensionException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.uuid.Seq; + +/** + * 文件上传工具类 + * + * @author ruoyi + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = RuoYiConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = RuoYiConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + } + return extension; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUtils.java new file mode 100644 index 00000000..3fdcb711 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUtils.java @@ -0,0 +1,340 @@ +package com.fastbee.common.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import lombok.SneakyThrows; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.uuid.IdUtils; +import org.apache.commons.io.FilenameUtils; + +/** + * 文件处理工具类 + * + * @author ruoyi + */ +public class FileUtils +{ + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, RuoYiConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) + { + flag = file.delete(); + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 检查文件是否可下载 + * + * @param resource 需要下载的文件 + * @return true 正常 false 非法 + */ + public static boolean checkAllowDownload(String resource) + { + // 禁止目录上跳级别 + if (StringUtils.contains(resource, "..")) + { + return false; + } + + // 检查允许下载的文件规则 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 不在允许下载的文件规则 + return false; + } + + /** + * 下载文件名重新编码 + * + * @param request 请求对象 + * @param fileName 文件名 + * @return 编码后的文件名 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException + { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) + { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } + else if (agent.contains("Firefox")) + { + // 火狐浏览器 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } + else if (agent.contains("Chrome")) + { + // google浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + else + { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 下载文件名重新编码 + * + * @param response 响应对象 + * @param realFileName 真实文件名 + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException + { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); + response.setHeader("Content-disposition", contentDispositionValue.toString()); + response.setHeader("download-filename", percentEncodedFileName); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(String data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeUtf8String(data, file); + return file; + } + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(byte[] data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeBytes(data, file); + return file; + } + + /** + * 创建临时文件,无内容 + * 该文件会在 JVM 退出时,进行删除 + * + * @return 文件 + */ + @SneakyThrows + public static File createTempFile() { + // 创建文件,通过 UUID 保证唯一 + File file = File.createTempFile(IdUtil.simpleUUID(), null); + // 标记 JVM 退出时,自动删除 + file.deleteOnExit(); + return file; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/ImageUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/ImageUtils.java new file mode 100644 index 00000000..070a700f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/ImageUtils.java @@ -0,0 +1,98 @@ +package com.fastbee.common.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.utils.StringUtils; + +/** + * 图片处理工具类 + * + * @author ruoyi + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/MimeTypeUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/MimeTypeUtils.java new file mode 100644 index 00000000..bfbad86b --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.fastbee.common.utils.file; + +/** + * 媒体类型工具类 + * + * @author ruoyi + */ +public class MimeTypeUtils +{ + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + + public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + + public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb" }; + + public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // 视频格式 + "mp4", "avi", "rmvb", + // pdf + "pdf" }; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC16Utils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC16Utils.java new file mode 100644 index 00000000..cd0358b4 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC16Utils.java @@ -0,0 +1,128 @@ +package com.fastbee.common.utils.gateway; + + +import com.fastbee.common.utils.gateway.protocol.ByteUtils; + +public class CRC16Utils { + + //ff + private static int CRC_FF = 0x000000ff; + //01 + private static int CRC_01 = 0x00000001; + //04 + private static final int LENGTH_04 = 4; + //16进制 + private static final int OXFF = 0xff; + + /** + * 低位在前,高位在后 + * + * @param bytes + * @return + */ + public static String getCRC(byte[] bytes) { + return getCRC(bytes, true); + } + + /** + * @param bytes + * @param lb 是否低位在前, 高位在后 + * @return + */ + public static String getCRC(byte[] bytes, boolean lb) { + int CRC = 0x0000ffff; + int POLYNOMIAL = 0x0000a001; + + int i, j; + for (i = 0; i < bytes.length; i++) { + CRC ^= ((int) bytes[i] & 0x000000ff); + for (j = 0; j < 8; j++) { + if ((CRC & 0x00000001) != 0) { + CRC >>= 1; + CRC ^= POLYNOMIAL; + } else { + CRC >>= 1; + } + } + } + + //结果转换为16进制 + String result = Integer.toHexString(CRC).toUpperCase(); + if (result.length() != 4) { + StringBuffer sb = new StringBuffer("0000"); + result = sb.replace(4 - result.length(), 4, result).toString(); + } + + if (lb) { // 低位在前, 高位在后 + result = result.substring(2, 4) + result.substring(0, 2); + } + + return result; + } + + /** + * 计算CRC校验和 + * + * @param bytes + * @return 返回 byte[] + */ + public static byte[] getCrc16Byte(byte[] bytes) { + + //寄存器全为1 + int CRC_16 = 0x0000ffff; + // 多项式校验值 + int POLYNOMIAL = 0x0000a001; + for (byte aByte : bytes) { + CRC_16 ^= ((int) aByte & CRC_FF); + for (int j = 0; j < 8; j++) { + if ((CRC_16 & CRC_01) != 0) { + CRC_16 >>= 1; + CRC_16 ^= POLYNOMIAL; + } else { + CRC_16 >>= 1; + } + } + } + // 低8位 ,高8位 + return new byte[]{(byte) (CRC_16 & OXFF), (byte) (CRC_16 >> 8 & OXFF)}; + } + + public static byte[] CRC(byte[] source) { + source[2] = (byte) ((int) source[2] * 2); + byte[] result = new byte[source.length + 2]; + byte[] crc16Byte = CRC16Utils.getCrc16Byte(source); + System.arraycopy(source, 0, result, 0, source.length); + System.arraycopy(crc16Byte, 0, result, result.length - 2, 2); + return result; + } + + public static byte CRC8(byte[] buffer) { + int crci = 0xFF; //起始字节FF + for (int j = 0; j < buffer.length; j++) { + crci ^= buffer[j] & 0xFF; + for (int i = 0; i < 8; i++) { + if ((crci & 1) != 0) { + crci >>= 1; + crci ^= 0xB8; //多项式当中的那个啥的,不同多项式不一样 + } else { + crci >>= 1; + } + } + } + return (byte) crci; + } + + + public static void main(String[] args)throws Exception { + String hex = "01000002"; + byte[] bytes = ByteUtils.hexToByte(hex); + String crc = getCRC(bytes); + System.out.println(crc); + String crc8 = "680868333701120008C100"; + byte[] byte8 = ByteUtils.hexToByte(crc8); + int b = CRC8(byte8); + System.out.println((int) b); + } + + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC8Utils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC8Utils.java new file mode 100644 index 00000000..c36e6dcd --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/CRC8Utils.java @@ -0,0 +1,93 @@ +package com.fastbee.common.utils.gateway; + +import com.fastbee.common.utils.gateway.protocol.ByteUtils; + +/** + * @author gsb + * @date 2023/5/19 11:33 + */ +public class CRC8Utils { + + + //TODO:-----------------根据C写法转译-------------------------------------- + /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ + + /** + * CRC8 校验 多项式 x8+x2+x+1 + * @param data + * @return 校验和 + */ + public static byte calcCrc8_E5(byte[] data){ + byte crc = 0; + for (int j = 0; j < data.length; j++) { + crc ^= data[j]; + for (int i = 0; i < 8; i++) { + if ((crc & 0x80) != 0) { + crc = (byte) ((crc)<< 1); + crc ^= 0xE5; + } else { + crc = (byte) ((crc)<< 1); + } + } + } + return crc; + } + + + + + + static byte[] crc8_tab = {(byte) 0, (byte) 94, (byte) 188, (byte) 226, (byte) 97, (byte) 63, (byte) 221, (byte) 131, (byte) 194, (byte) 156, (byte) 126, (byte) 32, (byte) 163, (byte) 253, (byte) 31, (byte) 65, (byte) 157, (byte) 195, (byte) 33, (byte) 127, (byte) 252, (byte) 162, (byte) 64, (byte) 30, (byte) 95, (byte) 1, (byte) 227, (byte) 189, (byte) 62, (byte) 96, (byte) 130, (byte) 220, (byte) 35, (byte) 125, (byte) 159, (byte) 193, (byte) 66, (byte) 28, (byte) 254, (byte) 160, (byte) 225, (byte) 191, (byte) 93, (byte) 3, (byte) 128, (byte) 222, (byte) 60, (byte) 98, (byte) 190, (byte) 224, (byte) 2, (byte) 92, (byte) 223, (byte) 129, (byte) 99, (byte) 61, (byte) 124, (byte) 34, (byte) 192, (byte) 158, (byte) 29, (byte) 67, (byte) 161, (byte) 255, (byte) 70, (byte) 24, + (byte) 250, (byte) 164, (byte) 39, (byte) 121, (byte) 155, (byte) 197, (byte) 132, (byte) 218, (byte) 56, (byte) 102, (byte) 229, (byte) 187, (byte) 89, (byte) 7, (byte) 219, (byte) 133, (byte) 103, (byte) 57, (byte) 186, (byte) 228, (byte) 6, (byte) 88, (byte) 25, (byte) 71, (byte) 165, (byte) 251, (byte) 120, (byte) 38, (byte) 196, (byte) 154, (byte) 101, (byte) 59, (byte) 217, (byte) 135, (byte) 4, (byte) 90, (byte) 184, (byte) 230, (byte) 167, (byte) 249, (byte) 27, (byte) 69, (byte) 198, (byte) 152, (byte) 122, (byte) 36, (byte) 248, (byte) 166, (byte) 68, (byte) 26, (byte) 153, (byte) 199, (byte) 37, (byte) 123, (byte) 58, (byte) 100, (byte) 134, (byte) 216, (byte) 91, (byte) 5, (byte) 231, (byte) 185, (byte) 140, (byte) 210, (byte) 48, (byte) 110, (byte) 237, + (byte) 179, (byte) 81, (byte) 15, (byte) 78, (byte) 16, (byte) 242, (byte) 172, (byte) 47, (byte) 113, (byte) 147, (byte) 205, (byte) 17, (byte) 79, (byte) 173, (byte) 243, (byte) 112, (byte) 46, (byte) 204, (byte) 146, (byte) 211, (byte) 141, (byte) 111, (byte) 49, (byte) 178, (byte) 236, (byte) 14, (byte) 80, (byte) 175, (byte) 241, (byte) 19, (byte) 77, (byte) 206, (byte) 144, (byte) 114, (byte) 44, (byte) 109, (byte) 51, (byte) 209, (byte) 143, (byte) 12, (byte) 82, (byte) 176, (byte) 238, (byte) 50, (byte) 108, (byte) 142, (byte) 208, (byte) 83, (byte) 13, (byte) 239, (byte) 177, (byte) 240, (byte) 174, (byte) 76, (byte) 18, (byte) 145, (byte) 207, (byte) 45, (byte) 115, (byte) 202, (byte) 148, (byte) 118, (byte) 40, (byte) 171, (byte) 245, (byte) 23, (byte) 73, (byte) 8, + (byte) 86, (byte) 180, (byte) 234, (byte) 105, (byte) 55, (byte) 213, (byte) 139, (byte) 87, (byte) 9, (byte) 235, (byte) 181, (byte) 54, (byte) 104, (byte) 138, (byte) 212, (byte) 149, (byte) 203, (byte) 41, (byte) 119, (byte) 244, (byte) 170, (byte) 72, (byte) 22, (byte) 233, (byte) 183, (byte) 85, (byte) 11, (byte) 136, (byte) 214, (byte) 52, (byte) 106, (byte) 43, (byte) 117, (byte) 151, (byte) 201, (byte) 74, (byte) 20, (byte) 246, (byte) 168, (byte) 116, (byte) 42, (byte) 200, (byte) 150, (byte) 21, (byte) 75, (byte) 169, (byte) 247, (byte) 182, (byte) 232, (byte) 10, (byte) 84, (byte) 215, (byte) 137, (byte) 107, 53}; + + /** + * 计算数组的CRC8校验值 + * + * @param data 需要计算的数组 + * @return CRC8校验值 + */ + public static byte calcCrc8(byte[] data) { + return calcCrc8(data, 0, data.length, (byte) 0); + } + + /** + * 计算CRC8校验值 + * + * @param data 数据 + * @param offset 起始位置 + * @param len 长度 + * @return 校验值 + */ + public static byte calcCrc8(byte[] data, int offset, int len) { + return calcCrc8(data, offset, len, (byte) 0); + } + + /** + * 计算CRC8校验值 + * + * @param data 数据 + * @param offset 起始位置 + * @param len 长度 + * @param preval 之前的校验值 + * @return 校验值 + */ + public static byte calcCrc8(byte[] data, int offset, int len, byte preval) { + byte ret = preval; + for (int i = offset; i < (offset + len); ++i) { + ret = crc8_tab[(0x00ff & (ret ^ data[i]))]; + } + return ret; + } + + // 测试 + public static void main(String[] args) { + String hex = "333701120008C100"; + byte[] bytes = ByteUtils.hexToByte(hex); + byte crc = CRC8Utils.calcCrc8_E5(bytes); + System.out.println("" + Integer.toHexString(0x00ff & crc)); + } + + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/Topics.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/Topics.java new file mode 100644 index 00000000..9eab9cf6 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/Topics.java @@ -0,0 +1,16 @@ +package com.fastbee.common.utils.gateway.mq; + +import lombok.Data; + +/** + * @author bill + */ +@Data +public class Topics { + + + private String topicName; + private Integer qos =0; + private String desc; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsPost.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsPost.java new file mode 100644 index 00000000..f9f31847 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsPost.java @@ -0,0 +1,14 @@ +package com.fastbee.common.utils.gateway.mq; + +import lombok.Data; + +/** + * @author gsb + * @date 2023/2/27 13:41 + */ +@Data +public class TopicsPost { + + private String[] topics; + private int[] qos; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsUtils.java new file mode 100644 index 00000000..78f5b659 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/mq/TopicsUtils.java @@ -0,0 +1,306 @@ +package com.fastbee.common.utils.gateway.mq; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.mq.message.DeviceDownMessage; +import com.fastbee.common.enums.ThingsModelType; +import com.fastbee.common.enums.TopicType; +import com.fastbee.common.utils.collection.CollectionUtils; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + + +import java.util.*; + +/** + * topic工具类 + * + * @author gsb + * @date 2022/9/15 16:49 + */ +@Slf4j +@Component +public class TopicsUtils { + + @Value("${server.broker.enabled}") + private Boolean enabled; + + /** + * 拼接topic + * + * @param productId 产品id + * @param serialNumber 设备编号 + * @param type 主题类型 + * @return topic + */ + public String buildTopic(Long productId, String serialNumber, TopicType type) { + /* + * 订阅属性: + * 如果启动emq 则为 /+/+/property/post + * 如果启动netty的mqttBroker 则为 /{productId}/{serialNumber}/property/post + * + * 发布都为:/{productId}/{serialNumber}/property/get + */ + String product = String.valueOf(productId); + if (null == productId || productId == -1L || productId == 0L) { + product = "+"; + } + if (com.fastbee.common.utils.StringUtils.isEmpty(serialNumber)) { + serialNumber = "+"; + } + if (type.getType() == 0) { + return enabled ? "/" + product + "/" + serialNumber + type.getTopicSuffix() : FastBeeConstant.MQTT.PREDIX + type.getTopicSuffix(); + } else { + return "/" + product + "/" + serialNumber + type.getTopicSuffix(); + } + } + + + /** + * 获取所有可订阅的主题 + * + * @return 订阅主题列表 + */ + public TopicsPost getAllPost() { + List qos = new ArrayList<>(); + List topics = new ArrayList<>(); + TopicsPost post = new TopicsPost(); + for (TopicType topicType : TopicType.values()) { + if (topicType.getType() == 0) { + String topic = this.buildTopic(0L, null, topicType); + topics.add(topic); + qos.add(1); + } + } + post.setTopics(topics.toArray(new String[0])); + int[] ints = Arrays.stream(qos.toArray(new Integer[0])).mapToInt(Integer::valueOf).toArray(); + post.setQos(ints); + return post; + } + + /** + * 获取所有get topic + * + * @param isSimulate 是否是设备模拟 + * @return list + */ + public static List getAllGet(boolean isSimulate) { + List result = new ArrayList<>(); + for (TopicType type : TopicType.values()) { + if (type.getType() == 4) { + Topics topics = new Topics(); + topics.setTopicName(type.getTopicSuffix()); + topics.setDesc(type.getMsg()); + topics.setQos(1); + result.add(topics); + if (isSimulate && type == TopicType.PROPERTY_GET) { + result.remove(topics); + } + } + } + return result; + } + + + /** + * 替换topic中的产品编码和设备编码,唯一作用是在系统收到来自网关设备上报子设备消息时将topic进行替换 + * + * @param orgTopic String 原始topic + * @param productId String 目标产品编码 + * @param serialNumber String 目标设备编码 + * @return 替换产品编码和设备编码后的新topic + */ + public String topicSubDevice(String orgTopic, Long productId, String serialNumber) { + if (com.fastbee.common.utils.StringUtils.isEmpty(orgTopic)) { + return orgTopic; + } + String[] splits = orgTopic.split("/"); + StringBuilder sb = new StringBuilder(splits[0]) + .append("/") + .append(productId) + .append("/") + .append(serialNumber); + for (int index = 3; index < splits.length; index++) { + sb.append("/").append(splits[index]); + } + return sb.toString(); + } + + /** + * 从topic中获取IMEI号 IMEI即是设备编号 + * + * @param topic /{productId}/{serialNumber}/property/post + * @return serialNumber + */ + @SneakyThrows + public Long parseProductId(String topic) { + String[] values = topic.split("/"); + return Long.parseLong(values[1]); + } + + + /** + * 从topic中获取IMEI号 IMEI即是设备编号 + * + * @param topic /{productId}/{serialNumber}/property/post + * @return serialNumber + */ + @SneakyThrows + public String parseSerialNumber(String topic) { + String[] values = topic.split("/"); + return values[2]; + } + + /** + * 获取topic 判断字段 name + **/ + public String parseTopicName(String topic) { + String[] values = topic.split("/"); + return values[3]; + } + + /** + * 获取topic 判断字段 name + **/ + public String parseTopicName4(String topic) { + String[] values = topic.split("/"); + return values[4]; + } + + /** + * 从topic解析物模型类型 + * + * @param topic /{productId}/{serialNumber}/property/post + * @return 物模型类型 + */ + @SneakyThrows + public String getThingsModel(String topic) { + String[] split = topic.split("/"); + return split[2].toUpperCase(); + } + + /** + * 检查topic的合法性 + * + * @param topicNameList 主题list + * @return 验证结果 + */ + public static boolean validTopicFilter(List topicNameList) { + for (String topicName : topicNameList) { + if (com.fastbee.common.utils.StringUtils.isEmpty(topicName)) { + return false; + } + /*以#或+符号开头的、以/符号结尾的及不存在/符号的订阅按非法订阅处理*/ + if (StringUtils.startsWithIgnoreCase(topicName, "#") || StringUtils.startsWithIgnoreCase(topicName, "+") || StringUtils.endsWithIgnoreCase(topicName, "/") || !topicName.contains("/")) { + return false; + } + if (topicName.contains("#")) { + /*不是以/#字符串结尾的订阅按非法订阅处理*/ + if (!StringUtils.endsWithIgnoreCase(topicName, "/#")) { + return false; + } + /*如果出现多个#符号的订阅按非法订阅处理*/ + if (StringUtils.countOccurrencesOf(topicName, "#") > 1) { + return false; + } + } + if (topicName.contains("+")) { + /*如果+符号和/+字符串出现的次数不等的情况按非法订阅处理*/ + if (StringUtils.countOccurrencesOf(topicName, "+") != StringUtils.countOccurrencesOf(topicName, "/+")) { + return false; + } + } + } + return true; + } + + /** + * 判断topic与topicFilter是否匹配,topic与topicFilter需要符合协议规范 + * + * @param topic: 主题 + * @param topicFilter: 主题过滤器 + * @return boolean + * @author ZhangJun + * @date 23:57 2021/2/27 + */ + public static boolean matchTopic(String topic, String topicFilter) { + if (topic.contains("+") || topic.contains("#")) { + + String[] topicSpilts = topic.split("/"); + String[] filterSpilts = topicFilter.split("/"); + + if (!topic.contains("#") && topicSpilts.length < filterSpilts.length) { + return false; + } + + String level; + for (int i = 0; i < topicSpilts.length; i++) { + level = topicSpilts[i]; + if (!level.equals(filterSpilts[i]) && !level.equals("+") && !level.equals("#")) { + return false; + } + } + } else { + return topic.equals(topicFilter); + } + return true; + } + + /** + * 根据指定topic搜索所有订阅的topic + * 指定的topic没有通配符,但是订阅的时候可能会存在通配符,所以有个查找的过程 + * + * @param topic 主题 + * @return 返回的所有主题 + */ + public static List searchTopic(String topic) { + try { + List topicList = new ArrayList<>(); + topicList.add(topic); + /*先处理#通配符*/ + String[] filterDup = topic.split("/"); + int[] source = new int[filterDup.length]; + String itemTopic = ""; + for (int i = 0; i < filterDup.length; i++) { + String item = itemTopic.concat("#"); + topicList.add(item); + itemTopic = itemTopic.concat(filterDup[i]).concat("/"); + source[i] = i; + continue; + } + /*处理+通配符*/ + Map, Boolean> map = TopicsUtils.handle(source); + for (List key : map.keySet()) { + String[] arr = CollectionUtils.copy(filterDup); + for (Integer index : key) { + arr[index] = "+"; + } + String newTopic = CollectionUtils.concat(arr, "/"); + topicList.add(newTopic); + } + return topicList; + } catch (Exception e) { + log.error("=>查询topic异常", e); + return null; + } + } + + + public static Map, Boolean> handle(int[] src) { + int nCnt = src.length; + int nBit = (0xFFFFFFFF >>> (32 - nCnt)); + Map, Boolean> map = new HashMap<>(); + for (int i = 1; i <= nBit; i++) { + List list = new ArrayList<>(); + for (int j = 0; j < nCnt; j++) { + if ((i << (31 - j)) >> 31 == -1) { + list.add(j); + } + } + map.put(list, true); + } + return map; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/ByteUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/ByteUtils.java new file mode 100644 index 00000000..796e4534 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/ByteUtils.java @@ -0,0 +1,958 @@ +package com.fastbee.common.utils.gateway.protocol; + + +import com.fastbee.common.exception.ServiceException; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + + +public class ByteUtils { + + + // public static Payload resolvePayload(byte[] content, short start, ModbusCode code) { + // Payload payload; + // switch (code) { + // case Read01: + // case Read02: + // payload = new RealCoilPayload(start, content); break; + // case Read03: + // case Read04: + // payload = new ReadPayload(content, start); break; + // default: + // payload = WritePayload.getInstance(); + // } + // + // return payload; + // } + + public static Write10Build write10Build(Object... args) { + int num = 0; List bytes = new ArrayList<>(); + for(Object arg : args) { + if(arg instanceof Integer) { + num += 2; + bytes.add(getBytes((Integer) arg)); + } else if(arg instanceof Long) { + num += 4; + bytes.add(getBytes((Long) arg)); + } else if(arg instanceof Float) { + num += 2; + bytes.add(getBytes((Float) arg)); + } else if(arg instanceof Double) { + num += 4; + bytes.add(getBytes((Double) arg)); + } else if(arg instanceof Short) { + num += 1; + bytes.add(getBytesOfReverse((Short) arg)); + } else if(arg instanceof Byte) { + num += 1; + bytes.add(new byte[]{0x00, (byte) arg}); + } else if(arg instanceof String) { + byte[] bytes1 = arg.toString().getBytes(StandardCharsets.UTF_8); + if(bytes1.length % 2 != 0) { + num += bytes1.length / 2 + 1; + byte[] addMessage = new byte[bytes1.length + 1]; + addBytes(addMessage, bytes1, 0); + bytes.add(addMessage); + } else { + num += bytes1.length / 2; + bytes.add(bytes1); + } + } else { + throw new ServiceException("不支持的数据类型"); + } + } + + Integer length = bytes.stream().map(item -> item.length).reduce((a, b) -> a + b).get(); + byte[] write = new byte[length]; + + int index = 0; + for(int i=0; i> 8); + return bytes; + } + + /** + * 将short数据类型转化成Byte数组 + * @see ByteOrder#BIG_ENDIAN + * @param data short值 + * @return byte[]数组 + */ + public static byte[] getBytesOfReverse(short data) { + byte[] bytes = new byte[2]; + bytes[1] = (byte) (data & 0xff); + bytes[0] = (byte) ((data & 0xff00) >> 8); + return bytes; + } + + /** + * @see ByteOrder#LITTLE_ENDIAN + * @param bytes + * @param offset + * @return + */ + public static short bytesToShort(byte[] bytes, int offset) { + return (short) ((0xff & bytes[0 + offset]) | (0xff00 & (bytes[1 + offset] << 8))); + } + + /** + * 将字节数组转换成short数据 + * @see ByteOrder#BIG_ENDIAN + * @param bytes 字节数组 + * @return short值 + */ + public static short bytesToShortOfReverse(byte[] bytes) { + return ByteUtils.bytesToShortOfReverse(bytes, 0); + } + + /** + * 将字节数组转换成short数据,采用倒序的表达方式 + * @param bytes 字节数组 + * @param offset 起始位置 + * @return short值 + */ + public static short bytesToShortOfReverse(byte[] bytes, int offset) { + return (short) ((0xff & bytes[1 + offset]) | (0xff00 & (bytes[0 + offset] << 8))); + } + + /** + * 将int数据类型转化成Byte数组 + * @see ByteOrder#LITTLE_ENDIAN + * @param data int值 + * @return byte[]数组 + */ + public static byte[] getBytes(int data) { + byte[] bytes = new byte[4]; + bytes[0] = (byte) (data & 0xff); + bytes[1] = (byte) ((data >> 8) & 0xff); + bytes[2] = (byte) ((data >> 16) & 0xff); + bytes[3] = (byte) ((data >> 24) & 0xff); + return bytes; + } + + /** + * 将int数据类型转化成Byte数组 倒序 + * @see ByteOrder#BIG_ENDIAN + * @param data int值 + * @return byte[]数组 + */ + public static byte[] getBytesOfReverse(int data) { + byte[] src = new byte[4]; + src[0] = (byte) ((data >> 24) & 0xFF); + src[1] = (byte) ((data >> 16) & 0xFF); + src[2] = (byte) ((data >> 8) & 0xFF); + src[3] = (byte) (data & 0xFF); + return src; + } + + /** + * 将long数据类型转化成Byte数组 + * @see ByteOrder#LITTLE_ENDIAN + * @param data long值 + * @return byte[]数组 + */ + public static byte[] getBytes(long data) { + byte[] bytes = new byte[8]; + bytes[0] = (byte) (data & 0xff); + bytes[1] = (byte) ((data >> 8) & 0xff); + bytes[2] = (byte) ((data >> 16) & 0xff); + bytes[3] = (byte) ((data >> 24) & 0xff); + bytes[4] = (byte) ((data >> 32) & 0xff); + bytes[5] = (byte) ((data >> 40) & 0xff); + bytes[6] = (byte) ((data >> 48) & 0xff); + bytes[7] = (byte) ((data >> 56) & 0xff); + return bytes; + } + + /** + * 将long数据类型转化成Byte数组 倒序 + * @see ByteOrder#BIG_ENDIAN + * @param data long值 + * @return byte[]数组 + */ + public static byte[] getBytesOfReverse(long data) { + byte[] bytes = new byte[8]; + bytes[7] = (byte) (data & 0xff); + bytes[6] = (byte) ((data >> 8) & 0xff); + bytes[5] = (byte) ((data >> 16) & 0xff); + bytes[4] = (byte) ((data >> 24) & 0xff); + bytes[3] = (byte) ((data >> 32) & 0xff); + bytes[2] = (byte) ((data >> 40) & 0xff); + bytes[1] = (byte) ((data >> 48) & 0xff); + bytes[0] = (byte) ((data >> 56) & 0xff); + return bytes; + } + + /** + * 将float数据类型转化成Byte数组 + * @see ByteOrder#LITTLE_ENDIAN + * @param data float值 + * @return byte[]数组 + */ + public static byte[] getBytes(float data) { + int intBits = Float.floatToIntBits(data); + return getBytes(intBits); + } + + /** + * 将float数据类型转化成Byte数组 倒序 + * @see ByteOrder#BIG_ENDIAN + * @param data float值 + * @return byte[]数组 + */ + public static byte[] getBytesOfReverse(float data) { + int intBits = Float.floatToIntBits(data); + return getBytesOfReverse(intBits); + } + + /** + * 将double数据类型转化成Byte数组 + * @see ByteOrder#LITTLE_ENDIAN + * @param data double值 + * @return byte[]数组 + */ + public static byte[] getBytes(double data) { + long intBits = Double.doubleToLongBits(data); + return getBytes(intBits); + } + + /** + * 将double数据类型转化成Byte数组 倒序 + * @see ByteOrder#BIG_ENDIAN + * @param data double值 + * @return byte[]数组 + */ + public static byte[] getBytesOfReverse(double data) { + long intBits = Double.doubleToLongBits(data); + return getBytesOfReverse(intBits); + } + + /** + * 字符串转字节数组(UTF-8) + * @param data + * @return + */ + public static byte[] getBytes(String data) { + return data.getBytes(StandardCharsets.UTF_8); + } + + /** + * 将字符串转换成byte[]数组 + * @param data 字符串值 + * @param charsetName 编码方式 + * @return 字节数组 + */ + public static byte[] getBytes(String data, String charsetName) { + Charset charset = Charset.forName(charsetName); + return data.getBytes(charset); + } + + /* + * 把16进制字符串转换成字节数组 + * @param hex + * @return + */ + public static byte[] hexToByte(String hexStr) { + if(StringUtils.isBlank(hexStr)) { + return null; + } + if(hexStr.length()%2 != 0) {//长度为单数 + hexStr = "0" + hexStr;//前面补0 + } + + char[] chars = hexStr.toCharArray(); + int len = chars.length/2; + byte[] bytes = new byte[len]; + for (int i = 0; i < len; i++) { + int x = i*2; + bytes[i] = (byte)Integer.parseInt(String.valueOf(new char[]{chars[x], chars[x+1]}), 16); + } + return bytes; + + } + + public static byte getByte(byte[] src, int offset) { + return src[offset]; + } + + /** + * 字节数组转16进制 + * @param bArray + * @return + */ + public static final String bytesToHex(byte[] bArray) { + StringBuffer sb = new StringBuffer(bArray.length); + String sTemp; + for (int i = 0; i < bArray.length; i++) { + sTemp = Integer.toHexString(0xFF & bArray[i]); + if (sTemp.length() < 2) sb.append(0); + sb.append(sTemp.toUpperCase()); + } + return sb.toString(); + } + + /** + * 字节数组转16进制且格式化十六进制 + * @param bArray + * @return + */ + public static final String bytesToHexByFormat(byte[] bArray) { + StringBuffer sb = new StringBuffer(bArray.length); + String sTemp; + for (int i = 0; i < bArray.length; i++) { + sTemp = Integer.toHexString(0xFF & bArray[i]); + if (sTemp.length() < 2) sb.append(0); + sb.append(sTemp.toUpperCase()).append(' '); + } + return sb.toString(); + } + + /** + * 字节数组转16进制 + * @param src + * @return + */ + public static final String bytesToHex(byte[] src, int offset, int length) { + byte[] bArray = ArrayUtils.subarray(src, offset, offset + length); + return bytesToHex(bArray); + } + + public static final String byteToHex(byte value) { + String s = Integer.toHexString(0xff & value); + if(s.length() == 1) return "0"+s; + return s; + } + + public static final String shortToHex(short value) { + String s = Integer.toHexString(value); + switch (s.length()) { + case 1: return "000" + s; + case 2: return "00" + s; + case 3: return "0" + s; + default: return s; + } + } + + public static final String intToHex(int value) { + StringBuilder s = new StringBuilder(Integer.toHexString(value)); + String v1 = s.toString().replace("f",""); + if (v1.length() <4){ + for (int i = 0; i < 4 - v1.length(); i++) { + s.insert(0, "0"); + } + return s.toString().replace("f",""); + } + else return s.toString().replace("f",""); + } + + public static final String hexTo8Bit(int value,int index){ + String s = Integer.toBinaryString(value); + StringBuilder result = new StringBuilder(s); + if (s.length() < index){ + for (int i = 0; i < index - s.length(); i++) { + result.insert(0,"0"); + } + } + return result.toString(); + } + + /** + * @函数功能: BCD码转为10进制串(阿拉伯数据) + * @输入参数: BCD码 + * @输出结果: 10进制串 + */ + public static String bcdToStr(byte[] bytes){ + StringBuffer temp=new StringBuffer(bytes.length*2); + + for(int i=0;i>>4)); + temp.append((byte)(bytes[i] & 0x0f)); + } + + return temp.toString(); + } + + /** + * + * @param src 原报文 + * @param offset 起始位置 + * @param length 长度 + * @return + */ + public static String bcdToStr(byte[] src, int offset, int length){ + byte[] bArray = ArrayUtils.subarray(src, offset, offset + length); + return bcdToStr(bArray); + } + + public static byte[] str2Bcd(String asc) { + int len = asc.length(); + int mod = len % 2; + + if (mod != 0) { + asc = "0" + asc; + len = asc.length(); + } + + byte abt[]; + if (len >= 2) { + len = len / 2; + } + + byte bbt[] = new byte[len]; + abt = asc.getBytes(); + int j, k; + + for (int p = 0; p < asc.length()/2; p++) { + if ( (abt[2 * p] >= '0') && (abt[2 * p] <= '9')) { + j = abt[2 * p] - '0'; + } else if ( (abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) { + j = abt[2 * p] - 'a' + 0x0a; + } else { + j = abt[2 * p] - 'A' + 0x0a; + } + + if ( (abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) { + k = abt[2 * p + 1] - '0'; + } else if ( (abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) { + k = abt[2 * p + 1] - 'a' + 0x0a; + }else { + k = abt[2 * p + 1] - 'A' + 0x0a; + } + + int a = (j << 4) + k; + byte b = (byte) a; + bbt[p] = b; + } + return bbt; + } + + private static byte toByte(char c) { + return (byte) c; + } + + /** + * 将字节数组转换成 ushort 数据 + * @param bytes 字节数组 + * @param offset 起始位置 + * @return short值 + */ + public static int bytesToUShort(byte[] bytes, int offset) { + return ((0xff & bytes[0 + offset]) | (0xff00 & (bytes[1 + offset] << 8))); + } + + /** + * 将字节数组转换成 ushort 数据,采用倒序的方式 + * @param bytes 字节数组 + * @return short值 + */ + public static int bytesToUShortOfReverse(byte[] bytes) { + return ByteUtils.bytesToShortOfReverse(bytes, 0); + } + + /** + * 将字节数组转换成 ushort 数据,采用倒序的方式 + * @param bytes 字节数组 + * @param offset 起始位置 + * @return short值 + */ + public static int bytesToUShortOfReverse(byte[] bytes, int offset) { + return ((0xff & bytes[1 + offset]) | (0xff00 & (bytes[0 + offset] << 8))); + } + + /** + * byte数组中取int数值,本方法适用于(低位在前,高位在后)的顺序,和intToBytes配套使用 + * + * @param src + * byte数组 + * @param offset + * 从数组的第offset位开始 + * @return int数值 + */ + public static int bytesToInt(byte[] src, int offset) { + return ((src[offset] & 0xFF) | ((src[offset + 1] & 0xFF) << 8) + | ((src[offset + 2] & 0xFF) << 16) | ((src[offset + 3] & 0xFF) << 24)); + } + + /** + * byte数组中取int数值,本方法适用于(低位在前,高位在后)的顺序,和intToBytes配套使用 + * @param src byte数组 + * @return int数值 + */ + public static int bytesToInt(byte[] src) { + return ByteUtils.bytesToInt(src, 0); + } + + /** + * 将字节数组转换成int数据,采用倒序的方式 + * @param bytes 字节数组 + * @param offset 起始位置 + * @return int值 + */ + public static int bytesToIntOfReverse(byte[] bytes, int offset) { + return (0xff & bytes[3 + offset]) | + (0xff00 & (bytes[2 + offset] << 8)) | + (0xff0000 & (bytes[1 + offset] << 16)) | + (0xff000000 & (bytes[0 + offset] << 24)); + } + + /** + * 将字节数组转换成int数据,采用倒序的方式 + * @param bytes 字节数组 + * @return int值 + */ + public static int bytesToIntOfReverse(byte[] bytes) { + return ByteUtils.bytesToIntOfReverse(bytes, 0); + } + + /** + * 将字节数组转换成uint数据 + * @param bytes 字节数组 + * @param offset 起始位置 + * @return int值 + */ + public static long bytesToUInt(byte[] bytes, int offset) { + int value = bytesToInt(bytes, offset); + if (value >= 0) return value; + return 65536L * 65536L + value; + } + + /** + * 将字节数组转换成uint数据 + * @param bytes 字节数组 + * @return int值 + */ + public static long bytesToUInt(byte[] bytes) { + return ByteUtils.bytesToUInt(bytes, 0); + } + + /** + * 将字节数组转换成uint数据 + * @param bytes 字节数组 + * @param offset 起始位置 + * @return int值 + */ + public static long bytesToUIntOfReverse(byte[] bytes, int offset) { + int value = bytesToIntOfReverse(bytes, offset); + if (value >= 0) return value; + return 65536L * 65536L + value; + } + + /** + * 将字节数组转换成uint数据 倒序 + * @param bytes 字节数组 + * @return int值 + */ + public static long bytesToUIntOfReverse(byte[] bytes) { + return ByteUtils.bytesToUIntOfReverse(bytes, 0); + } + + /** + * 将字节数组转换成float数据 + * @param bytes 字节数组 + * @return float值 + */ + public static float bytesToFloat(byte[] bytes) { + return Float.intBitsToFloat(bytesToInt(bytes, 0)); + } + + /** + * 将字节数组转换成float数据 + * @param bytes 字节数组 + * @param offset 起始位置 + * @return float值 + */ + public static float bytesToFloat(byte[] bytes, int offset) { + return Float.intBitsToFloat(bytesToInt(bytes,offset)); + } + + /** + * 将字节数组转换成float数据 + * @param bytes 字节数组 + * @return float值 + */ + public static float bytesToFloatOfReverse(byte[] bytes) { + return bytesToFloatOfReverse(bytes, 0); + } + + /** + * 将字节数组转换成float数据 + * @param bytes 字节数组 + * @param offset 偏移量 + * @return float值 + */ + public static float bytesToFloatOfReverse(byte[] bytes, int offset) { + return Float.intBitsToFloat(bytesToIntOfReverse(bytes, offset)); + } + + + /** + * byte数组中取double数值 + * @param src byte数组 + * @return double数值 + */ + public static double bytesToDouble(byte[] src) { + return Double.longBitsToDouble(bytesToLong(src)); + } + + /** + * byte数组中取double数值 + * @param src byte数组 + * @param offset 从数组的第offset位开始 + * @return double数值 + */ + public static double bytesToDouble(byte[] src, int offset) { + return Double.longBitsToDouble(bytesToLong(src, offset)); + } + + /** + * byte数组中取double数值 + * @param src byte数组 + * @return double数值 + */ + public static double bytesToDoubleOfReverse(byte[] src) { + return bytesToDoubleOfReverse(src, 0); + } + + /** + * byte数组中取double数值 + * @param src byte数组 + * @param offset 从数组的第offset位开始 + * @return double数值 + */ + public static double bytesToDoubleOfReverse(byte[] src, int offset) { + return Double.longBitsToDouble(bytesToLongOfReverse(src, offset)); + } + + /** + * 去掉字节数组尾数为零的字节,并将其转成字符串 + * @param src + * @param charset + * @return + */ + public static String bytesToString(byte[] src, Charset charset){ + int search = Arrays.binarySearch(src, (byte) 0); + return new String(Arrays.copyOf(src, search), charset); + } + + /** + * 去掉字节数组尾数为零的字节,并将其转成字符串 + * @param src + * @return + */ + public static String bytesToString(byte[] src){ + return new String(wipeLastZero(src)); + } + + /** + * 去掉字节数组尾数为零的字节,并将其转成字符串 + * @param src + * @return + */ + public static String bytesToString(byte[] src, int startIndex, int endIndex){ + return new String(wipeLastZero(subBytes(src, startIndex, endIndex))); + } + + /** + * 去掉字节数组尾数为零的字节,并将其转成字符串 + * @param src + * @return + */ + public static String bytesToString(byte[] src, int startIndex, int endIndex, Charset charset){ + return new String(wipeLastZero(subBytes(src, startIndex, endIndex)), charset); + } + + /** + * 将byte[]数组的数据进行翻转 + * @param reverse 等待反转的字符串 + */ + public static void bytesReverse(byte[] reverse) { + if (reverse != null) { + byte tmp = 0; + for (int i = 0; i < reverse.length / 2; i++) { + tmp = reverse[i]; + reverse[i] = reverse[reverse.length - 1 - i]; + reverse[reverse.length - 1 - i] = tmp; + } + } + } + + /** + * 去除包含0的字节 + * @param src + * @return + */ + private static byte[] wipeLastZero(byte[] src){ + int index = 0; + for(int i=0; i 0 ? 1 : 0); + } + + /** + *将bool数组转换到byte数组
+ * @param array bool数组 + * @return 字节数组 + */ + public static byte[] boolArrayToByte(boolean[] array) { + if (array == null) return null; + + int length = array.length % 8 == 0 ? array.length / 8 : array.length / 8 + 1; + byte[] buffer = new byte[length]; + + for (int i = 0; i < array.length; i++) { + if (array[i]) { + buffer[i / 8] += (1 << i % 8); + } + } + + return buffer; + } + + public static Integer cutMessageHexTo(byte[] source, int startIndex, int endIndex){ + byte[] subarray = ArrayUtils.subarray(source, startIndex, endIndex); + String s = bytesToHexString(subarray); + return Integer.parseInt(s,16); + } + + /** + * byte数组转换炒年糕十六进制字符串 + * + * @param bArray byte数组 + * @return hex字符串 + */ + public static String bytesToHexString(byte[] bArray) { + StringBuilder sb = new StringBuilder(bArray.length); + for (int i = 0; i < bArray.length; i++) { + String hexStr = Integer.toHexString(0xFF & bArray[i]); + if (hexStr.length() < 2) { + sb.append(0); + } + sb.append(hexStr.toUpperCase()); + } + return sb.toString(); + } + + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/NettyUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/NettyUtils.java new file mode 100644 index 00000000..18c8e921 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/gateway/protocol/NettyUtils.java @@ -0,0 +1,22 @@ +package com.fastbee.common.utils.gateway.protocol; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +/** + * @author gsb + * @date 2022/9/15 14:44 + */ +public class NettyUtils { + + /** + * ByteBuf转 byte[] + * @param buf buffer + * @return byte[] + */ + public static byte[] readBytesFromByteBuf(ByteBuf buf){ + return ByteBufUtil.getBytes(buf); + } + + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/EscapeUtil.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/EscapeUtil.java new file mode 100644 index 00000000..134127c3 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/EscapeUtil.java @@ -0,0 +1,167 @@ +package com.fastbee.common.utils.html; + +import com.fastbee.common.utils.StringUtils; + +/** + * 转义和反转义工具类 + * + * @author ruoyi + */ +public class EscapeUtil +{ + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static + { + for (int i = 0; i < 64; i++) + { + TEXT[i] = new char[] { (char) i }; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 单引号 + TEXT['"'] = """.toCharArray(); // 双引号 + TEXT['&'] = "&".toCharArray(); // &符 + TEXT['<'] = "<".toCharArray(); // 小于号 + TEXT['>'] = ">".toCharArray(); // 大于号 + } + + /** + * 转义文本中的HTML字符为安全的字符 + * + * @param text 被转义的文本 + * @return 转义后的文本 + */ + public static String escape(String text) + { + return encode(text); + } + + /** + * 还原被转义的HTML特殊字符 + * + * @param content 包含转义符的HTML内容 + * @return 转换后的字符串 + */ + public static String unescape(String content) + { + return decode(content); + } + + /** + * 清除所有HTML标签,但是不删除标签内的内容 + * + * @param content 文本 + * @return 清除标签后的文本 + */ + public static String clean(String content) + { + return new HTMLFilter().filter(content); + } + + /** + * Escape编码 + * + * @param text 被编码的文本 + * @return 编码后的字符 + */ + private static String encode(String text) + { + if (StringUtils.isEmpty(text)) + { + return StringUtils.EMPTY; + } + + final StringBuilder tmp = new StringBuilder(text.length() * 6); + char c; + for (int i = 0; i < text.length(); i++) + { + c = text.charAt(i); + if (c < 256) + { + tmp.append("%"); + if (c < 16) + { + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + else + { + tmp.append("%u"); + if (c <= 0xfff) + { + // issue#I49JU8@Gitee + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + } + return tmp.toString(); + } + + /** + * Escape解码 + * + * @param content 被转义的内容 + * @return 解码后的字符串 + */ + public static String decode(String content) + { + if (StringUtils.isEmpty(content)) + { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) + { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) + { + if (content.charAt(pos + 1) == 'u') + { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } + else + { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } + else + { + if (pos == -1) + { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } + else + { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) + { + String html = ""; + String escape = EscapeUtil.escape(html); + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println("clean: " + EscapeUtil.clean(html)); + System.out.println("escape: " + escape); + System.out.println("unescape: " + EscapeUtil.unescape(escape)); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/HTMLFilter.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/HTMLFilter.java new file mode 100644 index 00000000..d2e5c43b --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/html/HTMLFilter.java @@ -0,0 +1,570 @@ +package com.fastbee.common.utils.html; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * HTML过滤器,用于去除XSS漏洞隐患。 + * + * @author ruoyi + */ +public final class HTMLFilter +{ + /** + * regex flag union representing /si modifiers in php + **/ + private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); + private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); + private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); + private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); + private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); + private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); + private static final Pattern P_END_ARROW = Pattern.compile("^>"); + private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_AMP = Pattern.compile("&"); + private static final Pattern P_QUOTE = Pattern.compile("\""); + private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); + private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); + private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); + + // @xxx could grow large... maybe use sesat's ReferenceMap + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); + + /** + * set of allowed html elements, along with allowed attributes for each element + **/ + private final Map> vAllowed; + /** + * counts of open tags for each (allowable) html element + **/ + private final Map vTagCounts = new HashMap<>(); + + /** + * html elements which must always be self-closing (e.g. "") + **/ + private final String[] vSelfClosingTags; + /** + * html elements which must always have separate opening and closing tags (e.g. "") + **/ + private final String[] vNeedClosingTags; + /** + * set of disallowed html elements + **/ + private final String[] vDisallowed; + /** + * attributes which should be checked for valid protocols + **/ + private final String[] vProtocolAtts; + /** + * allowed protocols + **/ + private final String[] vAllowedProtocols; + /** + * tags which should be removed if they contain no content (e.g. "" or "") + **/ + private final String[] vRemoveBlanks; + /** + * entities allowed within html markup + **/ + private final String[] vAllowedEntities; + /** + * flag determining whether comments are allowed in input String. + */ + private final boolean stripComment; + private final boolean encodeQuotes; + /** + * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "" + * becomes " text "). If set to false, unbalanced angle brackets will be html escaped. + */ + private final boolean alwaysMakeTags; + + /** + * Default constructor. + */ + public HTMLFilter() + { + vAllowed = new HashMap<>(); + + final ArrayList a_atts = new ArrayList<>(); + a_atts.add("href"); + a_atts.add("target"); + vAllowed.put("a", a_atts); + + final ArrayList img_atts = new ArrayList<>(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + vAllowed.put("img", img_atts); + + final ArrayList no_atts = new ArrayList<>(); + vAllowed.put("b", no_atts); + vAllowed.put("strong", no_atts); + vAllowed.put("i", no_atts); + vAllowed.put("em", no_atts); + + vSelfClosingTags = new String[] { "img" }; + vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; + vDisallowed = new String[] {}; + vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. + vProtocolAtts = new String[] { "src", "href" }; + vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; + vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; + stripComment = true; + encodeQuotes = true; + alwaysMakeTags = false; + } + + /** + * Map-parameter configurable constructor. + * + * @param conf map containing configuration. keys match field names. + */ + @SuppressWarnings("unchecked") + public HTMLFilter(final Map conf) + { + + assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; + assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; + assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; + assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; + assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; + assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; + assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; + assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; + + vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed")); + vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); + vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); + vDisallowed = (String[]) conf.get("vDisallowed"); + vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); + vProtocolAtts = (String[]) conf.get("vProtocolAtts"); + vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); + vAllowedEntities = (String[]) conf.get("vAllowedEntities"); + stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; + encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; + alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; + } + + private void reset() + { + vTagCounts.clear(); + } + + // --------------------------------------------------------------- + // my versions of some PHP library functions + public static String chr(final int decimal) + { + return String.valueOf((char) decimal); + } + + public static String htmlSpecialChars(final String s) + { + String result = s; + result = regexReplace(P_AMP, "&", result); + result = regexReplace(P_QUOTE, """, result); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + // --------------------------------------------------------------- + + /** + * given a user submitted input String, filter out any invalid or restricted html. + * + * @param input text (i.e. submitted by a user) than may contain html + * @return "clean" version of input, with only valid, whitelisted html elements allowed + */ + public String filter(final String input) + { + reset(); + String s = input; + + s = escapeComments(s); + + s = balanceHTML(s); + + s = checkTags(s); + + s = processRemoveBlanks(s); + + // s = validateEntities(s); + + return s; + } + + public boolean isAlwaysMakeTags() + { + return alwaysMakeTags; + } + + public boolean isStripComments() + { + return stripComment; + } + + private String escapeComments(final String s) + { + final Matcher m = P_COMMENTS.matcher(s); + final StringBuffer buf = new StringBuffer(); + if (m.find()) + { + final String match = m.group(1); // (.*?) + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + m.appendTail(buf); + + return buf.toString(); + } + + private String balanceHTML(String s) + { + if (alwaysMakeTags) + { + // + // try and form html + // + s = regexReplace(P_END_ARROW, "", s); + // 不追加结束标签 + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s); + + } + else + { + // + // escape stray brackets + // + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + + // + // the last regexp causes '<>' entities to appear + // (we need to do a lookahead assertion so that the last bracket can + // be used in the next pass of the regexp) + // + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) + { + Matcher m = P_TAGS.matcher(s); + + final StringBuffer buf = new StringBuffer(); + while (m.find()) + { + String replaceStr = m.group(1); + replaceStr = processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + m.appendTail(buf); + + // these get tallied in processTag + // (remember to reset before subsequent calls to filter method) + final StringBuilder sBuilder = new StringBuilder(buf.toString()); + for (String key : vTagCounts.keySet()) + { + for (int ii = 0; ii < vTagCounts.get(key); ii++) + { + sBuilder.append(""); + } + } + s = sBuilder.toString(); + + return s; + } + + private String processRemoveBlanks(final String s) + { + String result = s; + for (String tag : vRemoveBlanks) + { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) + { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) + { + P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); + } + result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + return result; + } + + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) + { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + + private String processTag(final String s) + { + // ending tags + Matcher m = P_END_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + if (allowed(name)) + { + if (!inArray(name, vSelfClosingTags)) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) - 1); + return ""; + } + } + } + } + + // starting tags + m = P_START_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + final String body = m.group(2); + String ending = m.group(3); + + // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); + if (allowed(name)) + { + final StringBuilder params = new StringBuilder(); + + final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + final List paramNames = new ArrayList<>(); + final List paramValues = new ArrayList<>(); + while (m2.find()) + { + paramNames.add(m2.group(1)); // ([a-z0-9]+) + paramValues.add(m2.group(3)); // (.*?) + } + while (m3.find()) + { + paramNames.add(m3.group(1)); // ([a-z0-9]+) + paramValues.add(m3.group(3)); // ([^\"\\s']+) + } + + String paramName, paramValue; + for (int ii = 0; ii < paramNames.size(); ii++) + { + paramName = paramNames.get(ii).toLowerCase(); + paramValue = paramValues.get(ii); + + // debug( "paramName='" + paramName + "'" ); + // debug( "paramValue='" + paramValue + "'" ); + // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); + + if (allowedAttribute(name, paramName)) + { + if (inArray(paramName, vProtocolAtts)) + { + paramValue = processParamProtocol(paramValue); + } + params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); + } + } + + if (inArray(name, vSelfClosingTags)) + { + ending = " /"; + } + + if (inArray(name, vNeedClosingTags)) + { + ending = ""; + } + + if (ending == null || ending.length() < 1) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) + 1); + } + else + { + vTagCounts.put(name, 1); + } + } + else + { + ending = " /"; + } + return "<" + name + params + ending + ">"; + } + else + { + return ""; + } + } + + // comments + m = P_COMMENT.matcher(s); + if (!stripComment && m.find()) + { + return "<" + m.group() + ">"; + } + + return ""; + } + + private String processParamProtocol(String s) + { + s = decodeEntities(s); + final Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) + { + final String protocol = m.group(1); + if (!inArray(protocol, vAllowedProtocols)) + { + // bad protocol, turn into local anchor link instead + s = "#" + s.substring(protocol.length() + 1); + if (s.startsWith("#//")) + { + s = "#" + s.substring(3); + } + } + } + + return s; + } + + private String decodeEntities(String s) + { + StringBuffer buf = new StringBuffer(); + + Matcher m = P_ENTITY.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.decode(match).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENTITY_UNICODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENCODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + s = validateEntities(s); + return s; + } + + private String validateEntities(final String s) + { + StringBuffer buf = new StringBuffer(); + + // validate entities throughout the string + Matcher m = P_VALID_ENTITIES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // ([^&;]*) + final String two = m.group(2); // (?=(;|&|$)) + m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); + } + m.appendTail(buf); + + return encodeQuotes(buf.toString()); + } + + private String encodeQuotes(final String s) + { + if (encodeQuotes) + { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // (>|^) + final String two = m.group(2); // ([^<]+?) + final String three = m.group(3); // (<|$) + // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two) + m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); + } + m.appendTail(buf); + return buf.toString(); + } + else + { + return s; + } + } + + private String checkEntity(final String preamble, final String term) + { + + return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(final String entity) + { + return inArray(entity, vAllowedEntities); + } + + private static boolean inArray(final String s, final String[] array) + { + for (String item : array) + { + if (item != null && item.equals(s)) + { + return true; + } + } + return false; + } + + private boolean allowed(final String name) + { + return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); + } + + private boolean allowedAttribute(final String name, final String paramName) + { + return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpHelper.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpHelper.java new file mode 100644 index 00000000..719a60b2 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpHelper.java @@ -0,0 +1,55 @@ +package com.fastbee.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import javax.servlet.ServletRequest; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 通用http工具封装 + * + * @author ruoyi + */ +public class HttpHelper +{ + private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); + + public static String getBodyString(ServletRequest request) + { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = null; + try (InputStream inputStream = request.getInputStream()) + { + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) + { + sb.append(line); + } + } + catch (IOException e) + { + LOGGER.warn("getBodyString出现问题!"); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + LOGGER.error(ExceptionUtils.getMessage(e)); + } + } + } + return sb.toString(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpUtils.java new file mode 100644 index 00000000..bc348841 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/http/HttpUtils.java @@ -0,0 +1,274 @@ +package com.fastbee.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.utils.StringUtils; + +/** + * 通用http发送方法 + * + * @author ruoyi + */ +public class HttpUtils +{ + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url) + { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) + { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try + { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (in != null) + { + in.close(); + } + } + catch (Exception ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 JSON String格式 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) + { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try + { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) + { + if (ret != null && !"".equals(ret.trim())) + { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[] {}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/AddressUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/AddressUtils.java new file mode 100644 index 00000000..fddcd76f --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/AddressUtils.java @@ -0,0 +1,56 @@ +package com.fastbee.common.utils.ip; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.http.HttpUtils; + +/** + * 获取地址类 + * + * @author ruoyi + */ +public class AddressUtils +{ + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + + // IP地址查询 + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) + { + // 内网不查询 + if (IpUtils.internalIp(ip)) + { + return "内网IP"; + } + if (RuoYiConfig.isAddressEnabled()) + { + try + { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) + { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSON.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) + { + log.error("获取地理位置异常 {}", ip); + } + } + return UNKNOWN; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/IpUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/IpUtils.java new file mode 100644 index 00000000..6aea1506 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/ip/IpUtils.java @@ -0,0 +1,264 @@ +package com.fastbee.common.utils.ip; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; +import com.fastbee.common.utils.StringUtils; + +/** + * 获取IP方法 + * + * @author ruoyi + */ +public class IpUtils +{ + /** + * 获取客户端IP + * + * @param request 请求对象 + * @return IP地址 + */ + public static String getIpAddr(HttpServletRequest request) + { + if (request == null) + { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) + { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param addr byte地址 + * @return 结果 + */ + private static boolean internalIp(byte[] addr) + { + if (StringUtils.isNull(addr) || addr.length < 2) + { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) + { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) + { + return true; + } + case SECTION_5: + switch (b1) + { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) + { + if (text.length() == 0) + { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try + { + long l; + int i; + switch (elements.length) + { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) + { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) + { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) + { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } + catch (NumberFormatException e) + { + return null; + } + return bytes; + } + + /** + * 获取IP地址 + * + * @return 本地IP地址 + */ + public static String getHostIp() + { + try + { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException e) + { + } + return "127.0.0.1"; + } + + /** + * 获取主机名 + * + * @return 本地主机名 + */ + public static String getHostName() + { + try + { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException e) + { + } + return "未知"; + } + + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) + { + // 多级反向代理检测 + if (ip != null && ip.indexOf(",") > 0) + { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) + { + if (false == isUnknown(subIp)) + { + ip = subIp; + break; + } + } + } + return ip; + } + + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) + { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } +} \ No newline at end of file diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/json/JsonUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/json/JsonUtils.java new file mode 100644 index 00000000..b5fd0cdb --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/json/JsonUtils.java @@ -0,0 +1,159 @@ +package com.fastbee.common.utils.json; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author fastbee + */ +@UtilityClass +@Slf4j +public class JsonUtils { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.registerModules(new JavaTimeModule()); // 解决 LocalDateTime 的序列化 + } + + /** + * 初始化 objectMapper 属性 + *

+ * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean + * + * @param objectMapper ObjectMapper 对象 + */ + public static void init(ObjectMapper objectMapper) { + JsonUtils.objectMapper = objectMapper; + } + + @SneakyThrows + public static String toJsonString(Object object) { + return objectMapper.writeValueAsString(object); + } + + @SneakyThrows + public static byte[] toJsonByte(Object object) { + return objectMapper.writeValueAsBytes(object); + } + + @SneakyThrows + public static String toJsonPrettyString(Object object) { + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); + } + + public static T parseObject(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, Type type) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + /** + * 将字符串解析成指定类型的对象 + * 使用 {@link #parseObject(String, Class)} 时,在@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 的场景下, + * 如果 text 没有 class 属性,则会报错。此时,使用这个方法,可以解决。 + * + * @param text 字符串 + * @param clazz 类型 + * @return 对象 + */ + public static T parseObject2(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + return JSONUtil.toBean(text, clazz); + } + + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return objectMapper.readValue(bytes, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", bytes, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, TypeReference typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static List parseArray(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(String text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(byte[] text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static boolean isJson(String text) { + return JSONUtil.isTypeJSON(text); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/object/ObjectUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/object/ObjectUtils.java new file mode 100644 index 00000000..1fd4c1cc --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/object/ObjectUtils.java @@ -0,0 +1,63 @@ +package com.fastbee.common.utils.object; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.function.Consumer; + +/** + * Object 工具类 + * + * @author fastbee + */ +public class ObjectUtils { + + /** + * 复制对象,并忽略 Id 编号 + * + * @param object 被复制对象 + * @param consumer 消费者,可以二次编辑被复制对象 + * @return 复制后的对象 + */ + public static T cloneIgnoreId(T object, Consumer consumer) { + T result = ObjectUtil.clone(object); + // 忽略 id 编号 + Field field = ReflectUtil.getField(object.getClass(), "id"); + if (field != null) { + ReflectUtil.setFieldValue(result, field, null); + } + // 二次编辑 + if (result != null) { + consumer.accept(result); + } + return result; + } + + public static > T max(T obj1, T obj2) { + if (obj1 == null) { + return obj2; + } + if (obj2 == null) { + return obj1; + } + return obj1.compareTo(obj2) > 0 ? obj1 : obj2; + } + + @SafeVarargs + public static T defaultIfNull(T... array) { + for (T item : array) { + if (item != null) { + return item; + } + } + return null; + } + + @SafeVarargs + public static boolean equalsAny(T obj, T... array) { + return Arrays.asList(array).contains(obj); + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelHandlerAdapter.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 00000000..ca8f11d7 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,19 @@ +package com.fastbee.common.utils.poi; + +/** + * Excel数据格式处理适配器 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args); +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelUtil.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelUtil.java new file mode 100644 index 00000000..45eca859 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/poi/ExcelUtil.java @@ -0,0 +1,1734 @@ +package com.fastbee.common.utils.poi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFPicture; +import org.apache.poi.hssf.usermodel.HSSFPictureData; +import org.apache.poi.hssf.usermodel.HSSFShape; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Name; +import org.apache.poi.ss.usermodel.PictureData; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.XSSFDrawing; +import org.apache.poi.xssf.usermodel.XSSFPicture; +import org.apache.poi.xssf.usermodel.XSSFShape; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.annotation.Excel.ColumnType; +import com.fastbee.common.annotation.Excel.Type; +import com.fastbee.common.annotation.Excels; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.text.Convert; +import com.fastbee.common.exception.UtilException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.DictUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.file.FileTypeUtils; +import com.fastbee.common.utils.file.FileUtils; +import com.fastbee.common.utils.file.ImageUtils; +import com.fastbee.common.utils.reflect.ReflectUtils; + +/** + * Excel相关处理 + * + * @author ruoyi + */ +public class ExcelUtil +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + + /** + * 对象的子列表方法 + */ + private Method subMethod; + + /** + * 对象的子列表属性 + */ + private List subFields; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 实体对象 + */ + public Class clazz; + + /** + * 需要排除列属性 + */ + public String[] excludeFields; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + /** + * 隐藏Excel中列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + * @throws Exception + */ + public void hideColumn(String... fields) + { + this.excludeFields = fields; + } + + public void init(List list, String sheetName, String title, Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createWorkbook(); + createTitle(); + createSubHead(); + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + int titleLastCol = this.fields.size() - 1; + if (isSubList()) + { + titleLastCol = titleLastCol + subFields.size() - 1; + } + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() + { + if (isSubList()) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + Row subRow = sheet.createRow(rownum); + int excelNum = 0; + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) + { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); + } + rownum++; + } + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) throws Exception + { + return importExcel(is, 0); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + + if (rows > 0) + { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(titleNum); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (StringUtils.isNotEmpty(attr.dictType())) + { + val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr); + } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 创建写入数据到Sheet + */ + public void writeSheet() + { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + else + { + this.createHeadCell(excel, row, column++); + } + } + if (Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + @SuppressWarnings("unchecked") + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + int rowNo = (1 + rownum) - startNo; + for (int i = startNo; i < endNo; i++) + { + rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; + row = sheet.createRow(rowNo); + // 得到导出对象. + T vo = (T) list.get(i); + Collection subList = null; + if (isSubList()) + { + if (isSubListValue(vo)) + { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } + else + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + } + } + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) + { + boolean subFirst = false; + for (Object obj : subList) + { + if (subFirst) + { + rowNo++; + row = sheet.createRow(rowNo); + } + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + int subIndex = 0; + for (Field subField : subFields) + { + if (subField.isAnnotationPresent(Excel.class)) + { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T) obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; + } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); + } + else + { + this.addCell(excel, row, vo, field, column++); + } + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) + { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationHeaderStyles(wb, styles)); + + styles.putAll(annotationDataStyles(wb)); + + return styles; + } + + /** + * 根据Excel注解创建表格头样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationHeaderStyles(Workbook wb, Map styles) + { + Map headerStyles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); + if (!headerStyles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(excel.headerBackgroundColor().index); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(excel.headerColor().index); + style.setFont(headerFont); + headerStyles.put(key, style); + } + } + return headerStyles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationDataStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor()); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(excel.backgroundColor().getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + styles.put(key, style); + } + } + return styles; + } + + /** + * 创建单元格 + */ + public Cell createHeadCell(Excel attr, Row row, int column) + { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (isSubList()) + { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + if (attr.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType()) + { + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) + { + cellValue = StringUtils.EMPTY; + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + else if (ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 获取图片类型,设置图片插入类型 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("注:") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + } + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) + { + if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) + { + // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 + setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + else + { + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 设置行高 + row.setHeight(maxHeight); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) + { + // 创建cell + cell = row.createCell(column); + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) + { + CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); + } + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(parseDateToStr(dateFormat, value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator)); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr)); + } + else + { + // 设置列类型 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } + catch (Exception e) + { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示或选择框 + * + * @param sheet 表单 + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) + { + String hideSheetName = "combo_" + firstCol + "_" + endCol; + Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 + for (int i = 0; i < textlist.length; i++) + { + hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); + } + // 创建名称,可被其他单元格引用 + Name name = wb.createName(); + name.setNameName(hideSheetName + "_data"); + name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + // 设置hiddenSheet隐藏 + wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[0].equals(value)) + { + propertyString.append(itemArray[1] + separator); + break; + } + } + } + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[1].equals(value)) + { + propertyString.append(itemArray[0] + separator); + break; + } + } + } + else + { + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) + { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) + { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); + value = formatMethod.invoke(instance, value, excel.args()); + } + catch (Exception e) + { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = RuoYiConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.contains(".")) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() + { + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 获取字段注解信息 + */ + public List getFields() + { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) + { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) + { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } + } + } + } + return fields; + } + + /** + * 根据注解获取最大行高 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short) (maxHeight * 20); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(int sheetNo, int index) + { + // 设置工作表的名称. + if (sheetNo > 1 && index > 0) + { + this.sheet = wb.createSheet(); + this.createTitle(); + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1()); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } + + /** + * 是否有对象的子列表 + */ + public boolean isSubList() + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + */ + public boolean isSubListValue(T vo) + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + */ + public Collection getListCellValue(Object obj) + { + Object value; + try + { + value = subMethod.invoke(obj, new Object[] {}); + } + catch (Exception e) + { + return new ArrayList(); + } + return (Collection) value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) + { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try + { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } + catch (Exception e) + { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/reflect/ReflectUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/reflect/ReflectUtils.java new file mode 100644 index 00000000..54eb6290 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,410 @@ +package com.fastbee.common.utils.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.fastbee.common.core.text.Convert; +import com.fastbee.common.utils.DateUtils; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author ruoyi + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Base64.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Base64.java new file mode 100644 index 00000000..ca1f4f6c --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Base64.java @@ -0,0 +1,291 @@ +package com.fastbee.common.utils.sign; + +/** + * Base64工具类 + * + * @author ruoyi + */ +public final class Base64 +{ + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static + { + for (int i = 0; i < BASELENGTH; ++i) + { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) + { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) + { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) + { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) + { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + } + + private static boolean isWhiteSpace(char octect) + { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) + { + return (octect == PAD); + } + + private static boolean isData(char octect) + { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) + { + if (binaryData == null) + { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) + { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) + { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) + { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } + else if (fewerThan24bits == SIXTEENBIT) + { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) + { + if (encoded == null) + { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) + { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) + { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) + { + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) + { + return null; + } // if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) + { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) + {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) + { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } + else if (!isPad(d3) && isPad(d4)) + { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } + else + { + return null; + } + } + else + { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) + { + if (data == null) + { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) + { + if (!isWhiteSpace(data[i])) + { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Md5Utils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Md5Utils.java new file mode 100644 index 00000000..ba4aab16 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sign/Md5Utils.java @@ -0,0 +1,67 @@ +package com.fastbee.common.utils.sign; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Md5加密方法 + * + * @author ruoyi + */ +public class Md5Utils +{ + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) + { + MessageDigest algorithm; + try + { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } + catch (Exception e) + { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) + { + if (hash == null) + { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) + { + if ((hash[i] & 0xff) < 0x10) + { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) + { + try + { + return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } + catch (Exception e) + { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/spring/SpringUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/spring/SpringUtils.java new file mode 100644 index 00000000..61138aaf --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/spring/SpringUtils.java @@ -0,0 +1,183 @@ +package com.fastbee.common.utils.spring; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import com.fastbee.common.utils.StringUtils; +import org.springframework.util.CollectionUtils; + +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.Map; + + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 获取配置文件中的值 + * + * @param key 配置文件的key + * @return 当前的配置文件的值 + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } + + /** + * 获取带有annotation注解的所有bean集合 + * @param annotation 注解 + * @param + * @return 集合 + */ + public static Map getBeanWithAnnotation(Class annotation){ + Map resultMap = new HashMap<>(); + Map beanMap = applicationContext.getBeansWithAnnotation(annotation); + if (CollectionUtils.isEmpty(beanMap)){ + return resultMap; + } + beanMap.forEach((key,value)->{ + resultMap.put(key,(T) value); + }); + return resultMap; + } + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sql/SqlUtil.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sql/SqlUtil.java new file mode 100644 index 00000000..ddf3bc52 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/sql/SqlUtil.java @@ -0,0 +1,61 @@ +package com.fastbee.common.utils.sql; + +import com.fastbee.common.exception.UtilException; +import com.fastbee.common.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author ruoyi + */ +public class SqlUtil +{ + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + throw new UtilException("参数不符合规范,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) + { + if (StringUtils.isEmpty(value)) + { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) + { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) + { + throw new UtilException("参数存在SQL注入风险"); + } + } + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/IdUtils.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/IdUtils.java new file mode 100644 index 00000000..10659b34 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/IdUtils.java @@ -0,0 +1,128 @@ +package com.fastbee.common.utils.uuid; + +import lombok.extern.slf4j.Slf4j; +import com.fastbee.common.utils.Md5Utils; +import java.util.Random; + +/** + * ID生成器工具类 + * + * @author ruoyi + */ +@Slf4j +public class IdUtils +{ + private static long lastTimestamp = -1L; + private long sequence = 0L; + private final long workerId; + private final long datacenterId; + private static Integer startIndex=0; + private static Integer endIndex=6; + + public IdUtils(long workerId, long datacenterId) { + if(workerId <= 31L && workerId >= 0L) { + this.workerId = workerId; + } else { + if(workerId != -1L) { + throw new IllegalArgumentException("worker Id can't be greater than %d or less than 0"); + } + + this.workerId = (long)(new Random()).nextInt(31); + } + + if(datacenterId <= 31L && datacenterId >= 0L) { + this.datacenterId = datacenterId; + } else { + if(datacenterId != -1L) { + throw new IllegalArgumentException("datacenter Id can't be greater than %d or less than 0"); + } + + this.datacenterId = (long)(new Random()).nextInt(31); + } + + } + + public synchronized long nextId() { + long timestamp = this.timeGen(); + if(timestamp < lastTimestamp) { + try { + throw new Exception("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds"); + } catch (Exception e) { + log.warn("生成ID异常", e); + } + } + + if(lastTimestamp == timestamp) { + this.sequence = this.sequence + 1L & 4095L; + if(this.sequence == 0L) { + timestamp = this.tilNextMillis(lastTimestamp); + } + } else { + this.sequence = 0L; + } + + lastTimestamp = timestamp; + return timestamp - 1288834974657L << 22 | this.datacenterId << 17 | this.workerId << 12 | this.sequence; + } + + private long tilNextMillis(long lastTimestamp) { + long timestamp; + for(timestamp = this.timeGen(); timestamp <= lastTimestamp; timestamp = this.timeGen()) { + ; + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + public static String uuid() { + return java.util.UUID.randomUUID().toString().replaceAll("-", ""); + } + + public static String getNextCode() { + return Md5Utils.md5(IdUtils.uuid() + System.currentTimeMillis()).substring(startIndex,endIndex); + } + + + /** + * 获取随机UUID + * + * @return 随机UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线 + * + * @return 简化的UUID,去掉了横线 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/Seq.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/Seq.java new file mode 100644 index 00000000..7ecd061d --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/Seq.java @@ -0,0 +1,86 @@ +package com.fastbee.common.utils.uuid; + +import java.util.concurrent.atomic.AtomicInteger; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; + +/** + * @author ruoyi 序列生成类 + */ +public class Seq +{ + // 通用序列类型 + public static final String commSeqType = "COMMON"; + + // 上传序列类型 + public static final String uploadSeqType = "UPLOAD"; + + // 通用接口序列数 + private static AtomicInteger commSeq = new AtomicInteger(1); + + // 上传接口序列数 + private static AtomicInteger uploadSeq = new AtomicInteger(1); + + // 机器标识 + private static String machineCode = "A"; + + /** + * 获取通用序列号 + * + * @return 序列值 + */ + public static String getId() + { + return getId(commSeqType); + } + + /** + * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 + * + * @return 序列值 + */ + public static String getId(String type) + { + AtomicInteger atomicInt = commSeq; + if (uploadSeqType.equals(type)) + { + atomicInt = uploadSeq; + } + return getId(atomicInt, 3); + } + + /** + * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 + * + * @param atomicInt 序列数 + * @param length 数值长度 + * @return 序列值 + */ + public static String getId(AtomicInteger atomicInt, int length) + { + String result = DateUtils.dateTimeNow(); + result += machineCode; + result += getSeq(atomicInt, length); + return result; + } + + /** + * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 + * + * @return 序列值 + */ + private synchronized static String getSeq(AtomicInteger atomicInt, int length) + { + // 先取值再+1 + int value = atomicInt.getAndIncrement(); + + // 如果更新后值>=10 的 (length)幂次方则重置为1 + int maxSeq = (int) Math.pow(10, length); + if (atomicInt.get() >= maxSeq) + { + atomicInt.set(1); + } + // 转字符串,用0左补齐 + return StringUtils.padl(value, length); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/UUID.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/UUID.java new file mode 100644 index 00000000..304f63a9 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/utils/uuid/UUID.java @@ -0,0 +1,484 @@ +package com.fastbee.common.utils.uuid; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import com.fastbee.common.exception.UtilException; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author ruoyi + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低64有效位 */ + private final long leastSigBits; + + /** + * 私有构造 + * + * @param data 数据 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + *

+ * 版本号具有以下含意: + *

    + *
  • 1 基于时间的 UUID + *
  • 2 DCE 安全 UUID + *
  • 3 基于名称的 UUID + *
  • 4 随机生成的 UUID + *
+ * + * @return 此 {@code UUID} 的版本号 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + *

+ * 变体号具有以下含意: + *

    + *
  • 0 为 NCS 向后兼容保留 + *
  • 2 IETF RFC 4122(Leach-Salz), 用于此类 + *
  • 6 保留,微软向后兼容 + *
  • 7 保留供以后定义使用 + *
+ * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + *

+ * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
+ * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + *

+ * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + *

+ * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + *

+ * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + *

+ * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + *

+ * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (!isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (!isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (!isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (!isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + *

+ * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + *

+ * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 检查是否为time-based版本UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatAppResult.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatAppResult.java new file mode 100644 index 00000000..931a23a0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatAppResult.java @@ -0,0 +1,72 @@ +package com.fastbee.common.wechat; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +/** + * WeChat 调用api接口获取openid登信息后的返回类 + * @author fastb + * @date 2023-07-31 11:43 + */ +@Data +public class WeChatAppResult { + + /** + * 接口调用凭证 + */ + @JSONField(name = "access_token") + private String accessToken; + + /** + * access_token 接口调用凭证超时时间,单位(秒) + */ + @JSONField(name = "expires_in") + private Long expiresIn; + + /** + * 用户刷新 access_token + */ + @JSONField(name = "refresh_token") + private String refreshToken; + + /** + * 授权用户唯一标识 + */ + @JSONField(name = "openid") + private String openId; + + /** + * 用户授权的作用域(snsapi_userinfo) + */ + @JSONField(name = "scope") + private String scope; + + /** + * 当且仅当该移动应用已获得该用户的 userinfo 授权时,才会出现该字段 + */ + @JSONField(name = "unionid") + private String unionId; + + /** + * 错误码 + */ + @JSONField(name = "errcode") + private Integer errCode; + + /** + * 错误信息 + */ + @JSONField(name = "errmsg") + private String errMsg; + + /** + * 是否绑定手机号 + */ + private Boolean isBind; + + /** + * token 自定义登录状态 + */ + private String token; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginBody.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginBody.java new file mode 100644 index 00000000..60a47673 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginBody.java @@ -0,0 +1,89 @@ +package com.fastbee.common.wechat; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 微信端登录参数 + * @author fastb + * @date 2023-07-31 11:32 + */ +@Data +@Accessors(chain = true) +public class WeChatLoginBody { + + /** + * 传入参数:临时登录凭证 + */ + private String code; + + /** + * 临时获取用户手机号凭证 + */ + private String phoneCode; + + /** + * 传入参数 openid + */ + private String openId; + + /** + * 传入参数 session_key + */ + private String sessionKey; + + /** + * 传入参数 unionid + */ + private String unionId; + + /** + * 传入参数: 用户非敏感信息 + */ + private String rawData; + + /** + * 传入参数: 签名 + */ + private String signature; + + /** + * 传入参数: 用户敏感信息 + */ + private String encryptedData; + + /** + * 传入参数: 解密算法的向量 + */ + private String iv; + + /** + * 用户手机号 + */ + private String userPhone; + + /** + * 用户密码 + */ + private String userPwd; + + /** + * 接口调用凭证 + */ + private String accessToken; + + /** + * access_token 接口调用凭证超时时间,单位(秒) + */ + private Long expiresIn; + + /** + * 用户刷新 access_token + */ + private String refreshToken; + + /** + * 用户授权的作用域(snsapi_userinfo) + */ + private String scope; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginResult.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginResult.java new file mode 100644 index 00000000..08c09ca9 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatLoginResult.java @@ -0,0 +1,22 @@ +package com.fastbee.common.wechat; + +import lombok.Data; + +/** + * 微信登录返回结果 + * @author fastb + * @date 2023-08-15 16:43 + */ +@Data +public class WeChatLoginResult { + + /** + * 登录成功返回token + */ + private String token; + + /** + * 绑定账号跳转页面 + */ + private String bindId; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatMiniProgramResult.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatMiniProgramResult.java new file mode 100644 index 00000000..7f7db8af --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatMiniProgramResult.java @@ -0,0 +1,42 @@ +package com.fastbee.common.wechat; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +/** + * @author fastb + * @date 2023-08-14 10:07 + */ +@Data +public class WeChatMiniProgramResult { + + /** + * 会话密钥 + */ + @JSONField(name = "session_key") + private String sessionKey; + + /** + * 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台账号下会返回,详见 UnionID 机制说明 + */ + @JSONField(name = "unionid") + private String unionId; + + /** + * 错误信息 + */ + @JSONField(name = "errmsg") + private String errMsg; + + /** + * 用户唯一标识 + */ + @JSONField(name = "openid") + private String openId; + + /** + * 错误码 + */ + @JSONField(name = "errcode") + private String errCode; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatPhoneInfo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatPhoneInfo.java new file mode 100644 index 00000000..01283209 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatPhoneInfo.java @@ -0,0 +1,41 @@ +package com.fastbee.common.wechat; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +/** + * @author fastb + * @date 2023-08-16 17:48 + */ +@Data +public class WeChatPhoneInfo { + + @JSONField(name = "errcode") + private String errCode; + + @JSONField(name = "errmsg") + private String errmsg; + + @JSONField(name = "phone_info") + private PhoneInfo phoneInfo; + + @Data + public class PhoneInfo { + + private String phoneNumber; + + private String purePhoneNumber; + + private String countryCode; + + private WaterMark watermark; + } + + @Data + class WaterMark { + + private String timestamp; + + private String appid; + } +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatUserInfo.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatUserInfo.java new file mode 100644 index 00000000..48a06c90 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/wechat/WeChatUserInfo.java @@ -0,0 +1,80 @@ +package com.fastbee.common.wechat; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +/** + * 微信用户信息 + * @author fastb + * @date 2023-07-31 14:56 + */ +@Data +public class WeChatUserInfo { + + /** + * 普通用户的标识,对当前开发者账号唯一 + */ + @JSONField(name = "openid") + private String openId; + + /** + * 普通用户昵称 + */ + @JSONField(name = "nickname") + private String nickname; + + /** + * 普通用户性别,1 为男性,2 为女性 + */ + @JSONField(name = "sex") + private Integer sex; + + /** + * 普通用户个人资料填写的省份 + */ + @JSONField(name = "province") + private String province; + + /** + * 普通用户个人资料填写的城市 + */ + @JSONField(name = "city") + private String city; + + /** + * 国家,如中国为 CN + */ + @JSONField(name = "country") + private String country; + + /** + * 用户头像,最后一个数值代表正方形头像大小(有 0、46、64、96、132 数值可选,0 代表 640*640 正方形头像),用户没有头像时该项为空 + */ + @JSONField(name = "headimgurl") + private String headImgUrl; + + /** + * 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) + */ + @JSONField(name = "privilege") + private String privilege; + + /** + * 用户统一标识。针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的。 + */ + @JSONField(name = "unionid") + private String unionId; + + /** + * 错误码 + */ + @JSONField(name = "errcode") + private Integer errCode; + + /** + * 错误信息 + */ + @JSONField(name = "errmsg") + private String errMsg; + +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/xss/Xss.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/xss/Xss.java new file mode 100644 index 00000000..5f79e8a0 --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/xss/Xss.java @@ -0,0 +1,27 @@ +package com.fastbee.common.xss; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义xss校验注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Constraint(validatedBy = { XssValidator.class }) +public @interface Xss +{ + String message() + + default "不允许任何脚本运行"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/springboot/fastbee-common/src/main/java/com/fastbee/common/xss/XssValidator.java b/springboot/fastbee-common/src/main/java/com/fastbee/common/xss/XssValidator.java new file mode 100644 index 00000000..cf6a6dee --- /dev/null +++ b/springboot/fastbee-common/src/main/java/com/fastbee/common/xss/XssValidator.java @@ -0,0 +1,34 @@ +package com.fastbee.common.xss; + +import com.fastbee.common.utils.StringUtils; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 自定义xss校验注解实现 + * + * @author ruoyi + */ +public class XssValidator implements ConstraintValidator +{ + private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) + { + if (StringUtils.isBlank(value)) + { + return true; + } + return !containsHtml(value); + } + + public static boolean containsHtml(String value) + { + Pattern pattern = Pattern.compile(HTML_PATTERN); + Matcher matcher = pattern.matcher(value); + return matcher.matches(); + } +} \ No newline at end of file diff --git a/springboot/fastbee-framework/pom.xml b/springboot/fastbee-framework/pom.xml new file mode 100644 index 00000000..67e35e98 --- /dev/null +++ b/springboot/fastbee-framework/pom.xml @@ -0,0 +1,64 @@ + + + + fastbee + com.fastbee + 3.8.5 + + 4.0.0 + + fastbee-framework + + + framework框架核心 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.fastbee + fastbee-system-service + + + + + com.alibaba + druid-spring-boot-starter + + + + + pro.fessional + kaptcha + + + javax.servlet-api + javax.servlet + + + + + + + com.github.oshi + oshi-core + + + + + \ No newline at end of file diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataScopeAspect.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataScopeAspect.java new file mode 100644 index 00000000..813d9d3f --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,167 @@ +package com.fastbee.framework.aspectj; + +import java.util.ArrayList; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; +import com.fastbee.common.annotation.DataScope; +import com.fastbee.common.core.domain.BaseEntity; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.text.Convert; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.security.context.PermissionContextHolder; + +/** + * 数据过滤处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class DataScopeAspect +{ + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + @Before("@annotation(controllerDataScope)") + public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable + { + clearDataScope(point); + handleDataScope(point, controllerDataScope); + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) + { + SysUser currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) + { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias(), permission); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 + * @param permission 权限字符 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) + { + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList(); + + for (SysRole role : user.getRoles()) + { + String dataScope = role.getDataScope(); + if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) + { + continue; + } + if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) + && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) + { + continue; + } + if (DATA_SCOPE_ALL.equals(dataScope)) + { + sqlString = new StringBuilder(); + break; + } + else if (DATA_SCOPE_CUSTOM.equals(dataScope)) + { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, + role.getRoleId())); + } + else if (DATA_SCOPE_DEPT.equals(dataScope)) + { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); + } + else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) + { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", + deptAlias, user.getDeptId(), user.getDeptId())); + } + else if (DATA_SCOPE_SELF.equals(dataScope)) + { + if (StringUtils.isNotBlank(userAlias)) + { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); + } + else + { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + } + conditions.add(dataScope); + } + + if (StringUtils.isNotBlank(sqlString.toString())) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 拼接权限sql前先清空params.dataScope参数防止注入 + */ + private void clearDataScope(final JoinPoint joinPoint) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, ""); + } + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataSourceAspect.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataSourceAspect.java new file mode 100644 index 00000000..9a31e44b --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/DataSourceAspect.java @@ -0,0 +1,72 @@ +package com.fastbee.framework.aspectj; + +import java.util.Objects; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.fastbee.common.annotation.DataSource; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.datasource.DynamicDataSourceContextHolder; + +/** + * 多数据源处理 + * + * @author ruoyi + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect +{ + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.fastbee.common.annotation.DataSource)" + + "|| @within(com.fastbee.common.annotation.DataSource)") + public void dsPointCut() + { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable + { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) + { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try + { + return point.proceed(); + } + finally + { + // 销毁数据源 在执行方法之后 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 获取需要切换的数据源 + */ + public DataSource getDataSource(ProceedingJoinPoint point) + { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) + { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/LogAspect.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/LogAspect.java new file mode 100644 index 00000000..bd03f3f7 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/LogAspect.java @@ -0,0 +1,227 @@ +package com.fastbee.framework.aspectj; + +import java.util.Collection; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.enums.BusinessStatus; +import com.fastbee.common.enums.HttpMethod; +import com.fastbee.common.filter.PropertyPreExcludeFilter; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.ServletUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.ip.IpUtils; +import com.fastbee.framework.manager.AsyncManager; +import com.fastbee.framework.manager.factory.AsyncFactory; +import com.fastbee.system.domain.SysOperLog; + +/** + * 操作日志记录处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class LogAspect +{ + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + /** 排除敏感属性字段 */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) + { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) + { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) + { + try + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // *========数据库日志=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + if (loginUser != null) + { + operLog.setOperName(loginUser.getUsername()); + } + + if (e != null) + { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 保存数据库 + AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); + } + catch (Exception exp) + { + // 记录本地异常日志 + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception + { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) + { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) + { + operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception + { + String requestMethod = operLog.getRequestMethod(); + if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) + { + String params = argsArrayToString(joinPoint.getArgs()); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + else + { + Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); + operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter()), 0, 2000)); + } + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray) + { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) + { + for (Object o : paramsArray) + { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) + { + try + { + String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter()); + params += jsonObj.toString() + " "; + } + catch (Exception e) + { + } + } + } + } + return params.trim(); + } + + /** + * 忽略敏感属性 + */ + public PropertyPreExcludeFilter excludePropertyPreFilter() + { + return new PropertyPreExcludeFilter().addExcludes(EXCLUDE_PROPERTIES); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) + { + Class clazz = o.getClass(); + if (clazz.isArray()) + { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } + else if (Collection.class.isAssignableFrom(clazz)) + { + Collection collection = (Collection) o; + for (Object value : collection) + { + return value instanceof MultipartFile; + } + } + else if (Map.class.isAssignableFrom(clazz)) + { + Map map = (Map) o; + for (Object value : map.entrySet()) + { + Map.Entry entry = (Map.Entry) value; + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/RateLimiterAspect.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/RateLimiterAspect.java new file mode 100644 index 00000000..caed1bd1 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/aspectj/RateLimiterAspect.java @@ -0,0 +1,90 @@ +package com.fastbee.framework.aspectj; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; +import com.fastbee.common.annotation.RateLimiter; +import com.fastbee.common.enums.LimitType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.ServletUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.ip.IpUtils; + +/** + * 限流处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class RateLimiterAspect +{ + private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); + + private RedisTemplate redisTemplate; + + private RedisScript limitScript; + + @Autowired + public void setRedisTemplate1(RedisTemplate redisTemplate) + { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(RedisScript limitScript) + { + this.limitScript = limitScript; + } + + @Before("@annotation(rateLimiter)") + public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable + { + int time = rateLimiter.time(); + int count = rateLimiter.count(); + + String combineKey = getCombineKey(rateLimiter, point); + List keys = Collections.singletonList(combineKey); + try + { + Long number = redisTemplate.execute(limitScript, keys, count, time); + if (StringUtils.isNull(number) || number.intValue() > count) + { + throw new ServiceException("访问过于频繁,请稍候再试"); + } + log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey); + } + catch (ServiceException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException("服务器限流异常,请稍候再试"); + } + } + + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) + { + StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); + if (rateLimiter.limitType() == LimitType.IP) + { + stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest())).append("-"); + } + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + stringBuffer.append(targetClass.getName()).append("-").append(method.getName()); + return stringBuffer.toString(); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ApplicationConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ApplicationConfig.java new file mode 100644 index 00000000..3157801a --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ApplicationConfig.java @@ -0,0 +1,30 @@ +package com.fastbee.framework.config; + +import java.util.TimeZone; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +/** + * 程序注解配置 + * + * @author ruoyi + */ +@Configuration +// 表示通过aop框架暴露该代理对象,AopContext能够访问 +@EnableAspectJAutoProxy(exposeProxy = true) +// 指定要扫描的Mapper类的包的路径 +@MapperScan("com.fastbee.**.mapper") +public class ApplicationConfig +{ + /** + * 时区配置 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() + { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/CaptchaConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/CaptchaConfig.java new file mode 100644 index 00000000..26f4d0f0 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/CaptchaConfig.java @@ -0,0 +1,83 @@ +package com.fastbee.framework.config; + +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import static com.google.code.kaptcha.Constants.*; + +/** + * 验证码配置 + * + * @author ruoyi + */ +@Configuration +public class CaptchaConfig +{ + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.fastbee.framework.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/DruidConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/DruidConfig.java new file mode 100644 index 00000000..6614ed63 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/DruidConfig.java @@ -0,0 +1,126 @@ +package com.fastbee.framework.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import com.alibaba.druid.util.Utils; +import com.fastbee.common.enums.DataSourceType; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.framework.config.properties.DruidProperties; +import com.fastbee.framework.datasource.DynamicDataSource; + +/** + * druid 配置多数据源 + * + * @author ruoyi + */ +@Configuration +public class DruidConfig +{ + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource masterDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean + @ConfigurationProperties("spring.datasource.druid.slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") + public DataSource slaveDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean(name = "dynamicDataSource") + @Primary + public DynamicDataSource dataSource(DataSource masterDataSource) + { + Map targetDataSources = new HashMap<>(); + targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); + setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + return new DynamicDataSource(masterDataSource, targetDataSources); + } + + /** + * 设置数据源 + * + * @param targetDataSources 备选数据源集合 + * @param sourceName 数据源名称 + * @param beanName bean名称 + */ + public void setDataSource(Map targetDataSources, String sourceName, String beanName) + { + try + { + DataSource dataSource = SpringUtils.getBean(beanName); + targetDataSources.put(sourceName, dataSource); + } + catch (Exception e) + { + } + } + + /** + * 去除监控页面底部的广告 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) + { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + // 创建filter进行过滤 + Filter filter = new Filter() + { + @Override + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException + { + } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + @Override + public void destroy() + { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FastJson2JsonRedisSerializer.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FastJson2JsonRedisSerializer.java new file mode 100644 index 00000000..43f1889d --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FastJson2JsonRedisSerializer.java @@ -0,0 +1,48 @@ +package com.fastbee.framework.config; + +import java.nio.charset.Charset; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; + +/** + * Redis使用FastJson序列化 + * + * @author ruoyi + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer +{ + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + public FastJson2JsonRedisSerializer(Class clazz) + { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException + { + if (t == null) + { + return new byte[0]; + } + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException + { + if (bytes == null || bytes.length <= 0) + { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FilterConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FilterConfig.java new file mode 100644 index 00000000..8e0e76ef --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/FilterConfig.java @@ -0,0 +1,58 @@ +package com.fastbee.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.fastbee.common.filter.RepeatableFilter; +import com.fastbee.common.filter.XssFilter; +import com.fastbee.common.utils.StringUtils; + +/** + * Filter配置 + * + * @author ruoyi + */ +@Configuration +public class FilterConfig +{ + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") + public FilterRegistrationBean xssFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + public FilterRegistrationBean someFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/KaptchaTextCreator.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/KaptchaTextCreator.java new file mode 100644 index 00000000..a468e30c --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/KaptchaTextCreator.java @@ -0,0 +1,68 @@ +package com.fastbee.framework.config; + +import java.util.Random; +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +/** + * 验证码文本生成器 + * + * @author ruoyi + */ +public class KaptchaTextCreator extends DefaultTextCreator +{ + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() + { + Integer result = 0; + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = random.nextInt(3); + if (randomoperands == 0) + { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } + else if (randomoperands == 1) + { + if ((x != 0) && y % x == 0) + { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } + else + { + if (x >= y) + { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } + else + { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} \ No newline at end of file diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/MyBatisConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/MyBatisConfig.java new file mode 100644 index 00000000..a1c902a6 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/MyBatisConfig.java @@ -0,0 +1,177 @@ +package com.fastbee.framework.config; + +import com.baomidou.mybatisplus.autoconfigure.SpringBootVFS; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import com.fastbee.common.utils.StringUtils; +import org.apache.ibatis.io.VFS; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.env.Environment; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.util.ClassUtils; + +import javax.sql.DataSource; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +/** + * Mybatis支持*匹配扫描包 + * + * @author ruoyi + */ +@Configuration +public class MyBatisConfig +{ + @Autowired + private Environment env; + + static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; + + public static String setTypeAliasesPackage(String typeAliasesPackage) + { + ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); + MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); + List allResult = new ArrayList(); + try + { + for (String aliasesPackage : typeAliasesPackage.split(",")) + { + List result = new ArrayList(); + aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; + Resource[] resources = resolver.getResources(aliasesPackage); + if (resources != null && resources.length > 0) + { + MetadataReader metadataReader = null; + for (Resource resource : resources) + { + if (resource.isReadable()) + { + metadataReader = metadataReaderFactory.getMetadataReader(resource); + try + { + result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); + } + catch (ClassNotFoundException e) + { + e.printStackTrace(); + } + } + } + } + if (result.size() > 0) + { + HashSet hashResult = new HashSet(result); + allResult.addAll(hashResult); + } + } + if (allResult.size() > 0) + { + typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); + } + else + { + throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + return typeAliasesPackage; + } + + public Resource[] resolveMapperLocations(String[] mapperLocations) + { + ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); + List resources = new ArrayList(); + if (mapperLocations != null) + { + for (String mapperLocation : mapperLocations) + { + try + { + Resource[] mappers = resourceResolver.getResources(mapperLocation); + resources.addAll(Arrays.asList(mappers)); + } + catch (IOException e) + { + // ignore + } + } + } + return resources.toArray(new Resource[resources.size()]); + } + + /** + * mybatis 配置 + */ +// @Bean(name = "mysqlSessionFactory") +// @Primary +// public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception +// { +// String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); +// String mapperLocations = env.getProperty("mybatis.mapperLocations"); +// String configLocation = env.getProperty("mybatis.configLocation"); +// typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); +// VFS.addImplClass(SpringBootVFS.class); +// +// final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); +// sessionFactory.setDataSource(dataSource); +// sessionFactory.setTypeAliasesPackage(typeAliasesPackage); +// sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); +// sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); +// return sessionFactory.getObject(); +// } + + /** + * mybatis-plus 配置:把 SqlSessionFactoryBean 换成 MybatisSqlSessionFactoryBean就行 + * @param dataSource 数据源 + * @return + */ + @Bean(name = "mysqlSessionFactory") + @Primary + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception + { + String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage"); + String mapperLocations = env.getProperty("mybatis-plus.mapperLocations"); + String configLocation = env.getProperty("mybatis-plus.configLocation"); + typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); + VFS.addImplClass(SpringBootVFS.class); + + final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); + sessionFactory.setDataSource(dataSource); + sessionFactory.setTypeAliasesPackage(typeAliasesPackage); + sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); + sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); + return sessionFactory.getObject(); + } + + @Bean(name = "mysqlTransactionManager") + @Primary + public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("dynamicDataSource") DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } + + @Bean(name = "mysqlSqlSessionTemplate") + @Primary + public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSessionFactory") SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } + +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/RedisConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/RedisConfig.java new file mode 100644 index 00000000..909d32d9 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/RedisConfig.java @@ -0,0 +1,69 @@ +package com.fastbee.framework.config; + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * redis配置 + * + * @author ruoyi + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport +{ + @Bean + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } + + @Bean + public DefaultRedisScript limitScript() + { + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(limitScriptText()); + redisScript.setResultType(Long.class); + return redisScript; + } + + /** + * 限流脚本 + */ + private String limitScriptText() + { + return "local key = KEYS[1]\n" + + "local count = tonumber(ARGV[1])\n" + + "local time = tonumber(ARGV[2])\n" + + "local current = redis.call('get', key);\n" + + "if current and tonumber(current) > count then\n" + + " return tonumber(current);\n" + + "end\n" + + "current = redis.call('incr', key)\n" + + "if tonumber(current) == 1 then\n" + + " redis.call('expire', key, time)\n" + + "end\n" + + "return tonumber(current);"; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java new file mode 100644 index 00000000..76e98745 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java @@ -0,0 +1,73 @@ +package com.fastbee.framework.config; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.Constants; +import com.fastbee.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 通用配置 + * + * @author ruoyi + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer +{ + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) + { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") + .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); + + /** swagger配置 */ + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") + .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());; + } + + /** + * 自定义拦截规则 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } + + /** + * 跨域配置 + */ + @Bean + public CorsFilter corsFilter() + { + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + // 设置访问源地址 + config.addAllowedOriginPattern("*"); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置访问源请求方法 + config.addAllowedMethod("*"); + // 有效期 1800秒 + config.setMaxAge(1800L); + // 添加映射路径,拦截一切请求 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + // 返回新的CorsFilter + return new CorsFilter(source); + } +} \ No newline at end of file diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/SecurityConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/SecurityConfig.java new file mode 100644 index 00000000..8281994c --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/SecurityConfig.java @@ -0,0 +1,152 @@ +package com.fastbee.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.web.filter.CorsFilter; +import com.fastbee.framework.config.properties.PermitAllUrlProperties; +import com.fastbee.framework.security.filter.JwtAuthenticationTokenFilter; +import com.fastbee.framework.security.handle.AuthenticationEntryPointImpl; +import com.fastbee.framework.security.handle.LogoutSuccessHandlerImpl; + +/** + * spring security配置 + * + * @author ruoyi + */ +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter +{ + /** + * 自定义用户认证逻辑 + */ + @Autowired + private UserDetailsService userDetailsService; + + /** + * 认证失败处理类 + */ + @Autowired + private AuthenticationEntryPointImpl unauthorizedHandler; + + /** + * 退出处理类 + */ + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + + /** + * token认证过滤器 + */ + @Autowired + private JwtAuthenticationTokenFilter authenticationTokenFilter; + + /** + * 跨域过滤器 + */ + @Autowired + private CorsFilter corsFilter; + + /** + * 允许匿名访问的地址 + */ + @Autowired + private PermitAllUrlProperties permitAllUrl; + + /** + * 解决 无法直接注入 AuthenticationManager + * + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception + { + return super.authenticationManagerBean(); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception + { + // 注解标记允许匿名访问的url + ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); + permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); + + httpSecurity + // CSRF禁用,因为不使用session + .csrf().disable() + // 禁用HTTP响应标头 + .headers().cacheControl().disable().and() + // 认证失败处理类 + .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() + // 基于token,所以不需要session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 过滤请求 + .authorizeRequests() + // 对于登录login 注册register 验证码captchaImage 允许匿名访问 + .antMatchers("/login", "/register", "/captchaImage","/iot/tool/register","/iot/tool/ntp","/iot/tool/download", + "/iot/tool/mqtt/auth","/iot/tool/mqtt/authv5","/iot/tool/mqtt/webhook","/iot/tool/mqtt/webhookv5","/auth/**/**", + "/wechat/mobileLogin", "/wechat/miniLogin", "/wechat/wxBind/callback").permitAll() + .antMatchers("/zlmhook/**").permitAll() + .antMatchers("/goview/sys/login","/goview/project/getData").permitAll() + // 静态资源,可匿名访问 + .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() + .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable(); + // 添加Logout filter + httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); + // 添加JWT filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + // 添加CORS filter + httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); + httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); + } + + /** + * 强散列哈希加密实现 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() + { + return new BCryptPasswordEncoder(); + } + + /** + * 身份认证接口 + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception + { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ServerConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ServerConfig.java new file mode 100644 index 00000000..a07d6e0a --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ServerConfig.java @@ -0,0 +1,32 @@ +package com.fastbee.framework.config; + +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.fastbee.common.utils.ServletUtils; + +/** + * 服务相关配置 + * + * @author ruoyi + */ +@Component +public class ServerConfig +{ + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ThreadPoolConfig.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ThreadPoolConfig.java new file mode 100644 index 00000000..8560f0f6 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/ThreadPoolConfig.java @@ -0,0 +1,63 @@ +package com.fastbee.framework.config; + +import com.fastbee.common.utils.Threads; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置 + * + * @author ruoyi + **/ +@Configuration +public class ThreadPoolConfig +{ + // 核心线程池大小 + private int corePoolSize = 50; + + // 最大可创建的线程数 + private int maxPoolSize = 200; + + // 队列最大长度 + private int queueCapacity = 1000; + + // 线程池维护线程所允许的空闲时间 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() + { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() + { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) + { + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/DruidProperties.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/DruidProperties.java new file mode 100644 index 00000000..057403ec --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/DruidProperties.java @@ -0,0 +1,77 @@ +package com.fastbee.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; + +/** + * druid 配置属性 + * + * @author ruoyi + */ +@Configuration +public class DruidProperties +{ + @Value("${spring.datasource.druid.initialSize}") + private int initialSize; + + @Value("${spring.datasource.druid.minIdle}") + private int minIdle; + + @Value("${spring.datasource.druid.maxActive}") + private int maxActive; + + @Value("${spring.datasource.druid.maxWait}") + private int maxWait; + + @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") + private int maxEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.validationQuery}") + private String validationQuery; + + @Value("${spring.datasource.druid.testWhileIdle}") + private boolean testWhileIdle; + + @Value("${spring.datasource.druid.testOnBorrow}") + private boolean testOnBorrow; + + @Value("${spring.datasource.druid.testOnReturn}") + private boolean testOnReturn; + + public DruidDataSource dataSource(DruidDataSource datasource) + { + /** 配置初始化大小、最小、最大 */ + datasource.setInitialSize(initialSize); + datasource.setMaxActive(maxActive); + datasource.setMinIdle(minIdle); + + /** 配置获取连接等待超时的时间 */ + datasource.setMaxWait(maxWait); + + /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); + + /** + * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + */ + datasource.setValidationQuery(validationQuery); + /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ + datasource.setTestWhileIdle(testWhileIdle); + /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnBorrow(testOnBorrow); + /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnReturn(testOnReturn); + return datasource; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/PermitAllUrlProperties.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/PermitAllUrlProperties.java new file mode 100644 index 00000000..71baae88 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/config/properties/PermitAllUrlProperties.java @@ -0,0 +1,72 @@ +package com.fastbee.framework.config.properties; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Pattern; +import org.apache.commons.lang3.RegExUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import com.fastbee.common.annotation.Anonymous; + +/** + * 设置Anonymous注解允许匿名访问的url + * + * @author ruoyi + */ +@Configuration +public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware +{ + private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); + + private ApplicationContext applicationContext; + + private List urls = new ArrayList<>(); + + public String ASTERISK = "*"; + + @Override + public void afterPropertiesSet() + { + RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class); + Map map = mapping.getHandlerMethods(); + + map.keySet().forEach(info -> { + HandlerMethod handlerMethod = map.get(info); + + // 获取方法上边的注解 替代path variable 为 * + Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class); + Optional.ofNullable(method).ifPresent(anonymous -> info.getPatternsCondition().getPatterns() + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + + // 获取类上边的注解, 替代path variable 为 * + Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class); + Optional.ofNullable(controller).ifPresent(anonymous -> info.getPatternsCondition().getPatterns() + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + }); + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException + { + this.applicationContext = context; + } + + public List getUrls() + { + return urls; + } + + public void setUrls(List urls) + { + this.urls = urls; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSource.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSource.java new file mode 100644 index 00000000..2b8a56f5 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSource.java @@ -0,0 +1,26 @@ +package com.fastbee.framework.datasource; + +import java.util.Map; +import javax.sql.DataSource; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * 动态数据源 + * + * @author ruoyi + */ +public class DynamicDataSource extends AbstractRoutingDataSource +{ + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) + { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() + { + return DynamicDataSourceContextHolder.getDataSourceType(); + } +} \ No newline at end of file diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSourceContextHolder.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 00000000..04e5877f --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,45 @@ +package com.fastbee.framework.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 数据源切换处理 + * + * @author ruoyi + */ +public class DynamicDataSourceContextHolder +{ + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置数据源的变量 + */ + public static void setDataSourceType(String dsType) + { + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 获得数据源的变量 + */ + public static String getDataSourceType() + { + return CONTEXT_HOLDER.get(); + } + + /** + * 清空数据源变量 + */ + public static void clearDataSourceType() + { + CONTEXT_HOLDER.remove(); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/RepeatSubmitInterceptor.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 00000000..7ce4bc2b --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,55 @@ +package com.fastbee.framework.interceptor; + +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.annotation.RepeatSubmit; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.ServletUtils; + +/** + * 防止重复提交拦截器 + * + * @author ruoyi + */ +@Component +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor +{ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception + { + if (handler instanceof HandlerMethod) + { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) + { + if (this.isRepeatSubmit(request, annotation)) + { + AjaxResult ajaxResult = AjaxResult.error(annotation.message()); + ServletUtils.renderString(response, JSON.toJSONString(ajaxResult)); + return false; + } + } + return true; + } + else + { + return true; + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * + * @param request + * @return + * @throws Exception + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation); +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/impl/SameUrlDataInterceptor.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/impl/SameUrlDataInterceptor.java new file mode 100644 index 00000000..fabf4f9e --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -0,0 +1,110 @@ +package com.fastbee.framework.interceptor.impl; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.annotation.RepeatSubmit; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.filter.RepeatedlyRequestWrapper; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.http.HttpHelper; +import com.fastbee.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 判断请求url和数据是否和上一次相同, + * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * + * @author ruoyi + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor +{ + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + @Autowired + private RedisCache redisCache; + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) + { + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) + { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + nowParams = HttpHelper.getBodyString(repeatedlyRequest); + } + + // body参数为空,获取Parameter的数据 + if (StringUtils.isEmpty(nowParams)) + { + nowParams = JSON.toJSONString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); + + // 唯一值(没有消息头则使用请求地址) + String submitKey = StringUtils.trimToEmpty(request.getHeader(header)); + + // 唯一标识(指定key + url + 消息头) + String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; + + Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); + if (sessionObj != null) + { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) + { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) + { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) + { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap, int interval) + { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < interval) + { + return true; + } + return false; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/AsyncManager.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/AsyncManager.java new file mode 100644 index 00000000..12d73e51 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/AsyncManager.java @@ -0,0 +1,55 @@ +package com.fastbee.framework.manager; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import com.fastbee.common.utils.Threads; +import com.fastbee.common.utils.spring.SpringUtils; + +/** + * 异步任务管理器 + * + * @author ruoyi + */ +public class AsyncManager +{ + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncManager(){} + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() + { + return me; + } + + /** + * 执行任务 + * + * @param task 任务 + */ + public void execute(TimerTask task) + { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 停止任务线程池 + */ + public void shutdown() + { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/ShutdownManager.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/ShutdownManager.java new file mode 100644 index 00000000..a4e6efdd --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/ShutdownManager.java @@ -0,0 +1,39 @@ +package com.fastbee.framework.manager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import javax.annotation.PreDestroy; + +/** + * 确保应用退出时能关闭后台线程 + * + * @author ruoyi + */ +@Component +public class ShutdownManager +{ + private static final Logger logger = LoggerFactory.getLogger("sys-user"); + + @PreDestroy + public void destroy() + { + shutdownAsyncManager(); + } + + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() + { + try + { + logger.info("====关闭后台任务任务线程池===="); + AsyncManager.me().shutdown(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/factory/AsyncFactory.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/factory/AsyncFactory.java new file mode 100644 index 00000000..34bd8098 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/manager/factory/AsyncFactory.java @@ -0,0 +1,102 @@ +package com.fastbee.framework.manager.factory; + +import java.util.TimerTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.utils.LogUtils; +import com.fastbee.common.utils.ServletUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.ip.AddressUtils; +import com.fastbee.common.utils.ip.IpUtils; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.system.domain.SysLogininfor; +import com.fastbee.system.domain.SysOperLog; +import com.fastbee.system.service.ISysLogininforService; +import com.fastbee.system.service.ISysOperLogService; +import eu.bitwalker.useragentutils.UserAgent; + +/** + * 异步工厂(产生任务用) + * + * @author ruoyi + */ +public class AsyncFactory +{ + private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息 + * @param args 列表 + * @return 任务task + */ + public static TimerTask recordLogininfor(final String username, final String status, final String message, + final Object... args) + { + final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + return new TimerTask() + { + @Override + public void run() + { + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(LogUtils.getBlock(ip)); + s.append(address); + s.append(LogUtils.getBlock(username)); + s.append(LogUtils.getBlock(status)); + s.append(LogUtils.getBlock(message)); + // 打印信息到日志 + sys_user_logger.info(s.toString(), args); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 日志状态 + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) + { + logininfor.setStatus(Constants.SUCCESS); + } + else if (Constants.LOGIN_FAIL.equals(status)) + { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); + } + }; + } + + /** + * 操作日志记录 + * + * @param operLog 操作日志信息 + * @return 任务task + */ + public static TimerTask recordOper(final SysOperLog operLog) + { + return new TimerTask() + { + @Override + public void run() + { + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); + } + }; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/LambdaQueryWrapperX.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/LambdaQueryWrapperX.java new file mode 100644 index 00000000..bfa330f7 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/LambdaQueryWrapperX.java @@ -0,0 +1,136 @@ +package com.fastbee.framework.mybatis; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + *

+ * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class LambdaQueryWrapperX extends LambdaQueryWrapper { + + public LambdaQueryWrapperX likeIfPresent(SFunction column, String val) { + if (StringUtils.hasText(val)) { + return (LambdaQueryWrapperX) super.like(column, val); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Collection values) { + if (!CollectionUtils.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Object... values) { + if (!ArrayUtil.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX eqIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (LambdaQueryWrapperX) super.eq(column, val); + } + return this; + } + + public LambdaQueryWrapperX neIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (LambdaQueryWrapperX) super.ne(column, val); + } + return this; + } + + public LambdaQueryWrapperX gtIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.gt(column, val); + } + return this; + } + + public LambdaQueryWrapperX geIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.ge(column, val); + } + return this; + } + + public LambdaQueryWrapperX ltIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.lt(column, val); + } + return this; + } + + public LambdaQueryWrapperX leIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.le(column, val); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (LambdaQueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (LambdaQueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (LambdaQueryWrapperX) le(column, val2); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object[] values) { + Object val1 = ArrayUtils.get(values, 0); + Object val2 = ArrayUtils.get(values, 1); + return betweenIfPresent(column, val1, val2); + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public LambdaQueryWrapperX eq(boolean condition, SFunction column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public LambdaQueryWrapperX eq(SFunction column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public LambdaQueryWrapperX orderByDesc(SFunction column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public LambdaQueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public LambdaQueryWrapperX in(SFunction column, Collection coll) { + super.in(column, coll); + return this; + } + +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/QueryWrapperX.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/QueryWrapperX.java new file mode 100644 index 00000000..44ba9f7d --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/QueryWrapperX.java @@ -0,0 +1,140 @@ +package com.fastbee.framework.mybatis; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + * + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class QueryWrapperX extends QueryWrapper { + + public QueryWrapperX likeIfPresent(String column, String val) { + if (StringUtils.hasText(val)) { + return (QueryWrapperX) super.like(column, val); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Collection values) { + if (!CollectionUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Object... values) { + if (!ArrayUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX eqIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.eq(column, val); + } + return this; + } + + public QueryWrapperX neIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ne(column, val); + } + return this; + } + + public QueryWrapperX gtIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.gt(column, val); + } + return this; + } + + public QueryWrapperX geIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ge(column, val); + } + return this; + } + + public QueryWrapperX ltIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.lt(column, val); + } + return this; + } + + public QueryWrapperX leIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.le(column, val); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (QueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (QueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (QueryWrapperX) le(column, val2); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object[] values) { + if (values!= null && values.length != 0 && values[0] != null && values[1] != null) { + return (QueryWrapperX) super.between(column, values[0], values[1]); + } + if (values!= null && values.length != 0 && values[0] != null) { + return (QueryWrapperX) ge(column, values[0]); + } + if (values!= null && values.length != 0 && values[1] != null) { + return (QueryWrapperX) le(column, values[1]); + } + return this; + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public QueryWrapperX eq(boolean condition, String column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public QueryWrapperX eq(String column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public QueryWrapperX orderByDesc(String column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public QueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public QueryWrapperX in(String column, Collection coll) { + super.in(column, coll); + return this; + } + +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/mapper/BaseMapperX.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/mapper/BaseMapperX.java new file mode 100644 index 00000000..e6252387 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/mapper/BaseMapperX.java @@ -0,0 +1,112 @@ +package com.fastbee.framework.mybatis.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.fastbee.common.core.domain.PageParam; +import com.fastbee.common.core.domain.PageResult; +import com.fastbee.framework.mybatis.utils.MyBatisUtils; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 + *

+ * 为什么继承 MPJBaseMapper 接口?支持 MyBatis Plus 多表 Join 的能力。 + */ +public interface BaseMapperX extends BaseMapper { + + default PageResult selectPage(PageParam pageParam, @Param("ew") Wrapper queryWrapper) { + // MyBatis Plus 查询 + IPage mpPage = MyBatisUtils.buildPage(pageParam); + selectPage(mpPage, queryWrapper); + // 转换返回 + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + default T selectOne(String field, Object value) { + return selectOne(new QueryWrapper().eq(field, value)); + } + + default T selectOne(SFunction field, Object value) { + return selectOne(new LambdaQueryWrapper().eq(field, value)); + } + + default T selectOne(String field1, Object value1, String field2, Object value2) { + return selectOne(new QueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default T selectOne(SFunction field1, Object value1, SFunction field2, Object value2) { + return selectOne(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default Long selectCount() { + return selectCount(new QueryWrapper()); + } + + default Long selectCount(String field, Object value) { + return selectCount(new QueryWrapper().eq(field, value)); + } + + default Long selectCount(SFunction field, Object value) { + return selectCount(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList() { + return selectList(new QueryWrapper<>()); + } + + default List selectList(String field, Object value) { + return selectList(new QueryWrapper().eq(field, value)); + } + + default List selectList(SFunction field, Object value) { + return selectList(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList(String field, Collection values) { + return selectList(new QueryWrapper().in(field, values)); + } + + default List selectList(SFunction field, Collection values) { + return selectList(new LambdaQueryWrapper().in(field, values)); + } + + default List selectList(SFunction leField, SFunction geField, Object value) { + return selectList(new LambdaQueryWrapper().le(leField, value).ge(geField, value)); + } + + /** + * 批量插入,适合大量数据插入 + * + * @param entities 实体们 + */ + default void insertBatch(Collection entities) { + Db.saveBatch(entities); + } + + /** + * 批量插入,适合大量数据插入 + * + * @param entities 实体们 + * @param size 插入数量 Db.saveBatch 默认为 1000 + */ + default void insertBatch(Collection entities, int size) { + Db.saveBatch(entities, size); + } + + default void updateBatch(T update) { + update(update, new QueryWrapper<>()); + } + + default void updateBatch(Collection entities, int size) { + Db.updateBatchById(entities, size); + } + +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/utils/MyBatisUtils.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/utils/MyBatisUtils.java new file mode 100644 index 00000000..9493e76a --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/mybatis/utils/MyBatisUtils.java @@ -0,0 +1,88 @@ +package com.fastbee.framework.mybatis.utils; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fastbee.common.core.domain.PageParam; +import com.fastbee.common.core.domain.SortingField; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * MyBatis 工具类 + */ +public class MyBatisUtils { + + private static final String MYSQL_ESCAPE_CHARACTER = "`"; + + public static Page buildPage(PageParam pageParam) { + return buildPage(pageParam, null); + } + + public static Page buildPage(PageParam pageParam, Collection sortingFields) { + // 页码 + 数量 + Page page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize()); + // 排序字段 + if (!CollectionUtil.isEmpty(sortingFields)) { + page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ? + OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField())) + .collect(Collectors.toList())); + } + return page; + } + + /** + * 将拦截器添加到链中 + * 由于 MybatisPlusInterceptor 不支持添加拦截器,所以只能全量设置 + * + * @param interceptor 链 + * @param inner 拦截器 + * @param index 位置 + */ + public static void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) { + List inners = new ArrayList<>(interceptor.getInterceptors()); + inners.add(index, inner); + interceptor.setInterceptors(inners); + } + + /** + * 获得 Table 对应的表名 + * + * 兼容 MySQL 转义表名 `t_xxx` + * + * @param table 表 + * @return 去除转移字符后的表名 + */ + public static String getTableName(Table table) { + String tableName = table.getName(); + if (tableName.startsWith(MYSQL_ESCAPE_CHARACTER) && tableName.endsWith(MYSQL_ESCAPE_CHARACTER)) { + tableName = tableName.substring(1, tableName.length() - 1); + } + return tableName; + } + + /** + * 构建 Column 对象 + * + * @param tableName 表名 + * @param tableAlias 别名 + * @param column 字段名 + * @return Column 对象 + */ + public static Column buildColumn(String tableName, Alias tableAlias, String column) { + if (tableAlias != null) { + tableName = tableAlias.getName(); + } + return new Column(tableName + StringPool.DOT + column); + } + +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/AuthenticationContextHolder.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/AuthenticationContextHolder.java new file mode 100644 index 00000000..1fb2ed6b --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/AuthenticationContextHolder.java @@ -0,0 +1,28 @@ +package com.fastbee.framework.security.context; + +import org.springframework.security.core.Authentication; + +/** + * 身份验证信息 + * + * @author ruoyi + */ +public class AuthenticationContextHolder +{ + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static Authentication getContext() + { + return contextHolder.get(); + } + + public static void setContext(Authentication context) + { + contextHolder.set(context); + } + + public static void clearContext() + { + contextHolder.remove(); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/PermissionContextHolder.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/PermissionContextHolder.java new file mode 100644 index 00000000..85a95b22 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/context/PermissionContextHolder.java @@ -0,0 +1,27 @@ +package com.fastbee.framework.security.context; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import com.fastbee.common.core.text.Convert; + +/** + * 权限信息 + * + * @author ruoyi + */ +public class PermissionContextHolder +{ + private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; + + public static void setContext(String permission) + { + RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, + RequestAttributes.SCOPE_REQUEST); + } + + public static String getContext() + { + return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, + RequestAttributes.SCOPE_REQUEST)); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/filter/JwtAuthenticationTokenFilter.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 00000000..6d190782 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,44 @@ +package com.fastbee.framework.security.filter; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.web.service.TokenService; + +/** + * token过滤器 验证token有效性 + * + * @author ruoyi + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter +{ + @Autowired + private TokenService tokenService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) + { + tokenService.verifyToken(loginUser); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + chain.doFilter(request, response); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/AuthenticationEntryPointImpl.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/AuthenticationEntryPointImpl.java new file mode 100644 index 00000000..de193326 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/AuthenticationEntryPointImpl.java @@ -0,0 +1,40 @@ +package com.fastbee.framework.security.handle; + +import java.io.IOException; +import java.io.Serializable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.ServletUtils; +import com.fastbee.common.utils.StringUtils; + +/** + * 认证失败处理类 返回未授权 + * + * @author ruoyi + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable +{ + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) + throws IOException + { + int code = HttpStatus.UNAUTHORIZED; + String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); + } + + + public static boolean isAjaxRequest(HttpServletRequest request) { + String ajaxFlag = request.getHeader("X-Requested-With"); + return ajaxFlag != null && "XMLHttpRequest".equals(ajaxFlag); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/LogoutSuccessHandlerImpl.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/LogoutSuccessHandlerImpl.java new file mode 100644 index 00000000..65ad50f5 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -0,0 +1,52 @@ +package com.fastbee.framework.security.handle; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.utils.ServletUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.manager.AsyncManager; +import com.fastbee.framework.manager.factory.AsyncFactory; +import com.fastbee.framework.web.service.TokenService; + +/** + * 自定义退出处理类 返回成功 + * + * @author ruoyi + */ +@Configuration +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler +{ + @Autowired + private TokenService tokenService; + + /** + * 退出处理 + * + * @return + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) + { + String userName = loginUser.getUsername(); + // 删除用户缓存记录 + tokenService.delLoginUser(loginUser.getToken()); + // 记录用户退出日志 + AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); + } + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success("退出成功"))); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/Server.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/Server.java new file mode 100644 index 00000000..b9173e00 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/Server.java @@ -0,0 +1,240 @@ +package com.fastbee.framework.web.domain; + +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import com.fastbee.common.utils.Arith; +import com.fastbee.common.utils.ip.IpUtils; +import com.fastbee.framework.web.domain.server.Cpu; +import com.fastbee.framework.web.domain.server.Jvm; +import com.fastbee.framework.web.domain.server.Mem; +import com.fastbee.framework.web.domain.server.Sys; +import com.fastbee.framework.web.domain.server.SysFile; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +/** + * 服务器相关信息 + * + * @author ruoyi + */ +public class Server +{ + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU相关信息 + */ + private Cpu cpu = new Cpu(); + + /** + * 內存相关信息 + */ + private Mem mem = new Mem(); + + /** + * JVM相关信息 + */ + private Jvm jvm = new Jvm(); + + /** + * 服务器相关信息 + */ + private Sys sys = new Sys(); + + /** + * 磁盘相关信息 + */ + private List sysFiles = new LinkedList(); + + public Cpu getCpu() + { + return cpu; + } + + public void setCpu(Cpu cpu) + { + this.cpu = cpu; + } + + public Mem getMem() + { + return mem; + } + + public void setMem(Mem mem) + { + this.mem = mem; + } + + public Jvm getJvm() + { + return jvm; + } + + public void setJvm(Jvm jvm) + { + this.jvm = jvm; + } + + public Sys getSys() + { + return sys; + } + + public void setSys(Sys sys) + { + this.sys = sys; + } + + public List getSysFiles() + { + return sysFiles; + } + + public void setSysFiles(List sysFiles) + { + this.sysFiles = sysFiles; + } + + public void copyTo() throws Exception + { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + setCpuInfo(hal.getProcessor()); + + setMemInfo(hal.getMemory()); + + setSysInfo(); + + setJvmInfo(); + + setSysFiles(si.getOperatingSystem()); + } + + /** + * 设置CPU信息 + */ + private void setCpuInfo(CentralProcessor processor) + { + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 设置内存信息 + */ + private void setMemInfo(GlobalMemory memory) + { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 设置服务器信息 + */ + private void setSysInfo() + { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + */ + private void setJvmInfo() throws UnknownHostException + { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + } + + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) + { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + + /** + * 字节转换 + * + * @param size 字节大小 + * @return 转换后值 + */ + public String convertFileSize(long size) + { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) + { + return String.format("%.1f GB", (float) size / gb); + } + else if (size >= mb) + { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } + else if (size >= kb) + { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } + else + { + return String.format("%d B", size); + } + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Cpu.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Cpu.java new file mode 100644 index 00000000..705b2825 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Cpu.java @@ -0,0 +1,101 @@ +package com.fastbee.framework.web.domain.server; + +import com.fastbee.common.utils.Arith; + +/** + * CPU相关信息 + * + * @author ruoyi + */ +public class Cpu +{ + /** + * 核心数 + */ + private int cpuNum; + + /** + * CPU总的使用率 + */ + private double total; + + /** + * CPU系统使用率 + */ + private double sys; + + /** + * CPU用户使用率 + */ + private double used; + + /** + * CPU当前等待率 + */ + private double wait; + + /** + * CPU当前空闲率 + */ + private double free; + + public int getCpuNum() + { + return cpuNum; + } + + public void setCpuNum(int cpuNum) + { + this.cpuNum = cpuNum; + } + + public double getTotal() + { + return Arith.round(Arith.mul(total, 100), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getSys() + { + return Arith.round(Arith.mul(sys / total, 100), 2); + } + + public void setSys(double sys) + { + this.sys = sys; + } + + public double getUsed() + { + return Arith.round(Arith.mul(used / total, 100), 2); + } + + public void setUsed(double used) + { + this.used = used; + } + + public double getWait() + { + return Arith.round(Arith.mul(wait / total, 100), 2); + } + + public void setWait(double wait) + { + this.wait = wait; + } + + public double getFree() + { + return Arith.round(Arith.mul(free / total, 100), 2); + } + + public void setFree(double free) + { + this.free = free; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Jvm.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Jvm.java new file mode 100644 index 00000000..5d45a7b5 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Jvm.java @@ -0,0 +1,130 @@ +package com.fastbee.framework.web.domain.server; + +import java.lang.management.ManagementFactory; +import com.fastbee.common.utils.Arith; +import com.fastbee.common.utils.DateUtils; + +/** + * JVM相关信息 + * + * @author ruoyi + */ +public class Jvm +{ + /** + * 当前JVM占用的内存总数(M) + */ + private double total; + + /** + * JVM最大可用内存总数(M) + */ + private double max; + + /** + * JVM空闲内存(M) + */ + private double free; + + /** + * JDK版本 + */ + private String version; + + /** + * JDK路径 + */ + private String home; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getMax() + { + return Arith.div(max, (1024 * 1024), 2); + } + + public void setMax(double max) + { + this.max = max; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024), 2); + } + + public void setFree(double free) + { + this.free = free; + } + + public double getUsed() + { + return Arith.div(total - free, (1024 * 1024), 2); + } + + public double getUsage() + { + return Arith.mul(Arith.div(total - free, total, 4), 100); + } + + /** + * 获取JDK名称 + */ + public String getName() + { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getHome() + { + return home; + } + + public void setHome(String home) + { + this.home = home; + } + + /** + * JDK启动时间 + */ + public String getStartTime() + { + return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); + } + + /** + * JDK运行时间 + */ + public String getRunTime() + { + return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate()); + } + + /** + * 运行参数 + */ + public String getInputArgs() + { + return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Mem.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Mem.java new file mode 100644 index 00000000..44074dfa --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Mem.java @@ -0,0 +1,61 @@ +package com.fastbee.framework.web.domain.server; + +import com.fastbee.common.utils.Arith; + +/** + * 內存相关信息 + * + * @author ruoyi + */ +public class Mem +{ + /** + * 内存总量 + */ + private double total; + + /** + * 已用内存 + */ + private double used; + + /** + * 剩余内存 + */ + private double free; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024 * 1024), 2); + } + + public void setTotal(long total) + { + this.total = total; + } + + public double getUsed() + { + return Arith.div(used, (1024 * 1024 * 1024), 2); + } + + public void setUsed(long used) + { + this.used = used; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024 * 1024), 2); + } + + public void setFree(long free) + { + this.free = free; + } + + public double getUsage() + { + return Arith.mul(Arith.div(used, total, 4), 100); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Sys.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Sys.java new file mode 100644 index 00000000..c7b2f257 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/Sys.java @@ -0,0 +1,84 @@ +package com.fastbee.framework.web.domain.server; + +/** + * 系统相关信息 + * + * @author ruoyi + */ +public class Sys +{ + /** + * 服务器名称 + */ + private String computerName; + + /** + * 服务器Ip + */ + private String computerIp; + + /** + * 项目路径 + */ + private String userDir; + + /** + * 操作系统 + */ + private String osName; + + /** + * 系统架构 + */ + private String osArch; + + public String getComputerName() + { + return computerName; + } + + public void setComputerName(String computerName) + { + this.computerName = computerName; + } + + public String getComputerIp() + { + return computerIp; + } + + public void setComputerIp(String computerIp) + { + this.computerIp = computerIp; + } + + public String getUserDir() + { + return userDir; + } + + public void setUserDir(String userDir) + { + this.userDir = userDir; + } + + public String getOsName() + { + return osName; + } + + public void setOsName(String osName) + { + this.osName = osName; + } + + public String getOsArch() + { + return osArch; + } + + public void setOsArch(String osArch) + { + this.osArch = osArch; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/SysFile.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/SysFile.java new file mode 100644 index 00000000..80edd964 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/domain/server/SysFile.java @@ -0,0 +1,114 @@ +package com.fastbee.framework.web.domain.server; + +/** + * 系统文件相关信息 + * + * @author ruoyi + */ +public class SysFile +{ + /** + * 盘符路径 + */ + private String dirName; + + /** + * 盘符类型 + */ + private String sysTypeName; + + /** + * 文件类型 + */ + private String typeName; + + /** + * 总大小 + */ + private String total; + + /** + * 剩余大小 + */ + private String free; + + /** + * 已经使用量 + */ + private String used; + + /** + * 资源的使用率 + */ + private double usage; + + public String getDirName() + { + return dirName; + } + + public void setDirName(String dirName) + { + this.dirName = dirName; + } + + public String getSysTypeName() + { + return sysTypeName; + } + + public void setSysTypeName(String sysTypeName) + { + this.sysTypeName = sysTypeName; + } + + public String getTypeName() + { + return typeName; + } + + public void setTypeName(String typeName) + { + this.typeName = typeName; + } + + public String getTotal() + { + return total; + } + + public void setTotal(String total) + { + this.total = total; + } + + public String getFree() + { + return free; + } + + public void setFree(String free) + { + this.free = free; + } + + public String getUsed() + { + return used; + } + + public void setUsed(String used) + { + this.used = used; + } + + public double getUsage() + { + return usage; + } + + public void setUsage(double usage) + { + this.usage = usage; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/exception/GlobalExceptionHandler.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..a848827f --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/exception/GlobalExceptionHandler.java @@ -0,0 +1,114 @@ +package com.fastbee.framework.web.exception; + +import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.exception.DemoModeException; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.StringUtils; + +/** + * 全局异常处理器 + * + * @author ruoyi + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 权限校验异常 + */ + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); + } + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return AjaxResult.error(e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) + { + log.error(e.getMessage(), e); + Integer code = e.getCode(); + return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult handleBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) + { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 演示模式异常 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult handleDemoModeException(DemoModeException e) + { + return AjaxResult.error("演示模式,不允许操作"); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/PermissionService.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/PermissionService.java new file mode 100644 index 00000000..16061890 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/PermissionService.java @@ -0,0 +1,168 @@ +package com.fastbee.framework.web.service; + +import java.util.Set; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.security.context.PermissionContextHolder; + +/** + * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 + * + * @author ruoyi + */ +@Service("ss") +public class PermissionService +{ + /** 所有权限标识 */ + private static final String ALL_PERMISSION = "*:*:*"; + + /** 管理员角色权限标识 */ + private static final String SUPER_ADMIN = "admin"; + + private static final String ROLE_DELIMETER = ","; + + private static final String PERMISSION_DELIMETER = ","; + + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public boolean hasPermi(String permission) + { + if (StringUtils.isEmpty(permission)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permission); + return hasPermissions(loginUser.getPermissions(), permission); + } + + /** + * 验证用户是否不具备某权限,与 hasPermi逻辑相反 + * + * @param permission 权限字符串 + * @return 用户是否不具备某权限 + */ + public boolean lacksPermi(String permission) + { + return hasPermi(permission) != true; + } + + /** + * 验证用户是否具有以下任意一个权限 + * + * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 + * @return 用户是否具有以下任意一个权限 + */ + public boolean hasAnyPermi(String permissions) + { + if (StringUtils.isEmpty(permissions)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permissions); + Set authorities = loginUser.getPermissions(); + for (String permission : permissions.split(PERMISSION_DELIMETER)) + { + if (permission != null && hasPermissions(authorities, permission)) + { + return true; + } + } + return false; + } + + /** + * 判断用户是否拥有某个角色 + * + * @param role 角色字符串 + * @return 用户是否具备某角色 + */ + public boolean hasRole(String role) + { + if (StringUtils.isEmpty(role)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (SysRole sysRole : loginUser.getUser().getRoles()) + { + String roleKey = sysRole.getRoleKey(); + if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) + { + return true; + } + } + return false; + } + + /** + * 验证用户是否不具备某角色,与 isRole逻辑相反。 + * + * @param role 角色名称 + * @return 用户是否不具备某角色 + */ + public boolean lacksRole(String role) + { + return hasRole(role) != true; + } + + /** + * 验证用户是否具有以下任意一个角色 + * + * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 + * @return 用户是否具有以下任意一个角色 + */ + public boolean hasAnyRoles(String roles) + { + if (StringUtils.isEmpty(roles)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (String role : roles.split(ROLE_DELIMETER)) + { + if (hasRole(role)) + { + return true; + } + } + return false; + } + + /** + * 判断是否包含权限 + * + * @param permissions 权限列表 + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + private boolean hasPermissions(Set permissions, String permission) + { + return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysLoginService.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysLoginService.java new file mode 100644 index 00000000..7a37687d --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysLoginService.java @@ -0,0 +1,217 @@ +package com.fastbee.framework.web.service; + +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.UserStatus; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.exception.user.CaptchaException; +import com.fastbee.common.exception.user.CaptchaExpireException; +import com.fastbee.common.exception.user.UserPasswordNotMatchException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.ServletUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.ip.IpUtils; +import com.fastbee.framework.manager.AsyncManager; +import com.fastbee.framework.manager.factory.AsyncFactory; +import com.fastbee.framework.security.context.AuthenticationContextHolder; +import com.fastbee.system.service.ISysConfigService; +import com.fastbee.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 登录校验方法 + * + * @author ruoyi + */ +@Component +public class SysLoginService +{ + @Autowired + private TokenService tokenService; + + @Resource + private AuthenticationManager authenticationManager; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Resource + private SysPasswordService passwordService; + + /** + * 登录验证 + * + * @param username 用户名 + * @param password 密码 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public String login(String username, String password, String code, String uuid) + { + boolean captchaEnabled = configService.selectCaptchaEnabled(); + // 验证码开关 + if (captchaEnabled) + { + validateCaptcha(username, code, uuid); + } + // 用户验证 + Authentication authentication = null; + try + { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + AuthenticationContextHolder.setContext(authenticationToken); + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager.authenticate(authenticationToken); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally + { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfo(loginUser.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + } + + /** + * 第三方验证后,调用登录方法 + * @param username 用户名 + * @param password 密码 + * @return token + */ + public String socialLogin(String username, String password){ + // 用户验证 + Authentication authentication = null; + try + { + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager + .authenticate(new UsernamePasswordAuthenticationToken(username, password)); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfo(loginUser.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + } + + /** + * 三方跳转登录认证方法 + * @param username 系统用户名 + * @param encodePwd 系统用户密码 + * @return + */ + public String redirectLogin(String username,String encodePwd){ +// UserDetails userDetails=userDetailsServiceImpl.loadUserByUsername(username); + SysUser user = userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) + { + throw new ServiceException("登录用户:" + username + " 不存在"); + } + else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + } + else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + } + // 重写验证方法 + passwordService.socialValidate(user, encodePwd); + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + UserDetails userDetails = userDetailsServiceImpl.createLoginUser(user); + LoginUser loginUser = (LoginUser) userDetails; + recordLoginInfo(loginUser.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); + } + } + + /** + * 记录登录信息 + * + * @param userId 用户ID + */ + public void recordLoginInfo(Long userId) + { + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest())); + sysUser.setLoginDate(DateUtils.getNowDate()); + userService.updateUserProfile(sysUser); + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPasswordService.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPasswordService.java new file mode 100644 index 00000000..493dd6af --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPasswordService.java @@ -0,0 +1,126 @@ +package com.fastbee.framework.web.service; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.exception.user.UserPasswordNotMatchException; +import com.fastbee.common.exception.user.UserPasswordRetryLimitExceedException; +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.framework.manager.AsyncManager; +import com.fastbee.framework.manager.factory.AsyncFactory; +import com.fastbee.framework.security.context.AuthenticationContextHolder; + +/** + * 登录密码方法 + * + * @author ruoyi + */ +@Component +public class SysPasswordService +{ + @Autowired + private RedisCache redisCache; + + @Value(value = "${user.password.maxRetryCount}") + private int maxRetryCount; + + @Value(value = "${user.password.lockTime}") + private int lockTime; + + /** + * 登录账户密码错误次数缓存键名 + * + * @param username 用户名 + * @return 缓存键key + */ + private String getCacheKey(String username) + { + return CacheConstants.PWD_ERR_CNT_KEY + username; + } + + public void validate(SysUser user) + { + Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext(); + String username = usernamePasswordAuthenticationToken.getName(); + String password = usernamePasswordAuthenticationToken.getCredentials().toString(); + + Integer retryCount = redisCache.getCacheObject(getCacheKey(username)); + + if (retryCount == null) + { + retryCount = 0; + } + + if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime))); + throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); + } + + if (!matches(user, password)) + { + retryCount = retryCount + 1; + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.count", retryCount))); + redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); + throw new UserPasswordNotMatchException(); + } + else + { + clearLoginRecordCache(username); + } + } + + public void socialValidate(SysUser user, String encodePwd) + { + String username = user.getUserName(); + String password = user.getPassword(); + + Integer retryCount = redisCache.getCacheObject(getCacheKey(username)); + + if (retryCount == null) + { + retryCount = 0; + } + + if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime))); + throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); + } + + if(!password.equals(encodePwd)){ + retryCount = retryCount + 1; + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.count", retryCount))); + redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); + throw new UserPasswordNotMatchException(); + } + else + { + clearLoginRecordCache(username); + } + } + + public boolean matches(SysUser user, String rawPassword) + { + return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); + } + + public void clearLoginRecordCache(String loginName) + { + if (redisCache.hasKey(getCacheKey(loginName))) + { + redisCache.deleteObject(getCacheKey(loginName)); + } + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPermissionService.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPermissionService.java new file mode 100644 index 00000000..1010a7bc --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysPermissionService.java @@ -0,0 +1,82 @@ +package com.fastbee.framework.web.service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.system.service.ISysMenuService; +import com.fastbee.system.service.ISysRoleService; + +/** + * 用户权限处理 + * + * @author ruoyi + */ +@Component +public class SysPermissionService +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param user 用户信息 + * @return 角色权限信息 + */ + public Set getRolePermission(SysUser user) + { + Set roles = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) + { + roles.add("admin"); + } + else + { + roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param user 用户信息 + * @return 菜单权限信息 + */ + public Set getMenuPermission(SysUser user) + { + Set perms = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) + { + perms.add("*:*:*"); + } + else + { + List roles = user.getRoles(); + if (!roles.isEmpty() && roles.size() > 1) + { + // 多角色设置permissions属性,以便数据权限匹配权限 + for (SysRole role : roles) + { + Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); + role.setPermissions(rolePerms); + perms.addAll(rolePerms); + } + } + else + { + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + } + } + return perms; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysRegisterService.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysRegisterService.java new file mode 100644 index 00000000..dcf3255b --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/SysRegisterService.java @@ -0,0 +1,115 @@ +package com.fastbee.framework.web.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.RegisterBody; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.exception.user.CaptchaException; +import com.fastbee.common.exception.user.CaptchaExpireException; +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.manager.AsyncManager; +import com.fastbee.framework.manager.factory.AsyncFactory; +import com.fastbee.system.service.ISysConfigService; +import com.fastbee.system.service.ISysUserService; + +/** + * 注册校验方法 + * + * @author ruoyi + */ +@Component +public class SysRegisterService +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private RedisCache redisCache; + + /** + * 注册 + */ + public String register(RegisterBody registerBody) + { + String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + + // 验证码开关 + boolean captchaEnabled = configService.selectCaptchaEnabled(); + if (captchaEnabled) + { + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(sysUser))) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + } + else + { + sysUser.setNickName(username); + sysUser.setPassword(SecurityUtils.encryptPassword(password)); + boolean regFlag = userService.registerUser(sysUser); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); + } + } + return msg; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException(); + } + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/TokenService.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/TokenService.java new file mode 100644 index 00000000..73f8b8f0 --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/TokenService.java @@ -0,0 +1,270 @@ +package com.fastbee.framework.web.service; + +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.utils.ServletUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.ip.AddressUtils; +import com.fastbee.common.utils.ip.IpUtils; +import com.fastbee.common.utils.uuid.IdUtils; +import eu.bitwalker.useragentutils.UserAgent; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * token验证处理 + * + * @author ruoyi + */ +@Component +public class TokenService +{ + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + + // 令牌有效期(默认30分钟) + @Value("${token.expireTime}") + private int expireTime; + + protected static final long MILLIS_SECOND = 1000; + + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; + + @Autowired + private RedisCache redisCache; + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUser getLoginUser(HttpServletRequest request) + { + // 获取请求携带的令牌 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) + { + try + { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + catch (Exception e) + { + } + } + return null; + } + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUser getLoginUserByToken(String token) { + if (StringUtils.isNotEmpty(token)) { + try { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } catch (Exception e) { + } + } + return null; + } + + /** + * 根据用户id获取用户身份信息 + * 由于多端登录,根据token获取的用户信息不一样,所以增加一个根据用户id获取用户信息的缓存key,以后多端需要获取用户最新信息就用这个方法吧 + * @return 用户信息 + */ + public LoginUser getLoginUserByUserId(Long userId) { + if (userId != null) { + try { + String userKey = getUserIdKey(userId); + return redisCache.getCacheObject(userKey); + } catch (Exception e) { + } + } + return null; + } + + /** + * 设置用户身份信息 + */ + public void setLoginUser(LoginUser loginUser) + { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) + { + refreshToken(loginUser); + } + } + + /** + * 删除用户身份信息 + */ + public void delLoginUser(String token) + { + if (StringUtils.isNotEmpty(token)) + { + String userKey = getTokenKey(token); + redisCache.deleteObject(userKey); + } + } + + /** + * 创建令牌 + * + * @param loginUser 用户信息 + * @return 令牌 + */ + public String createToken(LoginUser loginUser) + { + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + setUserAgent(loginUser); + refreshToken(loginUser); + + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY, token); + return createToken(claims); + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param loginUser + * @return 令牌 + */ + public void verifyToken(LoginUser loginUser) + { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) + { + refreshToken(loginUser); + } + } + + /** + * 刷新令牌有效期 + * + * @param loginUser 登录信息 + */ + public void refreshToken(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); + // 使用token作为用户信息缓存key,多端不能同步最新信息,需要重新登录,因此添加一个使用用户id作为缓存key + String userIdKey = getUserIdKey(loginUser.getUserId()); + redisCache.setCacheObject(userIdKey, loginUser, expireTime, TimeUnit.MINUTES); + } + + /** + * 设置用户代理信息 + * + * @param loginUser 登录信息 + */ + public void setUserAgent(LoginUser loginUser) + { + UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + loginUser.setIpaddr(ip); + loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + loginUser.setBrowser(userAgent.getBrowser().getName()); + loginUser.setOs(userAgent.getOperatingSystem().getName()); + } + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + private String createToken(Map claims) + { + String token = Jwts.builder() + .setClaims(claims) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private Claims parseToken(String token) + { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } + + /** + * 从令牌中获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public String getUsernameFromToken(String token) + { + Claims claims = parseToken(token); + return claims.getSubject(); + } + + /** + * 获取请求token + * + * @param request + * @return token + */ + private String getToken(HttpServletRequest request) + { + String token = request.getHeader(header); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) + { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + return token; + } + + private String getTokenKey(String uuid) + { + return CacheConstants.LOGIN_TOKEN_KEY + uuid; + } + + private String getUserIdKey(Long userId) { + return CacheConstants.LOGIN_USERID_KEY + userId; + } +} diff --git a/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/UserDetailsServiceImpl.java b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/UserDetailsServiceImpl.java new file mode 100644 index 00000000..01c56c4b --- /dev/null +++ b/springboot/fastbee-framework/src/main/java/com/fastbee/framework/web/service/UserDetailsServiceImpl.java @@ -0,0 +1,65 @@ +package com.fastbee.framework.web.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.enums.UserStatus; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.service.ISysUserService; + +/** + * 用户验证处理 + * + * @author ruoyi + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService +{ + private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); + + @Autowired + private ISysUserService userService; + + @Autowired + private SysPasswordService passwordService; + + @Autowired + private SysPermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException + { + SysUser user = userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) + { + log.info("登录用户:{} 不存在.", username); + throw new ServiceException("登录用户:" + username + " 不存在"); + } + else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + log.info("登录用户:{} 已被删除.", username); + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + } + else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + log.info("登录用户:{} 已被停用.", username); + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + } + + passwordService.validate(user); + + return createLoginUser(user); + } + + public UserDetails createLoginUser(SysUser user) + { + return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); + } +} diff --git a/springboot/fastbee-gateway/fastbee-mq/pom.xml b/springboot/fastbee-gateway/fastbee-mq/pom.xml new file mode 100644 index 00000000..edb31127 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + fastbee-gateway + com.fastbee + 3.8.5 + + fastbee-mq + + + + + com.fastbee + fastbee-protocol-collect + + + + cn.hutool + hutool-all + + + + + + + diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/config/MqConfig.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/config/MqConfig.java new file mode 100644 index 00000000..50198a1a --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/config/MqConfig.java @@ -0,0 +1,17 @@ +package com.fastbee.mq.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.context.annotation.Configuration; + +/** + * mq集群配置 + * @author gsb + * @date 2022/10/10 8:27 + */ +@Configuration +@ConditionalOnExpression("${cluster.enable:false}") +public class MqConfig { + + + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/model/ReportDataBo.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/model/ReportDataBo.java new file mode 100644 index 00000000..a9af6826 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/model/ReportDataBo.java @@ -0,0 +1,40 @@ +package com.fastbee.mq.model; + +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import lombok.Data; + +import java.util.List; + +/** + * 上报数据模型bo + * @author bill + */ +@Data +public class ReportDataBo { + + /**产品id*/ + private Long productId; + /**设备编号*/ + private String serialNumber; + /**上报消息*/ + private String message; + /**上报的数据*/ + private List dataList; + /**设备影子*/ + private boolean isShadow; + /** + * 物模型类型 + * 1=属性,2=功能,3=事件,4=设备升级,5=设备上线,6=设备下线 + */ + private int type; + /**是否执行规则引擎*/ + private boolean isRuleEngine; + /**从机编号*/ + private Integer slaveId; + + + private Long userId; + private String userName; + private String deviceName; + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttClientConfig.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttClientConfig.java new file mode 100644 index 00000000..c9264879 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttClientConfig.java @@ -0,0 +1,58 @@ +package com.fastbee.mq.mqttClient; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** mqtt配置信息*/ + +@Data +@Component +@ConfigurationProperties(prefix = "spring.mqtt") +public class MqttClientConfig { + + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 连接地址 + */ + private String hostUrl; + /** + * 客户Id + */ + private String clientId; + /** + * 默认连接话题 + */ + private String defaultTopic; + /** + * 超时时间 + */ + private int timeout; + /** + * 保持连接数 + */ + private int keepalive; + + /**是否清除session*/ + private boolean clearSession; + /**是否共享订阅*/ + private boolean isShared; + /**分组共享订阅*/ + private boolean isSharedGroup; + + /** + * true: 使用netty搭建的mqttBroker false: 使用emq + */ + @Value("${server.broker.enabled}") + private Boolean enabled; + +} + diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttService.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttService.java new file mode 100644 index 00000000..71eacdb7 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/MqttService.java @@ -0,0 +1,68 @@ +package com.fastbee.mq.mqttClient; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.gateway.mq.TopicsPost; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.mq.redischannel.producer.MessageProducer; +import com.fastbee.mq.service.IDeviceReportMessageService; +import com.fastbee.mq.service.IMessagePublishService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttAsyncClient; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Arrays; + + +@Component +@Slf4j +public class MqttService { + + @Resource + private TopicsUtils topicsUtils; + @Resource + private IDeviceReportMessageService deviceReportMessageService; + + + + public void subscribe(MqttAsyncClient client) throws MqttException { + TopicsPost allPost = topicsUtils.getAllPost(); + client.subscribe(allPost.getTopics(), allPost.getQos()); + log.info("mqtt监控主题,{}", Arrays.asList(allPost.getTopics())); + } + + /** + * 消息回调方法 + * + * @param topic 主题 + * @param mqttMessage 消息体 + */ + public void subscribeCallback(String topic, MqttMessage mqttMessage) { + + String message = new String(mqttMessage.getPayload()); + log.info("接收消息主题 : " + topic); + log.info("接收消息Qos : " + mqttMessage.getQos()); + log.info("接收消息内容 : " + message); + String serialNumber = topicsUtils.parseSerialNumber(topic); + Long productId = topicsUtils.parseProductId(topic); + String name = topicsUtils.parseTopicName(topic); + DeviceReportBo reportBo = DeviceReportBo.builder() + .serialNumber(serialNumber) + .productId(productId) + .data(mqttMessage.getPayload()) + .platformDate(DateUtils.getNowDate()) + .topicName(topic) + .serverType(ServerType.MQTT) + .build(); + if (name.startsWith("property")) { + deviceReportMessageService.parseReportMsg(reportBo); + } + } + + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttCallBack.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttCallBack.java new file mode 100644 index 00000000..12a0e552 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttCallBack.java @@ -0,0 +1,117 @@ +package com.fastbee.mq.mqttClient; + + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.*; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * mqtt客户端回调 + */ +@Slf4j +@Component +@Data +@NoArgsConstructor +public class PubMqttCallBack implements MqttCallbackExtended { + + + /** + * mqtt客户端 + */ + private MqttAsyncClient client; + /** + * 创建客户端参数 + */ + private MqttConnectOptions options; + + @Resource + private MqttService mqttService; + + private Boolean enabled; + + + public PubMqttCallBack(MqttAsyncClient client, MqttConnectOptions options,Boolean enabled) { + this.client = client; + this.options = options; + this.enabled = enabled; + } + + /** + * mqtt客户端连接 + * + * @param cause 错误 + */ + @Override + public void connectionLost(Throwable cause) { + + // 连接丢失后,一般在这里面进行重连 + log.debug("=>mqtt 连接丢失", cause); + int count = 1; + // int sleepTime = 0; + boolean willConnect = true; + while (willConnect) { + try { + Thread.sleep(1000); + log.debug("=>连接[{}]断开,尝试重连第{}次", this.client.getServerURI(), count++); + this.client.connect(this.options); + log.debug("=>重连成功"); + willConnect = false; + } catch (Exception e) { + log.error("=>重连异常", e); + } + } + } + + /** + * 客户端订阅主题回调消息 + * + * @param topic 主题 + * @param message 消息 + */ + @Override + public void messageArrived(String topic, MqttMessage message) throws Exception { + // subscribe后得到的消息会执行到这里面 + try { + mqttService.subscribeCallback(topic, message); + } catch (Exception e) { + log.warn("mqtt 订阅消息异常", e); + } + } + + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + + } + + + /** + * 监听mqtt连接消息 + */ + @Override + public void connectComplete(boolean reconnect, String serverURI) { + log.info("MQTT内部客户端已经连接!"); + System.out.print("" + + " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n" + + " * _⚲_⚲_ ______ _ ____ * \n" + + " * | / \\ | | ____| | | | _ \\ * \n" + + " * | | | ● | | | | |__ __ _ ___| |_ | |_) | ___ ___ * \n" + + " * | \\ / | | __/ _` / __| __| | _ < / _ \\/ _ \\ * \n" + + " * \\ / | | | (_| \\__ \\ |_ | |_) | __/ __/ * \n" + + " * V |_| \\__,_|___/\\__| |____/ \\___|\\___| * \n" + + " * * \n"+ + " * * * * * * * * * * * * FastBee物联网平台[✔启动成功] * * * * * * * * * * * * \n"); + + //连接后订阅, enable为false表示使用emq + if (!enabled) { + try { + mqttService.subscribe(client); + } catch (MqttException e) { + log.error("=>订阅主题失败 error={}", e.getMessage()); + } + } + } +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttClient.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttClient.java new file mode 100644 index 00000000..92505e75 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/mqttClient/PubMqttClient.java @@ -0,0 +1,225 @@ +package com.fastbee.mq.mqttClient; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.FunctionReplyStatus; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.iot.domain.FunctionLog; +import com.fastbee.iot.service.IFunctionLogService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 发布服务mqtt客户端 + */ +@Component +@Slf4j +public class PubMqttClient { + + @Resource + private MqttClientConfig mqttConfig; + @Resource(name = "pubMqttCallBack") + private PubMqttCallBack mqttCallBack; + /** + * 连接配置 + */ + private MqttConnectOptions options; + /** + * MQTT异步客户端 + */ + private MqttAsyncClient client; + /** + * 是否连接标记 + */ + private boolean isConnected = false; + @Resource + private RedisCache redisCache; + @Resource + private IFunctionLogService functionLogService; + + /** + * 启动MQTT客户端 + */ + public synchronized void initialize() { + + try { + setOptions(); + createClient(); + while (!client.isConnected()) { + IMqttToken token = client.connect(options); + if(token != null && token.isComplete()) { + log.debug("=>内部MQTT客户端启动成功"); + this.isConnected = true; + break; + } + log.debug("=>内部mqtt客户端连接中..."); + Thread.sleep(20000); + } + } catch (MqttException ex) { + log.error("=>MQTT客户端初始化异常", ex); + } catch (Exception e) { + log.error("=>连接MQTT服务器异常", e); + this.isConnected = false; + } + + } + + public boolean isConnected() { + return this.isConnected; + } + + private void createClient() { + try { + if (client == null) { + /*host为主机名,clientId是连接MQTT的客户端ID*/ + client = new MqttAsyncClient(mqttConfig.getHostUrl(), getClientId(), new MemoryPersistence()); + //设置回调函数 + client.setCallback(mqttCallBack); + mqttCallBack.setClient(client); + mqttCallBack.setOptions(this.options); + mqttCallBack.setEnabled(mqttConfig.getEnabled()); + } + } catch (Exception e) { + log.error("=>mqtt客户端创建错误"); + } + } + + /** + * 设置连接属性 + */ + private void setOptions() { + + if (options != null) { + options = null; + } + options = new MqttConnectOptions(); + options.setConnectionTimeout(mqttConfig.getTimeout()); + options.setKeepAliveInterval(mqttConfig.getKeepalive()); + options.setUserName(mqttConfig.getUsername()); + options.setPassword(mqttConfig.getPassword().toCharArray()); + //设置自动重新连接 + options.setAutomaticReconnect(true); + /*设置为false,断开连接,不清除session,重连后还是原来的session + 保留订阅的主题,能接收离线期间的消息*/ + options.setCleanSession(true); + } + + /** + * 断开与mqtt的连接 + */ + public synchronized void disconnect() { + //判断客户端是否null 是否连接 + if (client != null && client.isConnected()) { + try { + IMqttToken token = client.disconnect(); + token.waitForCompletion(); + } catch (MqttException e) { + log.error("=>断开mqtt连接发生错误 message={}", e.getMessage()); + throw new ServiceException("断开mqtt连接发生错误" + e.getMessage()); + } + } + client = null; + } + + /** + * 重新连接MQTT + */ + public synchronized void refresh() { + disconnect(); + initialize(); + } + + /** + * 拼接客户端id + */ + public final String getClientId() { + return FastBeeConstant.SERVER.WM_PREFIX + System.currentTimeMillis(); + } + + /** + * 发布qos=1,非持久化 + */ + public void publish(String topic, byte[] pushMessage, FunctionLog log) { + try { + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_SEND_TOTAL, -1L); + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_SEND_TODAY, 60 * 60 * 24); + publish(pushMessage, topic, false, 0); + if (null != log) { + //存储服务下发成功 + log.setResultMsg(FunctionReplyStatus.NORELY.getMessage()); + log.setResultCode(FunctionReplyStatus.NORELY.getCode()); + functionLogService.insertFunctionLog(log); + } + } catch (Exception e) { + if (null != log) { + //服务下发失败存储 + log.setResultMsg(FunctionReplyStatus.FAIl.getMessage() + "原因: " + e.getMessage()); + log.setResultCode(FunctionReplyStatus.FAIl.getCode()); + functionLogService.insertFunctionLog(log); + } + } + } + + /** + * 发布主题 + * + * @param message payload消息体 + * @param topic 主题 + * @param retained 是否保留消息 + * @param qos 消息质量 + * Qos1:消息发送一次,不确保 + * Qos2:至少分发一次,服务器确保接收消息进行确认 + * Qos3:只分发一次,确保消息送达和只传递一次 + */ + public void publish(byte[] message, String topic, boolean retained, int qos) { + //设置mqtt消息 + MqttMessage mqttMessage = new MqttMessage(); + mqttMessage.setQos(qos); + mqttMessage.setRetained(retained); + mqttMessage.setPayload(message); + + IMqttDeliveryToken token; + try { + token = client.publish(topic, mqttMessage); + token.waitForCompletion(); + } catch (MqttPersistenceException e) { + log.error("=>发布主题时发生错误 topic={},message={}", topic, e.getMessage()); + throw new ServiceException(e.getMessage()); + } catch (MqttException ex) { + throw new ServiceException(ex.getMessage()); + } + } + + + /** + * 发布 + * + * @param qos 连接方式 + * @param retained 是否保留 + * @param topic 主题 + * @param pushMessage 消息体 + */ + public void publish(int qos, boolean retained, String topic, String pushMessage) { + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_SEND_TOTAL, -1L); + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_SEND_TODAY, 60 * 60 * 24); + log.info("发布主题[{}],发布消息[{}]" + topic,pushMessage); + MqttMessage message = new MqttMessage(); + message.setQos(qos); + message.setRetained(retained); + message.setPayload(pushMessage.getBytes()); + + try { + IMqttDeliveryToken token = client.publish(topic, message); + token.waitForCompletion(); + } catch (MqttPersistenceException e) { + e.printStackTrace(); + } catch (MqttException e) { + log.error("=>发布主题时发生错误 topic={},message={}", topic, e.getMessage()); + } + } + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/config/RedisConsumeConfig.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/config/RedisConsumeConfig.java new file mode 100644 index 00000000..b2c626b8 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/config/RedisConsumeConfig.java @@ -0,0 +1,57 @@ +package com.fastbee.mq.redischannel.config; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.mq.redischannel.consumer.RedisChannelConsume; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.listener.PatternTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; + +/** + * redisChannel配置 + * @author gsb + * @date 2022/10/10 8:57 + */ +@Configuration +@EnableCaching +@Slf4j +public class RedisConsumeConfig { + + @Bean + @ConditionalOnProperty(prefix ="cluster", name = "type" ,havingValue = FastBeeConstant.MQTT.REDIS_CHANNEL,matchIfMissing = true) + RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, + MessageListenerAdapter listenerAdapter) { + + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + // 可以添加多个 messageListener,配置不同的交换机 + container.addMessageListener(listenerAdapter, new PatternTopic(FastBeeConstant.CHANNEL.DEVICE_STATUS)); + container.addMessageListener(listenerAdapter, new PatternTopic(FastBeeConstant.CHANNEL.PROP_READ)); + container.addMessageListener(listenerAdapter, new PatternTopic(FastBeeConstant.CHANNEL.FUNCTION_INVOKE)); + container.addMessageListener(listenerAdapter,new PatternTopic(FastBeeConstant.CHANNEL.UPGRADE)); + return container; + } + + /**配置消息监听类 默认监听方法onMessage*/ + @Bean + @ConditionalOnProperty(prefix ="cluster", name = "type" ,havingValue = FastBeeConstant.MQTT.REDIS_CHANNEL,matchIfMissing = true) + MessageListenerAdapter listenerAdapter(RedisChannelConsume consume){ + return new MessageListenerAdapter(consume,"onMessage"); + } + + @Bean + @ConditionalOnProperty(prefix ="cluster", name = "type" ,havingValue = FastBeeConstant.MQTT.REDIS_CHANNEL,matchIfMissing = true) + StringRedisTemplate template(RedisConnectionFactory connectionFactory){ + return new StringRedisTemplate(connectionFactory); + } + + + + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/DeviceOtherMsgConsumer.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/DeviceOtherMsgConsumer.java new file mode 100644 index 00000000..be32c0ad --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/DeviceOtherMsgConsumer.java @@ -0,0 +1,34 @@ +package com.fastbee.mq.redischannel.consumer; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.mq.service.impl.DeviceOtherMsgHandler; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author gsb + * @date 2023/2/27 14:33 + */ +@Slf4j +@Component +public class DeviceOtherMsgConsumer { + + @Resource + private DeviceOtherMsgHandler otherMsgHandler; + + @Async(FastBeeConstant.TASK.DEVICE_OTHER_TASK) + public void consume(DeviceReportBo bo){ + try { + //处理emq订阅的非 property/post 属性上报的消息 ,因为其他消息量小,放在一起处理 + otherMsgHandler.messageHandler(bo); + }catch (Exception e){ + log.error("=>设备其他消息处理出错",e); + } + } + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/RedisChannelConsume.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/RedisChannelConsume.java new file mode 100644 index 00000000..0374d507 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/consumer/RedisChannelConsume.java @@ -0,0 +1,33 @@ +package com.fastbee.mq.redischannel.consumer; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.stereotype.Component; + +/** + * redisChannel消息监听 + * + * @author gsb + * @date 2022/10/10 9:17 + */ +@Component +@Slf4j +public class RedisChannelConsume implements MessageListener { + + /** + * 监听推送消息 + */ + @Override + public void onMessage(Message message, byte[] pattern) { + try { + /*获取channel*/ + String channel = new String(message.getChannel()); + /*获取消息*/ + String body = new String(message.getBody()); + + } catch (Exception e) { + log.error("=>redisChannel处理消息异常,e", e); + } + } +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/listen/DeviceOtherListen.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/listen/DeviceOtherListen.java new file mode 100644 index 00000000..706c5c94 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/listen/DeviceOtherListen.java @@ -0,0 +1,35 @@ +package com.fastbee.mq.redischannel.listen; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.mq.redischannel.consumer.DeviceOtherMsgConsumer; +import com.fastbee.mq.redischannel.queue.DeviceOtherQueue; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author gsb + * @date 2023/2/28 10:02 + */ +@Slf4j +@Component +public class DeviceOtherListen { + + @Resource + private DeviceOtherMsgConsumer otherMsgConsumer; + + @Async(FastBeeConstant.TASK.DEVICE_OTHER_TASK) + public void listen(){ + while (true){ + try { + DeviceReportBo reportBo = DeviceOtherQueue.take(); + otherMsgConsumer.consume(reportBo); + }catch (Exception e){ + log.error("=>emq数据转发异常"); + } + } + } +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/producer/MessageProducer.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/producer/MessageProducer.java new file mode 100644 index 00000000..53828925 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/producer/MessageProducer.java @@ -0,0 +1,20 @@ +package com.fastbee.mq.redischannel.producer; + +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.common.core.mq.DeviceStatusBo; +import com.fastbee.common.core.mq.MQSendMessageBo; +import com.fastbee.common.core.mq.ota.OtaUpgradeBo; +import com.fastbee.common.core.mq.message.DeviceDownMessage; +import com.fastbee.mq.redischannel.queue.*; + +/** + *设备消息生产者 ,设备的消息发送通道 + * @author bill + */ +public class MessageProducer { + + public static void sendOtherMsg(DeviceReportBo bo){ + DeviceOtherQueue.offer(bo); + } + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/queue/DeviceOtherQueue.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/queue/DeviceOtherQueue.java new file mode 100644 index 00000000..e93d1d82 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/redischannel/queue/DeviceOtherQueue.java @@ -0,0 +1,25 @@ +package com.fastbee.mq.redischannel.queue; + +import com.fastbee.common.core.mq.DeviceReportBo; +import lombok.SneakyThrows; + +import java.util.concurrent.LinkedBlockingQueue; + +/** + * @author gsb + * @date 2022/10/10 10:13 + */ +public class DeviceOtherQueue { + + private static final LinkedBlockingQueue queue = new LinkedBlockingQueue<>(); + + /*元素加入队列,最后*/ + public static void offer(DeviceReportBo dto){ + queue.offer(dto); + } + /*取出队列元素 先进先出*/ + @SneakyThrows + public static DeviceReportBo take(){ + return queue.take(); + } +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDataHandler.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDataHandler.java new file mode 100644 index 00000000..254b821b --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDataHandler.java @@ -0,0 +1,32 @@ +package com.fastbee.mq.service; + +import com.fastbee.mq.model.ReportDataBo; + +/** + * 客户端上报数据处理方法集合 + * @author bill + */ +public interface IDataHandler { + + /** + * 上报属性或功能处理 + * + * @param bo 上报数据模型 + */ + public void reportData(ReportDataBo bo); + + + /** + * 上报事件 + * + * @param bo 上报数据模型 + */ + public void reportEvent(ReportDataBo bo); + + /** + * 上报设备信息 + * @param bo 上报数据模型 + */ + public void reportDevice(ReportDataBo bo); + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDeviceReportMessageService.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDeviceReportMessageService.java new file mode 100644 index 00000000..d2f780df --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IDeviceReportMessageService.java @@ -0,0 +1,35 @@ +package com.fastbee.mq.service; + +import com.fastbee.common.core.mq.DeviceReport; +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.iot.domain.Device; + +/** + * 处理设备上报数据解析 + * @author gsb + * @date 2022/10/10 13:48 + */ +public interface IDeviceReportMessageService { + + /** + * 处理设备主动上报数据 + * @param bo + */ + public void parseReportMsg(DeviceReportBo bo); + + /** + * 构建消息 + * @param bo + */ + public Device buildReport(DeviceReportBo bo); + + + /** + * 处理设备主动上报属性 + * + * @param topicName + * @param message + */ + public void handlerReportMessage(DeviceReport message, String topicName); + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IFunctionInvoke.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IFunctionInvoke.java new file mode 100644 index 00000000..b43c645f --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IFunctionInvoke.java @@ -0,0 +1,21 @@ +package com.fastbee.mq.service; + +import com.fastbee.common.core.mq.InvokeReqDto; + +import java.util.Map; + +/** + * 设备指令下发接口 + * @author gsb + * @date 2022/12/5 11:03 + */ +public interface IFunctionInvoke { + + + /** + * 服务调用,设备不响应 + * @param reqDto 服务下发对象 + * @return 消息id messageId + */ + public String invokeNoReply(InvokeReqDto reqDto); +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMessagePublishService.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMessagePublishService.java new file mode 100644 index 00000000..36675bd4 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMessagePublishService.java @@ -0,0 +1,19 @@ +package com.fastbee.mq.service; + +import com.fastbee.common.core.mq.message.DeviceMessage; + +/** + * 设备消息推送mq + * @author bill + */ +public interface IMessagePublishService { + + + /** + * 发布消息到mq + * @param message 设备消息 + * @param channel 推送channel + */ + public void publish(Object message,String channel); + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMqttMessagePublish.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMqttMessagePublish.java new file mode 100644 index 00000000..14f033c3 --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/IMqttMessagePublish.java @@ -0,0 +1,78 @@ +package com.fastbee.mq.service; + +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.common.core.mq.MQSendMessageBo; +import com.fastbee.common.core.mq.message.DeviceDownMessage; +import com.fastbee.common.core.mq.message.InstructionsMessage; +import com.fastbee.common.core.mq.ota.OtaUpgradeBo; +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import com.fastbee.common.enums.TopicType; +import com.fastbee.iot.domain.Device; +import com.fastbee.mq.model.ReportDataBo; + +import java.util.List; + +public interface IMqttMessagePublish { + + /** + * 下发数据编码 + */ + InstructionsMessage buildMessage(DeviceDownMessage downMessage, TopicType type); + + /** + * 服务(指令)下发 + */ + public void funcSend(MQSendMessageBo bo); + + /** + * OTA升级下发 + */ + public void upGradeOTA(OtaUpgradeBo bo); + + public void sendFunctionMessage(DeviceReportBo bo); + + + /** + * 1.发布设备状态 + */ + public void publishStatus(Long productId, String deviceNum, int deviceStatus, int isShadow, int rssi); + + + /** + * 2.发布设备信息 + */ + public void publishInfo(Long productId, String deviceNum); + + + /** + * 3.发布时钟同步信息 + * + * @param bo 数据模型 + */ + public void publishNtp(ReportDataBo bo); + + + /** + * 4.发布属性 + * delay 延时,秒为单位 + */ + public void publishProperty(Long productId, String deviceNum, List thingsList, int delay); + + + /** + * 5.发布功能 + * delay 延时,秒为单位 + */ + public void publishFunction(Long productId, String deviceNum, List thingsList, int delay); + + + /** + * 设备数据同步 + * + * @param deviceNumber 设备编号 + * @return 设备 + */ + public Device deviceSynchronization(String deviceNumber); + + +} \ No newline at end of file diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/DeviceOtherMsgHandler.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/DeviceOtherMsgHandler.java new file mode 100644 index 00000000..b8091d3e --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/DeviceOtherMsgHandler.java @@ -0,0 +1,95 @@ +package com.fastbee.mq.service.impl; + +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.mq.model.ReportDataBo; +import com.fastbee.mq.service.IDataHandler; +import com.fastbee.mq.service.IMqttMessagePublish; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author gsb + * @date 2023/2/27 14:42 + */ +@Component +@Slf4j +public class DeviceOtherMsgHandler { + + @Resource + private TopicsUtils topicsUtils; + @Resource + private IDataHandler dataHandler; + @Resource + private IMqttMessagePublish messagePublish; + + /** + * 非属性消息消息处理入口 + * @param bo + */ + public void messageHandler(DeviceReportBo bo){ + String type = ""; + String name = topicsUtils.parseTopicName(bo.getTopicName()); + ReportDataBo data = this.buildReportData(bo); + switch (name) { + case "info": + dataHandler.reportDevice(data); + break; + case "ntp": + messagePublish.publishNtp(data); + break; + // 接收 property/get 模拟设备数据 + case "property": + type = topicsUtils.parseTopicName4(bo.getTopicName()); + break; + case "function": + data.setShadow(false); + data.setType(2); + data.setRuleEngine(true); + dataHandler.reportData(data); + break; + case "event": + data.setType(3); + data.setRuleEngine(true); + dataHandler.reportEvent(data); + break; + case "property-offline": + data.setShadow(true); + data.setType(1); + dataHandler.reportData(data); + break; + case "function-offline": + data.setShadow(true); + data.setType(2); + dataHandler.reportData(data); + break; + case "property-online": + break; + case "function-online": + type = topicsUtils.parseTopicName4(bo.getTopicName()); + if (type.equals("get")) { + log.info("function-online:{}",bo); + //处理功能下发 + messagePublish.sendFunctionMessage(bo); + } + break; + } + } + + /**组装数据*/ + private ReportDataBo buildReportData(DeviceReportBo bo){ + String message = new String(bo.getData()); + log.info("收到设备信息[{}]",message); + Long productId = topicsUtils.parseProductId(bo.getTopicName()); + ReportDataBo dataBo = new ReportDataBo(); + dataBo.setMessage(message); + dataBo.setProductId(productId); + dataBo.setSerialNumber(bo.getSerialNumber()); + dataBo.setRuleEngine(false); + return dataBo; + } + +} diff --git a/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/FunctionInvokeImpl.java b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/FunctionInvokeImpl.java new file mode 100644 index 00000000..970a9cdf --- /dev/null +++ b/springboot/fastbee-gateway/fastbee-mq/src/main/java/com/fastbee/mq/service/impl/FunctionInvokeImpl.java @@ -0,0 +1,55 @@ +package com.fastbee.mq.service.impl; + +import com.fastbee.common.core.mq.DeviceReplyBo; +import com.fastbee.common.core.mq.InvokeReqDto; +import com.fastbee.common.core.mq.MQSendMessageBo; +import com.fastbee.common.core.mq.MessageReplyBo; +import com.fastbee.common.core.protocol.modbus.ModbusCode; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.core.redis.RedisKeyBuilder; +import com.fastbee.common.enums.ThingsModelType; +import com.fastbee.common.utils.bean.BeanUtils; +import com.fastbee.iot.util.SnowflakeIdWorker; +import com.fastbee.mq.redischannel.producer.MessageProducer; +import com.fastbee.mq.service.IFunctionInvoke; +import com.fastbee.mq.service.IMqttMessagePublish; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author gsb + * @date 2022/12/5 11:34 + */ +@Slf4j +@Service +public class FunctionInvokeImpl implements IFunctionInvoke { + + + @Resource + private IMqttMessagePublish mqttMessagePublish; + private SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(2); + + + /** + * 服务调用,设备不响应 + * @param reqDto 服务下发对象 + * @return 消息id messageId + */ + @Override + public String invokeNoReply(InvokeReqDto reqDto){ + log.debug("=>下发指令请求:[{}]",reqDto); + MQSendMessageBo bo = new MQSendMessageBo(); + BeanUtils.copyBeanProp(bo,reqDto); + long id = snowflakeIdWorker.nextId(); + String messageId = id+""; + bo.setMessageId(messageId+""); + bo.setType(ThingsModelType.getType(reqDto.getType())); + mqttMessagePublish.funcSend(bo); + return messageId; + } +} diff --git a/springboot/fastbee-gateway/gateway-boot/pom.xml b/springboot/fastbee-gateway/gateway-boot/pom.xml new file mode 100644 index 00000000..2df7ffbe --- /dev/null +++ b/springboot/fastbee-gateway/gateway-boot/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + fastbee-gateway + com.fastbee + 3.8.5 + + gateway-boot + + 网关模块 + + + + + com.fastbee + fastbee-mq + + + + + + diff --git a/springboot/fastbee-gateway/gateway-boot/src/main/java/com/fastbee/gateway/boot/start/StartBoot.java b/springboot/fastbee-gateway/gateway-boot/src/main/java/com/fastbee/gateway/boot/start/StartBoot.java new file mode 100644 index 00000000..99d250bd --- /dev/null +++ b/springboot/fastbee-gateway/gateway-boot/src/main/java/com/fastbee/gateway/boot/start/StartBoot.java @@ -0,0 +1,42 @@ +package com.fastbee.gateway.boot.start; + +import com.fastbee.mq.mqttClient.PubMqttClient; +import com.fastbee.mq.redischannel.listen.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 启动类 + * + * @author bill + */ +@Component +@Slf4j +@Order(2) +public class StartBoot implements ApplicationRunner { + + + @Autowired + private PubMqttClient mqttClient; + @Resource + private DeviceOtherListen otherListen; + + + @Override + public void run(ApplicationArguments args) throws Exception { + try { + otherListen.listen(); + /*启动内部客户端,用来下发客户端服务*/ + mqttClient.initialize(); + log.info("=>设备监听队列启动成功"); + } catch (Exception e) { + log.error("=>客户端启动失败:{}", e.getMessage(),e); + } + } +} diff --git a/springboot/fastbee-gateway/pom.xml b/springboot/fastbee-gateway/pom.xml new file mode 100644 index 00000000..67bf0333 --- /dev/null +++ b/springboot/fastbee-gateway/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + fastbee + com.fastbee + 3.8.5 + + + pom + + + gateway-boot + fastbee-mq + + + fastbee-gateway + fastbee-gateway + + + + com.fastbee + fastbee-common + + + + com.fastbee + fastbee-iot-service + + + + + + + diff --git a/springboot/fastbee-open-api/pom.xml b/springboot/fastbee-open-api/pom.xml new file mode 100644 index 00000000..6e04ab1f --- /dev/null +++ b/springboot/fastbee-open-api/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + fastbee + com.fastbee + 3.8.5 + + + + fastbee-open-api + controller层接口 + + + + com.fastbee + mqtt-broker + + + + + + + diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/AuthResourceController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/AuthResourceController.java new file mode 100644 index 00000000..58ead906 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/AuthResourceController.java @@ -0,0 +1,25 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.core.controller.BaseController; +import org.springframework.web.bind.annotation.*; + +/** + * 设备告警Controller + * + * @author kerwincui + * @date 2022-01-13 + */ +@RestController +@RequestMapping("/oauth/resource") +public class AuthResourceController extends BaseController +{ + /** + * 查询设备告警列表 + */ + @GetMapping("/product") + public String findAll() { + return "查询产品列表成功!"; + } + + +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/CategoryController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/CategoryController.java new file mode 100644 index 00000000..e0415769 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/CategoryController.java @@ -0,0 +1,128 @@ +package com.fastbee.data.controller; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.iot.model.IdAndName; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.Category; +import com.fastbee.iot.service.ICategoryService; +import com.fastbee.common.utils.poi.ExcelUtil; + +/** + * 产品分类Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@Api(tags = "产品分类") +@RestController +@RequestMapping("/iot/category") +public class CategoryController extends BaseController +{ + @Autowired + private ICategoryService categoryService; + + /** + * 查询产品分类列表 + */ + @PreAuthorize("@ss.hasPermi('iot:category:list')") + @GetMapping("/list") + @ApiOperation("分类分页列表") + public TableDataInfo list(Category category) + { + startPage(); + return getDataTable(categoryService.selectCategoryList(category)); + } + + /** + * 查询产品简短分类列表 + */ + @PreAuthorize("@ss.hasPermi('iot:category:list')") + @GetMapping("/shortlist") + @ApiOperation("分类简短列表") + public AjaxResult shortlist() + { + return AjaxResult.success(categoryService.selectCategoryShortList()); + } + + /** + * 导出产品分类列表 + */ + @PreAuthorize("@ss.hasPermi('iot:category:export')") + @Log(title = "产品分类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ApiOperation("导出分类") + public void export(HttpServletResponse response, Category category) + { + List list = categoryService.selectCategoryList(category); + ExcelUtil util = new ExcelUtil(Category.class); + util.exportExcel(response, list, "产品分类数据"); + } + + /** + * 获取产品分类详细信息 + */ + @ApiOperation("获取分类详情") + @PreAuthorize("@ss.hasPermi('iot:category:query')") + @GetMapping(value = "/{categoryId}") + public AjaxResult getInfo(@PathVariable("categoryId") Long categoryId) + { + return AjaxResult.success(categoryService.selectCategoryByCategoryId(categoryId)); + } + + /** + * 新增产品分类 + */ + @PreAuthorize("@ss.hasPermi('iot:category:add')") + @Log(title = "产品分类", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加分类") + public AjaxResult add(@RequestBody Category category) + { + return toAjax(categoryService.insertCategory(category)); + } + + /** + * 修改产品分类 + */ + @PreAuthorize("@ss.hasPermi('iot:category:edit')") + @Log(title = "产品分类", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改分类") + public AjaxResult edit(@RequestBody Category category) + { + return toAjax(categoryService.updateCategory(category)); + } + + /** + * 删除产品分类 + */ + @PreAuthorize("@ss.hasPermi('iot:category:remove')") + @Log(title = "产品分类", businessType = BusinessType.DELETE) + @DeleteMapping("/{categoryIds}") + @ApiOperation("批量删除分类") + public AjaxResult remove(@PathVariable Long[] categoryIds) + { + return categoryService.deleteCategoryByCategoryIds(categoryIds); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceController.java new file mode 100644 index 00000000..29b20e5d --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceController.java @@ -0,0 +1,267 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.annotation.Anonymous; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.model.DeviceRelateUserInput; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.mq.service.IMqttMessagePublish; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 设备Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@Api(tags = "设备管理") +@RestController +@RequestMapping("/iot/device") +public class DeviceController extends BaseController +{ + @Autowired + private IDeviceService deviceService; + + // @Lazy + @Autowired + private IMqttMessagePublish messagePublish; + + /** + * 查询设备列表 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/list") + @ApiOperation("设备分页列表") + public TableDataInfo list(Device device) + { + startPage(); + return getDataTable(deviceService.selectDeviceList(device)); + } + + /** + * 查询未分配授权码设备列表 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/unAuthlist") + @ApiOperation("设备分页列表") + public TableDataInfo unAuthlist(Device device) + { + startPage(); + return getDataTable(deviceService.selectUnAuthDeviceList(device)); + } + + /** + * 查询分组可添加设备 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/listByGroup") + @ApiOperation("查询分组可添加设备分页列表") + public TableDataInfo listByGroup(Device device) + { + startPage(); + return getDataTable(deviceService.selectDeviceListByGroup(device)); + } + + /** + * 查询设备简短列表,主页列表数据 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/shortList") + @ApiOperation("设备分页简短列表") + public TableDataInfo shortList(Device device) + { + startPage(); + return getDataTable(deviceService.selectDeviceShortList(device)); + } + + /** + * 查询所有设备简短列表 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/all") + @ApiOperation("查询所有设备简短列表") + public TableDataInfo allShortList() + { + return getDataTable(deviceService.selectAllDeviceShortList()); + } + + /** + * 导出设备列表 + */ + @PreAuthorize("@ss.hasPermi('iot:device:export')") + @Log(title = "设备", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ApiOperation("导出设备") + public void export(HttpServletResponse response, Device device) + { + List list = deviceService.selectDeviceList(device); + ExcelUtil util = new ExcelUtil(Device.class); + util.exportExcel(response, list, "设备数据"); + } + + /** + * 获取设备详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/{deviceId}") + @ApiOperation("获取设备详情") + public AjaxResult getInfo(@PathVariable("deviceId") Long deviceId) + { + return AjaxResult.success(deviceService.selectDeviceByDeviceId(deviceId)); + } + + /** + * 设备数据同步 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/synchronization/{serialNumber}") + @ApiOperation("设备数据同步") + public AjaxResult deviceSynchronization(@PathVariable("serialNumber") String serialNumber) + { + return AjaxResult.success(messagePublish.deviceSynchronization(serialNumber)); + } + + /** + * 根据设备编号详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/getDeviceBySerialNumber/{serialNumber}") + @ApiOperation("根据设备编号获取设备详情") + public AjaxResult getInfoBySerialNumber(@PathVariable("serialNumber") String serialNumber) + { + return AjaxResult.success(deviceService.selectDeviceBySerialNumber(serialNumber)); + } + + /** + * 获取设备统计信息 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/statistic") + @ApiOperation("获取设备统计信息") + public AjaxResult getDeviceStatistic() + { + return AjaxResult.success(deviceService.selectDeviceStatistic()); + } + + /** + * 获取设备详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/runningStatus") + @ApiOperation("获取设备详情和运行状态") + public AjaxResult getRunningStatusInfo(Long deviceId, Integer slaveId) + { + return AjaxResult.success(deviceService.selectDeviceRunningStatusByDeviceId(deviceId,slaveId)); + } + + /** + * 新增设备 + */ + @PreAuthorize("@ss.hasPermi('iot:device:add')") + @Log(title = "添加设备", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加设备") + public AjaxResult add(@RequestBody Device device) + { + return AjaxResult.success(deviceService.insertDevice(device)); + } + + /** + * 设备关联用户 + */ + @PreAuthorize("@ss.hasPermi('iot:device:add')") + @Log(title = "设备关联用户", businessType = BusinessType.UPDATE) + @PostMapping("/relateUser") + @ApiOperation("设备关联用户") + public AjaxResult relateUser(@RequestBody DeviceRelateUserInput deviceRelateUserInput) + { + if(deviceRelateUserInput.getUserId()==0 || deviceRelateUserInput.getUserId()==null){ + return AjaxResult.error("用户ID不能为空"); + } + if(deviceRelateUserInput.getDeviceNumberAndProductIds()==null || deviceRelateUserInput.getDeviceNumberAndProductIds().size()==0){ + return AjaxResult.error("设备编号和产品ID不能为空"); + } + return deviceService.deviceRelateUser(deviceRelateUserInput); + } + + /** + * 修改设备 + */ + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "修改设备", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改设备") + public AjaxResult edit(@RequestBody Device device) + { + return deviceService.updateDevice(device); + } + + /** + * 重置设备状态 + */ + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "重置设备状态", businessType = BusinessType.UPDATE) + @PutMapping("/reset/{serialNumber}") + @ApiOperation("重置设备状态") + public AjaxResult resetDeviceStatus(@PathVariable String serialNumber) + { + Device device=new Device(); + device.setSerialNumber(serialNumber); + return toAjax(deviceService.resetDeviceStatus(device.getSerialNumber())); + } + + /** + * 删除设备 + */ + @PreAuthorize("@ss.hasPermi('iot:device:remove')") + @Log(title = "删除设备", businessType = BusinessType.DELETE) + @DeleteMapping("/{deviceIds}") + @ApiOperation("批量删除设备") + public AjaxResult remove(@PathVariable Long[] deviceIds) throws SchedulerException { + return toAjax(deviceService.deleteDeviceByDeviceId(deviceIds[0])); + } + + /** + * 生成设备编号 + */ + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @GetMapping("/generator") + @ApiOperation("生成设备编号") + public AjaxResult generatorDeviceNum(Integer type){ + return AjaxResult.success("操作成功",deviceService.generationDeviceNum(type)); + } + + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping("/gwDevCount") + @ApiOperation("子设备数量") + public AjaxResult getGwDevCount(String gwDevCode){ + return AjaxResult.success(deviceService.getSubDeviceCount(gwDevCode)); + } + + /** + * 获取设备MQTT连接参数 + * @param deviceId 设备主键id + * @return + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping("/getMqttConnectData") + @ApiOperation("获取设备MQTT连接参数") + public AjaxResult getMqttConnectData(Long deviceId){ + return AjaxResult.success(deviceService.getMqttConnectData(deviceId)); + } + +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceJobController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceJobController.java new file mode 100644 index 00000000..b1360538 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceJobController.java @@ -0,0 +1,147 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.iot.domain.DeviceJob; +import com.fastbee.iot.service.IDeviceJobService; +import com.fastbee.quartz.util.CronUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 调度任务信息操作处理 + * + * @author kerwincui + */ +@Api(tags = "调度任务信息操作处理模块") +@RestController +@RequestMapping("/iot/job") +public class DeviceJobController extends BaseController +{ + @Autowired + private IDeviceJobService jobService; + + /** + * 查询定时任务列表 + */ + @ApiOperation("查询定时任务列表") + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/list") + public TableDataInfo list(DeviceJob deviceJob) + { + startPage(); + List list = jobService.selectJobList(deviceJob); + return getDataTable(list); + } + + /** + * 导出定时任务列表 + */ + @ApiOperation("导出定时任务列表") + @PreAuthorize("@ss.hasPermi('iot:device:export')") + @Log(title = "定时任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DeviceJob deviceJob) + { + List list = jobService.selectJobList(deviceJob); + ExcelUtil util = new ExcelUtil(DeviceJob.class); + util.exportExcel(response, list, "定时任务"); + } + + /** + * 获取定时任务详细信息 + */ + @ApiOperation("获取定时任务详细信息") + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) + { + return AjaxResult.success(jobService.selectJobById(jobId)); + } + + /** + * 新增定时任务 + */ + @ApiOperation("新增定时任务") + @PreAuthorize("@ss.hasPermi('iot:device:add')") + @Log(title = "定时任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DeviceJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + job.setCreateBy(getUsername()); + return toAjax(jobService.insertJob(job)); + } + + /** + * 修改定时任务 + */ + @ApiOperation("修改定时任务") + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DeviceJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + job.setUpdateBy(getUsername()); + return toAjax(jobService.updateJob(job)); + } + + /** + * 定时任务状态修改 + */ + @ApiOperation("定时任务状态修改") + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody DeviceJob job) throws SchedulerException + { + DeviceJob newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toAjax(jobService.changeStatus(newJob)); + } + + /** + * 定时任务立即执行一次 + */ + @ApiOperation("定时任务立即执行一次") + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody DeviceJob job) throws SchedulerException + { + jobService.run(job); + return AjaxResult.success(); + } + + /** + * 删除定时任务 + */ + @ApiOperation("删除定时任务") + @PreAuthorize("@ss.hasPermi('iot:device:remove')") + @Log(title = "定时任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException + { + jobService.deleteJobByIds(jobIds); + return AjaxResult.success(); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceLogController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceLogController.java new file mode 100644 index 00000000..4db3b514 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceLogController.java @@ -0,0 +1,49 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.model.HistoryModel; +import com.fastbee.iot.model.MonitorModel; +import com.fastbee.iot.service.IDeviceLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 设备日志Controller + * + * @author kerwincui + * @date 2022-01-13 + */ +@Api(tags = "设备日志模块") +@RestController +@RequestMapping("/iot/deviceLog") +public class DeviceLogController extends BaseController +{ + @Autowired + private IDeviceLogService deviceLogService; + + /** + * 查询设备的监测数据 + */ + @ApiOperation("查询设备的监测数据") + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/monitor") + public TableDataInfo monitorList(DeviceLog deviceLog) + { + List list = deviceLogService.selectMonitorList(deviceLog); + return getDataTable(list); + } + +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceUserController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceUserController.java new file mode 100644 index 00000000..c183b25f --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/DeviceUserController.java @@ -0,0 +1,136 @@ +package com.fastbee.data.controller; + +import java.util.List; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.DeviceUser; +import com.fastbee.iot.service.IDeviceUserService; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 设备用户Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@Api(tags = "设备用户") +@RestController +@RequestMapping("/iot/deviceUser") +public class DeviceUserController extends BaseController +{ + @Autowired + private IDeviceUserService deviceUserService; + + /** + * 查询设备用户列表 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/list") + @ApiOperation("设备用户分页列表") + public TableDataInfo list(DeviceUser deviceUser) + { + startPage(); + List list = deviceUserService.selectDeviceUserList(deviceUser); + return getDataTable(list); + } + + /** + * 获取设备分享用户信息 + */ + @GetMapping("/shareUser") + public AjaxResult userList(DeviceUser user) + { + return AjaxResult.success(deviceUserService.selectShareUser(user)); + } + + /** + * 获取设备用户详细信息 根据deviceId 查询的话可能会查出多个 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/{deviceId}") + @ApiOperation("获取设备用户详情") + public AjaxResult getInfo(@PathVariable("deviceId") Long deviceId) + { + return AjaxResult.success(deviceUserService.selectDeviceUserByDeviceId(deviceId)); + } + + /** + * 获取设备用户详细信息 双主键 device_id 和 user_id + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/{deviceId}/{userId}") + @ApiOperation("获取设备用户详情,根据用户id 和 设备id") + public AjaxResult getInfo(@PathVariable("deviceId") Long deviceId, @PathVariable("userId") Long userId) + { + return AjaxResult.success(deviceUserService.selectDeviceUserByDeviceIdAndUserId(deviceId, userId)); + } + + /** + * 新增设备用户 + */ + @PreAuthorize("@ss.hasPermi('iot:device:share')") + @Log(title = "设备用户", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加设备用户") + public AjaxResult add(@RequestBody DeviceUser deviceUser) + { + return toAjax(deviceUserService.insertDeviceUser(deviceUser)); + } + + /** + * 新增多个设备用户 + */ + @PreAuthorize("@ss.hasPermi('iot:device:share')") + @Log(title = "设备用户", businessType = BusinessType.INSERT) + @PostMapping("/addDeviceUsers") + @ApiOperation("批量添加设备用户") + public AjaxResult addDeviceUsers(@RequestBody List deviceUsers) + { + return toAjax(deviceUserService.insertDeviceUserList(deviceUsers)); + } + + /** + * 修改设备用户 + */ + @ApiOperation("修改设备用户") + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "设备用户", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DeviceUser deviceUser) + { + return toAjax(deviceUserService.updateDeviceUser(deviceUser)); + } + + + /** + * 删除设备用户 + */ + @ApiOperation("删除设备用户") + @PreAuthorize("@ss.hasPermi('iot:device:remove')") + @Log(title = "设备用户", businessType = BusinessType.DELETE) + @DeleteMapping + public AjaxResult remove(@RequestBody DeviceUser deviceUser) + { + int count=deviceUserService.deleteDeviceUser(deviceUser); + if(count==0){ + return AjaxResult.error("设备所有者不能删除"); + }else{ + return AjaxResult.success(); + } + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/EventLogController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/EventLogController.java new file mode 100644 index 00000000..b539097e --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/EventLogController.java @@ -0,0 +1,114 @@ +package com.fastbee.data.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.iot.domain.EventLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.service.IEventLogService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 事件日志Controller + * + * @author kerwincui + * @date 2023-03-28 + */ +@Api(tags = "事件日志") +@RestController +@RequestMapping("/iot/event") +public class EventLogController extends BaseController +{ + @Autowired + private IEventLogService eventLogService; + + /** + * 查询事件日志列表 + */ + @ApiOperation("查询事件日志列表") + @PreAuthorize("@ss.hasPermi('iot:event:list')") + @GetMapping("/list") + public TableDataInfo list(EventLog eventLog) + { + startPage(); + List list = eventLogService.selectEventLogList(eventLog); + return getDataTable(list); + } + + /** + * 导出事件日志列表 + */ + @ApiOperation("导出事件日志列表") + @PreAuthorize("@ss.hasPermi('iot:event:export')") + @Log(title = "事件日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EventLog eventLog) + { + List list = eventLogService.selectEventLogList(eventLog); + ExcelUtil util = new ExcelUtil(EventLog.class); + util.exportExcel(response, list, "事件日志数据"); + } + + /** + * 获取事件日志详细信息 + */ + @ApiOperation("获取事件日志详细信息") + @PreAuthorize("@ss.hasPermi('iot:event:query')") + @GetMapping(value = "/{logId}") + public AjaxResult getInfo(@PathVariable("logId") Long logId) + { + return success(eventLogService.selectEventLogByLogId(logId)); + } + + /** + * 新增事件日志 + */ + @ApiOperation("新增事件日志") + @PreAuthorize("@ss.hasPermi('iot:event:add')") + @Log(title = "事件日志", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EventLog eventLog) + { + return toAjax(eventLogService.insertEventLog(eventLog)); + } + + /** + * 修改事件日志 + */ + @ApiOperation("修改事件日志") + @PreAuthorize("@ss.hasPermi('iot:event:edit')") + @Log(title = "事件日志", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EventLog eventLog) + { + return toAjax(eventLogService.updateEventLog(eventLog)); + } + + /** + * 删除事件日志 + */ + @ApiOperation("删除事件日志") + @PreAuthorize("@ss.hasPermi('iot:event:remove')") + @Log(title = "事件日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{logIds}") + public AjaxResult remove(@PathVariable Long[] logIds) + { + return toAjax(eventLogService.deleteEventLogByLogIds(logIds)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/FunctionLogController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/FunctionLogController.java new file mode 100644 index 00000000..f6d8e682 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/FunctionLogController.java @@ -0,0 +1,114 @@ +package com.fastbee.data.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.FunctionLog; +import com.fastbee.iot.service.IFunctionLogService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 设备服务下发日志Controller + * + * @author kerwincui + * @date 2022-10-22 + */ +@Api(tags = "设备服务下发日志") +@RestController +@RequestMapping("/iot/log") +public class FunctionLogController extends BaseController +{ + @Autowired + private IFunctionLogService functionLogService; + + /** + * 查询设备服务下发日志列表 + */ + @ApiOperation("查询设备服务下发日志列表") + @PreAuthorize("@ss.hasPermi('iot:log:list')") + @GetMapping("/list") + public TableDataInfo list(FunctionLog functionLog) + { + startPage(); + List list = functionLogService.selectFunctionLogList(functionLog); + return getDataTable(list); + } + + /** + * 导出设备服务下发日志列表 + */ + @ApiOperation("导出设备服务下发日志列表") + @PreAuthorize("@ss.hasPermi('iot:log:export')") + @Log(title = "设备服务下发日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, FunctionLog functionLog) + { + List list = functionLogService.selectFunctionLogList(functionLog); + ExcelUtil util = new ExcelUtil(FunctionLog.class); + util.exportExcel(response, list, "设备服务下发日志数据"); + } + + /** + * 获取设备服务下发日志详细信息 + */ + @ApiOperation("获取设备服务下发日志详细信息") + @PreAuthorize("@ss.hasPermi('iot:log:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(functionLogService.selectFunctionLogById(id)); + } + + /** + * 新增设备服务下发日志 + */ + @ApiOperation("新增设备服务下发日志") + @PreAuthorize("@ss.hasPermi('iot:log:add')") + @Log(title = "设备服务下发日志", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody FunctionLog functionLog) + { + return toAjax(functionLogService.insertFunctionLog(functionLog)); + } + + /** + * 修改设备服务下发日志 + */ + @ApiOperation("修改设备服务下发日志") + @PreAuthorize("@ss.hasPermi('iot:log:edit')") + @Log(title = "设备服务下发日志", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody FunctionLog functionLog) + { + return toAjax(functionLogService.updateFunctionLog(functionLog)); + } + + /** + * 删除设备服务下发日志 + */ + @ApiOperation("删除设备服务下发日志") + @PreAuthorize("@ss.hasPermi('iot:log:remove')") + @Log(title = "设备服务下发日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(functionLogService.deleteFunctionLogByIds(ids)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/GroupController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/GroupController.java new file mode 100644 index 00000000..68c314a9 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/GroupController.java @@ -0,0 +1,140 @@ +package com.fastbee.data.controller; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.iot.domain.DeviceGroup; +import com.fastbee.iot.model.DeviceGroupInput; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.Group; +import com.fastbee.iot.service.IGroupService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 设备分组Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@Api(tags = "设备分组") +@RestController +@RequestMapping("/iot/group") +public class GroupController extends BaseController +{ + @Autowired + private IGroupService groupService; + + /** + * 查询设备分组列表 + */ + @PreAuthorize("@ss.hasPermi('iot:group:list')") + @GetMapping("/list") + @ApiOperation("分组分页列表") + public TableDataInfo list(Group group) + { + startPage(); + return getDataTable(groupService.selectGroupList(group)); + } + + /** + * 导出设备分组列表 + */ + @PreAuthorize("@ss.hasPermi('iot:group:export')") + @Log(title = "分组", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ApiOperation("导出分组") + public void export(HttpServletResponse response, Group group) + { + List list = groupService.selectGroupList(group); + ExcelUtil util = new ExcelUtil(Group.class); + util.exportExcel(response, list, "设备分组数据"); + } + + /** + * 获取设备分组详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:group:query')") + @GetMapping(value = "/{groupId}") + @ApiOperation("获取分组详情") + public AjaxResult getInfo(@PathVariable("groupId") Long groupId) + { + return AjaxResult.success(groupService.selectGroupByGroupId(groupId)); + } + + /** + * 获取分组下的所有关联设备ID数组 + */ + @PreAuthorize("@ss.hasPermi('iot:group:query')") + @GetMapping(value = "/getDeviceIds/{groupId}") + @ApiOperation("获取分组下的所有关联设备ID数组") + public AjaxResult getDeviceIds(@PathVariable("groupId") Long groupId) + { + return AjaxResult.success(groupService.selectDeviceIdsByGroupId(groupId)); + } + + /** + * 新增设备分组 + */ + @PreAuthorize("@ss.hasPermi('iot:group:add')") + @Log(title = "分组", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加分组") + public AjaxResult add(@RequestBody Group group) + { + return toAjax(groupService.insertGroup(group)); + } + + /** + * 更新分组下的关联设备 + * @param input + * @return + */ + @PreAuthorize("@ss.hasPermi('iot:group:edit')") + @Log(title = "设备分组", businessType = BusinessType.UPDATE) + @PutMapping("/updateDeviceGroups") + @ApiOperation("更新分组下的关联设备") + public AjaxResult updateDeviceGroups(@RequestBody DeviceGroupInput input){ + return toAjax(groupService.updateDeviceGroups(input)); + } + + /** + * 修改设备分组 + */ + @PreAuthorize("@ss.hasPermi('iot:group:edit')") + @Log(title = "分组", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改分组") + public AjaxResult edit(@RequestBody Group group) + { + return toAjax(groupService.updateGroup(group)); + } + + /** + * 删除设备分组 + */ + @PreAuthorize("@ss.hasPermi('iot:group:remove')") + @Log(title = "分组", businessType = BusinessType.DELETE) + @DeleteMapping("/{groupIds}") + @ApiOperation("批量删除设备分组") + public AjaxResult remove(@PathVariable Long[] groupIds) + { + return toAjax(groupService.deleteGroupByGroupIds(groupIds)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsCategoryController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsCategoryController.java new file mode 100644 index 00000000..f06a148f --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsCategoryController.java @@ -0,0 +1,126 @@ +package com.fastbee.data.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.iot.model.IdAndName; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.NewsCategory; +import com.fastbee.iot.service.INewsCategoryService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 新闻分类Controller + * + * @author kerwincui + * @date 2022-04-09 + */ +@Api(tags = "新闻分类") +@RestController +@RequestMapping("/iot/newsCategory") +public class NewsCategoryController extends BaseController +{ + @Autowired + private INewsCategoryService newsCategoryService; + + /** + * 查询新闻分类列表 + */ + @PreAuthorize("@ss.hasPermi('iot:newsCategory:list')") + @GetMapping("/list") + @ApiOperation("新闻分类分页列表") + public TableDataInfo list(NewsCategory newsCategory) + { + startPage(); + List list = newsCategoryService.selectNewsCategoryList(newsCategory); + return getDataTable(list); + } + + /** + * 查询新闻分类简短列表 + */ + @PreAuthorize("@ss.hasPermi('iot:news:list')") + @GetMapping("/newsCategoryShortList") + @ApiOperation("分类简短列表") + public AjaxResult newsCategoryShortList() + { + List list = newsCategoryService.selectNewsCategoryShortList(); + return AjaxResult.success(list); + } + + /** + * 导出新闻分类列表 + */ + @PreAuthorize("@ss.hasPermi('iot:newsCategory:export')") + @Log(title = "新闻分类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, NewsCategory newsCategory) + { + List list = newsCategoryService.selectNewsCategoryList(newsCategory); + ExcelUtil util = new ExcelUtil(NewsCategory.class); + util.exportExcel(response, list, "新闻分类数据"); + } + + /** + * 获取新闻分类详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:newsCategory:query')") + @GetMapping(value = "/{categoryId}") + @ApiOperation("新闻分类详情") + public AjaxResult getInfo(@PathVariable("categoryId") Long categoryId) + { + return AjaxResult.success(newsCategoryService.selectNewsCategoryByCategoryId(categoryId)); + } + + /** + * 新增新闻分类 + */ + @PreAuthorize("@ss.hasPermi('iot:newsCategory:add')") + @Log(title = "新闻分类", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加新闻分类") + public AjaxResult add(@RequestBody NewsCategory newsCategory) + { + return toAjax(newsCategoryService.insertNewsCategory(newsCategory)); + } + + /** + * 修改新闻分类 + */ + @PreAuthorize("@ss.hasPermi('iot:newsCategory:edit')") + @Log(title = "新闻分类", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改新闻分类") + public AjaxResult edit(@RequestBody NewsCategory newsCategory) + { + return toAjax(newsCategoryService.updateNewsCategory(newsCategory)); + } + + /** + * 删除新闻分类 + */ + @PreAuthorize("@ss.hasPermi('iot:newsCategory:remove')") + @Log(title = "新闻分类", businessType = BusinessType.DELETE) + @DeleteMapping("/{categoryIds}") + @ApiOperation("删除新闻分类") + public AjaxResult remove(@PathVariable Long[] categoryIds) + { + return newsCategoryService.deleteNewsCategoryByCategoryIds(categoryIds); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsController.java new file mode 100644 index 00000000..5009d09c --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/NewsController.java @@ -0,0 +1,141 @@ +package com.fastbee.data.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.iot.model.CategoryNews; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.News; +import com.fastbee.iot.service.INewsService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 新闻资讯Controller + * + * @author kerwincui + * @date 2022-04-09 + */ +@Api(tags = "新闻资讯") +@RestController +@RequestMapping("/iot/news") +public class NewsController extends BaseController +{ + @Autowired + private INewsService newsService; + + /** + * 查询新闻资讯列表 + */ + @PreAuthorize("@ss.hasPermi('iot:news:list')") + @GetMapping("/list") + @ApiOperation("新闻分页列表") + public TableDataInfo list(News news) + { + startPage(); + List list = newsService.selectNewsList(news); + return getDataTable(list); + } + + /** + * 查询轮播的新闻资讯 + */ + @PreAuthorize("@ss.hasPermi('iot:news:list')") + @GetMapping("/bannerList") + @ApiOperation("轮播新闻列表") + public AjaxResult bannerList() + { + News news=new News(); + news.setIsBanner(1); + news.setStatus(1); + List list = newsService.selectNewsList(news); + return AjaxResult.success(list); + } + + /** + * 查询置顶的新闻资讯 + */ + @PreAuthorize("@ss.hasPermi('iot:news:list')") + @GetMapping("/topList") + @ApiOperation("置顶新闻列表") + public AjaxResult topList() + { + List list = newsService.selectTopNewsList(); + return AjaxResult.success(list); + } + + /** + * 导出新闻资讯列表 + */ + @PreAuthorize("@ss.hasPermi('iot:news:export')") + @Log(title = "新闻资讯", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, News news) + { + List list = newsService.selectNewsList(news); + ExcelUtil util = new ExcelUtil(News.class); + util.exportExcel(response, list, "新闻资讯数据"); + } + + /** + * 获取新闻资讯详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:news:query')") + @GetMapping(value = "/{newsId}") + @ApiOperation("新闻详情") + public AjaxResult getInfo(@PathVariable("newsId") Long newsId) + { + return AjaxResult.success(newsService.selectNewsByNewsId(newsId)); + } + + /** + * 新增新闻资讯 + */ + @PreAuthorize("@ss.hasPermi('iot:news:add')") + @Log(title = "新闻资讯", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加新闻资讯") + public AjaxResult add(@RequestBody News news) + { + return toAjax(newsService.insertNews(news)); + } + + /** + * 修改新闻资讯 + */ + @PreAuthorize("@ss.hasPermi('iot:news:edit')") + @Log(title = "新闻资讯", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改新闻资讯") + public AjaxResult edit(@RequestBody News news) + { + return toAjax(newsService.updateNews(news)); + } + + /** + * 删除新闻资讯 + */ + @PreAuthorize("@ss.hasPermi('iot:news:remove')") + @Log(title = "新闻资讯", businessType = BusinessType.DELETE) + @DeleteMapping("/{newsIds}") + @ApiOperation("删除新闻资讯") + public AjaxResult remove(@PathVariable Long[] newsIds) + { + return toAjax(newsService.deleteNewsByNewsIds(newsIds)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/OauthClientDetailsController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/OauthClientDetailsController.java new file mode 100644 index 00000000..fa31282e --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/OauthClientDetailsController.java @@ -0,0 +1,114 @@ +package com.fastbee.data.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.OauthClientDetails; +import com.fastbee.iot.service.IOauthClientDetailsService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 云云对接Controller + * + * @author kerwincui + * @date 2022-02-07 + */ +@Api(tags = "云云对接") +@RestController +@RequestMapping("/iot/clientDetails") +public class OauthClientDetailsController extends BaseController +{ + @Autowired + private IOauthClientDetailsService oauthClientDetailsService; + + /** + * 查询云云对接列表 + */ + @ApiOperation("查询云云对接列表") + @PreAuthorize("@ss.hasPermi('iot:clientDetails:list')") + @GetMapping("/list") + public TableDataInfo list(OauthClientDetails oauthClientDetails) + { + startPage(); + List list = oauthClientDetailsService.selectOauthClientDetailsList(oauthClientDetails); + return getDataTable(list); + } + + /** + * 导出云云对接列表 + */ + @ApiOperation("导出云云对接列表") + @PreAuthorize("@ss.hasPermi('iot:clientDetails:export')") + @Log(title = "云云对接", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, OauthClientDetails oauthClientDetails) + { + List list = oauthClientDetailsService.selectOauthClientDetailsList(oauthClientDetails); + ExcelUtil util = new ExcelUtil(OauthClientDetails.class); + util.exportExcel(response, list, "云云对接数据"); + } + + /** + * 获取云云对接详细信息 + */ + @ApiOperation("获取云云对接详细信息") + @PreAuthorize("@ss.hasPermi('iot:clientDetails:query')") + @GetMapping(value = "/{clientId}") + public AjaxResult getInfo(@PathVariable("clientId") String clientId) + { + return AjaxResult.success(oauthClientDetailsService.selectOauthClientDetailsByClientId(clientId)); + } + + /** + * 新增云云对接 + */ + @ApiOperation("新增云云对接") + @PreAuthorize("@ss.hasPermi('iot:clientDetails:add')") + @Log(title = "云云对接", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody OauthClientDetails oauthClientDetails) + { + return toAjax(oauthClientDetailsService.insertOauthClientDetails(oauthClientDetails)); + } + + /** + * 修改云云对接 + */ + @ApiOperation("修改云云对接") + @PreAuthorize("@ss.hasPermi('iot:clientDetails:edit')") + @Log(title = "云云对接", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody OauthClientDetails oauthClientDetails) + { + return toAjax(oauthClientDetailsService.updateOauthClientDetails(oauthClientDetails)); + } + + /** + * 修改云云对接 + */ + @ApiOperation("修改云云对接") + @PreAuthorize("@ss.hasPermi('iot:clientDetails:remove')") + @Log(title = "云云对接", businessType = BusinessType.DELETE) + @DeleteMapping("/{clientIds}") + public AjaxResult remove(@PathVariable String[] clientIds) + { + return toAjax(oauthClientDetailsService.deleteOauthClientDetailsByClientIds(clientIds)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductAuthorizeController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductAuthorizeController.java new file mode 100644 index 00000000..8cb063e6 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductAuthorizeController.java @@ -0,0 +1,121 @@ +package com.fastbee.data.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.iot.model.ProductAuthorizeVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.ProductAuthorize; +import com.fastbee.iot.service.IProductAuthorizeService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 产品授权码Controller + * + * @author kami + * @date 2022-04-11 + */ +@Api(tags = "产品授权码") +@RestController +@RequestMapping("/iot/authorize") +public class ProductAuthorizeController extends BaseController +{ + @Autowired + private IProductAuthorizeService productAuthorizeService; + + /** + * 查询产品授权码列表 + */ + @ApiOperation("查询产品授权码列表") + @PreAuthorize("@ss.hasPermi('iot:product:list')") + @GetMapping("/list") + public TableDataInfo list(ProductAuthorize productAuthorize) + { + startPage(); + List list = productAuthorizeService.selectProductAuthorizeList(productAuthorize); + return getDataTable(list); + } + + /** + * 导出产品授权码列表 + */ + @ApiOperation("导出产品授权码列表") + @PreAuthorize("@ss.hasPermi('iot:authorize:export')") + @Log(title = "产品授权码", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProductAuthorize productAuthorize) + { + List list = productAuthorizeService.selectProductAuthorizeList(productAuthorize); + ExcelUtil util = new ExcelUtil(ProductAuthorize.class); + util.exportExcel(response, list, "产品授权码数据"); + } + + /** + * 获取产品授权码详细信息 + */ + @ApiOperation("获取产品授权码详细信息") + @PreAuthorize("@ss.hasPermi('iot:authorize:query')") + @GetMapping(value = "/{authorizeId}") + public AjaxResult getInfo(@PathVariable("authorizeId") Long authorizeId) + { + return AjaxResult.success(productAuthorizeService.selectProductAuthorizeByAuthorizeId(authorizeId)); + } + + /** + * 新增产品授权码 + */ + @ApiOperation("新增产品授权码") + @PreAuthorize("@ss.hasPermi('iot:authorize:add')") + @Log(title = "产品授权码", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProductAuthorize productAuthorize) + { + return toAjax(productAuthorizeService.insertProductAuthorize(productAuthorize)); + } + + /** + * 根据数量批量新增产品授权码 + */ + @ApiOperation("根据数量批量新增产品授权码") + @PreAuthorize("@ss.hasPermi('iot:authorize:add')") + @Log(title = "根据数量批量新增产品授权码", businessType = BusinessType.INSERT) + @PostMapping("addProductAuthorizeByNum") + public AjaxResult addProductAuthorizeByNum(@RequestBody ProductAuthorizeVO productAuthorizeVO) + { + return toAjax(productAuthorizeService.addProductAuthorizeByNum(productAuthorizeVO)); + } + + /** + * 修改产品授权码 + */ + @ApiOperation("修改产品授权码") + @PreAuthorize("@ss.hasPermi('iot:authorize:edit')") + @Log(title = "产品授权码", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProductAuthorize productAuthorize) + { + return toAjax(productAuthorizeService.updateProductAuthorize(productAuthorize)); + } + + /** + * 删除产品授权码 + */ + @ApiOperation("删除产品授权码") + @PreAuthorize("@ss.hasPermi('iot:authorize:remove')") + @Log(title = "产品授权码", businessType = BusinessType.DELETE) + @DeleteMapping("/{authorizeIds}") + public AjaxResult remove(@PathVariable Long[] authorizeIds) + { + return toAjax(productAuthorizeService.deleteProductAuthorizeByAuthorizeIds(authorizeIds)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductController.java new file mode 100644 index 00000000..08f82d55 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ProductController.java @@ -0,0 +1,154 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.iot.domain.Product; +import com.fastbee.iot.model.ChangeProductStatusModel; +import com.fastbee.iot.model.IdAndName; +import com.fastbee.iot.service.IProductService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 产品Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@Api(tags = "产品管理") +@RestController +@RequestMapping("/iot/product") +public class ProductController extends BaseController +{ + @Autowired + private IProductService productService; + + /** + * 查询产品列表 + */ + @GetMapping("/list") + @ApiOperation("产品分页列表") + public TableDataInfo list(Product product) + { + startPage(); + return getDataTable(productService.selectProductList(product)); + } + + /** + * 查询产品简短列表 + */ + @PreAuthorize("@ss.hasPermi('iot:product:list')") + @GetMapping("/shortList") + @ApiOperation("产品简短列表") + public AjaxResult shortList(Product product) + { + + List list = productService.selectProductShortList(); + return AjaxResult.success(list); + } + + /** + * 导出产品列表 + */ + @PreAuthorize("@ss.hasPermi('iot:product:export')") + @Log(title = "产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ApiOperation("导出产品") + public void export(HttpServletResponse response, Product product) + { + List list = productService.selectProductList(product); + ExcelUtil util = new ExcelUtil(Product.class); + util.exportExcel(response, list, "产品数据"); + } + + /** + * 获取产品详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:product:query')") + @GetMapping(value = "/{productId}") + @ApiOperation("获取产品详情") + public AjaxResult getInfo(@PathVariable("productId") Long productId) + { + return AjaxResult.success(productService.selectProductByProductId(productId)); + } + + /** + * 新增产品 + */ + @PreAuthorize("@ss.hasPermi('iot:product:add')") + @Log(title = "添加产品", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加产品") + public AjaxResult add(@RequestBody Product product) + { + return AjaxResult.success(productService.insertProduct(product)); + } + + /** + * 修改产品 + */ + @PreAuthorize("@ss.hasPermi('iot:product:edit')") + @Log(title = "修改产品", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改产品") + public AjaxResult edit(@RequestBody Product product) + { + return toAjax(productService.updateProduct(product)); + } + + /** + * 获取产品下面的设备数量 + */ + @PreAuthorize("@ss.hasPermi('iot:product:query')") + @GetMapping("/deviceCount/{productId}") + @ApiOperation("获取产品下面的设备数量") + public AjaxResult deviceCount(@PathVariable Long productId) + { + return AjaxResult.success(productService.selectDeviceCountByProductId(productId)); + } + + /** + * 发布产品 + */ + @PreAuthorize("@ss.hasPermi('iot:product:add')") + @Log(title = "更新产品状态", businessType = BusinessType.UPDATE) + @PutMapping("/status") + @ApiOperation("更新产品状态") + public AjaxResult changeProductStatus(@RequestBody ChangeProductStatusModel model) + { + return productService.changeProductStatus(model); + } + + /** + * 删除产品 + */ + @PreAuthorize("@ss.hasPermi('iot:product:remove')") + @Log(title = "产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{productIds}") + @ApiOperation("批量删除产品") + public AjaxResult remove(@PathVariable Long[] productIds) + { + return productService.deleteProductByProductIds(productIds); + } + + + /** + * 查询采集点模板关联的所有产品 + */ + @PreAuthorize("@ss.hasPermi('iot:product:list')") + @GetMapping("/queryByTemplateId") + @ApiOperation("查询采集点模板id关联的所有产品") + public AjaxResult queryByTemplateId(@RequestParam Long templateId){ + return AjaxResult.success(productService.selectByTempleId(templateId)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialLoginController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialLoginController.java new file mode 100644 index 00000000..f54f2f95 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialLoginController.java @@ -0,0 +1,104 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.BindLoginBody; +import com.fastbee.common.core.domain.model.BindRegisterBody; +import com.fastbee.iot.service.ISocialLoginService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import me.zhyd.oauth.model.AuthCallback; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 第三方登录接口Controller + * + * @author json + * @date 2022-04-12 + */ +@Api(tags = "第三方登录接口") +@RestController +@RequestMapping("/auth") +public class SocialLoginController { + + @Autowired + private ISocialLoginService iSocialLoginService; + + + @GetMapping("/render/{source}") + @ApiOperation("微信登录跳转二维码") + @ApiImplicitParam(name = "source", value = "登录类型", required = true, dataType = "String", paramType = "path", dataTypeClass = String.class) + public void renderAuth(HttpServletResponse httpServletResponse, HttpServletRequest httpServletRequest, @PathVariable String source) throws IOException { + // 生成授权页面 + httpServletResponse.sendRedirect(iSocialLoginService.renderAuth(source, httpServletRequest)); + } + + @GetMapping("/callback/{source}") + @ApiOperation("微信登录扫码回调api") + @ApiImplicitParam(name = "source", value = "平台来源", required = true, dataType = "String", paramType = "path", dataTypeClass = String.class) + public void login(@PathVariable("source") String source, AuthCallback authCallback, HttpServletResponse httpServletResponse, HttpServletRequest httpServletRequest) throws IOException { + //回调接口 + httpServletResponse.sendRedirect(iSocialLoginService.callback(source, authCallback, httpServletRequest)); + } + + @GetMapping("/checkBindId/{bindId}") + @ApiOperation("检查bindId") + @ApiImplicitParam(name = "bindId", value = "绑定ID", required = true, dataType = "String", paramType = "path", dataTypeClass = String.class) + public AjaxResult checkBindId(@PathVariable String bindId) { + return iSocialLoginService.checkBindId(bindId); + } + + @GetMapping("/getErrorMsg/{errorId}") + @ApiOperation("获取errorMsg") + @ApiImplicitParam(name = "errorId", value = "错误提示ID", required = true, dataType = "String", paramType = "path", dataTypeClass = String.class) + public AjaxResult getErrorMsg(@PathVariable String errorId) { + return iSocialLoginService.getErrorMsg(errorId); + } + + /** + * 已经绑定账户,跳转登录接口 + * + * @param loginId + * @return + */ + @GetMapping("/login/{loginId}") + @ApiOperation("跳转登录api") + @ApiImplicitParam(name = "loginId", value = "登录Id", required = true, dataType = "String", paramType = "path", dataTypeClass = String.class) + public AjaxResult socialLogin(@PathVariable String loginId) { + // 生成授权页面 + return iSocialLoginService.socialLogin(loginId); + } + + /** + * 登录方法 + * + * @param bindLoginBody 绑定登录信息 + * @return 结果 + */ + @ApiOperation("绑定登录方法") + @PostMapping("/bind/login") + public AjaxResult bindLogin(@RequestBody BindLoginBody bindLoginBody) { + return iSocialLoginService.bindLogin(bindLoginBody); + } + + /** + * 注册绑定接口 + * + * @param bindRegisterBody 注册信息 + * @return 注册绑定信息 + */ + @ApiOperation("注册绑定") + @PostMapping("/bind/register") + public AjaxResult bindRegister(@RequestBody BindRegisterBody bindRegisterBody) { + return iSocialLoginService.bindRegister(bindRegisterBody); + } + +} + + + diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialPlatformController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialPlatformController.java new file mode 100644 index 00000000..873935ad --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/SocialPlatformController.java @@ -0,0 +1,109 @@ +package com.fastbee.data.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.SocialPlatform; +import com.fastbee.iot.service.ISocialPlatformService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 第三方登录平台控制Controller + * + * @author kerwincui + * @date 2022-04-11 + */ +@Api(tags = "第三方登录平台") +@RestController +@RequestMapping("/iot/platform") +public class SocialPlatformController extends BaseController { + @Autowired + private ISocialPlatformService socialPlatformService; + + /** + * 查询第三方登录平台控制列表 + */ + @PreAuthorize("@ss.hasPermi('iot:platform:list')") + @GetMapping("/list") + @ApiOperation("第三方登录平台分页列表") + public TableDataInfo list(SocialPlatform socialPlatform) { + startPage(); + List list = socialPlatformService.selectSocialPlatformList(socialPlatform); + return getDataTable(list); + } + + /** + * 导出第三方登录平台控制列表 + */ + @ApiOperation("导出第三方登录平台控制列表") + @PreAuthorize("@ss.hasPermi('iot:platform:export')") + @Log(title = "第三方登录平台控制", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SocialPlatform socialPlatform) { + List list = socialPlatformService.selectSocialPlatformList(socialPlatform); + ExcelUtil util = new ExcelUtil(SocialPlatform.class); + util.exportExcel(response, list, "第三方登录平台控制数据"); + } + + /** + * 获取第三方登录平台控制详细信息 + */ + @ApiOperation("获取第三方登录平台控制详细信息") + @PreAuthorize("@ss.hasPermi('iot:platform:query')") + @GetMapping(value = "/{socialPlatformId}") + public AjaxResult getInfo(@PathVariable("socialPlatformId") Long socialPlatformId) { + return AjaxResult.success(socialPlatformService.selectSocialPlatformBySocialPlatformId(socialPlatformId)); + } + + /** + * 新增第三方登录平台控制 + */ + @ApiOperation("新增第三方登录平台控制") + @PreAuthorize("@ss.hasPermi('iot:platform:add')") + @Log(title = "第三方登录平台控制", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SocialPlatform socialPlatform) { + socialPlatform.setCreateBy(getUsername()); + return toAjax(socialPlatformService.insertSocialPlatform(socialPlatform)); + } + + /** + * 修改第三方登录平台控制 + */ + @ApiOperation("修改第三方登录平台控制") + @PreAuthorize("@ss.hasPermi('iot:platform:edit')") + @Log(title = "第三方登录平台控制", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SocialPlatform socialPlatform) { + socialPlatform.setUpdateBy(getUsername()); + return toAjax(socialPlatformService.updateSocialPlatform(socialPlatform)); + } + + /** + * 删除第三方登录平台控制 + */ + @ApiOperation("删除第三方登录平台控制") + @PreAuthorize("@ss.hasPermi('iot:platform:remove')") + @Log(title = "第三方登录平台控制", businessType = BusinessType.DELETE) + @DeleteMapping("/{socialPlatformIds}") + public AjaxResult remove(@PathVariable Long[] socialPlatformIds) { + return toAjax(socialPlatformService.deleteSocialPlatformBySocialPlatformIds(socialPlatformIds)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelController.java new file mode 100644 index 00000000..7f2b6eaa --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelController.java @@ -0,0 +1,180 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.model.ImportThingsModelInput; +import com.fastbee.iot.model.ThingsModelPerm; +import com.fastbee.iot.model.varTemp.SyncModel; +import com.fastbee.iot.service.IThingsModelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; +import java.util.List; + +/** + * 物模型Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@RestController +@RequestMapping("/iot/model") +@Api(tags="产品物模型") +public class ThingsModelController extends BaseController +{ + @Autowired + private IThingsModelService thingsModelService; + + /** + * 查询物模型列表 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/list") + @ApiOperation("产品物模型分页列表") + public TableDataInfo list(ThingsModel thingsModel) + { + startPage(); + List list = thingsModelService.selectThingsModelList(thingsModel); + return getDataTable(list); + } + + /** + * 查询物模型对应设备分享权限 + */ + @PreAuthorize("@ss.hasPermi('iot:device:list')") + @GetMapping("/permList/{productId}") + @ApiOperation("查询物模型对应设备分享权限") + public AjaxResult permList(@PathVariable Long productId) + { + List list = thingsModelService.selectThingsModelPermList(productId); + return AjaxResult.success(list); + } + + /** + * 获取物模型详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/{modelId}") + @ApiOperation("获取产品物模型详情") + public AjaxResult getInfo(@PathVariable("modelId") Long modelId) + { + return AjaxResult.success(thingsModelService.selectThingsModelByModelId(modelId)); + } + + /** + * 新增物模型 + */ + @PreAuthorize("@ss.hasPermi('iot:device:add')") + @Log(title = "物模型", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加产品物模型") + public AjaxResult add(@RequestBody ThingsModel thingsModel) + { + int result=thingsModelService.insertThingsModel(thingsModel); + if(result==1){ + return AjaxResult.success(); + }else if(result==2){ + return AjaxResult.error("产品下的标识符不能重复"); + }else{ + return AjaxResult.error(); + } + } + + @Log(title = "导入物模型",businessType = BusinessType.INSERT) + @PostMapping("/import") + @ApiOperation("导入通用物模型") + public AjaxResult ImportByTemplateIds(@RequestBody ImportThingsModelInput input){ + int repeatCount=thingsModelService.importByTemplateIds(input); + if(repeatCount==0){ + return AjaxResult.success("数据导入成功"); + }else{ + return AjaxResult.success(repeatCount+"条数据未导入,标识符重复"); + } + } + + /** + * 修改物模型 + */ + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "物模型", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改产品物模型") + public AjaxResult edit(@RequestBody ThingsModel thingsModel) + { + int result=thingsModelService.updateThingsModel(thingsModel); + if(result==1){ + return AjaxResult.success(); + }else if(result==2){ + return AjaxResult.error("产品下的标识符不能重复"); + }else{ + return AjaxResult.error(); + } + } + + /** + * 删除物模型 + */ + @PreAuthorize("@ss.hasPermi('iot:device:remove')") + @Log(title = "物模型", businessType = BusinessType.DELETE) + @DeleteMapping("/{modelIds}") + @ApiOperation("批量删除产品物模型") + public AjaxResult remove(@PathVariable Long[] modelIds) + { + return toAjax(thingsModelService.deleteThingsModelByModelIds(modelIds)); + } + + /** + * 获取缓存的JSON物模型 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/cache/{productId}") + @ApiOperation("获取缓存的JSON物模型") + public AjaxResult getCacheThingsModelByProductId(@PathVariable("productId") Long productId) + { + return AjaxResult.success("操作成功",thingsModelService.getCacheThingsModelByProductId(productId)); + } + + @ApiOperation(value = "物模型导入模板") + @PostMapping("/temp") + public void temp(HttpServletResponse response){ + ExcelUtil excelUtil = new ExcelUtil<>(ThingsModel.class); + excelUtil.importTemplateExcel(response,"采集点"); + } + + + /** + * 导入采集点 + */ + @PreAuthorize("@ss.hasPermi('iot:point:import')") + @ApiOperation(value = "采集点导入") + @PostMapping(value = "/importData") + public AjaxResult importData(MultipartFile file, Integer tempSlaveId) throws Exception{ + ExcelUtil excelUtil = new ExcelUtil<>(ThingsModel.class); + List list = excelUtil.importExcel(file.getInputStream()); + String result = thingsModelService.importData(list, tempSlaveId); + return AjaxResult.success(result); + } + + @PreAuthorize("@ss.hasPermi('iot:device:edit')") + @Log(title = "物模型", businessType = BusinessType.UPDATE) + @PostMapping("/synchron") + @ApiOperation("同步采集点模板至产品物模型") + public AjaxResult synchron(@RequestBody SyncModel model) + { + thingsModelService.synchronizeVarTempToProduct(model.getProductIds(), model.getTemplateId()); + return AjaxResult.success(); + } + +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelTemplateController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelTemplateController.java new file mode 100644 index 00000000..74cf2c9e --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ThingsModelTemplateController.java @@ -0,0 +1,147 @@ +package com.fastbee.data.controller; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.domain.VarTemp; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.ThingsModelTemplate; +import com.fastbee.iot.service.IThingsModelTemplateService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 通用物模型Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@RestController +@RequestMapping("/iot/template") +@Api(tags = "通用物模型") +public class ThingsModelTemplateController extends BaseController { + @Autowired + private IThingsModelTemplateService thingsModelTemplateService; + + /** + * 查询通用物模型列表 + */ + @PreAuthorize("@ss.hasPermi('iot:template:list')") + @GetMapping("/list") + @ApiOperation("通用物模型分页列表") + public TableDataInfo list(ThingsModelTemplate thingsModelTemplate) { + startPage(); + return getDataTable(thingsModelTemplateService.selectThingsModelTemplateList(thingsModelTemplate)); + } + + /** + * 导出通用物模型列表 + */ + @PreAuthorize("@ss.hasPermi('iot:template:export')") + @Log(title = "通用物模型", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ApiOperation("导出通用物模型") + public void export(HttpServletResponse response, ThingsModelTemplate thingsModelTemplate) { + List list = thingsModelTemplateService.selectThingsModelTemplateList(thingsModelTemplate); + ExcelUtil util = new ExcelUtil(ThingsModelTemplate.class); + util.exportExcel(response, list, "通用物模型数据"); + } + + /** + * 获取通用物模型详细信息 + */ + @PreAuthorize("@ss.hasPermi('iot:template:query')") + @GetMapping(value = "/{templateId}") + @ApiOperation("获取通用物模型详情") + public AjaxResult getInfo(@PathVariable("templateId") Long templateId) { + return AjaxResult.success(thingsModelTemplateService.selectThingsModelTemplateByTemplateId(templateId)); + } + + /** + * 新增通用物模型 + */ + @PreAuthorize("@ss.hasPermi('iot:template:add')") + @Log(title = "通用物模型", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("添加通用物模型") + public AjaxResult add(@RequestBody ThingsModelTemplate thingsModelTemplate) { + return toAjax(thingsModelTemplateService.insertThingsModelTemplate(thingsModelTemplate)); + } + + /** + * 修改通用物模型 + */ + @PreAuthorize("@ss.hasPermi('iot:template:edit')") + @Log(title = "通用物模型", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改通用物模型") + public AjaxResult edit(@RequestBody ThingsModelTemplate thingsModelTemplate) { + return toAjax(thingsModelTemplateService.updateThingsModelTemplate(thingsModelTemplate)); + } + + /** + * 删除通用物模型 + */ + @PreAuthorize("@ss.hasPermi('iot:template:remove')") + @Log(title = "通用物模型", businessType = BusinessType.DELETE) + @DeleteMapping("/{templateIds}") + @ApiOperation("批量删除通用物模型") + public AjaxResult remove(@PathVariable Long[] templateIds) { + return toAjax(thingsModelTemplateService.deleteThingsModelTemplateByTemplateIds(templateIds)); + } + + @ApiOperation(value = "物模型导入模板") + @PostMapping("/temp") + public void temp(HttpServletResponse response) { + ExcelUtil excelUtil = new ExcelUtil<>(ThingsModelTemplate.class); + excelUtil.importTemplateExcel(response, "采集点"); + } + + + /** + * 导入采集点 + */ + @PreAuthorize("@ss.hasPermi('iot:template:add')") + @ApiOperation(value = "采集点导入") + @PostMapping(value = "/importData") + public AjaxResult importData(MultipartFile file, String tempSlaveId) throws Exception { + ExcelUtil excelUtil = new ExcelUtil<>(ThingsModelTemplate.class); + List list = excelUtil.importExcel(file.getInputStream()); + String result = thingsModelTemplateService.importData(list, tempSlaveId); + return AjaxResult.success(result); + } + + /** + * 根据模板id查询采集点数据 + */ + @ApiOperation("根据模板id查询采集点数据") + @PreAuthorize("@ss.hasPermi('iot:template:query')") + @GetMapping("/getPoints") + public TableDataInfo getPoints(VarTemp varTemp) { + startPage(); + List result = thingsModelTemplateService.selectAllByTemplateId(varTemp.getTemplateId()); + return getDataTable(result); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ToolController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ToolController.java new file mode 100644 index 00000000..fa85fcb6 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/ToolController.java @@ -0,0 +1,450 @@ +package com.fastbee.data.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.ProtocolDeCodeService; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.iot.response.DeCodeBo; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.core.protocol.modbus.ModbusCode; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.exception.file.FileNameLengthLimitExceededException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.file.FileUploadUtils; +import com.fastbee.common.utils.file.FileUtils; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.model.*; +import com.fastbee.iot.model.ThingsModels.ThingsModelShadow; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.iot.service.IToolService; +import com.fastbee.iot.util.VelocityInitializer; +import com.fastbee.iot.util.VelocityUtils; +import com.fastbee.mq.model.ReportDataBo; +import com.fastbee.mq.mqttClient.MqttClientConfig; +import com.fastbee.mq.mqttClient.PubMqttClient; +import com.fastbee.mq.service.IMqttMessagePublish; +import com.fastbee.mqtt.model.PushMessageBo; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.netty.buffer.ByteBufUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import static com.fastbee.common.utils.file.FileUploadUtils.getExtension; + +/** + * 产品分类Controller + * + * @author kerwincui + * @date 2021-12-16 + */ +@Api(tags = "工具相关") +@RestController +@RequestMapping("/iot/tool") +public class ToolController extends BaseController { + private static final Logger log = LoggerFactory.getLogger(ToolController.class); + + @Autowired + private IDeviceService deviceService; + @Autowired + private IMqttMessagePublish messagePublish; + @Autowired + private MqttClientConfig mqttConfig; + @Autowired + private IToolService toolService; + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + + @Resource + private ProtocolDeCodeService deCodeService; + @Resource + private PubMqttClient mqttClient; + + /** + * 用户注册 + */ + @ApiOperation("用户注册") + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterUserInput user) { + String msg = toolService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } + + /** + * 获取用户列表 + */ + @ApiOperation("获取用户列表") + @GetMapping("/userList") + public TableDataInfo list(SysUser user) + { + startPage(); + List list = toolService.selectUserList(user); + return getDataTable(list); + } + + @ApiOperation("mqtt认证") + @PostMapping("/mqtt/auth") + public ResponseEntity mqttAuth(@RequestParam String clientid, @RequestParam String username, @RequestParam String password) throws Exception { + if (clientid.startsWith("server")) { + // 服务端认证:配置的账号密码认证 + if (mqttConfig.getUsername().equals(username) && mqttConfig.getPassword().equals(password)) { + log.info("-----------服务端mqtt认证成功,clientId:" + clientid + "---------------"); + return ResponseEntity.ok().body("ok"); + } else { + return toolService.returnUnauthorized(new MqttAuthenticationModel(clientid, username, password), "mqtt账号和密码与认证服务器配置不匹配"); + } + } else if (clientid.startsWith("web") || clientid.startsWith("phone")) { + // web端和移动端认证:token认证 + String token = password; + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + try { + Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + log.info("-----------移动端/Web端mqtt认证成功,clientId:" + clientid + "---------------"); + return ResponseEntity.ok().body("ok"); + } catch (Exception ex) { + return toolService.returnUnauthorized(new MqttAuthenticationModel(clientid, username, password), ex.getMessage()); + } + } else { + // 替换为整合之后的接口 + return toolService.clientAuth(clientid, username, password); + } + } + @ApiOperation("mqtt认证") + @PostMapping("/mqtt/authv5") + public ResponseEntity mqttAuthv5(@RequestBody JSONObject json) throws Exception { + log.info("-----------auth-json:" + json + "---------------"); + String clientid = json.getString("clientid"); + String username = json.getString("username"); + String password = json.getString("password"); + String peerhost = json.getString("peerhost"); // 源IP地址 + JSONObject ret = new JSONObject(); + ret.put("is_superuser", false); + if (clientid.startsWith("server")) { + // 服务端认证:配置的账号密码认证 + if (mqttConfig.getUsername().equals(username) && mqttConfig.getPassword().equals(password)) { + log.info("-----------服务端mqtt认证成功,clientId:" + clientid + "---------------"); + ret.put("result", "allow"); + return ResponseEntity.ok().body(ret); + } else { + ret.put("result", "deny"); + return ResponseEntity.ok().body(ret); + } + } else if (clientid.startsWith("web") || clientid.startsWith("phone")) { + // web端和移动端认证:token认证 + String token = password; + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + try { + Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + log.info("-----------移动端/Web端mqtt认证成功,clientId:" + clientid + "---------------"); + ret.put("result", "allow"); + return ResponseEntity.ok().body(ret); + } catch (Exception ex) { + ret.put("result", "deny"); + return ResponseEntity.ok().body(ret); + } + } else { + // 替换为整合之后的接口 + return toolService.clientAuthv5(clientid, username, password); + } + } + + @ApiOperation("mqtt钩子处理") + @PostMapping("/mqtt/webhook") + public void webHookProcess(@RequestBody MqttClientConnectModel model) { + try { + System.out.println("webhook:" + model.getAction()); + // 过滤服务端、web端和手机端 + if (model.getClientid().startsWith("server") || model.getClientid().startsWith("web") || model.getClientid().startsWith("phone")) { + return; + } + // 设备端认证:加密认证(E)和简单认证(S,配置的账号密码认证) + String[] clientArray = model.getClientid().split("&"); + String authType = clientArray[0]; + String deviceNumber = clientArray[1]; + Long productId = Long.valueOf(clientArray[2]); + Long userId = Long.valueOf(clientArray[3]); + + Device device = deviceService.selectShortDeviceBySerialNumber(deviceNumber); + ReportDataBo ruleBo = new ReportDataBo(); + ruleBo.setProductId(device.getProductId()); + ruleBo.setSerialNumber(device.getSerialNumber()); + // 设备状态(1-未激活,2-禁用,3-在线,4-离线) + if (model.getAction().equals("client_disconnected")) { + device.setStatus(4); + deviceService.updateDeviceStatusAndLocation(device, ""); + // 设备掉线后发布设备状态 + messagePublish.publishStatus(device.getProductId(), device.getSerialNumber(), 4, device.getIsShadow(),device.getRssi()); + // 清空保留消息,上线后发布新的属性功能保留消息 + messagePublish.publishProperty(device.getProductId(), device.getSerialNumber(), null,0); + messagePublish.publishFunction(device.getProductId(), device.getSerialNumber(), null,0); + + } else if (model.getAction().equals("client_connected")) { + device.setStatus(3); + deviceService.updateDeviceStatusAndLocation(device, model.getIpaddress()); + // 设备上线后发布设备状态 + messagePublish.publishStatus(device.getProductId(), device.getSerialNumber(), 3, device.getIsShadow(),device.getRssi()); + // 影子模式,发布属性和功能 + if (device.getIsShadow() == 1) { + ThingsModelShadow shadow = deviceService.getDeviceShadowThingsModel(device); + if (shadow.getProperties().size() > 0) { + messagePublish.publishProperty(device.getProductId(), device.getSerialNumber(), shadow.getProperties(),3); + } + if (shadow.getFunctions().size() > 0) { + messagePublish.publishFunction(device.getProductId(), device.getSerialNumber(), shadow.getFunctions(),3); + } + } + + } + + } catch (Exception ex) { + ex.printStackTrace(); + log.error("发生错误:" + ex.getMessage()); + } + } + + @ApiOperation("mqtt钩子处理") + @PostMapping("/mqtt/webhookv5") + public void webHookProcessv5(@RequestBody JSONObject json) { + try { + String clientid = json.getString("clientid"); + String event = json.getString("event"); + String peername = json.getString("peername"); // 类似 127.0.0.111.11.11.11:8812 + String ipAddress=peername; + if(peername.indexOf(":")!=-1){ + ipAddress = peername.substring(0,peername.indexOf(":")); + } + log.info("webhook:" + event + ",clientid:" + clientid); + // 过滤服务端、web端和手机端 + if (clientid.startsWith("server") || clientid.startsWith("web") || clientid.startsWith("phone")) { + return; + } + // 设备端认证:加密认证(E)和简单认证(S,配置的账号密码认证) + String[] clientArray = clientid.split("&"); + String deviceNumber = clientArray[1]; + + Device device = deviceService.selectShortDeviceBySerialNumber(deviceNumber); + ReportDataBo ruleBo = new ReportDataBo(); + ruleBo.setProductId(device.getProductId()); + ruleBo.setSerialNumber(device.getSerialNumber()); + // 设备状态(1-未激活,2-禁用,3-在线,4-离线) + if (event.equals("client.disconnected")) { + device.setStatus(4); + deviceService.updateDeviceStatusAndLocation(device, ""); + // 设备掉线后发布设备状态 + messagePublish.publishStatus(device.getProductId(), device.getSerialNumber(), 4, device.getIsShadow(),device.getRssi()); + // 清空保留消息,上线后发布新的属性功能保留消息 + messagePublish.publishProperty(device.getProductId(), device.getSerialNumber(), null,0); + messagePublish.publishFunction(device.getProductId(), device.getSerialNumber(), null,0); + } else if (event.equals("client.connected")) { + device.setStatus(3); + deviceService.updateDeviceStatusAndLocation(device, ipAddress); + // 设备掉线后发布设备状态 + messagePublish.publishStatus(device.getProductId(), device.getSerialNumber(), 3, device.getIsShadow(),device.getRssi()); + } else if(event.equals("session.subscribed")){ + // 影子模式,发布属性和功能 + if (device.getIsShadow() == 1) { + ThingsModelShadow shadow = deviceService.getDeviceShadowThingsModel(device); + if (shadow.getProperties().size() > 0) { + messagePublish.publishProperty(device.getProductId(), device.getSerialNumber(), shadow.getProperties(),3); + } + if (shadow.getFunctions().size() > 0) { + messagePublish.publishFunction(device.getProductId(), device.getSerialNumber(), shadow.getFunctions(),3); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + log.error("发生错误:" + ex.getMessage()); + } + } + + + @ApiOperation("获取NTP时间") + @GetMapping("/ntp") + public JSONObject ntp(@RequestParam Long deviceSendTime) { + JSONObject ntpJson = new JSONObject(); + ntpJson.put("deviceSendTime", deviceSendTime); + ntpJson.put("serverRecvTime", System.currentTimeMillis()); + ntpJson.put("serverSendTime", System.currentTimeMillis()); + return ntpJson; + } + + /** + * 文件上传 + */ + @PostMapping("/upload") + @ApiOperation("文件上传") + public AjaxResult uploadFile(MultipartFile file) throws Exception { + try { + String filePath = RuoYiConfig.getProfile(); + // 文件名长度限制 + int fileNamelength = file.getOriginalFilename().length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + // 文件类型限制 + // assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + + // 获取文件名和文件类型 + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + //设置日期格式 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MMdd-HHmmss"); + fileName = "/iot/" + getLoginUser().getUserId().toString() + "/" + df.format(new Date()) + "." + extension; + //创建目录 + File desc = new File(filePath + File.separator + fileName); + if (!desc.exists()) { + if (!desc.getParentFile().exists()) { + desc.getParentFile().mkdirs(); + } + } + // 存储文件 + file.transferTo(desc); + + String url = "/profile" + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("fileName", url); + ajax.put("url", url); + return ajax; + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 下载文件 + */ + @ApiOperation("文件下载") + @GetMapping("/download") + public void download(String fileName, HttpServletResponse response, HttpServletRequest request) { + try { +// if (!FileUtils.checkAllowDownload(fileName)) { +// throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); +// } + String filePath = RuoYiConfig.getProfile(); + // 资源地址 + String downloadPath = filePath + fileName.replace("/profile", ""); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } catch (Exception e) { + log.error("下载文件失败", e); + } + } + + /** + * 批量生成代码 + */ + @Log(title = "SDK生成", businessType = BusinessType.GENCODE) + @GetMapping("/genSdk") + @ApiOperation("生成SDK") + public void genSdk(HttpServletResponse response, int deviceChip) throws IOException { + byte[] data = downloadCode(deviceChip); + genSdk(response, data); + } + + /** + * 生成zip文件 + */ + private void genSdk(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"fastbee.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } + + /** + * 批量生成代码(下载方式) + * + * @param deviceChip + * @return 数据 + */ + public byte[] downloadCode(int deviceChip) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); +// generatorCode(deviceChip, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(int deviceChip, ZipOutputStream zip) { + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(deviceChip); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(""); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + System.out.println("渲染模板失败"); + } + } + } + + @GetMapping("/getTopics") + @ApiOperation("获取所有下发的topic") + public AjaxResult getTopics(Boolean isSimulate){ + return AjaxResult.success(TopicsUtils.getAllGet(isSimulate)); + } + + @GetMapping("/decode") + @ApiOperation("指令编码") + public AjaxResult decode(DeCodeBo bo){ + return AjaxResult.success(deCodeService.protocolDeCode(bo)); + } + +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/UserSocialController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/UserSocialController.java new file mode 100644 index 00000000..b0fd433d --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/UserSocialController.java @@ -0,0 +1,69 @@ +package com.fastbee.data.controller; + +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.iot.service.IUserSocialProfileService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 第三方登录平台控制Controller + * + * @author json + * @date 2022-04-24 + */ +@Api(tags = "用户社交账户api") +@RestController +@RequestMapping("/iot/social/") +public class UserSocialController extends BaseController { + + @Autowired + private IUserSocialProfileService iUserSocialProfileService; + + + /** + * 绑定 + * + * @param bindId 绑定id + * @return + */ + @GetMapping("/bindId/{bindId}") + @ApiOperation("绑定api") + @ApiImplicitParam(name = "bindId", value = "绑定bindId", required = true, dataType = "String", paramType = "path", dataTypeClass = String.class) + public AjaxResult bindUser(@PathVariable String bindId) { + return iUserSocialProfileService.bindUser(bindId, getUserId()); + } + + + /** + * 绑定 + * + * @param platform 绑定类型 + * @return + */ + @GetMapping("/bind/{platform}") + @ApiOperation("绑定跳转api") + @ApiImplicitParam(name = "platform", value = "绑定platform", required = true, dataType = "String", paramType = "path", dataTypeClass = String.class) + public AjaxResult bind(@PathVariable String platform) { + return iUserSocialProfileService.bindSocialAccount(platform); + } + + /** + * 解绑 + * + * @param socialUserId 用户社交平台Id + * @return + */ + @GetMapping("/unbind/{socialUserId}") + @ApiOperation("解绑api") + @ApiImplicitParam(name = "socialUserId", value = "绑定socialId", required = true, dataType = "Long", paramType = "path", dataTypeClass = Long.class) + public AjaxResult unbind(@PathVariable Long socialUserId) { + return iUserSocialProfileService.unbindSocialAccount(socialUserId, getUserId()); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/dashBoard/DashBoardController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/dashBoard/DashBoardController.java new file mode 100644 index 00000000..9ff74d14 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/dashBoard/DashBoardController.java @@ -0,0 +1,72 @@ +package com.fastbee.data.controller.dashBoard; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.iot.model.dashBoard.DashMqttMetrics; +import com.fastbee.iot.model.dashBoard.DashMqttStat; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.RetainMsgManager; +import com.fastbee.base.service.ISessionStore; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * 首页面板和大屏数据 + * + * @author gsb + * @date 2023/3/27 17:00 + */ +@Api(tags = "首页面板和大屏数据") +@RestController +@RequestMapping("/bashBoard") +public class DashBoardController { + + @Resource + private RedisCache redisCache; + @Resource + private ISessionStore sessionStore; + + @GetMapping("/stats") + @ApiOperation("mqtt状态数据") + public AjaxResult stats() { + DashMqttStat stat = DashMqttStat.builder() + .connection_count(sessionStore.getSessionMap().size()) + .connection_total(getTotal(FastBeeConstant.REDIS.MESSAGE_CONNECT_TOTAL)) + .subscription_count(ClientManager.topicMap.size()) + .subscription_total(getTotal(FastBeeConstant.REDIS.MESSAGE_SUBSCRIBE_TOTAL)) + .retain_count(RetainMsgManager.getSize()) + .retain_total(getTotal(FastBeeConstant.REDIS.MESSAGE_RETAIN_TOTAL)) + .session_count(sessionStore.getSessionMap().size()) + .session_total(getTotal(FastBeeConstant.REDIS.MESSAGE_CONNECT_TOTAL)) + .build(); + return AjaxResult.success(stat); + + } + + + @GetMapping("/metrics") + @ApiOperation("mqtt统计") + public AjaxResult metrics() { + DashMqttMetrics metrics = DashMqttMetrics.builder() + .send_total(getTotal(FastBeeConstant.REDIS.MESSAGE_SEND_TOTAL)) + .receive_total(getTotal(FastBeeConstant.REDIS.MESSAGE_RECEIVE_TOTAL)) + .auth_total(getTotal(FastBeeConstant.REDIS.MESSAGE_AUTH_TOTAL)) + .connect_total(getTotal(FastBeeConstant.REDIS.MESSAGE_CONNECT_TOTAL)) + .subscribe_total(getTotal(FastBeeConstant.REDIS.MESSAGE_SUBSCRIBE_TOTAL)) + .today_received(getTotal(FastBeeConstant.REDIS.MESSAGE_RECEIVE_TODAY)) + .today_send(getTotal(FastBeeConstant.REDIS.MESSAGE_SEND_TODAY)) + .build(); + return AjaxResult.success(metrics); + } + + + public Integer getTotal(String key) { + return redisCache.getCacheObject(key) == null ? 0 : redisCache.getCacheObject(key); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/netty/NettyManagerController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/netty/NettyManagerController.java new file mode 100644 index 00000000..529fb8c3 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/netty/NettyManagerController.java @@ -0,0 +1,121 @@ +package com.fastbee.data.controller.netty; + +import com.fastbee.base.service.ISessionStore; +import com.fastbee.base.session.Session; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.gateway.mq.Topics; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.SessionManger; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +/** + * NETTY客户端可视化 + * + * @author gsb + * @date 2023/3/23 14:51 + */ +@RestController +@RequestMapping("/iot/mqtt") +@Api(tags = "Netty可视化") +@Slf4j +public class NettyManagerController extends BaseController { + + @Resource + private ISessionStore sessionStore; + + /** + * 客户端管理列表 + * @param pageSize 分页大小 + * @param pageNum 页数 + * @param clientId 查询客户端id + * @param serverCode 服务端类型编码 MQTT/TCP/UDP + * @param isClient 是否只显示设备端 1-是/0或null-否 + * @return 客户端列表 + */ + @GetMapping("/clients") + @ApiOperation("netty客户端列表") + public AjaxResult clients(Integer pageSize, Integer pageNum, String clientId, String serverCode,Integer isClient) { + List list = new ArrayList<>(); + if (StringUtils.isEmpty(clientId)) { + ConcurrentHashMap sourceMap = sessionStore.getSessionMap(); + ConcurrentHashMap selectMap = new ConcurrentHashMap<>(); + sourceMap.forEach((key, value) -> { + if (serverCode.equals(value.getServerType().getCode())) { + if (null != isClient && isClient == 1){ + if (!key.startsWith("server") && !key.startsWith("web") && !key.startsWith("phone") && !key.startsWith("test")){ + selectMap.put(key,value); + } + }else { + selectMap.put(key, value); + } + } + }); + Map sessionMap = sessionStore.listPage(selectMap, pageSize, pageNum); + List result = new ArrayList<>(sessionMap.values()); + for (Session session : result) { + Map topicMap = ClientManager.clientTopicMap.get(session.getClientId()); + if (topicMap != null) { + List topicsList = new ArrayList<>(); + topicMap.keySet().forEach(topic -> { + Topics tBo = new Topics(); + tBo.setTopicName(topic); + topicsList.add(tBo); + }); + session.setTopics(topicsList); + session.setTopicCount(topicMap.size()); + } else { + session.setTopicCount(0); + } + list.add(session); + } + return AjaxResult.success(list, selectMap.size()); + } else { + List result = new ArrayList<>(); + Session session = sessionStore.getSession(clientId); + if (session != null) { + Map topicMap = ClientManager.clientTopicMap.get(session.getClientId()); + if (topicMap != null) { + List topicsList = new ArrayList<>(); + topicMap.keySet().forEach(topic -> { + Topics tBo = new Topics(); + tBo.setTopicName(topic); + topicsList.add(tBo); + }); + session.setTopics(topicsList); + session.setTopicCount(topicMap.size()); + } else { + session.setTopicCount(0); + } + if (serverCode.equals(session.getServerType().getCode())) { + result.add(session); + } + } + return AjaxResult.success(result, result.size()); + } + + } + + @GetMapping("/client/out") + @ApiOperation("netty客户端踢出") + public AjaxResult clientOut(String clientId){ + Session session = sessionStore.getSession(clientId); + Optional.ofNullable(session).orElseThrow(() -> new SecurityException("客户端不存在")); + SessionManger.removeClient(clientId); + return AjaxResult.success(); + } + +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/protocol/ProtocolController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/protocol/ProtocolController.java new file mode 100644 index 00000000..a1011fe1 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/protocol/ProtocolController.java @@ -0,0 +1,114 @@ +package com.fastbee.data.controller.protocol; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.iot.domain.Protocol; +import com.fastbee.iot.service.IProtocolService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +/** + * 协议Controller + * + * @author kerwincui + * @date 2022-12-07 + */ +@Api(tags = "协议") +@RestController +@RequestMapping("/iot/protocol") +public class ProtocolController extends BaseController +{ + @Autowired + private IProtocolService protocolService; + + /** + * 查询协议列表 + */ + @ApiOperation("查询协议列表") + @PreAuthorize("@ss.hasPermi('iot:protocol:list')") + @GetMapping("/list") + public TableDataInfo list(Protocol protocol) + { + startPage(); + List list = protocolService.selectProtocolList(protocol); + return getDataTable(list); + } + + /** + * 导出协议列表 + */ + @ApiOperation("导出协议列表") + @PreAuthorize("@ss.hasPermi('iot:protocol:export')") + @Log(title = "协议", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, Protocol protocol) + { + List list = protocolService.selectProtocolList(protocol); + ExcelUtil util = new ExcelUtil(Protocol.class); + util.exportExcel(response, list, "协议数据"); + } + + /** + * 获取协议详细信息 + */ + @ApiOperation("获取协议详细信息") + @PreAuthorize("@ss.hasPermi('iot:protocol:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(protocolService.selectProtocolById(id)); + } + + /** + * 新增协议 + */ + @ApiOperation("新增协议") + @PreAuthorize("@ss.hasPermi('iot:protocol:add')") + @Log(title = "协议", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody Protocol protocol) + { + return toAjax(protocolService.insertProtocol(protocol)); + } + + /** + * 修改协议 + */ + @ApiOperation("修改协议") + @PreAuthorize("@ss.hasPermi('iot:protocol:edit')") + @Log(title = "协议", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody Protocol protocol) + { + return toAjax(protocolService.updateProtocol(protocol)); + } + + /** + * 删除协议 + */ + @ApiOperation("删除协议") + @PreAuthorize("@ss.hasPermi('iot:protocol:remove')") + @Log(title = "协议", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(protocolService.deleteProtocolByIds(ids)); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/runtime/DeviceRuntimeController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/runtime/DeviceRuntimeController.java new file mode 100644 index 00000000..9b0b07eb --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/runtime/DeviceRuntimeController.java @@ -0,0 +1,119 @@ +package com.fastbee.data.controller.runtime; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.mq.InvokeReqDto; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.ThingsModelType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.domain.FunctionLog; +import com.fastbee.iot.service.IDeviceRuntimeService; +import com.fastbee.mq.service.IFunctionInvoke; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; +import java.util.Map; + +/** + * 设备运行时数据controller + * + * @author gsb + * @date 2022/12/5 11:52 + */ +@RestController +@RequestMapping("/iot/runtime") +@Api(tags = "设备运行数据") +public class DeviceRuntimeController extends BaseController { + + @Autowired + private IFunctionInvoke functionInvoke; + @Resource + private IDeviceRuntimeService runtimeService; + + /** + * 服务下发 + * 例如modbus 格式如下 + * + * @see InvokeReqDto#getRemoteCommand() + * key = 寄存器地址 + * value = 寄存器地址值 + *

+ * 其他协议 key = identifier + * value = 值 + * { + * "serialNumber": "860061060282358", + * "productId": "2", + * "identifier": "temp", + * "remoteCommand": { + * "4": "4" + * } + * } + */ + @PostMapping("/service/invoke") + @PreAuthorize("@ss.hasPermi('iot:service:invoke')") + @ApiOperation(value = "服务下发", httpMethod = "POST", response = AjaxResult.class, notes = "服务下发") + public AjaxResult invoke(@Valid @RequestBody InvokeReqDto reqDto) { + reqDto.setValue(new JSONObject(reqDto.getRemoteCommand())); + String messageId = functionInvoke.invokeNoReply(reqDto); + return AjaxResult.success(messageId); + } + + + /** + * 根据messageId查询服务回执 + */ + @GetMapping(value = "fun/get") + //@PreAuthorize("@ss.hasPermi('iot:service:get')") + @ApiOperation(value = "根据messageId查询服务回执", httpMethod = "GET", response = AjaxResult.class, notes = "根据messageId查询服务回执") + public AjaxResult reply(String serialNumber, String messageId) { + if (StringUtils.isEmpty(messageId) || StringUtils.isEmpty(serialNumber)) { + throw new ServiceException("消息id为空"); + } + // TODO - 根据消息id查询 + //DeviceTdReq req = new DeviceTdReq(); + //req.setImei(serialNumber); + //req.setMessageId(messageId); + //DeviceTdData data = deviceTdService.selectReplyMsg(req); + //return toAjax(data) + return AjaxResult.success(); + } + + + /** + * 实时状态 + * @param serialNumber 设备类型 + * @param type 物模型类型 + * @return 结果 + */ + @GetMapping(value = "/runState") + @ApiOperation(value = "实时状态") + public AjaxResult runState(String serialNumber, Integer type,Long productId,Integer slaveId){ + ThingsModelType modelType = ThingsModelType.getType(type); + List logList = runtimeService.runtimeBySerialNumber(serialNumber, modelType,productId,slaveId); + return AjaxResult.success(logList); + } + + /** + * 设备服务下发日志 + */ + @GetMapping(value = "/funcLog") + @ApiOperation(value = "设备服务下发日志") + public TableDataInfo funcLog(String serialNumber){ + startPage(); + List logList = runtimeService.runtimeReply(serialNumber); + return getDataTable(logList); + } + + + +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/wechat/WeChatController.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/wechat/WeChatController.java new file mode 100644 index 00000000..01d68fa0 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/controller/wechat/WeChatController.java @@ -0,0 +1,127 @@ +package com.fastbee.data.controller.wechat; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.wechat.WeChatLoginBody; +import com.fastbee.common.wechat.WeChatLoginResult; +import com.fastbee.iot.wechat.WeChatService; +import com.fastbee.iot.wechat.vo.WxBindReqVO; +import com.fastbee.iot.wechat.vo.WxCancelBindReqVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 微信相关控制器 + * @author fastb + * @date 2023-07-31 11:29 + */ +@Api(tags = "微信相关模块") +@RestController +@RequestMapping("/wechat") +public class WeChatController { + + @Resource + private WeChatService weChatService; + + /** + * 移动应用微信登录 + * @param weChatLoginBody 微信登录参数 + * @return 登录结果 + */ + @ApiOperation("移动应用微信登录") + @PostMapping("/mobileLogin") + public AjaxResult mobileLogin(@RequestBody WeChatLoginBody weChatLoginBody) { + return AjaxResult.success(weChatService.mobileLogin(weChatLoginBody)); + } + + /** + * 小程序微信登录 + * @param weChatLoginBody 微信登录参数 + * @return 登录结果 + */ + @ApiOperation("小程序微信登录") + @PostMapping("/miniLogin") + public AjaxResult miniLogin(@RequestBody WeChatLoginBody weChatLoginBody) { + WeChatLoginResult weChatLoginResult = weChatService.miniLogin(weChatLoginBody); + return AjaxResult.success(weChatLoginResult); + } + + /** + * 小程序、移动应用微信绑定 + * @param wxBindReqVO 微信绑定传参类型 + * @return 结果 + */ + @ApiOperation("小程序、移动应用微信绑定") + @PostMapping("/bind") + public AjaxResult bind(@RequestBody WxBindReqVO wxBindReqVO) { + if (StringUtils.isEmpty(wxBindReqVO.getSourceClient())) { + throw new ServiceException("请传入验证方式"); + } + return weChatService.bind(wxBindReqVO); + } + + /** + * 取消所有微信绑定 + * @param wxCancelBindReqVO 微信解绑传参类型 + * @return 结果 + */ + @ApiOperation("取消所有微信绑定") + @PostMapping("/cancelBind") + public AjaxResult cancelBind(@RequestBody WxCancelBindReqVO wxCancelBindReqVO) { + if (wxCancelBindReqVO.getVerifyType() == null) { + throw new ServiceException("请传入验证方式"); + } + return weChatService.cancelBind(wxCancelBindReqVO); + } + + /** + * 网站应用获取微信绑定二维码信息 + * @return 二维码信息 + */ + @ApiOperation("网站应用获取微信绑定二维码信息") + @GetMapping("/getWxBindQr") + public AjaxResult getWxBindQr(HttpServletRequest httpServletRequest) { + // 返回二维码信息 + return weChatService.getWxBindQr(httpServletRequest); + } + + /** + * 网站应用内微信扫码绑定回调接口 + * @param code 用户凭证 + * @param state 时间戳 + * @param httpServletRequest 请求信息 + * @param httpServletResponse 响应信息 + */ + @ApiOperation("网站应用内微信扫码绑定回调地址") + @GetMapping("/wxBind/callback") + public void wxBindCallback(String code, String state, String wxBindId, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { + //回调接口 + httpServletResponse.sendRedirect(weChatService.wxBindCallback(code, state, wxBindId, httpServletRequest, httpServletResponse)); + } + + /** + * 网站应用获取微信绑定结果信息 + * @param wxBindMsgId 微信绑定结果信息id + * @return msg + */ + @ApiOperation("网站应用获取微信绑定结果信息") + @GetMapping("/getWxBindMsg") + public AjaxResult getWxBindMsg(String wxBindMsgId) { + if (StringUtils.isEmpty(wxBindMsgId)) { + return AjaxResult.error("请传入wxBindMsgId"); + } + // 返回二维码信息 + return weChatService.getWxBindMsg(wxBindMsgId); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/AbstractQuartzJob.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/AbstractQuartzJob.java new file mode 100644 index 00000000..65763689 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/AbstractQuartzJob.java @@ -0,0 +1,108 @@ +package com.fastbee.data.quartz; + +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.utils.ExceptionUtil; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.bean.BeanUtils; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.iot.domain.DeviceJob; +import com.fastbee.quartz.domain.SysJobLog; +import com.fastbee.quartz.service.ISysJobLogService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; + +/** + * 抽象quartz调用 + * + * @author ruoyi + */ +public abstract class AbstractQuartzJob implements Job +{ + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException + { + DeviceJob deviceJob = new DeviceJob(); + BeanUtils.copyBeanProp(deviceJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + try + { + before(context, deviceJob); + if (deviceJob != null) + { + doExecute(context, deviceJob); + } + after(context, deviceJob, null); + } + catch (Exception e) + { + log.error("任务执行异常 - :", e); + after(context, deviceJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param deviceJob 系统计划任务 + */ + protected void before(JobExecutionContext context, DeviceJob deviceJob) + { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param deviceJob 系统计划任务 + */ + protected void after(JobExecutionContext context, DeviceJob deviceJob, Exception e) + { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(deviceJob.getJobName()); + sysJobLog.setJobGroup(deviceJob.getJobGroup()); + sysJobLog.setInvokeTarget(deviceJob.getDeviceName()); + sysJobLog.setStartTime(startTime); + sysJobLog.setStopTime(new Date()); + long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) + { + sysJobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } + else + { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param deviceJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, DeviceJob deviceJob) throws Exception; +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/CronUtils.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/CronUtils.java new file mode 100644 index 00000000..0fe80a16 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/CronUtils.java @@ -0,0 +1,64 @@ +package com.fastbee.data.quartz; + +import org.quartz.CronExpression; + +import java.text.ParseException; +import java.util.Date; + +/** + * cron表达式工具类 + * + * @author ruoyi + * + */ +public class CronUtils +{ + /** + * 返回一个布尔值代表一个给定的Cron表达式的有效性 + * + * @param cronExpression Cron表达式 + * @return boolean 表达式是否有效 + */ + public static boolean isValid(String cronExpression) + { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/JobInvokeUtil.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/JobInvokeUtil.java new file mode 100644 index 00000000..be53c89b --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/JobInvokeUtil.java @@ -0,0 +1,77 @@ +package com.fastbee.data.quartz; + +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.iot.domain.DeviceJob; +import com.fastbee.iot.model.Action; +import com.fastbee.mq.service.IMqttMessagePublish; + +import java.util.ArrayList; +import java.util.List; + +/** + * 任务执行工具 + * + * @author kerwincui + */ +public class JobInvokeUtil { + + /**获取消息推送接口*/ + private static IMqttMessagePublish messagePublish = SpringUtils.getBean(IMqttMessagePublish.class); + + + /** + * 执行方法 + * + * @param deviceJob 系统任务 + */ + public static void invokeMethod(DeviceJob deviceJob) throws Exception { + if (deviceJob.getJobType() == 1) { + System.out.println("------------------------执行定时任务-----------------------------"); + List actions = JSON.parseArray(deviceJob.getActions(), Action.class); + List propertys = new ArrayList<>(); + List functions = new ArrayList<>(); + for (int i = 0; i < actions.size(); i++) { + ThingsModelSimpleItem model = new ThingsModelSimpleItem(); + model.setId(actions.get(i).getId()); + model.setValue(actions.get(i).getValue()); + model.setRemark("设备定时"); + if (actions.get(i).getType() == 1) { + propertys.add(model); + } else if (actions.get(i).getType() == 2) { + functions.add(model); + } + } + // 发布属性 + if (propertys.size() > 0) { + messagePublish.publishProperty(deviceJob.getProductId(), deviceJob.getSerialNumber(), propertys, 0); + } + // 发布功能 + if (functions.size() > 0) { + messagePublish.publishFunction(deviceJob.getProductId(), deviceJob.getSerialNumber(), functions, 0); + } + + } else if (deviceJob.getJobType() == 2) { + + } else if (deviceJob.getJobType() == 3) { + System.out.println("------------------------定时执行场景联动-----------------------------"); + List actions = JSON.parseArray(deviceJob.getActions(), Action.class); + for (int i = 0; i < actions.size(); i++) { + ThingsModelSimpleItem model = new ThingsModelSimpleItem(); + model.setId(actions.get(i).getId()); + model.setValue(actions.get(i).getValue()); + model.setRemark("场景联动定时触发"); + if (actions.get(i).getType() == 1) { + List propertys = new ArrayList<>(); + propertys.add(model); + messagePublish.publishProperty(actions.get(i).getProductId(), actions.get(i).getSerialNumber(), propertys, 0); + } else if (actions.get(i).getType() == 2) { + List functions = new ArrayList<>(); + functions.add(model); + messagePublish.publishFunction(actions.get(i).getProductId(), actions.get(i).getSerialNumber(), functions, 0); + } + } + } + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzDisallowConcurrentExecution.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzDisallowConcurrentExecution.java new file mode 100644 index 00000000..d284aa94 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,21 @@ +package com.fastbee.data.quartz; + +import com.fastbee.iot.domain.DeviceJob; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; + +/** + * 定时任务处理(禁止并发执行) + * + * @author ruoyi + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, DeviceJob deviceJob) throws Exception + { + JobInvokeUtil.invokeMethod(deviceJob); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzJobExecution.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzJobExecution.java new file mode 100644 index 00000000..69086a33 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/QuartzJobExecution.java @@ -0,0 +1,19 @@ +package com.fastbee.data.quartz; + +import com.fastbee.iot.domain.DeviceJob; +import org.quartz.JobExecutionContext; + +/** + * 定时任务处理(允许并发执行) + * + * @author ruoyi + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, DeviceJob deviceJob) throws Exception + { + JobInvokeUtil.invokeMethod(deviceJob); + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/ScheduleUtils.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/ScheduleUtils.java new file mode 100644 index 00000000..00b47e8f --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/quartz/ScheduleUtils.java @@ -0,0 +1,105 @@ +package com.fastbee.data.quartz; + +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.common.exception.job.TaskException.Code; +import com.fastbee.iot.domain.DeviceJob; +import org.quartz.*; + +/** + * 定时任务工具类 + * + * @author ruoyi + * + */ +public class ScheduleUtils +{ + /** + * 得到quartz任务类 + * + * @param deviceJob 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(DeviceJob deviceJob) + { + boolean isConcurrent = "0".equals(deviceJob.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, DeviceJob job) throws SchedulerException, TaskException + { + Class jobClass = getQuartzJobClass(job); + // 1.创建任务 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 2.创建触发器, 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + // 3.任务和触发器添加到调度器 + scheduler.scheduleJob(jobDetail, trigger); + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(DeviceJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + } + } +} diff --git a/springboot/fastbee-open-api/src/main/java/com/fastbee/data/service/impl/DeviceJobServiceImpl.java b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/service/impl/DeviceJobServiceImpl.java new file mode 100644 index 00000000..227b0183 --- /dev/null +++ b/springboot/fastbee-open-api/src/main/java/com/fastbee/data/service/impl/DeviceJobServiceImpl.java @@ -0,0 +1,334 @@ +package com.fastbee.data.service.impl; + +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.iot.domain.DeviceJob; +import com.fastbee.iot.mapper.DeviceJobMapper; +import com.fastbee.iot.service.IDeviceJobService; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.iot.service.cache.IDeviceCache; +import com.fastbee.data.quartz.CronUtils; +import com.fastbee.data.quartz.ScheduleUtils; +import com.fastbee.quartz.domain.SysJob; +import com.fastbee.quartz.mapper.SysJobMapper; +import lombok.extern.slf4j.Slf4j; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; + +/** + * 定时任务调度信息 服务层 + * + * @author kerwincui + */ +@Service +@Slf4j +public class DeviceJobServiceImpl implements IDeviceJobService +{ + @Autowired + private Scheduler scheduler; + + @Autowired + private DeviceJobMapper jobMapper; + + @Autowired + private SysJobMapper sysJobMapper; + + + /** + * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) + */ + @PostConstruct + public void init() throws SchedulerException, TaskException + { + scheduler.clear(); + // 设备定时任务 + List jobList = jobMapper.selectJobAll(); + for (DeviceJob deviceJob : jobList) + { + ScheduleUtils.createScheduleJob(scheduler, deviceJob); + } + + // 系统定时任务 + List sysJobList = sysJobMapper.selectJobAll(); + for (SysJob job : sysJobList) + { + com.fastbee.quartz.util.ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 获取quartz调度器的计划任务列表 + * + * @param job 调度信息 + * @return + */ + @Override + public List selectJobList(DeviceJob job) + { + return jobMapper.selectJobList(job); + } + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + @Override + public DeviceJob selectJobById(Long jobId) + { + return jobMapper.selectJobById(jobId); + } + + /** + * 暂停任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int pauseJob(DeviceJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(DeviceJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(DeviceJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) + { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Long[] jobIds) throws SchedulerException + { + for (Long jobId : jobIds) + { + DeviceJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 根据设备Ids批量删除调度信息 + * + * @param deviceIds 需要删除数据的设备Ids + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByDeviceIds(Long[] deviceIds) throws SchedulerException + { + // 查出所有job + List deviceJobs=jobMapper.selectShortJobListByDeviceIds(deviceIds); + // 批量删除job + int rows=jobMapper.deleteJobByDeviceIds(deviceIds); + // 批量删除调度器 + for(DeviceJob job:deviceJobs){ + scheduler.deleteJob(ScheduleUtils.getJobKey(job.getJobId(), job.getJobGroup())); + } + } + + /** + * 根据告警Ids批量删除调度信息 + * + * @param alertIds 需要删除数据的告警Ids + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByAlertIds(Long[] alertIds) throws SchedulerException + { + // 查出所有job + List deviceJobs=jobMapper.selectShortJobListByAlertIds(alertIds); + // 批量删除job + int rows=jobMapper.deleteJobByAlertIds(alertIds); + // 批量删除调度器 + for(DeviceJob job:deviceJobs){ + scheduler.deleteJob(ScheduleUtils.getJobKey(job.getJobId(), job.getJobGroup())); + } + } + + /** + * 根据场景联动Ids批量删除调度信息 + * + * @param sceneIds 需要删除数据的场景Ids + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobBySceneIds(Long[] sceneIds) throws SchedulerException + { + // 查出所有job + List deviceJobs=jobMapper.selectShortJobListBySceneIds(sceneIds); + // 批量删除job + int rows=jobMapper.deleteJobBySceneIds(sceneIds); + // 批量删除调度器 + for(DeviceJob job:deviceJobs){ + scheduler.deleteJob(ScheduleUtils.getJobKey(job.getJobId(), job.getJobGroup())); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(DeviceJob job) throws SchedulerException + { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) + { + rows = resumeJob(job); + } + else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) + { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void run(DeviceJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + DeviceJob properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap); + } + + /** + * 新增任务 + * + * @param deviceJob 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(DeviceJob deviceJob) throws SchedulerException, TaskException + { + int rows = jobMapper.insertJob(deviceJob); + if (rows > 0) + { + ScheduleUtils.createScheduleJob(scheduler, deviceJob); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param deviceJob 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(DeviceJob deviceJob) throws SchedulerException, TaskException + { + DeviceJob properties = selectJobById(deviceJob.getJobId()); + int rows = jobMapper.updateJob(deviceJob); + if (rows > 0) + { + updateSchedulerJob(deviceJob, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param deviceJob 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(DeviceJob deviceJob, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = deviceJob.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, deviceJob); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) + { + return CronUtils.isValid(cronExpression); + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/pom.xml b/springboot/fastbee-plugs/fastbee-generator/pom.xml new file mode 100644 index 00000000..4242b221 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/pom.xml @@ -0,0 +1,39 @@ + + + + fastbee-plugs + com.fastbee + 3.8.5 + + 4.0.0 + + fastbee-generator + + + generator代码生成 + + + + + + + org.apache.velocity + velocity-engine-core + + + + + commons-collections + commons-collections + + + + + com.fastbee + fastbee-common + + + + + \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/config/GenConfig.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/config/GenConfig.java new file mode 100644 index 00000000..e8f2fedc --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/config/GenConfig.java @@ -0,0 +1,73 @@ +package com.fastbee.generator.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = { "classpath:generator.yml" }) +public class GenConfig +{ + /** 作者 */ + public static String author; + + /** 生成包路径 */ + public static String packageName; + + /** 自动去除表前缀,默认是false */ + public static boolean autoRemovePre; + + /** 表前缀(类名不会包含表前缀) */ + public static String tablePrefix; + + public static String getAuthor() + { + return author; + } + + @Value("${author}") + public void setAuthor(String author) + { + GenConfig.author = author; + } + + public static String getPackageName() + { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) + { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() + { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) + { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() + { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) + { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/controller/GenController.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/controller/GenController.java new file mode 100644 index 00000000..c30a3ebf --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/controller/GenController.java @@ -0,0 +1,230 @@ +package com.fastbee.generator.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.core.text.Convert; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.generator.domain.GenTable; +import com.fastbee.generator.domain.GenTableColumn; +import com.fastbee.generator.service.IGenTableColumnService; +import com.fastbee.generator.service.IGenTableService; + +/** + * 代码生成 操作处理 + * + * @author ruoyi + */ +@Api(tags = "代码生成模块") +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController +{ + @Autowired + private IGenTableService genTableService; + + @Autowired + private IGenTableColumnService genTableColumnService; + + /** + * 查询代码生成列表 + */ + @ApiOperation("查询代码生成列表") + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable) + { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 修改代码生成业务 + */ + @ApiOperation("修改代码生成业务") + @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @GetMapping(value = "/{tableId}") + public AjaxResult getInfo(@PathVariable Long tableId) + { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return success(map); + } + + /** + * 查询数据库列表 + */ + @ApiOperation("查询数据库列表") + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable) + { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 查询数据表字段列表 + */ + @ApiOperation("查询数据表字段列表") + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(Long tableId) + { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + */ + @ApiOperation("导入表结构") + @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) + { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return success(); + } + + /** + * 修改保存代码生成业务 + */ + @ApiOperation("修改保存代码生成业务") + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) + { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return success(); + } + + /** + * 删除代码生成 + */ + @ApiOperation("删除代码生成") + @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) + { + genTableService.deleteGenTableByIds(tableIds); + return success(); + } + + /** + * 预览代码 + */ + @ApiOperation("预览代码") + @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException + { + Map dataMap = genTableService.previewCode(tableId); + return success(dataMap); + } + + /** + * 生成代码(下载方式) + */ + @ApiOperation("生成代码(下载方式)") + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException + { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + */ + @ApiOperation("生成代码(自定义路径)") + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) + { + genTableService.generatorCode(tableName); + return success(); + } + + /** + * 同步数据库 + */ + @ApiOperation("同步数据库") + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) + { + genTableService.synchDb(tableName); + return success(); + } + + /** + * 批量生成代码 + */ + @ApiOperation("批量生成代码") + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException + { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException + { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"fastbee.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTable.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTable.java new file mode 100644 index 00000000..8048c173 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTable.java @@ -0,0 +1,399 @@ +package com.fastbee.generator.domain; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.ArrayUtils; +import com.fastbee.common.constant.GenConstants; +import com.fastbee.common.core.domain.BaseEntity; +import com.fastbee.common.utils.StringUtils; + +/** + * 业务表 gen_table + * + * @author ruoyi + */ +@ApiModel(value = "GenTable", description = "业务表 gen_table") +public class GenTable extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 编号 */ + @ApiModelProperty("编号") + private Long tableId; + + /** 表名称 */ + @ApiModelProperty(value = "表名称", required = true) + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** 表描述 */ + @ApiModelProperty(value = "表描述", required = true) + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** 关联父表的表名 */ + @ApiModelProperty("关联父表的表名") + private String subTableName; + + /** 本表关联父表的外键名 */ + @ApiModelProperty("本表关联父表的外键名") + private String subTableFkName; + + /** 实体类名称(首字母大写) */ + @ApiModelProperty(value = "实体类名称(首字母大写)", required = true) + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** 使用的模板(crud单表操作 tree树表操作 sub主子表操作) */ + @ApiModelProperty(value = "使用的模板", notes = "(crud单表操作 tree树表操作 sub主子表操作)") + private String tplCategory; + + /** 生成包路径 */ + @ApiModelProperty(value = "生成包路径", required = true) + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** 生成模块名 */ + @ApiModelProperty(value = "生成模块名", required = true) + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** 生成业务名 */ + @ApiModelProperty(value = "生成业务名", required = true) + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** 生成功能名 */ + @ApiModelProperty(value = "生成功能名", required = true) + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** 生成作者 */ + @ApiModelProperty(value = "生成作者", required = true) + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** 生成代码方式(0zip压缩包 1自定义路径) */ + @ApiModelProperty(value = "生成代码方式", notes = "(0zip压缩包 1自定义路径)") + private String genType; + + /** 生成路径(不填默认项目路径) */ + @ApiModelProperty("生成路径") + private String genPath; + + /** 主键信息 */ + @ApiModelProperty("主键信息") + private GenTableColumn pkColumn; + + /** 子表信息 */ + @ApiModelProperty("子表信息") + private GenTable subTable; + + /** 表列信息 */ + @ApiModelProperty("表列信息") + @Valid + private List columns; + + /** 其它生成选项 */ + @ApiModelProperty("其它生成选项") + private String options; + + /** 树编码字段 */ + @ApiModelProperty("树编码字段") + private String treeCode; + + /** 树父编码字段 */ + @ApiModelProperty("树父编码字段") + private String treeParentCode; + + /** 树名称字段 */ + @ApiModelProperty("树名称字段") + private String treeName; + + /** 上级菜单ID字段 */ + @ApiModelProperty("上级菜单ID字段") + private String parentMenuId; + + /** 上级菜单名称字段 */ + @ApiModelProperty("上级菜单名称字段") + private String parentMenuName; + + public Long getTableId() + { + return tableId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public String getTableName() + { + return tableName; + } + + public void setTableName(String tableName) + { + this.tableName = tableName; + } + + public String getTableComment() + { + return tableComment; + } + + public void setTableComment(String tableComment) + { + this.tableComment = tableComment; + } + + public String getSubTableName() + { + return subTableName; + } + + public void setSubTableName(String subTableName) + { + this.subTableName = subTableName; + } + + public String getSubTableFkName() + { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) + { + this.subTableFkName = subTableFkName; + } + + public String getClassName() + { + return className; + } + + public void setClassName(String className) + { + this.className = className; + } + + public String getTplCategory() + { + return tplCategory; + } + + public void setTplCategory(String tplCategory) + { + this.tplCategory = tplCategory; + } + + public String getPackageName() + { + return packageName; + } + + public void setPackageName(String packageName) + { + this.packageName = packageName; + } + + public String getModuleName() + { + return moduleName; + } + + public void setModuleName(String moduleName) + { + this.moduleName = moduleName; + } + + public String getBusinessName() + { + return businessName; + } + + public void setBusinessName(String businessName) + { + this.businessName = businessName; + } + + public String getFunctionName() + { + return functionName; + } + + public void setFunctionName(String functionName) + { + this.functionName = functionName; + } + + public String getFunctionAuthor() + { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) + { + this.functionAuthor = functionAuthor; + } + + public String getGenType() + { + return genType; + } + + public void setGenType(String genType) + { + this.genType = genType; + } + + public String getGenPath() + { + return genPath; + } + + public void setGenPath(String genPath) + { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() + { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) + { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() + { + return subTable; + } + + public void setSubTable(GenTable subTable) + { + this.subTable = subTable; + } + + public List getColumns() + { + return columns; + } + + public void setColumns(List columns) + { + this.columns = columns; + } + + public String getOptions() + { + return options; + } + + public void setOptions(String options) + { + this.options = options; + } + + public String getTreeCode() + { + return treeCode; + } + + public void setTreeCode(String treeCode) + { + this.treeCode = treeCode; + } + + public String getTreeParentCode() + { + return treeParentCode; + } + + public void setTreeParentCode(String treeParentCode) + { + this.treeParentCode = treeParentCode; + } + + public String getTreeName() + { + return treeName; + } + + public void setTreeName(String treeName) + { + this.treeName = treeName; + } + + public String getParentMenuId() + { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) + { + this.parentMenuId = parentMenuId; + } + + public String getParentMenuName() + { + return parentMenuName; + } + + public void setParentMenuName(String parentMenuName) + { + this.parentMenuName = parentMenuName; + } + + public boolean isSub() + { + return isSub(this.tplCategory); + } + + public static boolean isSub(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + + public boolean isTree() + { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() + { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) + { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) + { + if (isTree(tplCategory)) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTableColumn.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTableColumn.java new file mode 100644 index 00000000..654bd2eb --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/domain/GenTableColumn.java @@ -0,0 +1,394 @@ +package com.fastbee.generator.domain; + +import javax.validation.constraints.NotBlank; +import com.fastbee.common.core.domain.BaseEntity; +import com.fastbee.common.utils.StringUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author ruoyi + */ +@ApiModel(value = "GenTableColumn", description = "代码生成业务字段表 gen_table_column") +public class GenTableColumn extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 编号 */ + @ApiModelProperty("编号") + private Long columnId; + + /** 归属表编号 */ + @ApiModelProperty("归属表编号") + private Long tableId; + + /** 列名称 */ + @ApiModelProperty("列名称") + private String columnName; + + /** 列描述 */ + @ApiModelProperty("列描述") + private String columnComment; + + /** 列类型 */ + @ApiModelProperty("列类型") + private String columnType; + + /** JAVA类型 */ + @ApiModelProperty("JAVA类型") + private String javaType; + + /** JAVA字段名 */ + @ApiModelProperty(value = "JAVA字段名", required = true) + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** 是否主键(1是) */ + @ApiModelProperty("是否主键(1是)") + private String isPk; + + /** 是否自增(1是) */ + @ApiModelProperty("是否自增(1是)") + private String isIncrement; + + /** 是否必填(1是) */ + @ApiModelProperty("是否必填(1是)") + private String isRequired; + + /** 是否为插入字段(1是) */ + @ApiModelProperty("是否为插入字段(1是)") + private String isInsert; + + /** 是否编辑字段(1是) */ + @ApiModelProperty("是否编辑字段(1是)") + private String isEdit; + + /** 是否列表字段(1是) */ + @ApiModelProperty("是否列表字段(1是)") + private String isList; + + /** 是否查询字段(1是) */ + @ApiModelProperty("是否查询字段(1是)") + private String isQuery; + + /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */ + @ApiModelProperty(value = "查询方式", notes = "(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围)") + private String queryType; + + /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */ + @ApiModelProperty(value = "显示类型", notes = "(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件)") + private String htmlType; + + /** 字典类型 */ + @ApiModelProperty("字典类型") + private String dictType; + + /** 排序 */ + @ApiModelProperty("排序") + private Integer sort; + + public void setColumnId(Long columnId) + { + this.columnId = columnId; + } + + public Long getColumnId() + { + return columnId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public Long getTableId() + { + return tableId; + } + + public void setColumnName(String columnName) + { + this.columnName = columnName; + } + + public String getColumnName() + { + return columnName; + } + + public void setColumnComment(String columnComment) + { + this.columnComment = columnComment; + } + + public String getColumnComment() + { + return columnComment; + } + + public void setColumnType(String columnType) + { + this.columnType = columnType; + } + + public String getColumnType() + { + return columnType; + } + + public void setJavaType(String javaType) + { + this.javaType = javaType; + } + + public String getJavaType() + { + return javaType; + } + + public void setJavaField(String javaField) + { + this.javaField = javaField; + } + + public String getJavaField() + { + return javaField; + } + + public String getCapJavaField() + { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) + { + this.isPk = isPk; + } + + public String getIsPk() + { + return isPk; + } + + public boolean isPk() + { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) + { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() + { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) + { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() + { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) + { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) + { + this.isRequired = isRequired; + } + + public String getIsRequired() + { + return isRequired; + } + + public boolean isRequired() + { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) + { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) + { + this.isInsert = isInsert; + } + + public String getIsInsert() + { + return isInsert; + } + + public boolean isInsert() + { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) + { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) + { + this.isEdit = isEdit; + } + + public String getIsEdit() + { + return isEdit; + } + + public boolean isEdit() + { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) + { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) + { + this.isList = isList; + } + + public String getIsList() + { + return isList; + } + + public boolean isList() + { + return isList(this.isList); + } + + public boolean isList(String isList) + { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) + { + this.isQuery = isQuery; + } + + public String getIsQuery() + { + return isQuery; + } + + public boolean isQuery() + { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) + { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) + { + this.queryType = queryType; + } + + public String getQueryType() + { + return queryType; + } + + public String getHtmlType() + { + return htmlType; + } + + public void setHtmlType(String htmlType) + { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getDictType() + { + return dictType; + } + + public void setSort(Integer sort) + { + this.sort = sort; + } + + public Integer getSort() + { + return sort; + } + + public boolean isSuperColumn() + { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() + { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) + { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() + { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) + { + for (String value : remarks.split(" ")) + { + if (StringUtils.isNotEmpty(value)) + { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } + else + { + return this.columnComment; + } + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableColumnMapper.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 00000000..a4a5cce0 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,60 @@ +package com.fastbee.generator.mapper; + +import java.util.List; +import com.fastbee.generator.domain.GenTableColumn; + +/** + * 业务字段 数据层 + * + * @author ruoyi + */ +public interface GenTableColumnMapper +{ + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @return 列信息 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段 + * + * @param genTableColumns 列数据 + * @return 结果 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 批量删除业务字段 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableMapper.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableMapper.java new file mode 100644 index 00000000..21ba4c8e --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/mapper/GenTableMapper.java @@ -0,0 +1,83 @@ +package com.fastbee.generator.mapper; + +import java.util.List; +import com.fastbee.generator.domain.GenTable; + +/** + * 业务 数据层 + * + * @author ruoyi + */ +public interface GenTableMapper +{ + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 新增业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int insertGenTable(GenTable genTable); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int updateGenTable(GenTable genTable); + + /** + * 批量删除业务 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableByIds(Long[] ids); +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableColumnServiceImpl.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableColumnServiceImpl.java new file mode 100644 index 00000000..086e7a76 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableColumnServiceImpl.java @@ -0,0 +1,68 @@ +package com.fastbee.generator.service; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fastbee.common.core.text.Convert; +import com.fastbee.generator.domain.GenTableColumn; +import com.fastbee.generator.mapper.GenTableColumnMapper; + +/** + * 业务字段 服务层实现 + * + * @author ruoyi + */ +@Service +public class GenTableColumnServiceImpl implements IGenTableColumnService +{ + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) + { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** + * 删除业务字段对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteGenTableColumnByIds(String ids) + { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableServiceImpl.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableServiceImpl.java new file mode 100644 index 00000000..269067fc --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/GenTableServiceImpl.java @@ -0,0 +1,521 @@ +package com.fastbee.generator.service; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.GenConstants; +import com.fastbee.common.core.text.CharsetKit; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.generator.domain.GenTable; +import com.fastbee.generator.domain.GenTableColumn; +import com.fastbee.generator.mapper.GenTableColumnMapper; +import com.fastbee.generator.mapper.GenTableMapper; +import com.fastbee.generator.util.GenUtils; +import com.fastbee.generator.util.VelocityInitializer; +import com.fastbee.generator.util.VelocityUtils; + +/** + * 业务 服务层实现 + * + * @author ruoyi + */ +@Service +public class GenTableServiceImpl implements IGenTableService +{ + private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Autowired + private GenTableMapper genTableMapper; + + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) + { + GenTable genTable = genTableMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + @Override + public List selectGenTableList(GenTable genTable) + { + return genTableMapper.selectGenTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + @Override + public List selectDbTableList(GenTable genTable) + { + return genTableMapper.selectDbTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) + { + return genTableMapper.selectDbTableListByNames(tableNames); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() + { + return genTableMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + @Override + @Transactional + public void updateGenTable(GenTable genTable) + { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableMapper.updateGenTable(genTable); + if (row > 0) + { + for (GenTableColumn cenTableColumn : genTable.getColumns()) + { + genTableColumnMapper.updateGenTableColumn(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) + { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + @Override + @Transactional + public void importGenTable(List tableList) + { + String operName = SecurityUtils.getUsername(); + try + { + for (GenTable table : tableList) + { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableMapper.insertGenTable(table); + if (row > 0) + { + // 保存列信息 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) + { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + } + } + } + catch (Exception e) + { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) + { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = genTableMapper.selectGenTableById(tableId); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(String tableName) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + */ + @Override + public void generatorCode(String tableName) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } + catch (IOException e) + { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + @Override + @Transactional + public void synchDb(String tableName) + { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) + { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) + { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) + { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) + { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + genTableColumnMapper.updateGenTableColumn(column); + } + else + { + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) + { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) + { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(String tableName, ZipOutputStream zip) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } + catch (IOException e) + { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) + { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) + { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSON.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) + { + throw new ServiceException("树编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) + { + throw new ServiceException("树父编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) + { + throw new ServiceException("树名称字段不能为空"); + } + else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) + { + if (StringUtils.isEmpty(genTable.getSubTableName())) + { + throw new ServiceException("关联子表的表名不能为空"); + } + else if (StringUtils.isEmpty(genTable.getSubTableFkName())) + { + throw new ServiceException("子表关联的外键名不能为空"); + } + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) + { + for (GenTableColumn column : table.getColumns()) + { + if (column.isPk()) + { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) + { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) + { + for (GenTableColumn column : table.getSubTable().getColumns()) + { + if (column.isPk()) + { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) + { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 设置主子表信息 + * + * @param table 业务表信息 + */ + public void setSubTable(GenTable table) + { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) + { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) + { + JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) + { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableColumnService.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableColumnService.java new file mode 100644 index 00000000..e2cd041b --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableColumnService.java @@ -0,0 +1,44 @@ +package com.fastbee.generator.service; + +import java.util.List; +import com.fastbee.generator.domain.GenTableColumn; + +/** + * 业务字段 服务层 + * + * @author ruoyi + */ +public interface IGenTableColumnService +{ + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(String ids); +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableService.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableService.java new file mode 100644 index 00000000..d03dba4d --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/service/IGenTableService.java @@ -0,0 +1,121 @@ +package com.fastbee.generator.service; + +import java.util.List; +import java.util.Map; +import com.fastbee.generator.domain.GenTable; + +/** + * 业务 服务层 + * + * @author ruoyi + */ +public interface IGenTableService +{ + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + * @return 结果 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + public void importGenTable(List tableList); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + public Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + public byte[] downloadCode(String tableName); + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return 数据 + */ + public void generatorCode(String tableName); + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + public void synchDb(String tableName); + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + public void validateEdit(GenTable genTable); +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/GenUtils.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/GenUtils.java new file mode 100644 index 00000000..59584d41 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/GenUtils.java @@ -0,0 +1,257 @@ +package com.fastbee.generator.util; + +import java.util.Arrays; +import org.apache.commons.lang3.RegExUtils; +import com.fastbee.common.constant.GenConstants; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.generator.config.GenConfig; +import com.fastbee.generator.domain.GenTable; +import com.fastbee.generator.domain.GenTableColumn; + +/** + * 代码生成器 工具类 + * + * @author ruoyi + */ +public class GenUtils +{ + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, String operName) + { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) + { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + return StringUtils.substring(tableName, lastIndex + 1, nameLength); + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) + { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityInitializer.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityInitializer.java new file mode 100644 index 00000000..832d9734 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityInitializer.java @@ -0,0 +1,34 @@ +package com.fastbee.generator.util; + +import java.util.Properties; +import org.apache.velocity.app.Velocity; +import com.fastbee.common.constant.Constants; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +public class VelocityInitializer +{ + /** + * 初始化vm方法 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityUtils.java b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityUtils.java new file mode 100644 index 00000000..270c438e --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/java/com/fastbee/generator/util/VelocityUtils.java @@ -0,0 +1,402 @@ +package com.fastbee.generator.util; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.velocity.VelocityContext; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.constant.GenConstants; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.generator.domain.GenTable; +import com.fastbee.generator.domain.GenTableColumn; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +public class VelocityUtils +{ + /** 项目空间路径 */ + private static final String PROJECT_PATH = "main/java"; + + /** mybatis空间路径 */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** 默认上级菜单,系统工具 */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) + { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) + { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) + { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) + { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) + { + List templates = new ArrayList(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + templates.add("vm/sql/sql.vm"); + templates.add("vm/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + } + else if (GenConstants.TPL_TREE.equals(tplCategory)) + { + templates.add("vm/vue/index-tree.vue.vm"); + } + else if (GenConstants.TPL_SUB.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) + { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } + else if (template.contains("mapper.java.vm")) + { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } + else if (template.contains("service.java.vm")) + { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } + else if (template.contains("serviceImpl.java.vm")) + { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } + else if (template.contains("controller.java.vm")) + { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } + else if (template.contains("mapper.xml.vm")) + { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } + else if (template.contains("sql.vm")) + { + fileName = businessName + "Menu.sql"; + } + else if (template.contains("api.js.vm")) + { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } + else if (template.contains("index.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + else if (template.contains("index-tree.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) + { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) + { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) + { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } + else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) + { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) + { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + addDicts(dicts, columns); + if (StringUtils.isNotNull(genTable.getSubTable())) + { + List subColumns = genTable.getSubTable().getColumns(); + addDicts(dicts, subColumns); + } + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) + { + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) + { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) + { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) + { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) + { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) + { + if (column.isList()) + { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) + { + break; + } + } + } + return num; + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/generator.yml b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/generator.yml new file mode 100644 index 00000000..50e8a15f --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/generator.yml @@ -0,0 +1,10 @@ +# 代码生成 +gen: + # 作者 + author: kerwincui + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.fastbee.iot + # 自动去除表前缀,默认是false + autoRemovePre: true + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: iot_ \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 00000000..725a249d --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 00000000..14d523d5 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/controller.java.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 00000000..a5a9891f --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,115 @@ +package ${packageName}.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.fastbee.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.fastbee.common.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return success(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 删除${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/domain.java.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 00000000..517abcc9 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,105 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +#if($table.crud || $table.sub) +import com.fastbee.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.fastbee.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/mapper.java.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 00000000..7e7d7c26 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/service.java.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/service.java.vm new file mode 100644 index 00000000..264882b2 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,61 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/serviceImpl.java.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 00000000..1bcdadba --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,169 @@ +package ${packageName}.service.impl; + +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.fastbee.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.fastbee.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/sub-domain.java.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 00000000..5fe04c47 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/js/api.js.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/js/api.js.vm new file mode 100644 index 00000000..9295524a --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/sql/sql.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/sql/sql.vm new file mode 100644 index 00000000..05755835 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index-tree.vue.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 00000000..a4c64a09 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,505 @@ + + + diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index.vue.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 00000000..6296014b --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,602 @@ + + + diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 00000000..7bbd2fc5 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,474 @@ + + + diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index.vue.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 00000000..8b25665a --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,590 @@ + + + diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/readme.txt b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/readme.txt new file mode 100644 index 00000000..99239bb5 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +ʹõRuoYi-Vue3ǰˣôҪһ´Ŀ¼ģindex.vue.vmindex-tree.vue.vmļϼvueĿ¼ \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/xml/mapper.xml.vm b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 00000000..0ceb3d85 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,135 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-quartz/pom.xml b/springboot/fastbee-plugs/fastbee-quartz/pom.xml new file mode 100644 index 00000000..e45e24d9 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/pom.xml @@ -0,0 +1,40 @@ + + + + fastbee-plugs + com.fastbee + 3.8.5 + + 4.0.0 + + fastbee-quartz + + + quartz定时任务 + + + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + com.fastbee + fastbee-common + + + + + \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/config/ScheduleConfig.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/config/ScheduleConfig.java new file mode 100644 index 00000000..059eaba6 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/config/ScheduleConfig.java @@ -0,0 +1,57 @@ +//package com.fastbee.quartz.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.scheduling.quartz.SchedulerFactoryBean; +//import javax.sql.DataSource; +//import java.util.Properties; +// +///** +// * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) +// * +// * @author ruoyi +// */ +//@Configuration +//public class ScheduleConfig +//{ +// @Bean +// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) +// { +// SchedulerFactoryBean factory = new SchedulerFactoryBean(); +// factory.setDataSource(dataSource); +// +// // quartz参数 +// Properties prop = new Properties(); +// prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler"); +// prop.put("org.quartz.scheduler.instanceId", "AUTO"); +// // 线程池配置 +// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); +// prop.put("org.quartz.threadPool.threadCount", "20"); +// prop.put("org.quartz.threadPool.threadPriority", "5"); +// // JobStore配置 +// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); +// // 集群配置 +// prop.put("org.quartz.jobStore.isClustered", "true"); +// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); +// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); +// prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); +// +// // sqlserver 启用 +// // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); +// prop.put("org.quartz.jobStore.misfireThreshold", "12000"); +// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); +// factory.setQuartzProperties(prop); +// +// factory.setSchedulerName("RuoyiScheduler"); +// // 延时启动 +// factory.setStartupDelay(1); +// factory.setApplicationContextSchedulerContextKey("applicationContextKey"); +// // 可选,QuartzScheduler +// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 +// factory.setOverwriteExistingJobs(true); +// // 设置自动启动,默认为true +// factory.setAutoStartup(true); +// +// return factory; +// } +//} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobController.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobController.java new file mode 100644 index 00000000..f826c2a8 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobController.java @@ -0,0 +1,197 @@ +package com.fastbee.quartz.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.quartz.domain.SysJob; +import com.fastbee.quartz.service.ISysJobService; +import com.fastbee.quartz.util.CronUtils; +import com.fastbee.quartz.util.ScheduleUtils; + +/** + * 调度任务信息操作处理 + * + * @author ruoyi + */ +@Api(tags = "调度任务信息操作处理") +@RestController +@RequestMapping("/monitor/job") +public class SysJobController extends BaseController +{ + @Autowired + private ISysJobService jobService; + + /** + * 查询定时任务列表 + */ + @ApiOperation("查询定时任务列表") + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJob sysJob) + { + startPage(); + List list = jobService.selectJobList(sysJob); + return getDataTable(list); + } + + /** + * 导出定时任务列表 + */ + @ApiOperation("导出定时任务列表") + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "定时任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJob sysJob) + { + List list = jobService.selectJobList(sysJob); + ExcelUtil util = new ExcelUtil(SysJob.class); + util.exportExcel(response, list, "定时任务"); + } + + /** + * 获取定时任务详细信息 + */ + @ApiOperation("获取定时任务详细信息") + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) + { + return success(jobService.selectJobById(jobId)); + } + + /** + * 新增定时任务 + */ + @ApiOperation("新增定时任务") + @PreAuthorize("@ss.hasPermi('monitor:job:add')") + @Log(title = "定时任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setCreateBy(getUsername()); + return toAjax(jobService.insertJob(job)); + } + + /** + * 修改定时任务 + */ + @ApiOperation("修改定时任务") + @PreAuthorize("@ss.hasPermi('monitor:job:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setUpdateBy(getUsername()); + return toAjax(jobService.updateJob(job)); + } + + /** + * 定时任务状态修改 + */ + @ApiOperation("定时任务状态修改") + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException + { + SysJob newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toAjax(jobService.changeStatus(newJob)); + } + + /** + * 定时任务立即执行一次 + */ + @ApiOperation("定时任务立即执行一次") + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody SysJob job) throws SchedulerException + { + boolean result = jobService.run(job); + return result ? success() : error("任务不存在或已过期!"); + } + + /** + * 删除定时任务 + */ + @ApiOperation("删除定时任务") + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException + { + jobService.deleteJobByIds(jobIds); + return success(); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobLogController.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobLogController.java new file mode 100644 index 00000000..996de06f --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/controller/SysJobLogController.java @@ -0,0 +1,101 @@ +package com.fastbee.quartz.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.quartz.domain.SysJobLog; +import com.fastbee.quartz.service.ISysJobLogService; + +/** + * 调度日志操作处理 + * + * @author ruoyi + */ +@Api(tags = "调度日志操作处理") +@RestController +@RequestMapping("/monitor/jobLog") +public class SysJobLogController extends BaseController +{ + @Autowired + private ISysJobLogService jobLogService; + + /** + * 查询定时任务调度日志列表 + */ + @ApiOperation("查询定时任务调度日志列表") + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJobLog sysJobLog) + { + startPage(); + List list = jobLogService.selectJobLogList(sysJobLog); + return getDataTable(list); + } + + /** + * 导出定时任务调度日志列表 + */ + @ApiOperation("导出定时任务调度日志列表") + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "任务调度日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJobLog sysJobLog) + { + List list = jobLogService.selectJobLogList(sysJobLog); + ExcelUtil util = new ExcelUtil(SysJobLog.class); + util.exportExcel(response, list, "调度日志"); + } + + /** + * 根据调度编号获取详细信息 + */ + @ApiOperation("根据调度编号获取详细信息") + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobLogId}") + public AjaxResult getInfo(@PathVariable Long jobLogId) + { + return success(jobLogService.selectJobLogById(jobLogId)); + } + + + /** + * 删除定时任务调度日志 + */ + @ApiOperation("删除定时任务调度日志") + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobLogIds}") + public AjaxResult remove(@PathVariable Long[] jobLogIds) + { + return toAjax(jobLogService.deleteJobLogByIds(jobLogIds)); + } + + /** + * 清空定时任务调度日志 + */ + @ApiOperation("清空定时任务调度日志") + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "调度日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + jobLogService.cleanJobLog(); + return success(); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJob.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJob.java new file mode 100644 index 00000000..a0b3563e --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJob.java @@ -0,0 +1,183 @@ +package com.fastbee.quartz.domain; + +import java.util.Date; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.annotation.Excel.ColumnType; +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.core.domain.BaseEntity; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.quartz.util.CronUtils; + +/** + * 定时任务调度表 sys_job + * + * @author ruoyi + */ +@ApiModel(value = "SysJob", description = "定时任务调度表 sys_job") +public class SysJob extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @ApiModelProperty("任务ID") + @Excel(name = "任务序号", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** 任务名称 */ + @ApiModelProperty("任务名称") + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @ApiModelProperty("任务组名") + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @ApiModelProperty("调用目标字符串") + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** cron执行表达式 */ + @ApiModelProperty("cron执行表达式") + @Excel(name = "执行表达式 ") + private String cronExpression; + + /** cron计划策略 */ + @ApiModelProperty("cron计划策略") + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 是否并发执行(0允许 1禁止) */ + @ApiModelProperty("是否并发执行(0允许 1禁止)") + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + private String concurrent; + + /** 任务状态(0正常 1暂停) */ + @ApiModelProperty("任务状态(0正常 1暂停)") + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + private String status; + + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "调用目标字符串不能为空") + @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符") + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJobLog.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJobLog.java new file mode 100644 index 00000000..5839c59b --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/domain/SysJobLog.java @@ -0,0 +1,168 @@ +package com.fastbee.quartz.domain; + +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 定时任务调度日志表 sys_job_log + * + * @author ruoyi + */ +@ApiModel(value = "SysJobLog", description = "定时任务调度日志表 sys_job_log") +public class SysJobLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @ApiModelProperty("ID") + @Excel(name = "日志序号") + private Long jobLogId; + + /** 任务名称 */ + @ApiModelProperty("任务名称") + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @ApiModelProperty("任务组名") + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @ApiModelProperty("调用目标字符串") + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** 日志信息 */ + @ApiModelProperty("日志信息") + @Excel(name = "日志信息") + private String jobMessage; + + /** 执行状态(0正常 1失败) */ + @ApiModelProperty("执行状态(0正常 1失败)") + @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败") + private String status; + + /** 异常信息 */ + @ApiModelProperty("异常信息") + @Excel(name = "异常信息") + private String exceptionInfo; + + /** 开始时间 */ + @ApiModelProperty("开始时间") + private Date startTime; + + /** 停止时间 */ + @ApiModelProperty("停止时间") + private Date stopTime; + + public Long getJobLogId() + { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) + { + this.jobLogId = jobLogId; + } + + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() + { + return jobMessage; + } + + public void setJobMessage(String jobMessage) + { + this.jobMessage = jobMessage; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getExceptionInfo() + { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) + { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStopTime() + { + return stopTime; + } + + public void setStopTime(Date stopTime) + { + this.stopTime = stopTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("stopTime", getStopTime()) + .toString(); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobLogMapper.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobLogMapper.java new file mode 100644 index 00000000..716ed77b --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobLogMapper.java @@ -0,0 +1,64 @@ +package com.fastbee.quartz.mapper; + +import java.util.List; +import com.fastbee.quartz.domain.SysJobLog; + +/** + * 调度任务日志信息 数据层 + * + * @author ruoyi + */ +public interface SysJobLogMapper +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 查询所有调度任务日志 + * + * @return 调度任务日志列表 + */ + public List selectJobLogAll(); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + * @return 结果 + */ + public int insertJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobMapper.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobMapper.java new file mode 100644 index 00000000..47ce8fee --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/mapper/SysJobMapper.java @@ -0,0 +1,67 @@ +package com.fastbee.quartz.mapper; + +import java.util.List; +import com.fastbee.quartz.domain.SysJob; + +/** + * 调度任务信息 数据层 + * + * @author ruoyi + */ +public interface SysJobMapper +{ + /** + * 查询调度任务日志集合 + * + * @param job 调度信息 + * @return 操作日志集合 + */ + public List selectJobList(SysJob job); + + /** + * 查询所有调度任务 + * + * @return 调度任务列表 + */ + public List selectJobAll(); + + /** + * 通过调度ID查询调度任务信息 + * + * @param jobId 调度ID + * @return 角色对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 通过调度ID删除调度任务信息 + * + * @param jobId 调度ID + * @return 结果 + */ + public int deleteJobById(Long jobId); + + /** + * 批量删除调度任务信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 修改调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int updateJob(SysJob job); + + /** + * 新增调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int insertJob(SysJob job); +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobLogService.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobLogService.java new file mode 100644 index 00000000..f89c2c39 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobLogService.java @@ -0,0 +1,56 @@ +package com.fastbee.quartz.service; + +import java.util.List; +import com.fastbee.quartz.domain.SysJobLog; + +/** + * 定时任务调度日志信息信息 服务层 + * + * @author ruoyi + */ +public interface ISysJobLogService +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + public void addJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的日志ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobService.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobService.java new file mode 100644 index 00000000..f3c21485 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/ISysJobService.java @@ -0,0 +1,102 @@ +package com.fastbee.quartz.service; + +import java.util.List; +import org.quartz.SchedulerException; +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.quartz.domain.SysJob; + +/** + * 定时任务调度信息信息 服务层 + * + * @author ruoyi + */ +public interface ISysJobService +{ + /** + * 获取quartz调度器的计划任务 + * + * @param job 调度信息 + * @return 调度任务集合 + */ + public List selectJobList(SysJob job); + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 暂停任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int pauseJob(SysJob job) throws SchedulerException; + + /** + * 恢复任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int resumeJob(SysJob job) throws SchedulerException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(SysJob job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(SysJob job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public boolean run(SysJob job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobLogServiceImpl.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 00000000..7cd5883c --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,87 @@ +package com.fastbee.quartz.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fastbee.quartz.domain.SysJobLog; +import com.fastbee.quartz.mapper.SysJobLogMapper; +import com.fastbee.quartz.service.ISysJobLogService; + +/** + * 定时任务调度日志信息 服务层 + * + * @author ruoyi + */ +@Service +public class SysJobLogServiceImpl implements ISysJobLogService +{ + @Autowired + private SysJobLogMapper jobLogMapper; + + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + @Override + public List selectJobLogList(SysJobLog jobLog) + { + return jobLogMapper.selectJobLogList(jobLog); + } + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + @Override + public SysJobLog selectJobLogById(Long jobLogId) + { + return jobLogMapper.selectJobLogById(jobLogId); + } + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + @Override + public void addJobLog(SysJobLog jobLog) + { + jobLogMapper.insertJobLog(jobLog); + } + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteJobLogByIds(Long[] logIds) + { + return jobLogMapper.deleteJobLogByIds(logIds); + } + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + */ + @Override + public int deleteJobLogById(Long jobId) + { + return jobLogMapper.deleteJobLogById(jobId); + } + + /** + * 清空任务日志 + */ + @Override + public void cleanJobLog() + { + jobLogMapper.cleanJobLog(); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobServiceImpl.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobServiceImpl.java new file mode 100644 index 00000000..6514931c --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/service/impl/SysJobServiceImpl.java @@ -0,0 +1,261 @@ +package com.fastbee.quartz.service.impl; + +import java.util.List; +import javax.annotation.PostConstruct; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.quartz.domain.SysJob; +import com.fastbee.quartz.mapper.SysJobMapper; +import com.fastbee.quartz.service.ISysJobService; +import com.fastbee.quartz.util.CronUtils; +import com.fastbee.quartz.util.ScheduleUtils; + +/** + * 定时任务调度信息 服务层 + * + * @author ruoyi + */ +@Service +public class SysJobServiceImpl implements ISysJobService +{ + @Autowired + private Scheduler scheduler; + + @Autowired + private SysJobMapper jobMapper; + + /** + * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) + */ + // @PostConstruct + public void init() throws SchedulerException, TaskException + { + scheduler.clear(); + List jobList = jobMapper.selectJobAll(); + for (SysJob job : jobList) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 获取quartz调度器的计划任务列表 + * + * @param job 调度信息 + * @return + */ + @Override + public List selectJobList(SysJob job) + { + return jobMapper.selectJobList(job); + } + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + @Override + public SysJob selectJobById(Long jobId) + { + return jobMapper.selectJobById(jobId); + } + + /** + * 暂停任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int pauseJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) + { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Long[] jobIds) throws SchedulerException + { + for (Long jobId : jobIds) + { + SysJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(SysJob job) throws SchedulerException + { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) + { + rows = resumeJob(job); + } + else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) + { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean run(SysJob job) throws SchedulerException + { + boolean result = false; + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + SysJob properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + result = true; + scheduler.triggerJob(jobKey, dataMap); + } + return result; + } + + /** + * 新增任务 + * + * @param job 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(SysJob job) throws SchedulerException, TaskException + { + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(SysJob job) throws SchedulerException, TaskException + { + SysJob properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) + { + return CronUtils.isValid(cronExpression); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/task/RyTask.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/task/RyTask.java new file mode 100644 index 00000000..38e85c61 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/task/RyTask.java @@ -0,0 +1,28 @@ +package com.fastbee.quartz.task; + +import org.springframework.stereotype.Component; +import com.fastbee.common.utils.StringUtils; + +/** + * 定时任务调度测试 + * + * @author ruoyi + */ +@Component("ryTask") +public class RyTask +{ + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) + { + System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); + } + + public void ryParams(String params) + { + System.out.println("执行有参方法:" + params); + } + + public void ryNoParams() + { + System.out.println("执行无参方法"); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/AbstractQuartzJob.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/AbstractQuartzJob.java new file mode 100644 index 00000000..603c767d --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/AbstractQuartzJob.java @@ -0,0 +1,107 @@ +package com.fastbee.quartz.util; + +import java.util.Date; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.utils.ExceptionUtil; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.bean.BeanUtils; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.quartz.domain.SysJob; +import com.fastbee.quartz.domain.SysJobLog; +import com.fastbee.quartz.service.ISysJobLogService; + +/** + * 抽象quartz调用 + * + * @author ruoyi + */ +public abstract class AbstractQuartzJob implements Job +{ + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException + { + SysJob sysJob = new SysJob(); + BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + try + { + before(context, sysJob); + if (sysJob != null) + { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } + catch (Exception e) + { + log.error("任务执行异常 - :", e); + after(context, sysJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void before(JobExecutionContext context, SysJob sysJob) + { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) + { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); + sysJobLog.setStartTime(startTime); + sysJobLog.setStopTime(new Date()); + long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) + { + sysJobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } + else + { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/CronUtils.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/CronUtils.java new file mode 100644 index 00000000..3f2d424a --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/CronUtils.java @@ -0,0 +1,63 @@ +package com.fastbee.quartz.util; + +import java.text.ParseException; +import java.util.Date; +import org.quartz.CronExpression; + +/** + * cron表达式工具类 + * + * @author ruoyi + * + */ +public class CronUtils +{ + /** + * 返回一个布尔值代表一个给定的Cron表达式的有效性 + * + * @param cronExpression Cron表达式 + * @return boolean 表达式是否有效 + */ + public static boolean isValid(String cronExpression) + { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/JobInvokeUtil.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/JobInvokeUtil.java new file mode 100644 index 00000000..e824c455 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/JobInvokeUtil.java @@ -0,0 +1,182 @@ +package com.fastbee.quartz.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.quartz.domain.SysJob; + +/** + * 任务执行工具 + * + * @author ruoyi + */ +public class JobInvokeUtil +{ + /** + * 执行方法 + * + * @param sysJob 系统任务 + */ + public static void invokeMethod(SysJob sysJob) throws Exception + { + String invokeTarget = sysJob.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) + { + Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,以'或"开头 + if (StringUtils.startsWithAny(str, "'", "\"")) + { + classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); + } + // boolean布尔类型,等于true或者false + else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,以L结尾 + else if (StringUtils.endsWith(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); + } + // double浮点类型,以D结尾 + else if (StringUtils.endsWith(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); + } + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzDisallowConcurrentExecution.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 00000000..db4c1c6f --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,21 @@ +package com.fastbee.quartz.util; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import com.fastbee.quartz.domain.SysJob; + +/** + * 定时任务处理(禁止并发执行) + * + * @author ruoyi + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzJobExecution.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzJobExecution.java new file mode 100644 index 00000000..f17ea62a --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/QuartzJobExecution.java @@ -0,0 +1,19 @@ +package com.fastbee.quartz.util; + +import org.quartz.JobExecutionContext; +import com.fastbee.quartz.domain.SysJob; + +/** + * 定时任务处理(允许并发执行) + * + * @author ruoyi + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/ScheduleUtils.java b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/ScheduleUtils.java new file mode 100644 index 00000000..d7f8fb08 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/java/com/fastbee/quartz/util/ScheduleUtils.java @@ -0,0 +1,139 @@ +package com.fastbee.quartz.util; + +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.common.exception.job.TaskException.Code; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.quartz.domain.SysJob; + +/** + * 定时任务工具类 + * + * @author ruoyi + * + */ +public class ScheduleUtils +{ + /** + * 得到quartz任务类 + * + * @param sysJob 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(SysJob sysJob) + { + boolean isConcurrent = "0".equals(sysJob.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException + { + Class jobClass = getQuartzJobClass(job); + // 构建job信息 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + // 判断任务是否过期 + if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression()))) + { + // 执行调度任务 + scheduler.scheduleJob(jobDetail, trigger); + } + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + } + } + + /** + * 检查包名是否为白名单配置 + * + * @param invokeTarget 目标字符串 + * @return 结果 + */ + public static boolean whiteList(String invokeTarget) + { + String packageName = StringUtils.substringBefore(invokeTarget, "("); + int count = StringUtils.countMatches(packageName, "."); + if (count > 1) + { + return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR); + } + Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]); + return StringUtils.containsAnyIgnoreCase(obj.getClass().getPackage().getName(), Constants.JOB_WHITELIST_STR); + } +} diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml b/springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml new file mode 100644 index 00000000..2ea754ea --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time + from sys_job_log + + + + + + + + + + delete from sys_job_log where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + sysdate() + ) + + + \ No newline at end of file diff --git a/springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml b/springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml new file mode 100644 index 00000000..247b3101 --- /dev/null +++ b/springboot/fastbee-plugs/fastbee-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark + from sys_job + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/springboot/fastbee-plugs/pom.xml b/springboot/fastbee-plugs/pom.xml new file mode 100644 index 00000000..c6e256b5 --- /dev/null +++ b/springboot/fastbee-plugs/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + fastbee + com.fastbee + 3.8.5 + + + pom + fastbee-plugs + 插件工具类整合 + + + fastbee-quartz + fastbee-generator + + + + diff --git a/springboot/fastbee-protocol/fastbee-protocol-collect/pom.xml b/springboot/fastbee-protocol/fastbee-protocol-collect/pom.xml new file mode 100644 index 00000000..2524e2b8 --- /dev/null +++ b/springboot/fastbee-protocol/fastbee-protocol-collect/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + + com.fastbee + fastbee-iot-service + + + + fastbee-protocol + com.fastbee + 3.8.5 + + + + fastbee-protocol-collect + + + + diff --git a/springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/common/ProtocolDeCodeService.java b/springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/common/ProtocolDeCodeService.java new file mode 100644 index 00000000..962b615a --- /dev/null +++ b/springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/common/ProtocolDeCodeService.java @@ -0,0 +1,53 @@ +package com.fastbee.common; + +import com.fastbee.common.core.iot.response.DeCodeBo; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.gateway.CRC16Utils; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.stereotype.Component; + +/** + * 协议编解码 + * + * @author gsb + * @date 2023/4/8 15:50 + */ +@Component +@Slf4j +public class ProtocolDeCodeService { + + + public String protocolDeCode(DeCodeBo bo) { + if (null == bo) { + throw new ServiceException("输入内容为空"); + } + String payload = bo.getPayload(); + /*1-解析 2-读指令 3-写指令 4-CRC生成 5-CRC校验*/ + switch (bo.getType()) { + case 1: + case 2: + case 3: + case 4: + byte[] crc16Byte = ByteBufUtil.decodeHexDump(payload); + String crc = CRC16Utils.getCRC(crc16Byte); + return payload + crc; + case 5: + byte[] crcByte = ByteBufUtil.decodeHexDump(payload); + byte[] checksCRC = {crcByte[crcByte.length -2],crcByte[crcByte.length-1]}; + byte[] sourceCRC = ArrayUtils.subarray(crcByte, 0, crcByte.length - 2); + String crc1 = CRC16Utils.getCRC(sourceCRC); + String check = ByteBufUtil.hexDump(checksCRC); + if (!crc1.equalsIgnoreCase(check)){ + return "原报文CRC:" + check +"校验失败,CRC值应为:" + crc1 + + "
完整报文:" + ByteBufUtil.hexDump(sourceCRC) +crc1; + }else { + return "校验通过!"; + } + } + return null; + } + + +} diff --git a/springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/json/JsonProtocolService.java b/springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/json/JsonProtocolService.java new file mode 100644 index 00000000..758c2f25 --- /dev/null +++ b/springboot/fastbee-protocol/fastbee-protocol-collect/src/main/java/com/fastbee/json/JsonProtocolService.java @@ -0,0 +1,70 @@ +package com.fastbee.json; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.annotation.SysProtocol; +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.mq.DeviceReport; +import com.fastbee.common.core.mq.message.DeviceData; +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import com.fastbee.common.core.thingsModel.ThingsModelValuesInput; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.model.ThingsModels.ValueItem; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +/** + * @author gsb + * @date 2022/10/10 16:55 + */ +@Slf4j +@Component +@SysProtocol(name = "JSONArray解析协议",protocolCode = FastBeeConstant.PROTOCOL.JsonArray,description = "系统内置JSONArray解析协议") +public class JsonProtocolService { + + + public DeviceReport decode(DeviceData deviceData, String clientId) { + try { + DeviceReport reportMessage = new DeviceReport(); + // bytep[] 转String + String data = new String(deviceData.getData(),StandardCharsets.UTF_8); + List values = JSON.parseArray(data, ThingsModelSimpleItem.class); + //上报数据时间 + for (ThingsModelSimpleItem value : values) { + value.setTs(DateUtils.getNowDate()); + } + ThingsModelValuesInput valuesInput = new ThingsModelValuesInput(); + valuesInput.setThingsModelValueRemarkItem(values); + reportMessage.setValuesInput(valuesInput); + reportMessage.setClientId(clientId); + reportMessage.setSerialNumber(clientId); + return reportMessage; + }catch (Exception e){ + throw new ServiceException("数据解析异常"+e.getMessage()); + } + } + + + public byte[] encode(DeviceData message, String clientId) { + try { + JSONObject body = (JSONObject) message.getDownMessage().getBody(); + ValueItem valueItem = new ValueItem(); + for (Map.Entry entry : body.entrySet()) { + valueItem.setId(entry.getKey()); + valueItem.setValue(entry.getValue()+""); + valueItem.setRemark(""); + } + String msg = "[" + JSONObject.toJSONString(valueItem) +"]"; + return msg.getBytes(StandardCharsets.UTF_8); + }catch (Exception e){ + log.error("=>指令编码异常,device={},data={}",message.getSerialNumber(), + message.getDownMessage().getBody()); + return null; + } + } +} diff --git a/springboot/fastbee-protocol/pom.xml b/springboot/fastbee-protocol/pom.xml new file mode 100644 index 00000000..c73f0536 --- /dev/null +++ b/springboot/fastbee-protocol/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + fastbee + com.fastbee + 3.8.5 + + + fastbee-protocol + 设备协议模块 + + pom + + + fastbee-protocol-collect + + + + + + com.fastbee + fastbee-common + + + + + + + diff --git a/springboot/fastbee-server/base-server/pom.xml b/springboot/fastbee-server/base-server/pom.xml new file mode 100644 index 00000000..3cb96e4f --- /dev/null +++ b/springboot/fastbee-server/base-server/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + fastbee-server + com.fastbee + 3.8.5 + + + base-server + diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/Delimiter.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/Delimiter.java new file mode 100644 index 00000000..897bcf8b --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/Delimiter.java @@ -0,0 +1,29 @@ +package com.fastbee.base.codec; + +/** + * 分隔符报文处理器 + * 处理分割符报文,tcp粘包处理 + * @author bill + */ +public class Delimiter { + + public final byte[] value; + public final boolean strip; + + public Delimiter(byte[] value) { + this(value, true); + } + + public Delimiter(byte[] value, boolean strip) { + this.value = value; + this.strip = strip; + } + + public byte[] getValue() { + return value; + } + + public boolean isStrip() { + return strip; + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/LengthField.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/LengthField.java new file mode 100644 index 00000000..3fabdabf --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/LengthField.java @@ -0,0 +1,76 @@ +package com.fastbee.base.codec; + +import static io.netty.util.internal.ObjectUtil.checkPositive; +import static io.netty.util.internal.ObjectUtil.checkPositiveOrZero; + +/** + * 固定长度报文处理器 + * 处理固定长度报文,tcp粘包处理 + * @author bill + */ +public class LengthField { + + public final byte[] prefix; + /*最大帧长度*/ + public final int lengthFieldMaxFrameLength; + /*偏移量*/ + public final int lengthFieldOffset; + /*字段长度*/ + public final int lengthFieldLength; + /*结尾偏移量*/ + public final int lengthFieldEndOffset; + /*报文调整 默认0,不调整*/ + public final int lengthAdjustment; + /*,默认0*/ + public final int initialBytesToStrip; + + /**构造固定长度处理器*/ + public LengthField(byte[] prefix, int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) { + this(prefix, maxFrameLength, lengthFieldOffset, lengthFieldLength, 0, 0); + } + + public LengthField(byte[] prefix, int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) { + checkPositive(maxFrameLength, "maxFrameLength_LengthField"); + checkPositiveOrZero(lengthFieldOffset, "lengthFieldOffset"); + checkPositiveOrZero(initialBytesToStrip, "initialBytesToStrip"); + if (lengthFieldOffset > maxFrameLength - lengthFieldLength) { + throw new IllegalArgumentException("maxFrameLength_LengthField (" + maxFrameLength + ") must be equal to or greater than lengthFieldOffset (" + lengthFieldOffset + ") + lengthFieldLength (" + lengthFieldLength + ")."); + } else { + this.prefix = prefix; + this.lengthFieldMaxFrameLength = maxFrameLength; + this.lengthFieldOffset = lengthFieldOffset; + this.lengthFieldLength = lengthFieldLength; + this.lengthAdjustment = lengthAdjustment; + this.lengthFieldEndOffset = lengthFieldOffset + lengthFieldLength; + this.initialBytesToStrip = initialBytesToStrip; + } + } + + public byte[] getPrefix() { + return prefix; + } + + public int getLengthFieldMaxFrameLength() { + return lengthFieldMaxFrameLength; + } + + public int getLengthFieldOffset() { + return lengthFieldOffset; + } + + public int getLengthFieldLength() { + return lengthFieldLength; + } + + public int getLengthFieldEndOffset() { + return lengthFieldEndOffset; + } + + public int getLengthAdjustment() { + return lengthAdjustment; + } + + public int getInitialBytesToStrip() { + return initialBytesToStrip; + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageDecoder.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageDecoder.java new file mode 100644 index 00000000..ba2c3624 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageDecoder.java @@ -0,0 +1,18 @@ +package com.fastbee.base.codec; + + +import com.fastbee.common.core.mq.DeviceReport; +import io.netty.buffer.ByteBuf; + +/** + * 基础消息解码类 + * + * @author bill + */ +public interface MessageDecoder { + + /** + * TCP3.进站消息解码方法 + */ + DeviceReport decode(ByteBuf buf, String clientId); +} \ No newline at end of file diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageEncoder.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageEncoder.java new file mode 100644 index 00000000..0a2e4a80 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/codec/MessageEncoder.java @@ -0,0 +1,15 @@ +package com.fastbee.base.codec; + +import com.fastbee.common.core.protocol.Message; +import com.fastbee.base.session.Session; +import io.netty.buffer.ByteBuf; + +/** + * 基础消息编码类 + * + * @author bill + */ +public interface MessageEncoder{ + + ByteBuf encode(Message message, String clientId); +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/AbstractHandlerMapping.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/AbstractHandlerMapping.java new file mode 100644 index 00000000..d8895335 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/AbstractHandlerMapping.java @@ -0,0 +1,61 @@ +package com.fastbee.base.core; + +import com.fastbee.base.core.annotation.Async; +import com.fastbee.base.core.annotation.AsyncBatch; +import com.fastbee.base.core.annotation.PakMapping; +import com.fastbee.base.core.hanler.AsyncBatchHandler; +import com.fastbee.base.core.hanler.BaseHandler; +import com.fastbee.base.core.hanler.SyncHandler; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * 消息处理映射 + * + * @author bill + */ +public abstract class AbstractHandlerMapping implements HandlerMapping { + + private final Map handlerMap = new HashMap<>(64); + + /** + * 将node中被@Column标记的方法注册到映射表 + */ + protected synchronized void registerHandlers(Object bean) { + Class beanClass = bean.getClass(); + Method[] methods = beanClass.getDeclaredMethods(); + + for (Method method : methods) { + PakMapping annotation = method.getAnnotation(PakMapping.class); + if (annotation != null) { + + String desc = annotation.desc(); + int[] types = annotation.types(); + + AsyncBatch asyncBatch = method.getAnnotation(AsyncBatch.class); + BaseHandler baseHandler; + // 异步处理 + if (asyncBatch != null) { + baseHandler = new AsyncBatchHandler(bean, method, desc, asyncBatch.poolSize(), asyncBatch.maxMessageSize(), asyncBatch.maxWaitTime()); + } else { + baseHandler = new SyncHandler(bean, method, desc, method.isAnnotationPresent(Async.class)); + } + + for (int type : types) { + handlerMap.put(type, baseHandler); + } + + } + } + } + + /** + * 根据消息类型获取handler + */ + @Override + public BaseHandler getHandler(int messageId) { + return handlerMap.get(messageId); + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/DefaultHandlerMapping.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/DefaultHandlerMapping.java new file mode 100644 index 00000000..47966ff9 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/DefaultHandlerMapping.java @@ -0,0 +1,27 @@ +package com.fastbee.base.core; + +import com.fastbee.base.core.annotation.Node; +import com.fastbee.base.util.ClassUtils; + +import java.util.List; + +/** + * 默认消息映射处理类 + * @author bill + */ +public class DefaultHandlerMapping extends AbstractHandlerMapping { + + public DefaultHandlerMapping(String endpointPackage) { + List endpointClasses = ClassUtils.getClassList(endpointPackage, Node.class); + + for (Class endpointClass : endpointClasses) { + try { + Object bean = endpointClass.getDeclaredConstructor((Class[]) null).newInstance((Object[]) null); + super.registerHandlers(bean); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerInterceptor.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerInterceptor.java new file mode 100644 index 00000000..464795cd --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerInterceptor.java @@ -0,0 +1,37 @@ +package com.fastbee.base.core; + + +import com.fastbee.common.core.protocol.Message; +import com.fastbee.base.session.Session; + +/** + * 消息拦截器 + * @author bill + */ +public interface HandlerInterceptor { + + /** + * 未匹配到对应的Handle(消息处理) + */ + T notSupported(T request, Session session); + + /** + * 调用之前 + * 处理消息类型匹配 + */ + boolean beforeHandle(T request, Session session); + + /** + * 需要应答设备,在这里执行 + * 调用之后,返回值为void的 */ + T successful(T request, Session session); + + /** 调用之后,有返回值的 */ + void afterHandle(T request, T response, Session session); + + /** + * 报错应答方法 + * 调用之后抛出异常的 + */ + T exceptional(T request, Session session, Exception e); +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerMapping.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerMapping.java new file mode 100644 index 00000000..029b7bf0 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/HandlerMapping.java @@ -0,0 +1,12 @@ +package com.fastbee.base.core; + +import com.fastbee.base.core.hanler.BaseHandler; + +/** + * 消息处理接口 + * @author bill + */ +public interface HandlerMapping { + + BaseHandler getHandler(int messageId); +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/SpringHandlerMapping.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/SpringHandlerMapping.java new file mode 100644 index 00000000..5b2cb554 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/SpringHandlerMapping.java @@ -0,0 +1,23 @@ +package com.fastbee.base.core; + +import com.fastbee.base.core.annotation.Node; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import java.util.Map; + +/** + * + * @author bill + */ +public class SpringHandlerMapping extends AbstractHandlerMapping implements ApplicationContextAware { + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Map endpoints = applicationContext.getBeansWithAnnotation(Node.class); + for (Object bean : endpoints.values()) { + super.registerHandlers(bean); + } + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Async.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Async.java new file mode 100644 index 00000000..90ef0b3e --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Async.java @@ -0,0 +1,15 @@ +package com.fastbee.base.core.annotation; + +import java.lang.annotation.*; + +/** + * 异步处理设备数据 + * + * @author bill + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Async { + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/AsyncBatch.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/AsyncBatch.java new file mode 100644 index 00000000..3cbf559b --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/AsyncBatch.java @@ -0,0 +1,27 @@ +package com.fastbee.base.core.annotation; + +import java.lang.annotation.*; + +/** + * 多线程异步处理设备数据,新建线程组处理 + * + * @author bill + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface AsyncBatch { + + /*批量处理的最大消息数*/ + int maxMessageSize() default 5000; + + /*线程数*/ + int poolSize() default 2; + + /*最大等待时间*/ + int maxWaitTime() default 1000; + + /*最小处理消息数*/ + int minMessageSize() default 100; + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Node.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Node.java new file mode 100644 index 00000000..6cee49e2 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/Node.java @@ -0,0 +1,14 @@ +package com.fastbee.base.core.annotation; + +import java.lang.annotation.*; + +/** + * 消息节点 + * @author bill + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Node { + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/PakMapping.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/PakMapping.java new file mode 100644 index 00000000..0945ac11 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/annotation/PakMapping.java @@ -0,0 +1,17 @@ +package com.fastbee.base.core.annotation; + +import java.lang.annotation.*; + +/** + * 字段映射 + * @author bill + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface PakMapping { + + int[] types(); + + String desc() default ""; +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/AsyncBatchHandler.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/AsyncBatchHandler.java new file mode 100644 index 00000000..d13d554f --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/AsyncBatchHandler.java @@ -0,0 +1,128 @@ +package com.fastbee.base.core.hanler; + +import com.fastbee.common.core.protocol.Message; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.VirtualList; +import com.fastbee.common.exception.ServiceException; +import io.netty.util.concurrent.DefaultThreadFactory; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 异步批量处理报文 + * @author bill + */ +@Slf4j +public class AsyncBatchHandler extends BaseHandler{ + + + /*消息处理队列*/ + private final ConcurrentLinkedQueue queue; + + /*线程池*/ + private final ThreadPoolExecutor executor; + + private final int poolSize; + + private final int maxEventSize; + + private final int maxWait; + + private final int warningLines; + + + public AsyncBatchHandler(Object target, Method targetMethod, String desc, int poolSize, int maxEventSize, int maxWait) { + + super(target, targetMethod, desc); + Class[] parameterTypes = targetMethod.getParameterTypes(); + if (parameterTypes.length >1){ + throw new ServiceException("参数列表过长"); + } + if (!parameterTypes[0].isAssignableFrom(List.class)){ + throw new ServiceException("参数不是List类型"); + } + + this.poolSize = poolSize; + this.maxEventSize = maxEventSize; + this.maxWait = maxWait; + this.warningLines = maxEventSize * poolSize * 50; + + this.queue = new ConcurrentLinkedQueue<>(); + this.executor = new ThreadPoolExecutor(this.poolSize,this.poolSize,1000L, TimeUnit.MILLISECONDS + ,new LinkedBlockingQueue<>(500),new DefaultThreadFactory(targetMethod.getName())); + + for (int i = 0; i < poolSize; i++) { + boolean start = i == 0; + executor.execute(()->{ + try { + startInternal(start); + }catch (Exception e){ + log.error("线程池处理数据出错",e); + } + }); + } + + } + + @Override + public T invoke(T request, Session session) throws Exception { + queue.offer(request); + return null; + } + + public void startInternal(boolean master) { + Message[] array = new Message[maxEventSize]; + long logtime = 0; + long starttime = 0; + + for (; ; ) { + Message temp; + int i = 0; + while ((temp = queue.poll()) != null) { + array[i++] = temp; + if (i >= maxEventSize) { + break; + } + } + + if (i > 0) { + starttime = System.currentTimeMillis(); + try { + targetMethod.invoke(targetObject, new VirtualList<>(array, i)); + } catch (Exception e) { + log.warn(targetMethod.getName(), e); + } + long time = System.currentTimeMillis() - starttime; + if (time > 1000L) { + log.warn("线程池处理数据耗时:{}ms,共{}条记录", time, i); + } + } + + if (i < maxEventSize) { + try { + for (int j = 0; j < i; j++) { + array[j] = null; + } + Thread.sleep(maxWait); + } catch (InterruptedException e) { + log.error("sleep error!"); + } + } else if (master) { + if (logtime < starttime) { + logtime = starttime + 5000L; + + int size = queue.size(); + if (size > warningLines) { + log.warn("线程池队列已满, size:{}", size); + } + } + } + } + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/BaseHandler.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/BaseHandler.java new file mode 100644 index 00000000..7b4d93a2 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/BaseHandler.java @@ -0,0 +1,86 @@ +package com.fastbee.base.core.hanler; + +import com.fastbee.common.core.protocol.Message; +import com.fastbee.base.session.Session; + +import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; + +/** + * 基础处理类 + * + * @author bill + */ +public abstract class BaseHandler { + + public static final int MESSAGE = 0; + public static final int SESSION = 1; + + public final Object targetObject; + public final Method targetMethod; + public final int[] parameterTypes; + public final boolean returnVoid; + public final boolean async; + public final String desc; + + public BaseHandler(Object target, Method targetMethod, String desc) { + this(target, targetMethod, desc, false); + } + + public BaseHandler(Object targetObject, Method targetMethod, String desc, boolean async) { + this.targetObject = targetObject; + this.targetMethod = targetMethod; + this.returnVoid = targetMethod.getReturnType().isAssignableFrom(Void.TYPE); + this.async = async; + if (desc == null || desc.isEmpty()) + desc = targetMethod.getName(); + this.desc = desc; + + Type[] types = targetMethod.getGenericParameterTypes(); + int[] parameterTypes = new int[types.length]; + try { + for (int i = 0; i < types.length; i++) { + Type type = types[i]; + Class clazz; + if (type instanceof ParameterizedTypeImpl) { + clazz = (Class) ((ParameterizedTypeImpl) type).getActualTypeArguments()[0]; + } else { + clazz = (Class) type; + } + + if (Message.class.isAssignableFrom(clazz)) { + parameterTypes[i] = MESSAGE; + } else if (Session.class.isAssignableFrom(clazz)) { + parameterTypes[i] = SESSION; + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + this.parameterTypes = parameterTypes; + } + + public T invoke(T request, Session session) throws Exception { + Object[] args = new Object[parameterTypes.length]; + + for (int i = 0; i < parameterTypes.length; i++) { + int type = parameterTypes[i]; + switch (type) { + case BaseHandler.MESSAGE: + args[i] = request; + break; + case BaseHandler.SESSION: + args[i] = session; + break; + } + } + return (T) targetMethod.invoke(targetObject, args); + } + + @Override + public String toString() { + return desc; + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/SyncHandler.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/SyncHandler.java new file mode 100644 index 00000000..66605376 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/hanler/SyncHandler.java @@ -0,0 +1,23 @@ +package com.fastbee.base.core.hanler; + +import com.fastbee.common.core.protocol.Message; +import com.fastbee.base.session.Session; + + +import java.lang.reflect.Method; + +/** + * 同步处理报文 + * @author bill + */ +public class SyncHandler extends BaseHandler{ + + public SyncHandler(Object target, Method targetMethod, String desc,boolean async) { + super(target, targetMethod, desc, async); + } + + @Override + public T invoke(T request, Session session) throws Exception { + return super.invoke(request, session); + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/model/Response.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/model/Response.java new file mode 100644 index 00000000..8d17e20d --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/core/model/Response.java @@ -0,0 +1,12 @@ +package com.fastbee.base.core.model; + +/** + * 消息流水号响应 + * @author gsb + * @date 2022/11/7 10:19 + */ +public interface Response { + + /**应答消息流水号*/ + int getResponseSerialNo(); +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/DeviceMsg.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/DeviceMsg.java new file mode 100644 index 00000000..b3bffcc6 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/DeviceMsg.java @@ -0,0 +1,19 @@ +package com.fastbee.base.model; + +import lombok.Data; + +/** + * @author gsb + * @date 2023/3/9 10:07 + */ +@Data +public class DeviceMsg { + + protected String clientId; + + protected Long deviceId; + + private int protocolVersion; + + private Long productId; +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/SessionKey.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/SessionKey.java new file mode 100644 index 00000000..22b6549a --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/model/SessionKey.java @@ -0,0 +1,16 @@ +package com.fastbee.base.model; + +import com.fastbee.base.session.Session; + +/** + * @author gsb + * @date 2023/3/9 10:03 + */ +public enum SessionKey { + + DeviceMsg; + + public static DeviceMsg getDeviceMsg(Session session){ + return (DeviceMsg)session.getAttribute(SessionKey.DeviceMsg); + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/ISessionStore.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/ISessionStore.java new file mode 100644 index 00000000..4bd83178 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/ISessionStore.java @@ -0,0 +1,60 @@ +package com.fastbee.base.service; + + +import com.fastbee.base.session.Session; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +/** + * 服务会话存储接口 + * @author gsb + * @date 2022/10/14 14:16 + */ +public interface ISessionStore { + /** + * session 会话存储 + * + * @param clientId: 客户端标识 + * @param session: session会话 + + */ + void storeSession(String clientId, Session session); + + /** + * 根据客户端标识获取相应会话 + * + * @param clientId: 客户端标识 + */ + Session getSession(String clientId); + + /** + * 清除历史会话状态 + * + * @param clientId: 客户端标识 + */ + void cleanSession(String clientId); + + /** + * 根据客户端标识查看是否存在该会话 + * + * @param clientId: + */ + boolean containsKey(String clientId); + + /** + * 获取集合 + * @return MAP + */ + ConcurrentHashMap getSessionMap(); + + /** + * map分页(从1开始) + * + * @param sourceMap 分页数据 + * @param pageSize 页面大小 + * @param currentPage 当前页面 + */ + public Map listPage(Map sourceMap, int pageSize, int currentPage); +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/impl/SessionStoreImpl.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/impl/SessionStoreImpl.java new file mode 100644 index 00000000..da2819f6 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/service/impl/SessionStoreImpl.java @@ -0,0 +1,104 @@ +package com.fastbee.base.service.impl; + +import com.fastbee.base.service.ISessionStore; +import com.fastbee.base.session.Session; +import org.springframework.stereotype.Service; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 内存存储服务会话 + * + * @author gsb + * @date 2022/10/14 14:18 + */ +@Service +public class SessionStoreImpl implements ISessionStore { + + /*session存储集合*/ + private final ConcurrentHashMap sessionMap = new ConcurrentHashMap<>(); + + /** + * MQTT会话存储 + * + * @param clientId: 客户端标识 + * @param session: MQTT会话 + */ + @Override + public void storeSession(String clientId, Session session) { + sessionMap.put(clientId, session); + } + + /** + * 根据客户端标识获取相应会话 + * + * @param clientId: 客户端标识 + */ + @Override + public Session getSession(String clientId) { + return sessionMap.get(clientId); + } + + /** + * 清除历史会话状态 + * + * @param clientId: 客户端标识 + */ + @Override + public void cleanSession(String clientId) { + sessionMap.remove(clientId); + } + + /** + * 根据客户端标识查看是否存在该会话 + * + * @param clientId: + */ + @Override + public boolean containsKey(String clientId) { + return sessionMap.containsKey(clientId); + } + + /** + * 获取集合 + * @return MAP + */ + @Override + public ConcurrentHashMap getSessionMap(){ + return sessionMap; + } + + + /** + * map分页(从1开始) + * + * @param sourceMap 分页数据 + * @param pageSize 页面大小 + * @param currentPage 当前页面 + */ + @Override + public Map listPage(Map sourceMap, int pageSize, int currentPage) { + Map map = new LinkedHashMap<>(); + if (sourceMap.size() > 0) { + AtomicInteger flag = new AtomicInteger(0); + AtomicInteger size = new AtomicInteger(0); + int currIdx = (currentPage > 1 ? (currentPage - 1) * pageSize : 0); + sourceMap.forEach((ass, list_km) -> { + if (flag.get() >= currIdx) { + if (size.get() < pageSize) { + map.put(ass, list_km); + } else { + return; + } + size.getAndIncrement(); + } + flag.getAndIncrement(); + }); + + } + return map; + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Packet.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Packet.java new file mode 100644 index 00000000..c57b144d --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Packet.java @@ -0,0 +1,74 @@ +package com.fastbee.base.session; + +import com.fastbee.common.core.protocol.Message; +import io.netty.buffer.ByteBuf; +import io.netty.channel.socket.DatagramPacket; + +/** + * 报文消息的包装 + * @author bill + */ +public abstract class Packet { + + /*session*/ + public final Session session; + /*基础消息*/ + public Message message; + /*报文缓存buf*/ + public ByteBuf byteBuf; + + public static Packet of(Session session, Message message) { + if (session.isUdp()) { + return new UDP(session, message, null); + } + return new TCP(session, message, message.getPayload()); + } + + public static Packet of(Session session, ByteBuf message) { + if (session.isUdp()) { + return new UDP(session, null, message); + } + return new TCP(session, null, message); + } + + private Packet(Session session, Message message, ByteBuf byteBuf) { + this.session = session; + this.message = message; + this.byteBuf = byteBuf; + } + + public Packet replace(Message message) { + this.message = message; + return this; + } + + public ByteBuf take() { + ByteBuf temp = this.byteBuf; + this.byteBuf = null; + return temp; + } + + public abstract Object wrap(ByteBuf byteBuf); + + private static class TCP extends Packet { + private TCP(Session session, Message message, ByteBuf byteBuf) { + super(session, message, byteBuf); + } + + @Override + public Object wrap(ByteBuf byteBuf) { + return byteBuf; + } + } + + private static class UDP extends Packet { + private UDP(Session session, Message message, ByteBuf byteBuf) { + super(session, message, byteBuf); + } + + @Override + public Object wrap(ByteBuf byteBuf) { + return new DatagramPacket(byteBuf, session.remoteAddress()); + } + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java new file mode 100644 index 00000000..4f6c0ac3 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java @@ -0,0 +1,286 @@ +package com.fastbee.base.session; + +import com.fastbee.common.core.protocol.Message; +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.gateway.mq.Topics; +import com.fastbee.base.core.model.Response; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessageType; +import io.netty.handler.codec.mqtt.MqttVersion; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; +import reactor.core.publisher.MonoSink; + +import java.net.InetSocketAddress; +import java.util.*; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; + +/** + * 会话 + * + * @Author guanshubiao + * @Date 2022/9/12 20:22 + */ +@Data +@Slf4j +public class Session { + + private boolean udp; + private Function remover; + protected Channel channel; + /** + * 客户端id + */ + private String clientId; + private String productId; + private SessionManager sessionManager; + private InetSocketAddress remoteAddress; + private String remoteAddressStr; + + private long creationTime; + private long lastAccessTime; + private Map attributes; + + private String sessionId; + //原子计数器,报文没有消息流水号的,充当流水号 + private AtomicInteger serialNo = new AtomicInteger(0); + private int keepAlive = 60; + + + /*mqtt版本号*/ + private MqttVersion version; + /*是否清楚会话*/ + private Boolean cleanSession = false; + /*mqtt账号*/ + private String username; + /*是否链接*/ + private Boolean connected = false; + /*mqtt消息类型*/ + private MqttMessageType mqttMessageType; + private int keepAliveMax = 120; + /*主题*/ + private String topicName; + /*Channel处理类上下文*/ + private ChannelHandlerContext handlerContext; + + private List topics; + private Integer topicCount; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date connected_at; + private String ip; + /*服务协议类型 MQTT,TCP UDP COAP*/ + private ServerType serverType; + + public Session(){ + + } + + public Session(SessionManager sessionManager, + Channel channel, + InetSocketAddress remoteAddress, + Function remover, + boolean udp, + ServerType serverType) { + this.channel = channel; + this.creationTime = DateUtils.getTimestamp(); + this.lastAccessTime = creationTime; + this.sessionManager = sessionManager; + this.remoteAddress = remoteAddress; + this.remoteAddressStr = remoteAddress.toString(); + this.remover = remover; + this.udp = udp; + this.serverType = serverType; + this.ip = remoteAddress.getHostName(); + this.connected = true; + this.connected_at = DateUtils.getNowDate(); + if (sessionManager != null && sessionManager.getSessionKeys() != null) { + this.attributes = new EnumMap(sessionManager.getSessionKeys()); + } else { + this.attributes = new TreeMap<>(); + } + } + + /** + * 判断设备是否已经注册上线 + */ + public boolean isRegistered() { + return clientId != null; + } + + /*设备端注册*/ + public void register(Message message) { + register(message.getClientId(), message); + } + + public void register(String clientId, Message message) { + //已经注册,不再发送注册包数据 + if (isRegistered()){ + return; + } + if (clientId == null) { + throw new ServiceException("客户端注册clientId不能为空"); + } + this.clientId = clientId.toUpperCase(); + if (sessionManager != null) { + sessionManager.add(this); + } + } + + public Object getAttribute(Object name) { + return attributes.get(name); + } + + public void setAttribute(Object name, Object value) { + attributes.put(name, value); + } + + /** + * 获取最后上线时间 + */ + public long access() { + return lastAccessTime = DateUtils.getTimestamp(); + } + + /** + * 获取远程端口 + */ + public InetSocketAddress remoteAddress() { + return remoteAddress; + } + + /** + * 获取流水号 + */ + public int nextSerialNO() { + int current; + int next; + do { + current = serialNo.get(); + next = current > 0xffff ? 0 : current; + } while (!serialNo.compareAndSet(current, next + 1)); + return next; + } + + /** + * 处理离线方法 + */ + public void invalidate() { + if (isRegistered() && sessionManager != null) { + sessionManager.remove(this); + } + remover.apply(this); + } + + public boolean isUdp() { + return udp; + } + + private final Map topicSubscribers = new HashMap<>(); + + private static final Mono rejected = Mono.error(new RejectedExecutionException("设备端暂无响应")); + + /** + * 异步发送通知类消息 + * 同步发送 mono.block() + * 订阅回调 mono.doOnSuccess(处理成功).doOnError(处理异常).subscribe(开始订阅) + */ + public Mono notify(Message message) { + return mono(channel.writeAndFlush(Packet.of(this, message))); + } + + public Mono notify(ByteBuf message) { + return mono(channel.writeAndFlush(Packet.of(this, message))); + } + + public static Mono mono(ChannelFuture channelFuture) { + return Mono.create(sink -> channelFuture.addListener(future -> { + if (future.isSuccess()) { + sink.success(); + } else { + sink.error(future.cause()); + } + })); + } + + /** + * 异步发送消息,接收响应 + * 同步接收 mono.block() + * 订阅回调 mono.doOnSuccess(处理成功).doOnError(处理异常).subscribe(开始订阅) + */ + public Mono request(Message message, Class responseClass) { + String key = requestKey(message, responseClass); + Mono subscribe = this.subscribe(key); + if (subscribe == null) { + return rejected; + } + ChannelFuture channelFuture = channel.writeAndFlush(Packet.of(this, message)); + return Mono.create(sink -> channelFuture.addListener(future -> { + if (future.isSuccess()) { + sink.success(future); + } else { + sink.error(future.cause()); + } + })).then(subscribe).doFinally(signal -> unsubscribe(key)); + } + + /** + * 消息响应 + */ + public boolean response(Message message){ + MonoSink monoSink = topicSubscribers.get(responseKey(message)); + if (monoSink != null){ + monoSink.success(message); + return true; + } + return false; + } + + /** + * 订阅 + */ + private Mono subscribe(String key) { + synchronized (topicSubscribers) { + if (!topicSubscribers.containsKey(key)) { + return Mono.create(sink -> topicSubscribers.put(key, sink)); + } + } + return null; + } + + /** + * 取消订阅 + */ + private void unsubscribe(String key) { + topicSubscribers.remove(key); + } + + /*生成流水号*/ + private static String requestKey(Message request, Class responseClass) { + String className = responseClass.getName(); + if (Response.class.isAssignableFrom(responseClass)) { + String serNo = request.getSerNo(); + return new StringBuffer(34).append(className).append('.').append(serNo).toString(); + } + return className; + } + + /*返回流水号*/ + private static String responseKey(Object response) { + String className = response.getClass().getName(); + if (response instanceof Response) { + int serialNo = ((Response) response).getResponseSerialNo(); + return new StringBuffer(34).append(className).append('.').append(serialNo).toString(); + } + return className; + } + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionListener.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionListener.java new file mode 100644 index 00000000..b910e003 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionListener.java @@ -0,0 +1,26 @@ +package com.fastbee.base.session; + +/** + * session监听 + * @author gsb + * @date 2022/11/7 8:57 + */ + +public interface SessionListener { + + /** 客户端建立连接 */ + default void sessionCreated(Session session) { + + } + + /** 客户端完成注册或鉴权 */ + default void sessionRegistered(Session session) { + } + + /** + * 客户端注销或离线 + */ + default void sessionDestroyed(Session session) { + + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionManager.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionManager.java new file mode 100644 index 00000000..54bcf9b3 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/session/SessionManager.java @@ -0,0 +1,125 @@ +package com.fastbee.base.session; + +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.base.service.ISessionStore; +import io.netty.channel.Channel; +import lombok.extern.slf4j.Slf4j; + +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.Locale; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +/** + * session管理 + * @author gsb + * @date 2022/11/7 8:55 + */ +@Slf4j +public class SessionManager { + + private final Class sessionKeys; + + private final SessionListener sessionListener; + + /*Session会话存储*/ + private static ISessionStore sessionStore = SpringUtils.getBean(ISessionStore.class); + + public SessionManager(){ + this(null,null); + } + + public SessionManager(SessionListener sessionListener){ + this(null,sessionListener); + } + + public SessionManager(Class sessionKeys, SessionListener sessionListener){ + this.sessionKeys = sessionKeys; + this.sessionListener = sessionListener; + } + + /** + * 获取Session + */ + public Session getSession(String clientId) { + return sessionStore.getSession(clientId); + } + + /** + * 获取所有session + */ + public Collection all(){ + return sessionStore.getSessionMap().values(); + } + + /** + * 新建session TCP + * @return + */ + public Session newInstance(Channel channel){ + InetSocketAddress sender = (InetSocketAddress) channel.remoteAddress(); + Session session = new Session(this, channel, sender, s -> { + channel.close(); + return true; + }, false, ServerType.TCP); + if (sessionListener != null) { + try { + sessionListener.sessionCreated(session); + } catch (Exception e) { + log.error("sessionCreated", e); + } + } + return session; + } + + /** + * 新建session UDP + */ + public Session newInstance(Channel channel, InetSocketAddress sender, Function remover) { + Session session = new Session(this, channel, sender, remover, true,ServerType.UDP); + if (sessionListener != null) { + try { + sessionListener.sessionCreated(session); + } catch (Exception e) { + log.error("sessionCreated", e); + } + } + return session; + } + + /** + * 设备端离线 + */ + protected void remove(Session session){ + sessionStore.cleanSession(session.getClientId()); + if (null != sessionListener){ + try { + //设备状态业务处理 + sessionListener.sessionDestroyed(session); + }catch (Exception e){ + log.error("设备端离线异常",e); + } + } + } + + /** + * 设备端上线 + */ + protected void add(Session session){ + sessionStore.storeSession(session.getClientId().toUpperCase(),session); + if (null != sessionListener){ + try { + sessionListener.sessionRegistered(session); + }catch (Exception e){ + log.error("设备端注册",e); + } + } + } + + public Class getSessionKeys(){ + return sessionKeys; + } + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/AttributeUtils.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/AttributeUtils.java new file mode 100644 index 00000000..8e2658f7 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/AttributeUtils.java @@ -0,0 +1,42 @@ +package com.fastbee.base.util; + + +import com.fastbee.base.session.Session; +import io.netty.channel.Channel; +import io.netty.util.AttributeKey; + + +/** + * channel和pipeline桥梁Attribute信息构建 + * @author gsb + * @date 2022/10/7 18:40 + */ +public class AttributeUtils { + + /*存储客户端连接信息*/ + private static final AttributeKey SESSION_KEY = AttributeKey.valueOf("session"); + /*存储客户端id*/ + private static final AttributeKey CLIENT_ID_KEY = AttributeKey.valueOf("clientId"); + + + /*添加session*/ + public static void setSession(Channel channel, Session session){ + channel.attr(SESSION_KEY).set(session); + } + + /*获取session*/ + public static Session getSession(Channel channel){ + return (Session) channel.attr(SESSION_KEY).get(); + } + + /*添加clientId*/ + public static void setClientId(Channel channel, String clientId){ + channel.attr(CLIENT_ID_KEY).set(clientId); + } + + /*获取clientId*/ + public static String getClientId(Channel channel){ + return (String) channel.attr(CLIENT_ID_KEY).get(); + } + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ClassUtils.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ClassUtils.java new file mode 100644 index 00000000..8812ccda --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ClassUtils.java @@ -0,0 +1,106 @@ +package com.fastbee.base.util; + +import java.io.File; +import java.lang.annotation.Annotation; +import java.net.JarURLConnection; +import java.net.URL; +import java.util.Enumeration; +import java.util.LinkedList; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +/** + * 类操作工具 + * @author bill + */ +public class ClassUtils { + public static List getClassList(String packageName, Class annotationClass) { + List classList = getClassList(packageName); + classList.removeIf(next -> !next.isAnnotationPresent(annotationClass)); + return classList; + } + + public static List getClassList(String packageName) { + List classList = new LinkedList<>(); + String path = packageName.replace(".", "/"); + try { + Enumeration urls = ClassUtils.getClassLoader().getResources(path); + while (urls.hasMoreElements()) { + URL url = urls.nextElement(); + + if (url != null) { + String protocol = url.getProtocol(); + + if (protocol.equals("file")) { + addClass(classList, url.toURI().getPath(), packageName); + + } else if (protocol.equals("jar")) { + JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); + JarFile jarFile = jarURLConnection.getJarFile(); + + Enumeration jarEntries = jarFile.entries(); + while (jarEntries.hasMoreElements()) { + + JarEntry jarEntry = jarEntries.nextElement(); + String entryName = jarEntry.getName(); + + if (entryName.startsWith(path) && entryName.endsWith(".class")) { + String className = entryName.substring(0, entryName.lastIndexOf(".")).replaceAll("/", "."); + addClass(classList, className); + } + } + } + } + } + } catch (Exception e) { + throw new RuntimeException("Initial class error!"); + } + return classList; + } + + private static void addClass(List classList, String packagePath, String packageName) { + try { + File[] files = new File(packagePath).listFiles(file -> (file.isDirectory() || file.getName().endsWith(".class"))); + if (files != null) + for (File file : files) { + String fileName = file.getName(); + if (file.isFile()) { + String className = fileName.substring(0, fileName.lastIndexOf(".")); + if (packageName != null) { + className = packageName + "." + className; + } + addClass(classList, className); + } else { + String subPackagePath = fileName; + if (packageName != null) { + subPackagePath = packagePath + "/" + subPackagePath; + } + String subPackageName = fileName; + if (packageName != null) { + subPackageName = packageName + "." + subPackageName; + } + addClass(classList, subPackagePath, subPackageName); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void addClass(List classList, String className) { + classList.add(loadClass(className, false)); + } + + public static Class loadClass(String className, boolean isInitialized) { + try { + return Class.forName(className, isInitialized, getClassLoader()); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + public static ClassLoader getClassLoader() { + return Thread.currentThread().getContextClassLoader(); + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ConcurrentStorage.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ConcurrentStorage.java new file mode 100644 index 00000000..43b614f5 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/ConcurrentStorage.java @@ -0,0 +1,51 @@ +package com.fastbee.base.util; + +import lombok.Data; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * concurrentMap存储类 + * @author bill + */ +@Data +public abstract class ConcurrentStorage implements Storage{ + + private volatile ConcurrentHashMap map; + + public ConcurrentStorage(){ + this(new ConcurrentHashMap()); + } + + public ConcurrentStorage(ConcurrentHashMap map){ + this.map = map; + } + + + @Override + public V push(K key, V value) { + return map.put(key,value); + } + + @Override + public V pop(K key) { + return map.get(key); + } + + @Override + public V remove(K key) { + return map.remove(key); + } + + @Override + public boolean isContains(Object key) { + return map.containsKey(key); + } + + @Override + public Object getStorage() { + return this.map; + } + + +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/DeviceUtils.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/DeviceUtils.java new file mode 100644 index 00000000..6dfe560f --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/DeviceUtils.java @@ -0,0 +1,30 @@ +package com.fastbee.base.util; + +import com.fastbee.common.core.mq.DeviceStatusBo; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.common.utils.DateUtils; +import io.netty.channel.Channel; + +import java.net.InetSocketAddress; + +/** + * 设备信息工具类 + * @author bill + */ +public class DeviceUtils { + + + + + /*构造返回MQ的设备状态model*/ + public static DeviceStatusBo buildStatusMsg(Channel channel, String clientId, DeviceStatus status, String ip){ + InetSocketAddress address = (InetSocketAddress) channel.remoteAddress(); + return DeviceStatusBo.builder() + .serialNumber(clientId) + .status(status) + .ip(ip) + .hostName(address.getHostName()) + .port(address.getPort()) + .timestamp(DateUtils.getNowDate()).build(); + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Stopwatch.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Stopwatch.java new file mode 100644 index 00000000..bd1f50f3 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Stopwatch.java @@ -0,0 +1,48 @@ +package com.fastbee.base.util; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author bill + */ +public class Stopwatch { + private final AtomicInteger count = new AtomicInteger(); + private final Thread thread; + + public Stopwatch start() { + this.thread.start(); + return this; + } + + public int increment() { + return count.incrementAndGet(); + } + + public Stopwatch() { + thread = new Thread(() -> { + long start; + while (true) { + if (count.get() > 0) { + start = System.currentTimeMillis(); + break; + } + try { + Thread.sleep(1L); + } catch (Exception e) { + } + } + while (true) { + try { + Thread.sleep(2000L); + } catch (Exception e) { + } + int num = count.get(); + long time = (System.currentTimeMillis() - start) / 1000; + System.out.println(time + "\t" + num + "\t" + num / time); + } + }); + thread.setName(Thread.currentThread().getName() + "-c"); + thread.setPriority(Thread.MIN_PRIORITY); + thread.setDaemon(true); + } +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Storage.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Storage.java new file mode 100644 index 00000000..5c803d51 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/Storage.java @@ -0,0 +1,18 @@ +package com.fastbee.base.util; + +/** + * 存储管理 + * @author bill + */ +public interface Storage { + + V push(K key, V value); + + V pop(K key); + + V remove(K key); + + boolean isContains(K key); + + Object getStorage(); +} diff --git a/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/VirtualList.java b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/VirtualList.java new file mode 100644 index 00000000..6423cce4 --- /dev/null +++ b/springboot/fastbee-server/base-server/src/main/java/com/fastbee/base/util/VirtualList.java @@ -0,0 +1,101 @@ +package com.fastbee.base.util; + +import java.io.Serializable; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + +/** + * @author bill + */ +public class VirtualList extends AbstractList implements RandomAccess, Serializable { + + private final E[] elementData; + private final int size; + + public VirtualList(E[] array, int length) { + this.elementData = array; + this.size = length; + } + + @Override + public int size() { + return size; + } + + @Override + public Object[] toArray() { + return elementData.clone(); + } + + @Override + @SuppressWarnings("unchecked") + public T[] toArray(T[] a) { + if (a.length < size) + return Arrays.copyOf(this.elementData, size, + (Class) a.getClass()); + System.arraycopy(this.elementData, 0, a, 0, size); + if (a.length > size) + a[size] = null; + return a; + } + + @Override + public E get(int index) { + return elementData[index]; + } + + @Override + public E set(int index, E element) { + E oldValue = elementData[index]; + elementData[index] = element; + return oldValue; + } + + @Override + public int indexOf(Object o) { + E[] a = this.elementData; + if (o == null) { + for (int i = 0; i < size; i++) + if (a[i] == null) + return i; + } else { + for (int i = 0; i < size; i++) + if (o.equals(a[i])) + return i; + } + return -1; + } + + @Override + public boolean contains(Object o) { + return indexOf(o) != -1; + } + + @Override + public Spliterator spliterator() { + return Spliterators.spliterator(elementData, 0, size, Spliterator.ORDERED); + } + + @Override + public void forEach(Consumer action) { + Objects.requireNonNull(action); + for (int i = 0; i < size; i++) { + action.accept(elementData[i]); + } + } + + @Override + public void replaceAll(UnaryOperator operator) { + Objects.requireNonNull(operator); + E[] a = this.elementData; + for (int i = 0; i < size; i++) { + a[i] = operator.apply(a[i]); + } + } + + @Override + public void sort(Comparator c) { + Arrays.sort(elementData, 0, size, c); + } +} \ No newline at end of file diff --git a/springboot/fastbee-server/boot-strap/pom.xml b/springboot/fastbee-server/boot-strap/pom.xml new file mode 100644 index 00000000..d0ec5509 --- /dev/null +++ b/springboot/fastbee-server/boot-strap/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + fastbee-server + com.fastbee + 3.8.5 + + boot-strap + 网关服务启动模块 + + + + + com.fastbee + mqtt-broker + + + + com.fastbee + fastbee-protocol-collect + + + com.fastbee + base-server + 3.8.5 + compile + + + + + + + diff --git a/springboot/fastbee-server/boot-strap/src/main/java/com/fastbee/bootstrap/mqtt/MQTTBootStrap.java b/springboot/fastbee-server/boot-strap/src/main/java/com/fastbee/bootstrap/mqtt/MQTTBootStrap.java new file mode 100644 index 00000000..37d20449 --- /dev/null +++ b/springboot/fastbee-server/boot-strap/src/main/java/com/fastbee/bootstrap/mqtt/MQTTBootStrap.java @@ -0,0 +1,70 @@ +package com.fastbee.bootstrap.mqtt; + +import com.fastbee.mqtt.server.MqttServer; +import com.fastbee.mqtt.server.WebSocketServer; +import com.fastbee.server.Server; +import com.fastbee.server.config.NettyConfig; +import com.fastbee.common.enums.ServerType; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +/** + * MQTT-BROKER启动 + * @author gsb + * @date 2022/9/17 17:25 + */ +@Order(10) +@Configuration +@ConfigurationProperties(value = "server.broker") +@Data +public class MQTTBootStrap { + + @Autowired + private MqttServer mqttServer; + @Autowired + private WebSocketServer webSocketServer; + /*服务器集群节点*/ + private String brokerNode; + /*端口*/ + private int port; + /*心跳时间*/ + private int keepAlive; + /*webSocket端口*/ + private int websocketPort; + /*webSocket路由*/ + private String websocketPath; + + + /** + * 启动mqttBroker + * @return server + */ + @ConditionalOnProperty(value = "server.broker.enabled", havingValue = "true") + @Bean(initMethod = "start", destroyMethod = "stop") + public Server mqttBroker() { + return NettyConfig.custom() + .setIdleStateTime(0,0,keepAlive) + .setName(ServerType.MQTT.getDes()) + .setType(ServerType.MQTT) + .setPort(port) + .setServer(mqttServer) + .build(); + } + + @ConditionalOnProperty(value = "server.broker.enabled", havingValue = "true") + @Bean(initMethod = "start",destroyMethod = "stop") + public Server webSocket(){ + return NettyConfig.custom() + .setIdleStateTime(0,0,keepAlive) + .setName(ServerType.WEBSOCKET.getDes()) + .setType(ServerType.WEBSOCKET) + .setPort(websocketPort) + .setServer(webSocketServer) + .build(); + } +} diff --git a/springboot/fastbee-server/iot-server-core/pom.xml b/springboot/fastbee-server/iot-server-core/pom.xml new file mode 100644 index 00000000..a008bbe2 --- /dev/null +++ b/springboot/fastbee-server/iot-server-core/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + fastbee-server + com.fastbee + 3.8.5 + + + iot-server-core + + + + com.fastbee + base-server + compile + + + com.fastbee + fastbee-mq + + + + diff --git a/springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/Server.java b/springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/Server.java new file mode 100644 index 00000000..4256484c --- /dev/null +++ b/springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/Server.java @@ -0,0 +1,77 @@ +package com.fastbee.server; + + +import com.fastbee.server.config.NettyConfig; +import io.netty.bootstrap.AbstractBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.EventLoopGroup; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; + +/** + * 基础服务器启动类 + * + * @Author guanshubiao + * @Date 2022/9/12 20:22 + */ +@Slf4j +@NoArgsConstructor +public abstract class Server { + + protected EventLoopGroup bossGroup; + protected EventLoopGroup workerGroup; + protected ExecutorService businessService; + protected boolean isRunning; + public NettyConfig config; + + + + protected Server(NettyConfig config){ + this.config = config; + } + + /*初始化方法*/ + protected abstract AbstractBootstrap initialize(); + + + public synchronized boolean start() { + if (isRunning) { + log.warn("=>服务:{},在端口:{},已经运行", config.name, config.port); + return isRunning; + } + AbstractBootstrap bootstrap = initialize(); + ChannelFuture future = bootstrap.bind(config.port).awaitUninterruptibly(); + future.channel().closeFuture().addListener(event -> { + if (isRunning) { + stop(); + } + }); + if (isRunning = future.isSuccess()) { + log.info("=>服务:{},在端口:{},启动成功!", config.name, config.port); + return isRunning; + } + + if (future.cause() != null) { + log.error("服务启动失败", future.cause()); + } + return isRunning; + } + + + public synchronized void stop() { + + isRunning = false; + bossGroup.shutdownGracefully(); + if (workerGroup != null) { + workerGroup.shutdownGracefully(); + } + if (businessService != null) { + businessService.shutdown(); + } + log.warn("=>服务:{},在端口:{},已经停止!", config.name, config.port); + } + + +} diff --git a/springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/config/NettyConfig.java b/springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/config/NettyConfig.java new file mode 100644 index 00000000..142e940c --- /dev/null +++ b/springboot/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/config/NettyConfig.java @@ -0,0 +1,254 @@ +package com.fastbee.server.config; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.enums.ServerType; +import com.fastbee.server.Server; +import com.fastbee.base.codec.Delimiter; +import com.fastbee.base.codec.LengthField; +import com.fastbee.base.codec.MessageDecoder; +import com.fastbee.base.codec.MessageEncoder; +import com.fastbee.base.core.HandlerInterceptor; +import com.fastbee.base.core.HandlerMapping; +import com.fastbee.base.session.SessionManager; +import io.netty.util.NettyRuntime; +import io.netty.util.internal.ObjectUtil; + +/** + * 基础配置类 + * @Author guanshubiao + * @Date 2022/9/12 20:22 + */ +public class NettyConfig { + + public final int workerCore; + /*boss线程核数*/ + public final int businessCore; + /*读空闲时间*/ + public final int readerIdleTime; + /*写空闲时间*/ + public final int writerIdleTime; + /*读写空闲时间*/ + public final int allIdleTime; + /*端口*/ + public final Integer port; + /*TCP/UDP数据最大长度限定*/ + public final Integer maxFrameLength; + /*基础编码*/ + public final MessageDecoder decoder; + /*基础解码*/ + public final MessageEncoder encoder; + public final Delimiter[] delimiters; + public final LengthField lengthField; + public final HandlerMapping handlerMapping; + public final HandlerInterceptor handlerInterceptor; + public final SessionManager sessionManager; + /*基础服务端*/ + public Server server; + public String name; + /*服务名*/ + public final ServerType type; + + + + + public NettyConfig(int workerGroup, + int businessGroup, + int readerIdleTime, + int writerIdleTime, + int allIdleTime, + Integer port, + Integer maxFrameLength, + LengthField lengthField, + Delimiter[] delimiters, + MessageDecoder decoder, + MessageEncoder encoder, + HandlerMapping handlerMapping, + HandlerInterceptor handlerInterceptor, + SessionManager sessionManager, + ServerType type, + String name, + Server server) { + + /*校验值是否正确*/ + ObjectUtil.checkNotNull(port, FastBeeConstant.SERVER.PORT); + ObjectUtil.checkPositive(port, FastBeeConstant.SERVER.PORT); + + if (ServerType.UDP == type || ServerType.TCP == type){ + ObjectUtil.checkNotNull(decoder, "decoder"); + ObjectUtil.checkNotNull(encoder, "encoder"); + ObjectUtil.checkNotNull(handlerMapping, "handlerMapping"); + ObjectUtil.checkNotNull(handlerInterceptor, "handlerInterceptor"); + } + if (type == ServerType.TCP){ + ObjectUtil.checkNotNull(maxFrameLength, FastBeeConstant.SERVER.MAXFRAMELENGTH); + ObjectUtil.checkPositive(maxFrameLength, FastBeeConstant.SERVER.MAXFRAMELENGTH); + // ObjectUtil.checkNotNull(delimiters,FastBeeConstant.SERVER.DELIMITERS); + + } + /*获取核数*/ + int processors = NettyRuntime.availableProcessors(); + this.workerCore = workerGroup > 0 ? workerGroup : processors + 2; + this.businessCore = businessGroup > 0 ? businessGroup : Math.max(1, processors >> 1); + this.readerIdleTime = readerIdleTime; + this.writerIdleTime = writerIdleTime; + this.allIdleTime = allIdleTime; + this.port = port; + this.maxFrameLength = maxFrameLength; + this.lengthField = lengthField; + this.delimiters = delimiters; + this.decoder = decoder; + this.encoder = encoder; + this.handlerMapping = handlerMapping; + this.handlerInterceptor = handlerInterceptor; + this.sessionManager = sessionManager != null ? sessionManager : new SessionManager(); + this.type = type; + + switch (type){ + case MQTT: + case WEBSOCKET: + this.name = name != null ? name : ServerType.MQTT.name(); + this.server = server; + this.server.config = this; + break; + default: + } + } + + + public Server build() { + return server; + } + + public static NettyConfig.Builder custom() { + return new Builder(); + } + + public static class Builder { + + private int workerCore; + private int businessCore ; + private int readerIdleTime = 240; + private int writerIdleTime = 0; + private int allIdleTime = 0; + private Integer port; + private Integer maxFrameLength; + private LengthField lengthField; + private Delimiter[] delimiters; + private MessageDecoder decoder; + private MessageEncoder encoder; + private HandlerMapping handlerMapping; + private HandlerInterceptor handlerInterceptor; + private SessionManager sessionManager; + private ServerType type; + private String name; + private Server server; + + public Builder() { + } + + public Builder setThreadGroup(int workerCore, int businessCore) { + this.workerCore = workerCore; + this.businessCore = businessCore; + return this; + } + + public Builder setIdleStateTime(int readerIdleTime, int writerIdleTime, int allIdleTime) { + this.readerIdleTime = readerIdleTime; + this.writerIdleTime = writerIdleTime; + this.allIdleTime = allIdleTime; + return this; + } + + public Builder setPort(Integer port) { + this.port = port; + return this; + } + + public Builder setServer(Server server){ + this.server = server; + return this; + } + + public Builder setMaxFrameLength(Integer maxFrameLength) { + this.maxFrameLength = maxFrameLength; + return this; + } + + public Builder setLengthField(LengthField lengthField) { + this.lengthField = lengthField; + return this; + } + + public Builder setDelimiters(byte[][] delimiters) { + Delimiter[] t = new Delimiter[delimiters.length]; + for (int i = 0; i < delimiters.length; i++) { + t[i] = new Delimiter(delimiters[i]); + } + this.delimiters = t; + return this; + } + + public Builder setDelimiters(Delimiter... delimiters) { + this.delimiters = delimiters; + return this; + } + + public Builder setDecoder(MessageDecoder decoder) { + this.decoder = decoder; + return this; + } + + public Builder setEncoder(MessageEncoder encoder) { + this.encoder = encoder; + return this; + } + + public Builder setHandlerMapping(HandlerMapping handlerMapping) { + this.handlerMapping = handlerMapping; + return this; + } + + public Builder setHandlerInterceptor(HandlerInterceptor handlerInterceptor) { + this.handlerInterceptor = handlerInterceptor; + return this; + } + + public Builder setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + return this; + } + + public Builder setType(ServerType type){ + this.type = type; + return this; + } + + + public Builder setName(String name) { + this.name = name; + return this; + } + + public Server build() { + return new NettyConfig( + this.workerCore, + this.businessCore, + this.readerIdleTime, + this.writerIdleTime, + this.allIdleTime, + this.port, + this.maxFrameLength, + this.lengthField, + this.delimiters, + this.decoder, + this.encoder, + this.handlerMapping, + this.handlerInterceptor, + this.sessionManager, + this.type, + this.name, + this.server + ).build(); + } + } +} diff --git a/springboot/fastbee-server/mqtt-broker/pom.xml b/springboot/fastbee-server/mqtt-broker/pom.xml new file mode 100644 index 00000000..0e7adad7 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + fastbee-server + com.fastbee + 3.8.5 + + + mqtt-broker + 基于netty搭建的mqttBroker + + + + com.fastbee + iot-server-core + + + + com.fastbee + fastbee-mq + + + + + + diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/annotation/Process.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/annotation/Process.java new file mode 100644 index 00000000..89210b09 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/annotation/Process.java @@ -0,0 +1,21 @@ +package com.fastbee.mqtt.annotation; + +import io.netty.handler.codec.mqtt.MqttMessageType; +import org.springframework.stereotype.Component; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +/*自动注入bean*/ +@Component +public @interface Process { + + + /*消息类型*/ + MqttMessageType type() default MqttMessageType.PUBLISH; +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/auth/AuthService.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/auth/AuthService.java new file mode 100644 index 00000000..322ff380 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/auth/AuthService.java @@ -0,0 +1,101 @@ +package com.fastbee.mqtt.auth; + +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.iot.model.MqttAuthenticationModel; +import com.fastbee.iot.service.IToolService; +import com.fastbee.mq.mqttClient.MqttClientConfig; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 客户端认证 + * + * @author gsb + * @date 2022/9/15 13:40 + */ +@Slf4j +@Component +public class AuthService { + + @Resource + private IToolService toolService; + @Resource + private RedisCache redisCache; + @Resource + private MqttClientConfig mqttConfig; + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + @Value("${server.broker.must-pass}") + private boolean mustPass; + + /** + * MQTT客户端认证 + * + * @param clientId 客户端id + * @param username 用户名 + * @param password 密码 + * @return 结果 + */ + public boolean auth(String clientId, String username, String password) { + //不需要账号密码校验,直接返回true + if (!mustPass) return true; + if (StringUtils.isEmpty(clientId) || StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { + log.error("=>客户端参数缺少,clientId:{},username:{},password:{}", clientId, username, password); + return false; + } + try { + if (clientId.startsWith("server")) { + // 服务端认证:配置的账号密码认证 + if (mqttConfig.getUsername().equals(username) && mqttConfig.getPassword().equals(password)) { + log.info("-----------服务端mqtt认证成功,clientId:" + clientId + "---------------"); + return true; + } else { + ResponseEntity response = toolService.returnUnauthorized(new MqttAuthenticationModel(clientId, username, password), "mqtt账号和密码与认证服务器配置不匹配"); + log.warn("=>服务端认证失败[{}]", response.getBody()); + throw new ServiceException("服务端认证失败:"+response.getBody()); + } + } else if (clientId.startsWith("web") || clientId.startsWith("phone")) { + // web端和移动端认证:token认证 + String token = password; + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + try { + Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + log.info("-----------移动端/Web端mqtt认证成功,clientId:" + clientId + "---------------"); + return true; + } catch (Exception ex) { + ResponseEntity response = toolService.returnUnauthorized(new MqttAuthenticationModel(clientId, username, password), ex.getMessage()); + log.warn("=>移动端/Web端mqtt认证失败[{}]",response.getBody()); + throw new ServiceException("移动端/Web端mqtt认证失败:"+response.getBody()); + } + } else { + // 设备端认证 + ResponseEntity response = toolService.clientAuth(clientId, username, password); + if (response.getStatusCodeValue() == HttpStatus.OK.value()) { + return true; + } else { + log.warn("=>设备端认证失败"); + throw new ServiceException("设备端认证失败:"+response.getBody()); + } + } + } catch (Exception e) { + log.error("=>客户端认证失败", e); + return false; + } + } + + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/codec/WebSocketMqttCodec.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/codec/WebSocketMqttCodec.java new file mode 100644 index 00000000..c90ec70c --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/codec/WebSocketMqttCodec.java @@ -0,0 +1,30 @@ +package com.fastbee.mqtt.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageCodec; +import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * ws协议与MQTT协议编码转换 + * @author gsb + * @date 2022/9/15 14:35 + */ +@ChannelHandler.Sharable +@Component +public class WebSocketMqttCodec extends MessageToMessageCodec { + + @Override + protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + list.add(new BinaryWebSocketFrame(byteBuf.retain())); + } + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, BinaryWebSocketFrame binaryWebSocketFrame, List list) throws Exception { + list.add(binaryWebSocketFrame.retain().content()); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttConnect.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttConnect.java new file mode 100644 index 00000000..4d61bdab --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttConnect.java @@ -0,0 +1,137 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.auth.AuthService; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ResponseManager; +import com.fastbee.mqtt.manager.SessionManger; +import com.fastbee.mqtt.manager.WillMessageManager; +import com.fastbee.mqtt.model.WillMessage; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.*; +import io.netty.util.CharsetUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.Resource; +import java.net.InetSocketAddress; + + +@Slf4j +@Process(type = MqttMessageType.CONNECT) +public class MqttConnect implements MqttHandler { + + @Autowired + private AuthService authService; + @Resource + private RedisCache redisCache; + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + MqttConnectMessage connectMessage = (MqttConnectMessage) message; + /*获取客户端Id*/ + String clientId = connectMessage.payload().clientIdentifier(); + if (clientId.contains("&")){ + clientId = clientId.split("&")[1]; + } + log.debug("=>客户端:{} 连接:{}", clientId, message); + /*获取session*/ + Session session = new Session(); + /*mqtt版本*/ + MqttVersion version = MqttVersion.fromProtocolNameAndLevel(connectMessage.variableHeader().name(), (byte) connectMessage.variableHeader().version()); + boolean cleanSession = connectMessage.variableHeader().isCleanSession(); + session.setHandlerContext(ctx); + session.setVersion(version); + session.setClientId(clientId); + session.setCleanSession(cleanSession); + session.setUsername(connectMessage.payload().userName()); + session.setConnected_at(DateUtils.getNowDate()); + InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress(); + session.setIp(socketAddress.getAddress().getHostAddress()); + session.setServerType(ServerType.MQTT); + /*设置客户端ping时间*/ + MqttConnectVariableHeader header = connectMessage.variableHeader(); + if (header.keepAliveTimeSeconds() > 0 && session.getKeepAliveMax() >= header.keepAliveTimeSeconds()) { + session.setKeepAlive(header.keepAliveTimeSeconds()); + } + /*mqtt客户端登录校验*/ + if (!check(session, connectMessage)) { + log.error("=>客户端:{},连接异常", clientId); + session.getHandlerContext().close(); + return; + } + + /*保存ClientId 和 session 到Attribute*/ + AttributeUtils.setClientId(ctx.channel(), clientId); + AttributeUtils.setSession(ctx.channel(), session); + SessionManger.removeClient(clientId); + session.setConnected(true); + + SessionManger.buildSession(clientId, session); + handleWill(connectMessage); + ResponseManager.responseMessage(session, + MqttMessageFactory.newMessage( + new MqttFixedHeader(MqttMessageType.CONNACK, false, MqttQoS.AT_MOST_ONCE, false, 0x02), + new MqttConnAckVariableHeader(MqttConnectReturnCode.CONNECTION_ACCEPTED, false), + null), + true + ); + } + + /** + * 遗嘱消息处理 + * + * @param message 连接消息 + */ + private void handleWill(MqttConnectMessage message) { + /*如果没有设置处理遗嘱消息,返回*/ + if (!message.variableHeader().isWillFlag()) { + return; + } + /*生成客户端model*/ + MqttPublishMessage publishMessage = (MqttPublishMessage) MqttMessageFactory.newMessage( + new MqttFixedHeader(MqttMessageType.PUBLISH, false, + MqttQoS.valueOf(message.variableHeader().willQos()), + message.variableHeader().isWillRetain(), 0), + new MqttPublishVariableHeader(message.payload().willTopic(), 0), + Unpooled.buffer().writeBytes(message.payload().willMessageInBytes())); + + WillMessage msg = new WillMessage(message.payload().clientIdentifier(), + message.variableHeader().isCleanSession(), message.payload().willTopic(), publishMessage); + WillMessageManager.push(msg); + } + + /** + * 客户端连接校验 + * + * @param session 客户端 + * @param message 连接消息 + * @return 结果 + */ + private boolean check(Session session, MqttConnectMessage message) { + /*获取客户端连接地址*/ + InetSocketAddress address = (InetSocketAddress) session.getHandlerContext().channel().remoteAddress(); + String host = address.getAddress().getHostAddress(); + /*webSocket客户端 系统内部客户端不校验*/ + String clientId = message.payload().clientIdentifier(); + /*根据用户名,密码校验*/ + String username = message.payload().userName(); + String password = message.payload().passwordInBytes() == null ? null : new String(message.payload().passwordInBytes(), CharsetUtil.UTF_8); + /*验证失败,应答客户端*/ + if (!authService.auth(clientId, username, password)) { + MqttConnAckMessage connAckMessage = MqttMessageUtils.buildConntAckMessage(MqttConnectReturnCode.CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD, false); + ResponseManager.responseMessage(session, connAckMessage, true); + return false; + } + return true; + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttDisConnect.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttDisConnect.java new file mode 100644 index 00000000..12ef4722 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttDisConnect.java @@ -0,0 +1,41 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.SessionManger; + +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; +import io.netty.handler.codec.mqtt.MqttMessageType; +import lombok.extern.slf4j.Slf4j; + + +@Process(type = MqttMessageType.DISCONNECT) +@Slf4j +public class MqttDisConnect implements MqttHandler { + + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + /*获取clientId*/ + String clientId = AttributeUtils.getClientId(ctx.channel()); + /*获取session*/ + Session session = AttributeUtils.getSession(ctx.channel()); + log.debug("=>客户端正常断开,clientId:[{}]", clientId); + try { + if (!session.getConnected()) { + session.getHandlerContext().close(); + return; + } + /*处理断开客户端连接*/ + SessionManger.pingTimeout(session.getClientId()); + /*移除相关topic*/ + ClientManager.remove(session.getClientId()); + } catch (Exception e) { + log.error("=>客户端断开连接异常:{}", session); + } + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPingreq.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPingreq.java new file mode 100644 index 00000000..ccc89a3c --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPingreq.java @@ -0,0 +1,37 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.ResponseManager; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.*; +import lombok.extern.slf4j.Slf4j; + +/** + * 客户端Ping消息应答 + * + * @author bill + */ +@Slf4j +@Process(type = MqttMessageType.PINGREQ) +public class MqttPingreq implements MqttHandler { + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + /*获取客户端id*/ + String clientId = AttributeUtils.getClientId(ctx.channel()); + try { + // log.debug("=>客户端:{},心跳信息", clientId); + /*更新客户端ping时间*/ + ClientManager.updatePing(clientId); + /*响应设备的ping消息*/ + MqttMessage pingResp = MqttMessageUtils.buildPingResp(); + ResponseManager.sendMessage(pingResp, clientId, true); + } catch (Exception e) { + log.error("=>客户端:{},ping异常:{}", clientId, e); + } + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubAck.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubAck.java new file mode 100644 index 00000000..73db00e5 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubAck.java @@ -0,0 +1,39 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.service.IMessageStore; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; +import io.netty.handler.codec.mqtt.MqttMessageType; +import io.netty.handler.codec.mqtt.MqttPubAckMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 消息等级=Qos1,收到发布消息确认 + * + * @author bill + */ +@Process(type = MqttMessageType.PUBACK) +@Slf4j +public class MqttPubAck implements MqttHandler { + + @Autowired + private IMessageStore messageStore; + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + MqttPubAckMessage ackMessage = (MqttPubAckMessage) message; + // PacketId + int packetId = ackMessage.variableHeader().messageId(); + Session session = AttributeUtils.getSession(ctx.channel()); + // Qos1 的存储消息释放 + messageStore.removePubMsg(packetId); + /*更新平台ping*/ + ClientManager.updatePing(session.getClientId()); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRec.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRec.java new file mode 100644 index 00000000..46a29707 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRec.java @@ -0,0 +1,47 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.ResponseManager; +import com.fastbee.mqtt.service.IMessageStore; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; +import io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader; +import io.netty.handler.codec.mqtt.MqttMessageType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 消息等级=Qos2 发布消息收到 交付第一步 + * + * @author bill + */ +@Process(type = MqttMessageType.PUBREC) +@Slf4j +public class MqttPubRec implements MqttHandler { + + @Autowired + private IMessageStore messageStore; + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + MqttMessageIdVariableHeader variableHeader = MqttMessageUtils.getIdVariableHeader(message); + //clientId + String clientId = AttributeUtils.getClientId(ctx.channel()); + Session session = AttributeUtils.getSession(ctx.channel()); + //获取packetId + int messageId = variableHeader.messageId(); + /*释放消息*/ + messageStore.removePubMsg(messageId); + messageStore.saveRelOutMsg(messageId); + // 回复REL 进入第二阶段 + MqttMessage mqttMessage = MqttMessageUtils.buildPubRelMessage(message); + ResponseManager.responseMessage(session, mqttMessage, true); + /*更新平台ping*/ + ClientManager.updatePing(session.getClientId()); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRel.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRel.java new file mode 100644 index 00000000..16c493cf --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubRel.java @@ -0,0 +1,41 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.ResponseManager; +import com.fastbee.mqtt.service.IMessageStore; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; +import io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader; +import io.netty.handler.codec.mqtt.MqttMessageType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 消息等级=Qos2 发布消息释放 PUBREL + * @author bill + */ +@Slf4j +@Process(type = MqttMessageType.PUBREL) +public class MqttPubRel implements MqttHandler { + + @Autowired + private IMessageStore messageStore; + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message){ + MqttMessageIdVariableHeader variableHeader = MqttMessageUtils.getIdVariableHeader(message); + Session session = AttributeUtils.getSession(ctx.channel()); + //获取packetId + int messageId = variableHeader.messageId(); + messageStore.removeRelInMsg(messageId); + MqttMessage mqttMessage = MqttMessageUtils.buildPubCompMessage(message); + ResponseManager.responseMessage(session,mqttMessage,true); + /*更新本地ping时间*/ + ClientManager.updatePing(session.getClientId()); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubcomp.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubcomp.java new file mode 100644 index 00000000..543c1149 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPubcomp.java @@ -0,0 +1,38 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.service.IMessageStore; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; +import io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader; +import io.netty.handler.codec.mqtt.MqttMessageType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 消息等级=Qos2 发布消息完成 + * @author bill + */ +@Process(type = MqttMessageType.PUBCOMP) +@Slf4j +public class MqttPubcomp implements MqttHandler { + + @Autowired + private IMessageStore messageStore; + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message){ + MqttMessageIdVariableHeader variableHeader = MqttMessageUtils.getIdVariableHeader(message); + Session session = AttributeUtils.getSession(ctx.channel()); + //获取packetId + int messageId = variableHeader.messageId(); + messageStore.removeRelOutMsg(messageId); + /*更新平台ping*/ + ClientManager.updatePing(session.getClientId()); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPublish.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPublish.java new file mode 100644 index 00000000..ca89598b --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttPublish.java @@ -0,0 +1,204 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.mq.redischannel.producer.MessageProducer; +import com.fastbee.mq.service.IDeviceReportMessageService; +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.ResponseManager; +import com.fastbee.mqtt.manager.RetainMsgManager; +import com.fastbee.mqtt.model.ClientMessage; +import com.fastbee.mqtt.service.IMessageStore; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.*; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.Resource; + +/** + * 客户端消息推送处理类 + * + * @author bill + */ +@Slf4j +@Process(type = MqttMessageType.PUBLISH) +public class MqttPublish implements MqttHandler { + + @Autowired + private IMessageStore messageStore; + @Resource + private TopicsUtils topicsUtils; + @Resource + private RedisCache redisCache; + @Resource + private IDeviceReportMessageService deviceReportMessageService; + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + MqttPublishMessage publishMessage = (MqttPublishMessage) message; + /*获取客户端id*/ + String clientId = AttributeUtils.getClientId(ctx.channel()); + String topicName = publishMessage.variableHeader().topicName(); + log.debug("=>***客户端[{}],主题[{}],推送消息[{}]", clientId, topicName, + ByteBufUtil.hexDump(publishMessage.content())); + // 以get结尾是模拟客户端数据,只转发消息 + if (topicName.endsWith(FastBeeConstant.MQTT.PROPERTY_GET_SIMULATE)) { + sendTestToMQ(publishMessage); + } else { + /*获取客户端session*/ + Session session = AttributeUtils.getSession(ctx.channel()); + /*推送保留信息*/ + pubRetain(publishMessage); + /*响应客户端消息到达Broker*/ + callBack(session, publishMessage, clientId); + /*推送到订阅的客户端*/ + sendMessageToClients(publishMessage); + /*推送到MQ处理*/ + sendToMQ(publishMessage); + /*累计接收消息数*/ + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_RECEIVE_TOTAL, -1L); + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_RECEIVE_TODAY, 60 * 60 * 24); + } + } + + /** + * 消息推送 + * + * @param message 推送消息 + */ + @SneakyThrows + public void sendToMQ(MqttPublishMessage message) { + /*获取topic*/ + String topicName = message.variableHeader().topicName(); + /*只处理上报数据*/ + if (!topicName.endsWith(FastBeeConstant.MQTT.UP_TOPIC_SUFFIX)) { + return; + } + DeviceReportBo reportBo = DeviceReportBo.builder() + .serialNumber(topicsUtils.parseSerialNumber(topicName)) + .topicName(topicName) + .packetId((long) message.variableHeader().packetId()) + .platformDate(DateUtils.getNowDate()) + .data(ByteBufUtil.getBytes(message.content())) + .serverType(ServerType.MQTT) + .build(); + if (topicName.endsWith(FastBeeConstant.TOPIC.MSG_REPLY) || + topicName.endsWith(FastBeeConstant.TOPIC.SUB_UPGRADE_REPLY) || + topicName.endsWith(FastBeeConstant.TOPIC.UPGRADE_REPLY)) { + /*设备应答服务器回调数据*/ + reportBo.setReportType(2); + } else { + /*设备上报数据*/ + reportBo.setReportType(1); + } + if (topicName.contains("property")) { + deviceReportMessageService.parseReportMsg(reportBo); + } + + } + + /** + * 发送模拟数据进行处理 + * @param message + */ + public void sendTestToMQ(MqttPublishMessage message) { + /*获取topic*/ + String topicName = message.variableHeader().topicName(); + DeviceReportBo reportBo = DeviceReportBo.builder() + .serialNumber(topicsUtils.parseSerialNumber(topicName)) + .topicName(topicName) + .packetId((long) message.variableHeader().packetId()) + .platformDate(DateUtils.getNowDate()) + .data(ByteBufUtil.getBytes(message.content())) + .build(); + MessageProducer.sendOtherMsg(reportBo); + } + + + /** + * 推送消息到订阅客户端 + * + * @param message 消息 + */ + public void sendMessageToClients(MqttPublishMessage message) { + ClientManager.pubTopic(message); + } + + + /** + * 应答客户端,消息到达Broker + * + * @param session 客户端 + * @param message 消息 + */ + private void callBack(Session session, MqttPublishMessage message, String clientId) { + /*获取消息等级*/ + MqttQoS mqttQoS = message.fixedHeader().qosLevel(); + int packetId = message.variableHeader().packetId(); + MqttFixedHeader header; + switch (mqttQoS.value()) { + /*0,1消息等级,直接回复*/ + case 0: + case 1: + header = new MqttFixedHeader(MqttMessageType.PUBACK, false, mqttQoS, false, 0); + break; + case 2: + // 处理Qos2的消息确认 + if (!messageStore.outRelContains(packetId)) { + messageStore.saveRelInMsg(packetId); + } + header = new MqttFixedHeader(MqttMessageType.PUBREC, false, MqttQoS.AT_MOST_ONCE, false, 0); + break; + default: + header = null; + } + /*处理消息等级*/ + handleMqttQos(packetId, mqttQoS, true, clientId); + /*响应客户端*/ + MqttMessageIdVariableHeader variableHeader = null; + if (packetId > 0) { + variableHeader = MqttMessageIdVariableHeader.from(packetId); + } + MqttPubAckMessage ackMessage = new MqttPubAckMessage(header, variableHeader); + if (mqttQoS.value() >= 1) { + ResponseManager.responseMessage(session, ackMessage, true); + } + /*更新客户端ping时间*/ + ClientManager.updatePing(session.getClientId()); + + } + + /** + * Qos不同消息处理 + */ + private void handleMqttQos(int packetId, MqttQoS qoS, boolean clearSession, String clientId) { + if (qoS == MqttQoS.AT_LEAST_ONCE || qoS == MqttQoS.EXACTLY_ONCE) { + ClientMessage clientMessage = ClientMessage.of(clientId, qoS, null, false); + messageStore.savePubMsg(packetId, clientMessage); + } + } + + + /** + * 推送保留信息 + */ + @SneakyThrows + private void pubRetain(MqttPublishMessage message) { + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_RETAIN_TOTAL, -1L); + /*根据message.fixedHeader().isRetain() 判断是否有保留信息*/ + RetainMsgManager.pushMessage(message); + } + + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttSubscribe.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttSubscribe.java new file mode 100644 index 00000000..eaac09e8 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttSubscribe.java @@ -0,0 +1,107 @@ +package com.fastbee.mqtt.handler; + +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.model.ClientMessage; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import com.fastbee.mqtt.model.RetainMessage; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.ResponseManager; +import com.fastbee.mqtt.manager.RetainMsgManager; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.*; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + + +@Slf4j +@Process(type = MqttMessageType.SUBSCRIBE) +public class MqttSubscribe implements MqttHandler { + + @Resource + private RedisCache redisCache; + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + subscribe(ctx, (MqttSubscribeMessage) message); + } + + + public void subscribe(ChannelHandlerContext ctx, MqttSubscribeMessage message) { + /*获取session*/ + Session session = AttributeUtils.getSession(ctx.channel()); + /*获取客户端订阅的topic列表*/ + List topList = message.payload().topicSubscriptions(); + /*获取topicName列表*/ + List topicNameList = topList.stream().map(MqttTopicSubscription::topicName).collect(Collectors.toList()); + log.debug("=>客户端:{},订阅主题:{}", session.getClientId(), JSON.toJSONString(topicNameList)); + if (!TopicsUtils.validTopicFilter(topicNameList)) { + log.error("=>订阅主题不合法:{}", JSON.toJSONString(topicNameList)); + return; + } + /*存储到本地topic缓存*/ + topicNameList.forEach(topicName -> { + ClientManager.push(topicName, session); + /*累计订阅数*/ + redisCache.incr2(FastBeeConstant.REDIS.MESSAGE_SUBSCRIBE_TOTAL,-1L); + }); + /*更新客户端ping*/ + ClientManager.updatePing(session.getClientId()); + /*应答客户端订阅成功*/ + MqttSubAckMessage subAckMessage = MqttMessageUtils.buildSubAckMessage(message); + ResponseManager.responseMessage(session, subAckMessage, true); + /*客户端订阅了遗留消息主题后,推送遗留消息给客户端*/ + topList.forEach(topic -> { + retain(topic.topicName(), session, topic.qualityOfService()); + }); + } + + + /** + * 推送遗留消息 + * + * @param topicName 主题 + * @param session 客户端 + * @param mqttQoS 消息质量 + */ + @SneakyThrows + private void retain(String topicName, Session session, MqttQoS mqttQoS) { + RetainMessage message = RetainMsgManager.getRetain(topicName); + if (null == message) { + return; + } + MqttQoS qos = message.getQos() > mqttQoS.value() ? mqttQoS : MqttQoS.valueOf(message.getQos()); + switch (qos.value()) { + case 0: + buildMessage(qos, topicName, 0, message.getMessage(), session); + break; + case 1: + case 2: + /*使用实时时间戳充当 packId*/ + buildMessage(qos, topicName, (int) System.currentTimeMillis(), message.getMessage(), session); + break; + } + } + + /*组装推送数据*/ + private void buildMessage(MqttQoS qos, String topicName, int packetId, byte[] message, Session session) { + /*生成客户端model*/ + ClientMessage clientMessage = ClientMessage.of(qos, topicName, false, message); + /*组建推送消息*/ + MqttPublishMessage publishMessage = MqttMessageUtils.buildPublishMessage(clientMessage, packetId); + /*推送消息*/ + ResponseManager.publishClients(publishMessage, session); + } + + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttUnsubscribe.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttUnsubscribe.java new file mode 100644 index 00000000..640236bb --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/MqttUnsubscribe.java @@ -0,0 +1,38 @@ +package com.fastbee.mqtt.handler; + +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.mqtt.handler.adapter.MqttHandler; +import com.fastbee.mqtt.manager.ClientManager; +import com.fastbee.mqtt.manager.ResponseManager; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; +import io.netty.handler.codec.mqtt.MqttMessageType; +import io.netty.handler.codec.mqtt.MqttUnsubAckMessage; +import io.netty.handler.codec.mqtt.MqttUnsubscribeMessage; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + + +@Slf4j +@Process(type = MqttMessageType.UNSUBSCRIBE) +public class MqttUnsubscribe implements MqttHandler { + + @Override + public void handler(ChannelHandlerContext ctx, MqttMessage message) { + MqttUnsubscribeMessage unsubscribeMessage = (MqttUnsubscribeMessage) message; + List topics = unsubscribeMessage.payload().topics(); + log.debug("=>收到取消订阅请求,topics[{}]", topics); + Session session = AttributeUtils.getSession(ctx.channel()); + topics.forEach(topic -> { + ClientManager.unsubscribe(topic, session); + }); + MqttUnsubAckMessage unsubAckMessage = MqttMessageUtils.buildUnsubAckMessage(unsubscribeMessage); + ResponseManager.responseMessage(session, unsubAckMessage, true); + /*更新客户端平台时间*/ + ClientManager.updatePing(session.getClientId()); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttHandler.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttHandler.java new file mode 100644 index 00000000..aad6dbe2 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttHandler.java @@ -0,0 +1,12 @@ +package com.fastbee.mqtt.handler.adapter; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; + +/** + * @author bill + */ +public interface MqttHandler { + + public void handler(ChannelHandlerContext ctx, MqttMessage message); +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageAdapter.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageAdapter.java new file mode 100644 index 00000000..220e7cb4 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageAdapter.java @@ -0,0 +1,89 @@ +package com.fastbee.mqtt.handler.adapter; + +import com.fastbee.common.exception.iot.MqttAuthorizationException; +import com.fastbee.common.exception.iot.MqttClientUserNameOrPassException; +import com.fastbee.mqtt.manager.SessionManger; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.mqtt.*; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.Optional; + +/** + * @author gsb + * @date 2022/9/15 10:34 + */ +@Slf4j +@Component +@ChannelHandler.Sharable +public class MqttMessageAdapter extends SimpleChannelInboundHandler { + + + // @Autowired + private MqttMessageDelegate messageDelegate; + + public MqttMessageAdapter(MqttMessageDelegate delegate) { + this.messageDelegate = delegate; + } + + /** + * 客户端上报消息处理 + * + * @param context 上下文 + * @param message 消息 + */ + @Override + @SuppressWarnings("ThrowableResultOfMethodCallIgnored") + protected void channelRead0(ChannelHandlerContext context, MqttMessage message) { + try { + /*校验消息*/ + if (message.decoderResult().isFailure()) { + exceptionCaught(context, message.decoderResult().cause()); + return; + } + messageDelegate.process(context, message); + }catch (Exception e){ + log.error("=>数据进栈异常",e); + } + } + + /** + * 客户端心跳处理 + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress(); + String host = socketAddress.getAddress().getHostAddress(); + int port = socketAddress.getPort(); + String clientId = AttributeUtils.getClientId(ctx.channel()); + if (evt instanceof IdleStateEvent) { + IdleStateEvent idleStateEvent = (IdleStateEvent) evt; + IdleState state = idleStateEvent.state(); + if (state == IdleState.ALL_IDLE || state == IdleState.READER_IDLE || state == IdleState.WRITER_IDLE) { + log.error("客户端id[{}] 客户端[{}]port:[{}]心跳超时!",clientId, host, port); + /*关闭通道*/ + ctx.close(); + } + } else { + super.userEventTriggered(ctx, evt); + } + } + + /** + * 处理消息异常情况 + */ + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + log.error("=>mqtt连接异常",cause); + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageDelegate.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageDelegate.java new file mode 100644 index 00000000..558df7b4 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/handler/adapter/MqttMessageDelegate.java @@ -0,0 +1,58 @@ +package com.fastbee.mqtt.handler.adapter; + +import com.fastbee.common.exception.ServiceException; +import com.fastbee.mqtt.annotation.Process; +import com.fastbee.base.util.AttributeUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessage; +import io.netty.handler.codec.mqtt.MqttMessageType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * 消息代理类,根据注解{@link com.fastbee.mqtt.annotation.Process} 分发处理类 + * @author gsb + * @date 2022/10/8 11:50 + */ +@Component +@Slf4j +public class MqttMessageDelegate { + /**mqtt报文类型为key,报文处理类为值*/ + private final Map processor = new HashMap<>(); + + public MqttMessageDelegate(List handlers){ + if (CollectionUtils.isEmpty(handlers)){ + throw new ServiceException("报文处理类为空"); + } + /*将处理类缓存到map*/ + handlers.forEach(handler ->{ + Process annotation = handler.getClass().getAnnotation(Process.class); + Optional.ofNullable(annotation) + .map(Process::type) + .ifPresent(messageType ->processor.put(messageType,handler)); + }); + } + + /** + * 匹配报文处理类 + */ + public void process(ChannelHandlerContext ctx, MqttMessage message){ + /*获取固定头的报文类型*/ + MqttMessageType messageType = message.fixedHeader().messageType(); + + /*处理客户端连接时,先判断Attribute是否存储Session*/ + if (MqttMessageType.CONNECT != messageType && + AttributeUtils.getSession(ctx.channel()) == null){ + log.error("=>客户端未连接"); + throw new ServiceException("客户端未连接"); + } + Optional.of(processor.get(messageType)) + .ifPresent(mqttHandler -> mqttHandler.handler(ctx,message)); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ClientManager.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ClientManager.java new file mode 100644 index 00000000..4d77780d --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ClientManager.java @@ -0,0 +1,174 @@ +package com.fastbee.mqtt.manager; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.base.session.Session; +import io.netty.handler.codec.mqtt.MqttPublishMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 客户端管理 + * + * @author gsb + * @date 2022/9/15 16:02 + */ +@Slf4j +public class ClientManager { + + /*topic本地缓存*/ + public static Map> topicMap = new ConcurrentHashMap<>(); + /*客户端最后一次ping时间,设备不正常断开判断*/ + private static Map pingMap = new ConcurrentHashMap<>(); + /*客户端与topic关联本地缓存*/ + public static Map> clientTopicMap = new ConcurrentHashMap<>(); + + /** + * 将client的上下文相关信息添加到映射关系表中 + * @param topic 主题 + * @param session + */ + public static void push(String topic, Session session) { + try { + /*处理topic对应的topic*/ + Map clientMap = topicMap.get(topic); + if (StringUtils.isEmpty(clientMap)) { + clientMap = new ConcurrentHashMap<>(); + } + clientMap.put(session.getClientId(), session); + topicMap.put(topic, clientMap); + + /*处理client对应的所有topic*/ + Map topicsMap = null; + if (clientTopicMap.containsKey(session.getClientId())) { + topicsMap = clientTopicMap.get(session.getClientId()); + if (!topicsMap.containsKey(topic)) { + topicsMap.put(topic, true); + } + } else { + topicsMap = new HashMap<>(); + topicsMap.put(topic, true); + clientTopicMap.put(session.getClientId(), topicsMap); + } + } catch (Exception e) { + log.error("=>clientId映射topic出现异常:{},e=", e.getMessage(), e); + } + } + + /** + * 清理对应client下的所有数据 + * + * @param clientId 客户端id + */ + public static void remove(String clientId) { + try { + /*移除client对应的topic*/ + Map topics = clientTopicMap.get(clientId); + if (null != topics) { + /*从topic中移除client*/ + for (String key : topics.keySet()) { + Map clientMap = topicMap.get(key); + if (CollectionUtils.isEmpty(clientMap)) { + continue; + } + clientMap.remove(clientId); + } + clientTopicMap.remove(clientId); + } + pingMap.remove(clientId); + } catch (Exception e) { + log.warn("=>移除client[{}]异常", e.getMessage()); + } + } + + /** + * 客户端取消订阅 + * 删除指定topic下的指定client + * + * @param topic 主题 + * @param session 客户端 + */ + public static void unsubscribe(String topic, Session session) { + try { + Map clientMap = topicMap.get(topic); + if (StringUtils.isEmpty(clientMap)) { + return; + } + Session s = clientMap.get(session.getClientId()); + if (null == s) { + return; + } + clientMap.remove(session.getClientId()); + } catch (Exception e) { + log.error("=>客户端取消订阅异常:{}", e.getMessage()); + } + } + + /** + * 将消息发送到指定topic下的所有client上去 + * + * @param msg 推送消息 + */ + public static void pubTopic(MqttPublishMessage msg) { + String topic = msg.variableHeader().topicName(); + List topicList = TopicsUtils.searchTopic(topic); + for (String itemTopic : topicList) { + Map clientMap = topicMap.get(itemTopic); + if (StringUtils.isEmpty(clientMap)) { + continue; + } + for (Session session : clientMap.values()) { + String clientId = session.getClientId(); + if (!validClient(clientId)) { + ///*ws的客户端不正常断开连接后,直接移除所有信息*/ + //if (session.getClientId().startsWith(FastBeeConstant.SERVER.WS_PREFIX)) { + // log.debug("=>移除ws客户端,clientId={}", session); + // remove(clientId); + //} + log.warn("=>{}不在线", clientId); + continue; + } + ResponseManager.publishClients(msg, session); + } + } + } + + /** + * 更新客户端在线时间,给客户端发送消息时用这个看客户端最近是否在线 + * 用来判断设备不正常掉线没有应答服务器的情况 + * + * @param clientId 客户端id + */ + public static void updatePing(String clientId) { + pingMap.put(clientId, DateUtils.getTimestamp()); + } + + /** + * 平台判定设备状态 Ping客户端是否在线 + * + * @param clientId 客户端id + * @return 结果 + */ + public static Boolean validClient(String clientId) { + long currTime = DateUtils.getTimestamp(); + /*获取客户端连接时,时间*/ + Long timestamp = pingMap.get(clientId); + if (null == timestamp) { + return false; + } + //当设备缓存的心跳时间大于 平台判断时间 1.5f 表示设备不正常断开了服务器 + if (currTime - timestamp > FastBeeConstant.SERVER.DEVICE_PING_EXPIRED) { + //pingMap.remove(clientId); + //SessionManger.removeClient(clientId); + return false; + } + return true; + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/MqttRemoteManager.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/MqttRemoteManager.java new file mode 100644 index 00000000..adc0aa57 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/MqttRemoteManager.java @@ -0,0 +1,77 @@ +package com.fastbee.mqtt.manager; + +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.common.enums.TopicType; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.mq.mqttClient.PubMqttClient; +import com.fastbee.mqtt.model.PushMessageBo; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.mqtt.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; + + +@Component +public class MqttRemoteManager { + + @Resource + private TopicsUtils topicsUtils; + @Resource + private IDeviceService deviceService; + /** + * true: 使用netty搭建的mqttBroker false: 使用emq + */ + @Value("${server.broker.enabled}") + private Boolean enabled; + + @Resource + private PubMqttClient pubMqttClient; + + /** + * 推送设备状态 + * @param serialNumber 设备 + * @param status 状态 + */ + public void pushDeviceStatus(Long productId, String serialNumber, DeviceStatus status){ + //兼容emqx推送TCP客户端上线 + Device device = deviceService.selectDeviceNoModel(serialNumber); + String message = "{\"status\":" + status.getType() + ",\"isShadow\":" + device.getIsShadow() + ",\"rssi\":" + device.getRssi() + "}"; + String topic = topicsUtils.buildTopic(device.getProductId(), serialNumber, TopicType.STATUS_POST); + if (enabled){ + MqttPublishMessage publishMessage = (MqttPublishMessage) MqttMessageFactory.newMessage( + new MqttFixedHeader(MqttMessageType.PUBLISH, false, MqttQoS.AT_MOST_ONCE, false, 0), + new MqttPublishVariableHeader(topic, 0), + Unpooled.buffer().writeBytes(message.getBytes(StandardCharsets.UTF_8)) + ); + ClientManager.pubTopic(publishMessage); + }else { + //emqx直接用客户端推送 + pubMqttClient.publish(1,false,topic,message); + } + + } + + /** + * 公共推送消息方法 + * @param bo 消息体 + */ + public void pushCommon(PushMessageBo bo){ + //netty版本发送 + if (enabled){ + MqttPublishMessage publishMessage = (MqttPublishMessage) MqttMessageFactory.newMessage( + new MqttFixedHeader(MqttMessageType.PUBLISH, false, MqttQoS.AT_MOST_ONCE, false, 0), + new MqttPublishVariableHeader(bo.getTopic(), 0), + Unpooled.buffer().writeBytes(bo.getMessage().getBytes(StandardCharsets.UTF_8)) + ); + ClientManager.pubTopic(publishMessage); + }else { + pubMqttClient.publish(0,false,bo.getTopic(), bo.getMessage()); + } + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ResponseManager.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ResponseManager.java new file mode 100644 index 00000000..0b5ebfe6 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/ResponseManager.java @@ -0,0 +1,76 @@ +package com.fastbee.mqtt.manager; + +import com.fastbee.base.session.Session; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.handler.codec.mqtt.*; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class ResponseManager { + + + /** + * 发送信息:用于服务端收到消息客户端数据后,向客户端发送响应信息 + * + * @param session 上下文 + * @param msg mqtt消息 + * @param flush 是否刷新 + */ + public static void responseMessage(Session session, MqttMessage msg, boolean flush) { + ChannelFuture future = flush ? session.getHandlerContext().writeAndFlush(msg) : session.getHandlerContext().write(msg); + future.addListener(f -> { + if (!f.isSuccess()) { + log.error("=>响应设备[{}],发送消息:{},失败原因:{}", session.getClientId(), msg, f.cause()); + }else { + //log.debug("=>相应设备:[{}],发送消息:[{}]",session.getClientId(),msg); + } + }); + } + + /** + * 发送信息:用于服务端向客户端通过clientID下发消息(单客户端) + * + * @param msg mqtt消息 + * @param clientId 客户端id + * @param flush 是否刷新 + */ + public static void sendMessage(MqttMessage msg, String clientId, boolean flush) { + Session session = SessionManger.getSession(clientId); + if (session == null || null == session.getHandlerContext()) { + return; + } + responseMessage(session, msg, flush); + } + + /** + * 推送消息给订阅客户端(所有订阅客户端) + * + * @param msg 推送消息 + * @param session 客户端 + */ + public static void publishClients(MqttPublishMessage msg, Session session) { + try { + final Channel channel = session.getHandlerContext().channel(); + MqttQoS qos = msg.fixedHeader().qosLevel(); + ByteBuf sendBuf = msg.content().retainedDuplicate(); + sendBuf.resetReaderIndex(); + /*配置推送消息类型*/ + MqttFixedHeader Header = new MqttFixedHeader(MqttMessageType.PUBLISH, + false, qos, msg.fixedHeader().isRetain(), 0); + /*设置topic packetId*/ + MqttPublishVariableHeader publishVariableHeader = new MqttPublishVariableHeader( + msg.variableHeader().topicName(), msg.variableHeader().packetId()); + /*推送消息*/ + MqttPublishMessage publishMessage = new MqttPublishMessage(Header, + publishVariableHeader, sendBuf); + channel.writeAndFlush(publishMessage); + + } catch (Exception e) { + log.error("=>发送消息异常 {}", msg, e); + } + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/RetainMsgManager.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/RetainMsgManager.java new file mode 100644 index 00000000..0450883f --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/RetainMsgManager.java @@ -0,0 +1,53 @@ +package com.fastbee.mqtt.manager; + +import com.fastbee.mqtt.model.RetainMessage; +import io.netty.handler.codec.mqtt.MqttPublishMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +@Slf4j +@Component +public class RetainMsgManager { + + /*保存topic的retain消息*/ + private static Map retainMap = new ConcurrentHashMap<>(); + + /** + * 推送保留信息到订阅客户端 + * + * @param message 推送消息 + */ + public static void pushMessage(MqttPublishMessage message) { + if (null == message || !message.fixedHeader().isRetain()) { + return; + } + byte[] bytes = new byte[message.payload().readableBytes()]; + if (bytes.length > 0) { + RetainMessage retainMsg = RetainMessage.builder() + .topic(message.variableHeader().topicName()) + .qos(message.fixedHeader().qosLevel().value()).message(bytes).build(); + retainMap.put(message.variableHeader().topicName(), retainMsg); + } else { + retainMap.remove(message.variableHeader().topicName()); + } + } + + public static Integer getSize() { + return retainMap.size(); + } + + /** + * 获取消息 + * + * @param topic 主题 + * @return 消息 + */ + public static RetainMessage getRetain(String topic) { + return retainMap.get(topic); + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/SessionManger.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/SessionManger.java new file mode 100644 index 00000000..21591b64 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/SessionManger.java @@ -0,0 +1,162 @@ +package com.fastbee.mqtt.manager; + +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.common.core.mq.DeviceStatusBo; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.spring.SpringUtils; +import com.fastbee.iot.service.cache.IDeviceCache; +import com.fastbee.mq.redischannel.producer.MessageProducer; +import com.fastbee.mq.service.IMessagePublishService; +import com.fastbee.base.service.ISessionStore; +import com.fastbee.base.session.Session; +import com.fastbee.base.util.AttributeUtils; +import com.fastbee.mqtt.utils.MqttMessageUtils; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.MqttMessageType; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.Set; + +/** + * 会话管理类 + * + * @Author guanshubiao + * @Date 2022/9/12 20:22 + */ +@Slf4j +public class SessionManger { + + + private static ISessionStore sessionStore = SpringUtils.getBean(ISessionStore.class); + private static MqttRemoteManager remoteManager = SpringUtils.getBean(MqttRemoteManager.class); + private static IDeviceCache deviceCache = SpringUtils.getBean(IDeviceCache.class); + + /** + * mqtt新客户连接 + * + * @param clientId 客户端id + * @param session 客户端 + */ + public static void buildSession(String clientId, Session session) { + log.debug("=>新客户端连接,clientId={}", clientId); + if (StringUtils.isEmpty(clientId) || handleContext(session)) { + log.error("=>客户端id为空或者session未注册!"); + return; + } + + sessionStore.storeSession(clientId, session); + //contextMap.put(session.getHandlerContext(), session); + /*更新客户端在平台的最新响应时间*/ + ClientManager.updatePing(clientId); + /*发送MQ,设备上线*/ + DeviceStatusBo statusBo = MqttMessageUtils.buildStatusMsg(session.getHandlerContext(), session.getClientId(), DeviceStatus.ONLINE, session.getIp()); + if (!statusBo.getSerialNumber().startsWith(FastBeeConstant.SERVER.WM_PREFIX) && + !statusBo.getSerialNumber().startsWith(FastBeeConstant.SERVER.WS_PREFIX) && + !statusBo.getSerialNumber().startsWith(FastBeeConstant.SERVER.FAST_PHONE)) { + deviceCache.updateDeviceStatusCache(statusBo); + remoteManager.pushDeviceStatus(-1L,statusBo.getSerialNumber(), statusBo.getStatus()); + } + } + + /** + * 根据客户端id移除客户端 + * + * @param clientId 客户端id + */ + public static void removeClient(String clientId) { + log.debug("=>移除客户端,clientId={}", clientId); + try { + if (StringUtils.isEmpty(clientId) || !sessionStore.containsKey(clientId) || clientId.endsWith(FastBeeConstant.SERVER.WS_PREFIX) || + clientId.endsWith(FastBeeConstant.SERVER.FAST_PHONE)) { + return; + } + Session session = sessionStore.getSession(clientId); + if (handleContext(session)) { + log.error("移除客户端失败,客户端未注册!"); + return; + } + //关闭通道 + session.getHandlerContext().close(); + //移除client + sessionStore.cleanSession(clientId); + session.setMqttMessageType(MqttMessageType.DISCONNECT); + //发送至MQ,设备下线 + DeviceStatusBo statusBo = MqttMessageUtils.buildStatusMsg(session.getHandlerContext(), session.getClientId(), DeviceStatus.OFFLINE, session.getIp()); + if (!statusBo.getSerialNumber().startsWith(FastBeeConstant.SERVER.WM_PREFIX) && + !statusBo.getSerialNumber().startsWith(FastBeeConstant.SERVER.WS_PREFIX)) { + deviceCache.updateDeviceStatusCache(statusBo); + remoteManager.pushDeviceStatus(-1L,statusBo.getSerialNumber(), statusBo.getStatus()); + } + } catch (Exception e) { + throw new ServiceException("移除客户端失败,message=" + e.getMessage()); + } + } + + /** + * 根据客户通道移除客户端 + * + * @param ctx 上下文通道 + */ + public static void removeContextByContext(ChannelHandlerContext ctx) { + try { + /*获取*/ + Session session = AttributeUtils.getSession(ctx.channel()); + if (handleContext(session)) { + log.error("=>客户端通道不存在!移除失败"); + return; + } + sessionStore.cleanSession(session.getClientId()); + session.setMqttMessageType(MqttMessageType.DISCONNECT); + //发送至MQ,设备下线 + DeviceStatusBo statusBo = MqttMessageUtils.buildStatusMsg(session.getHandlerContext(), session.getClientId(), DeviceStatus.OFFLINE, session.getIp()); + if (!statusBo.getSerialNumber().startsWith(FastBeeConstant.SERVER.WM_PREFIX) && + !statusBo.getSerialNumber().startsWith(FastBeeConstant.SERVER.WS_PREFIX)) { + deviceCache.updateDeviceStatusCache(statusBo); + remoteManager.pushDeviceStatus(-1L,statusBo.getSerialNumber(), statusBo.getStatus()); + } + } catch (Exception e) { + log.error("=>移除客户端失败={}", e.getMessage()); + } + } + + /** + * ping判定时间超时 + * + * @param clientId 客户id + */ + public static void pingTimeout(String clientId) { + try { + removeClient(clientId); + } catch (Exception e) { + throw new ServiceException("移除超时客户端失败"); + } + } + + /** + * 根据clientId获取客户通道 + * + * @param clientId 客户端id + * @return session + */ + public static Session getSession(String clientId) { + return sessionStore.getSession(clientId); + } + + /** + * 校验Session已经注册通道 + * + * @param session 客户端 + * @return 结果 + */ + private static boolean handleContext(Session session) { + if (null == session || null == session.getHandlerContext()) { + return true; + } + return false; + } + + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/WillMessageManager.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/WillMessageManager.java new file mode 100644 index 00000000..a0c1ab90 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/manager/WillMessageManager.java @@ -0,0 +1,30 @@ +package com.fastbee.mqtt.manager; + +import com.fastbee.mqtt.model.WillMessage; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +@Slf4j +public class WillMessageManager { + + private static Map map = new ConcurrentHashMap<>(); + + public static void push(WillMessage message){ + map.put(message.getClientId(),message); + } + + public static void pop(String clientId){ + try { + WillMessage message = map.get(clientId); + if (null == message){ + return; + } + ClientManager.pubTopic(message.getMessage()); + }catch (Exception e){ + log.error("=>发送客户端[{}],遗嘱消息异常",e.getMessage(),e); + } + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/ClientMessage.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/ClientMessage.java new file mode 100644 index 00000000..299944f6 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/ClientMessage.java @@ -0,0 +1,45 @@ +package com.fastbee.mqtt.model; + +import io.netty.handler.codec.mqtt.MqttQoS; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author gsb + * @date 2022/10/7 19:04 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ClientMessage { + + /*共享主题客户端id,不为空则指定客户端发送*/ + private String sharedClientId; + /*客户端id*/ + private String clientId; + /*消息质量*/ + private MqttQoS qos; + /*topic*/ + private String topicName; + /*是否保留消息*/ + private boolean retain; + /*数据*/ + private byte[] payload; + + private int messageId; + /*是否是遗嘱消息*/ + private boolean willFlag; + /*是否是dup消息*/ + private boolean dup; + + + public static ClientMessage of(MqttQoS qos,String topicName,boolean retain, byte[] payload){ + return new ClientMessage(null,null,qos,topicName,retain,payload,0,false,false); + } + + public static ClientMessage of(String clientId,MqttQoS qos,String topicName,boolean retain){ + return new ClientMessage(null,clientId,qos,topicName,retain,null,0,false,false); + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/PushMessageBo.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/PushMessageBo.java new file mode 100644 index 00000000..5c1cf75c --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/PushMessageBo.java @@ -0,0 +1,23 @@ +package com.fastbee.mqtt.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author bill + */ +@Data +public class PushMessageBo implements Serializable { + + /*主题*/ + private String topic; + /*数据*/ + private String message; + /*消息质量*/ + private int qos; + + private Integer value; + private Integer address; + private Integer slaveId; +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/RetainMessage.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/RetainMessage.java new file mode 100644 index 00000000..cb5db04d --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/RetainMessage.java @@ -0,0 +1,23 @@ +package com.fastbee.mqtt.model; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + * 保留消息bo + * @author gsb + * @date 2022/9/16 14:05 + */ +@Data +@Builder +public class RetainMessage implements Serializable { + + /*主题*/ + private String topic; + /*数据*/ + private byte[] message; + /*消息质量*/ + private int qos; +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/Subscribe.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/Subscribe.java new file mode 100644 index 00000000..f525ef94 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/Subscribe.java @@ -0,0 +1,23 @@ +package com.fastbee.mqtt.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 订阅topic信息 + * @author gsb + * @date 2022/10/14 8:30 + */ +@Data +@AllArgsConstructor +public class Subscribe { + /*topic*/ + private String topicName; + /*消息质量*/ + private int qos; + /*客户端id*/ + private String clientId; + /*清楚回话*/ + private boolean cleanSession; + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/WillMessage.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/WillMessage.java new file mode 100644 index 00000000..f1fff3af --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/model/WillMessage.java @@ -0,0 +1,26 @@ +package com.fastbee.mqtt.model; + +import io.netty.handler.codec.mqtt.MqttPublishMessage; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author gsb + * @date 2022/9/15 15:36 + */ +@Data +@AllArgsConstructor +public class WillMessage implements Serializable { + private static final long serialVersionUID = -1L; + + /*客户端Id*/ + private String clientId; + /*清楚客户端*/ + private boolean cleanSession; + /*topic*/ + private String topic; + /*客户端推送消息*/ + private MqttPublishMessage message; +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/MqttServer.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/MqttServer.java new file mode 100644 index 00000000..2f494b65 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/MqttServer.java @@ -0,0 +1,66 @@ +package com.fastbee.mqtt.server; + +import com.fastbee.server.Server; +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.mqtt.handler.adapter.MqttMessageAdapter; +import com.fastbee.server.config.NettyConfig; +import io.netty.bootstrap.AbstractBootstrap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.mqtt.MqttDecoder; +import io.netty.handler.codec.mqtt.MqttEncoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.util.concurrent.DefaultThreadFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@Component +@Slf4j +public class MqttServer extends Server { + + @Autowired + private MqttMessageAdapter messageAdapter; + + @Override + protected AbstractBootstrap initialize() { + bossGroup = new NioEventLoopGroup(1, new DefaultThreadFactory(config.name, Thread.MAX_PRIORITY)); + workerGroup = new NioEventLoopGroup(config.workerCore, new DefaultThreadFactory(config.name, Thread.MAX_PRIORITY)); + + if (config.businessCore > 0) { + businessService = new ThreadPoolExecutor(config.businessCore, config.businessCore, 1L, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new DefaultThreadFactory(config.name, true, Thread.NORM_PRIORITY)); + } + return new ServerBootstrap() + .group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.DEBUG)) + .option(ChannelOption.SO_BACKLOG, 511) + .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE) + .childHandler(new ChannelInitializer() { + + @Override + protected void initChannel(NioSocketChannel channel) { + //客户端心跳检测机制 + channel.pipeline() + .addFirst(FastBeeConstant.SERVER.IDLE + , new IdleStateHandler(config.readerIdleTime, config.writerIdleTime, config.allIdleTime, TimeUnit.SECONDS)) + .addLast(FastBeeConstant.SERVER.DECODER, new MqttDecoder(1024 * 1024 * 2)) + .addLast(FastBeeConstant.SERVER.ENCODER, MqttEncoder.INSTANCE) + .addLast(messageAdapter); + } + }); + + + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/WebSocketServer.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/WebSocketServer.java new file mode 100644 index 00000000..c7a3b6f0 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/server/WebSocketServer.java @@ -0,0 +1,73 @@ +package com.fastbee.mqtt.server; + +import com.fastbee.server.Server; +import com.fastbee.common.constant.FastBeeConstant; +import com.fastbee.mqtt.codec.WebSocketMqttCodec; +import com.fastbee.mqtt.handler.adapter.MqttMessageAdapter; +import io.netty.bootstrap.AbstractBootstrap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.http.HttpContentCompressor; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpServerCodec; +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; +import io.netty.handler.codec.mqtt.MqttDecoder; +import io.netty.handler.codec.mqtt.MqttEncoder; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.util.concurrent.DefaultThreadFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author gsb + * @date 2022/9/15 14:23 + */ +@Component +@Slf4j +public class WebSocketServer extends Server { + + @Autowired + private WebSocketMqttCodec webSocketMqttCodec; + @Autowired + private MqttMessageAdapter mqttMessageAdapter; + + + @Override + protected AbstractBootstrap initialize() { + bossGroup = new NioEventLoopGroup(); + workerGroup = new NioEventLoopGroup(); + return new ServerBootstrap() + .group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(new ChannelInitializer() { + + @Override + public void initChannel(SocketChannel ch) { + ch.pipeline() + .addFirst(FastBeeConstant.WS.HEART_BEAT + , new IdleStateHandler(0, 0, 70)) + /*http请求响应*/ + .addLast(FastBeeConstant.WS.HTTP_SERVER_CODEC, new HttpServerCodec()) + /*聚合header与body组成完整的Http请求,最大数据量为1Mb*/ + .addLast(FastBeeConstant.WS.AGGREGATOR, new HttpObjectAggregator(1024 * 1024)) + /*压缩出站数据*/ + .addLast(FastBeeConstant.WS.COMPRESSOR, new HttpContentCompressor()) + /*WebSocket协议配置mqtt*/ + .addLast(FastBeeConstant.WS.PROTOCOL, new WebSocketServerProtocolHandler("/mqtt", + "mqtt,mqttv3.1,mqttv3.1.1,mqttv5.0", true, 65536)) + .addLast(FastBeeConstant.WS.MQTT_WEBSOCKET, webSocketMqttCodec) + .addLast(FastBeeConstant.WS.DECODER, new MqttDecoder()) + .addLast(FastBeeConstant.WS.ENCODER, MqttEncoder.INSTANCE) + .addLast(FastBeeConstant.WS.BROKER_HANDLER, mqttMessageAdapter); + } + }); + } +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/IMessageStore.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/IMessageStore.java new file mode 100644 index 00000000..610c6989 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/IMessageStore.java @@ -0,0 +1,90 @@ +package com.fastbee.mqtt.service; + +import com.fastbee.mqtt.model.ClientMessage; + +import java.util.List; +import java.util.Map; + +/** + * @author gsb + * @date 2022/10/14 14:35 + */ +public interface IMessageStore { + + /** + * 存储控制包 + * + * @param topic: 控制包所属主题 + * @param clientMessage: 需要存储的消息 + */ + void storeMessage(String topic, ClientMessage clientMessage); + + /** + * 清除topic下的所有消息 + * + * @param topic: 主题 + */ + void cleanTopic(String topic); + + /** + * 根据clientId清除消息 + * + * @param clientId: 客户端唯一标识 + */ + void removeMessage(String clientId); + + /** + * 匹配主题过滤器,寻找对应消息 + * + * @param topicFilter: 主题过滤器 + */ + List searchMessages(String topicFilter); + + /** + * 保存 clientMessage + * + * @param messageId 消息id + */ + public void savePubMsg(Integer messageId, ClientMessage clientMessage); + + /** + * 移除 + * + * @param messageId 消息id + */ + public void removePubMsg(int messageId); + + /** + * 保存 REL IN + * + * @param messageId 消息id + */ + public void saveRelInMsg(int messageId); + + /** + * 保存 REL OUT + * + * @param messageId 消息id + */ + public void saveRelOutMsg(int messageId); + + /** + * 移除 + * + * @param messageId 消息id + */ + public void removeRelInMsg(int messageId); + + /** + * 移除 + * + * @param messageId 消息id + */ + public void removeRelOutMsg(int messageId); + + /** + * 判断Rel out是否包含消息id + */ + public boolean outRelContains(int messageId); + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/ISubscriptionService.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/ISubscriptionService.java new file mode 100644 index 00000000..a2f90438 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/ISubscriptionService.java @@ -0,0 +1,40 @@ +package com.fastbee.mqtt.service; + +import com.fastbee.mqtt.model.Subscribe; + +import java.util.List; + +/** + * 订阅缓存 + * @author gsb + * @date 2022/10/14 8:24 + */ +public interface ISubscriptionService { + + /** + * 保存客户订阅的主题 + * + * @param subscribeList 客户订阅 + */ + void subscribe(List subscribeList, String clientId); + + /** + * 解除订阅 + * + * @param clientId 客户id + * @param topicName 主题 + */ + void unsubscribe(String clientId, String topicName); + + /** + * 获取订阅了 topic 的客户id + * + * @param topic 主题 + * @return 订阅了主题的客户id列表 + */ + List searchSubscribeClientList(String topic); + + + + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DataHandlerImpl.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DataHandlerImpl.java new file mode 100644 index 00000000..6c287ec8 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DataHandlerImpl.java @@ -0,0 +1,135 @@ +package com.fastbee.mqtt.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.fastbee.common.enums.TopicType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.domain.EventLog; +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import com.fastbee.common.core.thingsModel.ThingsModelValuesInput; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.iot.service.IEventLogService; +import com.fastbee.mq.model.ReportDataBo; +import com.fastbee.mq.mqttClient.PubMqttClient; +import com.fastbee.mq.service.IDataHandler; +import com.fastbee.mq.service.IMqttMessagePublish; +import com.fastbee.mqtt.manager.MqttRemoteManager; +import com.fastbee.mqtt.model.PushMessageBo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 上报数据处理方法集合 + * @author bill + */ +@Service +@Slf4j +public class DataHandlerImpl implements IDataHandler { + + + @Resource + private IDeviceService deviceService; + @Resource + private IEventLogService eventLogService; + @Resource + private IMqttMessagePublish messagePublish; + + @Resource + private MqttRemoteManager remoteManager; + @Resource + private TopicsUtils topicsUtils; + + /** + * 上报属性或功能处理 + * + * @param bo 上报数据模型 + */ + @Override + public void reportData(ReportDataBo bo) { + try { + List thingsModelSimpleItems = bo.getDataList(); + if (CollectionUtils.isEmpty(bo.getDataList()) || bo.getDataList().size() == 0) { + thingsModelSimpleItems = JSON.parseArray(bo.getMessage(), ThingsModelSimpleItem.class); + } + ThingsModelValuesInput input = new ThingsModelValuesInput(); + input.setProductId(bo.getProductId()); + input.setDeviceNumber(bo.getSerialNumber().toUpperCase()); + input.setThingsModelValueRemarkItem(thingsModelSimpleItems); + input.setSlaveId(bo.getSlaveId()); + List result = deviceService.reportDeviceThingsModelValue(input, bo.getType(), bo.isShadow()); + + + } catch (Exception e) { + log.error("接收属性数据,解析数据时异常 message={},e={}", e.getMessage(),e); + } + } + + + /** + * 上报事件 + * + * @param bo 上报数据模型 + */ + @Override + public void reportEvent(ReportDataBo bo) { + try { + List thingsModelSimpleItems = JSON.parseArray(bo.getMessage(), ThingsModelSimpleItem.class); + Device device = deviceService.selectDeviceBySerialNumber(bo.getSerialNumber()); + List results = new ArrayList<>(); + for (int i = 0; i < thingsModelSimpleItems.size(); i++) { + // 添加到设备日志 + EventLog event = new EventLog(); + event.setDeviceId(device.getDeviceId()); + event.setDeviceName(device.getDeviceName()); + event.setLogValue(thingsModelSimpleItems.get(i).getValue()); + event.setRemark(thingsModelSimpleItems.get(i).getRemark()); + event.setSerialNumber(device.getSerialNumber()); + event.setIdentity(thingsModelSimpleItems.get(i).getId()); + event.setLogType(3); + event.setIsMonitor(0); + event.setUserId(device.getUserId()); + event.setUserName(device.getUserName()); + event.setTenantId(device.getTenantId()); + event.setTenantName(device.getTenantName()); + event.setCreateTime(DateUtils.getNowDate()); + // 1=影子模式,2=在线模式,3=其他 + event.setMode(2); + results.add(event); + //eventLogService.insertEventLog(event); + } + eventLogService.insertBatch(results); + } catch (Exception e) { + log.error("接收事件,解析数据时异常 message={}", e.getMessage()); + } + } + + /** + * 上报设备信息 + */ + public void reportDevice(ReportDataBo bo) { + try { + // 设备实体 + Device deviceEntity = deviceService.selectDeviceBySerialNumber(bo.getSerialNumber()); + // 上报设备信息 + Device device = JSON.parseObject(bo.getMessage(), Device.class); + device.setProductId(bo.getProductId()); + device.setSerialNumber(bo.getSerialNumber()); + deviceService.reportDevice(device, deviceEntity); + // 发布设备状态 + messagePublish.publishStatus(bo.getProductId(), bo.getSerialNumber(), 3, deviceEntity.getIsShadow(), device.getRssi()); + } catch (Exception e) { + log.error("接收设备信息,解析数据时异常 message={}", e.getMessage()); + throw new ServiceException(e.getMessage(), 1); + } + } + + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DeviceReportMessageServiceImpl.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DeviceReportMessageServiceImpl.java new file mode 100644 index 00000000..1d7fe0bc --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/DeviceReportMessageServiceImpl.java @@ -0,0 +1,141 @@ +package com.fastbee.mqtt.service.impl; + +import com.fastbee.common.core.mq.DeviceReport; +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.common.core.mq.message.DeviceData; +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.enums.ThingsModelType; +import com.fastbee.common.enums.TopicType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.json.JsonProtocolService; +import com.fastbee.mq.model.ReportDataBo; +import com.fastbee.mq.service.IDataHandler; +import com.fastbee.mq.service.IDeviceReportMessageService; +import io.netty.buffer.Unpooled; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Optional; + +/** + * 处理类 处理设备主动上报和设备回调信息 + * + * @author bill + */ +@Service +@Slf4j +public class DeviceReportMessageServiceImpl implements IDeviceReportMessageService { + + @Autowired + private IDeviceService deviceService; + @Autowired + private JsonProtocolService jsonProtocolService; + @Resource + private TopicsUtils topicsUtils; + @Resource + private IDataHandler dataHandler; + + + /** + * 处理设备主动上报数据 + */ + @Override + public void parseReportMsg(DeviceReportBo bo) { + if (bo.getServerType() == ServerType.MQTT) { + //构建消息 + Device report = buildReport(bo); + /*获取协议处理器*/ + DeviceData data = DeviceData.builder() + .serialNumber(bo.getSerialNumber()) + .topicName(bo.getTopicName()) + .productId(report.getProductId()) + .data(bo.getData()) + .prop(bo.getProp()) + .buf(Unpooled.wrappedBuffer(bo.getData())) + .build(); + /*根据协议解析后的数据*/ + DeviceReport reportMessage = jsonProtocolService.decode(data, null); + + reportMessage.setSerialNumber(bo.getSerialNumber()); + reportMessage.setProductId(bo.getProductId()); + reportMessage.setPlatformDate(bo.getPlatformDate()); + reportMessage.setServerType(bo.getServerType()); + reportMessage.setUserId(report.getUserId()); + reportMessage.setUserName(report.getUserName()); + reportMessage.setDeviceName(report.getDeviceName()); + processNoSub(reportMessage, bo.getTopicName()); + } + } + + /** + * 构建消息 + * + * @param bo + */ + @Override + public Device buildReport(DeviceReportBo bo) { + String serialNumber = topicsUtils.parseSerialNumber(bo.getTopicName()); + Device device = deviceService.selectDeviceBySerialNumber(serialNumber); + Optional.ofNullable(device).orElseThrow(() -> new ServiceException("设备不存在")); + //设置物模型 + String thingsModel = topicsUtils.getThingsModel(bo.getTopicName()); + ThingsModelType thingsModelType = ThingsModelType.getType(thingsModel); + bo.setType(thingsModelType); + //产品id + bo.setProductId(device.getProductId()); + //设备编号 + bo.setSerialNumber(serialNumber); + return device; + } + + + /** + * 处理网关设备 + * + * @param message + * @param topicName + */ + private void processNoSub(DeviceReport message, String topicName) { + //处理设备上报数据 + handlerReportMessage(message, topicName); + } + + + /** + * 处理设备主动上报属性 + * + * @param topicName + * @param message + */ + public void handlerReportMessage(DeviceReport message, String topicName) { + + if (message.getServerType().equals(ServerType.MQTT)){ + //处理topic以prop结尾上报的数据 (属性) + if (message.getServerType().equals(ServerType.MQTT)) { + if (!topicName.endsWith(TopicType.PROPERTY_POST.getTopicSuffix()) + && !topicName.endsWith(TopicType.PROPERTY_POST_SIMULATE.getTopicSuffix())) { + return; + } + } + } + + ReportDataBo report = new ReportDataBo(); + report.setSerialNumber(message.getSerialNumber()); + report.setProductId(message.getProductId()); + report.setDataList(message.getValuesInput().getThingsModelValueRemarkItem()); + report.setType(1); + report.setSlaveId(message.getSlaveId()); + report.setUserId(message.getUserId()); + report.setUserName(message.getUserName()); + report.setDeviceName(message.getDeviceName()); + //属性上报执行规则引擎 + report.setRuleEngine(true); + dataHandler.reportData(report); + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MessageStoreImpl.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MessageStoreImpl.java new file mode 100644 index 00000000..0de2109f --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MessageStoreImpl.java @@ -0,0 +1,159 @@ +package com.fastbee.mqtt.service.impl; + +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.mqtt.model.ClientMessage; +import com.fastbee.mqtt.service.IMessageStore; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Retain will Qos12消息存储接口 -TODO 后续Redis处理 + * + * @author gsb + * @date 2022/10/14 14:35 + */ +@Service +public class MessageStoreImpl implements IMessageStore { + + + /** + * 存储消息,保留消息,遗留消息 + */ + private final Map willOrRetainMap = new ConcurrentHashMap<>(); + + /** + * Qos2 Pub消息 + */ + private final Map publishMap = new ConcurrentHashMap<>(); + /** + * Qos2 REL IN消息 + */ + private final Set outRelSet = new HashSet<>(); + + /** + * Qos2 REL out + */ + private final Set inRelSet = new HashSet<>(); + + /** + * 存储控制包 + * + * @param topic: 控制包所属主题 + * @param clientMessage: 需要存储的消息 + */ + @Override + public void storeMessage(String topic, ClientMessage clientMessage) { + willOrRetainMap.put(topic, clientMessage); + } + + /** + * 清除topic下的所有消息 + * + * @param topic: 主题 + */ + @Override + public void cleanTopic(String topic) { + willOrRetainMap.remove(topic); + } + + /** + * 根据clientId清除消息 + * + * @param clientId: 客户端唯一标识 + */ + @Override + public void removeMessage(String clientId) { + for (Map.Entry entry : willOrRetainMap.entrySet()) { + if (entry.getValue().getClientId().equals(clientId)) { + willOrRetainMap.remove(entry.getKey()); + } + } + } + + /** + * 匹配主题过滤器,匹配消息 + * + * @param topicFilter: 主题过滤器 + */ + @Override + public List searchMessages(String topicFilter) { + List messageList = new ArrayList<>(); + for (String topic : willOrRetainMap.keySet()) { + if (TopicsUtils.matchTopic(topic, topicFilter)) { + messageList.add(willOrRetainMap.get(topic)); + } + } + return messageList; + } + + /** + * 保存 clientMessage + * + * @param messageId 消息id + */ + @Override + public void savePubMsg(Integer messageId, ClientMessage clientMessage){ + publishMap.put(messageId,clientMessage); + } + + /** + * 移除 + * + * @param messageId 消息id + */ + @Override + public void removePubMsg(int messageId){ + publishMap.remove(messageId); + } + + /** + * 保存 REL IN + * + * @param messageId 消息id + */ + @Override + public void saveRelInMsg(int messageId){ + inRelSet.add(messageId); + } + + /** + * 保存 REL OUT + * + * @param messageId 消息id + */ + @Override + public void saveRelOutMsg(int messageId){ + outRelSet.add(messageId); + } + + /** + * 移除 + * + * @param messageId 消息id + */ + @Override + public void removeRelInMsg(int messageId){ + inRelSet.remove(messageId); + } + + /** + * 移除 + * + * @param messageId 消息id + */ + @Override + public void removeRelOutMsg(int messageId){ + outRelSet.remove(messageId); + } + + /** + * 判断Rel out是否包含消息id + */ + @Override + public boolean outRelContains(int messageId){ + return outRelSet.contains(messageId); + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MqttMessagePublishImpl.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MqttMessagePublishImpl.java new file mode 100644 index 00000000..5a1f313f --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/MqttMessagePublishImpl.java @@ -0,0 +1,354 @@ +package com.fastbee.mqtt.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.fastbee.common.core.mq.DeviceReportBo; +import com.fastbee.common.core.mq.MQSendMessageBo; +import com.fastbee.common.core.mq.message.DeviceData; +import com.fastbee.common.core.mq.message.DeviceDownMessage; +import com.fastbee.common.core.mq.message.InstructionsMessage; +import com.fastbee.common.core.mq.message.MqttBo; +import com.fastbee.common.core.mq.ota.OtaUpgradeBo; +import com.fastbee.common.core.protocol.modbus.ModbusCode; +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import com.fastbee.common.enums.ServerType; +import com.fastbee.common.enums.TopicType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.gateway.CRC16Utils; +import com.fastbee.common.utils.gateway.mq.TopicsUtils; +import com.fastbee.common.utils.ip.IpUtils; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.domain.FunctionLog; +import com.fastbee.iot.domain.Product; +import com.fastbee.iot.model.NtpModel; +import com.fastbee.iot.model.ThingsModels.PropertyDto; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.iot.service.IProductService; +import com.fastbee.iot.service.IThingsModelService; +import com.fastbee.iot.service.cache.IFirmwareCache; +import com.fastbee.iot.util.SnowflakeIdWorker; +import com.fastbee.json.JsonProtocolService; +import com.fastbee.mq.model.ReportDataBo; +import com.fastbee.mq.mqttClient.PubMqttClient; +import com.fastbee.mq.service.IDataHandler; +import com.fastbee.mq.service.IMqttMessagePublish; +import com.fastbee.mqtt.manager.MqttRemoteManager; +import com.fastbee.mqtt.model.PushMessageBo; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.protocols.IProtocol; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +/** + * 消息推送方法集合 + * + * @author bill + */ +@Slf4j +@Service +public class MqttMessagePublishImpl implements IMqttMessagePublish { + + @Resource + private IProductService productService; + @Resource + private PubMqttClient mqttClient; + @Resource + private IFirmwareCache firmwareCache; + @Resource + private TopicsUtils topicsUtils; + @Resource + private IDeviceService deviceService; + @Resource + private MqttRemoteManager remoteManager; + + @Resource + private IDataHandler dataHandler; + @Resource + private IThingsModelService thingsModelService; + @Resource + private JsonProtocolService jsonProtocolService; + private SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(3); + + + @Override + public InstructionsMessage buildMessage(DeviceDownMessage downMessage, TopicType type) { + /*返回的组将数据*/ + InstructionsMessage message = new InstructionsMessage(); + /*根据设备编号查询产品信息*/ + if (StringUtils.isEmpty(downMessage.getProtocolCode())) { + Product product = productService.getProductBySerialNumber(downMessage.getSerialNumber()); + Optional.ofNullable(product).orElseThrow(() -> new ServiceException("产品为空")); + downMessage.setProtocolCode(product.getProtocolCode()); + } + String serialNumber = downMessage.getSerialNumber() == null ? "" : downMessage.getSerialNumber(); + + /*组建Topic*/ + String topicName = ""; + if (downMessage.getServerType().equals(ServerType.MQTT)) { + topicName = topicsUtils.buildTopic(downMessage.getProductId(), serialNumber, type); + } + + DeviceData encodeData = DeviceData.builder() + .downMessage(downMessage) + .serialNumber(serialNumber) + .body(downMessage.getBody()) + .code(downMessage.getCode()) + .topicName(topicName).build(); + //根据协议编码后数据 + byte[] data = jsonProtocolService.encode(encodeData, null); + message.setMessage(data); + message.setSerialNumber(serialNumber); + message.setTopicName(topicName); + + return message; + } + + /** + * 服务(指令)下发 + */ + @Override + public void funcSend(MQSendMessageBo bo) { + //如果协议编号为空,则获取 + if (StringUtils.isEmpty(bo.getProtocolCode())) { + Product product = productService.selectProductByProductId(bo.getProductId()); + //bo.setType(ThingsModelType.SERVICE); + bo.setProtocolCode(product.getProtocolCode()); + bo.setTransport(product.getTransport()); + } + + //处理设备影子模式 + if (null != bo.getIsShadow() && bo.getIsShadow()){ + List dataList = new ArrayList<>(); + bo.getValue().forEach((key,value) ->{ + ThingsModelSimpleItem item = new ThingsModelSimpleItem(); + item.setId(key); + item.setValue(value+""); + dataList.add(item); + }); + ReportDataBo dataBo = new ReportDataBo(); + dataBo.setDataList(dataList); + dataBo.setProductId(bo.getProductId()); + dataBo.setSerialNumber(bo.getSerialNumber()); + dataBo.setRuleEngine(false); + dataBo.setShadow(true); + dataBo.setSlaveId(bo.getSlaveId()); + dataBo.setType(bo.getType().getCode()); + dataHandler.reportData(dataBo); + return; + } + + /* 下发服务数据存储对象*/ + FunctionLog log = new FunctionLog(); + log.setCreateTime(DateUtils.getNowDate()); + log.setFunValue(bo.getValue().get(bo.getIdentifier()).toString()); + log.setMessageId(bo.getMessageId()); + log.setSerialNumber(bo.getSerialNumber()); + log.setIdentify(bo.getIdentifier()); + log.setShowValue(bo.getShowValue()); + log.setFunType(1); + log.setModelName(bo.getModelName()); + //兼容子设备 + if (null != bo.getSlaveId()) { + PropertyDto thingModels = thingsModelService.getSingleThingModels(bo.getProductId(), bo.getIdentifier() + "#" + bo.getSlaveId()); + log.setSerialNumber(bo.getSerialNumber() + "_" + bo.getSlaveId()); + bo.setCode(ModbusCode.Write06); + if (!Objects.isNull(thingModels.getCode())){ + bo.setCode(ModbusCode.getInstance(Integer.parseInt(thingModels.getCode()))); + } + } + + ServerType serverType = ServerType.explain(bo.getTransport()); + Optional.ofNullable(serverType).orElseThrow(() -> new ServiceException("产品的传输协议编码为空!")); + /*下发服务数据处理对象*/ + DeviceDownMessage downMessage = DeviceDownMessage.builder() + .messageId(bo.getMessageId()) + .body(bo.getValue()) + .serialNumber(bo.getSerialNumber()) + .productId(bo.getProductId()) + .timestamp(DateUtils.getTimestamp()) + .identifier(bo.getIdentifier()) + .slaveId(bo.getSlaveId()) + .code(bo.getCode() == ModbusCode.Read01 ? ModbusCode.Write05 : ModbusCode.Write06) + .serverType(serverType) + .build(); + switch (serverType) { + case MQTT: + //组建下发服务指令 + InstructionsMessage instruction = buildMessage(downMessage, TopicType.FUNCTION_GET); + mqttClient.publish(instruction.getTopicName(), instruction.getMessage(), log); + MqttMessagePublishImpl.log.debug("=>服务下发,topic=[{}],指令=[{}]", instruction.getTopicName(),new String(instruction.getMessage())); + break; + + } + } + + /** + * OTA升级下发 + * + * @param bo + */ + @Override + public void upGradeOTA(OtaUpgradeBo bo) { + + } + + @Override + public void sendFunctionMessage(DeviceReportBo bo) { + log.warn("=>功能指令下发,sendFunctionMessage bo=[{}]", bo); + Device device = deviceService.selectDeviceBySerialNumber(bo.getSerialNumber()); + Optional.ofNullable(device).orElseThrow(()->new ServiceException("服务下发的设备:["+bo.getSerialNumber()+"]不存在")); + + Product product = productService.selectProductByProductId(topicsUtils.parseProductId(bo.getTopicName())); + ServerType serverType = ServerType.explain(product.getTransport()); + Optional.ofNullable(serverType).orElseThrow(() -> new ServiceException("产品的传输协议编码为空!")); + + switch (serverType) { + case GB28181: + break; + } + } + + /** + * 1.发布设备状态 + */ + @Override + public void publishStatus(Long productId, String deviceNum, int deviceStatus, int isShadow, int rssi) { + String message = "{\"status\":" + deviceStatus + ",\"isShadow\":" + isShadow + ",\"rssi\":" + rssi + "}"; + String topic = topicsUtils.buildTopic(productId, deviceNum, TopicType.STATUS_POST); + mqttClient.publish(1, false, topic, message); + } + + + /** + * 2.发布设备信息 + */ + @Override + public void publishInfo(Long productId, String deviceNum) { + String topic = topicsUtils.buildTopic(productId, deviceNum, TopicType.INFO_GET); + mqttClient.publish(1, false, topic, ""); + } + + /** + * 3.发布时钟同步信息 + * + * @param bo 数据模型 + */ + public void publishNtp(ReportDataBo bo) { + NtpModel ntpModel = JSON.parseObject(bo.getMessage(), NtpModel.class); + ntpModel.setServerRecvTime(System.currentTimeMillis()); + ntpModel.setServerSendTime(System.currentTimeMillis()); + String topic = topicsUtils.buildTopic(bo.getProductId(), bo.getSerialNumber(), TopicType.NTP_GET); + mqttClient.publish(1, false, topic, JSON.toJSONString(ntpModel)); + } + + /** + * 4.发布属性 + * delay 延时,秒为单位 + */ + @Override + public void publishProperty(Long productId, String deviceNum, List thingsList, int delay) { + String pre = ""; + if (delay > 0) { + pre = "$delayed/" + String.valueOf(delay) + "/"; + } + String topic = topicsUtils.buildTopic(productId, deviceNum, TopicType.FUNCTION_GET); + if (thingsList == null) { + mqttClient.publish(1, true, topic, ""); + } else { + mqttClient.publish(1, true, topic, JSON.toJSONString(thingsList)); + } + } + + /** + * 5.发布功能 + * delay 延时,秒为单位 + */ + @Override + public void publishFunction(Long productId, String deviceNum, List thingsList, int delay) { + String pre = ""; + if (delay > 0) { + pre = "$delayed/" + String.valueOf(delay) + "/"; + } + String topic = topicsUtils.buildTopic(productId, deviceNum, TopicType.FUNCTION_GET); + if (thingsList == null) { + mqttClient.publish(1, true, topic, ""); + } else { + mqttClient.publish(1, true, topic, JSON.toJSONString(thingsList)); + } + + } + + /** + * 设备数据同步 + * + * @param deviceNumber 设备编号 + * @return 设备 + */ + public Device deviceSynchronization(String deviceNumber) { + Device device = deviceService.selectDeviceBySerialNumber(deviceNumber); + // 1-未激活,2-禁用,3-在线,4-离线 + if (device.getStatus() == 3) { + device.setStatus(4); + deviceService.updateDeviceStatus(device); + // 发布设备信息 + publishInfo(device.getProductId(), device.getSerialNumber()); + } + return device; + } + + + /** + * 发送模拟设备到WS + */ + public void sendSimulationWs(MqttBo send ,MqttBo receive,String topic){ + PushMessageBo messageBo = new PushMessageBo(); + messageBo.setTopic(topic); + JSONArray array = new JSONArray(); + send.setDirection("send"); + send.setTs(DateUtils.getNowDate()); + receive.setTs(DateUtils.getNowDate()); + receive.setDirection("receive"); + array.add(send); + array.add(receive); + messageBo.setMessage(array.toJSONString()); + remoteManager.pushCommon(messageBo); + } + + public byte[] CRC(byte[] source) { + source[2] = (byte)((int) source[2] * 2); + byte[] result = new byte[source.length + 2]; + byte[] crc16Byte = CRC16Utils.getCrc16Byte(source); + System.arraycopy(source, 0, result, 0, source.length); + System.arraycopy(crc16Byte, 0, result, result.length - 2, 2); + return result; + } + + + /** + * 搭建消息 + * + * @param bo + * @return + */ + private DeviceDownMessage buildMessage(OtaUpgradeBo bo) { + String messageId = String.valueOf(snowflakeIdWorker.nextId()); + bo.setMessageId(messageId); + bo.setOtaUrl("http://" + IpUtils.getHostIp()+bo.getOtaUrl()); + return DeviceDownMessage.builder() + .productId(bo.getProductId()) + .serialNumber(bo.getSerialNumber()) + .body(JSON.toJSON(bo)) + .timestamp(DateUtils.getTimestamp()) + .messageId(messageId) + .build(); + + } + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/SubscriptionServiceImpl.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/SubscriptionServiceImpl.java new file mode 100644 index 00000000..6dbb8341 --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/service/impl/SubscriptionServiceImpl.java @@ -0,0 +1,56 @@ +package com.fastbee.mqtt.service.impl; + +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.mqtt.model.Subscribe; +import com.fastbee.mqtt.service.ISubscriptionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author gsb + * @date 2022/10/14 8:37 + */ +@Slf4j +@Component +public class SubscriptionServiceImpl implements ISubscriptionService { + + @Autowired + private RedisCache redisCache; + + /** + * 保存客户订阅的主题 + * + * @param subscribeList 主题列表 + */ + @Override + public void subscribe(List subscribeList, String clientId) { + redisCache.setCacheList(clientId, subscribeList); + } + + /** + * 解除订阅 + * + * @param clientId 客户id + * @param topicName 主题 + */ + @Override + public void unsubscribe(String clientId, String topicName) { + redisCache.delHashValue(topicName, clientId); + } + + /** + * 获取订阅了 topic 的客户id + * + * @param topic 主题 + * @return 订阅了主题的客户id列表 + */ + @Override + public List searchSubscribeClientList(String topic) { + return null; + } + + +} diff --git a/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/utils/MqttMessageUtils.java b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/utils/MqttMessageUtils.java new file mode 100644 index 00000000..89224a9b --- /dev/null +++ b/springboot/fastbee-server/mqtt-broker/src/main/java/com/fastbee/mqtt/utils/MqttMessageUtils.java @@ -0,0 +1,144 @@ +package com.fastbee.mqtt.utils; + +import com.fastbee.common.core.mq.DeviceStatusBo; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.mqtt.model.ClientMessage; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.mqtt.*; + +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 服务器应答信息构建 + * @author gsb + * @date 2022/10/7 14:17 + */ +public class MqttMessageUtils { + + + /** + * 服务器确认连接应答消息 CONNACK + */ + public static MqttConnAckMessage buildConntAckMessage(MqttConnectReturnCode code, boolean sessionPresent) { + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.CONNACK); + MqttConnAckVariableHeader variableHeader = new MqttConnAckVariableHeader(code, sessionPresent); + return new MqttConnAckMessage(fixedHeader, variableHeader); + } + + + /** + * 设备ping(心跳信息)应答 PINGRESP + */ + public static MqttMessage buildPingResp() { + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.PINGRESP); + return new MqttMessage(fixedHeader); + } + + /** + * 取消订阅消息应答 UNSUBACK + */ + public static MqttUnsubAckMessage buildUnsubAckMessage(MqttMessage message) { + /*构建固定报文*/ + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.UNSUBACK); + return new MqttUnsubAckMessage(fixedHeader, getIdVariableHeader(message)); + } + + /** + * 订阅确认应答 SUBACK + */ + public static MqttSubAckMessage buildSubAckMessage(MqttMessage message) { + /*构建固定报文*/ + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.SUBACK); + /*构建可变报文*/ + MqttSubscribeMessage mqttSubscribeMessage = (MqttSubscribeMessage) message; + + /*获取订阅topic的Qos*/ + Set topics = mqttSubscribeMessage.payload().topicSubscriptions().stream().map(MqttTopicSubscription::topicName).collect(Collectors.toSet()); + List grantedQos = new ArrayList<>(topics.size()); + for (int i = 0; i < topics.size(); i++) { + grantedQos.add(mqttSubscribeMessage.payload().topicSubscriptions().get(i).qualityOfService().value()); + } + /*负载*/ + MqttSubAckPayload payload = new MqttSubAckPayload(grantedQos); + return new MqttSubAckMessage(fixedHeader, getIdVariableHeader(message), payload); + } + + /** + * 构建推送应答消息 PUBLISH + */ + public static MqttPublishMessage buildPublishMessage(ClientMessage msg, int packageId) { + /*报文固定头*/ + MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBLISH, msg.isDup(), msg.getQos(), false, 0); + /*报文可变头*/ + MqttPublishVariableHeader variableHeader = new MqttPublishVariableHeader(msg.getTopicName(), packageId); + /*负载*/ + ByteBuf payload = msg.getPayload() == null ? Unpooled.EMPTY_BUFFER : Unpooled.wrappedBuffer(msg.getPayload()); + /*完整报文,固定头+可变头+payload*/ + return new MqttPublishMessage(fixedHeader, variableHeader, payload); + } + + /** + * Qos1 收到发布消息确认 无负载 PUBACK + */ + public static MqttPubAckMessage buildAckMessage(MqttMessage message) { + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.PUBACK); + return new MqttPubAckMessage(fixedHeader, getIdVariableHeader(message)); + } + + /** + * Qos2 发到消息收到 无负载 PUBREC + */ + public static MqttMessage buildPubRecMessage(MqttMessage message){ + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.PUBREC); + return new MqttMessage(fixedHeader, getIdVariableHeader(message)); + } + + /** + * Qos2 发布消息释放 PUBREL + */ + public static MqttMessage buildPubRelMessage(MqttMessage message){ + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.PUBREL); + return new MqttMessage(fixedHeader, getIdVariableHeader(message)); + + } + + /** + * Qos2 发布消息完成 PUBCOMP + */ + public static MqttMessage buildPubCompMessage(MqttMessage message){ + MqttFixedHeader fixedHeader = buildFixedHeader(MqttMessageType.PUBCOMP); + return new MqttMessage(fixedHeader, getIdVariableHeader(message)); + } + + /** + * 固定头定制 + */ + public static MqttFixedHeader buildFixedHeader(MqttMessageType messageType) { + return new MqttFixedHeader(messageType, false, MqttQoS.AT_MOST_ONCE, false, 0); + } + + /** + * 构造MqttMessageIdVariableHeader + */ + public static MqttMessageIdVariableHeader getIdVariableHeader(MqttMessage mqttMessage) { + MqttMessageIdVariableHeader idVariableHeader = (MqttMessageIdVariableHeader) mqttMessage.variableHeader(); + return MqttMessageIdVariableHeader.from(idVariableHeader.messageId()); + } + + /*构造返回MQ的设备状态model*/ + public static DeviceStatusBo buildStatusMsg(ChannelHandlerContext ctx, String clientId,DeviceStatus status,String ip){ + return DeviceStatusBo.builder() + .serialNumber(clientId) + .status(status) + .ip(ip) + .hostName(ip) + .timestamp(DateUtils.getNowDate()).build(); + } +} diff --git a/springboot/fastbee-server/pom.xml b/springboot/fastbee-server/pom.xml new file mode 100644 index 00000000..3dd9f4da --- /dev/null +++ b/springboot/fastbee-server/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + fastbee + com.fastbee + 3.8.5 + + + pom + fastbee-server + 服务集成模块 + + + + base-server + + boot-strap + + mqtt-broker + + iot-server-core + + + + + + io.netty + netty-all + 4.1.56.Final + compile + + + + com.fastbee + fastbee-common + 3.8.5 + + + + org.projectlombok + lombok + + + + com.fastbee + fastbee-iot-service + + + + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/pom.xml b/springboot/fastbee-service/fastbee-iot-service/pom.xml new file mode 100644 index 00000000..454be92c --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/pom.xml @@ -0,0 +1,108 @@ + + + + fastbee-service + com.fastbee + 3.8.5 + + 4.0.0 + + fastbee-iot-service + + + 设备业务模块 + + + + + + + com.fastbee + fastbee-common + + + io.swagger + swagger-annotations + 1.6.2 + compile + + + org.apache.velocity + velocity-engine-core + + + com.fastbee + fastbee-framework + + + com.fastbee + fastbee-quartz + + + org.apache.commons + commons-text + 1.6 + + + + org.springframework.security.oauth + spring-security-oauth2 + 2.5.1.RELEASE + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + + me.zhyd.oauth + JustAuth + ${justAuth.version} + + + + + com.dtflys.forest + forest-spring-boot-starter + ${forest.version} + + + + + + com.taosdata.jdbc + taos-jdbcdriver + 2.0.38 + + + + + cn.hutool + hutool-all + + + + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Category.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Category.java new file mode 100644 index 00000000..fa2c31c2 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Category.java @@ -0,0 +1,134 @@ +package com.fastbee.iot.domain; + +import com.fastbee.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; + +/** + * 产品分类对象 iot_category + * + * @author kerwincui + * @date 2021-12-16 + */ +@ApiModel(value = "Category", description = "产品分类对象 iot_category") +public class Category extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 产品分类ID */ + @ApiModelProperty("产品分类ID") + private Long categoryId; + + /** 产品分类名称 */ + @ApiModelProperty("产品分类名称") + @Excel(name = "产品分类名称") + private String categoryName; + + /** 租户ID */ + @ApiModelProperty("租户ID") + @Excel(name = "租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + @Excel(name = "租户名称") + private String tenantName; + + /** 是否系统通用(0-否,1-是) */ + @ApiModelProperty("是否系统通用(0-否,1-是)") + @Excel(name = "是否系统通用", readConverterExp = "0=-否,1-是") + private Integer isSys; + + /** 显示顺序 */ + @ApiModelProperty("显示顺序") + @Excel(name = "显示顺序") + private Integer orderNum; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志(0代表存在 2代表删除)") + private String delFlag; + + public void setCategoryId(Long categoryId) + { + this.categoryId = categoryId; + } + + public Long getCategoryId() + { + return categoryId; + } + public void setCategoryName(String categoryName) + { + this.categoryName = categoryName; + } + + public String getCategoryName() + { + return categoryName; + } + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public Long getTenantId() + { + return tenantId; + } + public void setTenantName(String tenantName) + { + this.tenantName = tenantName; + } + + public String getTenantName() + { + return tenantName; + } + public void setIsSys(Integer isSys) + { + this.isSys = isSys; + } + public Integer getIsSys() + { + return isSys; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + public Integer getOrderNum() + { + return orderNum; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("categoryId", getCategoryId()) + .append("categoryName", getCategoryName()) + .append("tenantId", getTenantId()) + .append("tenantName", getTenantName()) + .append("isSys", getIsSys()) + .append("orderNum", getOrderNum()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Device.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Device.java new file mode 100644 index 00000000..edf534f7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Device.java @@ -0,0 +1,473 @@ +package com.fastbee.iot.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 设备对象 iot_device + * + * @author kerwincui + * @date 2021-12-16 + */ +@ApiModel(value = "Device", description = "设备对象 iot_device") +public class Device extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 设备ID */ + @ApiModelProperty("设备ID") + private Long deviceId; + + /** 设备名称 */ + @ApiModelProperty("设备名称") + @Excel(name = "设备名称") + private String deviceName; + + /** 产品ID */ + @ApiModelProperty("产品ID") + @Excel(name = "产品ID") + private Long productId; + + /** 产品名称 */ + @ApiModelProperty("产品名称") + @Excel(name = "产品名称") + private String productName; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long userId; + + /** 用户昵称 */ + @ApiModelProperty("用户昵称") + @Excel(name = "用户昵称") + private String userName; + + /** 租户ID */ + @ApiModelProperty("租户ID") + @Excel(name = "租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + @Excel(name = "租户名称") + private String tenantName; + + /** 设备编号 */ + @ApiModelProperty("设备编号") + @Excel(name = "设备编号") + private String serialNumber; + + /** 固件版本 */ + @ApiModelProperty("固件版本") + @Excel(name = "固件版本") + private BigDecimal firmwareVersion; + + /** 设备类型(1-直连设备、2-网关设备、3-监控设备) */ + @ApiModelProperty("设备类型(1-直连设备、2-网关设备、3-监控设备)") + private Integer deviceType; + + /** 设备状态(1-未激活,2-禁用,3-在线,4-离线) */ + @ApiModelProperty("设备状态(1-未激活,2-禁用,3-在线,4-离线)") + @Excel(name = "设备状态") + private Integer status; + + /** wifi信号强度(信号极好4格[-55— 0],信号好3格[-70— -55],信号一般2格[-85— -70],信号差1格[-100— -85]) */ + @ApiModelProperty("wifi信号强度(信号极好4格[-55— 0],信号好3格[-70— -55],信号一般2格[-85— -70],信号差1格[-100— -85])") + @Excel(name = "wifi信号强度") + private Integer rssi; + + /** 设备影子 */ + @ApiModelProperty("是否启用设备影子(0=禁用,1=启用)") + private Integer isShadow; + + /** 设备所在地址 */ + @ApiModelProperty("设备所在地址") + @Excel(name = "设备所在地址") + private String networkAddress; + + /** 设备入网IP */ + @ApiModelProperty("设备入网IP") + @Excel(name = "设备入网IP") + private String networkIp; + + /** 设备经度 */ + @ApiModelProperty("设备经度") + @Excel(name = "设备经度") + private BigDecimal longitude; + + /** 设备纬度 */ + @ApiModelProperty("设备纬度") + @Excel(name = "设备纬度") + private BigDecimal latitude; + + /** 激活时间 */ + @ApiModelProperty("激活时间") + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "激活时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date activeTime; + + /** 子设备网关编号 */ + @ApiModelProperty("子设备网关编号") + @Excel(name = "网关设备编号(子设备使用)") + private String gwDevCode; + + /** 物模型值 */ + @ApiModelProperty("物模型值") + @Excel(name = "物模型") + private String thingsModelValue; + + /** 图片地址 */ + @ApiModelProperty("图片地址") + private String imgUrl; + + /** 是否自定义位置 **/ + @ApiModelProperty("定位方式(1=ip自动定位,2=设备定位,3=自定义)") + private Integer locationWay; + + /** 设备摘要 **/ + @ApiModelProperty("设备摘要") + private String summary; + + /** 分组ID,用于分组查询 **/ + @ApiModelProperty("分组ID,用于分组查询") + private Long groupId; + + /** 是否设备所有者,用于查询 **/ + @ApiModelProperty("是否设备所有者,用于查询") + private Integer isOwner; + /**子设备数量*/ + @ApiModelProperty("子设备数量") + private Integer subDeviceCount; + /**是否是模拟设备*/ + @ApiModelProperty("是否是模拟设备") + private Integer isSimulate; + /**子设备地址*/ + @ApiModelProperty("子设备地址") + private Integer slaveId; + /**设备传输协议*/ + @ApiModelProperty("设备传输协议") + private String transport; + + public String getTransport() { + return transport; + } + + public void setTransport(String transport) { + this.transport = transport; + } + + public Integer getSlaveId() { + return slaveId; + } + + public void setSlaveId(Integer slaveId) { + this.slaveId = slaveId; + } + + public Integer getIsSimulate() { + return isSimulate; + } + + public void setIsSimulate(Integer isSimulate) { + this.isSimulate = isSimulate; + } + + private List subDeviceList; + + public List getSubDeviceList() { + return subDeviceList; + } + + public void setSubDeviceList(List subDeviceList) { + this.subDeviceList = subDeviceList; + } + + public Integer getSubDeviceCount() { + return subDeviceCount; + } + + public void setSubDeviceCount(Integer subDeviceCount) { + this.subDeviceCount = subDeviceCount; + } + + public String getGwDevCode() { + return gwDevCode; + } + + public void setGwDevCode(String gwDevCode) { + this.gwDevCode = gwDevCode; + } + + public Integer getLocationWay() { + return locationWay; + } + + public void setLocationWay(Integer locationWay) { + this.locationWay = locationWay; + } + + public Integer getIsOwner() { + return isOwner; + } + + public void setIsOwner(Integer isOwner) { + this.isOwner = isOwner; + } + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getIsShadow() { + return isShadow; + } + + public void setIsShadow(Integer isShadow) { + this.isShadow = isShadow; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public void setDeviceId(Long deviceId) + { + this.deviceId = deviceId; + } + + public Long getDeviceId() + { + return deviceId; + } + public void setDeviceName(String deviceName) + { + this.deviceName = deviceName; + } + + public String getDeviceName() + { + return deviceName; + } + public void setProductId(Long productId) + { + this.productId = productId; + } + + public Long getProductId() + { + return productId; + } + public void setProductName(String productName) + { + this.productName = productName; + } + + public String getProductName() + { + return productName; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserName() + { + return userName; + } + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public Long getTenantId() + { + return tenantId; + } + public void setTenantName(String tenantName) + { + this.tenantName = tenantName; + } + + public String getTenantName() + { + return tenantName; + } + public void setSerialNumber(String serialNumber) + { + this.serialNumber = serialNumber; + } + + public String getSerialNumber() + { + return serialNumber; + } + public void setFirmwareVersion(BigDecimal firmwareVersion) + { + this.firmwareVersion = firmwareVersion; + } + + public BigDecimal getFirmwareVersion() + { + return firmwareVersion; + } + public void setStatus(Integer status) + { + this.status = status; + } + public void setDeviceType(Integer deviceType) + { + this.deviceType = deviceType; + } + + public Integer getDeviceType() + { + return deviceType; + } + public Integer getStatus() + { + return status; + } + public void setRssi(Integer rssi) + { + this.rssi = rssi; + } + + public Integer getRssi() + { + return rssi; + } + public void setThingsModelValue(String thingsModelValue) + { + this.thingsModelValue = thingsModelValue; + } + + public String getThingsModelValue() + { + return thingsModelValue; + } + public void setNetworkAddress(String networkAddress) + { + this.networkAddress = networkAddress; + } + + public String getNetworkAddress() + { + return networkAddress; + } + public void setNetworkIp(String networkIp) + { + this.networkIp = networkIp; + } + + public String getNetworkIp() + { + return networkIp; + } + public void setLongitude(BigDecimal longitude) + { + this.longitude = longitude; + } + + public BigDecimal getLongitude() + { + return longitude; + } + public void setLatitude(BigDecimal latitude) + { + this.latitude = latitude; + } + + public BigDecimal getLatitude() + { + return latitude; + } + public void setActiveTime(Date activeTime) + { + this.activeTime = activeTime; + } + + public Date getActiveTime() + { + return activeTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("deviceId", getDeviceId()) + .append("deviceName", getDeviceName()) + .append("productId", getProductId()) + .append("productName", getProductName()) + .append("userId", getUserId()) + .append("userName", getUserName()) + .append("tenantId", getTenantId()) + .append("tenantName", getTenantName()) + .append("serialNumber", getSerialNumber()) + .append("firmwareVersion", getFirmwareVersion()) + .append("status", getStatus()) + .append("rssi", getRssi()) + .append("networkAddress", getNetworkAddress()) + .append("networkIp", getNetworkIp()) + .append("longitude", getLongitude()) + .append("latitude", getLatitude()) + .append("activeTime", getActiveTime()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceGroup.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceGroup.java new file mode 100644 index 00000000..bf0cbb68 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceGroup.java @@ -0,0 +1,46 @@ +package com.fastbee.iot.domain; + +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 设备分组对象 iot_device_group + * + * @author kerwincui + * @date 2021-12-16 + */ +@ApiModel(value = "DeviceGroup", description = "设备分组对象 iot_device_group") +public class DeviceGroup +{ + private static final long serialVersionUID = 1L; + + /** 分组ID */ + @ApiModelProperty("分组ID") + private Long groupId; + + /** 设备ID */ + @ApiModelProperty("设备ID") + private Long deviceId; + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceJob.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceJob.java new file mode 100644 index 00000000..3f346947 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceJob.java @@ -0,0 +1,308 @@ +package com.fastbee.iot.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.annotation.Excel.ColumnType; +import com.fastbee.common.constant.ScheduleConstants; +import com.fastbee.common.core.domain.BaseEntity; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.quartz.util.CronUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; + +/** + * 设备定时任务 + * + * @author kerwincui + */ +@ApiModel(value = "DeviceJob", description = "设备定时任务 iot_device_job") +public class DeviceJob extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @ApiModelProperty("任务ID") + @Excel(name = "任务序号", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** 任务名称 */ + @ApiModelProperty("任务名称") + @Excel(name = "任务名称") + private String jobName; + + /** 设备编号 */ + @ApiModelProperty("设备编号") + @Excel(name = "设备编号") + private String serialNumber; + + /** 设备id */ + @ApiModelProperty("设备id") + private Long deviceId; + + /** 设备名称 */ + @ApiModelProperty("设备名称") + private String deviceName; + + /** 执行动作 */ + @ApiModelProperty("执行动作") + private String actions; + + /** 告警触发器 */ + @ApiModelProperty("告警触发器") + private String alertTrigger; + + /** 任务组名 */ + @ApiModelProperty("任务组名") + @Excel(name = "任务组名") + private String jobGroup; + + /** cron执行表达式 */ + @ApiModelProperty("cron执行表达式") + @Excel(name = "执行表达式 ") + private String cronExpression; + + /** cron计划策略 */ + @ApiModelProperty(value = "cron执行表达式", notes = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 是否并发执行(0允许 1禁止) */ + @ApiModelProperty(value = "是否并发执行", notes = "0=允许,1=禁止") + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + private String concurrent; + + /** 任务状态(0正常 1暂停) */ + @ApiModelProperty("任务状态(0正常 1暂停)") + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + private String status; + + /** 是否详细corn表达式 */ + @ApiModelProperty("是否详细corn表达式") + private Integer isAdvance; + + /** 定时类型(1=设备定时,2=设备告警,3=场景联动) */ + @ApiModelProperty(value = "定时类型", notes = "(1=设备定时,2=设备告警,3=场景联动)") + @Excel(name = "定时类型", readConverterExp = "1==设备定时,2=设备告警,3=场景联动") + private Integer jobType; + + /** 产品ID */ + @ApiModelProperty("产品ID") + @Excel(name = "产品ID") + private Long productId; + + /** 产品名称 */ + @ApiModelProperty("产品名称") + @Excel(name = "产品名称") + private String productName; + + /** 场景联动ID */ + @ApiModelProperty("场景联动ID") + @Excel(name = "场景联动ID") + private Long sceneId; + + /** 告警ID */ + @ApiModelProperty("告警ID") + @Excel(name = "告警ID") + private Long alertId; + + public String getAlertTrigger() { + return alertTrigger; + } + + public void setAlertTrigger(String alertTrigger) { + this.alertTrigger = alertTrigger; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public Integer getIsAdvance() { + return isAdvance; + } + + public void setIsAdvance(Integer isAdvance) { + this.isAdvance = isAdvance; + } + + public Integer getJobType() { + return jobType; + } + + public void setJobType(Integer jobType) { + this.jobType = jobType; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public Long getSceneId() { + return sceneId; + } + + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + + public Long getAlertId() { + return alertId; + } + + public void setAlertId(Long alertId) { + this.alertId = alertId; + } + + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getActions() { + return actions; + } + + public void setActions(String actions) { + this.actions = actions; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceLog.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceLog.java new file mode 100644 index 00000000..c7e273d1 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceLog.java @@ -0,0 +1,474 @@ +package com.fastbee.iot.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fastbee.iot.model.ThingsModelItem.*; +import com.fastbee.iot.model.ThingsModels.ThingsModelValueItemDto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 设备日志对象 iot_device_log + * + * @author kerwincui + * @date 2022-01-13 + */ +@ApiModel(value = "DeviceLog", description = "设备日志对象 iot_device_log") +public class DeviceLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + @Excel(name = "时间戳") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date ts; + /** 设备日志ID */ + @ApiModelProperty("设备日志ID") + private Long logId; + + /** 类型(1=属性上报,2=事件上报,3=调用功能,4=设备升级,5=设备上线,6=设备离线) */ + @ApiModelProperty(value = "类型", notes = "1=属性上报,2=事件上报,3=调用功能,4=设备升级,5=设备上线,6=设备离线") + @Excel(name = "类型", readConverterExp = "1=属性上报,2=事件上报,3=调用功能,4=设备升级,5=设备上线,6=设备离线") + private Integer logType; + + /** 日志值 */ + @ApiModelProperty("日志值") + @Excel(name = "日志值") + private String logValue; + + /** 物模型名称 */ + @ApiModelProperty("物模型名称") + @Excel(name = "物模型名称") + private String modelName; + + /** 设备ID */ + @ApiModelProperty("设备ID") + @Excel(name = "设备ID") + private Long deviceId; + + /** 设备名称 */ + @ApiModelProperty("设备名称") + @Excel(name = "设备名称") + private String deviceName; + + /** 设备编号 */ + @ApiModelProperty("设备编号") + @Excel(name = "设备编号") + private String serialNumber; + + /** 标识符 */ + @ApiModelProperty("标识符") + @Excel(name = "标识符") + private String identity; + + /** 是否监测数据(1=是,0=否) */ + @ApiModelProperty("是否监测数据(1=是,0=否)") + @Excel(name = "是否监测数据", readConverterExp = "1=是,0=否") + private Integer isMonitor; + + /** 模式 */ + @ApiModelProperty(value = "模式", notes = "1=影子模式,2=在线模式,3=其他") + @Excel(name = "模式", readConverterExp = "1=影子模式,2=在线模式,3=其他") + private Integer mode; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long userId; + + /** 用户昵称 */ + @ApiModelProperty("用户昵称") + @Excel(name = "用户昵称") + private String userName; + + /** 租户ID */ + @ApiModelProperty("租户ID") + @Excel(name = "租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + @Excel(name = "租户名称") + private String tenantName; + + /** 查询用的开始时间 */ + @ApiModelProperty("查询用的开始时间") + private String beginTime; + + /** 查询用的结束时间 */ + @ApiModelProperty("查询用的结束时间") + private String endTime; + + /** 查询的总数 */ + @ApiModelProperty("查询的总数") + private int total; + + /*消息ID,或消息流水号*/ + @ApiModelProperty("消息ID,或消息流水号") + private String serNo; + + private String specs; + + private DataType dataType; + + private Integer slaveId; + /** + * 计算公式 + */ + private String formula; + + private Integer isParams; + + /*是否历史存储*/ + private Integer isHistory; + + public Integer getIsHistory() { + return isHistory; + } + + public void setIsHistory(Integer isHistory) { + this.isHistory = isHistory; + } + + public Integer getIsParams() { + return isParams; + } + + public void setIsParams(Integer isParams) { + this.isParams = isParams; + } + + public String getFormula() { + return formula; + } + + public void setFormula(String formula) { + this.formula = formula; + } + + + public Integer getSlaveId() { + return slaveId; + } + + public void setSlaveId(Integer slaveId) { + this.slaveId = slaveId; + } + + public DataType getDataType() { + return dataType; + } + + public void setDataType(DataType dataType) { + this.dataType = dataType; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getSpecs() { + return specs; + } + + public void setSpecs(String specs) { + this.specs = specs; + } + + public String getSerNo() { + return serNo; + } + + public void setSerNo(String serNo) { + this.serNo = serNo; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public String getBeginTime() { + return beginTime; + } + + public void setBeginTime(String beginTime) { + this.beginTime = beginTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public Integer getMode() { + return mode; + } + + public void setMode(Integer mode) { + this.mode = mode; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public Date getTs() { + return ts; + } + + public void setTs(Date ts) { + this.ts = ts; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public void setLogId(Long logId) + { + this.logId = logId; + } + + public Long getLogId() + { + return logId; + } + + public void setLogType(Integer logType) + { + this.logType = logType; + } + + public Integer getLogType() + { + return logType; + } + public void setLogValue(String logValue) + { + this.logValue = logValue; + } + + public String getLogValue() + { + return logValue; + } + public void setDeviceId(Long deviceId) + { + this.deviceId = deviceId; + } + + public Long getDeviceId() + { + return deviceId; + } + public void setDeviceName(String deviceName) + { + this.deviceName = deviceName; + } + + public String getDeviceName() + { + return deviceName; + } + public void setIdentity(String identity) + { + this.identity = identity; + } + + public String getIdentity() + { + return identity; + } + public void setIsMonitor(Integer isMonitor) + { + this.isMonitor = isMonitor; + } + + public Integer getIsMonitor() + { + return isMonitor; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("logId", getLogId()) + .append("logType", getLogType()) + .append("logValue", getLogValue()) + .append("deviceId", getDeviceId()) + .append("deviceName", getDeviceName()) + .append("identity", getIdentity()) + .append("createBy", getCreateBy()) + .append("isMonitor", getIsMonitor()) + .append("createTime", getCreateTime()) + .append("remark", getRemark()) + .toString(); + } + + @ApiModel + public static class DataType{ + private String type; + private String falseText; + private String trueText; + private Integer maxLength; + private String arrayType; + private String unit; + private BigDecimal min; + private BigDecimal max; + private BigDecimal step; + private List enumList; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getFalseText() { + return falseText; + } + + public void setFalseText(String falseText) { + this.falseText = falseText; + } + + public String getTrueText() { + return trueText; + } + + public void setTrueText(String trueText) { + this.trueText = trueText; + } + + public Integer getMaxLength() { + return maxLength; + } + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + public String getArrayType() { + return arrayType; + } + + public void setArrayType(String arrayType) { + this.arrayType = arrayType; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public BigDecimal getMin() { + return min; + } + + public void setMin(BigDecimal min) { + this.min = min; + } + + public BigDecimal getMax() { + return max; + } + + public void setMax(BigDecimal max) { + this.max = max; + } + + public BigDecimal getStep() { + return step; + } + + public void setStep(BigDecimal step) { + this.step = step; + } + + public List getEnumList() { + return enumList; + } + + public void setEnumList(List enumList) { + this.enumList = enumList; + } + } + + @ApiModel + public static class EnumItem + { + private String text; + private String value; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceUser.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceUser.java new file mode 100644 index 00000000..ae85b4fd --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/DeviceUser.java @@ -0,0 +1,167 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 设备用户对象 iot_device_user + * + * @author kerwincui + * @date 2021-12-16 + */ +@ApiModel(value = "DeviceUser", description = "设备用户对象 iot_device_user") +public class DeviceUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 固件ID */ + @ApiModelProperty("设备ID") + private Long deviceId; + + /** 用户ID */ + @ApiModelProperty("用户ID") + private Long userId; + + /** 设备名称 */ + @ApiModelProperty("设备名称") + @Excel(name = "设备名称") + private String deviceName; + + /** 用户昵称 */ + @ApiModelProperty("用户昵称") + @Excel(name = "用户昵称") + private String userName; + + /** 是否为设备所有者 */ + @ApiModelProperty(value = "是否为设备所有者", notes = "0=否,1=是") + @Excel(name = "是否为设备所有者") + private Integer isOwner; + + /** 租户ID */ + @ApiModelProperty("租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + private String tenantName; + + /** 手机号码 */ + @ApiModelProperty("手机号码") + private String phonenumber; + + /** 分享用户设备权限 */ + @ApiModelProperty("物模型权限") + private String perms; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志(0代表存在 2代表删除)") + private String delFlag; + + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public String getPhonenumber() { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) { + this.phonenumber = phonenumber; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public void setDeviceId(Long deviceId) + { + this.deviceId = deviceId; + } + + public Long getDeviceId() + { + return deviceId; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setDeviceName(String deviceName) + { + this.deviceName = deviceName; + } + + public String getDeviceName() + { + return deviceName; + } + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserName() + { + return userName; + } + public void setIsOwner(Integer isOwner) + { + this.isOwner = isOwner; + } + + public Integer getIsOwner() + { + return isOwner; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("deviceId", getDeviceId()) + .append("userId", getUserId()) + .append("deviceName", getDeviceName()) + .append("userName", getUserName()) + .append("isOwner", getIsOwner()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/EventLog.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/EventLog.java new file mode 100644 index 00000000..abf92613 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/EventLog.java @@ -0,0 +1,237 @@ +package com.fastbee.iot.domain; + +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * @author gsb + * @date 2023/3/28 16:25 + */ +@ApiModel(value = "EventLog", description = "事件日志对象 iot_event_log") +public class EventLog extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 设备日志ID */ + @ApiModelProperty("设备日志ID") + private Long logId; + + /** 标识符 */ + @ApiModelProperty("标识符") + @Excel(name = "标识符") + private String identity; + + /** 物模型名称 */ + @ApiModelProperty("物模型名称") + @Excel(name = "物模型名称") + private String modelName; + + /** 类型(3=事件上报,5=设备上线,6=设备离线) */ + @ApiModelProperty(value = "类型", notes = "3==事件上报,5=设备上线,6=设备离线") + @Excel(name = "类型", readConverterExp = "3==事件上报,5=设备上线,6=设备离线") + private Integer logType; + + /** 日志值 */ + @ApiModelProperty("日志值") + @Excel(name = "日志值") + private String logValue; + + /** 设备ID */ + @ApiModelProperty("设备ID") + @Excel(name = "设备ID") + private Long deviceId; + + /** 设备名称 */ + @ApiModelProperty("设备名称") + @Excel(name = "设备名称") + private String deviceName; + + /** 设备编号 */ + @ApiModelProperty("设备编号") + @Excel(name = "设备编号") + private String serialNumber; + + /** 是否监测数据(1=是,0=否) */ + @ApiModelProperty(value = "是否监测数据", notes = "(1=是,0=否)") + @Excel(name = "是否监测数据", readConverterExp = "1==是,0=否") + private Integer isMonitor; + + /** 模式(1=影子模式,2=在线模式,3=其他) */ + @ApiModelProperty(value = "模式", notes = "(1=影子模式,2=在线模式,3=其他)") + @Excel(name = "模式(1=影子模式,2=在线模式,3=其他)") + private Integer mode; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long userId; + + /** 用户昵称 */ + @ApiModelProperty("用户昵称") + @Excel(name = "用户昵称") + private String userName; + + /** 租户ID */ + @ApiModelProperty("租户ID") + @Excel(name = "租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + @Excel(name = "租户名称") + private String tenantName; + + public void setLogId(Long logId) + { + this.logId = logId; + } + + public Long getLogId() + { + return logId; + } + public void setIdentity(String identity) + { + this.identity = identity; + } + + public String getIdentity() + { + return identity; + } + public void setModelName(String modelName) + { + this.modelName = modelName; + } + + public String getModelName() + { + return modelName; + } + public void setLogType(Integer logType) + { + this.logType = logType; + } + + public Integer getLogType() + { + return logType; + } + public void setLogValue(String logValue) + { + this.logValue = logValue; + } + + public String getLogValue() + { + return logValue; + } + public void setDeviceId(Long deviceId) + { + this.deviceId = deviceId; + } + + public Long getDeviceId() + { + return deviceId; + } + public void setDeviceName(String deviceName) + { + this.deviceName = deviceName; + } + + public String getDeviceName() + { + return deviceName; + } + public void setSerialNumber(String serialNumber) + { + this.serialNumber = serialNumber; + } + + public String getSerialNumber() + { + return serialNumber; + } + public void setIsMonitor(Integer isMonitor) + { + this.isMonitor = isMonitor; + } + + public Integer getIsMonitor() + { + return isMonitor; + } + public void setMode(Integer mode) + { + this.mode = mode; + } + + public Integer getMode() + { + return mode; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserName() + { + return userName; + } + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public Long getTenantId() + { + return tenantId; + } + public void setTenantName(String tenantName) + { + this.tenantName = tenantName; + } + + public String getTenantName() + { + return tenantName; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("logId", getLogId()) + .append("identity", getIdentity()) + .append("modelName", getModelName()) + .append("logType", getLogType()) + .append("logValue", getLogValue()) + .append("deviceId", getDeviceId()) + .append("deviceName", getDeviceName()) + .append("serialNumber", getSerialNumber()) + .append("isMonitor", getIsMonitor()) + .append("mode", getMode()) + .append("userId", getUserId()) + .append("userName", getUserName()) + .append("tenantId", getTenantId()) + .append("tenantName", getTenantName()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/FunctionLog.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/FunctionLog.java new file mode 100644 index 00000000..84bea9c7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/FunctionLog.java @@ -0,0 +1,121 @@ +package com.fastbee.iot.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 设备服务下发日志对象 iot_function_log + * + * @author kerwincui + * @date 2022-10-22 + */ +@ApiModel(value = "FunctionLog", description = "设备服务下发日志对象 iot_function_log") +@Data +public class FunctionLog +{ + private static final long serialVersionUID = 1L; + + /** 设备日志ID */ + @ApiModelProperty("设备日志ID") + private Long id; + + /** 标识符 */ + @ApiModelProperty("标识符") + @Excel(name = "标识符") + private String identify; + + /** 仅用于查询时筛选条件 */ + private String prefixIdentify; + + @ApiModelProperty("物模型名称") + private String modelName; + + + /** 类型(1=服务下发,2=属性获取,3.OTA升级) */ + @ApiModelProperty(value = "类型", notes = "(1=服务下发,2=属性获取,3.OTA升级)") + @Excel(name = "类型", readConverterExp = "1==服务下发,2=属性获取,3.OTA升级") + private Integer funType; + + /** 日志值 */ + @ApiModelProperty("日志值") + @Excel(name = "日志值") + private String funValue; + /** + * 显示值 + */ + @ApiModelProperty("显示值") + private String showValue; + + /** 消息id */ + @ApiModelProperty("消息id") + @Excel(name = "消息id") + private String messageId; + + /** 设备名称 */ + @ApiModelProperty("设备名称") + @Excel(name = "设备名称") + private String deviceName; + + /** 设备编号 */ + @ApiModelProperty("设备编号") + @Excel(name = "设备编号") + private String serialNumber; + + /** 模式(1=影子模式,2=在线模式,3=其他) */ + @ApiModelProperty(value = "模式", notes = "(1=影子模式,2=在线模式,3=其他)") + @Excel(name = "模式(1=影子模式,2=在线模式,3=其他)") + private Integer mode; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long userId; + + /** 下发结果描述 */ + @ApiModelProperty("下发结果描述") + @Excel(name = "下发结果描述") + private String resultMsg; + + /** 下发结果代码 */ + @ApiModelProperty("下发结果代码") + @Excel(name = "下发结果代码") + private Integer resultCode; + + /** + * 设备回复时间 + */ + @ApiModelProperty("设备回复时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date replyTime; + + /** 创建者 */ + @ApiModelProperty("创建者") + private String createBy; + + /** 创建时间 */ + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + private List list; + /** 备注 */ + private String remark; + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Group.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Group.java new file mode 100644 index 00000000..04e0f631 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Group.java @@ -0,0 +1,120 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 设备分组对象 iot_group + * + * @author kerwincui + * @date 2021-12-16 + */ +@ApiModel(value = "Group", description = "设备分组对象 iot_group") +public class Group extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 分组ID */ + @ApiModelProperty("分组ID") + private Long groupId; + + /** 分组名称 */ + @ApiModelProperty("分组名称") + @Excel(name = "分组名称") + private String groupName; + + /** 分组排序 */ + @ApiModelProperty("分组排序") + @Excel(name = "分组排序") + private Long groupOrder; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long userId; + + /** 用户昵称 */ + @ApiModelProperty("用户昵称") + @Excel(name = "用户昵称") + private String userName; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + public void setGroupId(Long groupId) + { + this.groupId = groupId; + } + + public Long getGroupId() + { + return groupId; + } + public void setGroupName(String groupName) + { + this.groupName = groupName; + } + + public String getGroupName() + { + return groupName; + } + public void setGroupOrder(Long groupOrder) + { + this.groupOrder = groupOrder; + } + + public Long getGroupOrder() + { + return groupOrder; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserName() + { + return userName; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("groupId", getGroupId()) + .append("groupName", getGroupName()) + .append("groupOrder", getGroupOrder()) + .append("userId", getUserId()) + .append("userName", getUserName()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/News.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/News.java new file mode 100644 index 00000000..bbcadada --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/News.java @@ -0,0 +1,195 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 新闻资讯对象 news + * + * @author kerwincui + * @date 2022-04-09 + */ +@ApiModel(value = "News", description = "新闻资讯对象 news") +public class News extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 新闻ID */ + @ApiModelProperty("新闻ID") + private Long newsId; + + /** 标题 */ + @ApiModelProperty("标题") + @Excel(name = "标题") + private String title; + + /** 内容 */ + @ApiModelProperty("内容") + @Excel(name = "内容") + private String content; + + /** 图片 */ + @ApiModelProperty("图片") + @Excel(name = "图片") + private String imgUrl; + + /** 置顶 */ + @ApiModelProperty("是否置顶") + @Excel(name = "置顶") + private Integer isTop; + + /** 广告 */ + @ApiModelProperty("广告") + @Excel(name = "广告") + private Integer isBanner; + + /** 分类ID */ + @ApiModelProperty("分类ID") + @Excel(name = "分类ID") + private Long categoryId; + + /** 分类名称 */ + @ApiModelProperty("分类名称") + @Excel(name = "分类名称") + private String categoryName; + + /** 发布 */ + @ApiModelProperty("新闻状态(0-未发布,1-已发布)") + @Excel(name = "发布") + private Integer status; + + /** 作者 */ + @ApiModelProperty("作者") + @Excel(name = "作者") + private String author; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + public void setNewsId(Long newsId) + { + this.newsId = newsId; + } + + public Long getNewsId() + { + return newsId; + } + public void setTitle(String title) + { + this.title = title; + } + + public String getTitle() + { + return title; + } + public void setContent(String content) + { + this.content = content; + } + + public String getContent() + { + return content; + } + public void setImgUrl(String imgUrl) + { + this.imgUrl = imgUrl; + } + + public String getImgUrl() + { + return imgUrl; + } + public void setIsTop(Integer isTop) + { + this.isTop = isTop; + } + + public Integer getIsTop() + { + return isTop; + } + public void setIsBanner(Integer isBanner) + { + this.isBanner = isBanner; + } + + public Integer getIsBanner() + { + return isBanner; + } + public void setCategoryId(Long categoryId) + { + this.categoryId = categoryId; + } + + public Long getCategoryId() + { + return categoryId; + } + public void setCategoryName(String categoryName) + { + this.categoryName = categoryName; + } + + public String getCategoryName() + { + return categoryName; + } + public void setStatus(Integer status) + { + this.status = status; + } + + public Integer getStatus() + { + return status; + } + public void setAuthor(String author) + { + this.author = author; + } + + public String getAuthor() + { + return author; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("newsId", getNewsId()) + .append("title", getTitle()) + .append("content", getContent()) + .append("imgUrl", getImgUrl()) + .append("isTop", getIsTop()) + .append("isBanner", getIsBanner()) + .append("categoryId", getCategoryId()) + .append("categoryName", getCategoryName()) + .append("status", getStatus()) + .append("author", getAuthor()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/NewsCategory.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/NewsCategory.java new file mode 100644 index 00000000..dfdd8edd --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/NewsCategory.java @@ -0,0 +1,91 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 新闻分类对象 news_category + * + * @author kerwincui + * @date 2022-04-09 + */ +@ApiModel(value = "NewsCategory", description = "新闻分类对象 news_category") +public class NewsCategory extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 分类ID */ + @ApiModelProperty("分类ID") + @Excel(name = "分类ID") + private Long categoryId; + + /** 分类名字 */ + @ApiModelProperty("分类名字") + @Excel(name = "分类名字") + private String categoryName; + + /** 显示顺序 */ + @ApiModelProperty("显示顺序") + @Excel(name = "显示顺序") + private Integer orderNum; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + public void setCategoryId(Long categoryId) + { + this.categoryId = categoryId; + } + + public Long getCategoryId() + { + return categoryId; + } + public void setCategoryName(String categoryName) + { + this.categoryName = categoryName; + } + + public String getCategoryName() + { + return categoryName; + } + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public Integer getOrderNum() + { + return orderNum; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("categoryId", getCategoryId()) + .append("categoryName", getCategoryName()) + .append("orderNum", getOrderNum()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/OauthClientDetails.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/OauthClientDetails.java new file mode 100644 index 00000000..814d5631 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/OauthClientDetails.java @@ -0,0 +1,206 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 云云对接对象 oauth_client_details + * + * @author kerwincui + * @date 2022-02-07 + */ +@ApiModel(value = "OauthClientDetails", description = "云云对接对象 oauth_client_details") +public class OauthClientDetails extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 客户端ID */ + @ApiModelProperty("客户端ID") + @Excel(name = "客户端ID") + private String clientId; + + /** 资源 */ + @ApiModelProperty("资源") + @Excel(name = "资源") + private String resourceIds; + + /** 客户端秘钥 */ + @ApiModelProperty("客户端秘钥") + private String clientSecret; + + /** 权限范围 */ + @ApiModelProperty("权限范围") + @Excel(name = "权限范围") + private String scope; + + /** 授权模式 */ + @ApiModelProperty("授权模式") + @Excel(name = "授权模式") + private String authorizedGrantTypes; + + /** 回调地址 */ + @ApiModelProperty("回调地址") + @Excel(name = "回调地址") + private String webServerRedirectUri; + + /** 权限 */ + @ApiModelProperty("权限") + @Excel(name = "权限") + private String authorities; + + /** access token有效时间 */ + @ApiModelProperty("access token有效时间") + @Excel(name = "access token有效时间") + private Long accessTokenValidity; + + /** refresh token有效时间 */ + @ApiModelProperty("refresh token有效时间") + @Excel(name = "refresh token有效时间") + private Long refreshTokenValidity; + + /** 预留的字段 */ + @ApiModelProperty("预留的字段") + @Excel(name = "预留的字段") + private String additionalInformation; + + /** 自动授权 */ + @ApiModelProperty("自动授权") + @Excel(name = "自动授权") + private String autoapprove; + + /** 平台 */ + @ApiModelProperty("平台") + @Excel(name = "平台") + private Integer type; + + public void setClientId(String clientId) + { + this.clientId = clientId; + } + + public String getClientId() + { + return clientId; + } + public void setResourceIds(String resourceIds) + { + this.resourceIds = resourceIds; + } + + public String getResourceIds() + { + return resourceIds; + } + public void setClientSecret(String clientSecret) + { + this.clientSecret = clientSecret; + } + + public String getClientSecret() + { + return clientSecret; + } + public void setScope(String scope) + { + this.scope = scope; + } + + public String getScope() + { + return scope; + } + public void setAuthorizedGrantTypes(String authorizedGrantTypes) + { + this.authorizedGrantTypes = authorizedGrantTypes; + } + + public String getAuthorizedGrantTypes() + { + return authorizedGrantTypes; + } + public void setWebServerRedirectUri(String webServerRedirectUri) + { + this.webServerRedirectUri = webServerRedirectUri; + } + + public String getWebServerRedirectUri() + { + return webServerRedirectUri; + } + public void setAuthorities(String authorities) + { + this.authorities = authorities; + } + + public String getAuthorities() + { + return authorities; + } + public void setAccessTokenValidity(Long accessTokenValidity) + { + this.accessTokenValidity = accessTokenValidity; + } + + public Long getAccessTokenValidity() + { + return accessTokenValidity; + } + public void setRefreshTokenValidity(Long refreshTokenValidity) + { + this.refreshTokenValidity = refreshTokenValidity; + } + + public Long getRefreshTokenValidity() + { + return refreshTokenValidity; + } + public void setAdditionalInformation(String additionalInformation) + { + this.additionalInformation = additionalInformation; + } + + public String getAdditionalInformation() + { + return additionalInformation; + } + public void setAutoapprove(String autoapprove) + { + this.autoapprove = autoapprove; + } + + public String getAutoapprove() + { + return autoapprove; + } + public void setType(Integer type) + { + this.type = type; + } + + public Integer getType() + { + return type; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("clientId", getClientId()) + .append("resourceIds", getResourceIds()) + .append("clientSecret", getClientSecret()) + .append("scope", getScope()) + .append("authorizedGrantTypes", getAuthorizedGrantTypes()) + .append("webServerRedirectUri", getWebServerRedirectUri()) + .append("authorities", getAuthorities()) + .append("accessTokenValidity", getAccessTokenValidity()) + .append("refreshTokenValidity", getRefreshTokenValidity()) + .append("additionalInformation", getAdditionalInformation()) + .append("autoapprove", getAutoapprove()) + .append("type", getType()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Product.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Product.java new file mode 100644 index 00000000..7e53ea4c --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Product.java @@ -0,0 +1,318 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 产品对象 iot_product + * + * @author kerwincui + * @date 2021-12-16 + */ +@ApiModel(value = "Product", description = "产品对象 iot_product") +public class Product extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 产品ID */ + @ApiModelProperty("产品ID") + private Long productId; + + /** 产品名称 */ + @ApiModelProperty("产品名称") + @Excel(name = "产品名称") + private String productName; + + /** 产品分类ID */ + @ApiModelProperty("产品分类ID") + @Excel(name = "产品分类ID") + private Long categoryId; + + /** 产品分类名称 */ + @ApiModelProperty("产品分类名称") + @Excel(name = "产品分类名称") + private String categoryName; + + /** 租户ID */ + @ApiModelProperty("租户ID") + @Excel(name = "租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + @Excel(name = "租户名称") + private String tenantName; + + /** 是否系统通用(0-否,1-是) */ + @ApiModelProperty(value = "是否系统通用", notes = "(0-否,1-是)") + @Excel(name = "是否系统通用", readConverterExp = "0=-否,1-是") + private Integer isSys; + + /** 是否启用授权码(0-否,1-是) */ + @ApiModelProperty(value = "是否启用授权码", notes = "(0-否,1-是)") + @Excel(name = "是否启用授权码", readConverterExp = "0=-否,1-是") + private Integer isAuthorize; + + /** mqtt账号 */ + @ApiModelProperty("mqtt账号") + private String mqttAccount; + + /** mqtt密码 */ + @ApiModelProperty("mqtt密码") + private String mqttPassword; + + /** 产品秘钥 */ + @ApiModelProperty("产品秘钥") + private String mqttSecret; + + /*产品协议编号*/ + @ApiModelProperty("产品协议编号") + private String protocolCode; + + /*产品支持的传输协议,多个的选一个即可*/ + @ApiModelProperty("产品支持的传输协议,多个的选一个即可") + private String transport; + + public String getTransport() { + return transport; + } + + public void setTransport(String transport) { + this.transport = transport; + } + + public String getProtocolCode() { + return protocolCode; + } + + public void setProtocolCode(String protocolCode) { + this.protocolCode = protocolCode; + } + + public String getMqttSecret() { + return mqttSecret; + } + + public void setMqttSecret(String mqttSecret) { + this.mqttSecret = mqttSecret; + } + + /** 状态(1-未发布,2-已发布,不能修改) */ + @ApiModelProperty(value = "状态", notes = "(1-未发布,2-已发布,不能修改)") + @Excel(name = "状态", readConverterExp = "1==未发布,2=已发布,不能修改") + private Integer status; + + /** 设备类型(1-直连设备、2-网关子设备、3-网关设备) */ + @ApiModelProperty(value = "设备类型", notes = "(1-直连设备、2-网关子设备、3-网关设备)") + @Excel(name = "设备类型", readConverterExp = "1=直连设备、2=网关设备、3=监控设备") + private Integer deviceType; + + /** 联网方式(1=-wifi、2-蜂窝(2G/3G/4G/5G)、3-以太网、4-其他) */ + @ApiModelProperty(value = "联网方式", notes = "(1=-wifi、2-蜂窝(2G/3G/4G/5G)、3-以太网、4-其他)") + @Excel(name = "联网方式", readConverterExp = "1=-wifi、2=蜂窝(2G/3G/4G/5G)、3=以太网、4=其他") + private Integer networkMethod; + + /** 认证方式(1-账号密码、2-证书、3-Http) */ + @ApiModelProperty(value = "认证方式", notes = "(1-账号密码、2-证书、3-Http)") + @Excel(name = "认证方式", readConverterExp = "1=账号密码、2=证书、3=Http") + private Integer vertificateMethod; + + /** 图片地址 */ + @ApiModelProperty("图片地址") + private String imgUrl; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty(value = "删除标志", notes = "(0代表存在 2代表删除)") + private String delFlag; + + /** 物模型Json **/ + @ApiModelProperty("物模型Json") + private String thingsModelsJson; + + /**采集点模板id*/ + @ApiModelProperty("采集点模板id") + private Long templateId; + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public String getThingsModelsJson() { + return thingsModelsJson; + } + + public void setThingsModelsJson(String thingsModelsJson) { + this.thingsModelsJson = thingsModelsJson; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public void setProductId(Long productId) + { + this.productId = productId; + } + + public Long getProductId() + { + return productId; + } + public void setProductName(String productName) + { + this.productName = productName; + } + + public String getProductName() + { + return productName; + } + public void setCategoryId(Long categoryId) + { + this.categoryId = categoryId; + } + + public Long getCategoryId() + { + return categoryId; + } + public void setCategoryName(String categoryName) + { + this.categoryName = categoryName; + } + + public String getCategoryName() + { + return categoryName; + } + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public Long getTenantId() + { + return tenantId; + } + + public void setTenantName(String tenantName) + { + this.tenantName = tenantName; + } + public String getTenantName() + { + return tenantName; + } + + public void setIsSys(Integer isSys) + { + this.isSys = isSys; + } + public Integer getIsSys() + { + return isSys; + } + + public void setIsAuthorize(Integer isAuthorize) {this.isAuthorize = isAuthorize;} + public Integer getIsAuthorize() {return isAuthorize;} + + public void setMqttAccount(String mqttAccount) + { + this.mqttAccount = mqttAccount; + } + public String getMqttAccount() + { + return mqttAccount; + } + + public void setMqttPassword(String mqttPassword) + { + this.mqttPassword = mqttPassword; + } + public String getMqttPassword() + { + return mqttPassword; + } + + public void setStatus(Integer status) + { + this.status = status; + } + + public Integer getStatus() + { + return status; + } + public void setDeviceType(Integer deviceType) + { + this.deviceType = deviceType; + } + + public Integer getDeviceType() + { + return deviceType; + } + public void setNetworkMethod(Integer networkMethod) + { + this.networkMethod = networkMethod; + } + + public Integer getNetworkMethod() + { + return networkMethod; + } + public void setVertificateMethod(Integer vertificateMethod) + { + this.vertificateMethod = vertificateMethod; + } + + public Integer getVertificateMethod() + { + return vertificateMethod; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("productId", getProductId()) + .append("productName", getProductName()) + .append("categoryId", getCategoryId()) + .append("categoryName", getCategoryName()) + .append("tenantId", getTenantId()) + .append("tenantName", getTenantName()) + .append("isSys", getIsSys()) + .append("isAuthorize", getIsAuthorize()) + .append("status", getStatus()) + .append("deviceType", getDeviceType()) + .append("networkMethod", getNetworkMethod()) + .append("vertificateMethod", getVertificateMethod()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ProductAuthorize.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ProductAuthorize.java new file mode 100644 index 00000000..6a45e901 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ProductAuthorize.java @@ -0,0 +1,171 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 产品授权码对象 iot_product_authorize + * + * @author kami + * @date 2022-04-11 + */ +@ApiModel(value = "ProductAuthorize", description = "产品授权码对象 iot_product_authorize") +public class ProductAuthorize extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 授权码ID */ + @ApiModelProperty("授权码ID") + private Long authorizeId; + + /** 授权码 */ + @ApiModelProperty("授权码") + @Excel(name = "授权码") + private String authorizeCode; + + /** 产品ID */ + @ApiModelProperty("产品ID") + @Excel(name = "产品ID") + private Long productId; + + /** 设备ID */ + @ApiModelProperty("设备ID") + @Excel(name = "设备ID") + private Long deviceId; + + /** 设备编号 */ + @ApiModelProperty("设备编号") + @Excel(name = "设备编号") + private String serialNumber; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long userId; + + /** 用户名称 */ + @ApiModelProperty("用户名称") + @Excel(name = "用户名称") + private String userName; + + /** 状态(1-未发布,2-已发布,不能修改) */ + @ApiModelProperty(value = "状态", notes = "(1-未发布,2-已发布,不能修改)") + @Excel(name = "状态", readConverterExp = "1=未使用,2=已使用") + private Integer status; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + public ProductAuthorize() { + } + + public ProductAuthorize(String authorizeCode, Long productId) { + this.authorizeCode = authorizeCode; + this.productId = productId; + } + + public void setStatus(Integer status) + { + this.status = status; + } + public Integer getStatus() + { + return status; + } + public void setAuthorizeId(Long authorizeId) + { + this.authorizeId = authorizeId; + } + + public Long getAuthorizeId() + { + return authorizeId; + } + public void setAuthorizeCode(String authorizeCode) + { + this.authorizeCode = authorizeCode; + } + + public String getAuthorizeCode() + { + return authorizeCode; + } + public void setProductId(Long productId) + { + this.productId = productId; + } + + public Long getProductId() + { + return productId; + } + public void setDeviceId(Long deviceId) + { + this.deviceId = deviceId; + } + + public Long getDeviceId() + { + return deviceId; + } + public void setSerialNumber(String serialNumber) + { + this.serialNumber = serialNumber; + } + + public String getSerialNumber() + { + return serialNumber; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserName() + { + return userName; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("authorizeId", getAuthorizeId()) + .append("authorizeCode", getAuthorizeCode()) + .append("productId", getProductId()) + .append("deviceId", getDeviceId()) + .append("serialNumber", getSerialNumber()) + .append("userId", getUserId()) + .append("userName", getUserName()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Protocol.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Protocol.java new file mode 100644 index 00000000..39eecd13 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/Protocol.java @@ -0,0 +1,47 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 协议管理model + * @author gsb + * @date 2022/10/19 15:35 + */ +@ApiModel(value = "Protocol", description = "协议管理对象 iot_protocol") +@Data +public class Protocol { + + @ApiModelProperty("主键ID") + private Long id; + /*协议编码*/ + @ApiModelProperty("协议编码") + private String protocolCode; + /*协议名称*/ + @ApiModelProperty("协议名称") + private String protocolName; + /*协议jar包,js包 c程序上传地址*/ + @ApiModelProperty("协议jar包,js包 c程序上传地址") + private String protocolFileUrl; + /*协议类型 0:未知 1:jar 2:js 3:C*/ + @ApiModelProperty("协议类型 0:未知 1:jar 2:js 3:C") + private Integer protocolType; + /*协议文件摘要(文件的md5)*/ + @ApiModelProperty("协议文件摘要(文件的md5)") + private String jarSign; + /*创建时间*/ + @ApiModelProperty("创建时间") + private Date createTime; + /*更新时间*/ + @ApiModelProperty("更新时间") + private Date updateTime; + /*0:草稿 1:启用 2:停用*/ + @ApiModelProperty("0:草稿 1:启用 2:停用") + private Integer protocolStatus; + /*'0:正常 1:删除*/ + @ApiModelProperty("'0:正常 1:删除") + private Integer delFlag; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialPlatform.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialPlatform.java new file mode 100644 index 00000000..d3f40b5f --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialPlatform.java @@ -0,0 +1,189 @@ +package com.fastbee.iot.domain; + +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 第三方登录平台控制对象 iot_social_platform + * + * @author kerwincui + * @date 2022-04-11 + */ +@ApiModel(value = "SocialPlatform", description = "第三方登录平台控制对象 iot_social_platform") +public class SocialPlatform extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 第三方登录平台主键 + */ + @ApiModelProperty("第三方登录平台主键") + private Long socialPlatformId; + + /** + * 第三方登录平台 + */ + @ApiModelProperty("第三方登录平台") + @Excel(name = "第三方登录平台") + private String platform; + + /** + * 0、内部上线 1、上线 2、下线 + */ + @ApiModelProperty("0、内部上线 1、上线 2、下线") + @Excel(name = "0、内部上线 1、上线 2、下线") + private String status; + + /** + * 第三方平台申请Id + */ + @ApiModelProperty("第三方平台申请Id") + @Excel(name = "第三方平台申请Id") + private String clientId; + + /** + * 第三方平台密钥 + */ + @ApiModelProperty("第三方平台密钥") + @Excel(name = "第三方平台密钥") + private String secretKey; + + /** + * 用户认证后跳转地址 + */ + @ApiModelProperty("用户认证后跳转地址") + @Excel(name = "用户认证后跳转地址") + private String redirectUri; + + /** + * 删除标记位(0代表存在,2代表删除) + */ + @ApiModelProperty("删除标记位(0代表存在,2代表删除)") + private String delFlag; + + /** + * 绑定注册登录uri + */ + @ApiModelProperty("绑定注册登录uri") + @Excel(name = "绑定注册登录uri") + private String bindUri; + + /** + * 跳转登录uri + */ + @ApiModelProperty("跳转登录uri") + @Excel(name = "跳转登录uri") + private String redirectLoginUri; + + /** + * 错误提示uri + */ + @ApiModelProperty("错误提示uri") + @Excel(name = "错误提示uri") + private String errorMsgUri; + + public Long getSocialPlatformId() { + return socialPlatformId; + } + + public void setSocialPlatformId(Long socialPlatformId) { + this.socialPlatformId = socialPlatformId; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public String getRedirectUri() { + return redirectUri; + } + + public void setRedirectUri(String redirectUri) { + this.redirectUri = redirectUri; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getBindUri() { + return bindUri; + } + + public void setBindUri(String bindUri) { + this.bindUri = bindUri; + } + + public String getRedirectLoginUri() { + return redirectLoginUri; + } + + public void setRedirectLoginUri(String redirectLoginUri) { + this.redirectLoginUri = redirectLoginUri; + } + + public String getErrorMsgUri() { + return errorMsgUri; + } + + public void setErrorMsgUri(String errorMsgUri) { + this.errorMsgUri = errorMsgUri; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("socialPlatformId", getSocialPlatformId()) + .append("platform", getPlatform()) + .append("status", getStatus()) + .append("clientId", getClientId()) + .append("secretKey", getSecretKey()) + .append("redirectUri", getRedirectUri()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .append("remark", getRemark()) + .append("bindUri", getBindUri()) + .append("redirectLoginUri", getRedirectLoginUri()) + .append("errorMsgUri", getErrorMsgUri()) + .toString(); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialUser.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialUser.java new file mode 100644 index 00000000..bcc51187 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/SocialUser.java @@ -0,0 +1,188 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 用户第三方用户信息对象 iot_social_user + * + * @author json + * @date 2022-04-18 + */ +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "SocialUser", description = "用户第三方用户信息对象 iot_social_user") +@Accessors(chain = true) +@Data +public class SocialUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 第三方系统用户表主键 */ + @ApiModelProperty("第三方系统用户表主键") + private Long socialUserId; + + /** 第三方系统的唯一ID */ + @ApiModelProperty("第三方系统的唯一ID") + @Excel(name = "第三方系统的唯一ID") + private String uuid; + + /** 第三方用户来源 */ + @ApiModelProperty("第三方用户来源") + @Excel(name = "第三方用户来源") + private String source; + + /** 用户的授权令牌 */ + @ApiModelProperty("用户的授权令牌") + @Excel(name = "用户的授权令牌") + private String accessToken; + + /** 第三方用户的授权令牌的有效期(部分平台可能没有) */ + @ApiModelProperty(value = "第三方用户的授权令牌的有效期", notes = "(部分平台可能没有)") + @Excel(name = "第三方用户的授权令牌的有效期", readConverterExp = "部=分平台可能没有") + private Long expireIn; + + /** 刷新令牌(部分平台可能没有) */ + @ApiModelProperty(value = "刷新令牌", notes = "(部分平台可能没有)") + @Excel(name = "刷新令牌(部分平台可能没有)") + private String refreshToken; + + /** 第三方用户的 open id(部分平台可能没有) */ + @ApiModelProperty(value = "第三方用户的 open id", notes = "(部分平台可能没有)") + @Excel(name = "第三方用户的 open id", readConverterExp = "部=分平台可能没有") + private String openId; + + /** 第三方用户的 ID(部分平台可能没有) */ + @ApiModelProperty(value = "第三方用户的 ID", notes = "(部分平台可能没有)") + @Excel(name = "第三方用户的 ID(部分平台可能没有)") + private String uid; + + /** 个别平台的授权信息(部分平台可能没有) */ + @ApiModelProperty(value = "个别平台的授权信息", notes = "(部分平台可能没有)") + @Excel(name = "个别平台的授权信息", readConverterExp = "部=分平台可能没有") + private String accessCode; + + /** 第三方用户的 union id(部分平台可能没有) */ + @ApiModelProperty(value = "第三方用户的 union id", notes = "(部分平台可能没有)") + @Excel(name = "第三方用户的 union id(部分平台可能没有)") + private String unionId; + + /** 第三方用户授予的权限(部分平台可能没有) */ + @ApiModelProperty(value = "第三方用户授予的权限", notes = "(部分平台可能没有)") + @Excel(name = "第三方用户授予的权限(部分平台可能没有)") + private String scope; + + /** 个别平台的授权信息(部分平台可能没有) */ + @ApiModelProperty(value = "个别平台的授权信息", notes = "(部分平台可能没有)") + @Excel(name = "个别平台的授权信息", readConverterExp = "部=分平台可能没有") + private String tokenType; + + /** id token(部分平台可能没有) */ + @ApiModelProperty(value = "id token", notes = "(部分平台可能没有)") + @Excel(name = "id token", readConverterExp = "部=分平台可能没有") + private String idToken; + + /** 小米平台用户的附带属性(部分平台可能没有) */ + @ApiModelProperty(value = "小米平台用户的附带属性", notes = "(部分平台可能没有)") + @Excel(name = "小米平台用户的附带属性", readConverterExp = "部=分平台可能没有") + private String macAlgorithm; + + /** 小米平台用户的附带属性(部分平台可能没有) */ + @ApiModelProperty(value = "小米平台用户的附带属性", notes = "(部分平台可能没有) ") + @Excel(name = "小米平台用户的附带属性(部分平台可能没有)") + private String macKey; + + /** 用户的授权code(部分平台可能没有) */ + @ApiModelProperty(value = "用户的授权code", notes = "(部分平台可能没有)") + @Excel(name = "用户的授权code", readConverterExp = "部=分平台可能没有") + private String code; + + /** Twitter平台用户的附带属性(部分平台可能没有) */ + @ApiModelProperty(value = "Twitter平台用户的附带属性", notes = "(部分平台可能没有) ") + @Excel(name = "Twitter平台用户的附带属性(部分平台可能没有)") + private String oauthToken; + + /** Twitter平台用户的附带属性(部分平台可能没有) */ + @ApiModelProperty(value = "Twitter平台用户的附带属性", notes = "(部分平台可能没有)") + @Excel(name = "Twitter平台用户的附带属性(部分平台可能没有)") + private String oauthTokenSecret; + + /** 删除标记位(0代表存在,2代表删除) */ + @ApiModelProperty("删除标记位") + private String delFlag; + + /** 绑定状态(0:未绑定,1:绑定) */ + @ApiModelProperty(value = "绑定状态", notes = "(0:未绑定,1:绑定)") + @Excel(name = "绑定状态(0:未绑定,1:绑定)") + private String status; + + /** 用户ID */ + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long sysUserId; + + /** 用户名 */ + @ApiModelProperty("用户名") + @Excel(name = "用户名") + private String username; + + /** 用户昵称 */ + @ApiModelProperty("用户昵称") + @Excel(name = "用户昵称") + private String nickname; + + /** 用户头像 */ + @ApiModelProperty("用户头像") + @Excel(name = "用户头像") + private String avatar; + + /** 用户性别 */ + @ApiModelProperty("用户性别") + @Excel(name = "用户性别") + private Integer gender; + /** 三方登录具体来源 */ + @ApiModelProperty("三方登录具体来源") + @Excel(name = "三方登录具体来源") + private String sourceClient; + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("socialUserId", getSocialUserId()) + .append("uuid", getUuid()) + .append("source", getSource()) + .append("accessToken", getAccessToken()) + .append("expireIn", getExpireIn()) + .append("refreshToken", getRefreshToken()) + .append("openId", getOpenId()) + .append("uid", getUid()) + .append("accessCode", getAccessCode()) + .append("unionId", getUnionId()) + .append("scope", getScope()) + .append("tokenType", getTokenType()) + .append("idToken", getIdToken()) + .append("macAlgorithm", getMacAlgorithm()) + .append("macKey", getMacKey()) + .append("code", getCode()) + .append("oauthToken", getOauthToken()) + .append("oauthTokenSecret", getOauthTokenSecret()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .append("delFlag", getDelFlag()) + .append("status", getStatus()) + .append("sysUserId", getSysUserId()) + .append("username", getUsername()) + .append("nickname", getNickname()) + .append("avatar", getAvatar()) + .append("gender", getGender()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModel.java new file mode 100644 index 00000000..c78737d8 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModel.java @@ -0,0 +1,452 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 物模型对象 iot_things_model + * + * @author kerwincui + * @date 2023-01-14 + */ +@ApiModel(value = "ThingsModel", description = "物模型对象 iot_things_model") +public class ThingsModel extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 物模型ID */ + @ApiModelProperty("物模型ID") + private Long modelId; + + /** 物模型名称 */ + @ApiModelProperty("物模型名称") + @Excel(name = "物模型名称" ,prompt = "必填") + private String modelName; + + /** 产品ID */ + @ApiModelProperty("产品ID") + private Long productId; + + /** 产品名称 */ + @ApiModelProperty("产品名称") + private String productName; + + /** 租户ID */ + @ApiModelProperty("租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + private String tenantName; + + /** 标识符,产品下唯一 */ + @ApiModelProperty("标识符,产品下唯一") + @Excel(name = "标识符",prompt = "modbus不填默认为寄存器地址") + private String identifier; + + /** 模型类别(1-属性,2-功能,3-事件) */ + @ApiModelProperty(value = "模型类别", notes = "(1-属性,2-功能,3-事件)") + @Excel(name = "模型类别", readConverterExp = "1=属性,2=功能,3=事件,4=属性和功能", + prompt ="1=属性,2-功能,3-事件") + private Integer type; + + /** 从机id */ + @ApiModelProperty("从机id") + private Integer tempSlaveId; + + /** 寄存器地址 */ + @ApiModelProperty("寄存器地址") + @Excel(name = "寄存器地址" , prompt = "可填写10进制或16进制,16带H,例如:0020H") + private String regStr; + + /** 计算公式 */ + @ApiModelProperty("计算公式") + @Excel(name = "计算公式",prompt = "选填,例如:%s*10,%s是占位符") + private String formula; + + /** 数据定义 */ + //@Excel(name = "数据定义") + @ApiModelProperty("数据定义") + private String specs; + + + /** 控制公式 */ + @ApiModelProperty("控制公式") + @Excel(name = "控制公式",prompt = "选填,例如:%s*10,%s是占位符") + private String reverseFormula; + + /** 寄存器地址值 */ + @ApiModelProperty("寄存器地址值") + private Integer regAddr; + + + /** 是否图表显示(0-否,1-是) */ + @ApiModelProperty(value = "是否图表显示", notes = "(0-否,1-是)") + @Excel(name = "是否图表显示", readConverterExp = "0=否,1=是") + private Integer isChart; + + /** 是否历史存储(0-否,1-是) */ + @ApiModelProperty(value = "是否历史存储", notes = "(0-否,1-是)") + @Excel(name = "是否历史存储", readConverterExp = "0=否,1=是") + private Integer isHistory; + + /** 是否实时监测(0-否,1-是) */ + @ApiModelProperty(value = "是否实时监测", notes = "(0-否,1-是) ") + @Excel(name = "是否实时监测", readConverterExp = "0=否,1=是") + private Integer isMonitor; + + /** 是否分享设备权限(0-否,1-是) */ + @ApiModelProperty(value = "是否分享设备权限", notes = "(0-否,1-是) ") + @Excel(name = "是否分享设备权限", readConverterExp = "0=否,1=是") + private Integer isSharePerm; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志") + private String delFlag; + + @Excel(name = "单位") + private String unit; + + /** 数值类型 1.数值 2.选项 */ + @ApiModelProperty(value = "数值类型", notes = "1.数值 2.选项") + @Excel(name = "解析类型" ,prompt = "解析类型 INT,INT16,UINT16") + private Integer valueType; + + /** 数据类型(integer、decimal、string、bool、array、enum) */ + @ApiModelProperty(value = "数据类型", notes = "(integer、decimal、string、bool、array、enum)") + @Excel(name = "数据类型", prompt = "integer、decimal、string、bool、array、enum") + private String datatype; + + @Excel(name = "有效值范围") + private String limitValue; + + /** 位定义选项 */ + @ApiModelProperty("位定义选项") + @Excel(name = "位定义选项") + private String bitOption; + + /** 是否只读数据(0-否,1-是) */ + @ApiModelProperty(value = "是否只读数据", notes = "(0-否,1-是)") + @Excel(name = "是否只读", readConverterExp = "0=否,1=是",prompt = "0=否,1=是") + private Integer isReadonly; + + @ApiModelProperty("是否是计算参数,默认否") + @Excel(name = "是否是计算参数,默认否",readConverterExp = "0=否,1=是") + private Integer isParams; + + @ApiModelProperty("读取寄存器个数") + @Excel(name ="读取寄存器个数") + private Integer quantity; + + @ApiModelProperty("解析类型") + @Excel(name = "解析类型") + private String parseType; + + + public String getParseType() { + return parseType; + } + + public void setParseType(String parseType) { + this.parseType = parseType; + } + + /** + * 功能码 + */ + private String code; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + private Integer modelOrder; + + public Integer getIsParams() { + return isParams; + } + + public void setIsParams(Integer isParams) { + this.isParams = isParams; + } + + public String getLimitValue() { + return limitValue; + } + + public void setLimitValue(String limitValue) { + this.limitValue = limitValue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public String getRegStr() { + return regStr; + } + + public void setRegStr(String regStr) { + this.regStr = regStr; + } + + public void setModelId(Long modelId) + { + this.modelId = modelId; + } + + public Long getModelId() + { + return modelId; + } + public void setModelName(String modelName) + { + this.modelName = modelName; + } + + public String getModelName() + { + return modelName; + } + public void setProductId(Long productId) + { + this.productId = productId; + } + + public Long getProductId() + { + return productId; + } + public void setProductName(String productName) + { + this.productName = productName; + } + + public String getProductName() + { + return productName; + } + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public Long getTenantId() + { + return tenantId; + } + public void setTenantName(String tenantName) + { + this.tenantName = tenantName; + } + + public String getTenantName() + { + return tenantName; + } + public void setIdentifier(String identifier) + { + this.identifier = identifier; + } + + public String getIdentifier() + { + return identifier; + } + public void setType(Integer type) + { + this.type = type; + } + + public Integer getType() + { + return type; + } + public void setDatatype(String datatype) + { + this.datatype = datatype; + } + + public String getDatatype() + { + return datatype; + } + + public Integer getTempSlaveId() { + return tempSlaveId; + } + + public void setTempSlaveId(Integer tempSlaveId) { + this.tempSlaveId = tempSlaveId; + } + + public void setFormula(String formula) + { + this.formula = formula; + } + + public String getFormula() + { + return formula; + } + public void setSpecs(String specs) + { + this.specs = specs; + } + + public String getSpecs() + { + return specs; + } + public void setIsChart(Integer isChart) + { + this.isChart = isChart; + } + + public Integer getIsChart() + { + return isChart; + } + + public void setIsHistory(Integer isHistory) + { + this.isHistory = isHistory; + } + + public Integer getIsHistory() + { + return isHistory; + } + public void setReverseFormula(String reverseFormula) + { + this.reverseFormula = reverseFormula; + } + + public String getReverseFormula() + { + return reverseFormula; + } + + public Integer getRegAddr() { + return regAddr; + } + + public void setRegAddr(Integer regAddr) { + this.regAddr = regAddr; + } + + public void setIsMonitor(Integer isMonitor) + { + this.isMonitor = isMonitor; + } + + public Integer getIsMonitor() + { + return isMonitor; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + public void setBitOption(String bitOption) + { + this.bitOption = bitOption; + } + + public String getBitOption() + { + return bitOption; + } + public void setValueType(Integer valueType) + { + this.valueType = valueType; + } + + public Integer getValueType() + { + return valueType; + } + public void setIsReadonly(Integer isReadonly) + { + this.isReadonly = isReadonly; + } + + public Integer getIsReadonly() + { + return isReadonly; + } + public void setModelOrder(Integer modelOrder) + { + this.modelOrder = modelOrder; + } + + public Integer getModelOrder() + { + return modelOrder; + } + + public Integer getIsSharePerm() { + return isSharePerm; + } + + public void setIsSharePerm(Integer isSharePerm) { + this.isSharePerm = isSharePerm; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("modelId", getModelId()) + .append("modelName", getModelName()) + .append("productId", getProductId()) + .append("productName", getProductName()) + .append("tenantId", getTenantId()) + .append("tenantName", getTenantName()) + .append("identifier", getIdentifier()) + .append("type", getType()) + .append("datatype", getDatatype()) + .append("tempSlaveId", getTempSlaveId()) + .append("formula", getFormula()) + .append("specs", getSpecs()) + .append("isChart", getIsChart()) + .append("reverseFormula", getReverseFormula()) + .append("regAddr", getRegAddr()) + .append("isMonitor", getIsMonitor()) + .append("delFlag", getDelFlag()) + .append("bitOption", getBitOption()) + .append("valueType", getValueType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("isReadonly", getIsReadonly()) + .append("modelOrder", getModelOrder()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModelTemplate.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModelTemplate.java new file mode 100644 index 00000000..e74d542f --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/ThingsModelTemplate.java @@ -0,0 +1,447 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 通用物模型对象 iot_things_model_template + * + * @author kerwincui + * @date 2023-01-15 + */ +@ApiModel(value = "ThingsModelTemplate", description = "通用物模型对象 iot_things_model_template") +public class ThingsModelTemplate extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 物模型ID */ + @ApiModelProperty("物模型ID") + private Long templateId; + + /** 物模型名称 */ + @ApiModelProperty("物模型名称") + @Excel(name = "物模型名称" ,prompt = "必填") + private String templateName; + + /** 租户ID */ + @ApiModelProperty("租户ID") + private Long tenantId; + + /** 租户名称 */ + @ApiModelProperty("租户名称") + private String tenantName; + + /** 标识符,产品下唯一 */ + @ApiModelProperty("标识符,产品下唯一") + @Excel(name = "标识符",prompt = "modbus不填,默认为寄存器地址") + private String identifier; + + /** 模型类别(1-属性,2-功能,3-事件) */ + @ApiModelProperty(value = "模型类别", notes = "(1-属性,2-功能,3-事件)") + @Excel(name = "模型类别", readConverterExp = "1=属性,2=功能,3=事件",prompt ="1=属性,2-功能,3-事件") + private Integer type; + + /** 从机id */ + @ApiModelProperty("从机id") + private String tempSlaveId; + + /** 寄存器地址 */ + @ApiModelProperty("寄存器地址") + @Excel(name = "寄存器地址" , prompt = "可填写10进制或16进制,16带H,例如:0020H") + private String regStr; + + /** 计算公式 */ + @ApiModelProperty("计算公式") + @Excel(name = "计算公式",prompt = "选填,例如:%s*10,%s是占位符") + private String formula; + + /** 数据定义 */ + //@Excel(name = "数据定义") + @ApiModelProperty("数据定义") + private String specs; + + /** 是否系统通用(0-否,1-是) */ + @ApiModelProperty("是否系统通用(0-否,1-是)") + private Integer isSys; + + /** 控制公式 */ + @ApiModelProperty("控制公式") + @Excel(name = "控制公式",prompt = "选填,例如:%s*10,%s是占位符") + private String reverseFormula; + + /** 寄存器地址值 */ + @ApiModelProperty("寄存器地址值") + private Integer regAddr; + + + + /** 是否图表显示(0-否,1-是) */ + @ApiModelProperty("是否图表显示(0-否,1-是)") + @Excel(name = "是否图表显示", readConverterExp = "0=否,1=是") + private Integer isChart; + + /** 是否历史存储(0-否,1-是) */ + @ApiModelProperty("是否历史存储(0-否,1-是)") + @Excel(name = "是否历史存储", readConverterExp = "0=否,1=是") + private Integer isHistory; + + /** 是否实时监测(0-否,1-是) */ + @ApiModelProperty("是否实时监测(0-否,1-是)") + @Excel(name = "是否实时监测", readConverterExp = "0=否,1=是") + private Integer isMonitor; + + /** 是否分享设备权限(0-否,1-是) */ + @ApiModelProperty(value = "是否分享设备权限", notes = "(0-否,1-是) ") + @Excel(name = "是否分享设备权限", readConverterExp = "0=否,1=是") + private Integer isSharePerm; + + /** 删除标志(0代表存在 2代表删除) */ + @ApiModelProperty("删除标志(0代表存在 2代表删除)") + private String delFlag; + + @Excel(name = "单位") + private String unit; + + /** 数值类型 1.数值 2.选项 */ + @ApiModelProperty("数值类型 1.数值 2.选项") + @Excel(name = "解析类型" ,prompt = "解析类型 INT,INT16,UINT16") + private String valueType; + + /** 数据类型(integer、decimal、string、bool、array、enum) */ + @ApiModelProperty(value = "数据类型", notes = "(integer、decimal、string、bool、array、enum)") + @Excel(name = "数据类型", prompt = "integer、decimal、string、bool、array、enum") + private String datatype; + + @ApiModelProperty("有效值范围") + @Excel(name = "有效值范围") + private String limitValue; + + /** 位定义选项 */ + @ApiModelProperty("位定义选项") + @Excel(name = "位定义选项") + private String bitOption; + + /** 是否只读数据(0-否,1-是) */ + @ApiModelProperty("是否只读数据(0-否,1-是)") + @Excel(name = "是否只读", readConverterExp = "0=否,1=是",prompt = "0=否,1=是") + private Integer isReadonly; + + @ApiModelProperty("是否是计算参数,默认否") + @Excel(name = "是否是计算参数,默认否",readConverterExp = "0=否,1=是") + private Integer isParams; + + @ApiModelProperty("读取寄存器个数") + @Excel(name ="读取寄存器个数") + private Integer quantity; + + @ApiModelProperty("解析类型") + @Excel(name = "解析类型") + private String parseType; + + + public String getParseType() { + return parseType; + } + + public void setParseType(String parseType) { + this.parseType = parseType; + } + + private String oldTempSlaveId; + + /** + * 功能码 + */ + private String code; + + public String getOldTempSlaveId() { + return oldTempSlaveId; + } + + public void setOldTempSlaveId(String oldTempSlaveId) { + this.oldTempSlaveId = oldTempSlaveId; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + private Integer modelOrder; + + public Integer getIsParams() { + return isParams; + } + + public void setIsParams(Integer isParams) { + this.isParams = isParams; + } + + public String getRegStr() { + return regStr; + } + + public void setRegStr(String regStr) { + this.regStr = regStr; + } + + public String getLimitValue() { + return limitValue; + } + + public void setLimitValue(String limitValue) { + this.limitValue = limitValue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public void setTemplateId(Long templateId) + { + this.templateId = templateId; + } + + public Long getTemplateId() + { + return templateId; + } + public void setTemplateName(String templateName) + { + this.templateName = templateName; + } + + public String getTemplateName() + { + return templateName; + } + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public Long getTenantId() + { + return tenantId; + } + public void setTenantName(String tenantName) + { + this.tenantName = tenantName; + } + + public String getTenantName() + { + return tenantName; + } + public void setIdentifier(String identifier) + { + this.identifier = identifier; + } + + public String getIdentifier() + { + return identifier; + } + public void setType(Integer type) + { + this.type = type; + } + + public Integer getType() + { + return type; + } + public void setDatatype(String datatype) + { + this.datatype = datatype; + } + + public String getDatatype() + { + return datatype; + } + public void setSpecs(String specs) + { + this.specs = specs; + } + + public String getSpecs() + { + return specs; + } + public void setIsSys(Integer isSys) + { + this.isSys = isSys; + } + + public Integer getIsSys() + { + return isSys; + } + public void setIsReadonly(Integer isReadonly) + { + this.isReadonly = isReadonly; + } + + public Integer getIsReadonly() + { + return isReadonly; + } + public void setIsChart(Integer isChart) + { + this.isChart = isChart; + } + + public Integer getIsChart() + { + return isChart; + } + public void setIsHistory(Integer isHistory) + { + this.isHistory = isHistory; + } + + public Integer getIsHistory() + { + return isHistory; + } + + public String getTempSlaveId() { + return tempSlaveId; + } + + public void setTempSlaveId(String tempSlaveId) { + this.tempSlaveId = tempSlaveId; + } + + public void setIsMonitor(Integer isMonitor) + { + this.isMonitor = isMonitor; + } + + public Integer getIsMonitor() + { + return isMonitor; + } + public void setFormula(String formula) + { + this.formula = formula; + } + + public String getFormula() + { + return formula; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + public void setReverseFormula(String reverseFormula) + { + this.reverseFormula = reverseFormula; + } + + public String getReverseFormula() + { + return reverseFormula; + } + public void setRegAddr(Integer regAddr) + { + this.regAddr = regAddr; + } + + public Integer getRegAddr() + { + return regAddr; + } + public void setBitOption(String bitOption) + { + this.bitOption = bitOption; + } + + public String getBitOption() + { + return bitOption; + } + + public String getValueType() { + return valueType; + } + + public void setValueType(String valueType) { + this.valueType = valueType; + } + + public void setModelOrder(Integer modelOrder) + { + this.modelOrder = modelOrder; + } + + public Integer getModelOrder() + { + return modelOrder; + } + + public Integer getIsSharePerm() { + return isSharePerm; + } + + public void setIsSharePerm(Integer isSharePerm) { + this.isSharePerm = isSharePerm; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("templateId", getTemplateId()) + .append("templateName", getTemplateName()) + .append("tenantId", getTenantId()) + .append("tenantName", getTenantName()) + .append("identifier", getIdentifier()) + .append("type", getType()) + .append("datatype", getDatatype()) + .append("specs", getSpecs()) + .append("isSys", getIsSys()) + .append("isReadonly", getIsReadonly()) + .append("isChart", getIsChart()) + .append("tempSlaveId", getTempSlaveId()) + .append("isMonitor", getIsMonitor()) + .append("formula", getFormula()) + .append("delFlag", getDelFlag()) + .append("reverseFormula", getReverseFormula()) + .append("createBy", getCreateBy()) + .append("regAddr", getRegAddr()) + .append("createTime", getCreateTime()) + .append("bitOption", getBitOption()) + .append("updateBy", getUpdateBy()) + .append("valueType", getValueType()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("modelOrder", getModelOrder()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/UserSocialProfile.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/UserSocialProfile.java new file mode 100644 index 00000000..b4161ed6 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/UserSocialProfile.java @@ -0,0 +1,116 @@ +package com.fastbee.iot.domain; + +import com.fastbee.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +public class UserSocialProfile { + /** + * 第三方系统用户表主键 + */ + private Long socialUserId; + + /** + * 第三方用户来源 + */ + @Excel(name = "第三方用户来源") + private String source; + + /** + * 用户名 + */ + @Excel(name = "用户名") + private String username; + + /** + * 用户昵称 + */ + @Excel(name = "用户昵称") + private String nickname; + + /** + * 用户头像 + */ + @Excel(name = "用户头像") + private String avatar; + + /** + * 绑定状态(0:未绑定,1:绑定) + */ + @Excel(name = "绑定状态(0:未绑定,1:绑定)") + private String status; + + /** + * 第三方具体来源 + */ + private String sourceClient; + + public String getSourceClient() { + return sourceClient; + } + + public void setSourceClient(String sourceClient) { + this.sourceClient = sourceClient; + } + + public Long getSocialUserId() { + return socialUserId; + } + + public void setSocialUserId(Long socialUserId) { + this.socialUserId = socialUserId; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("socialUserId", getSocialUserId()) + .append("source", getSource()) + .append("status", getStatus()) + .append("username", getUsername()) + .append("nickname", getNickname()) + .append("avatar", getAvatar()) + .toString(); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTemp.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTemp.java new file mode 100644 index 00000000..29d924f3 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTemp.java @@ -0,0 +1,149 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 设备采集变量模板对象 iot_var_temp + * + * @author kerwincui + * @date 2022-11-30 + */ +@ApiModel(value = "VarTemp", description = "设备采集变量模板对象 iot_var_temp") +public class VarTemp extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键id */ + @ApiModelProperty("主键id") + private Long templateId; + + /** 模板名称 */ + @ApiModelProperty("模板名称") + @Excel(name = "模板名称") + private String templateName; + + /** $column.columnComment */ + @ApiModelProperty("类型") + private Integer type; + + /** 采集方式 1.云端轮询 2.云端边缘计算 */ + @ApiModelProperty(value = "采集方式", notes = "1.云端轮询 2.云端边缘计算") + @Excel(name = "采集方式 1.云端轮询 2.云端边缘计算") + private Integer pollingMethod; + + /** 从机总数 */ + @ApiModelProperty("从机总数") + @Excel(name = "从机总数") + private Long slaveTotal; + + /** 总采集点数 */ + @ApiModelProperty("总采集点数") + @Excel(name = "总采集点数") + private Long pointTotal; + + /** 是否分享 */ + @ApiModelProperty("是否分享") + @Excel(name = "是否分享") + private Integer share; + + /** 模板所属用户 */ + @ApiModelProperty("模板所属用户") + @Excel(name = "模板所属用户") + private Long userId; + + public void setTemplateId(Long templateId) + { + this.templateId = templateId; + } + + public Long getTemplateId() + { + return templateId; + } + public void setTemplateName(String templateName) + { + this.templateName = templateName; + } + + public String getTemplateName() + { + return templateName; + } + public void setType(Integer type) + { + this.type = type; + } + + public Integer getType() + { + return type; + } + public void setPollingMethod(Integer pollingMethod) + { + this.pollingMethod = pollingMethod; + } + + public Integer getPollingMethod() + { + return pollingMethod; + } + public void setSlaveTotal(Long slaveTotal) + { + this.slaveTotal = slaveTotal; + } + + public Long getSlaveTotal() + { + return slaveTotal; + } + public void setPointTotal(Long pointTotal) + { + this.pointTotal = pointTotal; + } + + public Long getPointTotal() + { + return pointTotal; + } + public void setShare(Integer share) + { + this.share = share; + } + + public Integer getShare() + { + return share; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("templateId", getTemplateId()) + .append("templateName", getTemplateName()) + .append("type", getType()) + .append("pollingMethod", getPollingMethod()) + .append("slaveTotal", getSlaveTotal()) + .append("pointTotal", getPointTotal()) + .append("share", getShare()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .append("userId", getUserId()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTempSalve.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTempSalve.java new file mode 100644 index 00000000..0d39ed27 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/domain/VarTempSalve.java @@ -0,0 +1,94 @@ +package com.fastbee.iot.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fastbee.common.annotation.Excel; +import com.fastbee.common.core.domain.BaseEntity; + +/** + * 变量模板设备从机对象 iot_var_temp_salve + * + * @author kerwincui + * @date 2022-12-12 + */ +@ApiModel(value = "VarTempSalve", description = "变量模板设备从机对象 iot_var_temp_salve") +@EqualsAndHashCode(callSuper = true) +@Data +public class VarTempSalve extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键id */ + @ApiModelProperty("主键id") + private Long id; + + /** 关联的模板id */ + @ApiModelProperty("关联的模板id") + @Excel(name = "关联的模板id") + private Long deviceTempId; + + /** 从机编号 */ + @ApiModelProperty("从机编号") + @Excel(name = "从机编号") + private Integer slaveAddr; + + /** + * 功能编码 + */ + @ApiModelProperty("功能编码") + private Integer code; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Integer slaveIndex; + + /** 从机ip地址 */ + @ApiModelProperty("从机ip地址") + @Excel(name = "从机ip地址") + private String slaveIp; + + /** 从机名称 */ + @ApiModelProperty("从机名称") + @Excel(name = "从机名称") + private String slaveName; + + /** 从机端口 */ + @ApiModelProperty("从机端口") + @Excel(name = "从机端口") + private Integer slavePort; + + /** 寄存器起始地址(10进制) */ + @ApiModelProperty("寄存器起始地址(10进制)") + @Excel(name = "寄存器起始地址(10进制)") + private Long addrStart; + + /** 寄存器结束地址(10进制) */ + @ApiModelProperty("寄存器结束地址(10进制)") + @Excel(name = "寄存器结束地址(10进制)") + private Long addrEnd; + + /** 寄存器批量读取个数*/ + @ApiModelProperty("寄存器批量读取个数") + private Integer packetLength; + + /** 批量获取轮询时间(默认5分钟) */ + @ApiModelProperty("批量获取轮询时间(默认5分钟)") + @Excel(name = "批量获取轮询时间(默认300s)") + private Long timer; + + /** 状态 0-启动 1-失效 */ + @ApiModelProperty("状态 0-启动 1-失效") + @Excel(name = "状态 0-启动 1-失效") + private Integer status; + + + /** + * 轮询方式 + */ + private Integer pollingMethod; + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/enums/DeviceType.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/enums/DeviceType.java new file mode 100644 index 00000000..c75c4912 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/enums/DeviceType.java @@ -0,0 +1,28 @@ +package com.fastbee.iot.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum DeviceType { + /** + * 未知 + */ + UNKNOWN(0, "未知"), + /** + * 直连设备 + */ + DIRECT_DEVICE(1, "直连设备"), + /** + * 网关设备 + */ + GATEWAY(2, "网关设备"), + /** + * 监控设备 + */ + CAMERA(3, "监控设备"); + + private int code; + private String desc; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/CategoryMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/CategoryMapper.java new file mode 100644 index 00000000..29b86bde --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/CategoryMapper.java @@ -0,0 +1,81 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.iot.domain.Category; +import com.fastbee.iot.model.IdAndName; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 产品分类Mapper接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Repository +public interface CategoryMapper +{ + /** + * 查询产品分类 + * + * @param categoryId 产品分类主键 + * @return 产品分类 + */ + public Category selectCategoryByCategoryId(Long categoryId); + + /** + * 查询产品分类列表 + * + * @param category 产品分类 + * @return 产品分类集合 + */ + public List selectCategoryList(Category category); + + /** + * 查询产品简短分类列表 + * + * @return 产品分类集合 + */ + public List selectCategoryShortList(Category category); + + /** + * 新增产品分类 + * + * @param category 产品分类 + * @return 结果 + */ + public int insertCategory(Category category); + + /** + * 修改产品分类 + * + * @param category 产品分类 + * @return 结果 + */ + public int updateCategory(Category category); + + /** + * 删除产品分类 + * + * @param categoryId 产品分类主键 + * @return 结果 + */ + public int deleteCategoryByCategoryId(Long categoryId); + + /** + * 批量删除产品分类 + * + * @param categoryIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteCategoryByCategoryIds(Long[] categoryIds); + + /** + * 分类下的产品数量 + * + * @param categoryIds 需要删除的数据主键集合 + * @return 结果 + */ + public int productCountInCategorys(Long[] categoryIds); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceJobMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceJobMapper.java new file mode 100644 index 00000000..4f7de507 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceJobMapper.java @@ -0,0 +1,118 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.iot.domain.DeviceJob; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 调度任务信息 数据层 + * + * @author kerwincui + */ +@Repository +public interface DeviceJobMapper +{ + /** + * 查询调度任务日志集合 + * + * @param job 调度信息 + * @return 操作日志集合 + */ + public List selectJobList(DeviceJob job); + + /** + * 根据设备Ids查询调度任务日志集合 + * + * @param deviceIds 设备ID数组 + * @return 操作日志集合 + */ + public List selectShortJobListByDeviceIds(Long[] deviceIds); + + /** + * 根据告警Ids查询调度任务日志集合 + * + * @param alertIds 告警ID数组 + * @return 操作日志集合 + */ + public List selectShortJobListByAlertIds(Long[] alertIds); + + /** + * 根据场景Ids查询调度任务日志集合 + * + * @param sceneIds 场景ID数组 + * @return 操作日志集合 + */ + public List selectShortJobListBySceneIds(Long[] sceneIds); + + /** + * 查询所有调度任务 + * + * @return 调度任务列表 + */ + public List selectJobAll(); + + /** + * 通过调度ID查询调度任务信息 + * + * @param jobId 调度ID + * @return 角色对象信息 + */ + public DeviceJob selectJobById(Long jobId); + + /** + * 通过调度ID删除调度任务信息 + * + * @param jobId 调度ID + * @return 结果 + */ + public int deleteJobById(Long jobId); + + /** + * 批量删除调度任务信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 根据设备Ids批量删除调度任务信息 + * + * @param deviceIds 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByDeviceIds(Long[] deviceIds); + + /** + * 根据告警Ids批量删除调度任务信息 + * + * @param alertIds 需要删除的告警IDs + * @return 结果 + */ + public int deleteJobByAlertIds(Long[] alertIds); + + /** + * 根据场景联动Ids批量删除调度任务信息 + * + * @param sceneIds 需要删除的数据ID + * @return 结果 + */ + public int deleteJobBySceneIds(Long[] sceneIds); + + /** + * 修改调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int updateJob(DeviceJob job); + + /** + * 新增调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int insertJob(DeviceJob job); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceLogMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceLogMapper.java new file mode 100644 index 00000000..9f8144a8 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceLogMapper.java @@ -0,0 +1,86 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.model.DeviceStatistic; +import com.fastbee.iot.model.HistoryModel; +import com.fastbee.iot.model.MonitorModel; +import com.fastbee.iot.tdengine.service.model.TdLogDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.Date; +import java.util.List; + +/** + * 设备日志Mapper接口 + * + * @author kerwincui + * @date 2022-01-13 + */ +@Repository +public interface DeviceLogMapper +{ + /** + * 查询设备日志 + * + * @param logId 设备日志主键 + * @return 设备日志 + */ + public DeviceLog selectDeviceLogByLogId(Long logId); + + /** + * 查询日志分类总数 + * + * @return 设备日志 + */ + public DeviceStatistic selectCategoryLogCount(Device device); + + /** + * 查询设备监测数据 + * + * @param deviceLog 设备日志 + * @return 设备日志集合 + */ + public List selectMonitorList(DeviceLog deviceLog); + + + /** + * 批量保存图片 + */ + public int saveBatch(@Param("list") List list); + + /** + * 修改设备日志 + * + * @param deviceLog 设备日志 + * @return 结果 + */ + public int updateDeviceLog(DeviceLog deviceLog); + + /** + * 删除设备日志 + * + * @param logId 设备日志主键 + * @return 结果 + */ + public int deleteDeviceLogByLogId(Long logId); + + /** + * 批量删除设备日志 + * + * @param logIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDeviceLogByLogIds(Long[] logIds); + + /** + * 根据设备Ids批量删除设备日志 + * + * @param deviceNumber 需要删除的数据设备Id + * @return 结果 + */ + public int deleteDeviceLogByDeviceNumber(String deviceNumber); + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java new file mode 100644 index 00000000..29983d94 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java @@ -0,0 +1,298 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.common.core.thingsModel.ThingsModelValuesInput; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.model.AuthenticateInputModel; +import com.fastbee.iot.model.DeviceAllShortOutput; +import com.fastbee.iot.model.DeviceMqttVO; +import com.fastbee.iot.model.DeviceRelateAlertLogVO; +import com.fastbee.iot.model.DeviceShortOutput; +import com.fastbee.iot.model.DeviceStatistic; +import com.fastbee.iot.model.ProductAuthenticateModel; +import com.fastbee.iot.model.ThingsModels.ThingsModelValuesOutput; +import com.fastbee.iot.model.UserIdDeviceIdModel; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 设备Mapper接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Repository +public interface DeviceMapper +{ + /** + * 查询设备 + * + * @param deviceId 设备主键 + * @return 设备 + */ + public Device selectDeviceByDeviceId(Long deviceId); + + /** + * 查询设备和产品总数 + * + * @return 设备 + */ + public DeviceStatistic selectDeviceProductAlertCount(Device device); + + /** + * 根据设备编号查询设备 + * + * @param serialNumber 设备主键 + * @return 设备 + */ + public Device selectDeviceBySerialNumber(String serialNumber); + + + /** + * 根据设备编号查询设备数量 + * + * @param serialNumber 设备主键 + * @return 设备 + */ + public int selectDeviceCountBySerialNumber(String serialNumber); + + /** + * 根据设备编号查询简介设备 + * + * @param serialNumber 设备主键 + * @return 设备 + */ + public Device selectShortDeviceBySerialNumber(String serialNumber); + + /** + * 根据设备编号查询设备认证信息 + * + * @param model 设备编号和产品ID + * @return 设备 + */ + public ProductAuthenticateModel selectProductAuthenticate(AuthenticateInputModel model); + + /** + * 查询设备和运行状态 + * + * @param deviceId 设备主键 + * @return 设备 + */ + public DeviceShortOutput selectDeviceRunningStatusByDeviceId(Long deviceId); + + /** + * 查询设备的物模型值 + * + * @param serialNumber 设备编号 + * @return 设备 + */ + public ThingsModelValuesOutput selectDeviceThingsModelValueBySerialNumber(String serialNumber); + + /** + * 修改设备的物模型值 + * + * @param input 设备ID和物模型值 + * @return 结果 + */ + public int updateDeviceThingsModelValue(ThingsModelValuesInput input); + + + /** + * 查询设备列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectDeviceList(Device device); + + /** + * 查询未分配授权码设备列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectUnAuthDeviceList(Device device); + + /** + * 查询分组可添加设备分页列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectDeviceListByGroup(Device device); + + /** + * 查询设备简短列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectDeviceShortList(Device device); + + /** + * 查询所有设备简短列表 + * + * @return 设备集合 + */ + public List selectAllDeviceShortList(Device device); + + /** + * 根据产品ID查询产品下所有设备的编号 + * + * @return 设备集合 + */ + public List selectSerialNumberByProductId(Long productId); + + /** + * 获取产品下面的设备数量 + * + * @param productId 产品 + * @return 结果 + */ + public int selectDeviceCountByProductId(Long productId); + + /** + * 新增设备 + * + * @param device 设备 + * @return 结果 + */ + public int insertDevice(Device device); + + /** + * 修改设备 + * + * @param device 设备 + * @return 结果 + */ + public int updateDevice(Device device); + + /** + * 更新设备状态 + * + * @param device 设备 + * @return 结果 + */ + public int updateDeviceStatus(Device device); + + /** + * 更新固件版本 + * @param device + * @return + */ + public int updateDeviceFirmwareVersion(Device device); + + /** + * 通过设备编号修改设备 + * + * @param device 设备 + * @return 结果 + */ + public int updateDeviceBySerialNumber(Device device); + + /** + * 删除设备 + * + * @param deviceId 设备主键 + * @return 结果 + */ + public int deleteDeviceByDeviceId(Long deviceId); + + /** + * 批量删除设备 + * + * @param deviceIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDeviceByDeviceIds(Long[] deviceIds); + + /** + * 根据网关编号删除子设备 + * @param gwCode + */ + public void deleteSubDevice(String gwCode); + + /** + * 查询设备序列号的数量 + * @param deviceNum + * @return + */ + public int getDeviceNumCount(String deviceNum); + + /** + * 根据设备IDS删除设备分组 + * @param userDeviceGroupIdModel + * @return + */ + public int deleteDeviceGroupByDeviceId(UserIdDeviceIdModel userDeviceGroupIdModel); + + /** + * 重置设备状态 + * @return 结果 + */ + public int resetDeviceStatus(String deviceNum); + + /** + * 根据设备编号查询协议编码 + * @param serialNumber 设备编号 + * @return + */ + public Map selectProtocolBySerialNumber(String serialNumber); + + /** + * 查询产品下所有设备,返回设备编号 + * @param productId 产品id + * @return + */ + public List selectDevicesByProductId(@Param("productId") Long productId,@Param("hasSub") Integer hasSub); + + /** + * 查询子设备总数 + * @param gwDevCode 网关编号 + * @return 数量 + */ + public Integer getSubDeviceCount(String gwDevCode); + + + /** + * 批量更新设备上线 + * @param devices 设备ids + */ + public void batchChangeOnline(List devices); + + /** + * 批量更新设备下线 + * @param devices 设备ids + */ + public void batchChangeOffline(List devices); + + /** + * 查询在线的modbus网关设备 + * @return + */ + public List selectOnlineModbusDevices(); + + /** + * 获取设备MQTT连接参数 + * @param deviceId 设备id + * @return + */ + DeviceMqttVO selectMqttConnectData(Long deviceId); + + /** + * 查询告警日志相关联信息 + * @param deviceNumbers 设备编号集合 + * @return + */ + List selectDeviceBySerialNumbers(@Param("deviceNumbers") Set deviceNumbers); + + /** + * 查询告警日志相关联信息 + * @param deviceNumber 设备编号 + * @return + */ + DeviceRelateAlertLogVO selectRelateAlertLogBySerialNumber(String deviceNumber); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java new file mode 100644 index 00000000..50a8edf1 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java @@ -0,0 +1,96 @@ +package com.fastbee.iot.mapper; + +import java.util.List; + +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.iot.domain.DeviceUser; +import com.fastbee.iot.model.UserIdDeviceIdModel; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +/** + * 设备用户Mapper接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Repository +public interface DeviceUserMapper +{ + /** + * 查询设备用户 + * + * @param deviceId 设备用户主键 + * @return 设备用户 + */ + public List selectDeviceUserByDeviceId(Long deviceId); + + /** + * 查询设备用户列表 + * + * @param deviceUser 设备用户 + * @return 设备用户集合 + */ + public List selectDeviceUserList(DeviceUser deviceUser); + + /** + * 查询设备分享用户 + * + * @param deviceUser 设备用户 + * @return 设备用户集合 + */ + public SysUser selectShareUser(DeviceUser deviceUser); + + /** + * 新增设备用户 + * + * @param deviceUser 设备用户 + * @return 结果 + */ + public int insertDeviceUser(DeviceUser deviceUser); + + /** + * 修改设备用户 + * + * @param deviceUser 设备用户 + * @return 结果 + */ + public int updateDeviceUser(DeviceUser deviceUser); + + /** + * 删除设备用户 + * + * @param UserIdDeviceIdModel 用户ID和设备ID + * @return 结果 + */ + public int deleteDeviceUserByDeviceId(UserIdDeviceIdModel UserIdDeviceIdModel); + + /** + * 批量删除设备用户 + * + * @param deviceIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDeviceUserByDeviceIds(Long[] deviceIds); + + /** + * 批量添加设备用户 + * @param deviceUsers 设备用户 + * @return 结果 + */ + public int insertDeviceUserList(List deviceUsers); + + /** + * 根据deviceId 和 userId 查询 + * @param deviceId 设备id + * @param userId 用户id + * @return 结果 + */ + public DeviceUser selectDeviceUserByDeviceIdAndUserId(@Param("deviceId") Long deviceId, @Param("userId") Long userId); + + /** + * 根据deviceId 和 userId 删除设备用户,不包含设备所有者 + */ + public int deleteDeviceUser(DeviceUser deviceUser); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/EventLogMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/EventLogMapper.java new file mode 100644 index 00000000..7c2099b8 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/EventLogMapper.java @@ -0,0 +1,77 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.EventLog; +import org.springframework.stereotype.Repository; + +/** + * 事件日志Mapper接口 + * + * @author kerwincui + * @date 2023-03-28 + */ +@Repository +public interface EventLogMapper +{ + /** + * 查询事件日志 + * + * @param logId 事件日志主键 + * @return 事件日志 + */ + public EventLog selectEventLogByLogId(Long logId); + + /** + * 查询事件日志列表 + * + * @param eventLog 事件日志 + * @return 事件日志集合 + */ + public List selectEventLogList(EventLog eventLog); + + /** + * 新增事件日志 + * + * @param eventLog 事件日志 + * @return 结果 + */ + public int insertEventLog(EventLog eventLog); + + /** + * 批量存储事件日志 + * @param list + */ + public void insertBatch(List list); + + /** + * 修改事件日志 + * + * @param eventLog 事件日志 + * @return 结果 + */ + public int updateEventLog(EventLog eventLog); + + /** + * 删除事件日志 + * + * @param logId 事件日志主键 + * @return 结果 + */ + public int deleteEventLogByLogId(Long logId); + + /** + * 根据设备编号删除事件日志 + * + * @param serialNumber 设备编号 + * @return 结果 + */ + public int deleteEventLogBySerialNumber(String serialNumber); + + /** + * 批量删除事件日志 + * + * @param logIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEventLogByLogIds(Long[] logIds); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/FunctionLogMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/FunctionLogMapper.java new file mode 100644 index 00000000..56059e51 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/FunctionLogMapper.java @@ -0,0 +1,97 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.FunctionLog; +import org.springframework.stereotype.Repository; + +/** + * 设备服务下发日志Mapper接口 + * + * @author kerwincui + * @date 2022-10-22 + */ +@Repository +public interface FunctionLogMapper +{ + /** + * 查询设备服务下发日志 + * + * @param id 设备服务下发日志主键 + * @return 设备服务下发日志 + */ + public FunctionLog selectFunctionLogById(Long id); + + /** + * 查询设备服务下发日志列表 + * + * @param functionLog 设备服务下发日志 + * @return 设备服务下发日志集合 + */ + public List selectFunctionLogList(FunctionLog functionLog); + + /** + * 新增设备服务下发日志 + * + * @param functionLog 设备服务下发日志 + * @return 结果 + */ + public int insertFunctionLog(FunctionLog functionLog); + + /** + * 批量插入数据 + * @param list + */ + public void insertBatch(List list); + + /** + * 修改设备服务下发日志 + * + * @param functionLog 设备服务下发日志 + * @return 结果 + */ + public int updateFunctionLog(FunctionLog functionLog); + + /** + * 删除设备服务下发日志 + * + * @param id 设备服务下发日志主键 + * @return 结果 + */ + public int deleteFunctionLogById(Long id); + + /** + * 根据设备编号删除设备服务下发日志 + * + * @param serialNumber 设备编号 + * @return 结果 + */ + public int deleteFunctionLogBySerialNumber(String serialNumber); + + /** + * 根据标识符前缀和设备编号批量删除日志 + * + * @param + * @return 结果 + */ + public int deleteFunctionLogByPreIdentify(FunctionLog functionLog); + + /** + * 批量删除设备服务下发日志 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteFunctionLogByIds(Long[] ids); + + /** + * 批量更新日志状态值 + * @param log 参数 + */ + public void updateFuncLogBatch(FunctionLog log); + + /** + * 根据消息id更新指令下发状态 + * @param log + */ + public void updateByMessageId(FunctionLog log); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/GroupMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/GroupMapper.java new file mode 100644 index 00000000..642ec037 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/GroupMapper.java @@ -0,0 +1,87 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.Group; +import com.fastbee.iot.model.DeviceGroupInput; +import com.fastbee.iot.model.IdOutput; +import org.springframework.stereotype.Repository; + +/** + * 设备分组Mapper接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Repository +public interface GroupMapper +{ + /** + * 查询设备分组 + * + * @param groupId 设备分组主键 + * @return 设备分组 + */ + public Group selectGroupByGroupId(Long groupId); + + /** + * 通过分组ID查询关联的设备ID数组 + * @param groupId + * @return + */ + public List selectDeviceIdsByGroupId(Long groupId); + + /** + * 查询设备分组列表 + * + * @param group 设备分组 + * @return 设备分组集合 + */ + public List selectGroupList(Group group); + + /** + * 新增设备分组 + * + * @param group 设备分组 + * @return 结果 + */ + public int insertGroup(Group group); + + /** + * 分组下批量增加设备分组 + * @param input + * @return + */ + public int insertDeviceGroups(DeviceGroupInput input); + + /** + * 修改设备分组 + * + * @param group 设备分组 + * @return 结果 + */ + public int updateGroup(Group group); + + /** + * 删除设备分组 + * + * @param groupId 设备分组主键 + * @return 结果 + */ + public int deleteGroupByGroupId(Long groupId); + + /** + * 批量删除分组 + * + * @param groupIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteGroupByGroupIds(Long[] groupIds); + + /** + * 批量删除设备分组 + * @param groupIds + * @return + */ + public int deleteDeviceGroupByGroupIds(Long[] groupIds); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsCategoryMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsCategoryMapper.java new file mode 100644 index 00000000..c6ba69ba --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsCategoryMapper.java @@ -0,0 +1,79 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.NewsCategory; +import com.fastbee.iot.model.IdAndName; +import org.springframework.stereotype.Repository; + +/** + * 新闻分类Mapper接口 + * + * @author kerwincui + * @date 2022-04-09 + */ +@Repository +public interface NewsCategoryMapper +{ + /** + * 查询新闻分类 + * + * @param categoryId 新闻分类主键 + * @return 新闻分类 + */ + public NewsCategory selectNewsCategoryByCategoryId(Long categoryId); + + /** + * 查询新闻分类列表 + * + * @param newsCategory 新闻分类 + * @return 新闻分类集合 + */ + public List selectNewsCategoryList(NewsCategory newsCategory); + + /** + * 查询新闻分类简短列表 + * + * @return 新闻分类集合 + */ + public List selectNewsCategoryShortList(); + + /** + * 新增新闻分类 + * + * @param newsCategory 新闻分类 + * @return 结果 + */ + public int insertNewsCategory(NewsCategory newsCategory); + + /** + * 修改新闻分类 + * + * @param newsCategory 新闻分类 + * @return 结果 + */ + public int updateNewsCategory(NewsCategory newsCategory); + + /** + * 删除新闻分类 + * + * @param categoryId 新闻分类主键 + * @return 结果 + */ + public int deleteNewsCategoryByCategoryId(Long categoryId); + + /** + * 批量删除新闻分类 + * + * @param categoryIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteNewsCategoryByCategoryIds(Long[] categoryIds); + + /** + * 分类下的新闻数量 + * + * @param categoryIds 需要删除的数据主键集合 + * @return 结果 + */ + public int newsCountInCategorys(Long[] categoryIds); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsMapper.java new file mode 100644 index 00000000..d37500a5 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/NewsMapper.java @@ -0,0 +1,70 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.News; +import org.springframework.stereotype.Repository; + +/** + * 新闻资讯Mapper接口 + * + * @author kerwincui + * @date 2022-04-09 + */ +@Repository +public interface NewsMapper +{ + /** + * 查询新闻资讯 + * + * @param newsId 新闻资讯主键 + * @return 新闻资讯 + */ + public News selectNewsByNewsId(Long newsId); + + /** + * 查询新闻资讯列表 + * + * @param news 新闻资讯 + * @return 新闻资讯集合 + */ + public List selectNewsList(News news); + + /** + * 查询置顶新闻资讯列表 + * + * @return 新闻资讯集合 + */ + public List selectTopNewsList(); + + /** + * 新增新闻资讯 + * + * @param news 新闻资讯 + * @return 结果 + */ + public int insertNews(News news); + + /** + * 修改新闻资讯 + * + * @param news 新闻资讯 + * @return 结果 + */ + public int updateNews(News news); + + /** + * 删除新闻资讯 + * + * @param newsId 新闻资讯主键 + * @return 结果 + */ + public int deleteNewsByNewsId(Long newsId); + + /** + * 批量删除新闻资讯 + * + * @param newsIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteNewsByNewsIds(Long[] newsIds); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/OauthClientDetailsMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/OauthClientDetailsMapper.java new file mode 100644 index 00000000..92681db2 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/OauthClientDetailsMapper.java @@ -0,0 +1,63 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.OauthClientDetails; +import org.springframework.stereotype.Repository; + +/** + * 云云对接Mapper接口 + * + * @author kerwincui + * @date 2022-02-07 + */ +@Repository +public interface OauthClientDetailsMapper +{ + /** + * 查询云云对接 + * + * @param clientId 云云对接主键 + * @return 云云对接 + */ + public OauthClientDetails selectOauthClientDetailsByClientId(String clientId); + + /** + * 查询云云对接列表 + * + * @param oauthClientDetails 云云对接 + * @return 云云对接集合 + */ + public List selectOauthClientDetailsList(OauthClientDetails oauthClientDetails); + + /** + * 新增云云对接 + * + * @param oauthClientDetails 云云对接 + * @return 结果 + */ + public int insertOauthClientDetails(OauthClientDetails oauthClientDetails); + + /** + * 修改云云对接 + * + * @param oauthClientDetails 云云对接 + * @return 结果 + */ + public int updateOauthClientDetails(OauthClientDetails oauthClientDetails); + + /** + * 删除云云对接 + * + * @param clientId 云云对接主键 + * @return 结果 + */ + public int deleteOauthClientDetailsByClientId(String clientId); + + /** + * 批量删除云云对接 + * + * @param clientIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOauthClientDetailsByClientIds(String[] clientIds); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductAuthorizeMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductAuthorizeMapper.java new file mode 100644 index 00000000..7ffc9289 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductAuthorizeMapper.java @@ -0,0 +1,92 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.ProductAuthorize; +import org.springframework.stereotype.Repository; + +/** + * 产品授权码Mapper接口 + * + * @author kami + * @date 2022-04-11 + */ +@Repository +public interface ProductAuthorizeMapper +{ + /** + * 查询产品授权码 + * + * @param authorizeId 产品授权码主键 + * @return 产品授权码 + */ + public ProductAuthorize selectProductAuthorizeByAuthorizeId(Long authorizeId); + + /** + * 查询产品授权码列表 + * + * @param productAuthorize 产品授权码 + * @return 产品授权码集合 + */ + public List selectProductAuthorizeList(ProductAuthorize productAuthorize); + + /** + * 新增产品授权码 + * + * @param productAuthorize 产品授权码 + * @return 结果 + */ + public int insertProductAuthorize(ProductAuthorize productAuthorize); + + /** + * 修改产品授权码 + * + * @param productAuthorize 产品授权码 + * @return 结果 + */ + public int updateProductAuthorize(ProductAuthorize productAuthorize); + + /** + * 删除产品授权码 + * + * @param authorizeId 产品授权码主键 + * @return 结果 + */ + public int deleteProductAuthorizeByAuthorizeId(Long authorizeId); + + /** + * 批量删除产品授权码 + * + * @param authorizeIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteProductAuthorizeByAuthorizeIds(Long[] authorizeIds); + + /** + * 通过产品ID批量删除产品授权码 + * + * @param productIds 产品ID数组 + * @return 结果 + */ + public int deleteProductAuthorizeByProductIds(Long[] productIds); + + /** + * 批量新增产品授权码 + * @param list + * @return + */ + public int insertBatchAuthorize(List list); + + /** + * 根据授权码查询一条未绑定的授权码 + * @param authorize + * @return + */ + ProductAuthorize selectFirstAuthorizeByAuthorizeCode(ProductAuthorize authorize); + + /** + * 根据产品id查询产品授权码 + * @param productId 产品id + * @return + */ + List selectProductAuthorizeListByProductId(Long productId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductMapper.java new file mode 100644 index 00000000..d22e2e32 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProductMapper.java @@ -0,0 +1,149 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.iot.domain.Product; +import com.fastbee.iot.model.ChangeProductStatusModel; +import com.fastbee.iot.model.IdAndName; +import com.fastbee.iot.model.ProductCode; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 产品Mapper接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Repository +public interface ProductMapper +{ + /** + * 查询产品 + * + * @param productId 产品主键 + * @return 产品 + */ + public Product selectProductByProductId(Long productId); + + /** + * 查询产品列表 + * + * @param product 产品 + * @return 产品集合 + */ + public List selectProductList(Product product); + + /** + * 查询产品简短列表 + * + * @param product 产品 + * @return 产品集合 + */ + public List selectProductShortList(Product product); + + /** + * 新增产品 + * + * @param product 产品 + * @return 结果 + */ + public int insertProduct(Product product); + + /** + * 修改产品 + * + * @param product 产品 + * @return 结果 + */ + public int updateProduct(Product product); + + /** + * 更新产品状态,1-未发布,2-已发布 + * + * @param model + * @return 结果 + */ + public int changeProductStatus(ChangeProductStatusModel model); + + /** + * 修改物模型JSON + * + * @param product 产品 + * @return 结果 + */ + public int updateThingsModelJson(Product product); + + /** + * 删除产品 + * + * @param productId 产品主键 + * @return 结果 + */ + public int deleteProductByProductId(Long productId); + + /** + * 批量删除产品 + * + * @param productIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteProductByProductIds(Long[] productIds); + + /** + * 批量删除产品物模型 + * + * @param productIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteProductThingsModelByProductIds(Long[] productIds); + + + /** + * 产品下的设备数量 + * @param productIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deviceCountInProducts(Long[] productIds); + + /** + * 产品下的物模型数量 + * @param productId 需要删除的数据主键集合 + * @return 结果 + */ + public int thingsCountInProduct(Long productId); + + /** + * 产品下的物模型标识符重复数 + * @param productId 需要删除的数据主键集合 + * @return 结果 + */ + public int thingsRepeatCountInProduct(Long productId); + + /** + * 根据设备编号查询产品信息 + * @param serialNumber 设备编号 + * @return 结果 + */ + public Product getProductBySerialNumber(String serialNumber); + + /** + * 根据设备编号查询协议编号 + * @param serialNumber 设备编号 + * @return 协议编号 + */ + public ProductCode getProtocolBySerialNumber(String serialNumber); + + /** + * 根据产品id获取协议编号 + * @param productId 产品id + * @return 协议编号 + */ + public String getProtocolByProductId(Long productId); + + /** + * 根据模板id查询所有使用的产品 + * @param templeId 模板id + * @return + */ + public List selectByTempleId(Long templeId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProtocolMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProtocolMapper.java new file mode 100644 index 00000000..c3b8a004 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ProtocolMapper.java @@ -0,0 +1,80 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.iot.domain.Protocol; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 协议管理Mapper + * @author gsb + * @date 2022/10/19 15:46 + */ +@Repository +public interface ProtocolMapper { + + + /** + * 查询协议 + * + * @param id 协议主键 + * @return 协议 + */ + public Protocol selectProtocolById(Long id); + + /** + * 查询协议列表 + * + * @param protocol 协议 + * @return 协议集合 + */ + public List selectProtocolList(Protocol protocol); + + /** + * 新增协议 + * + * @param protocol 协议 + * @return 结果 + */ + public int insertProtocol(Protocol protocol); + + /** + * 修改协议 + * + * @param protocol 协议 + * @return 结果 + */ + public int updateProtocol(Protocol protocol); + + /** + * 删除协议 + * + * @param id 协议主键 + * @return 结果 + */ + public int deleteProtocolById(Long id); + + /** + * 批量删除协议 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteProtocolByIds(Long[] ids); + + /** + * 获取所有唯一协议 + * @param protocol + * @return + */ + public List selectByUnion(Protocol protocol); + + /** + * 获取所有可用协议 + * @param status + * @param delFlag + * @return + */ + public List selectAll(@Param("status") Integer status, @Param("delFlag") Integer delFlag); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialPlatformMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialPlatformMapper.java new file mode 100644 index 00000000..7fc30e0a --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialPlatformMapper.java @@ -0,0 +1,71 @@ +package com.fastbee.iot.mapper; + +import java.util.List; +import com.fastbee.iot.domain.SocialPlatform; +import org.springframework.stereotype.Repository; + +/** + * 第三方登录平台控制Mapper接口 + * + * @author kerwincui + * @date 2022-04-11 + */ +@Repository +public interface SocialPlatformMapper +{ + /** + * 查询第三方登录平台控制 + * + * @param socialPlatformId 第三方登录平台控制主键 + * @return 第三方登录平台控制 + */ + public SocialPlatform selectSocialPlatformBySocialPlatformId(Long socialPlatformId); + + /** + * 查询第三方登录平台控制 + * + * @param platform 第三方登录平台名称 + * @return 第三方登录平台控制 + */ + public SocialPlatform selectSocialPlatformByPlatform(String platform); + + /** + * 查询第三方登录平台控制列表 + * + * @param socialPlatform 第三方登录平台控制 + * @return 第三方登录平台控制集合 + */ + public List selectSocialPlatformList(SocialPlatform socialPlatform); + + /** + * 新增第三方登录平台控制 + * + * @param socialPlatform 第三方登录平台控制 + * @return 结果 + */ + public int insertSocialPlatform(SocialPlatform socialPlatform); + + /** + * 修改第三方登录平台控制 + * + * @param socialPlatform 第三方登录平台控制 + * @return 结果 + */ + public int updateSocialPlatform(SocialPlatform socialPlatform); + + /** + * 删除第三方登录平台控制 + * + * @param socialPlatformId 第三方登录平台控制主键 + * @return 结果 + */ + public int deleteSocialPlatformBySocialPlatformId(Long socialPlatformId); + + /** + * 批量删除第三方登录平台控制 + * + * @param socialPlatformIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSocialPlatformBySocialPlatformIds(Long[] socialPlatformIds); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java new file mode 100644 index 00000000..4c0ca2ed --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java @@ -0,0 +1,103 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.iot.domain.SocialUser; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 用户第三方用户信息Mapper接口 + * + * @author json + * @date 2022-04-18 + */ +@Repository +public interface SocialUserMapper +{ + /** + * 查询用户第三方用户信息 + * + * @param socialUserId 用户第三方用户信息主键 + * @return 用户第三方用户信息 + */ + public SocialUser selectSocialUserBySocialUserId(Long socialUserId); + + /** + * 查询用户第三方用户信息列表 + * + * @param socialUser 用户第三方用户信息 + * @return 用户第三方用户信息集合 + */ + public List selectSocialUserList(SocialUser socialUser); + + /** + * 新增用户第三方用户信息 + * + * @param socialUser 用户第三方用户信息 + * @return 结果 + */ + public int insertSocialUser(SocialUser socialUser); + + /** + * 修改用户第三方用户信息 + * + * @param socialUser 用户第三方用户信息 + * @return 结果 + */ + public int updateSocialUser(SocialUser socialUser); + + /** + * 删除用户第三方用户信息 + * + * @param socialUserId 用户第三方用户信息主键 + * @return 结果 + */ + public int deleteSocialUserBySocialUserId(Long socialUserId); + + /** + * 批量删除用户第三方用户信息 + * + * @param socialUserIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSocialUserBySocialUserIds(Long[] socialUserIds); + + /** + * 根据openId和unionId获取用户第三方信息 + * @param openId + * @param unionId + * @return + */ + SocialUser selectOneByOpenIdAndUnionId(@Param("openId") String openId, @Param("unionId") String unionId); + + /** + * 通过unionId查询 + * @param unionId + * @return + */ + Long selectSysUserIdByUnionId(String unionId); + + /** + * 通过系统用户id查询已绑定信息 + * @param sysUserId 系统用户id + * @return + */ + List selectBySysUserId(Long sysUserId); + + /** + * 取消三方登录相关信息 + * @param sysUserId 系统用户id + * @param sourceClientList 来源具体平台 + * @return + */ + int deleteBySysUserIdAndSourceClient(@Param("sysUserId") Long sysUserId, @Param("sourceClientList") List sourceClientList); + + /** + * 取消三方登录相关信息 + * @param sysUserIds 系统用户id集合 + * @param sourceClientList 来源具体平台 + * @return + */ + int deleteBySysUserIdsAndSourceClient(@Param("sysUserIds") Long[] sysUserIds, @Param("sourceClientList") List sourceClientList); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelMapper.java new file mode 100644 index 00000000..6ae07d36 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelMapper.java @@ -0,0 +1,125 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.common.core.iot.response.IdentityAndName; +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.model.ThingsModelPerm; +import com.fastbee.iot.model.ThingsModels.ThingsItems; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 物模型Mapper接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Repository +public interface ThingsModelMapper +{ + /** + * 查询物模型 + * + * @param modelId 物模型主键 + * @return 物模型 + */ + public ThingsModel selectThingsModelByModelId(Long modelId); + + /** + * 查询单个物模型 + * @param model 物模型 + * @return 单个物模型 + */ + public ThingsModel selectSingleThingsModel(ThingsModel model); + + /** + * 查询物模型列表 + * + * @param thingsModel 物模型 + * @return 物模型集合 + */ + public List selectThingsModelList(ThingsModel thingsModel); + + /** + * 查询物模型对应分享设备权限列表 + * + * @param productId 产品ID + * @return 物模型集合 + */ + public List selectThingsModelPermList(Long productId); + + /** + * 查询物模型列表-轮询 + * + * @param thingsModel 物模型 + * @return 物模型集合 + */ + public List selectThingsModelListCache(ThingsModel thingsModel); + + /** + * 根据产品ID数组获取物模型列表 + * @param modelIds + * @return + */ + public List selectThingsModelListByProductIds(Long[] modelIds); + + /** + * 新增物模型 + * + * @param thingsModel 物模型 + * @return 结果 + */ + public int insertThingsModel(ThingsModel thingsModel); + + /** + * 批量新增物模型 + * @param thingsModels + * @return + */ + public int insertBatchThingsModel(List thingsModels); + + /** + * 修改物模型 + * + * @param thingsModel 物模型 + * @return 结果 + */ + public int updateThingsModel(ThingsModel thingsModel); + + /** + * 删除物模型 + * + * @param modelId 物模型主键 + * @return 结果 + */ + public int deleteThingsModelByModelId(Long modelId); + + /** + * 批量删除物模型 + * + * @param modelIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteThingsModelByModelIds(Long[] modelIds); + + /** + * 根据产品id删除对应的物模型id + * @param productId + * @return + */ + public int deleteThingsModelByProductId(Long productId); + + /** + * 查询物模型是否历史存储 + * @param items + * @return + */ + public List selectThingsModelIsMonitor(ThingsItems items); + + /** + * 根据模板id查询从机采集点列表 + * + * @return 变量模板从机采集点集合 + */ + public List selectAllByTemplateId(Long templateId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelTemplateMapper.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelTemplateMapper.java new file mode 100644 index 00000000..58cb78ed --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/ThingsModelTemplateMapper.java @@ -0,0 +1,97 @@ +package com.fastbee.iot.mapper; + +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.domain.ThingsModelTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 通用物模型Mapper接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Repository +public interface ThingsModelTemplateMapper +{ + /** + * 查询通用物模型 + * + * @param templateId 通用物模型主键 + * @return 通用物模型 + */ + public ThingsModelTemplate selectThingsModelTemplateByTemplateId(Long templateId); + + /** + * 根据id数组查询通用物模型集合 + * @param templateIds + * @return + */ + public List selectThingsModelTemplateByTemplateIds (Long[] templateIds); + + /** + * 查询通用物模型列表 + * + * @param thingsModelTemplate 通用物模型 + * @return 通用物模型集合 + */ + public List selectThingsModelTemplateList(ThingsModelTemplate thingsModelTemplate); + + /** + * 新增通用物模型 + * + * @param thingsModelTemplate 通用物模型 + * @return 结果 + */ + public int insertThingsModelTemplate(ThingsModelTemplate thingsModelTemplate); + + /** + * 修改通用物模型 + * + * @param thingsModelTemplate 通用物模型 + * @return 结果 + */ + public int updateThingsModelTemplate(ThingsModelTemplate thingsModelTemplate); + + + /** + * 根据从机关联id更新模板信息 + * @param thingsModelTemplate + * @return + */ + public int updateTemplateByTempSlaveId(ThingsModelTemplate thingsModelTemplate); + + /** + * 删除通用物模型 + * + * @param templateId 通用物模型主键 + * @return 结果 + */ + public int deleteThingsModelTemplateByTemplateId(Long templateId); + + /** + * 根据采集点模板ID删除通用物模型 + * + * @param templateId 通用物模型主键 + * @return 结果 + */ + public int deleteThingsModelTemplateByVarTemplateId(Long templateId); + + /** + * 批量删除通用物模型 + * + * @param templateIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteThingsModelTemplateByTemplateIds(Long[] templateIds); + + + /** + * 根据模板id查询从机采集点列表 + * + * @return 变量模板从机采集点集合 + */ + public List selectAllByTemplateId(Long templateId); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Action.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Action.java new file mode 100644 index 00000000..5eac76de --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Action.java @@ -0,0 +1,110 @@ +package com.fastbee.iot.model; + +/** + * 动作 + * @author kerwincui + * @date 2021-12-16 + */ +public class Action +{ + /** 标识符 */ + private String id; + + /** 名称 */ + private String name; + + /** 值 */ + private String value; + + /** 类型:1=属性,2=功能,3=事件,5=设备上线,6=设备下线 */ + private int type; + + /** 产品ID */ + private Long productId; + + /** 产品名称 */ + private String productName; + + /** 设备ID */ + private Long deviceId; + + /** 设备名称 */ + private String deviceName; + + /** 设备编号 */ + private String serialNumber; + + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/AuthenticateInputModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/AuthenticateInputModel.java new file mode 100644 index 00000000..d28cbcdf --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/AuthenticateInputModel.java @@ -0,0 +1,36 @@ +package com.fastbee.iot.model; + +/** + * 动作 + * @author kerwincui + * @date 2021-12-16 + */ +public class AuthenticateInputModel +{ + /** 设备编号 */ + private String serialNumber; + + /** 产品ID */ + private Long productId; + + public AuthenticateInputModel(String serialNumber,Long productId){ + this.serialNumber=serialNumber; + this.productId=productId; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/CategoryNews.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/CategoryNews.java new file mode 100644 index 00000000..708e413b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/CategoryNews.java @@ -0,0 +1,49 @@ +package com.fastbee.iot.model; + +import com.fastbee.iot.domain.News; + +import java.util.ArrayList; +import java.util.List; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class CategoryNews +{ + private Long categoryId; + + private String categoryName; + + private List newsList; + + public CategoryNews(){ + this.newsList=new ArrayList<>(); + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public List getNewsList() { + return newsList; + } + + public void setNewsList(List newsList) { + this.newsList = newsList; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ChangeProductStatusModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ChangeProductStatusModel.java new file mode 100644 index 00000000..0b59be9e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ChangeProductStatusModel.java @@ -0,0 +1,41 @@ +package com.fastbee.iot.model; + +/** + * id和name + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ChangeProductStatusModel +{ + private Long productId; + + private Integer status; + + private Integer deviceType; + + public Integer getDeviceType() { + return deviceType; + } + + public void setDeviceType(Integer deviceType) { + this.deviceType = deviceType; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DataResult.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DataResult.java new file mode 100644 index 00000000..983519fe --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DataResult.java @@ -0,0 +1,19 @@ +package com.fastbee.iot.model; + +import lombok.Data; + +import java.util.Date; + +/** + * @author gsb + * @date 2023/4/6 11:57 + */ +@Data +public class DataResult { + + private String id; + /**值*/ + private String value; + /**时间*/ + private Date ts; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceAllShortOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceAllShortOutput.java new file mode 100644 index 00000000..f396a6b5 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceAllShortOutput.java @@ -0,0 +1,220 @@ +package com.fastbee.iot.model; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 设备对象 iot_device + * + * @author kerwincui + * @date 2021-12-16 + */ +public class DeviceAllShortOutput +{ + private static final long serialVersionUID = 1L; + + /** 产品分类ID */ + private Long deviceId; + + /** 产品分类名称 */ + private String deviceName; + + /** 产品名称 */ + private String productName; + + /** 设备类型(1-直连设备、2-网关子设备、3-网关设备) */ + private Integer deviceType; + + /** 用户昵称 */ + private String userName; + + /** 设备编号 */ + private String serialNumber; + + /** 固件版本 */ + private BigDecimal firmwareVersion; + + /** 设备状态(1-未激活,2-禁用,3-在线,4-离线) */ + private Integer status; + + /** 设备影子 */ + private Integer isShadow; + + /** wifi信号强度(信号极好4格[-55— 0],信号好3格[-70— -55],信号一般2格[-85— -70],信号差1格[-100— -85]) */ + private Integer rssi; + + /** 激活时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date activeTime; + + /** 是否自定义位置 **/ + private Integer locationWay; + + /** 设备地址 */ + private String networkAddress; + + /** 经度 */ + private BigDecimal longitude; + + /** 纬度 */ + private BigDecimal latitude; + + /** 是否设备所有者,用于查询 **/ + private Integer isOwner; + + private Integer subDeviceCount; + + public Integer getSubDeviceCount() { + return subDeviceCount; + } + + public void setSubDeviceCount(Integer subDeviceCount) { + this.subDeviceCount = subDeviceCount; + } + + public Integer getLocationWay() { + return locationWay; + } + + public void setLocationWay(Integer locationWay) { + this.locationWay = locationWay; + } + + public Integer getIsOwner() { + return isOwner; + } + + public void setIsOwner(Integer isOwner) { + this.isOwner = isOwner; + } + + public String getNetworkAddress() { + return networkAddress; + } + + public void setNetworkAddress(String networkAddress) { + this.networkAddress = networkAddress; + } + + public BigDecimal getLongitude() { + return longitude; + } + + public void setLongitude(BigDecimal longitude) { + this.longitude = longitude; + } + + public BigDecimal getLatitude() { + return latitude; + } + + public void setLatitude(BigDecimal latitude) { + this.latitude = latitude; + } + + public Integer getIsShadow() { + return isShadow; + } + + public void setIsShadow(Integer isShadow) { + this.isShadow = isShadow; + } + + public void setRssi(Integer rssi) + { + this.rssi = rssi; + } + + public Integer getRssi() + { + return rssi; + } + + public void setDeviceId(Long deviceId) + { + this.deviceId = deviceId; + } + + public Long getDeviceId() + { + return deviceId; + } + public void setDeviceName(String deviceName) + { + this.deviceName = deviceName; + } + + public String getDeviceName() + { + return deviceName; + } + + public void setProductName(String productName) + { + this.productName = productName; + } + + public String getProductName() + { + return productName; + } + public void setDeviceType(Integer deviceType) + { + this.deviceType = deviceType; + } + + public Integer getDeviceType() + { + return deviceType; + } + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserName() + { + return userName; + } + + public void setStatus(Integer status) + { + this.status = status; + } + public Integer getStatus() + { + return status; + } + + public void setSerialNumber(String serialNumber) + { + this.serialNumber = serialNumber; + } + + public String getSerialNumber() + { + return serialNumber; + } + public void setFirmwareVersion(BigDecimal firmwareVersion) + { + this.firmwareVersion = firmwareVersion; + } + + public BigDecimal getFirmwareVersion() + { + return firmwareVersion; + } + + public void setActiveTime(Date activeTime) + { + this.activeTime = activeTime; + } + + public Date getActiveTime() + { + return activeTime; + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceGroupInput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceGroupInput.java new file mode 100644 index 00000000..da6a1b12 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceGroupInput.java @@ -0,0 +1,36 @@ +package com.fastbee.iot.model; + +/** + * 设备分组对象 iot_device_group + * + * @author kerwincui + * @date 2021-12-16 + */ +public class DeviceGroupInput +{ + private static final long serialVersionUID = 1L; + + /** 分组ID */ + private Long groupId; + + /** 设备ID */ + private Long[] deviceIds; + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Long[] getDeviceIds() { + return deviceIds; + } + + public void setDeviceIds(Long[] deviceIds) { + this.deviceIds = deviceIds; + } + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttConnectVO.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttConnectVO.java new file mode 100644 index 00000000..484c7c21 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttConnectVO.java @@ -0,0 +1,35 @@ +package com.fastbee.iot.model; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 设备MQTT连接参数实体类 + * @author fastb + * @date 2023-08-02 17:01 + */ +@Accessors(chain = true) +@Data +public class DeviceMqttConnectVO { + + /** + * 客户端id + */ + private String clientId; + + /** + * 连接用户名 + */ + private String username; + + /** + * 连接密码 + */ + private String passwd; + + /** + * 连接端口号 + */ + private Long port; + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttVO.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttVO.java new file mode 100644 index 00000000..7ce4ef50 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceMqttVO.java @@ -0,0 +1,126 @@ +package com.fastbee.iot.model; + +/** + * MQTT连接相关参数实体类 + * @author fastb + * @date 2023-08-02 17:09 + */ +public class DeviceMqttVO { + + /** + * 设备主键id + */ + private Long deviceId; + + /** + * 设备编号 + */ + private String serialNumber; + + /** + * 产品id + */ + private Long productId; + + /** + * 用户id + */ + private Long userId; + + /** + * mqtt连接账号 + */ + private String mqttAccount; + + /** + * mqtt连接密码 + */ + private String mqttPassword; + + /** + * 产品密匙 + */ + private String mqttSecret; + + /** + * 是否启用授权码(0-否,1-是) + */ + private Integer isAuthorize; + + /** + * 认证方式 + */ + private Integer vertificateMethod; + + public Integer getVertificateMethod() { + return vertificateMethod; + } + + public void setVertificateMethod(Integer vertificateMethod) { + this.vertificateMethod = vertificateMethod; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getMqttAccount() { + return mqttAccount; + } + + public void setMqttAccount(String mqttAccount) { + this.mqttAccount = mqttAccount; + } + + public String getMqttPassword() { + return mqttPassword; + } + + public void setMqttPassword(String mqttPassword) { + this.mqttPassword = mqttPassword; + } + + public String getMqttSecret() { + return mqttSecret; + } + + public void setMqttSecret(String mqttSecret) { + this.mqttSecret = mqttSecret; + } + + public Integer getIsAuthorize() { + return isAuthorize; + } + + public void setIsAuthorize(Integer isAuthorize) { + this.isAuthorize = isAuthorize; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceNumberAndProductId.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceNumberAndProductId.java new file mode 100644 index 00000000..88e8e236 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceNumberAndProductId.java @@ -0,0 +1,38 @@ +package com.fastbee.iot.model; + +/** + * + * @author kerwincui + * @date 2021-12-16 + */ +public class DeviceNumberAndProductId +{ + /** 产品ID,用于自动添加设备 */ + private Long productId; + + /** 设备编号集合 */ + private String deviceNumber; + + public DeviceNumberAndProductId(){} + + public DeviceNumberAndProductId(Long productId, String deviceNumber){ + this.productId=productId; + this.deviceNumber=deviceNumber; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getDeviceNumber() { + return deviceNumber; + } + + public void setDeviceNumber(String deviceNumber) { + this.deviceNumber = deviceNumber; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateAlertLogVO.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateAlertLogVO.java new file mode 100644 index 00000000..23a8213a --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateAlertLogVO.java @@ -0,0 +1,31 @@ +package com.fastbee.iot.model; + +import lombok.Data; + +/** + * @author fastb + * @date 2023-09-13 11:18 + */ +@Data +public class DeviceRelateAlertLogVO { + + /** + * 设备ID + */ + private Long deviceId; + + /** + * 设备编号 + */ + private String serialNumber; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 用户ID + */ + private Long userId; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateUserInput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateUserInput.java new file mode 100644 index 00000000..618cea7b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceRelateUserInput.java @@ -0,0 +1,41 @@ +package com.fastbee.iot.model; + +import java.util.List; + +/** + * + * @author kerwincui + * @date 2021-12-16 + */ +public class DeviceRelateUserInput +{ + + /** 用户Id */ + private Long userId; + + /** 设备编号和产品ID集合 */ + private List deviceNumberAndProductIds; + + public DeviceRelateUserInput(){} + + public DeviceRelateUserInput(Long userId,List deviceNumberAndProductIds){ + this.userId=userId; + this.deviceNumberAndProductIds=deviceNumberAndProductIds; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public List getDeviceNumberAndProductIds() { + return deviceNumberAndProductIds; + } + + public void setDeviceNumberAndProductIds(List deviceNumberAndProductIds) { + this.deviceNumberAndProductIds = deviceNumberAndProductIds; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceShortOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceShortOutput.java new file mode 100644 index 00000000..e0006773 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceShortOutput.java @@ -0,0 +1,421 @@ +package com.fastbee.iot.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fastbee.common.annotation.Excel; +import com.fastbee.iot.model.ThingsModelItem.*; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 设备对象 iot_device + * + * @author kerwincui + * @date 2021-12-16 + */ +public class DeviceShortOutput +{ + public DeviceShortOutput(){ + this.stringList=new ArrayList<>(); + this.integerList=new ArrayList<>(); + this.decimalList=new ArrayList<>(); + this.enumList=new ArrayList<>(); + this.arrayList=new ArrayList<>(); + this.readOnlyList =new ArrayList<>(); + this.boolList=new ArrayList<>(); + } + + private static final long serialVersionUID = 1L; + + /** 产品分类ID */ + private Long deviceId; + + /** 产品分类名称 */ + @Excel(name = "设备名称") + private String deviceName; + + /** 产品ID */ + @Excel(name = "产品ID") + private Long productId; + + /** 产品名称 */ + @Excel(name = "产品名称") + private String productName; + + /** 设备类型(1-直连设备、2-网关子设备、3-网关设备) */ + private Integer deviceType; + + /** 用户ID */ + @Excel(name = "用户ID") + private Long userId; + + /** 用户昵称 */ + @Excel(name = "用户昵称") + private String userName; + + /** 租户ID */ + @Excel(name = "租户ID") + private Long tenantId; + + /** 租户名称 */ + @Excel(name = "租户名称") + private String tenantName; + + /** 设备编号 */ + @Excel(name = "设备编号") + private String serialNumber; + + /** 固件版本 */ + @Excel(name = "固件版本") + private BigDecimal firmwareVersion; + + /** 设备状态(1-未激活,2-禁用,3-在线,4-离线) */ + @Excel(name = "设备状态") + private Integer status; + + /** 设备影子 */ + private Integer isShadow; + + private Integer isSimulate; + + /** wifi信号强度(信号极好4格[-55— 0],信号好3格[-70— -55],信号一般2格[-85— -70],信号差1格[-100— -85]) */ + @Excel(name = "wifi信号强度") + private Integer rssi; + + @Excel(name = "物模型") + private String thingsModelValue; + + /** 激活时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "激活时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date activeTime; + + /** 激活时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date createTime; + + @Excel(name = "网关设备编号(子设备使用)") + private String gwDevCode; + + /** 是否自定义位置 **/ + private Integer locationWay; + + /** 图片地址 */ + private String imgUrl; + + /** 是否设备所有者,用于查询 **/ + private Integer isOwner; + + + /**子设备数量*/ + private Integer subDeviceCount; + + /**子设备地址*/ + private Integer slaveId; + /*传输协议*/ + private String transport; + /*设备通讯协议*/ + private String protocolCode; + + public String getTransport() { + return transport; + } + + public void setTransport(String transport) { + this.transport = transport; + } + + public String getProtocolCode() { + return protocolCode; + } + + public void setProtocolCode(String protocolCode) { + this.protocolCode = protocolCode; + } + + public Integer getSlaveId() { + return slaveId; + } + + public void setSlaveId(Integer slaveId) { + this.slaveId = slaveId; + } + + public Integer getSubDeviceCount() { + return subDeviceCount; + } + + public void setSubDeviceCount(Integer subDeviceCount) { + this.subDeviceCount = subDeviceCount; + } + + private List thingsModels; + + public List getThingsModels() { + return thingsModels; + } + + public void setThingsModels(List thingsModels) { + this.thingsModels = thingsModels; + } + + private List stringList; + private List integerList; + private List decimalList; + private List enumList; + private List arrayList; + private List boolList; + private List readOnlyList; + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getGwDevCode() { + return gwDevCode; + } + + public void setGwDevCode(String gwDevCode) { + this.gwDevCode = gwDevCode; + } + + public Integer getLocationWay() { + return locationWay; + } + + public void setLocationWay(Integer locationWay) { + this.locationWay = locationWay; + } + + public Integer getIsOwner() { + return isOwner; + } + + public void setIsOwner(Integer isOwner) { + this.isOwner = isOwner; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getIsSimulate() { + return isSimulate; + } + + public void setIsSimulate(Integer isSimulate) { + this.isSimulate = isSimulate; + } + + public Integer getIsShadow() { + return isShadow; + } + + public void setIsShadow(Integer isShadow) { + this.isShadow = isShadow; + } + + public List getBoolList() { + return boolList; + } + + public void setBoolList(List boolList) { + this.boolList = boolList; + } + + public List getReadOnlyList() { + return readOnlyList; + } + + public void setReadOnlyList(List readOnlyList) { + this.readOnlyList = readOnlyList; + } + + public List getStringList() { + return stringList; + } + + public void setStringList(List stringList) { + this.stringList = stringList; + } + + public List getIntegerList() { + return integerList; + } + + public void setIntegerList(List integerList) { + this.integerList = integerList; + } + + public List getDecimalList() { + return decimalList; + } + + public void setDecimalList(List decimalList) { + this.decimalList = decimalList; + } + + public List getEnumList() { + return enumList; + } + + public void setEnumList(List enumList) { + this.enumList = enumList; + } + + public List getArrayList() { + return arrayList; + } + + public void setArrayList(List arrayList) { + this.arrayList = arrayList; + } + public void setRssi(Integer rssi) + { + this.rssi = rssi; + } + + public Integer getRssi() + { + return rssi; + } + public void setThingsModelValue(String thingsModelValue) + { + this.thingsModelValue = thingsModelValue; + } + + public String getThingsModelValue() + { + return thingsModelValue; + } + public void setDeviceId(Long deviceId) + { + this.deviceId = deviceId; + } + + public Long getDeviceId() + { + return deviceId; + } + public void setDeviceName(String deviceName) + { + this.deviceName = deviceName; + } + + public String getDeviceName() + { + return deviceName; + } + public void setProductId(Long productId) + { + this.productId = productId; + } + + public Long getProductId() + { + return productId; + } + public void setProductName(String productName) + { + this.productName = productName; + } + + public String getProductName() + { + return productName; + } + public void setDeviceType(Integer deviceType) + { + this.deviceType = deviceType; + } + + public Integer getDeviceType() + { + return deviceType; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserName() + { + return userName; + } + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public void setStatus(Integer status) + { + this.status = status; + } + public Integer getStatus() + { + return status; + } + + public Long getTenantId() + { + return tenantId; + } + public void setTenantName(String tenantName) + { + this.tenantName = tenantName; + } + + public String getTenantName() + { + return tenantName; + } + public void setSerialNumber(String serialNumber) + { + this.serialNumber = serialNumber; + } + + public String getSerialNumber() + { + return serialNumber; + } + public void setFirmwareVersion(BigDecimal firmwareVersion) + { + this.firmwareVersion = firmwareVersion; + } + + public BigDecimal getFirmwareVersion() + { + return firmwareVersion; + } + + public void setActiveTime(Date activeTime) + { + this.activeTime = activeTime; + } + + public Date getActiveTime() + { + return activeTime; + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceStatistic.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceStatistic.java new file mode 100644 index 00000000..d00e89fa --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceStatistic.java @@ -0,0 +1,101 @@ +package com.fastbee.iot.model; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * id和name + * + * @author kerwincui + * @date 2021-12-16 + */ +public class DeviceStatistic +{ + /** 设备数量 **/ + private int deviceCount; + + /** 设备数量 **/ + private int deviceOnlineCount; + + /** 产品数量 **/ + private int productCount; + + /** 告警 **/ + private long alertCount; + + /** 属性上报 **/ + private long propertyCount; + + /** 功能上报 **/ + private long functionCount; + + /** 事件上报 **/ + private long eventCount; + + /** 监测数据上报 **/ + private long monitorCount; + + public int getDeviceOnlineCount() { + return deviceOnlineCount; + } + + public void setDeviceOnlineCount(int deviceOnlineCount) { + this.deviceOnlineCount = deviceOnlineCount; + } + + public long getMonitorCount() { + return monitorCount; + } + + public void setMonitorCount(long monitorCount) { + this.monitorCount = monitorCount; + } + + public int getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(int deviceCount) { + this.deviceCount = deviceCount; + } + + public int getProductCount() { + return productCount; + } + + public void setProductCount(int productCount) { + this.productCount = productCount; + } + + public long getAlertCount() { + return alertCount; + } + + public void setAlertCount(long alertCount) { + this.alertCount = alertCount; + } + + public long getPropertyCount() { + return propertyCount; + } + + public void setPropertyCount(long propertyCount) { + this.propertyCount = propertyCount; + } + + public long getFunctionCount() { + return functionCount; + } + + public void setFunctionCount(long functionCount) { + this.functionCount = functionCount; + } + + public long getEventCount() { + return eventCount; + } + + public void setEventCount(long eventCount) { + this.eventCount = eventCount; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/HistoryModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/HistoryModel.java new file mode 100644 index 00000000..cad93d6a --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/HistoryModel.java @@ -0,0 +1,20 @@ +package com.fastbee.iot.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author bill + */ +@Data +public class HistoryModel { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date time; + + private String value; + + private String identity; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdAndName.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdAndName.java new file mode 100644 index 00000000..5816df6b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdAndName.java @@ -0,0 +1,44 @@ +package com.fastbee.iot.model; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * id和name + * + * @author kerwincui + * @date 2021-12-16 + */ +public class IdAndName +{ + private Long id; + + private String name; + + + public void setId(Long id) + { + this.id = id; + } + public Long getId() + { + return id; + } + + public void setName(String name) + { + this.name = name; + } + public String getName() + { + return name; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("categoryId", getId()) + .append("categoryName", getName()) + .toString(); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdOutput.java new file mode 100644 index 00000000..afb30f74 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/IdOutput.java @@ -0,0 +1,24 @@ +package com.fastbee.iot.model; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class IdOutput +{ + private Long id; + + public void setId(Long id) + { + this.id = id; + } + public Long getId() + { + return id; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ImportThingsModelInput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ImportThingsModelInput.java new file mode 100644 index 00000000..ae4010ef --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ImportThingsModelInput.java @@ -0,0 +1,47 @@ +package com.fastbee.iot.model; + +import com.fastbee.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 导入产品物模型的输入对象 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ImportThingsModelInput +{ + /** 产品ID */ + private Long productId; + + /** 产品名称 */ + private String ProductName; + + /** 通用物模型ID集合 */ + private Long[] templateIds; + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getProductName() { + return ProductName; + } + + public void setProductName(String productName) { + ProductName = productName; + } + + public Long[] getTemplateIds() { + return templateIds; + } + + public void setTemplateIds(Long[] templateIds) { + this.templateIds = templateIds; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MonitorModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MonitorModel.java new file mode 100644 index 00000000..dda59cba --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MonitorModel.java @@ -0,0 +1,34 @@ +package com.fastbee.iot.model; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 动作 + * @author kerwincui + * @date 2021-12-16 + */ +public class MonitorModel +{ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date time; + + private String value; + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttAuthenticationModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttAuthenticationModel.java new file mode 100644 index 00000000..1e44ee06 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttAuthenticationModel.java @@ -0,0 +1,89 @@ +package com.fastbee.iot.model; + +/** + * 动作 + * @author kerwincui + * @date 2021-12-16 + */ +public class MqttAuthenticationModel +{ + /** Mqtt客户端ID */ + String clientId; + + /** Mqtt用户名 */ + String userName; + + /** Mqtt密码 */ + String password; + + /** 设备编号 */ + String deviceNumber; + + /** 产品ID */ + Long productId; + + /** 设备关联的用户ID */ + Long userId; + + public MqttAuthenticationModel(String clientid,String username,String password,String deviceNumber ,Long productId,Long userId){ + this.clientId=clientid; + this.userName=username; + this.password=password; + this.deviceNumber=deviceNumber; + this.productId=productId; + this.userId=userId; + } + public MqttAuthenticationModel(String clientid,String username,String password){ + this.clientId=clientid; + this.userName=username; + this.password=password; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDeviceNumber() { + return deviceNumber; + } + + public void setDeviceNumber(String deviceNumber) { + this.deviceNumber = deviceNumber; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttClientConnectModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttClientConnectModel.java new file mode 100644 index 00000000..99c4ae6e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttClientConnectModel.java @@ -0,0 +1,98 @@ +package com.fastbee.iot.model; + +/** + * 客户端连接模型 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class MqttClientConnectModel +{ + /** 事件名称(固定为:"client_connected" "client_disconnected") **/ + private String action; + + /** 客户端 ClientId **/ + private String clientid; + + /** 客户端 Username,不存在时该值为 "undefined" **/ + private String username; + + /** 客户端源 IP 地址 **/ + private String ipaddress; + + /** 客户端申请的心跳保活时间 **/ + private Integer keepalive; + + /** 协议版本号 **/ + private Integer proto_ver; + + /** 时间戳(秒) **/ + private Long connected_at; + + /** 错误原因 **/ + private String reason; + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getClientid() { + return clientid; + } + + public void setClientid(String clientid) { + this.clientid = clientid; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getIpaddress() { + return ipaddress; + } + + public void setIpaddress(String ipaddress) { + this.ipaddress = ipaddress; + } + + public Integer getKeepalive() { + return keepalive; + } + + public void setKeepalive(Integer keepalive) { + this.keepalive = keepalive; + } + + public Integer getProto_ver() { + return proto_ver; + } + + public void setProto_ver(Integer proto_ver) { + this.proto_ver = proto_ver; + } + + public Long getConnected_at() { + return connected_at; + } + + public void setConnected_at(Long connected_at) { + this.connected_at = connected_at; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttInfoModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttInfoModel.java new file mode 100644 index 00000000..9409b623 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/MqttInfoModel.java @@ -0,0 +1,43 @@ +package com.fastbee.iot.model; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * id和name + * + * @author kerwincui + * @date 2021-12-16 + */ +public class MqttInfoModel +{ + private String clientid; + + private String username; + + private String password; + + public String getClientid() { + return clientid; + } + + public void setClientid(String clientid) { + this.clientid = clientid; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/NtpModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/NtpModel.java new file mode 100644 index 00000000..1b25f4bf --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/NtpModel.java @@ -0,0 +1,40 @@ +package com.fastbee.iot.model; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class NtpModel +{ + private Long deviceSendTime; + + private Long serverRecvTime; + + private Long serverSendTime; + + public Long getDeviceSendTime() { + return deviceSendTime; + } + + public void setDeviceSendTime(Long deviceSendTime) { + this.deviceSendTime = deviceSendTime; + } + + public Long getServerRecvTime() { + return serverRecvTime; + } + + public void setServerRecvTime(Long serverRecvTime) { + this.serverRecvTime = serverRecvTime; + } + + public Long getServerSendTime() { + return serverSendTime; + } + + public void setServerSendTime(Long serverSendTime) { + this.serverSendTime = serverSendTime; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthenticateModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthenticateModel.java new file mode 100644 index 00000000..3615b475 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthenticateModel.java @@ -0,0 +1,137 @@ +package com.fastbee.iot.model; + + +import com.fastbee.common.annotation.Excel; + +public class ProductAuthenticateModel { + /** 产品分类ID */ + private Long deviceId; + + /** 产品分类名称 */ + private String deviceName; + + /**设备状态(1-未激活,2-禁用,3-在线,4-离线)**/ + private int status; + + /** 产品ID */ + private Long productId; + + /** 产品名称 */ + private String productName; + + /** 产品状态 1-未发布,2-已发布 */ + private int productStatus; + + /** 是否启用授权码(0-否,1-是) */ + private Integer isAuthorize; + + /** 设备编号 */ + private String serialNumber; + + /** mqtt账号 */ + private String mqttAccount; + + /** mqtt密码 */ + private String mqttPassword; + + /** 产品秘钥 */ + private String mqttSecret; + + private int vertificateMethod; + + public int getVertificateMethod() { + return vertificateMethod; + } + + public void setVertificateMethod(int vertificateMethod) { + this.vertificateMethod = vertificateMethod; + } + + public Integer getIsAuthorize() { + return isAuthorize; + } + + public void setIsAuthorize(Integer isAuthorize) { + this.isAuthorize = isAuthorize; + } + + public int getProductStatus() { + return productStatus; + } + + public void setProductStatus(int productStatus) { + this.productStatus = productStatus; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public String getMqttAccount() { + return mqttAccount; + } + + public void setMqttAccount(String mqttAccount) { + this.mqttAccount = mqttAccount; + } + + public String getMqttPassword() { + return mqttPassword; + } + + public void setMqttPassword(String mqttPassword) { + this.mqttPassword = mqttPassword; + } + + public String getMqttSecret() { + return mqttSecret; + } + + public void setMqttSecret(String mqttSecret) { + this.mqttSecret = mqttSecret; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthorizeVO.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthorizeVO.java new file mode 100644 index 00000000..9e5fbfd6 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductAuthorizeVO.java @@ -0,0 +1,30 @@ +package com.fastbee.iot.model; + +/** + * 批量新增产品授权码VO + * + * @author Venus Zhang + * @create 2022-04-11 15:04 + */ + +public class ProductAuthorizeVO { + + private Long productId; + private int createNum; + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public int getCreateNum() { + return createNum; + } + + public void setCreateNum(int createNum) { + this.createNum = createNum; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductCode.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductCode.java new file mode 100644 index 00000000..7cf5765b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ProductCode.java @@ -0,0 +1,20 @@ +package com.fastbee.iot.model; + +import lombok.Data; + +/** + * @author gsb + * @date 2023/9/4 17:23 + */ +@Data +public class ProductCode { + + /** + * 产品id + */ + private Long productId; + /** + * 协议编号 + */ + private String protocolCode; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserInput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserInput.java new file mode 100644 index 00000000..f4015801 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserInput.java @@ -0,0 +1,73 @@ +package com.fastbee.iot.model; + +public class RegisterUserInput { + /** + * 用户名 + */ + private String username; + + /** + * 用户密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + private String phonenumber; + + /** + * 唯一标识 + */ + private String uuid = ""; + + public String getPhonenumber() { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) { + this.phonenumber = phonenumber; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getUuid() + { + return uuid; + } + + public void setUuid(String uuid) + { + this.uuid = uuid; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserOutput.java new file mode 100644 index 00000000..583da6c5 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/RegisterUserOutput.java @@ -0,0 +1,21 @@ +package com.fastbee.iot.model; + +import lombok.Data; + +/** + * @author fastb + * @date 2023-08-17 11:46 + */ +@Data +public class RegisterUserOutput { + + /** + * 错误信息 + */ + private String msg; + + /** + * 用户id + */ + private Long sysUserId; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Specs.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Specs.java new file mode 100644 index 00000000..cab5b2da --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/Specs.java @@ -0,0 +1,44 @@ +package com.fastbee.iot.model; + +import lombok.Data; + +/** + * 数据定义 + * + * @author bill + */ +@Data +public class Specs { + + private String id; + private String name; + private Integer isMonitor; + private Integer slaveId; + private Integer isChart; + private Integer isHistory; + private String datatype; + /** + * 计算公式 + */ + private String formula; + + + @Data + static class Datatype { + + private String unit; + private Long min; + private Long max; + private Integer step; + private String type; + private String trueText; + private String falseText; + private EnumList enumList; + } + + @Data + static class EnumList{ + private String text; + private String value; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ArrayModelOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ArrayModelOutput.java new file mode 100644 index 00000000..d442c663 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ArrayModelOutput.java @@ -0,0 +1,24 @@ +package com.fastbee.iot.model.ThingsModelItem; + +public class ArrayModelOutput extends ThingsModelItemBase +{ + private String arrayType; + + private Integer arrayCount; + + public Integer getArrayCount() { + return arrayCount; + } + + public void setArrayCount(Integer arrayCount) { + this.arrayCount = arrayCount; + } + + public String getArrayType() { + return arrayType; + } + + public void setArrayType(String arrayType) { + this.arrayType = arrayType; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/BoolModelOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/BoolModelOutput.java new file mode 100644 index 00000000..e4fdc355 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/BoolModelOutput.java @@ -0,0 +1,23 @@ +package com.fastbee.iot.model.ThingsModelItem; + +public class BoolModelOutput extends ThingsModelItemBase +{ + private String falseText; + private String trueText; + + public String getFalseText() { + return falseText; + } + + public void setFalseText(String falseText) { + this.falseText = falseText; + } + + public String getTrueText() { + return trueText; + } + + public void setTrueText(String trueText) { + this.trueText = trueText; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/Datatype.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/Datatype.java new file mode 100644 index 00000000..d473b29d --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/Datatype.java @@ -0,0 +1,161 @@ +package com.fastbee.iot.model.ThingsModelItem; + +import java.math.BigDecimal; +import java.util.List; + +public class Datatype +{ + /** 数据类型 */ + private String type; + + private String falseText; + + private String trueText; + + private BigDecimal min; + + private BigDecimal max; + + private BigDecimal step; + + private String unit; + + private String arrayType; + + private Integer arrayCount; + + private String showWay; + + private int maxLength; + + private List enumList; + + private List params; + + private List[] arrayParams; + + public Datatype(){ + falseText=""; + trueText=""; + min= BigDecimal.valueOf(0); + max= BigDecimal.valueOf(100); + step= BigDecimal.valueOf(1); + unit=""; + arrayType=""; + arrayCount=0; + maxLength=1024; + } + + public List[] getArrayParams() { + return arrayParams; + } + + public void setArrayParams(List[] arrayParams) { + this.arrayParams = arrayParams; + } + + public List getParams() { + return params; + } + + public void setParams(List params) { + this.params = params; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getFalseText() { + return falseText; + } + + public void setFalseText(String falseText) { + this.falseText = falseText; + } + + public String getTrueText() { + return trueText; + } + + public void setTrueText(String trueText) { + this.trueText = trueText; + } + + public BigDecimal getMin() { + return min; + } + + public void setMin(BigDecimal min) { + this.min = min; + } + + public BigDecimal getMax() { + return max; + } + + public void setMax(BigDecimal max) { + this.max = max; + } + + public BigDecimal getStep() { + return step; + } + + public void setStep(BigDecimal step) { + this.step = step; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public String getArrayType() { + return arrayType; + } + + public void setArrayType(String arrayType) { + this.arrayType = arrayType; + } + + public String getShowWay() { + return showWay; + } + + public void setShowWay(String showWay) { + this.showWay = showWay; + } + + public Integer getArrayCount() { + return arrayCount; + } + + public void setArrayCount(Integer arrayCount) { + this.arrayCount = arrayCount; + } + + public int getMaxLength() { + return maxLength; + } + + public void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } + + public List getEnumList() { + return enumList; + } + + public void setEnumList(List enumList) { + this.enumList = enumList; + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/DecimalModelOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/DecimalModelOutput.java new file mode 100644 index 00000000..74733655 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/DecimalModelOutput.java @@ -0,0 +1,43 @@ +package com.fastbee.iot.model.ThingsModelItem; + +import java.math.BigDecimal; + +public class DecimalModelOutput extends ThingsModelItemBase +{ + private BigDecimal min; + private BigDecimal max; + private BigDecimal step; + private String unit; + + public BigDecimal getMin() { + return min; + } + + public void setMin(BigDecimal min) { + this.min = min; + } + + public BigDecimal getMax() { + return max; + } + + public void setMax(BigDecimal max) { + this.max = max; + } + + public BigDecimal getStep() { + return step; + } + + public void setStep(BigDecimal step) { + this.step = step; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItem.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItem.java new file mode 100644 index 00000000..4799b2d5 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItem.java @@ -0,0 +1,27 @@ +package com.fastbee.iot.model.ThingsModelItem; + + +public class EnumItem +{ + private String text; + private String value; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItemOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItemOutput.java new file mode 100644 index 00000000..06829e83 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumItemOutput.java @@ -0,0 +1,23 @@ +package com.fastbee.iot.model.ThingsModelItem; + +public class EnumItemOutput +{ + private String text; + private String value; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumModelOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumModelOutput.java new file mode 100644 index 00000000..911a522d --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/EnumModelOutput.java @@ -0,0 +1,16 @@ +package com.fastbee.iot.model.ThingsModelItem; + +import java.util.List; + +public class EnumModelOutput extends ThingsModelItemBase +{ + private List enumList; + + public List getEnumList() { + return enumList; + } + + public void setEnumList(List enumList) { + this.enumList = enumList; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/IntegerModelOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/IntegerModelOutput.java new file mode 100644 index 00000000..c0507f2e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/IntegerModelOutput.java @@ -0,0 +1,43 @@ +package com.fastbee.iot.model.ThingsModelItem; + +import java.math.BigDecimal; + +public class IntegerModelOutput extends ThingsModelItemBase +{ + private BigDecimal min; + private BigDecimal max; + private BigDecimal step; + private String unit; + + public BigDecimal getMin() { + return min; + } + + public void setMin(BigDecimal min) { + this.min = min; + } + + public BigDecimal getMax() { + return max; + } + + public void setMax(BigDecimal max) { + this.max = max; + } + + public BigDecimal getStep() { + return step; + } + + public void setStep(BigDecimal step) { + this.step = step; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ReadOnlyModelOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ReadOnlyModelOutput.java new file mode 100644 index 00000000..4a97ec7e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ReadOnlyModelOutput.java @@ -0,0 +1,44 @@ +package com.fastbee.iot.model.ThingsModelItem; + +import java.math.BigDecimal; +import java.util.List; + +public class ReadOnlyModelOutput extends ThingsModelItemBase +{ + private BigDecimal min; + private BigDecimal max; + private BigDecimal step; + private String unit; + + public BigDecimal getMin() { + return min; + } + + public void setMin(BigDecimal min) { + this.min = min; + } + + public BigDecimal getMax() { + return max; + } + + public void setMax(BigDecimal max) { + this.max = max; + } + + public BigDecimal getStep() { + return step; + } + + public void setStep(BigDecimal step) { + this.step = step; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/StringModelOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/StringModelOutput.java new file mode 100644 index 00000000..4569771a --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/StringModelOutput.java @@ -0,0 +1,14 @@ +package com.fastbee.iot.model.ThingsModelItem; + +public class StringModelOutput extends ThingsModelItemBase +{ + private int maxLength; + + public int getMaxLength() { + return maxLength; + } + + public void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModel.java new file mode 100644 index 00000000..98dd8e6c --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModel.java @@ -0,0 +1,167 @@ +package com.fastbee.iot.model.ThingsModelItem; + +public class ThingsModel +{ + /** 物模型唯一标识符 */ + private String id; + /** 物模型名称 */ + private String name; + /** 物模型值 */ + private String value; + /** 影子值 */ + private String shadow; + /** 是否首页显示(0-否,1-是) */ + private Integer isChart; + /** 是否实时监测(0-否,1-是) */ + private Integer isMonitor; + /** 是否实时监测(0-否,1-是) */ + private Integer isReadonly; + /** 是否历史存储(0-否,1-是) */ + private Integer isHistory; + /** 是否设备分享权限(0-否,1-是) */ + private Integer isSharePerm; + /** 类型 1=属性,2=功能,3=事件 */ + private Integer type; + /** 排序 */ + private Integer order; + /** 数据类型 */ + private Datatype datatype; + + /**子设备编号*/ + private Integer slaveId; + + private String regId; + + private String ts; + + public ThingsModel(){ + value=""; + shadow=""; + order=0; + isMonitor=0; + isHistory=0; + isReadonly=0; + isChart=0; + isSharePerm=0; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getRegId() { + return regId; + } + + public void setRegId(String regId) { + this.regId = regId; + } + + public Integer getSlaveId() { + return slaveId; + } + + public void setSlaveId(Integer slaveId) { + this.slaveId = slaveId; + } + + public Integer getIsReadonly() { + return isReadonly; + } + + public void setIsReadonly(Integer isReadonly) { + this.isReadonly = isReadonly; + } + + public Integer getOrder() { + return order; + } + + public void setOrder(Integer order) { + this.order = order; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getShadow() { + return shadow; + } + + public void setShadow(String shadow) { + this.shadow = shadow; + } + + public Integer getIsHistory() { + return isHistory; + } + + public void setIsHistory(Integer isHistory) { + this.isHistory = isHistory; + } + + public Integer getIsSharePerm() { + return isSharePerm; + } + + public void setIsSharePerm(Integer isSharePerm) { + this.isSharePerm = isSharePerm; + } + + public Integer getIsChart() { + return isChart; + } + + public void setIsChart(Integer isChart) { + this.isChart = isChart; + } + + public Integer getIsMonitor() { + return isMonitor; + } + + public void setIsMonitor(Integer isMonitor) { + this.isMonitor = isMonitor; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Datatype getDatatype() { + return datatype; + } + + public void setDatatype(Datatype datatype) { + this.datatype = datatype; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModelItemBase.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModelItemBase.java new file mode 100644 index 00000000..3ccc4103 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelItem/ThingsModelItemBase.java @@ -0,0 +1,88 @@ +package com.fastbee.iot.model.ThingsModelItem; + +import com.fastbee.common.annotation.Excel; + +public class ThingsModelItemBase +{ + /** 物模型唯一标识符 */ + private String id; + /** 物模型名称 */ + private String name; + /** 物模型值 */ + private String value; + /** 是否首页显示(0-否,1-是) */ + private Integer isChart; + /** 是否实时监测(0-否,1-是) */ + private Integer isMonitor; + /** 类型 1=属性,2=功能,3=事件 */ + private Integer type; + /** 数据类型 */ + private String dataType; + /** 影子值 */ + private String shadow; + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShadow() { + return shadow; + } + + public void setShadow(String shadow) { + this.shadow = shadow; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Integer getIsChart() { + return isChart; + } + + public void setIsChart(Integer isChart) { + this.isChart = isChart; + } + + public Integer getIsMonitor() { + return isMonitor; + } + + public void setIsMonitor(Integer isMonitor) { + this.isMonitor = isMonitor; + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelPerm.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelPerm.java new file mode 100644 index 00000000..341f5960 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModelPerm.java @@ -0,0 +1,42 @@ +package com.fastbee.iot.model; + +/** + * + * @author kerwincui + * @date 2023-01-14 + */ +public class ThingsModelPerm +{ + /** 物模型名称 */ + private String modelName; + + /** 标识符,产品下唯一 */ + private String identifier; + + /** 备注信息 */ + private String remark; + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/EventDto.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/EventDto.java new file mode 100644 index 00000000..7344819e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/EventDto.java @@ -0,0 +1,47 @@ +package com.fastbee.iot.model.ThingsModels; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +import java.util.List; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Data +public class EventDto { + /** + * 物模型唯一标识符 + */ + private String id; + /** + * 物模型名称 + */ + private String name; + /** + * 数据定义 + */ + private JSONObject datatype; + + /** + * 从机编号 + */ + private Integer SlaveId; + /** + * 计算公式 + */ + private String formula; + + private Integer isParams; + + private Integer isHistory; + + /** + * 从机编号 + */ + private Long tempSlaveId; + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/FunctionDto.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/FunctionDto.java new file mode 100644 index 00000000..f6ab696b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/FunctionDto.java @@ -0,0 +1,45 @@ +package com.fastbee.iot.model.ThingsModels; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Data +public class FunctionDto +{ + /** 物模型唯一标识符 */ + private String id; + /** 物模型名称 */ + private String name; + /** 是否首页显示(0-否,1-是) */ + private Integer isChart; + /** 是否只读 */ + private Integer isReadonly; + /** 是否历史存储 */ + private Integer isHistory; + /** 排序 */ + private Integer order; + /** 数据定义 */ + private JSONObject datatype; + + /** + * 从机编号 + */ + private Integer SlaveId; + /** + * 计算公式 + */ + private String formula; + + private Integer isParams; + + /** + * 从机编号 + */ + private Long tempSlaveId; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/PropertyDto.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/PropertyDto.java new file mode 100644 index 00000000..9c5b13e6 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/PropertyDto.java @@ -0,0 +1,61 @@ +package com.fastbee.iot.model.ThingsModels; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +import java.util.List; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Data +public class PropertyDto +{ + /** 物模型唯一标识符 */ + private String id; + /** 物模型名称 */ + private String name; + /** 是否图表展示(0-否,1-是) */ + private Integer isChart; + /** 是否历史存储(0-否,1-是) */ + private Integer isHistory; + /** 是否实时监测(0-否,1-是) */ + private Integer isMonitor; + /** 是否只读 */ + private Integer isReadonly; + /** 排序 */ + private Integer order; + /** 数据定义 */ + private JSONObject datatype; + /** + * 计算公式 + */ + private String formula; + + private Integer isParams; + /** + * 从机编号 + */ + private Integer tempSlaveId; + + private Integer type; + /** + * 读取寄存器数量 + */ + private Integer quantity; + /** + * 寄存器#从机 + */ + private String regId; + /** + * 功能码 + */ + private String code; + /** + * + */ + private String parseType; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsItems.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsItems.java new file mode 100644 index 00000000..a0a60ff3 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsItems.java @@ -0,0 +1,19 @@ +package com.fastbee.iot.model.ThingsModels; + +import lombok.Data; + +import java.util.List; + +/** + * @author gsb + * @date 2022/10/24 15:45 + */ +@Data +public class ThingsItems { + + private List ids; + + private Long productId; + + private Integer slaveId; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelShadow.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelShadow.java new file mode 100644 index 00000000..cd5f8dd2 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelShadow.java @@ -0,0 +1,47 @@ +package com.fastbee.iot.model.ThingsModels; + +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; + +import java.util.ArrayList; +import java.util.List; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ThingsModelShadow +{ + public ThingsModelShadow(){ + this.properties=new ArrayList<>(); + this.functions=new ArrayList<>(); + } + + public ThingsModelShadow(List properties, List functions){ + this.properties=properties; + this.functions=functions; + } + + /** 属性 */ + List properties; + + /** 功能 */ + List functions; + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public List getFunctions() { + return functions; + } + + public void setFunctions(List functions) { + this.functions = functions; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItem.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItem.java new file mode 100644 index 00000000..18737574 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItem.java @@ -0,0 +1,145 @@ +package com.fastbee.iot.model.ThingsModels; + +import com.fastbee.iot.model.ThingsModelItem.Datatype; + +/** + * 物模型值的项 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ThingsModelValueItem { + /** + * 物模型唯一标识符 + */ + private String id; + + /** + * 物模型值 + */ + private String value; + + /** + * 影子值 + **/ + private String shadow; + + /** + * 是否为监测值 + **/ + private int isMonitor; + + /** + * 是否为历史存储 + **/ + private int isHistory; + + /** + * 是否为图表展示 + **/ + private int isChart; + + /** + * 是否只读数据 + **/ + private int isReadonly; + + /** + * 物模型名称 + **/ + private String name; + + private Datatype datatype; + + private String ts; + + private Integer tempSlaveId; + + public Integer getTempSlaveId() { + return tempSlaveId; + } + + public void setTempSlaveId(Integer tempSlaveId) { + this.tempSlaveId = tempSlaveId; + } + + public int getIsHistory() { + return isHistory; + } + + public void setIsHistory(int isHistory) { + this.isHistory = isHistory; + } + + public int getIsChart() { + return isChart; + } + + public void setIsChart(int isChart) { + this.isChart = isChart; + } + + public int getIsReadonly() { + return isReadonly; + } + + public void setIsReadonly(int isReadonly) { + this.isReadonly = isReadonly; + } + + public Datatype getDatatype() { + return datatype; + } + + public void setDatatype(Datatype datatype) { + this.datatype = datatype; + } + + public int getIsMonitor() { + return isMonitor; + } + + public void setIsMonitor(int isMonitor) { + this.isMonitor = isMonitor; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getShadow() { + return shadow; + } + + public void setShadow(String shadow) { + this.shadow = shadow; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItemDto.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItemDto.java new file mode 100644 index 00000000..1e5bc530 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValueItemDto.java @@ -0,0 +1,196 @@ +package com.fastbee.iot.model.ThingsModels; + +import org.springframework.data.redis.connection.DataType; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 物模型 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ThingsModelValueItemDto +{ + /** 物模型唯一标识符 */ + private String id; + + /** 物模型名称 */ + private String name; + + /** 物模型值 */ + private String value; + + /** 是否首页显示(0-否,1-是) */ + private Integer isChart; + + /** 是否实时监测(0-否,1-是) */ + private Integer isMonitor; + + private DataType dataType; + + public Integer getIsChart() { + return isChart; + } + + public void setIsChart(Integer isChart) { + this.isChart = isChart; + } + + public Integer getIsMonitor() { + return isMonitor; + } + + public void setIsMonitor(Integer isMonitor) { + this.isMonitor = isMonitor; + } + + public DataType getDataType() { + return dataType; + } + + public void setDataType(DataType dataType) { + this.dataType = dataType; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static class DataType{ + private String type; + private String falseText; + private String trueText; + private Integer maxLength; + private String arrayType; + private String unit; + private BigDecimal min; + private BigDecimal max; + private BigDecimal step; + private List enumList; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getFalseText() { + return falseText; + } + + public void setFalseText(String falseText) { + this.falseText = falseText; + } + + public String getTrueText() { + return trueText; + } + + public void setTrueText(String trueText) { + this.trueText = trueText; + } + + public Integer getMaxLength() { + return maxLength; + } + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + public String getArrayType() { + return arrayType; + } + + public void setArrayType(String arrayType) { + this.arrayType = arrayType; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public BigDecimal getMin() { + return min; + } + + public void setMin(BigDecimal min) { + this.min = min; + } + + public BigDecimal getMax() { + return max; + } + + public void setMax(BigDecimal max) { + this.max = max; + } + + public BigDecimal getStep() { + return step; + } + + public void setStep(BigDecimal step) { + this.step = step; + } + + public List getEnumList() { + return enumList; + } + + public void setEnumList(List enumList) { + this.enumList = enumList; + } + } + + public static class EnumItem + { + private String text; + private String value; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValuesOutput.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValuesOutput.java new file mode 100644 index 00000000..32235a2f --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelValuesOutput.java @@ -0,0 +1,160 @@ +package com.fastbee.iot.model.ThingsModels; + +import com.fastbee.common.annotation.Excel; + +/** + * 设备输入物模型值参数 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ThingsModelValuesOutput +{ + /** 产品ID **/ + private Long productId; + + private String productName; + + private Long deviceId; + + private String deviceName; + + private int status; + + private int isShadow; + + /** 设备ID **/ + private String serialNumber; + + /** 用户ID */ + private Long userId; + + /** 用户昵称 */ + private String userName; + + /** 租户ID */ + private Long tenantId; + + /** 租户名称 */ + private String tenantName; + + /** 设备物模型值 **/ + private String thingsModelValue; + + private int isSimulate; + + /**子设备地址*/ + private Integer slaveId; + + public Integer getSlaveId() { + return slaveId; + } + + public void setSlaveId(Integer slaveId) { + this.slaveId = slaveId; + } + + public int getIsSimulate() { + return isSimulate; + } + + public void setIsSimulate(int isSimulate) { + this.isSimulate = isSimulate; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public int getIsShadow() { + return isShadow; + } + + public void setIsShadow(int isShadow) { + this.isShadow = isShadow; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public String getThingsModelValue() { + return thingsModelValue; + } + + public void setThingsModelValue(String thingsModelValue) { + this.thingsModelValue = thingsModelValue; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelsDto.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelsDto.java new file mode 100644 index 00000000..12cd168e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ThingsModelsDto.java @@ -0,0 +1,50 @@ +package com.fastbee.iot.model.ThingsModels; + +import java.util.ArrayList; +import java.util.List; + +/** + * 产品分类的Id和名称输出 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class ThingsModelsDto +{ + public ThingsModelsDto(){ + properties=new ArrayList<>(); + functions=new ArrayList<>(); + events=new ArrayList<>(); + } + + /** 属性 */ + private List properties; + /** 功能 */ + private List functions; + /** 事件 */ + private List events; + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public List getFunctions() { + return functions; + } + + public void setFunctions(List functions) { + this.functions = functions; + } + + public List getEvents() { + return events; + } + + public void setEvents(List events) { + this.events = events; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ValueItem.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ValueItem.java new file mode 100644 index 00000000..3a2dac51 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/ThingsModels/ValueItem.java @@ -0,0 +1,62 @@ +package com.fastbee.iot.model.ThingsModels; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * redis缓存物模型值 + * @author gsb + * @date 2023/6/3 13:48 + */ +@Data +@NoArgsConstructor +public class ValueItem { + + public ValueItem(String id, Integer slaveId, String regArr) { + this.id = id; + this.slaveId = slaveId; + this.regArr = regArr; + } + + /** + * 标识符 + */ + private String id; + + /** + * 物模型值 + */ + private String value; + + /** + * 影子值 + **/ + private String shadow; + + /** + * 物模型名称 + **/ + private String name; + + /** + * 上报时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date ts; + + /** + * 从机编号 + */ + private Integer slaveId; + + /** + * 寄存器地址 + */ + private String regArr; + + private String remark; + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/TriggerParameter.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/TriggerParameter.java new file mode 100644 index 00000000..f6047255 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/TriggerParameter.java @@ -0,0 +1,92 @@ +package com.fastbee.iot.model; + +import com.fastbee.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.annotations.Param; + +/** + * TriggerParameter + * + * @author kerwincui + * @date 2021-12-16 + */ +public class TriggerParameter +{ + /** 物模型标识符数组 */ + private String[] ids; + + /** 产品ID */ + private Long productId; + + /** 设备ID */ + private Long deviceId; + + /** 设备编号 */ + private String serialNumber; + + /** 触发源(1=设备触发,2=定时触发) */ + private Integer source; + + /** 类型:1=属性,2=功能,3=事件,4=设备升级,5=设备上线,6=设备下线**/ + private Integer type; + + /**场景状态 (1-启动,2-停止) **/ + private Integer status; + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String[] getIds() { + return ids; + } + + public void setIds(String[] ids) { + this.ids = ids; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/UserIdDeviceIdModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/UserIdDeviceIdModel.java new file mode 100644 index 00000000..c9f05d1b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/UserIdDeviceIdModel.java @@ -0,0 +1,36 @@ +package com.fastbee.iot.model; + +/** + * 用户ID和设备ID模型 + * + * @author kerwincui + * @date 2021-12-16 + */ +public class UserIdDeviceIdModel +{ + private Long userId; + + private Long deviceId; + + public UserIdDeviceIdModel(Long userId, Long deviceId){ + this.userId=userId; + this.deviceId=deviceId; + } + + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttMetrics.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttMetrics.java new file mode 100644 index 00000000..bd599601 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttMetrics.java @@ -0,0 +1,29 @@ +package com.fastbee.iot.model.dashBoard; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author bill + */ +@Data +@Builder +public class DashMqttMetrics { + + /**接收总数*/ + private Integer receive_total; + /**发送总数*/ + private Integer send_total; + /**认证总数*/ + private Integer auth_total; + /**连接总数*/ + private Integer connect_total; + /**订阅总数*/ + private Integer subscribe_total; + /**今日接收总数*/ + private Integer today_received; + /**今日发送总数*/ + private Integer today_send; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttStat.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttStat.java new file mode 100644 index 00000000..069bc424 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dashBoard/DashMqttStat.java @@ -0,0 +1,31 @@ +package com.fastbee.iot.model.dashBoard; + +import lombok.Builder; +import lombok.Data; + +/** + * @author gsb + * @date 2023/3/27 17:05 + */ +@Data +@Builder +public class DashMqttStat { + + /**当前连接数*/ + private Integer connection_count; + /**连接总数*/ + private Integer connection_total; + /**会话数量*/ + private Integer session_count; + /**会话总数*/ + private Integer session_total; + /**当前订阅主题总数*/ + private Integer subscription_count; + /**总订阅总数*/ + private Integer subscription_total; + /**当前保留消息*/ + private Integer retain_count; + /**总保留信息数*/ + private Integer retain_total; + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dto/DeviceRtDto.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dto/DeviceRtDto.java new file mode 100644 index 00000000..65d820ca --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/dto/DeviceRtDto.java @@ -0,0 +1,29 @@ +package com.fastbee.iot.model.dto; + +import lombok.Data; + +/** + * 设备实时数据dto + * @author gsb + * @date 2023/2/1 15:55 + */ +@Data +public class DeviceRtDto { + + /**物模型名称*/ + private String modelName; + /**值*/ + private String value; + /**标识符*/ + private String identifier; + /**数据定义*/ + private String specs; + /**寄存器地址*/ + private String regAddr; + /**数据类型*/ + private String dataType; + /**更新时间*/ + private String platformTime; + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/AuthRequestWrap.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/AuthRequestWrap.java new file mode 100644 index 00000000..869f8443 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/AuthRequestWrap.java @@ -0,0 +1,26 @@ +package com.fastbee.iot.model.login; + +import com.fastbee.iot.domain.SocialPlatform; +import me.zhyd.oauth.request.AuthRequest; + +public class AuthRequestWrap { + private AuthRequest authRequest; + + private SocialPlatform socialPlatform; + + public AuthRequest getAuthRequest() { + return authRequest; + } + + public void setAuthRequest(AuthRequest authRequest) { + this.authRequest = authRequest; + } + + public SocialPlatform getSocialPlatform() { + return socialPlatform; + } + + public void setSocialPlatform(SocialPlatform socialPlatform) { + this.socialPlatform = socialPlatform; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/BindIdValue.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/BindIdValue.java new file mode 100644 index 00000000..8d8ad55d --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/BindIdValue.java @@ -0,0 +1,23 @@ +package com.fastbee.iot.model.login; + +public class BindIdValue { + + private String uuid; + private String source; + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/LoginIdValue.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/LoginIdValue.java new file mode 100644 index 00000000..4dc23a57 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/LoginIdValue.java @@ -0,0 +1,22 @@ +package com.fastbee.iot.model.login; + +public class LoginIdValue { + String username; + String password; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/WeChatLoginQrRes.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/WeChatLoginQrRes.java new file mode 100644 index 00000000..91f9bcc7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/login/WeChatLoginQrRes.java @@ -0,0 +1,19 @@ +package com.fastbee.iot.model.login; + +import lombok.Data; + +/** + * @author fastb + * @date 2023-09-04 11:03 + */ +@Data +public class WeChatLoginQrRes { + + private String appid; + + private String scope; + + private String redirectUri; + + private String state; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceSlavePoint.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceSlavePoint.java new file mode 100644 index 00000000..2922fc4e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceSlavePoint.java @@ -0,0 +1,26 @@ +package com.fastbee.iot.model.varTemp; + +import com.fastbee.common.core.iot.response.IdentityAndName; +import com.fastbee.iot.domain.ThingsModel; +import lombok.Data; + +import java.util.List; + +/** + * @author gsb + * @date 2022/12/14 14:56 + */ +@Data +public class DeviceSlavePoint { + + /**从机编号*/ + private Integer slaveId; + /**从机对应采集点数据*/ + private List pointList; + /**轮询时间*/ + private Long timer; + /**批量读取的个数*/ + private Integer packetLength; + + private Integer code; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceTemp.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceTemp.java new file mode 100644 index 00000000..60750c96 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/DeviceTemp.java @@ -0,0 +1,19 @@ +package com.fastbee.iot.model.varTemp; + +import lombok.Data; + +import java.util.List; + +/** + * @author gsb + * @date 2022/12/14 15:38 + */ +@Data +public class DeviceTemp { + + private Long productId; + + private String serialNumber; + + private List pointList; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/EnumClass.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/EnumClass.java new file mode 100644 index 00000000..f64a7b30 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/EnumClass.java @@ -0,0 +1,14 @@ +package com.fastbee.iot.model.varTemp; + +import lombok.Data; + +/** + * @author gsb + * @date 2023/1/15 10:42 + */ +@Data +public class EnumClass { + + private String text; + private String value; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SlaveIdAndId.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SlaveIdAndId.java new file mode 100644 index 00000000..77c7931e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SlaveIdAndId.java @@ -0,0 +1,14 @@ +package com.fastbee.iot.model.varTemp; + +import lombok.Data; + +/** + * @author gsb + * @date 2023/2/4 13:52 + */ +@Data +public class SlaveIdAndId { + + private Integer slaveId; + private Long id; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SyncModel.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SyncModel.java new file mode 100644 index 00000000..a60b3e79 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/varTemp/SyncModel.java @@ -0,0 +1,15 @@ +package com.fastbee.iot.model.varTemp; + +import lombok.Data; + +import java.util.List; + +/** + * @author bill + */ +@Data +public class SyncModel { + + private List productIds; + private Long templateId; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/AuthorizationServerConfig.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/AuthorizationServerConfig.java new file mode 100644 index 00000000..e001f335 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/AuthorizationServerConfig.java @@ -0,0 +1,119 @@ +package com.fastbee.iot.oauth; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.OAuth2RequestFactory; +import org.springframework.security.oauth2.provider.approval.ApprovalStore; +import org.springframework.security.oauth2.provider.approval.JdbcApprovalStore; +import org.springframework.security.oauth2.provider.approval.UserApprovalHandler; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices; +import org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint; +import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JdbcTokenStore; + +import javax.sql.DataSource; + +/** + * 授权服务器配置,配置客户端id,密钥和令牌的过期时间 + */ +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + @Autowired + private DataSource dataSource; + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private UserDetailsService userDetailsService; + + /** + * 用来配置令牌端点(Token Endpoint)的安全约束 + * @param security + * @throws Exception + */ + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security.allowFormAuthenticationForClients() + .authenticationEntryPoint(new OAuth2AuthenticationEntryPoint()); + } + + /** + * 用来配置客户端详情服务 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + + clients.withClientDetails(getClientDetailsService()); + } + + /** + * 用来配置授权(authorization)以及令牌(token)的访问端点和令牌服务(token services)。 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + // 查询用户、授权、分组,可以被重写 + endpoints.userDetailsService(userDetailsService) + // 审批客户端的授权 + .userApprovalHandler(userApprovalHandler()) + // 授权审批 + .approvalStore(approvalStore()) + // 获取授权码 + .authorizationCodeServices(new JdbcAuthorizationCodeServices(dataSource)) + // 验证token + .authenticationManager(authenticationManager) + // 查询、保存、刷新token + .tokenStore(this.getJdbcTokenStore()); + } + + @Bean + public ApprovalStore approvalStore() { + return new JdbcApprovalStore(dataSource); + } + + @Bean + public UserApprovalHandler userApprovalHandler() { + return new SpeakerApprovalHandler(getClientDetailsService(), approvalStore(), oAuth2RequestFactory()); + } + + @Bean + public JdbcClientDetailsService getClientDetailsService() { + JdbcClientDetailsService jdbcClientDetailsService = new JdbcClientDetailsService(dataSource); + jdbcClientDetailsService.setPasswordEncoder(passwordEncoder()); + return jdbcClientDetailsService; + } + + @Bean + public OAuth2RequestFactory oAuth2RequestFactory() { + return new DefaultOAuth2RequestFactory(getClientDetailsService()); + } + @Bean + public TokenStore getJdbcTokenStore(){ + TokenStore tokenStore = new JdbcTokenStore(dataSource); + return tokenStore; + } + + + + public BCryptPasswordEncoder passwordEncoder(){ + return new BCryptPasswordEncoder(); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/ResourceServerConfig.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/ResourceServerConfig.java new file mode 100644 index 00000000..bb4429d5 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/ResourceServerConfig.java @@ -0,0 +1,50 @@ +package com.fastbee.iot.oauth; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationManager; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JdbcTokenStore; + +import javax.sql.DataSource; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private DataSource dataSource; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + TokenStore tokenStore = jdbcTokenStore(); + OAuth2AuthenticationManager auth2AuthenticationManager= new OAuth2AuthenticationManager(); + resources.authenticationManager(auth2AuthenticationManager); + resources.resourceId("speaker-service").tokenStore(tokenStore).stateless(true); + } + + @Override + public void configure(HttpSecurity http) throws Exception { + // 限制资源服务器只接管匹配的资源 + http.requestMatchers().antMatchers("/oauth/speaker/**") + .and() + //授权的请求 + .authorizeRequests() + .anyRequest().authenticated() + //关闭跨站请求防护 + .and() + .csrf().disable(); + } + + public TokenStore jdbcTokenStore(){ + TokenStore tokenStore = new JdbcTokenStore(dataSource); + return tokenStore; + } + +} \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/SpeakerApprovalHandler.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/SpeakerApprovalHandler.java new file mode 100644 index 00000000..61fafb57 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/SpeakerApprovalHandler.java @@ -0,0 +1,83 @@ +package com.fastbee.iot.oauth; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.common.util.OAuth2Utils; +import org.springframework.security.oauth2.provider.AuthorizationRequest; +import org.springframework.security.oauth2.provider.OAuth2RequestFactory; +import org.springframework.security.oauth2.provider.approval.Approval; +import org.springframework.security.oauth2.provider.approval.ApprovalStore; +import org.springframework.security.oauth2.provider.approval.ApprovalStoreUserApprovalHandler; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; + +import java.util.*; + +/** + * kerwincui + */ +public class SpeakerApprovalHandler extends ApprovalStoreUserApprovalHandler { + + private int approvalExpirySeconds = -1; + + @Autowired + private ApprovalStore approvalStore; + + public SpeakerApprovalHandler(JdbcClientDetailsService clientDetailsService, ApprovalStore approvalStore, OAuth2RequestFactory oAuth2RequestFactory) { + this.setApprovalStore(approvalStore); + this.setClientDetailsService(clientDetailsService); + this.setRequestFactory(oAuth2RequestFactory); + } + + @Override + public AuthorizationRequest updateAfterApproval(AuthorizationRequest authorizationRequest, Authentication userAuthentication) { + // 获取授权过的范围 + Set requestedScopes = authorizationRequest.getScope(); + Set approvedScopes = new HashSet(); + Set approvals = new HashSet(); + Date expiry = computeExpiry(); + + // 存储授权或拒绝的范围 + Map approvalParameters = authorizationRequest.getApprovalParameters(); + for (String requestedScope : requestedScopes) { + String approvalParameter = OAuth2Utils.SCOPE_PREFIX + requestedScope; + String value = approvalParameters.get(approvalParameter); + value = value == null ? "" : value.toLowerCase(); + if ("true".equals(value) || value.startsWith("approve")||value.equals("on")) { + approvedScopes.add(requestedScope); + approvals.add(new Approval(userAuthentication.getName(), authorizationRequest.getClientId(), + requestedScope, expiry, Approval.ApprovalStatus.APPROVED)); + } + else { + approvals.add(new Approval(userAuthentication.getName(), authorizationRequest.getClientId(), + requestedScope, expiry, Approval.ApprovalStatus.DENIED)); + } + } + approvalStore.addApprovals(approvals); + + boolean approved; + authorizationRequest.setScope(approvedScopes); + if (approvedScopes.isEmpty() && !requestedScopes.isEmpty()) { + approved = false; + } + else { + approved = true; + } + authorizationRequest.setApproved(approved); + return authorizationRequest; + } + + private Date computeExpiry() { + Calendar expiresAt = Calendar.getInstance(); + // 默认一个月 + if (approvalExpirySeconds == -1) { + expiresAt.add(Calendar.MONTH, 1); + } + else { + expiresAt.add(Calendar.SECOND, approvalExpirySeconds); + } + return expiresAt.getTime(); + } + +} + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/ConfirmAccessController.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/ConfirmAccessController.java new file mode 100644 index 00000000..ea3d94fd --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/ConfirmAccessController.java @@ -0,0 +1,49 @@ +package com.fastbee.iot.oauth.api; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.oauth2.common.util.OAuth2Utils; +import org.springframework.security.oauth2.provider.AuthorizationRequest; +import org.springframework.security.oauth2.provider.ClientDetails; +import org.springframework.security.oauth2.provider.approval.Approval; +import org.springframework.security.oauth2.provider.approval.ApprovalStore; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import java.security.Principal; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * kerwincui + */ +@Controller +@SessionAttributes("authorizationRequest") +public class ConfirmAccessController { + @Autowired + private JdbcClientDetailsService clientDetailsService; + @Autowired + private ApprovalStore approvalStore; + + @RequestMapping("/oauth/confirm_access") + public String getAccessConfirmation(Map model, Principal principal ) { + AuthorizationRequest clientAuth = (AuthorizationRequest) model.remove("authorizationRequest"); + ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId()); + + Map scopes = new LinkedHashMap(); + for (String scope : clientAuth.getScope()) { + scopes.put(OAuth2Utils.SCOPE_PREFIX + scope, "false"); + } + for (Approval approval : approvalStore.getApprovals(principal.getName(), client.getClientId())) { + if (clientAuth.getScope().contains(approval.getScope())) { + scopes.put(OAuth2Utils.SCOPE_PREFIX + approval.getScope(), + approval.getStatus() == Approval.ApprovalStatus.APPROVED ? "true" : "false"); + } + } + model.put("auth_request", clientAuth); + model.put("client", client); + model.put("scopes", scopes); + return "oauth/access_confirmation"; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/LoginController.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/LoginController.java new file mode 100644 index 00000000..d8dfe0b7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/LoginController.java @@ -0,0 +1,55 @@ +package com.fastbee.iot.oauth.api; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.LoginBody; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.framework.web.service.SysLoginService; +import com.fastbee.framework.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +@Controller +public class LoginController { + + + @Autowired + private TokenStore tokenStore; + + @Autowired + private SysLoginService loginService; + + @Autowired + private TokenService tokenService; + + @RequestMapping("/oauth/login") + public String login() { + return "oauth/login"; + } + + @RequestMapping("/oauth/index") + public String index() { + return "oauth/index"; + } + + @GetMapping("/oauth/logout") + @ResponseBody + public String logout(@RequestHeader String Authorization) { + if (!Authorization.isEmpty()){ + String token=Authorization.split(" ")[1]; + OAuth2AccessToken auth2AccessToken = tokenStore.readAccessToken(token); + tokenStore.removeAccessToken(auth2AccessToken); + return "SUCCESS"; + }else{ + return "FAIL"; + } + + } + +} \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/SpeakerController.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/SpeakerController.java new file mode 100644 index 00000000..f1f1dc70 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/oauth/api/SpeakerController.java @@ -0,0 +1,33 @@ +package com.fastbee.iot.oauth.api; + +import com.alibaba.fastjson2.JSONObject; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * kerwincui + */ +@RestController +public class SpeakerController { + @GetMapping("/oauth/speaker/get") + public JSONObject getSpeaker() { +// Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + JSONObject Json = new JSONObject(); + Json.put("1", "1"); + Json.put("2", "2"); + Json.put("3", "3"); + System.out.println("调用了接口get"); + return Json; + } + @PostMapping("/oauth/speaker/post") + public JSONObject postSpeaker() { +// Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + JSONObject bookJson = new JSONObject(); + bookJson.put("1", "1"); + System.out.println("调用了接口post"); + return bookJson; + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IAuthRequestFactory.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IAuthRequestFactory.java new file mode 100644 index 00000000..d9ac0ce7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IAuthRequestFactory.java @@ -0,0 +1,14 @@ +package com.fastbee.iot.service; + +import com.fastbee.iot.model.login.AuthRequestWrap; + +/** + * AuthRequest简单工程类接口 + * + * @author json + * @date 2022-04-12 + */ +public interface IAuthRequestFactory { + + AuthRequestWrap getAuthRequest(String source); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ICategoryService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ICategoryService.java new file mode 100644 index 00000000..22e23d2e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ICategoryService.java @@ -0,0 +1,72 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.iot.domain.Category; +import com.fastbee.iot.model.IdAndName; + +import java.util.List; + +/** + * 产品分类Service接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface ICategoryService +{ + /** + * 查询产品分类 + * + * @param categoryId 产品分类主键 + * @return 产品分类 + */ + public Category selectCategoryByCategoryId(Long categoryId); + + /** + * 查询产品分类列表 + * + * @param category 产品分类 + * @return 产品分类集合 + */ + public List selectCategoryList(Category category); + + /** + * 查询产品简短分类列表 + * + * @return 产品分类集合 + */ + public List selectCategoryShortList(); + + /** + * 新增产品分类 + * + * @param category 产品分类 + * @return 结果 + */ + public int insertCategory(Category category); + + /** + * 修改产品分类 + * + * @param category 产品分类 + * @return 结果 + */ + public int updateCategory(Category category); + + /** + * 批量删除产品分类 + * + * @param categoryIds 需要删除的产品分类主键集合 + * @return 结果 + */ + public AjaxResult deleteCategoryByCategoryIds(Long[] categoryIds); + + /** + * 删除产品分类信息 + * + * @param categoryId 产品分类主键 + * @return 结果 + */ + public int deleteCategoryByCategoryId(Long categoryId); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceJobService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceJobService.java new file mode 100644 index 00000000..7d6f4e33 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceJobService.java @@ -0,0 +1,127 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.exception.job.TaskException; +import com.fastbee.iot.domain.DeviceJob; +import org.quartz.SchedulerException; + +import java.util.List; + +/** + * 定时任务调度信息信息 服务层 + * + * @author kerwincui + */ +public interface IDeviceJobService +{ + /** + * 获取quartz调度器的计划任务 + * + * @param job 调度信息 + * @return 调度任务集合 + */ + public List selectJobList(DeviceJob job); + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + public DeviceJob selectJobById(Long jobId); + + /** + * 暂停任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int pauseJob(DeviceJob job) throws SchedulerException; + + /** + * 恢复任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int resumeJob(DeviceJob job) throws SchedulerException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(DeviceJob job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 根据设备Ids批量删除调度信息 + * + * @param deviceIds 需要删除数据的设备Ids + * @return 结果 + */ + public void deleteJobByDeviceIds(Long[] deviceIds) throws SchedulerException; + + /** + * 根据告警Ids批量删除调度信息 + * + * @param alertIds 需要删除数据的告警Ids + * @return 结果 + */ + public void deleteJobByAlertIds(Long[] alertIds) throws SchedulerException; + + /** + * 根据场景Ids批量删除调度信息 + * + * @param sceneIds 需要删除数据的设备Ids + * @return 结果 + */ + public void deleteJobBySceneIds(Long[] sceneIds) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(DeviceJob job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public void run(DeviceJob job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(DeviceJob job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(DeviceJob job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceLogService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceLogService.java new file mode 100644 index 00000000..7310cc80 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceLogService.java @@ -0,0 +1,27 @@ +package com.fastbee.iot.service; + +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.model.HistoryModel; +import com.fastbee.iot.model.MonitorModel; + +import java.util.List; +import java.util.Map; + +/** + * 设备日志Service接口 + * + * @author kerwincui + * @date 2022-01-13 + */ +public interface IDeviceLogService +{ + + /** + * 查询设备监测数据 + * + * @param deviceLog 设备日志 + * @return 设备日志集合 + */ + public List selectMonitorList(DeviceLog deviceLog); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceRuntimeService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceRuntimeService.java new file mode 100644 index 00000000..efb50585 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceRuntimeService.java @@ -0,0 +1,33 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.enums.ThingsModelType; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.domain.FunctionLog; + +import java.util.List; + +/** + * 设备运行时数据 + * + * @author gsb + * @date 2023/2/1 15:08 + */ +public interface IDeviceRuntimeService { + + /** + * 根据设备编号查询设备实时运行状态 + * + * @param serialNumber 设备编号 + * @param type 物模型类型 + * @return 设备实时数据 + */ + public List runtimeBySerialNumber(String serialNumber, ThingsModelType type,Long productId,Integer slaveId); + + /** + * 根据设备编号查询设备服务调用日志情况 + * @param serialNumber 设备编号 + * @return 服务下发日志 + */ + public List runtimeReply(String serialNumber); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java new file mode 100644 index 00000000..cb24a156 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java @@ -0,0 +1,263 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.model.*; +import com.fastbee.iot.model.ThingsModels.ThingsModelShadow; +import com.fastbee.iot.model.ThingsModels.ThingsModelValueItem; +import com.fastbee.common.core.thingsModel.ThingsModelValuesInput; +import org.quartz.SchedulerException; + +import java.util.List; +import java.util.Map; + +/** + * 设备Service接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface IDeviceService +{ + /** + * 查询设备 + * + * @param deviceId 设备主键 + * @return 设备 + */ + public Device selectDeviceByDeviceId(Long deviceId); + + /** + * 查询设备统计信息 + * + * @return 设备 + */ + public DeviceStatistic selectDeviceStatistic(); + + /** + * 根据设备编号查询设备 + * + * @param serialNumber 设备主键 + * @return 设备 + */ + public Device selectDeviceBySerialNumber(String serialNumber); + + /** + * 根据设备编号查询简洁设备 + * + * @param serialNumber 设备主键 + * @return 设备 + */ + public Device selectShortDeviceBySerialNumber(String serialNumber); + + /** + * 根据设备编号查询设备认证信息 + * + * @param model 设备编号和产品ID + * @return 设备 + */ + public ProductAuthenticateModel selectProductAuthenticate(AuthenticateInputModel model); + + /** + * 查询设备和运行状态 + * + * @param deviceId 设备主键 + * @return 设备 + */ + public DeviceShortOutput selectDeviceRunningStatusByDeviceId(Long deviceId,Integer slaveId); + + /** + * 上报设备的物模型 + * @param input + * @return + */ + public List reportDeviceThingsModelValue(ThingsModelValuesInput input, int type, boolean isShadow); + + /** + * 查询设备列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectDeviceList(Device device); + + /** + * 查询未分配授权码设备列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectUnAuthDeviceList(Device device); + + /** + * 查询分组可添加设备分页列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectDeviceListByGroup(Device device); + + /** + * 查询所有设备简短列表 + * + * @return 设备 + */ + public List selectAllDeviceShortList(); + + /** + * 查询设备简短列表 + * + * @param device 设备 + * @return 设备集合 + */ + public List selectDeviceShortList(Device device); + + /** + * 新增设备 + * + * @param device 设备 + * @return 结果 + */ + public Device insertDevice(Device device); + + /** + * 设备关联用户 + * + * @param deviceRelateUserInput 设备 + * @return 结果 + */ + public AjaxResult deviceRelateUser(DeviceRelateUserInput deviceRelateUserInput); + + /** + * 设备认证后自动添加设备 + * + * @return 结果 + */ + public int insertDeviceAuto(String serialNumber,Long userId,Long productId); + + /** + * 获取设备设置的影子 + * @param device + * @return + */ + public ThingsModelShadow getDeviceShadowThingsModel(Device device); + + /** + * 修改设备 + * + * @param device 设备 + * @return 结果 + */ + public AjaxResult updateDevice(Device device); + + /** + * 更新设备状态和定位 + * @param device 设备 + * @return 结果 + */ + public int updateDeviceStatusAndLocation(Device device,String ipAddress); + + /** + * 更新设备状态 + * @param device 设备 + * @return 结果 + */ + public int updateDeviceStatus(Device device); + + /** + * 更新固件版本 + * @param device + * @return + */ + public int updateDeviceFirmwareVersion(Device device); + + /** + * 上报设备信息 + * @param device 设备 + * @return 结果 + */ + public int reportDevice(Device device,Device deviceentity); + + /** + * 删除设备 + * + * @param deviceId 需要删除的设备主键集合 + * @return 结果 + */ + public int deleteDeviceByDeviceId(Long deviceId) throws SchedulerException; + + /** + * 根据网关编号删除子设备 + * @param gwCode + */ + public void deleteSubDevice(String gwCode); + + /** + * 缓存设备状态到redis + * + * @return + */ + public List cacheDeviceStatus(Long productId, String serialNumber); + + /** + * 生成设备唯一编号 + * @return 结果 + */ + public String generationDeviceNum(Integer type); + + /** + * 重置设备状态 + * @return 结果 + */ + public int resetDeviceStatus(String deviceNum); + + /** + * 根据设备编号查询协议编码 + * @param serialNumber 设备编号 + * @return + */ + public Map selectProtocolBySerialNumber(String serialNumber); + + /** + * 查询产品下所有设备,返回设备编号 + * @param productId 产品id + * @return + */ + public List selectDevicesByProductId(Long productId,Integer hasSub); + + /** + * 查询子设备总数 + * @param gwDevCode 网关编号 + * @return 数量 + */ + public Integer getSubDeviceCount(String gwDevCode); + + /** + * 批量更新设备状态 + * @param serialNumbers 设备ids + * @param status 状态 + */ + public void batchChangeStatus(List serialNumbers , DeviceStatus status); + + /** + * 查询在线的modbus网关设备 + * @return + */ + public List selectOnlineModbusDevices(); + + /** + * 根据设备编号查询设备信息 -不带缓存物模型值 + * @param serialNumber + * @return + */ + public Device selectDeviceNoModel(String serialNumber); + + /** + * 获取设备MQTT连接参数 + * @param deviceId 设备id + * @return + */ + public DeviceMqttConnectVO getMqttConnectData(Long deviceId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceUserService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceUserService.java new file mode 100644 index 00000000..5eb9ccf9 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceUserService.java @@ -0,0 +1,88 @@ +package com.fastbee.iot.service; + +import java.util.List; + +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.iot.domain.DeviceUser; + +/** + * 设备用户Service接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface IDeviceUserService +{ + /** + * 查询设备用户 + * + * @param deviceId 设备用户主键 + * @return 设备用户 + */ + public List selectDeviceUserByDeviceId(Long deviceId); + + /** + * 查询设备用户列表 + * + * @param deviceUser 设备用户 + * @return 设备用户集合 + */ + public List selectDeviceUserList(DeviceUser deviceUser); + + /** + * 查询分享设备用户 + * + * @param deviceUser 设备用户 + * @return 设备用户集合 + */ + public SysUser selectShareUser(DeviceUser deviceUser); + + /** + * 新增设备用户 + * + * @param deviceUser 设备用户 + * @return 结果 + */ + public int insertDeviceUser(DeviceUser deviceUser); + + /** + * 修改设备用户 + * + * @param deviceUser 设备用户 + * @return 结果 + */ + public int updateDeviceUser(DeviceUser deviceUser); + + /** + * 批量删除设备用户 + * + * @param deviceIds 需要删除的设备用户主键集合 + * @return 结果 + */ + public int deleteDeviceUserByDeviceIds(Long[] deviceIds); + + /** + * 删除设备用户信息 + * + * @param deviceId 设备用户主键 + * @return 结果 + */ + public int deleteDeviceUserByDeviceId(Long deviceId); + + /** + * 批量添加设备用户 + * @param deviceUsers 设备用户 + * @return 结果 + */ + public int insertDeviceUserList(List deviceUsers); + + /** + * 查询设备用户 + * + * @param deviceId 设备用户主键 + * @return 设备用户 + */ + public DeviceUser selectDeviceUserByDeviceIdAndUserId(Long deviceId, Long userId); + + public int deleteDeviceUser(DeviceUser deviceUser); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IEventLogService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IEventLogService.java new file mode 100644 index 00000000..3ee84126 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IEventLogService.java @@ -0,0 +1,76 @@ +package com.fastbee.iot.service; + +import com.fastbee.iot.domain.EventLog; + +import java.util.List; + +/** + * 事件日志Service接口 + * + * @author kerwincui + * @date 2023-03-28 + */ +public interface IEventLogService +{ + /** + * 查询事件日志 + * + * @param logId 事件日志主键 + * @return 事件日志 + */ + public EventLog selectEventLogByLogId(Long logId); + + /** + * 查询事件日志列表 + * + * @param eventLog 事件日志 + * @return 事件日志集合 + */ + public List selectEventLogList(EventLog eventLog); + + /** + * 新增事件日志 + * + * @param eventLog 事件日志 + * @return 结果 + */ + public int insertEventLog(EventLog eventLog); + + /** + * 批量存储事件日志 + * @param list + */ + public void insertBatch(List list); + + /** + * 修改事件日志 + * + * @param eventLog 事件日志 + * @return 结果 + */ + public int updateEventLog(EventLog eventLog); + + /** + * 批量删除事件日志 + * + * @param logIds 需要删除的事件日志主键集合 + * @return 结果 + */ + public int deleteEventLogByLogIds(Long[] logIds); + + /** + * 删除事件日志信息 + * + * @param logId 事件日志主键 + * @return 结果 + */ + public int deleteEventLogByLogId(Long logId); + + /** + * 通过设备ID删除设备事件日志 + * + * @param serialNumber 设备编号 + * @return 结果 + */ + public int deleteEventLogByDeviceNumber(String serialNumber); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IFunctionLogService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IFunctionLogService.java new file mode 100644 index 00000000..d701d21d --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IFunctionLogService.java @@ -0,0 +1,87 @@ +package com.fastbee.iot.service; + +import java.util.List; +import com.fastbee.iot.domain.FunctionLog; + +/** + * 设备服务下发日志Service接口 + * + * @author kerwincui + * @date 2022-10-22 + */ +public interface IFunctionLogService +{ + /** + * 查询设备服务下发日志 + * + * @param id 设备服务下发日志主键 + * @return 设备服务下发日志 + */ + public FunctionLog selectFunctionLogById(Long id); + + /** + * 查询设备服务下发日志列表 + * + * @param functionLog 设备服务下发日志 + * @return 设备服务下发日志集合 + */ + public List selectFunctionLogList(FunctionLog functionLog); + + /** + * 新增设备服务下发日志 + * + * @param functionLog 设备服务下发日志 + * @return 结果 + */ + public int insertFunctionLog(FunctionLog functionLog); + + /** + * 批量插入数据 + * @param list + */ + public void insertBatch(List list); + + /** + * 修改设备服务下发日志 + * + * @param functionLog 设备服务下发日志 + * @return 结果 + */ + public int updateFunctionLog(FunctionLog functionLog); + + /** + * 批量删除设备服务下发日志 + * + * @param ids 需要删除的设备服务下发日志主键集合 + * @return 结果 + */ + public int deleteFunctionLogByIds(Long[] ids); + + /** + * 删除设备服务下发日志信息 + * + * @param id 设备服务下发日志主键 + * @return 结果 + */ + public int deleteFunctionLogById(Long id); + + /** + * 根据设备编号删除设备服务下发日志信息 + * + * @param serialNumber 设备编号 + * @return 结果 + */ + public int deleteFunctionLogByDeviceNumber(String serialNumber); + + /** + * 批量更新日志状态值 + * @param log 参数 + */ + public void updateFuncLogBatch(FunctionLog log); + + /** + * 根据消息id更新指令下发状态 + * @param log + */ + public void updateByMessageId(FunctionLog log); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IGroupService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IGroupService.java new file mode 100644 index 00000000..bb512f1b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IGroupService.java @@ -0,0 +1,76 @@ +package com.fastbee.iot.service; + +import com.fastbee.iot.domain.Group; +import com.fastbee.iot.model.DeviceGroupInput; + +import java.util.List; + +/** + * 设备分组Service接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface IGroupService +{ + /** + * 查询设备分组 + * + * @param groupId 设备分组主键 + * @return 设备分组 + */ + public Group selectGroupByGroupId(Long groupId); + + /** + * 通过分组ID查询关联的设备ID数组 + * @param groupId + * @return + */ + public Long[] selectDeviceIdsByGroupId(Long groupId); + + /** + * 查询设备分组列表 + * + * @param group 设备分组 + * @return 设备分组集合 + */ + public List selectGroupList(Group group); + + /** + * 新增设备分组 + * + * @param group 设备分组 + * @return 结果 + */ + public int insertGroup(Group group); + + /** + * 分组下批量添加设备分组 + * @return + */ + public int updateDeviceGroups(DeviceGroupInput input); + + /** + * 修改设备分组 + * + * @param group 设备分组 + * @return 结果 + */ + public int updateGroup(Group group); + + /** + * 批量删除分组 + * + * @param groupIds 需要删除的设备分组主键集合 + * @return 结果 + */ + public int deleteGroupByGroupIds(Long[] groupIds); + + /** + * 删除分组信息 + * + * @param groupId 设备分组主键 + * @return 结果 + */ + public int deleteGroupByGroupId(Long groupId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsCategoryService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsCategoryService.java new file mode 100644 index 00000000..f0113e35 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsCategoryService.java @@ -0,0 +1,71 @@ +package com.fastbee.iot.service; + +import java.util.List; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.iot.domain.NewsCategory; +import com.fastbee.iot.model.IdAndName; + +/** + * 新闻分类Service接口 + * + * @author kerwincui + * @date 2022-04-09 + */ +public interface INewsCategoryService +{ + /** + * 查询新闻分类 + * + * @param categoryId 新闻分类主键 + * @return 新闻分类 + */ + public NewsCategory selectNewsCategoryByCategoryId(Long categoryId); + + /** + * 查询新闻分类列表 + * + * @param newsCategory 新闻分类 + * @return 新闻分类集合 + */ + public List selectNewsCategoryList(NewsCategory newsCategory); + + /** + * 查询新闻分类简短列表 + * + * @return 新闻分类集合 + */ + public List selectNewsCategoryShortList(); + + /** + * 新增新闻分类 + * + * @param newsCategory 新闻分类 + * @return 结果 + */ + public int insertNewsCategory(NewsCategory newsCategory); + + /** + * 修改新闻分类 + * + * @param newsCategory 新闻分类 + * @return 结果 + */ + public int updateNewsCategory(NewsCategory newsCategory); + + /** + * 批量删除新闻分类 + * + * @param categoryIds 需要删除的新闻分类主键集合 + * @return 结果 + */ + public AjaxResult deleteNewsCategoryByCategoryIds(Long[] categoryIds); + + /** + * 删除新闻分类信息 + * + * @param categoryId 新闻分类主键 + * @return 结果 + */ + public int deleteNewsCategoryByCategoryId(Long categoryId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsService.java new file mode 100644 index 00000000..8930a3f3 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/INewsService.java @@ -0,0 +1,69 @@ +package com.fastbee.iot.service; + +import java.util.List; +import com.fastbee.iot.domain.News; +import com.fastbee.iot.model.CategoryNews; + +/** + * 新闻资讯Service接口 + * + * @author kerwincui + * @date 2022-04-09 + */ +public interface INewsService +{ + /** + * 查询新闻资讯 + * + * @param newsId 新闻资讯主键 + * @return 新闻资讯 + */ + public News selectNewsByNewsId(Long newsId); + + /** + * 查询新闻资讯列表 + * + * @param news 新闻资讯 + * @return 新闻资讯集合 + */ + public List selectNewsList(News news); + + /** + * 查询置顶新闻资讯列表 + * + * @return 新闻资讯集合 + */ + public List selectTopNewsList(); + + /** + * 新增新闻资讯 + * + * @param news 新闻资讯 + * @return 结果 + */ + public int insertNews(News news); + + /** + * 修改新闻资讯 + * + * @param news 新闻资讯 + * @return 结果 + */ + public int updateNews(News news); + + /** + * 批量删除新闻资讯 + * + * @param newsIds 需要删除的新闻资讯主键集合 + * @return 结果 + */ + public int deleteNewsByNewsIds(Long[] newsIds); + + /** + * 删除新闻资讯信息 + * + * @param newsId 新闻资讯主键 + * @return 结果 + */ + public int deleteNewsByNewsId(Long newsId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IOauthClientDetailsService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IOauthClientDetailsService.java new file mode 100644 index 00000000..701521fc --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IOauthClientDetailsService.java @@ -0,0 +1,61 @@ +package com.fastbee.iot.service; + +import java.util.List; +import com.fastbee.iot.domain.OauthClientDetails; + +/** + * 云云对接Service接口 + * + * @author kerwincui + * @date 2022-02-07 + */ +public interface IOauthClientDetailsService +{ + /** + * 查询云云对接 + * + * @param clientId 云云对接主键 + * @return 云云对接 + */ + public OauthClientDetails selectOauthClientDetailsByClientId(String clientId); + + /** + * 查询云云对接列表 + * + * @param oauthClientDetails 云云对接 + * @return 云云对接集合 + */ + public List selectOauthClientDetailsList(OauthClientDetails oauthClientDetails); + + /** + * 新增云云对接 + * + * @param oauthClientDetails 云云对接 + * @return 结果 + */ + public int insertOauthClientDetails(OauthClientDetails oauthClientDetails); + + /** + * 修改云云对接 + * + * @param oauthClientDetails 云云对接 + * @return 结果 + */ + public int updateOauthClientDetails(OauthClientDetails oauthClientDetails); + + /** + * 批量删除云云对接 + * + * @param clientIds 需要删除的云云对接主键集合 + * @return 结果 + */ + public int deleteOauthClientDetailsByClientIds(String[] clientIds); + + /** + * 删除云云对接信息 + * + * @param clientId 云云对接主键 + * @return 结果 + */ + public int deleteOauthClientDetailsByClientId(String clientId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductAuthorizeService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductAuthorizeService.java new file mode 100644 index 00000000..04e90abf --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductAuthorizeService.java @@ -0,0 +1,76 @@ +package com.fastbee.iot.service; + +import java.util.List; +import com.fastbee.iot.domain.ProductAuthorize; +import com.fastbee.iot.model.ProductAuthorizeVO; + +/** + * 产品授权码Service接口 + * + * @author kami + * @date 2022-04-11 + */ +public interface IProductAuthorizeService +{ + /** + * 查询产品授权码 + * + * @param authorizeId 产品授权码主键 + * @return 产品授权码 + */ + public ProductAuthorize selectProductAuthorizeByAuthorizeId(Long authorizeId); + + /** + * 查询产品授权码列表 + * + * @param productAuthorize 产品授权码 + * @return 产品授权码集合 + */ + public List selectProductAuthorizeList(ProductAuthorize productAuthorize); + + /** + * 新增产品授权码 + * + * @param productAuthorize 产品授权码 + * @return 结果 + */ + public int insertProductAuthorize(ProductAuthorize productAuthorize); + + /** + * 修改产品授权码 + * + * @param productAuthorize 产品授权码 + * @return 结果 + */ + public int updateProductAuthorize(ProductAuthorize productAuthorize); + + /** + * 批量删除产品授权码 + * + * @param authorizeIds 需要删除的产品授权码主键集合 + * @return 结果 + */ + public int deleteProductAuthorizeByAuthorizeIds(Long[] authorizeIds); + + /** + * 删除产品授权码信息 + * + * @param authorizeId 产品授权码主键 + * @return 结果 + */ + public int deleteProductAuthorizeByAuthorizeId(Long authorizeId); + + /** + * 根据数量批量新增产品授权码 + * @param productAuthorizeVO + * @return + */ + public int addProductAuthorizeByNum(ProductAuthorizeVO productAuthorizeVO); + + /** + * 根据产品id查询产品授权码 + * @param productId 产品id + * @return + */ + List listByProductId(Long productId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductService.java new file mode 100644 index 00000000..9c07dca7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProductService.java @@ -0,0 +1,119 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.iot.domain.Product; +import com.fastbee.iot.model.ChangeProductStatusModel; +import com.fastbee.iot.model.IdAndName; +import com.fastbee.iot.model.ProductCode; + +import java.util.List; + +/** + * 产品Service接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface IProductService +{ + /** + * 查询产品 + * + * @param productId 产品主键 + * @return 产品 + */ + public Product selectProductByProductId(Long productId); + + /** + * 查询产品列表 + * + * @param product 产品 + * @return 产品集合 + */ + public List selectProductList(Product product); + + /** + * 查询产品简短列表 + * + * @return 产品集合 + */ + public List selectProductShortList(); + + /** + * 新增产品 + * + * @param product 产品 + * @return 结果 + */ + public Product insertProduct(Product product); + + /** + * 修改产品 + * + * @param product 产品 + * @return 结果 + */ + public int updateProduct(Product product); + + /** + * 获取产品下面的设备数量 + * + * @param productId 产品ID + * @return 结果 + */ + public int selectDeviceCountByProductId(Long productId); + + /** + * 更新产品状态,1-未发布,2-已发布 + * + * @param model + * @return 结果 + */ + public AjaxResult changeProductStatus(ChangeProductStatusModel model); + + /** + * 批量删除产品 + * + * @param productIds 需要删除的产品主键集合 + * @return 结果 + */ + public AjaxResult deleteProductByProductIds(Long[] productIds); + + /** + * 删除产品信息 + * + * @param productId 产品主键 + * @return 结果 + */ + public int deleteProductByProductId(Long productId); + + /** + * 根据设备编号查询产品信息 + * @param serialNumber 设备编号 + * @return 结果 + */ + public Product getProductBySerialNumber(String serialNumber); + + /** + * 根据设备编号查询协议编号 + * @param serialNumber 设备编号 + * @return 协议编号 + */ + public ProductCode getProtocolBySerialNumber(String serialNumber); + + /** + * 根据产品id获取协议编号 + * @param productId 产品id + * @return 协议编号 + */ + public String getProtocolByProductId(Long productId); + + + /** + * 根据模板id查询所有使用的产品 + * @param templeId 模板id + * @return + */ + public List selectByTempleId(Long templeId); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProtocolService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProtocolService.java new file mode 100644 index 00000000..98870751 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IProtocolService.java @@ -0,0 +1,75 @@ +package com.fastbee.iot.service; + +import com.fastbee.iot.domain.Protocol; + +import java.util.List; + +/** + * 协议管理类 + * @author gsb + * @date 2022/10/19 16:47 + */ +public interface IProtocolService { + + /** + * 查询协议 + * + * @param id 协议主键 + * @return 协议 + */ + public Protocol selectProtocolById(Long id); + + /** + * 查询协议列表 + * + * @param protocol 协议 + * @return 协议集合 + */ + public List selectProtocolList(Protocol protocol); + + /** + * 新增协议 + * + * @param protocol 协议 + * @return 结果 + */ + public int insertProtocol(Protocol protocol); + + /** + * 修改协议 + * + * @param protocol 协议 + * @return 结果 + */ + public int updateProtocol(Protocol protocol); + + /** + * 批量删除协议 + * + * @param ids 需要删除的协议主键集合 + * @return 结果 + */ + public int deleteProtocolByIds(Long[] ids); + + /** + * 删除协议信息 + * + * @param id 协议主键 + * @return 结果 + */ + public int deleteProtocolById(Long id); + + + /** + * 获取所有协议 + * @return + */ + public List selectAll(); + + /** + *获取所有可用协议 + * @param protocol + * @return + */ + public List selectByCondition(Protocol protocol); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialLoginService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialLoginService.java new file mode 100644 index 00000000..737b0321 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialLoginService.java @@ -0,0 +1,89 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.BindLoginBody; +import com.fastbee.common.core.domain.model.BindRegisterBody; +import com.fastbee.iot.domain.SocialUser; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthUser; + +import javax.servlet.http.HttpServletRequest; + +/** + * 第三方登录Service接口 + * 处理登录跳转业务逻辑 + * + * @author json + * @date 2022-04-12 + */ +public interface ISocialLoginService { + + /** + * 第三方登录跳转 + * + * @param source 平台 + * @param httpServletRequest 当前请求 + * @return 跳转路径 + */ + String renderAuth(String source, HttpServletRequest httpServletRequest); + + /** + * 第三方登录callback + * + * @param source 平台 + * @param authCallback 回调参数 + * @param httpServletRequest 当前请求 + * @return 跳转路径 + */ + String callback(String source, AuthCallback authCallback, HttpServletRequest httpServletRequest); + + /** + * 检查是否bindId + * + * @param bindId 绑定id + * @return + */ + AjaxResult checkBindId(String bindId); + + /** + * 获得错误显示 + * + * @param errorId errorId + * @return + */ + AjaxResult getErrorMsg(String errorId); + + /** + * 跳转直接登录 + * + * @param loginId 登录id + * @return + */ + AjaxResult socialLogin(String loginId); + + /** + * 绑定登录api + * + * @param bindLoginBody 绑定账户参数 + * @return + */ + AjaxResult bindLogin(BindLoginBody bindLoginBody); + + /** + * 注册绑定api + * + * @param bindRegisterBody + * @return + */ + AjaxResult bindRegister(BindRegisterBody bindRegisterBody); + + String genBindId(AuthUser authUser); + + String genErrorId(String msg); + + String genWxBindId(Long userId); + + SocialUser findSocialUser(String uuid, String source); + + AjaxResult checkSocialUser(SocialUser socialUser, String bindId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialPlatformService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialPlatformService.java new file mode 100644 index 00000000..d0503bea --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialPlatformService.java @@ -0,0 +1,69 @@ +package com.fastbee.iot.service; + +import java.util.List; +import com.fastbee.iot.domain.SocialPlatform; + +/** + * 第三方登录平台控制Service接口 + * + * @author json + * @date 2022-04-12 + */ +public interface ISocialPlatformService +{ + /** + * 查询第三方登录平台控制 + * + * @param socialPlatformId 第三方登录平台控制主键 + * @return 第三方登录平台控制 + */ + public SocialPlatform selectSocialPlatformBySocialPlatformId(Long socialPlatformId); + + /** + * 查询第三方登录平台控制 + * + * @param platform 第三方登录平台名称 + * @return 第三方登录平台控制 + */ + public SocialPlatform selectSocialPlatformByPlatform(String platform); + + /** + * 查询第三方登录平台控制列表 + * + * @param socialPlatform 第三方登录平台控制 + * @return 第三方登录平台控制集合 + */ + public List selectSocialPlatformList(SocialPlatform socialPlatform); + + /** + * 新增第三方登录平台控制 + * + * @param socialPlatform 第三方登录平台控制 + * @return 结果 + */ + public int insertSocialPlatform(SocialPlatform socialPlatform); + + /** + * 修改第三方登录平台控制 + * + * @param socialPlatform 第三方登录平台控制 + * @return 结果 + */ + public int updateSocialPlatform(SocialPlatform socialPlatform); + + /** + * 批量删除第三方登录平台控制 + * + * @param socialPlatformIds 需要删除的第三方登录平台控制主键集合 + * @return 结果 + */ + public int deleteSocialPlatformBySocialPlatformIds(Long[] socialPlatformIds); + + /** + * 删除第三方登录平台控制信息 + * + * @param socialPlatformId 第三方登录平台控制主键 + * @return 结果 + */ + public int deleteSocialPlatformBySocialPlatformId(Long socialPlatformId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java new file mode 100644 index 00000000..4c8c4dde --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java @@ -0,0 +1,99 @@ +package com.fastbee.iot.service; + +import com.fastbee.iot.domain.SocialUser; + +import java.util.List; + +/** + * 用户第三方用户信息Service接口 + * + * @author json + * @date 2022-04-18 + */ +public interface ISocialUserService +{ + /** + * 查询用户第三方用户信息 + * + * @param socialUserId 用户第三方用户信息主键 + * @return 用户第三方用户信息 + */ + public SocialUser selectSocialUserBySocialUserId(Long socialUserId); + + /** + * 查询用户第三方用户信息列表 + * + * @param socialUser 用户第三方用户信息 + * @return 用户第三方用户信息集合 + */ + public List selectSocialUserList(SocialUser socialUser); + + /** + * 新增用户第三方用户信息 + * + * @param socialUser 用户第三方用户信息 + * @return 结果 + */ + public int insertSocialUser(SocialUser socialUser); + + /** + * 修改用户第三方用户信息 + * + * @param socialUser 用户第三方用户信息 + * @return 结果 + */ + public int updateSocialUser(SocialUser socialUser); + + /** + * 批量删除用户第三方用户信息 + * + * @param socialUserIds 需要删除的用户第三方用户信息主键集合 + * @return 结果 + */ + public int deleteSocialUserBySocialUserIds(Long[] socialUserIds); + + /** + * 删除用户第三方用户信息信息 + * + * @param socialUserId 用户第三方用户信息主键 + * @return 结果 + */ + public int deleteSocialUserBySocialUserId(Long socialUserId); + + /** + * 根据openId或unionId获取用户第三方信息 + * @param openId + * @param unionId + * @return + */ + public SocialUser selectOneByOpenIdAndUnionId(String openId, String unionId); + + /** + * 通过unionId查询 + * + * @param unionId + * @return + */ + Long selectSysUserIdByUnionId(String unionId); + + /** + * 通过系统用户id查询已绑定信息 + * @param sysUserId 系统用户id + * @return + */ + List selectBySysUserId(Long sysUserId); + + /** + * 取消所有相关微信绑定 + * @param sysUserId 系统用户id + * @return 结果 + */ + int cancelBind(Long sysUserId, List sourceClientList); + + /** + * 取消所有相关微信绑定 + * @param sysUserIds 系统用户id集合 + * @return 结果 + */ + int batchCancelBind(Long[] sysUserIds, List sourceClientList); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelService.java new file mode 100644 index 00000000..07957f40 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelService.java @@ -0,0 +1,150 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.core.iot.response.IdentityAndName; +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.model.ImportThingsModelInput; +import com.fastbee.iot.model.ThingsModelPerm; +import com.fastbee.iot.model.ThingsModels.PropertyDto; +import com.fastbee.iot.model.ThingsModels.ThingsItems; + +import java.util.List; +import java.util.Map; + +/** + * 物模型Service接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface IThingsModelService +{ + /** + * 查询物模型 + * + * @param modelId 物模型主键 + * @return 物模型 + */ + public ThingsModel selectThingsModelByModelId(Long modelId); + + /** + * 查询单个物模型 + * @param model 物模型 + * @return 单个物模型 + */ + public ThingsModel selectSingleThingsModel(ThingsModel model); + + /** + * 查询物模型列表 + * + * @param thingsModel 物模型 + * @return 物模型集合 + */ + public List selectThingsModelList(ThingsModel thingsModel); + + /** + * 查询物模型对应设备分享用户权限列表 + * + * @param productId 产品ID + */ + public List selectThingsModelPermList(Long productId); + + /** + * 查询物模型列表-轮询使用 + * + * @param thingsModel 物模型 + * @return 物模型集合 + */ + public Map> selectThingsModelListCache(ThingsModel thingsModel); + + /** + * 新增物模型 + * + * @param thingsModel 物模型 + * @return 结果 + */ + public int insertThingsModel(ThingsModel thingsModel); + + /** + * 从模板导入物模型 + * @param input + * @return + */ + public int importByTemplateIds(ImportThingsModelInput input); + + /** + * 修改物模型 + * + * @param thingsModel 物模型 + * @return 结果 + */ + public int updateThingsModel(ThingsModel thingsModel); + + /** + * 批量删除物模型 + * + * @param modelIds 需要删除的物模型主键集合 + * @return 结果 + */ + public int deleteThingsModelByModelIds(Long[] modelIds); + + /** + * 删除物模型信息 + * + * @param modelId 物模型主键 + * @return 结果 + */ + public int deleteThingsModelByModelId(Long modelId); + + /** + * 根据产品ID获取JSON物模型 + * @param productId + * @return + */ + public String getCacheThingsModelByProductId(Long productId); + + + /** + * 获取单个物模型获取 + * @param productId + * @param identify + * @return + */ + public PropertyDto getSingleThingModels(Long productId, String identify); + + + /** + * 批量查询产品的缓存物模型 + * @param productIds + * @return + */ + public Map getBatchCacheThingsModelByProductIds(Long[] productIds); + + /** + * 导入采集点数据 + * @param lists 数据列表 + * @param tempSlaveId 从机编码 + * @return 结果 + */ + public String importData(List lists,Integer tempSlaveId); + + /** + * 根据模板id查询从机采集点列表 + * + * @return 变量模板从机采集点集合 + */ + public List selectAllByTemplateId(Long templateId); + + /** + * 根据产品id删除 产品物模型以及物模型缓存 + * @param productId + */ + public void deleteProductThingsModelAndCacheByProductId(Long productId); + + /** + * 同步采集点模板 + * @param productIds + */ + public void synchronizeVarTempToProduct(List productIds,Long templateId); + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelTemplateService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelTemplateService.java new file mode 100644 index 00000000..6fb12421 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IThingsModelTemplateService.java @@ -0,0 +1,87 @@ +package com.fastbee.iot.service; + +import java.util.List; + +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.domain.ThingsModelTemplate; + +/** + * 通用物模型Service接口 + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface IThingsModelTemplateService +{ + /** + * 查询通用物模型 + * + * @param templateId 通用物模型主键 + * @return 通用物模型 + */ + public ThingsModelTemplate selectThingsModelTemplateByTemplateId(Long templateId); + + /** + * 查询通用物模型列表 + * + * @param thingsModelTemplate 通用物模型 + * @return 通用物模型集合 + */ + public List selectThingsModelTemplateList(ThingsModelTemplate thingsModelTemplate); + + /** + * 新增通用物模型 + * + * @param thingsModelTemplate 通用物模型 + * @return 结果 + */ + public int insertThingsModelTemplate(ThingsModelTemplate thingsModelTemplate); + + /** + * 修改通用物模型 + * + * @param thingsModelTemplate 通用物模型 + * @return 结果 + */ + public int updateThingsModelTemplate(ThingsModelTemplate thingsModelTemplate); + + + /** + * 根据从机关联id更新模板信息 + * @param thingsModelTemplate + * @return + */ + public int updateTemplateByTempSlaveId(ThingsModelTemplate thingsModelTemplate); + + /** + * 批量删除通用物模型 + * + * @param templateIds 需要删除的通用物模型主键集合 + * @return 结果 + */ + public int deleteThingsModelTemplateByTemplateIds(Long[] templateIds); + + /** + * 删除通用物模型信息 + * + * @param templateId 通用物模型主键 + * @return 结果 + */ + public int deleteThingsModelTemplateByTemplateId(Long templateId); + + /** + * 导入采集点数据 + * @param lists 数据列表 + * @param tempSlaveId 从机编码 + * @return 结果 + */ + public String importData(List lists,String tempSlaveId); + + /** + * 根据模板id查询从机采集点列表 + * + * @return 变量模板从机采集点集合 + */ + public List selectAllByTemplateId(Long templateId); + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IToolService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IToolService.java new file mode 100644 index 00000000..36720574 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IToolService.java @@ -0,0 +1,70 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.ProductAuthorize; +import com.fastbee.iot.model.MqttAuthenticationModel; +import com.fastbee.iot.model.ProductAuthenticateModel; +import com.fastbee.iot.model.RegisterUserInput; +import com.fastbee.iot.model.RegisterUserOutput; +import com.fastbee.iot.util.AESUtils; +import org.springframework.http.ResponseEntity; + +import java.util.List; + +/** + * + * @author kerwincui + * @date 2021-12-16 + */ +public interface IToolService +{ + /** + * 注册 + */ + public String register(RegisterUserInput registerBody); + + /** + * 注册 + */ + public RegisterUserOutput registerNoCaptcha(RegisterUserInput registerBody); + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser user); + + /** + * 生成随机数字和字母 + */ + public String getStringRandom(int length); + + public String generateRandomHex(int length); + + /** + * 设备简单认证 + */ + public ResponseEntity simpleMqttAuthentication(MqttAuthenticationModel mqttModel, ProductAuthenticateModel productModel); + + /** + * 设备加密认证 + * + * @return + */ + public ResponseEntity encryptAuthentication(MqttAuthenticationModel mqttModel, ProductAuthenticateModel productModel)throws Exception; + + + /** + * 整合设备认证接口 + */ + public ResponseEntity clientAuth(String clientid,String username,String password) throws Exception; + public ResponseEntity clientAuthv5(String clientid,String username,String password) throws Exception; + + /** + * 返回认证信息 + */ + public ResponseEntity returnUnauthorized(MqttAuthenticationModel mqttModel, String message); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IUserSocialProfileService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IUserSocialProfileService.java new file mode 100644 index 00000000..daad1b21 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IUserSocialProfileService.java @@ -0,0 +1,42 @@ +package com.fastbee.iot.service; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.iot.domain.UserSocialProfile; + +import java.util.List; + +public interface IUserSocialProfileService { + /** + * 找到用户绑定的社交账户 + * + * @param sysUserId 用户主键 + * @return + */ + List selectUserSocialProfile(Long sysUserId); + + /** + * 绑定用户 + * + * @param bindId 绑定的Id + * @param sysUserId 用户主键 + * @return + */ + AjaxResult bindUser(String bindId, Long sysUserId); + + /** + * 点击绑定跳转api + * + * @param platform 平台 + * @return + */ + AjaxResult bindSocialAccount(String platform); + + /** + * 解除绑定 + * + * @param socialUserId 要解除的社交账户主键 + * @param sysUserId 用户主键 + * @return + */ + AjaxResult unbindSocialAccount(Long socialUserId, Long sysUserId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IDeviceCache.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IDeviceCache.java new file mode 100644 index 00000000..80673586 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IDeviceCache.java @@ -0,0 +1,29 @@ +package com.fastbee.iot.service.cache; + +import com.fastbee.common.core.mq.DeviceStatusBo; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.iot.domain.Device; + +import java.util.List; + +/** + * 设备缓存 + * @author bill + */ +public interface IDeviceCache { + + /** + * 更新设备状态 + * @param dto dto + */ + public Device updateDeviceStatusCache(DeviceStatusBo dto); + + /** + * 批量更新redis缓存设备状态 + * @param serialNumbers 设备列表 + * @param status 状态 + */ + void updateBatchDeviceStatusCache(List serialNumbers, DeviceStatus status); + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IFirmwareCache.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IFirmwareCache.java new file mode 100644 index 00000000..a31b5a90 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/IFirmwareCache.java @@ -0,0 +1,30 @@ +package com.fastbee.iot.service.cache; + +/** + * 固件版本缓存 + * @author gsb + * @date 2022/10/25 11:34 + */ +public interface IFirmwareCache { + + /** + * 固件版本缓存 + * @param firmwareId 固件ID + * @param urlName 升级URL + * @return + */ + public void setFirmwareCache(Long firmwareId,String urlName); + + /** + * 获取固件版本信息 + * @param firmwareId 固件ID + * @return 升级URL + */ + public String getFirmwareCache(Long firmwareId); + + /** + * 移除固件版本 + * @param firmwareId 固件id + */ + public void remove(Long firmwareId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/DeviceCacheImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/DeviceCacheImpl.java new file mode 100644 index 00000000..3ea06ece --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/DeviceCacheImpl.java @@ -0,0 +1,95 @@ +package com.fastbee.iot.service.cache.impl; + +import com.fastbee.common.core.mq.DeviceStatusBo; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.core.redis.RedisKeyBuilder; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.iot.service.cache.IDeviceCache; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * @author bill + */ +@Service +@Slf4j +public class DeviceCacheImpl implements IDeviceCache { + + @Value("${server.device.platform.expried:120}") + private Integer expireTime; + + @Autowired + private RedisCache redisCache; + @Autowired + private IDeviceService deviceService; + + + /** + * 更新设备状态 + * 如果设备状态保持不变,更新redis设备最新在线时间 + * 如果设备状态更改,更新redis同时,更新MySQL数据库设备状态 + * + * @param dto dto + */ + @Override + public Device updateDeviceStatusCache(DeviceStatusBo dto) { + + Device device = deviceService.selectDeviceBySerialNumber(dto.getSerialNumber()); + if (dto.getStatus() == DeviceStatus.ONLINE) { + /*redis设备在线列表*/ + redisCache.zSetAdd(RedisKeyBuilder.buildDeviceOnlineListKey(), dto.getSerialNumber(), DateUtils.getTimestampSeconds()); + //更新mysql的设备状态为在线,延时500ms解决状态同步问题 + try { + Thread.sleep(500); // 延迟一秒 + } catch (InterruptedException e) { + e.printStackTrace(); + } + device.setStatus(DeviceStatus.ONLINE.getType()); + } else { + /*在redis设备在线列表移除设备*/ + redisCache.zRem(RedisKeyBuilder.buildDeviceOnlineListKey(), dto.getSerialNumber()); + //更新一下mysql的设备状态为离线 + device.setStatus(DeviceStatus.OFFLINE.getType()); + } + device.setUpdateTime(DateUtils.getNowDate()); + deviceService.updateDeviceStatusAndLocation(device, dto.getIp()); + return device; + } + + + /** + * 批量更新redis缓存设备状态 + * + * @param serialNumbers 设备列表 + * @param status 状态 + */ + @Override + public void updateBatchDeviceStatusCache(List serialNumbers, DeviceStatus status) { + if (CollectionUtils.isEmpty(serialNumbers)) { + return; + } + for (String serialNumber : serialNumbers) { + DeviceStatusBo statusBo = new DeviceStatusBo(); + statusBo.setStatus(status); + statusBo.setSerialNumber(serialNumber); + this.updateDeviceStatusCache(statusBo); + } + } + + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/FirmwareCacheImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/FirmwareCacheImpl.java new file mode 100644 index 00000000..e1e7f200 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/cache/impl/FirmwareCacheImpl.java @@ -0,0 +1,56 @@ +package com.fastbee.iot.service.cache.impl; + +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.core.redis.RedisKeyBuilder; +import com.fastbee.iot.service.cache.IFirmwareCache; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +/** + * 固件版本缓存 + * @author gsb + * @date 2022/10/25 11:37 + */ +@Service +@Slf4j +public class FirmwareCacheImpl implements IFirmwareCache { + + @Autowired + private RedisCache redisCache; + + /** + * 固件版本缓存 + * @param firmwareId 固件ID + * @param urlName 升级URL + * @return + */ + @Override + public void setFirmwareCache(Long firmwareId,String urlName){ + String cachedKey = RedisKeyBuilder.buildFirmwareCachedKey(firmwareId); + redisCache.setCacheObject(cachedKey,urlName,60*60*12, TimeUnit.SECONDS); + } + + /** + * 获取固件版本信息 + * @param firmwareId 固件ID + * @return 升级URL + */ + @Override + public String getFirmwareCache(Long firmwareId){ + String cachedKey = RedisKeyBuilder.buildFirmwareCachedKey(firmwareId); + return redisCache.getCacheObject(cachedKey); + } + + /** + * 移除固件版本 + * @param firmwareId 固件id + */ + @Override + public void remove(Long firmwareId){ + String cachedKey = RedisKeyBuilder.buildFirmwareCachedKey(firmwareId); + redisCache.deleteObject(cachedKey); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthRequestFactoryImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthRequestFactoryImpl.java new file mode 100644 index 00000000..382c7897 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthRequestFactoryImpl.java @@ -0,0 +1,74 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.enums.SocialPlatformType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.iot.domain.SocialPlatform; +import com.fastbee.iot.model.login.AuthRequestWrap; +import com.fastbee.iot.service.IAuthRequestFactory; +import com.fastbee.iot.service.ISocialPlatformService; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.request.AuthQqRequest; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.request.AuthWeChatOpenRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Locale; + +@Service +public class AuthRequestFactoryImpl implements IAuthRequestFactory { + + private static final Logger log = LoggerFactory.getLogger(AuthRequestFactoryImpl.class); + + @Autowired + private ISocialPlatformService iSocialPlatformService; + + @Autowired + private AuthStateRedisCache authStateRedisCache; + + /** + * 获得对于AUthRequest + * + * @param source 登录方式 + * @return 对应AuthRequest + */ + @Override + public AuthRequestWrap getAuthRequest(String source) { + AuthRequestWrap authRequestWrap = new AuthRequestWrap(); + AuthRequest authRequest; + try { + String lowerSource = source.toLowerCase(Locale.ROOT); + SocialPlatformType socialPlatformType = SocialPlatformType.getSocialPlatformType(lowerSource); + if (socialPlatformType == null) { + throw new ServiceException("未获取到第三方平台来源"); + } + SocialPlatform socialPlatform = iSocialPlatformService.selectSocialPlatformByPlatform(lowerSource); + authRequestWrap.setSocialPlatform(socialPlatform); + AuthConfig authConfig = AuthConfig.builder() + .clientId(socialPlatform.getClientId()) + .clientSecret(socialPlatform.getSecretKey()) + .redirectUri(socialPlatform.getRedirectUri()) + .build(); + switch (socialPlatformType) { + case WECHAT_OPEN_WEB: { + authRequest = new AuthWeChatOpenRequest(authConfig, authStateRedisCache); + break; + } + case QQ_OPEN_WEB: { + authRequest = new AuthQqRequest(authConfig, authStateRedisCache); + break; + } + default: { + throw new ServiceException("source: " + source + ",暂不支持"); + } + } + authRequestWrap.setAuthRequest(authRequest); + return authRequestWrap; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthStateRedisCache.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthStateRedisCache.java new file mode 100644 index 00000000..b2e21a98 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/AuthStateRedisCache.java @@ -0,0 +1,52 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.utils.sign.Md5Utils; +import me.zhyd.oauth.cache.AuthCacheConfig; +import me.zhyd.oauth.cache.AuthStateCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * 扩展Redis版的state缓存 + * + * @author json + * @date 2022/04/12 + */ +@Component +public class AuthStateRedisCache implements AuthStateCache { + + @Autowired + private RedisCache redisCache; + + @Override + public void cache(String key, String value) { + redisCache.setCacheObject(key, getValue(value), (int) AuthCacheConfig.timeout, TimeUnit.MILLISECONDS); + } + + @Override + public void cache(String key, String value, long timeout) { + redisCache.setCacheObject(key, getValue(value), (int) timeout, TimeUnit.MILLISECONDS); + } + + @Override + public String get(String key) { + return redisCache.getCacheObject(key); + } + + @Override + public boolean containsKey(String key) { + return redisCache.containsKey(key); + } + + /** + * 自定义state + * @param oldState + * @return state + */ + private String getValue(String oldState) { + return Md5Utils.hash(oldState + System.currentTimeMillis()); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/CategoryServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/CategoryServiceImpl.java new file mode 100644 index 00000000..cb5c8f09 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/CategoryServiceImpl.java @@ -0,0 +1,146 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.Category; +import com.fastbee.iot.mapper.CategoryMapper; +import com.fastbee.iot.model.IdAndName; +import com.fastbee.iot.service.ICategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 产品分类Service业务层处理 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +public class CategoryServiceImpl implements ICategoryService +{ + @Autowired + private CategoryMapper categoryMapper; + + /** + * 查询产品分类 + * + * @param categoryId 产品分类主键 + * @return 产品分类 + */ + @Override + public Category selectCategoryByCategoryId(Long categoryId) + { + return categoryMapper.selectCategoryByCategoryId(categoryId); + } + + /** + * 查询产品分类列表 + * + * @param category 产品分类 + * @return 产品分类 + */ + @Override + public List selectCategoryList(Category category) + { + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + // 租户 + if(roles.stream().anyMatch(a->a.getRoleKey().equals("tenant"))){ + category.setTenantId(user.getUserId()); + } + return categoryMapper.selectCategoryList(category); + } + + /** + * 查询产品分简短类列表 + * + * @return 产品分类 + */ + @Override + public List selectCategoryShortList() + { + Category category=new Category(); + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + // 租户 + if(roles.stream().anyMatch(a->a.getRoleKey().equals("tenant"))){ + category.setTenantId(user.getUserId()); + } + return categoryMapper.selectCategoryShortList(category); + } + + /** + * 新增产品分类 + * + * @param category 产品分类 + * @return 结果 + */ + @Override + public int insertCategory(Category category) + { + // 判断是否为管理员 + category.setIsSys(1); + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + for(int i=0;i0){ + return AjaxResult.error("删除失败,请先删除对应分类下的产品"); + } + if(categoryMapper.deleteCategoryByCategoryIds(categoryIds)>0){ + return AjaxResult.success("删除成功"); + } + return AjaxResult.error("删除失败"); + } + + /** + * 删除产品分类信息 + * + * @param categoryId 产品分类主键 + * @return 结果 + */ + @Override + public int deleteCategoryByCategoryId(Long categoryId) + { + return categoryMapper.deleteCategoryByCategoryId(categoryId); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceLogServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceLogServiceImpl.java new file mode 100644 index 00000000..8e033be4 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceLogServiceImpl.java @@ -0,0 +1,41 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.model.HistoryModel; +import com.fastbee.iot.tdengine.service.ILogService; +import com.fastbee.iot.mapper.DeviceLogMapper; +import com.fastbee.iot.model.MonitorModel; +import com.fastbee.iot.service.IDeviceLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 设备日志Service业务层处理 + * + * @author kerwincui + * @date 2022-01-13 + */ +@Service +public class DeviceLogServiceImpl implements IDeviceLogService +{ + + @Autowired + private ILogService logService; + + /** + * 查询设备监测数据 + * + * @param deviceLog 设备日志 + * @return 设备日志 + */ + @Override + public List selectMonitorList(DeviceLog deviceLog) + { + return logService.selectMonitorList(deviceLog); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceRuntimeServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceRuntimeServiceImpl.java new file mode 100644 index 00000000..4e399022 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceRuntimeServiceImpl.java @@ -0,0 +1,169 @@ +package com.fastbee.iot.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.core.redis.RedisKeyBuilder; +import com.fastbee.common.enums.FunctionReplyStatus; +import com.fastbee.common.enums.ThingsModelType; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.domain.FunctionLog; +import com.fastbee.iot.model.Specs; +import com.fastbee.iot.service.IDeviceRuntimeService; +import com.fastbee.iot.service.IFunctionLogService; +import com.fastbee.iot.service.IThingsModelService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 设备运行时数据 + * + * @author gsb + * @date 2023/2/1 15:11 + */ +@Service +public class DeviceRuntimeServiceImpl implements IDeviceRuntimeService { + + @Autowired + private RedisCache redisCache; + @Resource + private IFunctionLogService logService; + @Resource + private IThingsModelService thingsModelService; + + /** + * 根据设备编号查询设备实时运行状态 + * + * @param serialNumber 设备编号 + * @param type 物模型类型 + * @return 设备实时数据 + */ + @Override + public List runtimeBySerialNumber(String serialNumber, ThingsModelType type, Long productId, Integer slaveId) { + //获取redis中的物模型 + String thingsModel = thingsModelService.getCacheThingsModelByProductId(productId); + JSONObject thingModelObject = JSONObject.parseObject(thingsModel); + String key = type == ThingsModelType.PROP ? "properties" : "functions"; + String properties = thingModelObject.getString(key); + /*在redis中查找实时数据*/ + String cacheKey = RedisKeyBuilder.buildDeviceRtCacheKey(serialNumber); + /*物模型标识符 -- value*/ + Map cacheMap = redisCache.getCacheMap(cacheKey); + /*查询是否有计算公式参数*/ + String paramsKey = RedisKeyBuilder.buildDeviceRtParamsKey(serialNumber); + Map params = redisCache.getCacheMap(paramsKey); + List results = new ArrayList<>(); + List propList = JSONObject.parseArray(properties, Specs.class); + for (Specs specs : propList) { + if (specs.getSlaveId().equals(slaveId)) { + DeviceLog log = new DeviceLog(); + log.setModelName(specs.getName()); + log.setLogType(type.getCode()); + log.setSpecs(JSONObject.toJSONString(specs.getDatatype())); + log.setIdentity(specs.getId()); + log.setSerialNumber(serialNumber); + log.setSlaveId(specs.getSlaveId()); + log.setIsMonitor(specs.getIsMonitor()); + log.setFormula(specs.getFormula()); + if (!CollectionUtils.isEmpty(cacheMap) && cacheMap.containsKey(specs.getId())) { + DeviceLog valueLog = JSONObject.parseObject(JSONObject.parse(cacheMap.get(specs.getId())).toString(), DeviceLog.class); + log.setLogValue(valueLog.getLogValue()); + log.setUpdateTime(valueLog.getTs()); + log.setTs(valueLog.getTs()); + //if (log.getFormula() != null && !log.getFormula().equals("")) { + // params.put("%s", log.getLogValue()); + // BigDecimal value = CaculateUtils.execute(log.getFormula(), params); + // log.setLogValue(value.toString()); + //} + } + results.add(log); + } + } + List result = results.stream(). + filter(log -> log.getLogType() == type.getCode()).collect(Collectors.toList()); + for (DeviceLog log : result) { + parseSpecs(log); + } + return result; + } + + + /** + * 根据设备编号查询设备服务调用日志情况 + * + * @param serialNumber 设备编号 + * @return 服务下发日志 + */ + @Override + public List runtimeReply(String serialNumber) { + FunctionLog log = new FunctionLog(); + log.setSerialNumber(serialNumber); + // 1-服务下发 + log.setFunType(1); + List logList = logService.selectFunctionLogList(log); + for (FunctionLog l : logList) { + if (l.getReplyTime() == null) { + l.setReplyTime(DateUtils.getNowDate()); + } + + l.setShowValue(l.getResultMsg()); + //设备超过10s未回复,则认为下发失败 + if (l.getResultCode().equals(FunctionReplyStatus.NORELY.getCode()) && DateUtils.getTimestamp() - l.getCreateTime().getTime() >10000){ + l.setShowValue(FunctionReplyStatus.FAIl.getMessage()); + l.setResultCode(FunctionReplyStatus.FAIl.getCode()); + } + } + return logList; + } + + /** + * 定时任务,自动更新设备响应超时状态 + */ + private void autoUpdateFuncLogStatus() { + FunctionLog functionLog = new FunctionLog(); + functionLog.setResultCode(FunctionReplyStatus.NORELY.getCode()); + List logList = logService.selectFunctionLogList(functionLog); + List ids = new ArrayList<>(); + for (FunctionLog log : logList) { + //如果设备回复超过20s,自动更新设备回复状态为设备超时 + if (DateUtils.getTimestamp() - log.getCreateTime().getTime() > 20000) { + ids.add(log.getId()); + } + } + //更新状态为超时未回复 + if (!CollectionUtils.isEmpty(ids)) { + FunctionLog log = new FunctionLog(); + log.setList(ids); + log.setResultMsg(FunctionReplyStatus.UNKNOWN.getMessage()); + log.setResultCode(FunctionReplyStatus.UNKNOWN.getCode()); + log.setReplyTime(DateUtils.getNowDate()); + logService.updateFuncLogBatch(log); + } + } + + /** + * 解析数据定义specs + * + * @param log + */ + public void parseSpecs(DeviceLog log) { + DeviceLog.DataType spesc = new DeviceLog.DataType(); + if (null != log.getSpecs() && !log.getSpecs().equals("null")) { + DeviceLog.DataType dataType = JSONObject.parseObject(JSONObject.parse(log.getSpecs()).toString(), DeviceLog.DataType.class); + log.setDataType(dataType); + } else { + spesc.setType("integer"); + log.setDataType(spesc); + } + } + + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java new file mode 100644 index 00000000..99d83678 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java @@ -0,0 +1,1312 @@ +package com.fastbee.iot.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.ProductAuthConstant; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.core.redis.RedisKeyBuilder; +import com.fastbee.common.core.thingsModel.ThingsModelSimpleItem; +import com.fastbee.common.core.thingsModel.ThingsModelValuesInput; +import com.fastbee.common.enums.DataEnum; +import com.fastbee.common.enums.DeviceStatus; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.http.HttpUtils; +import com.fastbee.common.utils.ip.IpUtils; +import com.fastbee.common.utils.json.JsonUtils; +import com.fastbee.iot.domain.*; +import com.fastbee.iot.mapper.DeviceMapper; +import com.fastbee.iot.mapper.DeviceUserMapper; +import com.fastbee.iot.mapper.EventLogMapper; +import com.fastbee.iot.model.*; +import com.fastbee.iot.model.ThingsModelItem.Datatype; +import com.fastbee.iot.model.ThingsModelItem.EnumItem; +import com.fastbee.iot.model.ThingsModelItem.ThingsModel; +import com.fastbee.iot.model.ThingsModels.PropertyDto; +import com.fastbee.iot.model.ThingsModels.ThingsModelShadow; +import com.fastbee.iot.model.ThingsModels.ThingsModelValueItem; +import com.fastbee.iot.model.ThingsModels.ValueItem; +import com.fastbee.iot.service.*; +import com.fastbee.iot.service.cache.IDeviceCache; +import com.fastbee.iot.tdengine.service.ILogService; +import com.fastbee.system.service.ISysUserService; +import org.quartz.SchedulerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 设备Service业务层处理 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +public class DeviceServiceImpl implements IDeviceService { + private static final Logger log = LoggerFactory.getLogger(DeviceServiceImpl.class); + + @Autowired + private DeviceMapper deviceMapper; + @Autowired + private DeviceUserMapper deviceUserMapper; + @Autowired + private ThingsModelServiceImpl thingsModelService; + @Autowired + private IToolService toolService; + @Autowired + private IProductService productService; + @Autowired + private ISysUserService userService; + @Autowired + private ILogService logService; + @Autowired + private RedisCache redisCache; + @Resource + @Lazy + private IDeviceCache deviceCache; + @Autowired + private EventLogMapper eventLogMapper; + @Resource + private IFunctionLogService functionLogService; + @Resource + private IEventLogService eventLogService; + @Resource + private IProductAuthorizeService productAuthorizeService; + @Value("${server.broker.port}") + private Long brokerPort; + + + /** + * 查询设备 + * + * @param deviceId 设备主键 + * @return 设备 + */ + @Override + public Device selectDeviceByDeviceId(Long deviceId) { + Device device = deviceMapper.selectDeviceByDeviceId(deviceId); + List list = getCacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + if (list != null && list.size() > 0) { + // redis中获取设备状态(物模型值) + device.setThingsModelValue(JSONObject.toJSONString(list)); + } + + /*查询子设备*/ + if (device != null) { + Device subBo = new Device(); + subBo.setGwDevCode(device.getSerialNumber()); + List subDeviceList = deviceMapper.selectDeviceList(subBo); + //获取子设备的首地址 + if (!CollectionUtils.isEmpty(subDeviceList)) { + device.setSlaveId(subDeviceList.get(0).getSlaveId()); + } + device.setSubDeviceList(subDeviceList); + } + return device; + } + + /** + * 查询设备统计信息 + * + * @return 设备 + */ + @Override + public DeviceStatistic selectDeviceStatistic() { + Device device = new Device(); + SysUser user = getLoginUser().getUser(); + List roles = user.getRoles(); + for (int i = 0; i < roles.size(); i++) { + if (roles.get(i).getRoleKey().equals("tenant")) { + // 租户查看产品下所有设备 + device.setTenantId(user.getUserId()); + } else if (roles.get(i).getRoleKey().equals("general")) { + // 用户查看自己设备 + device.setUserId(user.getUserId()); + } + } + // 获取设备、产品和告警数量 + DeviceStatistic statistic = deviceMapper.selectDeviceProductAlertCount(device); + if (statistic == null) { + statistic = new DeviceStatistic(); + return statistic; + } + // 获取属性、功能和事件 + DeviceStatistic thingsCount = logService.selectCategoryLogCount(device); + if (thingsCount == null) { + return statistic; + } + // 组合属性、功能、事件和监测数据 + statistic.setPropertyCount(thingsCount.getPropertyCount()); + statistic.setFunctionCount(thingsCount.getFunctionCount()); + statistic.setEventCount(thingsCount.getEventCount()); + statistic.setMonitorCount(thingsCount.getMonitorCount()); + return statistic; + } + + /** + * 根据设备编号查询设备 + * + * @param serialNumber 设备主键 + * @return 设备 + */ + @Override + public Device selectDeviceBySerialNumber(String serialNumber) { + Device device = deviceMapper.selectDeviceBySerialNumber(serialNumber); + if (device != null) { + // redis中获取设备状态(物模型值) + List list = getCacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + if (list != null && list.size() > 0) { + device.setThingsModelValue(JSONObject.toJSONString(list)); + } + } + return device; + } + + /** + * 根据设备编号查询简洁设备 + * + * @param serialNumber 设备主键 + * @return 设备 + */ + @Override + public Device selectShortDeviceBySerialNumber(String serialNumber) { + Device device = deviceMapper.selectShortDeviceBySerialNumber(serialNumber); + if (device != null) { + // redis中获取设备状态(物模型值) + List list = getCacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + if (list != null && list.size() > 0) { + device.setThingsModelValue(JSONObject.toJSONString(list)); + } + } + return device; + } + + /** + * 根据设备编号查询设备认证信息 + * + * @param model 设备编号和产品ID + * @return 设备 + */ + @Override + public ProductAuthenticateModel selectProductAuthenticate(AuthenticateInputModel model) { + return deviceMapper.selectProductAuthenticate(model); + } + + + + @Override + @Transactional(rollbackFor = Exception.class) + public List reportDeviceThingsModelValue(ThingsModelValuesInput input, int type, boolean isShadow) { + String key = RedisKeyBuilder.buildTSLVCacheKey(input.getProductId(), input.getDeviceNumber()); + Map maps = new HashMap(); + List list = new ArrayList<>(); + for (ThingsModelSimpleItem item : input.getThingsModelValueRemarkItem()) { + String identity = item.getId(); + Integer slaveId = input.getSlaveId() == null ? item.getSlaveId() : input.getSlaveId(); + String serialNumber = slaveId == null ? input.getDeviceNumber() : input.getDeviceNumber()+"_"+ slaveId; + if (identity.startsWith("array_")) { + identity = identity.substring(9); + } + // 查询redis中物模型 + identity = identity + (slaveId != null ? "#" + slaveId : ""); + PropertyDto dto = thingsModelService.getSingleThingModels(input.getProductId(), identity); + if (null == dto) { + continue; + } + String id = item.getId(); + String value = item.getValue(); + + + /* ★★★★★★★★★★★★★★★★★★★★★★ 处理数据 - 开始 ★★★★★★★★★★★★★★★★★★★★★★*/ + String cacheValue = redisCache.getCacheMapValue(key, identity); + ValueItem valueItem = JSON.parseObject(cacheValue, ValueItem.class); + if (null == valueItem) { + valueItem = new ValueItem(id,dto.getTempSlaveId(),id); + } + if (id.startsWith("array_")) { + // 查询是否有缓存,如果没有先进行缓存 + if (!redisCache.containsKey(key)) { + Device device = this.selectDeviceBySerialNumber(input.getDeviceNumber()); + this.selectDeviceByDeviceId(device.getDeviceId()); + } + + int index = Integer.parseInt(id.substring(6, 8)); + if (isShadow) { + String[] shadows = valueItem.getShadow().split(","); + shadows[index] = value; + valueItem.setShadow(String.join(",", shadows)); + } else { + // 设置值,获取数组值,然后替换其中元素 + valueItem.setTs(DateUtils.getNowDate()); + String[] values = valueItem.getValue().split(","); + values[index] = value; + valueItem.setValue(String.join(",", values)); + + String[] shadows = valueItem.getShadow().split(","); + shadows[index] = value; + valueItem.setShadow(String.join(",", shadows)); + } + redisCache.setCacheMapValue(key,identity,JSONObject.toJSONString(valueItem)); + //maps.put(identity, JSONObject.toJSONString(valueItem)); + } else { + if (isShadow) { + valueItem.setShadow(value); + } else { + valueItem.setValue(value); + valueItem.setShadow(value); + valueItem.setTs(DateUtils.getNowDate()); + } + maps.put(identity, JSONObject.toJSONString(valueItem)); + } + /* ★★★★★★★★★★★★★★★★★★★★★★ 处理数据 - 结束 ★★★★★★★★★★★★★★★★★★★★★★*/ + + /*★★★★★★★★★★★★★★★★★★★★★★ 存储数据 - 开始 ★★★★★★★★★★★★★★★★★★★★★★*/ + if (null != dto.getIsHistory()) { + + } + list.add(item); + } + redisCache.hashPutAll(key, maps); + /* ★★★★★★★★★★★★★★★★★★★★★★ 存储数据 - 结束 ★★★★★★★★★★★★★★★★★★★★★★*/ + return list; + } + + /** + * 查询设备列表 + * + * @param device 设备 + * @return 设备 + */ + @Override + public List selectDeviceList(Device device) { + SysUser user = getLoginUser().getUser(); + List roles = user.getRoles(); + for (int i = 0; i < roles.size(); i++) { + if (roles.get(i).getRoleKey().equals("tenant")) { + // 租户查看产品下所有设备 + device.setTenantId(user.getUserId()); + } else if (roles.get(i).getRoleKey().equals("general")) { + // 用户查看自己设备 + device.setUserId(user.getUserId()); + } + } + return deviceMapper.selectDeviceList(device); + } + + /** + * 查询未分配授权码设备列表 + * + * @param device 设备 + * @return 设备 + */ + @Override + public List selectUnAuthDeviceList(Device device) { + SysUser user = getLoginUser().getUser(); + List roles = user.getRoles(); + for (int i = 0; i < roles.size(); i++) { + if (roles.get(i).getRoleKey().equals("tenant")) { + // 租户查看产品下所有设备 + device.setTenantId(user.getUserId()); + } else if (roles.get(i).getRoleKey().equals("general")) { + // 用户查看自己设备 + device.setUserId(user.getUserId()); + } + } + return deviceMapper.selectUnAuthDeviceList(device); + } + + /** + * 查询分组可添加设备分页列表(分组用户与设备用户匹配) + * + * @param device 设备 + * @return 设备 + */ + @Override + public List selectDeviceListByGroup(Device device) { + SysUser user = getLoginUser().getUser(); + List roles = user.getRoles(); + for (int i = 0; i < roles.size(); i++) { + if (roles.get(i).getRoleKey().equals("tenant")) { + // 租户查看产品下所有设备 + device.setTenantId(user.getUserId()); + } else if (roles.get(i).getRoleKey().equals("general")) { + // 用户查看自己设备 + device.setUserId(user.getUserId()); + } + } + return deviceMapper.selectDeviceListByGroup(device); + } + + /** + * 查询所有设备简短列表 + * + * @return 设备 + */ + @Override + public List selectAllDeviceShortList() { + Device device = new Device(); + SysUser user = getLoginUser().getUser(); + List roles = user.getRoles(); + for (SysRole role : roles) { + if (role.getRoleKey().equals("tenant")) { + // 租户查看产品下所有设备 + device.setTenantId(user.getUserId()); + break; + } else if (role.getRoleKey().equals("general")) { + // 用户查看自己设备 + device.setUserId(user.getUserId()); + break; + } + } + return deviceMapper.selectAllDeviceShortList(device); + } + + /** + * 查询设备分页简短列表 + * + * @param device 设备 + * @return 设备 + */ + @Override + public List selectDeviceShortList(Device device) { + SysUser user = getLoginUser().getUser(); + List roles = user.getRoles(); + for (int i = 0; i < roles.size(); i++) { + if (roles.get(i).getRoleKey().equals("tenant")) { + // 租户查看产品下所有设备 + device.setTenantId(user.getUserId()); + break; + } else if (roles.get(i).getRoleKey().equals("general")) { + // 用户查看自己设备 + device.setUserId(user.getUserId()); + break; + } + } + List deviceList = deviceMapper.selectDeviceShortList(device); + return deviceList; + } + + /** + * 查询设备 + * + * @param deviceId 设备主键 + * @return 设备 + */ + @Override + public DeviceShortOutput selectDeviceRunningStatusByDeviceId(Long deviceId, Integer slaveId) { + DeviceShortOutput device = deviceMapper.selectDeviceRunningStatusByDeviceId(deviceId); + JSONObject thingsModelObject = JSONObject.parseObject(thingsModelService.getCacheThingsModelByProductId(device.getProductId())); + JSONArray properties = thingsModelObject.getJSONArray("properties"); + JSONArray functions = thingsModelObject.getJSONArray("functions"); + List thingsModelValueItems = getCacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + // 物模型转换赋值 + List thingsList = new ArrayList<>(); + //判断一下properties 和 functions是否为空, 否则报空指针 + if (!CollectionUtils.isEmpty(properties)) { + thingsList.addAll(convertJsonToThingsList(properties, thingsModelValueItems, 1)); + } + if (!CollectionUtils.isEmpty(functions)) { + thingsList.addAll(convertJsonToThingsList(functions, thingsModelValueItems, 2)); + } + // 排序 + thingsList = thingsList.stream() + .filter(model -> { + if (null != slaveId) { + return model.getSlaveId().intValue() == slaveId.intValue(); + } + return true; + }) + .sorted(Comparator.comparing(ThingsModel::getOrder).reversed()).collect(Collectors.toList()); + device.setThingsModels(thingsList); + device.setThingsModelValue(""); + return device; + } + + /** + * 物模型基本类型转换赋值 + * + * @param jsonArray + * @param thingsModelValues + * @param type + * @return + */ + @Async + public List convertJsonToThingsList(JSONArray jsonArray, List thingsModelValues, Integer type) { + List thingsModelList = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + ThingsModel thingsModel = new ThingsModel(); + JSONObject thingsJson = jsonArray.getJSONObject(i); + JSONObject datatypeJson = thingsJson.getJSONObject("datatype"); + thingsModel.setId(thingsJson.getString("id")); + thingsModel.setName(thingsJson.getString("name")); + thingsModel.setIsMonitor(thingsJson.getInteger("isMonitor") == null ? 0 : thingsJson.getInteger("isMonitor")); + thingsModel.setIsReadonly(thingsJson.getInteger("isReadonly") == null ? 0 : thingsJson.getInteger("isReadonly")); + thingsModel.setIsChart(thingsJson.getInteger("isChart") == null ? 0 : thingsJson.getInteger("isChart")); + thingsModel.setIsSharePerm(thingsJson.getInteger("isSharePerm") == null ? 0 : thingsJson.getInteger("isSharePerm")); + thingsModel.setIsHistory(thingsJson.getInteger("isHistory") == null ? 0 : thingsJson.getInteger("isHistory")); + thingsModel.setOrder(thingsJson.getInteger("order") == null ? 0 : thingsJson.getInteger("order")); + thingsModel.setType(type); + thingsModel.setSlaveId(thingsJson.getInteger("tempSlaveId")); + thingsModel.setRegId(thingsJson.getString("regId")); + // 获取value + for (ThingsModelValueItem valueItem : thingsModelValues) { + if (valueItem.getId().equals(thingsModel.getId()) || valueItem.getId().equals(thingsModel.getRegId())) { + thingsModel.setValue(valueItem.getValue()); + thingsModel.setShadow(valueItem.getShadow()); + thingsModel.setTs(valueItem.getTs()); + break; + } + } + // json转DataType(DataType赋值) + Datatype dataType = convertJsonToDataType(datatypeJson, thingsModelValues, type, thingsModel.getId() + "_"); + thingsModel.setDatatype(dataType); + if (JsonUtils.isJson(thingsModel.getValue())){ + JSONObject jsonObject = JSONObject.parseObject(thingsModel.getValue()); + for (EnumItem enumItem : dataType.getEnumList()) { + ThingsModel model = new ThingsModel(); + BeanUtils.copyProperties(thingsModel,model); + String val = jsonObject.getString(enumItem.getValue()); + model.setValue(val); + model.setName(enumItem.getValue()); + thingsModelList.add(model); + } + }else { + // 物模型项添加到集合 + thingsModelList.add(thingsModel); + } + } + return thingsModelList; + } + + /** + * 物模型DataType转换 + * + * @param datatypeJson + * @param thingsModelValues + * @param type + * @param parentIdentifier 上级标识符 + * @return + */ + private Datatype convertJsonToDataType(JSONObject datatypeJson, List thingsModelValues, Integer type, String parentIdentifier) { + Datatype dataType = new Datatype(); + //有些物模型数据定义为空的情况兼容 + if (datatypeJson == null) { + return dataType; + } + dataType.setType(datatypeJson.getString("type")); + if (dataType.getType().equals("decimal")) { + dataType.setMax(datatypeJson.getBigDecimal("max")); + dataType.setMin(datatypeJson.getBigDecimal("min")); + dataType.setStep(datatypeJson.getBigDecimal("step")); + dataType.setUnit(datatypeJson.getString("unit")); + } else if (dataType.getType().equals("integer")) { + dataType.setMax(datatypeJson.getBigDecimal("max")); + dataType.setMin(datatypeJson.getBigDecimal("min")); + dataType.setStep(datatypeJson.getBigDecimal("step")); + dataType.setUnit(datatypeJson.getString("unit")); + } else if (dataType.getType().equals("bool")) { + dataType.setFalseText(datatypeJson.getString("falseText")); + dataType.setTrueText(datatypeJson.getString("trueText")); + } else if (dataType.getType().equals("string")) { + dataType.setMaxLength(datatypeJson.getInteger("maxLength")); + } else if (dataType.getType().equals("enum")) { + List enumItemList = JSON.parseArray(datatypeJson.getString("enumList"), EnumItem.class); + dataType.setEnumList(enumItemList); + dataType.setShowWay(datatypeJson.getString("showWay")); + } else if (dataType.getType().equals("object")) { + JSONArray jsonArray = JSON.parseArray(datatypeJson.getString("params")); + // 物模型值过滤(parentId_开头) + thingsModelValues = thingsModelValues.stream().filter(x -> x.getId().startsWith(parentIdentifier)).collect(Collectors.toList()); + List thingsList = convertJsonToThingsList(jsonArray, thingsModelValues, type); + // 排序 + thingsList = thingsList.stream().sorted(Comparator.comparing(ThingsModel::getOrder).reversed()).collect(Collectors.toList()); + dataType.setParams(thingsList); + } else if (dataType.getType().equals("array")) { + dataType.setArrayType(datatypeJson.getString("arrayType")); + dataType.setArrayCount(datatypeJson.getInteger("arrayCount")); + if ("object".equals(dataType.getArrayType())) { + // 对象数组 + JSONArray jsonArray = datatypeJson.getJSONArray("params"); + // 物模型值过滤(parentId_开头) + thingsModelValues = thingsModelValues.stream().filter(x -> x.getId().startsWith(parentIdentifier)).collect(Collectors.toList()); + List thingsList = convertJsonToThingsList(jsonArray, thingsModelValues, type); + // 排序 + thingsList = thingsList.stream().sorted(Comparator.comparing(ThingsModel::getOrder).reversed()).collect(Collectors.toList()); + // 数组类型物模型里面对象赋值 + List[] arrayParams = new List[dataType.getArrayCount()]; + for (int i = 0; i < dataType.getArrayCount(); i++) { + List thingsModels = new ArrayList<>(); + for (int j = 0; j < thingsList.size(); j++) { + ThingsModel thingsModel = new ThingsModel(); + BeanUtils.copyProperties(thingsList.get(j), thingsModel); + String shadow = thingsList.get(j).getShadow(); + if (StringUtils.isNotEmpty(shadow) && !shadow.equals("")) { + String[] shadows = shadow.split(","); + if(i+1 > shadows.length){ + // 解决产品取消发布,增加数组长度导致设备影子和值赋值失败 + thingsModel.setShadow(" "); + }else{ + thingsModel.setShadow(shadows[i]); + } + } + String value = thingsList.get(j).getValue(); + if (StringUtils.isNotEmpty(value) && !value.equals("")) { + String[] values = value.split(","); + if(i+1 > values.length){ + thingsModel.setValue(" "); + }else{ + thingsModel.setValue(values[i]); + } + } + thingsModels.add(thingsModel); + } + arrayParams[i] = thingsModels; + } + dataType.setArrayParams(arrayParams); + } + } + return dataType; + } + + /** + * 新增设备 + * + * @param device 设备 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Device insertDevice(Device device) { + // 设备编号唯一检查 + Device existDevice = deviceMapper.selectDeviceBySerialNumber(device.getSerialNumber()); + if (existDevice != null) { + log.error("设备编号:" + device.getSerialNumber() + "已经存在了,新增设备失败"); + throw new ServiceException("设备编号:" + device.getSerialNumber() + " 已经存在,新增失败"); + } + SysUser sysUser = getLoginUser().getUser(); + //添加设备 + device.setCreateTime(DateUtils.getNowDate()); + device.setUserId(sysUser.getUserId()); + device.setUserName(sysUser.getUserName()); + device.setRssi(0); + + // 设置租户 + Product product = productService.selectProductByProductId(device.getProductId()); + device.setTenantId(product.getTenantId()); + device.setTenantName(product.getTenantName()); + device.setImgUrl(product.getImgUrl()); + // 随机经纬度和地址 + SysUser user = getLoginUser().getUser(); + device.setNetworkIp(user.getLoginIp()); + //setLocation(user.getLoginIp(), device); + + deviceMapper.insertDevice(device); + // 添加设备用户 + DeviceUser deviceUser = new DeviceUser(); + deviceUser.setUserId(sysUser.getUserId()); + deviceUser.setUserName(sysUser.getUserName()); + deviceUser.setPhonenumber(sysUser.getPhonenumber()); + deviceUser.setDeviceId(device.getDeviceId()); + deviceUser.setDeviceName(device.getDeviceName()); + deviceUser.setTenantId(product.getTenantId()); + deviceUser.setTenantName(product.getTenantName()); + deviceUser.setIsOwner(1); + deviceUser.setCreateTime(DateUtils.getNowDate()); + int result = deviceUserMapper.insertDeviceUser(deviceUser); + + // redis缓存设备默认状态(物模型值) + cacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + + // 返回设备信息 + List list = getCacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + if (list != null && list.size() > 0) { + device.setThingsModelValue(JSONObject.toJSONString(list)); + } + /*查询子设备*/ + Device subBo = new Device(); + subBo.setGwDevCode(device.getSerialNumber()); + List subDeviceList = deviceMapper.selectDeviceList(subBo); + //获取子设备的首地址 + if (!CollectionUtils.isEmpty(subDeviceList)) { + device.setSlaveId(subDeviceList.get(0).getSlaveId()); + } + device.setSubDeviceList(subDeviceList); + return device; + } + + /** + * 设备关联用户 + * + * @param deviceRelateUserInput + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult deviceRelateUser(DeviceRelateUserInput deviceRelateUserInput) { + // 查询用户信息 + SysUser sysUser = userService.selectUserById(deviceRelateUserInput.getUserId()); + for (int i = 0; i < deviceRelateUserInput.getDeviceNumberAndProductIds().size(); i++) { + Device existDevice = deviceMapper.selectDeviceBySerialNumber(deviceRelateUserInput.getDeviceNumberAndProductIds().get(i).getDeviceNumber()); + if (existDevice != null) { + if (existDevice.getUserId().longValue() == deviceRelateUserInput.getUserId().longValue()) { + return AjaxResult.error("用户已经拥有设备:" + existDevice.getDeviceName() + ", 设备编号:" + existDevice.getSerialNumber()); + } + // 先删除设备的所有用户 + deviceUserMapper.deleteDeviceUserByDeviceId(new UserIdDeviceIdModel(null, existDevice.getDeviceId())); + // 添加新的设备用户 + DeviceUser deviceUser = new DeviceUser(); + deviceUser.setUserId(sysUser.getUserId()); + deviceUser.setUserName(sysUser.getUserName()); + deviceUser.setPhonenumber(sysUser.getPhonenumber()); + deviceUser.setDeviceId(existDevice.getDeviceId()); + deviceUser.setDeviceName(existDevice.getDeviceName()); + deviceUser.setTenantId(existDevice.getTenantId()); + deviceUser.setTenantName(existDevice.getTenantName()); + deviceUser.setIsOwner(1); + deviceUser.setCreateTime(DateUtils.getNowDate()); + deviceUserMapper.insertDeviceUser(deviceUser); + // 更新设备用户信息 + existDevice.setUserId(deviceRelateUserInput.getUserId()); + existDevice.setUserName(sysUser.getUserName()); + deviceMapper.updateDevice(existDevice); + } else { + // 自动添加设备 + int result = insertDeviceAuto( + deviceRelateUserInput.getDeviceNumberAndProductIds().get(i).getDeviceNumber(), + deviceRelateUserInput.getUserId(), + deviceRelateUserInput.getDeviceNumberAndProductIds().get(i).getProductId()); + if (result == 0) { + return AjaxResult.error("设备不存在,自动添加设备时失败,请检查产品编号是否正确"); + } + } + } + return AjaxResult.success("添加设备成功"); + } + + /** + * 设备认证后自动添加设备 + * + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertDeviceAuto(String serialNumber, Long userId, Long productId) { + // 设备编号唯一检查 + int count = deviceMapper.selectDeviceCountBySerialNumber(serialNumber); + if (count != 0) { + log.error("设备编号:" + serialNumber + "已经存在了,新增设备失败"); + return 0; + } + Device device = new Device(); + device.setSerialNumber(serialNumber); + SysUser user = userService.selectUserById(userId); + device.setUserId(userId); + device.setUserName(user.getUserName()); + device.setFirmwareVersion(BigDecimal.valueOf(1.0)); + // 设备状态(1-未激活,2-禁用,3-在线,4-离线) + device.setStatus(3); + device.setActiveTime(DateUtils.getNowDate()); + device.setIsShadow(0); + device.setRssi(0); + // 1-自动定位,2-设备定位,3-自定义位置 + device.setLocationWay(1); + device.setCreateTime(DateUtils.getNowDate()); + // 随机位置 + device.setLongitude(BigDecimal.valueOf(116.23 - (Math.random() * 15))); + device.setLatitude(BigDecimal.valueOf(39.54 - (Math.random() * 15))); + device.setNetworkAddress("中国"); + device.setNetworkIp("127.0.0.1"); + // 设置租户 + Product product = productService.selectProductByProductId(productId); + if (product == null) { + log.error("自动添加设备时,根据产品ID查找不到对应产品"); + return 0; + } + int random = (int) (Math.random() * (90)) + 10; + device.setDeviceName(product.getProductName() + random); + device.setTenantId(product.getTenantId()); + device.setTenantName(product.getTenantName()); + device.setImgUrl(product.getImgUrl()); + device.setProductId(product.getProductId()); + device.setProductName(product.getProductName()); + deviceMapper.insertDevice(device); + + // 缓存设备状态 + cacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + + // 添加设备用户 + DeviceUser deviceUser = new DeviceUser(); + deviceUser.setUserId(userId); + deviceUser.setUserName(user.getUserName()); + deviceUser.setPhonenumber(user.getPhonenumber()); + deviceUser.setDeviceId(device.getDeviceId()); + deviceUser.setDeviceName(device.getDeviceName()); + deviceUser.setTenantId(product.getTenantId()); + deviceUser.setTenantName(product.getTenantName()); + deviceUser.setIsOwner(1); + return deviceUserMapper.insertDeviceUser(deviceUser); + } + + /** + * 获取用户操作设备的影子值 + * + * @param device + * @return + */ + @Override + public ThingsModelShadow getDeviceShadowThingsModel(Device device) { + // 物模型值 + List thingsModelValueItems = getCacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + ThingsModelShadow shadow = new ThingsModelShadow(); + // 查询出设置的影子值 + List shadowList = new ArrayList<>(); + for (ThingsModelValueItem item : thingsModelValueItems) { + if (!item.getValue().equals(item.getShadow()) && !item.getShadow().equals("")) { + //处理id + String id = item.getId(); + //modbus类型 + if (id.contains("#")) { + id = id.split("#")[0]; + ThingsModelSimpleItem shaowItem = new ThingsModelSimpleItem(id, item.getShadow(), item.getTempSlaveId(), ""); + shadow.getProperties().add(shaowItem); + } else if (item.getShadow().contains(",")) { + String[] shadows = item.getShadow().split(","); + String[] values = item.getValue().split(","); + for (int i = 0; i < shadows.length; i++) { + String value = values[i]; + String shaVal = shadows[i]; + if (!shaVal.equals(value)) { + id = "array_0" + i + "_" + id; + ThingsModelSimpleItem shaowItem = new ThingsModelSimpleItem(id, shaVal, ""); + shadow.getProperties().add(shaowItem); + } + } + } else { + ThingsModelSimpleItem shaowItem = new ThingsModelSimpleItem(id, item.getShadow(), ""); + shadow.getProperties().add(shaowItem); + } + } + } + return shadow; + } + + + /** + * 修改设备 + * + * @param device 设备 + * @return 结果 + */ + @Override + public AjaxResult updateDevice(Device device) { + // 设备编号唯一检查 + Device oldDevice = deviceMapper.selectDeviceByDeviceId(device.getDeviceId()); + if (!oldDevice.getSerialNumber().equals(device.getSerialNumber())) { + Device existDevice = deviceMapper.selectDeviceBySerialNumber(device.getSerialNumber()); + if (existDevice != null) { + log.error("设备编号:" + device.getSerialNumber() + " 已经存在,新增设备失败"); + return AjaxResult.error("设备编号:" + device.getSerialNumber() + " 已经存在,修改失败", 0); + } + } + device.setUpdateTime(DateUtils.getNowDate()); + // 未激活状态,可以修改产品以及物模型值 + if (device.getStatus() == 1) { + // 缓存设备状态(物模型值) + cacheDeviceStatus(device.getProductId(), device.getSerialNumber()); + + } else { + device.setProductId(null); + device.setProductName(null); + } + deviceMapper.updateDevice(device); + // 更新前设备状态为禁用,启用后状态默认为离线,满足时下发获取设备最新状态指令 + if (oldDevice.getStatus() == 2 && device.getStatus() == 4) { + // 发布设备信息,设备收到该消息后上报最新状态 + // emqxService.publishInfo(oldDevice.getProductId(), oldDevice.getSerialNumber()); + } + return AjaxResult.success("修改成功", 1); + } + + /** + * 生成设备唯一编号 + * + * @return 结果 + */ + @Override + public String generationDeviceNum(Integer type) { + // 设备编号:D + userId + 15位随机字母和数字 + SysUser user = getLoginUser().getUser(); + String number; + //Hex随机字符串 + if (type == 3){ + number = toolService.generateRandomHex(12); + }else { + number = "D" + user.getUserId().toString() + toolService.getStringRandom(10); + } + int count = deviceMapper.getDeviceNumCount(number); + if (count == 0) { + return number; + } else { + generationDeviceNum(type); + } + return ""; + } + + /** + * @param device 设备状态和定位更新 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateDeviceStatusAndLocation(Device device, String ipAddress) { + // 设置自动定位和状态 + if (ipAddress != "") { + if (device.getActiveTime() == null) { + device.setActiveTime(DateUtils.getNowDate()); + } + // 定位方式(1=ip自动定位,2=设备定位,3=自定义) + if (device.getLocationWay() == 1) { + device.setNetworkIp(ipAddress); + //setLocation(ipAddress, device); + } + } + int result = deviceMapper.updateDeviceStatus(device); + // 添加到设备日志 + EventLog event = new EventLog(); + event.setDeviceId(device.getDeviceId()); + event.setDeviceName(device.getDeviceName()); + event.setSerialNumber(device.getSerialNumber()); + event.setIsMonitor(0); + event.setUserId(device.getUserId()); + event.setUserName(device.getUserName()); + event.setTenantId(device.getTenantId()); + event.setTenantName(device.getTenantName()); + event.setCreateTime(DateUtils.getNowDate()); + // 日志模式 1=影子模式,2=在线模式,3=其他 + event.setMode(3); + if (device.getStatus() == 3) { + event.setLogValue("1"); + event.setRemark("设备上线"); + event.setIdentity("online"); + event.setLogType(5); + } else if (device.getStatus() == 4) { + event.setLogValue("0"); + event.setRemark("设备离线"); + event.setIdentity("offline"); + event.setLogType(6); + } + eventLogMapper.insertEventLog(event); + return result; + } + + /** + * @param device 设备状态 + * @return 结果 + */ + @Override + public int updateDeviceStatus(Device device) { + return deviceMapper.updateDeviceStatus(device); + } + + /** + * 更新固件版本 + * + * @param device + * @return + */ + @Override + public int updateDeviceFirmwareVersion(Device device) { + return deviceMapper.updateDeviceFirmwareVersion(device); + } + + /** + * 上报设备信息 + * + * @param device 设备 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int reportDevice(Device device, Device deviceEntity) { + // 未采用设备定位则清空定位,定位方式(1=ip自动定位,2=设备定位,3=自定义) + if (deviceEntity.getLocationWay() != 2) { + device.setLatitude(null); + device.setLongitude(null); + } + int result = 0; + if (deviceEntity != null && device.getUserId() != null) { + // 通过配网或者扫码关联设备后,设备的用户信息需要变更 + if (deviceEntity.getUserId().longValue() != device.getUserId().longValue()) { + // 先删除设备的所有用户 + deviceUserMapper.deleteDeviceUserByDeviceId(new UserIdDeviceIdModel(null, deviceEntity.getDeviceId())); + // 添加新的设备用户 + SysUser sysUser = userService.selectUserById(device.getUserId()); + DeviceUser deviceUser = new DeviceUser(); + deviceUser.setUserId(sysUser.getUserId()); + deviceUser.setUserName(sysUser.getUserName()); + deviceUser.setPhonenumber(sysUser.getPhonenumber()); + deviceUser.setDeviceId(deviceEntity.getDeviceId()); + deviceUser.setDeviceName(deviceEntity.getDeviceName()); + deviceUser.setTenantId(deviceEntity.getTenantId()); + deviceUser.setTenantName(deviceEntity.getTenantName()); + deviceUser.setIsOwner(1); + deviceUser.setCreateTime(DateUtils.getNowDate()); + deviceUserMapper.insertDeviceUser(deviceUser); + // 更新设备用户信息 + device.setUserId(device.getUserId()); + device.setUserName(sysUser.getUserName()); + } + device.setUpdateTime(DateUtils.getNowDate()); + if (deviceEntity.getActiveTime() == null || deviceEntity.getActiveTime().equals("")) { + device.setActiveTime(DateUtils.getNowDate()); + } + // 不更新物模型 + device.setThingsModelValue(null); + result = deviceMapper.updateDeviceBySerialNumber(device); + } + return result; + } + + /** + * 重置设备状态 + * + * @return 结果 + */ + @Override + public int resetDeviceStatus(String deviceNum) { + int result = deviceMapper.resetDeviceStatus(deviceNum); + return result; + } + + /** + * 删除设备 + * + * @param deviceId 需要删除的设备主键 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteDeviceByDeviceId(Long deviceId) throws SchedulerException { + SysUser user = getLoginUser().getUser(); + // 是否为普通用户,普通用户如果不是设备所有者,只能删除设备用户和用户自己的设备关联分组信息 + boolean isGeneralUser = false; + List roles = user.getRoles(); + for (int i = 0; i < roles.size(); i++) { + if (roles.get(i).getRoleKey().equals("general")) { + isGeneralUser = true; + break; + } + } + Device device = deviceMapper.selectDeviceByDeviceId(deviceId); + if (isGeneralUser && device.getUserId().longValue() != user.getUserId()) { + // 删除用户分组中的设备 普通用户,且不是设备所有者。 + deviceMapper.deleteDeviceGroupByDeviceId(new UserIdDeviceIdModel(user.getUserId(), deviceId)); + // 删除用户的设备用户信息。 + deviceUserMapper.deleteDeviceUserByDeviceId(new UserIdDeviceIdModel(user.getUserId(), deviceId)); + } else { + // 删除设备分组。 租户、管理员和设备所有者 + deviceMapper.deleteDeviceGroupByDeviceId(new UserIdDeviceIdModel(null, deviceId)); + // 删除设备用户。 + deviceUserMapper.deleteDeviceUserByDeviceId(new UserIdDeviceIdModel(null, deviceId)); + // 删除定时任务 TODO - emq兼容 + // deviceJobService.deleteJobByDeviceIds(new Long[]{deviceId}); + // 批量删除设备监测日志 + logService.deleteDeviceLogByDeviceNumber(device.getSerialNumber()); + // 批量删除设备事件日志 DeviceNumber + eventLogService.deleteEventLogByDeviceNumber(device.getSerialNumber()); + // 批量删除设备功能日志 + functionLogService.deleteFunctionLogByDeviceNumber(device.getSerialNumber()); + // redis中删除设备物模型(状态) + String key = RedisKeyBuilder.buildTSLVCacheKey(device.getProductId(), device.getSerialNumber()); + redisCache.deleteObject(key); + // 删除设备 + deviceMapper.deleteDeviceByDeviceIds(new Long[]{deviceId}); + } + //查询是否有子设备 + Integer subDeviceCount = this.getSubDeviceCount(device.getSerialNumber()); + if (null != subDeviceCount && subDeviceCount > 0) { + this.deleteSubDevice(device.getSerialNumber()); + } + return 1; + } + + /** + * 根据网关编号删除子设备 + * + * @param gwCode + */ + @Override + public void deleteSubDevice(String gwCode) { + deviceMapper.deleteSubDevice(gwCode); + } + + /** + * 根据设备编号查询协议编码 + * + * @param serialNumber + * @return + */ + @Override + public Map selectProtocolBySerialNumber(String serialNumber) { + return deviceMapper.selectProtocolBySerialNumber(serialNumber); + } + + /** + * 查询产品下所有设备,返回设备编号 + * + * @param productId 产品id + * @return + */ + @Override + public List selectDevicesByProductId(Long productId, Integer hasSub) { + return deviceMapper.selectDevicesByProductId(productId, hasSub); + } + + /** + * 查询子设备总数 + * + * @param gwDevCode 网关编号 + * @return 数量 + */ + @Override + public Integer getSubDeviceCount(String gwDevCode) { + return deviceMapper.getSubDeviceCount(gwDevCode); + } + + + /** + * 批量更新设备状态 + * + * @param serialNumbers 设备ids + * @param status 状态 + */ + @Override + public void batchChangeStatus(List serialNumbers, DeviceStatus status) { + if (CollectionUtils.isEmpty(serialNumbers)) { + return; + } + //设备离线 + if (DeviceStatus.OFFLINE.equals(status)) { + deviceMapper.batchChangeOffline(serialNumbers); + } else if (DeviceStatus.ONLINE.equals(status)) { + deviceMapper.batchChangeOnline(serialNumbers); + } + deviceCache.updateBatchDeviceStatusCache(serialNumbers, status); + } + + /** + * 查询在线的modbus网关设备 + * + * @return + */ + @Override + public List selectOnlineModbusDevices() { + return deviceMapper.selectOnlineModbusDevices(); + } + + /** + * 根据设备编号查询设备信息 -不带缓存物模型值 + * + * @param serialNumber + * @return + */ + @Override + public Device selectDeviceNoModel(String serialNumber) { + return deviceMapper.selectDeviceBySerialNumber(serialNumber); + } + + /** + * 获取设备MQTT连接参数 + * @param deviceId 设备id + * @return + */ + @Override + public DeviceMqttConnectVO getMqttConnectData(Long deviceId) { + DeviceMqttConnectVO connectVO = new DeviceMqttConnectVO(); + DeviceMqttVO deviceMqttVO = deviceMapper.selectMqttConnectData(deviceId); + if (deviceMqttVO == null) { + throw new ServiceException("获取设备MQTT连接参数失败"); + } + // 不管认证方式,目前就只返回简单认证方式 + String password; + if (ProductAuthConstant.AUTHORIZE.equals(deviceMqttVO.getIsAuthorize())) { + // 查询产品授权码 + List productAuthorizeList = productAuthorizeService.listByProductId(deviceMqttVO.getProductId()); + if (CollectionUtils.isEmpty(productAuthorizeList)) { + throw new ServiceException("产品已启用授权,获取设备授权码失败,请先配置授权码"); + } + List collect = productAuthorizeList.stream().filter(p -> p.getProductId().equals(deviceMqttVO.getDeviceId())).collect(Collectors.toList()); + ProductAuthorize productAuthorize = CollectionUtils.isEmpty(collect) ? productAuthorizeList.get(0) : collect.get(0); + password = deviceMqttVO.getMqttPassword() + "&" + productAuthorize.getAuthorizeCode(); + } else { + password = deviceMqttVO.getMqttPassword(); + } + String clientId = ProductAuthConstant.CLIENT_ID_AUTH_TYPE_SIMPLE + "&" + deviceMqttVO.getSerialNumber() + "&" + deviceMqttVO.getProductId() + "&" + deviceMqttVO.getUserId(); + // 组装返回结果 + connectVO.setClientId(clientId).setUsername(deviceMqttVO.getMqttAccount()).setPasswd(password).setPort(brokerPort); + return connectVO; + } + + /** + * 根据IP获取地址 + * + * @param ip + * @return + */ + private void setLocation(String ip, Device device) { + String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + String address = "未知地址"; + // 内网不查询 + if (IpUtils.internalIp(ip)) { + device.setNetworkAddress("内网IP"); + } + try { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (!StringUtils.isEmpty(rspStr)) { + JSONObject obj = JSONObject.parseObject(rspStr); + device.setNetworkAddress(obj.getString("addr")); + System.out.println(device.getSerialNumber() + "- 设置地址:" + obj.getString("addr")); + // 查询经纬度 + setLatitudeAndLongitude(obj.getString("city"), device); + } + } catch (Exception e) { + log.error(e.getMessage()); + } + } + + /** + * 设置经纬度 + * + * @param city + */ + private void setLatitudeAndLongitude(String city, Device device) { + String BAIDU_URL = "https://api.map.baidu.com/geocoder"; + String baiduResponse = HttpUtils.sendGet(BAIDU_URL, "address=" + city + "&output=json", Constants.GBK); + if (!StringUtils.isEmpty(baiduResponse)) { + JSONObject baiduObject = JSONObject.parseObject(baiduResponse); + JSONObject location = baiduObject.getJSONObject("result").getJSONObject("location"); + device.setLongitude(location.getBigDecimal("lng")); + device.setLatitude(location.getBigDecimal("lat")); + System.out.println(device.getSerialNumber() + "- 设置经度:" + location.getBigDecimal("lng") + ",设置纬度:" + location.getBigDecimal("lat")); + } + } + + /** + * 缓存设备状态到redis + * + * @return + */ + public List cacheDeviceStatus(Long productId, String serialNumber) { + // 获取物模型,设置默认值 + String thingsModels = thingsModelService.getCacheThingsModelByProductId(productId); + JSONObject thingsModelObject = JSONObject.parseObject(thingsModels); + JSONArray properties = thingsModelObject.getJSONArray("properties"); + JSONArray functions = thingsModelObject.getJSONArray("functions"); + List valueList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(properties)) { + valueList.addAll(properties.toJavaList(ThingsModelValueItem.class)); + } + if (!CollectionUtils.isEmpty(functions)) { + valueList.addAll(functions.toJavaList(ThingsModelValueItem.class)); + } + String key = RedisKeyBuilder.buildTSLVCacheKey(productId, serialNumber); + Map maps = new HashMap<>(); + for (ThingsModelValueItem item : valueList) { + String id = item.getTempSlaveId() == null ? item.getId() : item.getId() + "#" + item.getTempSlaveId(); + List params = item.getDatatype().getParams(); + ValueItem valueItem = new ValueItem(); + valueItem.setValue(""); + valueItem.setId(id); + valueItem.setName(item.getName()); + valueItem.setShadow(""); + if (null != item.getDatatype()) { + String type = item.getDatatype().getType(); + DataEnum dataEnum = DataEnum.convert(type); + switch (dataEnum) { + case INTEGER: + case DECIMAL: + case STRING: + case ENUM: + if (null != item.getTempSlaveId()) { + valueItem.setSlaveId(item.getTempSlaveId()); + valueItem.setRegArr(item.getId()); + } + maps.put(id, JSONObject.toJSONString(valueItem)); + break; + case ARRAY: + // 数组元素赋值(英文逗号分割的字符串,包含简单类型数组和对象类型数组,数组元素ID格式:array_01_humidity) + String defaultValue = " "; + if (item.getDatatype().getArrayType().equals("object")) { + for (int i = 0; i < item.getDatatype().getArrayCount(); i++) { + // 默认值需要保留为空格,便于解析字符串为数组 + defaultValue = defaultValue + ", "; + } + for (ThingsModel param : params) { + valueItem.setValue(defaultValue); + valueItem.setShadow(defaultValue); + valueItem.setName(param.getName()); + valueItem.setId(param.getId()); + maps.put(param.getId(), JSONObject.toJSONString(valueItem)); + } + } else { + for (int i = 0; i < item.getDatatype().getArrayCount(); i++) { + defaultValue = defaultValue + ", "; + } + valueItem.setValue(defaultValue); + valueItem.setShadow(defaultValue); + valueItem.setName(item.getName()); + valueItem.setId(item.getId()); + maps.put(item.getId(), JSONObject.toJSONString(valueItem)); + } + break; + case OBJECT: + for (ThingsModel param : params) { + valueItem.setName(param.getName()); + valueItem.setId(param.getId()); + maps.put(param.getId(), JSONObject.toJSONString(valueItem)); + } + break; + } + } + } + redisCache.hashPutAll(key, maps); + return valueList; + } + + + private List getCacheDeviceStatus(Long productId, String deviceNumber) { + String key = RedisKeyBuilder.buildTSLVCacheKey(productId, deviceNumber); + Map map = redisCache.hashEntity(key); + List valueList = new ArrayList<>(); + if (map == null || map.size() == 0) { + // 缓存设备状态(物模型值)到redis + valueList = cacheDeviceStatus(productId, deviceNumber); + } else { + // 获取redis缓存的物模型值 + valueList = map.values().stream().map(s -> JSONObject.parseObject(s, ThingsModelValueItem.class)) + .collect(Collectors.toList()); + } + return valueList; + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceUserServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceUserServiceImpl.java new file mode 100644 index 00000000..b4a53c83 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceUserServiceImpl.java @@ -0,0 +1,146 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.DeviceUser; +import com.fastbee.iot.mapper.DeviceUserMapper; +import com.fastbee.iot.model.UserIdDeviceIdModel; +import com.fastbee.iot.service.IDeviceUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 设备用户Service业务层处理 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +public class DeviceUserServiceImpl implements IDeviceUserService +{ + @Autowired + private DeviceUserMapper deviceUserMapper; + + /** + * 查询设备用户 + * + * @param deviceId 设备用户主键 + * @return 设备用户 + */ + @Override + public List selectDeviceUserByDeviceId(Long deviceId) + { + return deviceUserMapper.selectDeviceUserByDeviceId(deviceId); + } + + /** + * 查询设备用户列表 + * + * @param deviceUser 设备用户 + * @return 设备用户 + */ + @Override + public List selectDeviceUserList(DeviceUser deviceUser) + { + return deviceUserMapper.selectDeviceUserList(deviceUser); + } + + /** + * 查询设备分享用户 + * + * @param deviceUser 设备用户 + * @return 设备用户 + */ + @Override + public SysUser selectShareUser(DeviceUser deviceUser) + { + return deviceUserMapper.selectShareUser(deviceUser); + } + + /** + * 新增设备用户 + * + * @param deviceUser 设备用户 + * @return 结果 + */ + @Override + public int insertDeviceUser(DeviceUser deviceUser) + { + List deviceUsers = selectDeviceUserList(deviceUser); + if (!deviceUsers.isEmpty()) { throw new RuntimeException("该用户已添加, 禁止重复添加");} + deviceUser.setCreateTime(DateUtils.getNowDate()); + deviceUser.setIsOwner(0); + SysUser sysUser = getLoginUser().getUser(); + deviceUser.setTenantId(sysUser.getUserId()); + deviceUser.setTenantName(sysUser.getUserName()); + return deviceUserMapper.insertDeviceUser(deviceUser); + } + + /** + * 修改设备用户 + * + * @param deviceUser 设备用户 + * @return 结果 + */ + @Override + public int updateDeviceUser(DeviceUser deviceUser) + { + deviceUser.setUpdateTime(DateUtils.getNowDate()); + return deviceUserMapper.updateDeviceUser(deviceUser); + } + + /** + * 批量删除设备用户 + * + * @param deviceIds 需要删除的设备用户主键 + * @return 结果 + */ + @Override + public int deleteDeviceUserByDeviceIds(Long[] deviceIds) + { + return deviceUserMapper.deleteDeviceUserByDeviceIds(deviceIds); + } + + /** + * 删除设备用户信息 + * + * @param deviceId 设备用户主键 + * @return 结果 + */ + @Override + public int deleteDeviceUserByDeviceId(Long deviceId) + { + return deviceUserMapper.deleteDeviceUserByDeviceId(new UserIdDeviceIdModel(null,deviceId)); + } + + @Override + public int insertDeviceUserList(List deviceUsers) { + try { + deviceUsers.forEach(deviceUser -> { + deviceUser.setCreateTime(DateUtils.getNowDate()); + deviceUser.setIsOwner(0); + SysUser sysUser = getLoginUser().getUser(); + deviceUser.setTenantId(sysUser.getUserId()); + deviceUser.setTenantName(sysUser.getUserName()); + }); + return deviceUserMapper.insertDeviceUserList(deviceUsers); + } catch (DuplicateKeyException e) { + throw new RuntimeException("存在设备已经与用户绑定"); + } + } + + @Override + public DeviceUser selectDeviceUserByDeviceIdAndUserId(Long deviceId, Long userId) { + return deviceUserMapper.selectDeviceUserByDeviceIdAndUserId(deviceId, userId); + } + + @Override + public int deleteDeviceUser(DeviceUser deviceUser) { + return deviceUserMapper.deleteDeviceUser(deviceUser); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/EventLogServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/EventLogServiceImpl.java new file mode 100644 index 00000000..5cfa2c95 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/EventLogServiceImpl.java @@ -0,0 +1,116 @@ +package com.fastbee.iot.service.impl; + +import java.util.List; +import com.fastbee.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fastbee.iot.mapper.EventLogMapper; +import com.fastbee.iot.domain.EventLog; +import com.fastbee.iot.service.IEventLogService; + +/** + * 事件日志Service业务层处理 + * + * @author kerwincui + * @date 2023-03-28 + */ +@Service +public class EventLogServiceImpl implements IEventLogService +{ + @Autowired + private EventLogMapper eventLogMapper; + + /** + * 查询事件日志 + * + * @param logId 事件日志主键 + * @return 事件日志 + */ + @Override + public EventLog selectEventLogByLogId(Long logId) + { + return eventLogMapper.selectEventLogByLogId(logId); + } + + /** + * 查询事件日志列表 + * + * @param eventLog 事件日志 + * @return 事件日志 + */ + @Override + public List selectEventLogList(EventLog eventLog) + { + return eventLogMapper.selectEventLogList(eventLog); + } + + /** + * 新增事件日志 + * + * @param eventLog 事件日志 + * @return 结果 + */ + @Override + public int insertEventLog(EventLog eventLog) + { + eventLog.setCreateTime(DateUtils.getNowDate()); + return eventLogMapper.insertEventLog(eventLog); + } + + /** + * 批量存储事件日志 + * @param list + */ + @Override + public void insertBatch(List list){ + eventLogMapper.insertBatch(list); + } + + /** + * 修改事件日志 + * + * @param eventLog 事件日志 + * @return 结果 + */ + @Override + public int updateEventLog(EventLog eventLog) + { + return eventLogMapper.updateEventLog(eventLog); + } + + /** + * 批量删除事件日志 + * + * @param logIds 需要删除的事件日志主键 + * @return 结果 + */ + @Override + public int deleteEventLogByLogIds(Long[] logIds) + { + return eventLogMapper.deleteEventLogByLogIds(logIds); + } + + /** + * 删除事件日志信息 + * + * @param logId 事件日志主键 + * @return 结果 + */ + @Override + public int deleteEventLogByLogId(Long logId) + { + return eventLogMapper.deleteEventLogByLogId(logId); + } + + /** + * 通过设备ID删除设备事件日志 + * + * @param serialNumber 设备编号 + * @return 结果 + */ + @Override + public int deleteEventLogByDeviceNumber(String serialNumber) + { + return eventLogMapper.deleteEventLogBySerialNumber(serialNumber); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/FunctionLogServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/FunctionLogServiceImpl.java new file mode 100644 index 00000000..d36a4031 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/FunctionLogServiceImpl.java @@ -0,0 +1,134 @@ +package com.fastbee.iot.service.impl; + +import java.util.List; +import com.fastbee.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fastbee.iot.mapper.FunctionLogMapper; +import com.fastbee.iot.domain.FunctionLog; +import com.fastbee.iot.service.IFunctionLogService; + +/** + * 设备服务下发日志Service业务层处理 + * + * @author kerwincui + * @date 2022-10-22 + */ +@Service +public class FunctionLogServiceImpl implements IFunctionLogService +{ + @Autowired + private FunctionLogMapper functionLogMapper; + + /** + * 查询设备服务下发日志 + * + * @param id 设备服务下发日志主键 + * @return 设备服务下发日志 + */ + @Override + public FunctionLog selectFunctionLogById(Long id) + { + return functionLogMapper.selectFunctionLogById(id); + } + + /** + * 查询设备服务下发日志列表 + * + * @param functionLog 设备服务下发日志 + * @return 设备服务下发日志 + */ + @Override + public List selectFunctionLogList(FunctionLog functionLog) + { + return functionLogMapper.selectFunctionLogList(functionLog); + } + + /** + * 新增设备服务下发日志 + * + * @param functionLog 设备服务下发日志 + * @return 结果 + */ + @Override + public int insertFunctionLog(FunctionLog functionLog) + { + functionLog.setCreateTime(DateUtils.getNowDate()); + return functionLogMapper.insertFunctionLog(functionLog); + } + + /** + * 批量插入数据 + * @param list + */ + @Override + public void insertBatch(List list){ + functionLogMapper.insertBatch(list); + } + + /** + * 修改设备服务下发日志 + * + * @param functionLog 设备服务下发日志 + * @return 结果 + */ + @Override + public int updateFunctionLog(FunctionLog functionLog) + { + return functionLogMapper.updateFunctionLog(functionLog); + } + + /** + * 批量删除设备服务下发日志 + * + * @param ids 需要删除的设备服务下发日志主键 + * @return 结果 + */ + @Override + public int deleteFunctionLogByIds(Long[] ids) + { + return functionLogMapper.deleteFunctionLogByIds(ids); + } + + /** + * 删除设备服务下发日志信息 + * + * @param id 设备服务下发日志主键 + * @return 结果 + */ + @Override + public int deleteFunctionLogById(Long id) + { + return functionLogMapper.deleteFunctionLogById(id); + } + + /** + * 根据设备编号删除设备服务下发日志信息 + * + * @param serialNumber 设备编号 + * @return 结果 + */ + @Override + public int deleteFunctionLogByDeviceNumber(String serialNumber) + { + return functionLogMapper.deleteFunctionLogBySerialNumber(serialNumber); + } + + /** + * 批量更新日志状态值 + * @param log 参数 + */ + @Override + public void updateFuncLogBatch(FunctionLog log){ + functionLogMapper.updateFuncLogBatch(log); + } + + /** + * 根据消息id更新指令下发状态 + * @param log + */ + @Override + public void updateByMessageId(FunctionLog log){ + functionLogMapper.updateByMessageId(log); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/GroupServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/GroupServiceImpl.java new file mode 100644 index 00000000..6e0fe70a --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/GroupServiceImpl.java @@ -0,0 +1,158 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.Group; +import com.fastbee.iot.mapper.GroupMapper; +import com.fastbee.iot.model.DeviceGroupInput; +import com.fastbee.iot.model.IdOutput; +import com.fastbee.iot.service.IGroupService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 设备分组Service业务层处理 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +public class GroupServiceImpl implements IGroupService +{ + @Autowired + private GroupMapper groupMapper; + + /** + * 查询设备分组 + * + * @param groupId 设备分组主键 + * @return 设备分组 + */ + @Override + public Group selectGroupByGroupId(Long groupId) + { + return groupMapper.selectGroupByGroupId(groupId); + } + + /** + * 通过分组ID查询关联的设备ID数组 + * @param groupId + * @return + */ + @Override + public Long[] selectDeviceIdsByGroupId(Long groupId){ + List list=groupMapper.selectDeviceIdsByGroupId(groupId); + Long[] ids=new Long[list.size()]; + for(int i=0;i selectGroupList(Group group) + { + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + if(group.getUserId()!=null && group.getUserId()!=0){ + // 筛选自己分组(主要针对管理员) + group.setUserId(group.getUserId()); + }else { + for (int i = 0; i < roles.size(); i++) { + // 租户和用户,只查看自己分组 + if (roles.get(i).getRoleKey().equals("tenant") || roles.get(i).getRoleKey().equals("general")) { + group.setUserId(user.getUserId()); + break; + } + } + } + return groupMapper.selectGroupList(group); + } + + /** + * 新增设备分组 + * + * @param group 设备分组 + * @return 结果 + */ + @Override + public int insertGroup(Group group) + { + SysUser user = getLoginUser().getUser(); + group.setUserId(user.getUserId()); + group.setUserName(user.getUserName()); + group.setCreateTime(DateUtils.getNowDate()); + return groupMapper.insertGroup(group); + } + + /** + * 修改设备分组 + * + * @param group 设备分组 + * @return 结果 + */ + @Override + public int updateGroup(Group group) + { + group.setUpdateTime(DateUtils.getNowDate()); + return groupMapper.updateGroup(group); + } + + /** + * 分组下批量添加设备分组 + * @return + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int updateDeviceGroups(DeviceGroupInput input){ + //删除分组下的所有关联设备 + groupMapper.deleteDeviceGroupByGroupIds(new Long[]{input.getGroupId()}); + // 分组下添加关联设备 + if(input.getDeviceIds().length>0){ + groupMapper.insertDeviceGroups(input); + } + return 1; + } + + /** + * 批量删除分组和设备分组 + * + * @param groupIds 需要删除的设备分组主键 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteGroupByGroupIds(Long[] groupIds) + { + // 删除设备分组 + groupMapper.deleteDeviceGroupByGroupIds(groupIds); + // 删除分组 + return groupMapper.deleteGroupByGroupIds(groupIds); + } + + /** + * 删除分组信息 + * + * @param groupId 设备分组主键 + * @return 结果 + */ + @Override + public int deleteGroupByGroupId(Long groupId) + { + + return groupMapper.deleteGroupByGroupId(groupId); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsCategoryServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsCategoryServiceImpl.java new file mode 100644 index 00000000..a0fcc925 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsCategoryServiceImpl.java @@ -0,0 +1,117 @@ +package com.fastbee.iot.service.impl; + +import java.util.List; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.model.IdAndName; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fastbee.iot.mapper.NewsCategoryMapper; +import com.fastbee.iot.domain.NewsCategory; +import com.fastbee.iot.service.INewsCategoryService; + +/** + * 新闻分类Service业务层处理 + * + * @author kerwincui + * @date 2022-04-09 + */ +@Service +public class NewsCategoryServiceImpl implements INewsCategoryService +{ + @Autowired + private NewsCategoryMapper newsCategoryMapper; + + /** + * 查询新闻分类 + * + * @param categoryId 新闻分类主键 + * @return 新闻分类 + */ + @Override + public NewsCategory selectNewsCategoryByCategoryId(Long categoryId) + { + return newsCategoryMapper.selectNewsCategoryByCategoryId(categoryId); + } + + /** + * 查询新闻分类列表 + * + * @param newsCategory 新闻分类 + * @return 新闻分类 + */ + @Override + public List selectNewsCategoryList(NewsCategory newsCategory) + { + return newsCategoryMapper.selectNewsCategoryList(newsCategory); + } + + /** + * 查询新闻分类简短列表 + * + * @return 新闻分类 + */ + @Override + public List selectNewsCategoryShortList() + { + return newsCategoryMapper.selectNewsCategoryShortList(); + } + + /** + * 新增新闻分类 + * + * @param newsCategory 新闻分类 + * @return 结果 + */ + @Override + public int insertNewsCategory(NewsCategory newsCategory) + { + newsCategory.setCreateTime(DateUtils.getNowDate()); + return newsCategoryMapper.insertNewsCategory(newsCategory); + } + + /** + * 修改新闻分类 + * + * @param newsCategory 新闻分类 + * @return 结果 + */ + @Override + public int updateNewsCategory(NewsCategory newsCategory) + { + newsCategory.setUpdateTime(DateUtils.getNowDate()); + return newsCategoryMapper.updateNewsCategory(newsCategory); + } + + /** + * 批量删除新闻分类 + * + * @param categoryIds 需要删除的新闻分类主键 + * @return 结果 + */ + @Override + public AjaxResult deleteNewsCategoryByCategoryIds(Long[] categoryIds) + { + int productCount=newsCategoryMapper.newsCountInCategorys(categoryIds); + if(productCount>0){ + return AjaxResult.error("删除失败,请先删除对应分类下的新闻资讯"); + } + if(newsCategoryMapper.deleteNewsCategoryByCategoryIds(categoryIds)>0){ + return AjaxResult.success("删除成功"); + } + return AjaxResult.error("删除失败"); + } + + /** + * 删除新闻分类信息 + * + * @param categoryId 新闻分类主键 + * @return 结果 + */ + @Override + public int deleteNewsCategoryByCategoryId(Long categoryId) + { + return newsCategoryMapper.deleteNewsCategoryByCategoryId(categoryId); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsServiceImpl.java new file mode 100644 index 00000000..448b77ae --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/NewsServiceImpl.java @@ -0,0 +1,131 @@ +package com.fastbee.iot.service.impl; + +import java.util.ArrayList; +import java.util.List; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.mapper.NewsCategoryMapper; +import com.fastbee.iot.model.CategoryNews; +import com.fastbee.iot.model.IdAndName; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fastbee.iot.mapper.NewsMapper; +import com.fastbee.iot.domain.News; +import com.fastbee.iot.service.INewsService; + +/** + * 新闻资讯Service业务层处理 + * + * @author kerwincui + * @date 2022-04-09 + */ +@Service +public class NewsServiceImpl implements INewsService +{ + @Autowired + private NewsMapper newsMapper; + + /** + * 查询新闻资讯 + * + * @param newsId 新闻资讯主键 + * @return 新闻资讯 + */ + @Override + public News selectNewsByNewsId(Long newsId) + { + return newsMapper.selectNewsByNewsId(newsId); + } + + /** + * 查询新闻资讯列表 + * + * @param news 新闻资讯 + * @return 新闻资讯 + */ + @Override + public List selectNewsList(News news) + { + return newsMapper.selectNewsList(news); + } + + /** + * 查询置顶新闻资讯列表 + * + * @return 新闻资讯 + */ + @Override + public List selectTopNewsList() + { + List categoryNewsList =new ArrayList<>(); + List newsList=newsMapper.selectTopNewsList(); + for(int i=0;i selectOauthClientDetailsList(OauthClientDetails oauthClientDetails) + { + return oauthClientDetailsMapper.selectOauthClientDetailsList(oauthClientDetails); + } + + /** + * 新增云云对接 + * + * @param oauthClientDetails 云云对接 + * @return 结果 + */ + @Override + public int insertOauthClientDetails(OauthClientDetails oauthClientDetails) + { + return oauthClientDetailsMapper.insertOauthClientDetails(oauthClientDetails); + } + + /** + * 修改云云对接 + * + * @param oauthClientDetails 云云对接 + * @return 结果 + */ + @Override + public int updateOauthClientDetails(OauthClientDetails oauthClientDetails) + { + return oauthClientDetailsMapper.updateOauthClientDetails(oauthClientDetails); + } + + /** + * 批量删除云云对接 + * + * @param clientIds 需要删除的云云对接主键 + * @return 结果 + */ + @Override + public int deleteOauthClientDetailsByClientIds(String[] clientIds) + { + return oauthClientDetailsMapper.deleteOauthClientDetailsByClientIds(clientIds); + } + + /** + * 删除云云对接信息 + * + * @param clientId 云云对接主键 + * @return 结果 + */ + @Override + public int deleteOauthClientDetailsByClientId(String clientId) + { + return oauthClientDetailsMapper.deleteOauthClientDetailsByClientId(clientId); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductAuthorizeServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductAuthorizeServiceImpl.java new file mode 100644 index 00000000..1af3d6e8 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductAuthorizeServiceImpl.java @@ -0,0 +1,143 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.uuid.IdUtils; +import com.fastbee.iot.domain.ProductAuthorize; +import com.fastbee.iot.mapper.ProductAuthorizeMapper; +import com.fastbee.iot.model.ProductAuthorizeVO; +import com.fastbee.iot.service.IProductAuthorizeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 产品授权码Service业务层处理 + * + * @author kami + * @date 2022-04-11 + */ +@Service +public class ProductAuthorizeServiceImpl implements IProductAuthorizeService { + @Autowired + private ProductAuthorizeMapper productAuthorizeMapper; + + /** + * 查询产品授权码 + * + * @param authorizeId 产品授权码主键 + * @return 产品授权码 + */ + @Override + public ProductAuthorize selectProductAuthorizeByAuthorizeId(Long authorizeId) { + return productAuthorizeMapper.selectProductAuthorizeByAuthorizeId(authorizeId); + } + + /** + * 查询产品授权码列表 + * + * @param productAuthorize 产品授权码 + * @return 产品授权码 + */ + @Override + public List selectProductAuthorizeList(ProductAuthorize productAuthorize) { + return productAuthorizeMapper.selectProductAuthorizeList(productAuthorize); + } + + /** + * 新增产品授权码 + * + * @param productAuthorize 产品授权码 + * @return 结果 + */ + @Override + public int insertProductAuthorize(ProductAuthorize productAuthorize) { + // 1=未使用,2=使用中 + productAuthorize.setStatus(1); + productAuthorize.setCreateTime(DateUtils.getNowDate()); + return productAuthorizeMapper.insertProductAuthorize(productAuthorize); + } + + /** + * 修改产品授权码 + * + * @param productAuthorize 产品授权码 + * @return 结果 + */ + @Override + public int updateProductAuthorize(ProductAuthorize productAuthorize) { + if(productAuthorize.getDeviceId()!=null && productAuthorize.getDeviceId()!=0){ + // 1=未使用,2=使用中 + productAuthorize.setStatus(2); + productAuthorize.setUpdateTime(DateUtils.getNowDate()); + } + return productAuthorizeMapper.updateProductAuthorize(productAuthorize); + } + + /** + * 批量删除产品授权码 + * + * @param authorizeIds 需要删除的产品授权码主键 + * @return 结果 + */ + @Override + public int deleteProductAuthorizeByAuthorizeIds(Long[] authorizeIds) { + return productAuthorizeMapper.deleteProductAuthorizeByAuthorizeIds(authorizeIds); + } + + /** + * 删除产品授权码信息 + * + * @param authorizeId 产品授权码主键 + * @return 结果 + */ + @Override + public int deleteProductAuthorizeByAuthorizeId(Long authorizeId) { + return productAuthorizeMapper.deleteProductAuthorizeByAuthorizeId(authorizeId); + } + + /** + * 根据数量批量新增产品授权码 + * + * @param productAuthorizeVO + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int addProductAuthorizeByNum(ProductAuthorizeVO productAuthorizeVO) { + Long productId = productAuthorizeVO.getProductId(); + int createNum = productAuthorizeVO.getCreateNum(); + List list = new ArrayList<>(createNum); + SysUser user = getLoginUser().getUser(); + for (int i = 0; i < createNum; i++) { + ProductAuthorize authorize = new ProductAuthorize(); + // 1=未使用,2=使用中 + authorize.setStatus(1); + authorize.setProductId(productId); + authorize.setCreateBy(user.getUserName()); + authorize.setCreateTime(DateUtils.getNowDate()); + authorize.setAuthorizeCode(IdUtils.fastSimpleUUID().toUpperCase()); + list.add(authorize); + } + return productAuthorizeMapper.insertBatchAuthorize(list); + } + + /** + * 根据产品id查询产品授权码 + * @param productId 产品id + * @return + */ + @Override + public List listByProductId(Long productId) { + return productAuthorizeMapper.selectProductAuthorizeListByProductId(productId); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductServiceImpl.java new file mode 100644 index 00000000..7747edea --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProductServiceImpl.java @@ -0,0 +1,321 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.core.redis.RedisKeyBuilder; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.Product; +import com.fastbee.iot.domain.ThingsModelTemplate; +import com.fastbee.iot.mapper.DeviceMapper; +import com.fastbee.iot.mapper.ProductAuthorizeMapper; +import com.fastbee.iot.mapper.ProductMapper; +import com.fastbee.iot.model.ChangeProductStatusModel; +import com.fastbee.iot.model.IdAndName; +import com.fastbee.iot.model.ImportThingsModelInput; +import com.fastbee.iot.model.ProductCode; +import com.fastbee.iot.service.IProductService; +import com.fastbee.iot.service.IThingsModelTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 产品Service业务层处理 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +public class ProductServiceImpl implements IProductService +{ + + @Autowired + private ThingsModelServiceImpl thingsModelService; + + @Autowired + private ProductMapper productMapper; + + @Autowired + private ProductAuthorizeMapper productAuthorizeMapper; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ToolServiceImpl toolService; + + @Autowired + private DeviceMapper deviceMapper; + + @Autowired + private IThingsModelTemplateService modelTemplateService; + + @Autowired + @Lazy + private DeviceServiceImpl deviceService; + + /** + * 查询产品 + * + * @param productId 产品主键 + * @return 产品 + */ + @Override + public Product selectProductByProductId(Long productId) + { + return productMapper.selectProductByProductId(productId); + } + + /** + * 查询产品列表 + * + * @param product 产品 + * @return 产品 + */ + @Override + public List selectProductList(Product product) + { + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + // 租户 + if(roles.stream().anyMatch(a->a.getRoleKey().equals("tenant"))){ + product.setTenantId(user.getUserId()); + } + return productMapper.selectProductList(product); + } + + /** + * 查询产品简短列表 + * + * @return 产品 + */ + @Override + public List selectProductShortList() + { + Product product =new Product(); + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + // 租户 + if(roles.stream().anyMatch(a->a.getRoleKey().equals("tenant"))){ + product.setTenantId(user.getUserId()); + } + return productMapper.selectProductShortList(product); + } + + /** + * 新增产品 + * + * @param product 产品 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Product insertProduct(Product product) + { + // 判断是否为管理员 + product.setIsSys(1); + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + for(int i=0;i thingsModelTemplates = modelTemplateService.selectAllByTemplateId(product.getTemplateId()); + Long[] ids = thingsModelTemplates.stream().map(ThingsModelTemplate::getTemplateId).toArray(Long[]::new); + ImportThingsModelInput input = new ImportThingsModelInput(); + input.setTemplateIds(ids); + input.setProductId(product.getProductId()); + input.setProductName(product.getProductName()); + thingsModelService.importByTemplateIds(input); + } + return product; + } + + /** + * 修改产品 + * + * @param product 产品 + * @return 结果 + */ + @Override + public int updateProduct(Product product) + { + product.setUpdateTime(DateUtils.getNowDate()); + return productMapper.updateProduct(product); + } + + /** + * 获取产品下面的设备数量 + * + * @param productId 产品ID + * @return 结果 + */ + @Override + public int selectDeviceCountByProductId(Long productId) + { + return deviceMapper.selectDeviceCountByProductId(productId); + } + + /** + * 更新产品状态,1-未发布,2-已发布 + * + * @param model + * @return 结果 + */ + @Override + @Transactional + public AjaxResult changeProductStatus(ChangeProductStatusModel model) + { + if(model.getStatus()!=1 && model.getStatus()!=2){ + return AjaxResult.error("状态更新失败,状态值有误"); + } + if(model.getStatus()==2){ + // 产品下必须包含物模型 + int thingsCount=productMapper.thingsCountInProduct(model.getProductId()); + if(thingsCount==0 && model.getDeviceType() !=3){ + return AjaxResult.error("发布失败,请先添加产品的物模型"); + } else if (thingsCount > 0){ + // 批量更新产品下所有设备的物模型值 + updateDeviceStatusByProductIdAsync(model.getProductId()); + } + // TODO 增加modbus之后,产品下子设备的物模型唯一 + //int repeatCount=productMapper.thingsRepeatCountInProduct(model.getProductId()); + //if(repeatCount>1){ + // return AjaxResult.error("发布失败,产品物模型的标识符必须唯一"); + //} + } + if(productMapper.changeProductStatus(model)>0){ + return AjaxResult.success("操作成功"); + } + return AjaxResult.error("状态更新失败"); + } + + /*** + * 更新产品下所有设备的物模型值 + * @param productId + */ + @Async + public void updateDeviceStatusByProductIdAsync(Long productId){ + List deviceNumbers=deviceMapper.selectSerialNumberByProductId(productId); + deviceNumbers.forEach(x->{ + // 缓存新的物模型值 + deviceService.cacheDeviceStatus(productId,x); + }); + } + + /** + * 批量删除产品 + * + * @param productIds 需要删除的产品主键 + * @return 结果 + */ + @Override + @Transactional + public AjaxResult deleteProductByProductIds(Long[] productIds) + { + // 删除物模型JSON缓存 + for(int i=0;i0){ + return AjaxResult.error("删除失败,请先删除对应产品下的设备"); + } + // 删除产品物模型 + productMapper.deleteProductThingsModelByProductIds(productIds); + // 删除产品的授权码 + productAuthorizeMapper.deleteProductAuthorizeByProductIds(productIds); + // 删除产品 + if(productMapper.deleteProductByProductIds(productIds)>0){ + return AjaxResult.success("删除成功"); + } + return AjaxResult.error("删除失败"); + } + + + /** + * 删除产品信息 + * + * @param productId 产品主键 + * @return 结果 + */ + @Override + public int deleteProductByProductId(Long productId) + { + // 删除物模型JSON缓存 + redisCache.deleteObject(RedisKeyBuilder.buildTSLCacheKey(productId)); + return productMapper.deleteProductByProductId(productId); + } + + /** + * 根据设备编号查询产品信息 + * @param serialNumber 设备编号 + * @return 结果 + */ + @Override + public Product getProductBySerialNumber(String serialNumber){ + return productMapper.getProductBySerialNumber(serialNumber); + } + + /** + * 根据设备编号查询协议编号 + * @param serialNumber 设备编号 + * @return 协议编号 + */ + @Override + public ProductCode getProtocolBySerialNumber(String serialNumber){ + return productMapper.getProtocolBySerialNumber(serialNumber); + } + + /** + * 根据产品id获取协议编号 + * @param productId 产品id + * @return 协议编号 + */ + @Override + public String getProtocolByProductId(Long productId){ + return productMapper.getProtocolByProductId(productId); + } + + + /** + * 根据模板id查询所有使用的产品 + * @param templeId 模板id + * @return + */ + @Override + public List selectByTempleId(Long templeId){ + return productMapper.selectByTempleId(templeId); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProtocolServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProtocolServiceImpl.java new file mode 100644 index 00000000..e3e1c2d1 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ProtocolServiceImpl.java @@ -0,0 +1,119 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.Protocol; +import com.fastbee.iot.mapper.ProtocolMapper; +import com.fastbee.iot.service.IProtocolService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 协议管理 + * @author gsb + * @date 2022/10/19 17:02 + */ +@Service +public class ProtocolServiceImpl implements IProtocolService { + + @Autowired + private ProtocolMapper protocolMapper; + + /** + * 查询协议 + * + * @param id 协议主键 + * @return 协议 + */ + @Override + public Protocol selectProtocolById(Long id) + { + return protocolMapper.selectProtocolById(id); + } + + /** + * 查询协议列表 + * + * @param protocol 协议 + * @return 协议 + */ + @Override + public List selectProtocolList(Protocol protocol) + { + return protocolMapper.selectProtocolList(protocol); + } + + /** + * 新增协议 + * + * @param protocol 协议 + * @return 结果 + */ + @Override + public int insertProtocol(Protocol protocol) + { + protocol.setCreateTime(DateUtils.getNowDate()); + if (protocol.getProtocolStatus() == null){ + protocol.setProtocolStatus(1); + } + return protocolMapper.insertProtocol(protocol); + } + + /** + * 修改协议 + * + * @param protocol 协议 + * @return 结果 + */ + @Override + public int updateProtocol(Protocol protocol) + { + protocol.setUpdateTime(DateUtils.getNowDate()); + return protocolMapper.updateProtocol(protocol); + } + + /** + * 批量删除协议 + * + * @param ids 需要删除的协议主键 + * @return 结果 + */ + @Override + public int deleteProtocolByIds(Long[] ids) + { + return protocolMapper.deleteProtocolByIds(ids); + } + + /** + * 删除协议信息 + * + * @param id 协议主键 + * @return 结果 + */ + @Override + public int deleteProtocolById(Long id) + { + return protocolMapper.deleteProtocolById(id); + } + + /** + * 获取所有协议 + * @return + */ + @Override + public List selectAll(){ + return protocolMapper.selectAll(1,0); + } + + /** + *获取所有可用协议 + * @param protocol + * @return + */ + @Override + public List selectByCondition(Protocol protocol){ + return protocolMapper.selectByUnion(protocol); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialLoginServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialLoginServiceImpl.java new file mode 100644 index 00000000..3d65743f --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialLoginServiceImpl.java @@ -0,0 +1,432 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.BindLoginBody; +import com.fastbee.common.core.domain.model.BindRegisterBody; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.sign.Md5Utils; +import com.fastbee.framework.web.service.SysLoginService; +import com.fastbee.framework.web.service.SysRegisterService; +import com.fastbee.framework.web.service.TokenService; +import com.fastbee.iot.domain.SocialPlatform; +import com.fastbee.iot.domain.SocialUser; +import com.fastbee.iot.model.RegisterUserInput; +import com.fastbee.iot.model.login.AuthRequestWrap; +import com.fastbee.iot.model.login.BindIdValue; +import com.fastbee.iot.model.login.LoginIdValue; +import com.fastbee.iot.service.IAuthRequestFactory; +import com.fastbee.iot.service.ISocialLoginService; +import com.fastbee.iot.service.ISocialUserService; +import com.fastbee.iot.service.IToolService; +import com.fastbee.system.service.ISysConfigService; +import com.fastbee.system.service.ISysUserService; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.AuthStateUtils; +import me.zhyd.oauth.utils.RandomUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.fastbee.common.constant.HttpStatus.NO_MESSAGE_ALERT; +import static com.fastbee.common.core.domain.AjaxResult.error; + +/** + * 第三方登录Service业务层处理 + * + * @author json + * @date 2022-04-12 + */ +@Service +public class SocialLoginServiceImpl implements ISocialLoginService { + + public static final Integer BIND_EXPIRE_TIME = 60 * 60; + public static final Integer LOGIN_SOCIAL_EXPIRE_TIME = 60; + public static final String ONLINE_STATUS = "0"; //1 offline + public static final String DEL_FLAG = "0"; //1 offline + public static final Integer WX_BIND_EXPIRE_TIME = 5; + + //redis key: uuid+source + public static final String BIND_REDIS_KEY = "login:bind:user:"; + //redis key : userId+random 32 + public static final String LOGIN_SOCIAL_REDIS_KEY = "login:social:user:"; + //redis key : msg+ code+currentTime + public static final String LOGIN_ERROR_MSG_REDIS_KEY = "login:error:msg:"; + //redis key : userId+random 32 + public static final String WX_BIND_REDIS_KEY = "wx:bind:user:"; + + public static final String HTTPS = "https://"; + + private static final Logger log = LoggerFactory.getLogger(SocialLoginServiceImpl.class); + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService iSysConfigService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysRegisterService sysRegisterService; + + @Autowired + private SysLoginService sysLoginService; + + @Autowired + private ISysUserService iSysUserService; + + @Autowired + private IAuthRequestFactory iAuthRequestFactory; + + @Autowired + private ISocialUserService iSocialUserService; + + @Resource + private IToolService toolService; + + + @Override + public String renderAuth(String source, HttpServletRequest httpServletRequest) { + AuthRequestWrap authRequestWrap = null; + try { + authRequestWrap = iAuthRequestFactory.getAuthRequest(source); + checkSocialPlatform(authRequestWrap.getSocialPlatform()); + return authRequestWrap.getAuthRequest().authorize(AuthStateUtils.createState()); + } catch (AuthException authException) { + //返回错误信息 + log.error("", authException); + if (authRequestWrap != null) { + String errorId = genErrorId(authException.getMessage()); + return authRequestWrap.getSocialPlatform().getErrorMsgUri() + errorId; + } else { + return httpServletRequest.getProtocol() + httpServletRequest.getServerName() + httpServletRequest.getServerPort(); + } + } catch (Exception exception) { + //这类错误 直接不返回,重定向到主页 + log.error("", exception); + return HTTPS + httpServletRequest.getServerName(); + } + + } + + @Override + public String callback(String source, AuthCallback authCallback, HttpServletRequest httpServletRequest) { + AuthRequestWrap authRequestWrap = null; + try { + authRequestWrap = iAuthRequestFactory.getAuthRequest(source); + checkSocialPlatform(authRequestWrap.getSocialPlatform()); + AuthResponse authResponse = authRequestWrap.getAuthRequest().login(authCallback); + String bindId = null; + String loginId = null; + if (authResponse.ok()) { + + SocialUser socialUser = findSocialUser(authResponse.getData().getUuid(), authResponse.getData().getSource()); + // 同一开放平台下(unionid唯一)如果有其他应用已经微信登录绑定了账号,则直接绑定该账号登录 + Long bindSysUserId = null; + String unionId = (String) authResponse.getData().getRawUserInfo().get("unionid"); + if ((socialUser == null || socialUser.getSysUserId() == null) && StringUtils.isNotEmpty(unionId)) { + bindSysUserId = iSocialUserService.selectSysUserIdByUnionId(unionId); + } + createOrUpdateSocialUser(socialUser, authResponse.getData(), source, bindSysUserId); + if (bindSysUserId != null) { + socialUser = new SocialUser(); + socialUser.setSysUserId(bindSysUserId); + } + if (socialUser == null) { + //第一次登录 + bindId = genBindId(authResponse.getData()); + } else if (socialUser.getSysUserId() == null || socialUser.getSysUserId() <= 0) { + //初次绑定 + bindId = genBindId(authResponse.getData()); + } else { + //查看是否已经绑定 + SysUser sysUser = iSysUserService.selectUserById(socialUser.getSysUserId()); + if (sysUser == null) { + bindId = genBindId(authResponse.getData()); + } else { + //直接登录跳转 + loginId = genLoginId(sysUser); + } + } + if (StringUtils.isNotEmpty(bindId)) { + return authRequestWrap.getSocialPlatform().getBindUri() + bindId; + } else { + return authRequestWrap.getSocialPlatform().getRedirectLoginUri() + loginId; + } + } else { + log.error("登录授权异常,code:{}, msg:{}", authResponse.getCode(), authResponse.getMsg()); + String errorId = genErrorId(authResponse.getMsg()); + return authRequestWrap.getSocialPlatform().getErrorMsgUri() + errorId; + } + } catch (AuthException authException) { + //返回错误信息 + log.error("", authException); + if (authRequestWrap != null) { + String errorId = genErrorId(authException.getMessage()); + return authRequestWrap.getSocialPlatform().getErrorMsgUri() + errorId; + } else { + return httpServletRequest.getServerName() + httpServletRequest.getServerPort(); + } + } catch (Exception exception) { + log.error("", exception); + return HTTPS + httpServletRequest.getServerName(); + } + + } + + @Override + public AjaxResult checkBindId(String bindId) { + AjaxResult ajax = AjaxResult.success(); + ajax.put("bindAccount", false); + if (StringUtils.isEmpty(bindId)) { + return ajax; + } + BindIdValue bindValue = redisCache.getCacheObject(BIND_REDIS_KEY + bindId); + if (bindValue == null) { + return ajax; + } + ajax.put("bindAccount", true); + return AjaxResult.success(bindId); + } + + @Override + public AjaxResult getErrorMsg(String errorId) { + String errorMsg = redisCache.getCacheObject(LOGIN_ERROR_MSG_REDIS_KEY + errorId); + if (StringUtils.isEmpty(errorMsg)) { + return error(NO_MESSAGE_ALERT, ""); + } else { + return error(errorMsg); + } + } + + @Override + public AjaxResult socialLogin(String loginId) { + AjaxResult ajax = AjaxResult.success(); + String loginKey = LOGIN_SOCIAL_REDIS_KEY + loginId; + LoginIdValue loginIdValue = redisCache.getCacheObject(loginKey); + if (loginIdValue != null) { + //login + String token = sysLoginService.redirectLogin(loginIdValue.getUsername(), loginIdValue.getPassword()); + ajax.put(Constants.TOKEN, token); + } else { + log.info("loginId:{} ", loginId); + return error(NO_MESSAGE_ALERT, "数据错误"); + } + return ajax; + } + + @Override + public AjaxResult bindLogin(BindLoginBody bindLoginBody) { + BindIdValue bindValue = redisCache.getCacheObject(BIND_REDIS_KEY + bindLoginBody.getBindId()); + SocialUser socialUser = findSocialUser(bindValue.getUuid(), bindValue.getSource()); + AjaxResult checkAjax = checkSocialUser(socialUser, bindLoginBody.getBindId()); + if (checkAjax != null) { + return checkAjax; + } + AjaxResult ajax = AjaxResult.success(); + // 检查账号是否已经绑定微信 + SysUser sysUser = iSysUserService.selectUserByUserName(bindLoginBody.getUsername()); + if (sysUser == null) { + // 单独返回code用户不存在,给前端处理 + return AjaxResult.error(HttpStatus.USER_NO_EXIST, "用户不存在"); + } + // 自定义一下密码错误的提示 + if(!SecurityUtils.matchesPassword(bindLoginBody.getPassword(), sysUser.getPassword())){ + throw new ServiceException("密码错误"); + } + List socialUserList = iSocialUserService.selectBySysUserId(sysUser.getUserId()); + if (CollectionUtils.isNotEmpty(socialUserList)) { + throw new ServiceException("该账号已经绑定其他微信,请先解绑后重试!"); + } + // 生成令牌 + String token = sysLoginService.login(bindLoginBody.getUsername(), bindLoginBody.getPassword(), bindLoginBody.getCode(), + bindLoginBody.getUuid()); + LoginUser loginUser = tokenService.getLoginUserByToken(token); + //绑定和更新 + SocialUser updateSocialUser = new SocialUser(); + updateSocialUser.setSysUserId(loginUser.getUserId()); + updateSocialUser.setStatus("1"); + updateSocialUser.setSocialUserId(socialUser.getSocialUserId()); + iSocialUserService.updateSocialUser(updateSocialUser); + ajax.put(Constants.TOKEN, token); + redisCache.deleteObject(BIND_REDIS_KEY + bindLoginBody.getBindId()); + return ajax; + } + + @Override + public AjaxResult bindRegister(BindRegisterBody bindRegisterBody) { + if (!("true".equals(iSysConfigService.selectConfigByKey("sys.account.registerUser")))) { + return error("当前系统没有开启注册功能!"); + } + BindIdValue bindValue = redisCache.getCacheObject(BIND_REDIS_KEY + bindRegisterBody.getBindId()); + SocialUser socialUser = findSocialUser(bindValue.getUuid(), bindValue.getSource()); + AjaxResult checkAjax = checkSocialUser(socialUser, bindRegisterBody.getBindId()); + if (checkAjax != null) { + return checkAjax; + } + + AjaxResult ajax = AjaxResult.success(); + RegisterUserInput registerUserInput = new RegisterUserInput(); + BeanUtils.copyProperties(bindRegisterBody, registerUserInput); + String msg = toolService.register(registerUserInput); + if (StringUtils.isNotEmpty(msg)) { + return error(msg); + } + SysUser sysUser = iSysUserService.selectUserByUserName(bindRegisterBody.getUsername()); + //绑定和更新 + SocialUser updateSocialUser = new SocialUser(); + updateSocialUser.setSysUserId(sysUser.getUserId()); + updateSocialUser.setStatus("1"); + updateSocialUser.setSocialUserId(socialUser.getSocialUserId()); + iSocialUserService.updateSocialUser(updateSocialUser); + redisCache.deleteObject(BIND_REDIS_KEY + bindRegisterBody.getBindId()); + // 生成令牌 + String token = sysLoginService.redirectLogin(sysUser.getUserName(), sysUser.getPassword()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + private void checkSocialPlatform(SocialPlatform socialPlatform) { + if (socialPlatform != null && (!socialPlatform.getStatus().equals(ONLINE_STATUS) || !socialPlatform.getDelFlag().equals(DEL_FLAG))) { + throw new AuthException("当前第三方登录平台被禁用"); + } + } + + @Override + public SocialUser findSocialUser(String uuid, String source) { + SocialUser socialUser = new SocialUser(); + socialUser.setSource(source); + socialUser.setUuid(uuid); + List socialUserList = iSocialUserService.selectSocialUserList(socialUser); + return socialUserList == null || socialUserList.isEmpty() ? null : socialUserList.get(0); + + } + + public void createOrUpdateSocialUser(SocialUser socialUser, AuthUser authUser, String source, Long bindSysUserId) { + if (socialUser != null) { + //更新数据 + SocialUser updateSocialUser = new SocialUser(); + updateSocialUser.setSocialUserId(socialUser.getSocialUserId()); + replaceSocialUser(updateSocialUser, authUser); + updateSocialUser.setUpdateBy("System"); + updateSocialUser.setUpdateTime(DateUtils.getNowDate()); + updateSocialUser.setSourceClient(source); + if (socialUser.getSysUserId() == null && bindSysUserId != null) { + updateSocialUser.setSysUserId(bindSysUserId); + updateSocialUser.setStatus("1"); + } + iSocialUserService.updateSocialUser(updateSocialUser); + } else { + //创建 + SocialUser saveSocialUser = new SocialUser(); + replaceSocialUser(saveSocialUser, authUser); + saveSocialUser.setDelFlag("0"); + saveSocialUser.setCreateBy("System"); + saveSocialUser.setCreateTime(DateUtils.getNowDate()); + saveSocialUser.setSourceClient(source); + if (bindSysUserId != null) { + saveSocialUser.setSysUserId(bindSysUserId); + saveSocialUser.setStatus("1"); + } else { + saveSocialUser.setStatus("0"); + } + iSocialUserService.insertSocialUser(saveSocialUser); + } + } + + private void replaceSocialUser(SocialUser socialUser, AuthUser authUser) { + + socialUser.setUuid(authUser.getUuid()); + socialUser.setSource(authUser.getSource()); + socialUser.setAccessToken(authUser.getToken().getAccessToken()); + //nullable + socialUser.setExpireIn((long) authUser.getToken().getExpireIn()); + socialUser.setRefreshToken(authUser.getToken().getRefreshToken()); + socialUser.setOpenId(authUser.getToken().getOpenId()); + socialUser.setUid(authUser.getToken().getUid()); + socialUser.setAccessCode(authUser.getToken().getAccessCode()); + socialUser.setUnionId(authUser.getToken().getUnionId()); + socialUser.setCode(authUser.getToken().getCode()); + socialUser.setAvatar(authUser.getAvatar()); + socialUser.setUsername(authUser.getUsername()); + socialUser.setNickname(authUser.getNickname()); + } + + public String genBindId(AuthUser authUser) { + String bindId = Md5Utils.hash(authUser.getUuid() + authUser.getSource()); + String key = BIND_REDIS_KEY + bindId; + BindIdValue bindIdValue = new BindIdValue(); + bindIdValue.setSource(authUser.getSource()); + bindIdValue.setUuid(authUser.getUuid()); + redisCache.setCacheObject(key, bindIdValue, BIND_EXPIRE_TIME, TimeUnit.SECONDS); + return bindId; + } + + private String genLoginId(SysUser sysUser) { + String loginId = Md5Utils.hash(sysUser.getUserId() + RandomUtil.randomString(32)); + String key = LOGIN_SOCIAL_REDIS_KEY + loginId; + LoginIdValue loginIdValue = new LoginIdValue(); + loginIdValue.setPassword(sysUser.getPassword()); + loginIdValue.setUsername(sysUser.getUserName()); + redisCache.setCacheObject(key, loginIdValue, LOGIN_SOCIAL_EXPIRE_TIME, TimeUnit.SECONDS); + return loginId; + } + + public String genErrorId(String msg) { + String errorId = Md5Utils.hash(msg + RandomUtil.randomString(32)); + String key = LOGIN_ERROR_MSG_REDIS_KEY + errorId; + redisCache.setCacheObject(key, msg, LOGIN_SOCIAL_EXPIRE_TIME, TimeUnit.SECONDS); + return errorId; + } + + public String genWxBindId(Long userId) { + String wxBindId = Md5Utils.hash(userId + RandomUtil.randomString(32)); + String key = WX_BIND_REDIS_KEY + wxBindId; + redisCache.setCacheObject(key, userId, WX_BIND_EXPIRE_TIME, TimeUnit.MINUTES); + return wxBindId; + } + + @Override + public AjaxResult checkSocialUser(SocialUser socialUser, String bindId) { + if (socialUser == null) { + log.info("bindId不存在, bindId: {}", bindId); + return error("绑定账户不存在"); + } else { + return null; + } + } + + private int createSocialUser(AuthUser authUser, String sourceClient, Long sysUserId) { + //创建 + SocialUser saveSocialUser = new SocialUser(); + replaceSocialUser(saveSocialUser, authUser); + saveSocialUser.setDelFlag("0"); + saveSocialUser.setCreateBy("System"); + saveSocialUser.setCreateTime(DateUtils.getNowDate()); + saveSocialUser.setSourceClient(sourceClient); + saveSocialUser.setSysUserId(sysUserId); + saveSocialUser.setStatus("1"); + return iSocialUserService.insertSocialUser(saveSocialUser); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialPlatformServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialPlatformServiceImpl.java new file mode 100644 index 00000000..8ffa12b3 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialPlatformServiceImpl.java @@ -0,0 +1,103 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.SocialPlatform; +import com.fastbee.iot.mapper.SocialPlatformMapper; +import com.fastbee.iot.service.ISocialPlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 第三方登录平台控制Service业务层处理 + * + * @author kerwincui + * @date 2022-04-11 + */ +@Service +public class SocialPlatformServiceImpl implements ISocialPlatformService +{ + @Autowired + private SocialPlatformMapper socialPlatformMapper; + + /** + * 查询第三方登录平台控制 + * + * @param socialPlatformId 第三方登录平台控制主键 + * @return 第三方登录平台控制 + */ + @Override + public SocialPlatform selectSocialPlatformBySocialPlatformId(Long socialPlatformId) + { + return socialPlatformMapper.selectSocialPlatformBySocialPlatformId(socialPlatformId); + } + + @Override + public SocialPlatform selectSocialPlatformByPlatform(String platform) { + return socialPlatformMapper.selectSocialPlatformByPlatform(platform); + } + + /** + * 查询第三方登录平台控制列表 + * + * @param socialPlatform 第三方登录平台控制 + * @return 第三方登录平台控制 + */ + @Override + public List selectSocialPlatformList(SocialPlatform socialPlatform) + { + return socialPlatformMapper.selectSocialPlatformList(socialPlatform); + } + + /** + * 新增第三方登录平台控制 + * + * @param socialPlatform 第三方登录平台控制 + * @return 结果 + */ + @Override + public int insertSocialPlatform(SocialPlatform socialPlatform) + { + socialPlatform.setCreateTime(DateUtils.getNowDate()); + socialPlatform.setDelFlag("0"); + return socialPlatformMapper.insertSocialPlatform(socialPlatform); + } + + /** + * 修改第三方登录平台控制 + * + * @param socialPlatform 第三方登录平台控制 + * @return 结果 + */ + @Override + public int updateSocialPlatform(SocialPlatform socialPlatform) + { + socialPlatform.setUpdateTime(DateUtils.getNowDate()); + return socialPlatformMapper.updateSocialPlatform(socialPlatform); + } + + /** + * 批量删除第三方登录平台控制 + * + * @param socialPlatformIds 需要删除的第三方登录平台控制主键 + * @return 结果 + */ + @Override + public int deleteSocialPlatformBySocialPlatformIds(Long[] socialPlatformIds) + { + return socialPlatformMapper.deleteSocialPlatformBySocialPlatformIds(socialPlatformIds); + } + + /** + * 删除第三方登录平台控制信息 + * + * @param socialPlatformId 第三方登录平台控制主键 + * @return 结果 + */ + @Override + public int deleteSocialPlatformBySocialPlatformId(Long socialPlatformId) + { + return socialPlatformMapper.deleteSocialPlatformBySocialPlatformId(socialPlatformId); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java new file mode 100644 index 00000000..60351ffb --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java @@ -0,0 +1,155 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.iot.domain.SocialUser; +import com.fastbee.iot.mapper.SocialUserMapper; +import com.fastbee.iot.service.ISocialUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户第三方用户信息Service业务层处理 + * + * @author json + * @date 2022-04-18 + */ +@Service +public class SocialUserServiceImpl implements ISocialUserService +{ + @Autowired + private SocialUserMapper socialUserMapper; + + /** + * 查询用户第三方用户信息 + * + * @param socialUserId 用户第三方用户信息主键 + * @return 用户第三方用户信息 + */ + @Override + public SocialUser selectSocialUserBySocialUserId(Long socialUserId) + { + return socialUserMapper.selectSocialUserBySocialUserId(socialUserId); + } + + /** + * 查询用户第三方用户信息列表 + * + * @param socialUser 用户第三方用户信息 + * @return 用户第三方用户信息 + */ + @Override + public List selectSocialUserList(SocialUser socialUser) + { + return socialUserMapper.selectSocialUserList(socialUser); + } + + /** + * 新增用户第三方用户信息 + * + * @param socialUser 用户第三方用户信息 + * @return 结果 + */ + @Override + public int insertSocialUser(SocialUser socialUser) + { + socialUser.setCreateTime(DateUtils.getNowDate()); + return socialUserMapper.insertSocialUser(socialUser); + } + + /** + * 修改用户第三方用户信息 + * + * @param socialUser 用户第三方用户信息 + * @return 结果 + */ + @Override + public int updateSocialUser(SocialUser socialUser) + { + socialUser.setUpdateTime(DateUtils.getNowDate()); + return socialUserMapper.updateSocialUser(socialUser); + } + + /** + * 批量删除用户第三方用户信息 + * + * @param socialUserIds 需要删除的用户第三方用户信息主键 + * @return 结果 + */ + @Override + public int deleteSocialUserBySocialUserIds(Long[] socialUserIds) + { + return socialUserMapper.deleteSocialUserBySocialUserIds(socialUserIds); + } + + /** + * 删除用户第三方用户信息信息 + * + * @param socialUserId 用户第三方用户信息主键 + * @return 结果 + */ + @Override + public int deleteSocialUserBySocialUserId(Long socialUserId) + { + return socialUserMapper.deleteSocialUserBySocialUserId(socialUserId); + } + + /** + * 根据openId或unionId获取用户第三方信息 + * @param openId + * @param unionId + * @return + */ + @Override + public SocialUser selectOneByOpenIdAndUnionId(String openId, String unionId) { + return socialUserMapper.selectOneByOpenIdAndUnionId(openId, unionId); + } + + /** + * 通过unionId查询 + * + * @param unionId + * @return + */ + @Override + public Long selectSysUserIdByUnionId(String unionId) { + if (StringUtils.isEmpty(unionId)) { + return null; + } + return socialUserMapper.selectSysUserIdByUnionId(unionId); + } + + /** + * 通过系统用户id查询已绑定信息 + * @param sysUserId 系统用户id + * @return + */ + @Override + public List selectBySysUserId(Long sysUserId) { + return socialUserMapper.selectBySysUserId(sysUserId); + } + + /** + * 取消三方登录相关信息 + * @param sysUserId 系统用户id + * @param sourceClientList 来源具体平台 + * @return + */ + @Override + public int cancelBind(Long sysUserId, List sourceClientList) { + return socialUserMapper.deleteBySysUserIdAndSourceClient(sysUserId, sourceClientList); + } + + /** + * 取消三方登录相关信息 + * @param sysUserIds 系统用户id集合 + * @param sourceClientList 来源具体平台 + * @return + */ + @Override + public int batchCancelBind(Long[] sysUserIds, List sourceClientList) { + return socialUserMapper.deleteBySysUserIdsAndSourceClient(sysUserIds, sourceClientList); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelServiceImpl.java new file mode 100644 index 00000000..00d14821 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelServiceImpl.java @@ -0,0 +1,556 @@ +package com.fastbee.iot.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.iot.response.IdentityAndName; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.core.redis.RedisKeyBuilder; +import com.fastbee.common.enums.ThingsModelType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.iot.domain.Product; +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.domain.ThingsModelTemplate; +import com.fastbee.iot.mapper.ProductMapper; +import com.fastbee.iot.mapper.ThingsModelMapper; +import com.fastbee.iot.mapper.ThingsModelTemplateMapper; +import com.fastbee.iot.model.ImportThingsModelInput; +import com.fastbee.iot.model.ThingsModelPerm; +import com.fastbee.iot.model.ThingsModels.PropertyDto; +import com.fastbee.iot.model.varTemp.EnumClass; +import com.fastbee.iot.service.IThingsModelService; +import com.fastbee.iot.service.IThingsModelTemplateService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 物模型Service业务层处理 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +@Slf4j +public class ThingsModelServiceImpl implements IThingsModelService { + + @Autowired + private ThingsModelMapper thingsModelMapper; + + @Autowired + private ThingsModelTemplateMapper thingsModelTemplateMapper; + + @Autowired + private ProductMapper productMapper; + + @Autowired + private RedisCache redisCache; + @Resource + private IThingsModelTemplateService modelTemplateService; + + /** + * 查询物模型 + * + * @param modelId 物模型主键 + * @return 物模型 + */ + @Override + public ThingsModel selectThingsModelByModelId(Long modelId) + { + return thingsModelMapper.selectThingsModelByModelId(modelId); + } + + /** + * 查询单个物模型 + * @param model 物模型 + * @return 单个物模型 + */ + @Override + public ThingsModel selectSingleThingsModel(ThingsModel model){ + return thingsModelMapper.selectSingleThingsModel(model); + } + + /** + * 查询物模型列表 + * + * @param thingsModel 物模型 + * @return 物模型 + */ + @Override + public List selectThingsModelList(ThingsModel thingsModel) + { + return thingsModelMapper.selectThingsModelList(thingsModel); + } + + /** + * 查询物模型对应分享设备用户权限列表 + * + * @param productId 产品编号 + * @return 物模型 + */ + @Override + public List selectThingsModelPermList(Long productId) + { + return thingsModelMapper.selectThingsModelPermList(productId); + } + + /** + * 查询物模型列表-轮询使用 + * + * @param thingsModel 物模型 + * @return 物模型集合 + */ + @Override + public Map> selectThingsModelListCache(ThingsModel thingsModel){ + String cacheThingsModel = this.getCacheThingsModelByProductId(thingsModel.getProductId()); + if (StringUtils.isEmpty(cacheThingsModel)){ + List results = thingsModelMapper.selectThingsModelListCache(thingsModel); + return results.stream().collect(Collectors.groupingBy(IdentityAndName::getTempSlaveId)); + + } + Map cacheMap = redisCache.getCacheMap(RedisKeyBuilder.buildTSLCacheKey(thingsModel.getProductId())); + return cacheMap.values().stream().map(v -> JSON.parseObject(v.toString(), IdentityAndName.class)) + .filter(item -> StringUtils.isNotEmpty(item.getId())) + .sorted((o1,o2) -> { + Integer num1 = Integer.parseInt(o1.getId()); + Integer num2 = Integer.parseInt(o2.getId()); + return num1.compareTo(num2); + }) + .collect(Collectors.groupingBy(IdentityAndName::getTempSlaveId)); + } + + /** + * 新增物模型 + * + * @param thingsModel 物模型 + * @return 结果 + */ + @Override + public int insertThingsModel(ThingsModel thingsModel) + { + // 物模型标识符不能重复 TODO 重复查询待优化 + ThingsModel input=new ThingsModel(); + input.setProductId(thingsModel.getProductId()); + List list=thingsModelMapper.selectThingsModelList(input); + Boolean isRepeat=list.stream().anyMatch(x->x.getIdentifier().equals(thingsModel.getIdentifier())); + if(!isRepeat) { + SysUser user = getLoginUser().getUser(); + thingsModel.setTenantId(user.getUserId()); + thingsModel.setTenantName(user.getUserName()); + thingsModel.setCreateTime(DateUtils.getNowDate()); + int result = thingsModelMapper.insertThingsModel(thingsModel); + // 更新redis缓存 + setCacheThingsModelByProductId(thingsModel.getProductId()); + return result; + } + return 2; + } + + /** + * 导入通用物模型 + * @param input + * @return + */ + @Override + public int importByTemplateIds(ImportThingsModelInput input){ + // 物模型标识符不能重复 TODO 重复查询待优化 + ThingsModel inputParameter=new ThingsModel(); + inputParameter.setProductId(input.getProductId()); + List dbList=thingsModelMapper.selectThingsModelList(inputParameter); + + SysUser user = getLoginUser().getUser(); + // 根据ID集合获取通用物模型列表 + List templateList=thingsModelTemplateMapper.selectThingsModelTemplateByTemplateIds(input.getTemplateIds()); + //转换为产品物模型,并批量插入 + List list=new ArrayList<>(); + int repeatCount=0; + for(ThingsModelTemplate template : templateList){ + ThingsModel thingsModel= new ThingsModel(); + BeanUtils.copyProperties(template,thingsModel); + thingsModel.setTenantId(user.getUserId()); + thingsModel.setTenantName(user.getUserName()); + thingsModel.setCreateTime(DateUtils.getNowDate()); + thingsModel.setProductId(input.getProductId()); + thingsModel.setProductName(input.getProductName()); + thingsModel.setModelId(template.getTemplateId()); + thingsModel.setModelName(template.getTemplateName()); + thingsModel.setIsReadonly(template.getIsReadonly()); + thingsModel.setIsMonitor(template.getIsMonitor()); + thingsModel.setIsChart(template.getIsChart()); + thingsModel.setIsSharePerm(template.getIsSharePerm()); + thingsModel.setIsHistory(template.getIsHistory()); + thingsModel.setModelOrder(template.getModelOrder()); + //兼容modbsu + if (StringUtils.isNotEmpty(template.getTempSlaveId())){ + thingsModel.setTempSlaveId(Integer.parseInt(template.getTempSlaveId().split("#")[1])); + } + Boolean isRepeat=dbList.stream().anyMatch(x->x.getIdentifier().equals(thingsModel.getIdentifier())); + if(isRepeat){ + repeatCount=repeatCount+1; + }else{ + list.add(thingsModel); + } + } + if(list.size()>0) { + thingsModelMapper.insertBatchThingsModel(list); + //更新redis缓存 + setCacheThingsModelByProductId(input.getProductId()); + } + return repeatCount; + } + + /** + * 修改物模型 + * + * @param thingsModel 物模型 + * @return 结果 + */ + @Override + public int updateThingsModel(ThingsModel thingsModel) + { + // 物模型标识符不能重复 TODO 重复查询待优化 + ThingsModel input=new ThingsModel(); + input.setProductId(thingsModel.getProductId()); + List list=thingsModelMapper.selectThingsModelList(input); + Boolean isRepeat=list.stream().anyMatch(x->x.getIdentifier().equals(thingsModel.getIdentifier()) && x.getModelId().longValue()!=thingsModel.getModelId()); + if(!isRepeat) { + thingsModel.setUpdateTime(DateUtils.getNowDate()); + int result = thingsModelMapper.updateThingsModel(thingsModel); + // 更新redis缓存 + setCacheThingsModelByProductId(thingsModel.getProductId()); + return result; + } + return 2; + } + + /** + * 批量删除物模型 + * + * @param modelIds 需要删除的物模型主键 + * @return 结果 + */ + @Override + public int deleteThingsModelByModelIds(Long[] modelIds) + { + ThingsModel thingsModel=thingsModelMapper.selectThingsModelByModelId(modelIds[0]); + int result=thingsModelMapper.deleteThingsModelByModelIds(modelIds); + // 更新redis缓存 + setCacheThingsModelByProductId(thingsModel.getProductId()); + + return result; + } + + /** + * 删除物模型信息 + * + * @param modelId 物模型主键 + * @return 结果 + */ + @Override + public int deleteThingsModelByModelId(Long modelId) + { + ThingsModel thingsModel=thingsModelMapper.selectThingsModelByModelId(modelId); + int result=thingsModelMapper.deleteThingsModelByModelId(modelId); + // 更新redis缓存 + setCacheThingsModelByProductId(thingsModel.getProductId()); + return result; + } + + /** + * 根据产品ID获取JSON物模型 + * + * @param productId + * @return + */ + @Override + public String getCacheThingsModelByProductId(Long productId){ + if (productId == null) { + throw new ServiceException("产品id为空"); + } + // redis获取物模型 + Map map = redisCache.getCacheMap(RedisKeyBuilder.buildTSLCacheKey(productId)); + if (!CollectionUtils.isEmpty(map)) { + //兼容原页面物模型的数据格式 + Map> listMap = map.values().stream().map(v -> JSON.parseObject(v.toString(), PropertyDto.class)) + .collect(Collectors.groupingBy(dto -> ThingsModelType.getName(dto.getType()))); + return JSON.toJSONString(listMap); + } + return setCacheThingsModelByProductId(productId); + } + + + /** + * 获取单个物模型获取 + * @param productId + * @param identify + * @return + */ + @Override + public PropertyDto getSingleThingModels(Long productId, String identify){ + PropertyDto dto = new PropertyDto(); + String cacheKey = RedisKeyBuilder.buildTSLCacheKey(productId); + String value = redisCache.getCacheMapValue(cacheKey, identify); + //缓存没有则先查询数据库 + if (StringUtils.isEmpty(value)){ + ThingsModel thingsModel = new ThingsModel(); + if (identify.contains("#")){ + String[] split = identify.split("#"); + identify = split[0]; + thingsModel.setTempSlaveId(Integer.parseInt(split[1])); + } + thingsModel.setIdentifier(identify); + thingsModel.setProductId(productId); + ThingsModel selectModel = this.selectSingleThingsModel(thingsModel); + // redis和数据库都没有则是对象或数组类型。 兼容对象类型和数组类型 + if (StringUtils.isNull(dto.getId()) && identify.contains("_")){ + String[] split = identify.split("_"); + String thingsM = redisCache.getCacheMapValue(cacheKey, split[0]); + PropertyDto subDto = JSON.parseObject(thingsM, PropertyDto.class); + JSONArray array = JSON.parseArray(String.valueOf(subDto.getDatatype().get("params"))); + String finalIdentify = identify; + PropertyDto propertyDto = array.toJavaList(PropertyDto.class).stream() + .filter(x -> x.getId().equals(finalIdentify)) + .findFirst().get(); + propertyDto.setType(subDto.getType()); + return propertyDto; + } + if (null == selectModel) { + return dto; + } + BeanUtils.copyProperties(selectModel,dto); + dto.setId(selectModel.getIdentifier()); + dto.setName(selectModel.getModelName()); + dto.setIsParams(selectModel.getIsParams()); + dto.setDatatype(JSON.parseObject(selectModel.getSpecs())); + dto.setOrder(selectModel.getModelOrder()); + dto.setFormula(selectModel.getFormula()); + dto.setTempSlaveId(selectModel.getTempSlaveId()); + this.setCacheThingsModelByProductId(productId); + }else { + dto = JSON.parseObject(value, PropertyDto.class); + } + return dto; + } + + + /** + * 根据产品ID更新JSON物模型 + * @param productId + * @return + */ + private String setCacheThingsModelByProductId(Long productId){ + // 数据库查询物模型集合 + ThingsModel model=new ThingsModel(); + model.setProductId(productId); + List thingsModels=thingsModelMapper.selectThingsModelList(model); + /*这里key 1.非modbus为 identify 2. 是modbus设备时使用 identify#设备编号*/ + Map things = thingsModels.stream().collect(Collectors.toMap(key -> { + return key.getIdentifier() + (key.getTempSlaveId() == null ? "" : "#" + key.getTempSlaveId()); + }, + value -> { + //转换数据,减少不必要数据 + PropertyDto dto = new PropertyDto(); + BeanUtils.copyProperties(value,dto); + dto.setDatatype(JSONObject.parseObject(value.getSpecs())); + dto.setId(value.getIdentifier()); + dto.setRegId(value.getIdentifier()+ (value.getTempSlaveId() == null ? "" : "#" +value.getTempSlaveId())); + dto.setName(value.getModelName()); + dto.setOrder(value.getModelOrder()); + dto.setQuantity(value.getQuantity()); + dto.setCode(value.getCode()); + return JSONObject.toJSONString(dto); + })); + + /*缓存到redis*/ + String cacheKey = RedisKeyBuilder.buildTSLCacheKey(productId); + //先删除缓存 + if ( redisCache.containsKey(cacheKey)){ + redisCache.deleteObject(cacheKey); + } + redisCache.hashPutAll(cacheKey, things); + /*组装成原格式数据*/ + Map> result = things.values().stream().map(x -> JSON.parseObject(x, PropertyDto.class)) + .collect(Collectors.groupingBy(dto -> ThingsModelType.getName(dto.getType()))); + String jsonString = JSON.toJSONString(result); + Product product = new Product(); + product.setProductId(productId); + product.setThingsModelsJson(jsonString); + productMapper.updateThingsModelJson(product); + return jsonString; + } + + /** + * 批量查询产品的缓存物模型 --方法未使用,物模型结构暂不更改 + * + * @param productIds + * @return + */ + @Override + public Map getBatchCacheThingsModelByProductIds(Long[] productIds) { + // 批量查询hkey和value + Set set = new HashSet<>(); + for (int i = 0; i < productIds.length; i++) { + set.add(RedisKeyBuilder.buildTSLCacheKey(productIds[i])); + } + Map map = redisCache.getStringAllByKeys(set); + // 如果redis键和设备不匹配,添加redis缓存 + if (map == null || map.size() != productIds.length) { + for (int i = 0; i < productIds.length; i++) { + String key = RedisKeyBuilder.buildTSLCacheKey(productIds[i]); + if (map.get(key) != null) { + continue; + } else { + map.put(key, setCacheThingsModelByProductId(productIds[i])); + } + } + } + return map; + } + + /** + * 导入采集点数据 + * + * @param lists 数据列表 + * @param tempSlaveId 从机编码 + * @return 结果 + */ + public String importData(List lists, Integer tempSlaveId) { + if (null == tempSlaveId || CollectionUtils.isEmpty(lists)) { + throw new ServiceException("导入数据异常"); + } + int success = 0; + int failure = 0; + StringBuilder succSb = new StringBuilder(); + StringBuilder failSb = new StringBuilder(); + + for (ThingsModel model : lists) { + try { + //如果标识符为空,使用寄存器地址作为标识符 + if (null == model.getIdentifier() || "".equals(model.getIdentifier())) { + model.setIdentifier(model.getRegStr()); + } + /*16进制*/ + String reg = model.getRegStr(); + if (reg.endsWith("H")) { + String hex = reg.replace("H", ""); + int address = Integer.parseInt(hex, 16); + model.setRegAddr(address); + } + model.setTempSlaveId(tempSlaveId); + //处理数据定义 + this.parseSpecs(model); + this.insertThingsModel(model); + success++; + succSb.append("
").append(success).append(",采集点: ").append(model.getModelName()); + } catch (Exception e) { + log.error("导入错误:", e); + failure++; + failSb.append("
").append(failure).append(",采集点: ").append(model.getModelName()).append("导入失败"); + } + } + if (failure > 0) { + throw new ServiceException(failSb.toString()); + } + return succSb.toString(); + } + + private void parseSpecs(ThingsModel model) { + JSONObject specs = new JSONObject(); + String datatype = model.getDatatype(); + String limitValue = model.getLimitValue(); + if (limitValue != null && !"".equals(limitValue)) { + String[] values = limitValue.split("/"); + switch (datatype) { + case "integer": + specs.put("max", values[1]); + specs.put("min", values[0]); + specs.put("type", datatype); + specs.put("unit", model.getUnit()); + specs.put("step", 0); + break; + case "bool": + specs.put("type", datatype); + specs.put("trueText", values[1]); + specs.put("falseText", values[0]); + break; + case "enum": + List list = new ArrayList<>(); + for (String value : values) { + String[] params = value.split(":"); + EnumClass enumCls = new EnumClass(); + enumCls.setText(params[1]); + enumCls.setValue(params[0]); + list.add(enumCls); + } + specs.put("type", datatype); + specs.put("enumList", list); + break; + } + model.setSpecs(specs.toJSONString()); + } + } + + /** + * 根据模板id查询从机采集点列表 + * + * @return 变量模板从机采集点集合 + */ + @Override + public List selectAllByTemplateId(Long templateId) { + return thingsModelMapper.selectAllByTemplateId(templateId); + } + + /** + * 根据产品id删除 产品物模型以及物模型缓存 + * @param productId + */ + @Override + public void deleteProductThingsModelAndCacheByProductId(Long productId){ + thingsModelMapper.deleteThingsModelByProductId(productId); + String cacheKey = RedisKeyBuilder.buildTSLCacheKey(productId); + redisCache.deleteObject(cacheKey); + } + + /** + * 同步采集点模板 + * @param productIds 产品id列表 + * @param templateId 采集点模板id + */ + @Override + public void synchronizeVarTempToProduct(List productIds,Long templateId){ + assert templateId != null : "采集点模板id不能为空"; + assert !CollectionUtils.isEmpty(productIds): "同步的产品不能为空"; + //查询产品以及产品对应的物模型,并删除 + for (Long productId : productIds) { + Product product = productMapper.selectProductByProductId(productId); + assert product != null : "同步的产品不存在:" + productId; + //删除产品的物模型以及物模型缓存 + this.deleteProductThingsModelAndCacheByProductId(productId); + //获取最新的采集点模板数据,并更新到产品以及产品缓存 + List thingsModelTemplates = modelTemplateService.selectAllByTemplateId(templateId); + Long[] ids = thingsModelTemplates.stream().map(ThingsModelTemplate::getTemplateId).toArray(Long[]::new); + ImportThingsModelInput input = new ImportThingsModelInput(); + input.setTemplateIds(ids); + input.setProductId(product.getProductId()); + input.setProductName(product.getProductName()); + this.importByTemplateIds(input); + /*更新到产品缓存*/ + setCacheThingsModelByProductId(productId); + //清除缓存轮询指令 + String cacheKey = RedisKeyBuilder.buildModbusCacheKey(productId); + redisCache.deleteObject(cacheKey); + } + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelTemplateServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelTemplateServiceImpl.java new file mode 100644 index 00000000..d82342f7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ThingsModelTemplateServiceImpl.java @@ -0,0 +1,261 @@ +package com.fastbee.iot.service.impl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.iot.model.varTemp.EnumClass; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fastbee.iot.mapper.ThingsModelTemplateMapper; +import com.fastbee.iot.domain.ThingsModelTemplate; +import com.fastbee.iot.service.IThingsModelTemplateService; +import org.springframework.util.CollectionUtils; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 通用物模型Service业务层处理 + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +@Slf4j +public class ThingsModelTemplateServiceImpl implements IThingsModelTemplateService +{ + @Autowired + private ThingsModelTemplateMapper thingsModelTemplateMapper; + + /** + * 查询通用物模型 + * + * @param templateId 通用物模型主键 + * @return 通用物模型 + */ + @Override + public ThingsModelTemplate selectThingsModelTemplateByTemplateId(Long templateId) + { + return thingsModelTemplateMapper.selectThingsModelTemplateByTemplateId(templateId); + } + + /** + * 查询通用物模型列表 + * + * @param thingsModelTemplate 通用物模型 + * @return 通用物模型 + */ + @Override + public List selectThingsModelTemplateList(ThingsModelTemplate thingsModelTemplate) + { + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + // 租户 + if(roles.stream().anyMatch(a->a.getRoleKey().equals("tenant"))){ + thingsModelTemplate.setTenantId(user.getUserId()); + } + return thingsModelTemplateMapper.selectThingsModelTemplateList(thingsModelTemplate); + } + + /** + * 新增通用物模型 + * + * @param template 通用物模型 + * @return 结果 + */ + @Override + public int insertThingsModelTemplate(ThingsModelTemplate template) + { + try { + // 判断是否为管理员 + template.setIsSys(1); + SysUser user = getLoginUser().getUser(); + List roles=user.getRoles(); + for(int i=0;i selectAllByTemplateId(Long templateId) { + return thingsModelTemplateMapper.selectAllByTemplateId(templateId); + } + + /** + * 导入采集点数据 + * + * @param lists 数据列表 + * @param tempSlaveId 从机编码 + * @return 结果 + */ + public String importData(List lists, String tempSlaveId) { + if (null == tempSlaveId || CollectionUtils.isEmpty(lists)) { + throw new ServiceException("导入数据异常"); + } + int success = 0; + int failure = 0; + StringBuilder succSb = new StringBuilder(); + StringBuilder failSb = new StringBuilder(); + + for (ThingsModelTemplate model : lists) { + try { + //处理数据定义 + this.parseSpecs(model); + model.setTempSlaveId(tempSlaveId); + this.insertThingsModelTemplate(model); + success++; + succSb.append("
").append(success).append(",采集点: ").append(model.getTemplateName()); + } catch (Exception e) { + log.error("导入错误:", e); + failure++; + failSb.append("
").append(failure).append(",采集点: ").append(model.getTemplateName()).append("导入失败"); + } + } + if (failure > 0) { + throw new ServiceException(failSb.toString()); + } + return succSb.toString(); + } + + private void parseSpecs(ThingsModelTemplate model) { + JSONObject specs = new JSONObject(); + String datatype = model.getDatatype(); + String limitValue = model.getLimitValue(); + if (limitValue != null && !"".equals(limitValue)) { + String[] values = limitValue.trim().split("/"); + switch (datatype) { + case "integer": + specs.put("max", new BigDecimal(values[1])); + specs.put("min", new BigDecimal(values[0])); + specs.put("type", datatype); + specs.put("unit", model.getUnit()); + specs.put("step", 0); + break; + case "bool": + specs.put("type",datatype); + specs.put("trueText",values[1]); + specs.put("falseText",values[0]); + break; + case "enum": + List list = new ArrayList<>(); + for (String value : values) { + String[] params = value.trim().split(":"); + EnumClass enumCls = new EnumClass(); + enumCls.setText(params[1]); + enumCls.setValue(params[0]); + list.add(enumCls); + } + specs.put("type",datatype); + specs.put("enumList",list); + break; + } + model.setSpecs(specs.toJSONString()); + } + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ToolServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ToolServiceImpl.java new file mode 100644 index 00000000..a505573b --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/ToolServiceImpl.java @@ -0,0 +1,536 @@ +package com.fastbee.iot.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.annotation.DataScope; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.exception.user.CaptchaException; +import com.fastbee.common.exception.user.CaptchaExpireException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.manager.AsyncManager; +import com.fastbee.framework.manager.factory.AsyncFactory; +import com.fastbee.iot.domain.ProductAuthorize; +import com.fastbee.iot.mapper.ProductAuthorizeMapper; +import com.fastbee.iot.model.*; +import com.fastbee.iot.service.IDeviceService; +import com.fastbee.iot.service.IToolService; +import com.fastbee.iot.util.AESUtils; +import com.fastbee.system.mapper.SysUserMapper; +import com.fastbee.system.service.ISysConfigService; +import com.fastbee.system.service.ISysUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Random; + +/** + * + * @author kerwincui + * @date 2021-12-16 + */ +@Service +public class ToolServiceImpl implements IToolService +{ + private static final Logger log = LoggerFactory.getLogger(ToolServiceImpl.class); + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService configService; + + @Autowired + private ISysUserService userService; + + @Autowired + private SysUserMapper userMapper; + + @Autowired + private ProductAuthorizeMapper productAuthorizeMapper; + @Autowired + @Lazy + private IDeviceService deviceService; + + /** + * 生成随机数字和字母 + */ + @Override + public String getStringRandom(int length) { + String val = ""; + Random random = new Random(); + //参数length,表示生成几位随机数 + for(int i = 0; i < length; i++) { + String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; + //输出字母还是数字 + if( "char".equalsIgnoreCase(charOrNum) ) { + //输出是大写字母还是小写字母 + // int temp = random.nextInt(2) % 2 == 0 ? 65 : 97; + val += (char)(random.nextInt(26) + 65); + } else if( "num".equalsIgnoreCase(charOrNum) ) { + val += String.valueOf(random.nextInt(10)); + } + } + return val; + } + + /** + * 生成任意长度 HEX格式字符串 + * @param length + * @return + */ + public String generateRandomHex(int length) { + Random random = new Random(); + StringBuilder sb = new StringBuilder(length); + // 添加"D"作为开头 + sb.append("D"); + for (int i = 1; i < length; i++) { + int randomInt = random.nextInt(16); // 生成0到15的随机整数 + char hexChar = Character.toUpperCase(Character.forDigit(randomInt, 16)); // 将整数转换为十六进制字符并转为大写 + sb.append(hexChar); + } + return sb.toString(); + } + + + /** + * 注册 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String register(RegisterUserInput registerBody) + { + String msg = ""; + String username = registerBody.getUsername(); + String password = registerBody.getPassword(); + String phonenumber=registerBody.getPhonenumber(); + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + + boolean captchaEnabled = configService.selectCaptchaEnabled(); + // 验证码开关 + if (captchaEnabled) + { + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(sysUser))) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + }else if (UserConstants.NOT_UNIQUE.equals(checkPhoneUnique(phonenumber))) + { + msg = "保存用户'" + username + "'失败,注册手机号码已存在"; + } + else + { + sysUser.setNickName(username); + sysUser.setPhonenumber(phonenumber); + sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); + boolean regFlag = userService.registerUser(sysUser); + //分配普通用户角色(1=超级管理员,2=设备租户,3=普通用户,4=游客) + Long[] roleIds={3L}; + userService.insertUserAuth(sysUser.getUserId(),roleIds); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, + MessageUtils.message("user.register.success"))); + } + } + return msg; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public RegisterUserOutput registerNoCaptcha(RegisterUserInput registerBody) + { + RegisterUserOutput registerUserOutput = new RegisterUserOutput(); + String msg = ""; + String username = registerBody.getUsername(); + String password = registerBody.getPassword(); + String phonenumber=registerBody.getPhonenumber(); + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(sysUser))) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + }else if (UserConstants.NOT_UNIQUE.equals(checkPhoneUnique(phonenumber))) + { + msg = "保存用户'" + username + "'失败,注册手机号码已存在"; + } + else + { + sysUser.setNickName(username); + sysUser.setPhonenumber(phonenumber); + sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); + boolean regFlag = userService.registerUser(sysUser); + //分配普通用户角色(1=超级管理员,2=设备租户,3=普通用户,4=游客) + Long[] roleIds={3L}; + userService.insertUserAuth(sysUser.getUserId(),roleIds); + registerUserOutput.setSysUserId(sysUser.getUserId()); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, + MessageUtils.message("user.register.success"))); + } + } + registerUserOutput.setMsg(msg); + return registerUserOutput; + } + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserList(SysUser user) + { + return userMapper.selectUserList(user); + } + + /** + * 校验手机号码是否唯一 + * + * @param phonenumber 手机号码 + * @return + */ + public String checkPhoneUnique(String phonenumber) + { + SysUser info = userMapper.checkPhoneUnique(phonenumber); + if (StringUtils.isNotNull(info)) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException(); + } + } + + /** + * 设备简单认证 + */ + @Override + public ResponseEntity simpleMqttAuthentication(MqttAuthenticationModel mqttModel, ProductAuthenticateModel productModel) { + // 1=简单认证,2=加密认证,3=简单+加密认证 + if(productModel.getVertificateMethod()!=1 && productModel.getVertificateMethod()!=3){ + return returnUnauthorized(mqttModel, "设备简单认证,设备对应产品不支持简单认证"); + } + String[] passwordArray = mqttModel.getPassword().split("&"); + if (productModel.getIsAuthorize() == 1 && passwordArray.length != 2) { + return returnUnauthorized(mqttModel, "设备简单认证,产品启用授权码后,密码格式为:密码 & 授权码"); + } + String mqttPassword = passwordArray[0]; + String authCode = passwordArray.length == 2 ? passwordArray[1] : ""; + // 验证用户名 + if (!mqttModel.getUserName().equals(productModel.getMqttAccount())) { + return returnUnauthorized(mqttModel, "设备简单认证,设备mqtt用户名错误"); + } + // 验证密码 + if (!mqttPassword.equals(productModel.getMqttPassword())) { + return returnUnauthorized(mqttModel, "设备简单认证,设备mqtt密码错误"); + } + // 验证授权码 + if (productModel.getIsAuthorize() == 1) { + // 授权码验证和处理 + String resultMessage = authCodeProcess(authCode, mqttModel, productModel); + if (!resultMessage.equals("")) { + return returnUnauthorized(mqttModel, resultMessage); + } + } + if (productModel.getDeviceId() != null && productModel.getDeviceId() != 0) { + if (productModel.getStatus() == 2) { + return returnUnauthorized(mqttModel, "设备简单认证,设备处于禁用状态"); + } + log.info("-----------设备简单认证成功,clientId:" + mqttModel.getClientId() + "---------------"); + return ResponseEntity.ok().body("ok"); + } else { + // 自动添加设备 + int result = deviceService.insertDeviceAuto(mqttModel.getDeviceNumber(), mqttModel.getUserId(), mqttModel.getProductId()); + if (result == 1) { + log.info("-----------设备简单认证成功,并自动添加设备到系统,clientId:" + mqttModel.getClientId() + "---------------"); + return ResponseEntity.ok().body("ok"); + } + return returnUnauthorized(mqttModel, "设备简单认证,自动添加设备失败"); + } + } + + /** + * 设备加密认证 + * + * @return + */ + @Override + public ResponseEntity encryptAuthentication(MqttAuthenticationModel mqttModel, ProductAuthenticateModel productModel) throws Exception { + // 1=简单认证,2=加密认证,3=简单+加密认证 + if(productModel.getVertificateMethod()!=2 && productModel.getVertificateMethod()!=3){ + return returnUnauthorized(mqttModel, "设备加密认证,设备对应产品不支持加密认证"); + } + String decryptPassword = AESUtils.decrypt(mqttModel.getPassword(), productModel.getMqttSecret()); + if (decryptPassword == null || decryptPassword.equals("")) { + return returnUnauthorized(mqttModel, "设备加密认证,mqtt密码解密失败"); + } + String[] passwordArray = decryptPassword.split("&"); + if (passwordArray.length != 2 && passwordArray.length != 3) { + // 密码加密格式 password & expireTime (& authCode 可选) + return returnUnauthorized(mqttModel, "设备加密认证,mqtt密码加密格式为:密码 & 过期时间 & 授权码,其中授权码为可选"); + } + String mqttPassword = passwordArray[0]; + Long expireTime = Long.valueOf(passwordArray[1]); + String authCode = passwordArray.length == 3 ? passwordArray[2] : ""; + // 验证用户名 + if (!mqttModel.getUserName().equals(productModel.getMqttAccount())) { + return returnUnauthorized(mqttModel, "设备加密认证,设备mqtt用户名错误"); + } + // 验证密码 + if (!mqttPassword.equals(productModel.getMqttPassword())) { + return returnUnauthorized(mqttModel, "设备加密认证,设备mqtt密码错误"); + } + // 验证过期时间 + if (expireTime < System.currentTimeMillis()) { + return returnUnauthorized(mqttModel, "设备加密认证,设备mqtt密码已过期"); + } + // 验证授权码 + if (productModel.getIsAuthorize() == 1) { + // 授权码验证和处理 + String resultMessage = authCodeProcess(authCode, mqttModel, productModel); + if (!resultMessage.equals("")) { + return returnUnauthorized(mqttModel, resultMessage); + } + } + // 设备状态验证 (1-未激活,2-禁用,3-在线,4-离线) + if (productModel.getDeviceId() != null && productModel.getDeviceId() != 0) { + if (productModel.getStatus() == 2) { + return returnUnauthorized(mqttModel, "设备加密认证,设备处于禁用状态"); + } + log.info("-----------设备加密认证成功,clientId:" + mqttModel.getClientId() + "---------------"); + return ResponseEntity.ok().body("ok"); + } else { + // 自动添加设备 + int result = deviceService.insertDeviceAuto(mqttModel.getDeviceNumber(), mqttModel.getUserId(), mqttModel.getProductId()); + if (result == 1) { + log.info("-----------设备加密认证成功,并自动添加设备到系统,clientId:" + mqttModel.getClientId() + "---------------"); + return ResponseEntity.ok().body("ok"); + } + return returnUnauthorized(mqttModel, "设备加密认证,自动添加设备失败"); + } + } + + /** + * 整合设备认证接口 + */ + @Override + public ResponseEntity clientAuth(String clientid,String username,String password) throws Exception { + // 设备端认证:加密认证(E)和简单认证(S,配置的账号密码认证) + String[] clientArray = clientid.split("&"); + if(clientArray.length != 4 || clientArray[0].equals("") || clientArray[1].equals("") || clientArray[2].equals("") || clientArray[3].equals("")){ + return this.returnUnauthorized(new MqttAuthenticationModel(clientid, username, password), "设备mqtt客户端Id格式为:认证类型 & 设备编号 & 产品ID & 用户ID"); + } + String authType = clientArray[0]; + String deviceNumber = clientArray[1]; + Long productId = Long.valueOf(clientArray[2]); + Long userId = Long.valueOf(clientArray[3]); + // 产品认证信息 + ProductAuthenticateModel model = deviceService.selectProductAuthenticate(new AuthenticateInputModel(deviceNumber, productId)); + if (model == null) { + return this.returnUnauthorized(new MqttAuthenticationModel(clientid, username, password), "设备认证,通过产品ID查询不到信息"); + } + if (model.getProductStatus() != 2) { + // 产品必须为发布状态:1-未发布,2-已发布 + return this.returnUnauthorized(new MqttAuthenticationModel(clientid, username, password), "设备认证,设备对应产品还未发布"); + } + + if (authType.equals("S")) { + // 设备简单认证 + return this.simpleMqttAuthentication(new MqttAuthenticationModel(clientid, username, password, deviceNumber, productId, userId), model); + + } else if (authType.equals("E")) { + // 设备加密认证 + return this.encryptAuthentication(new MqttAuthenticationModel(clientid, username, password, deviceNumber, productId, userId), model); + } else { + return this.returnUnauthorized(new MqttAuthenticationModel(clientid, username, password), "设备认证,认证类型有误"); + } + } + + @Override + public ResponseEntity clientAuthv5(String clientid,String username,String password) throws Exception { + JSONObject ret = new JSONObject(); + ret.put("is_superuser", false); + // 设备端认证:加密认证(E)和简单认证(S,配置的账号密码认证) + String[] clientArray = clientid.split("&"); + if(clientArray.length != 4 || clientArray[0].equals("") || clientArray[1].equals("") || clientArray[2].equals("") || clientArray[3].equals("")){ + return this.returnUnauthorized(new MqttAuthenticationModel(clientid, username, password), "设备mqtt客户端Id格式为:认证类型 & 设备编号 & 产品ID & 用户ID"); + } + String authType = clientArray[0]; + String deviceNumber = clientArray[1]; + Long productId = Long.valueOf(clientArray[2]); + Long userId = Long.valueOf(clientArray[3]); + // 产品认证信息 + ProductAuthenticateModel model = deviceService.selectProductAuthenticate(new AuthenticateInputModel(deviceNumber, productId)); + if (model == null) { + log.error("-----------设备认证,通过产品ID查询不到信息,clientId:" + clientid + "---------------"); + ret.put("result", "deny"); + return ResponseEntity.ok().body(ret); + } + if (model.getProductStatus() != 2) { + // 产品必须为发布状态:1-未发布,2-已发布 + log.error("-----------设备认证,设备对应产品还未发布,clientId:" + clientid + "---------------"); + ret.put("result", "deny"); + return ResponseEntity.ok().body(ret); + } + + if (authType.equals("S")) { + // 设备简单认证 + ResponseEntity res = this.simpleMqttAuthentication(new MqttAuthenticationModel(clientid, username, password, deviceNumber, productId, userId), model); + if (res.getStatusCodeValue() == HttpStatus.OK.value()){ + ret.put("result", "allow"); + return ResponseEntity.ok().body(ret); + } else { + ret.put("result", "deny"); + return ResponseEntity.ok().body(ret); + } + + } else if (authType.equals("E")) { + // 设备加密认证 + ResponseEntity res = this.encryptAuthentication(new MqttAuthenticationModel(clientid, username, password, deviceNumber, productId, userId), model); + if (res.getStatusCodeValue() == HttpStatus.OK.value()){ + ret.put("result", "allow"); + return ResponseEntity.ok().body(ret); + } else { + ret.put("result", "deny"); + return ResponseEntity.ok().body(ret); + } + } else { + log.error("-----------设备认证,认证类型有误,clientId:" + clientid + "---------------"); + ret.put("result", "deny"); + return ResponseEntity.ok().body(ret); + } + } + + /** + * 授权码认证和处理 + */ + private String authCodeProcess(String authCode, MqttAuthenticationModel mqttModel, ProductAuthenticateModel productModel) { + String message = ""; + if (authCode.equals("")) { + return message = "设备认证,设备授权码不能为空"; + } + // 查询授权码是否存在 + ProductAuthorize authorize = productAuthorizeMapper.selectFirstAuthorizeByAuthorizeCode(new ProductAuthorize(authCode, productModel.getProductId())); + if (authorize == null) { + message = "设备认证,设备授权码错误"; + return message; + } + if (authorize.getSerialNumber() != null && !authorize.getSerialNumber().equals("")) { + // 授权码已关联设备 + if (!authorize.getSerialNumber().equals( productModel.getSerialNumber())) { + message = "设备认证,设备授权码已经分配给其他设备"; + return message; + } + } else { + // 授权码未关联设备 + authorize.setSerialNumber(mqttModel.getDeviceNumber()); + authorize.setUserId(mqttModel.getUserId()); + authorize.setUserName(""); + authorize.setUpdateTime(DateUtils.getNowDate()); + // 状态(1-未使用,2-使用中) + authorize.setStatus(2); + int result = productAuthorizeMapper.updateProductAuthorize(authorize); + if (result != 1) { + message = "设备认证,设备授权码关联失败"; + return message; + } + } + return message; + } + + /** + * 返回认证信息 + */ + @Override + public ResponseEntity returnUnauthorized(MqttAuthenticationModel mqttModel, String message) { + log.warn("认证失败:" + message + + "\nclientid:" + mqttModel.getClientId() + + "\nusername:" + mqttModel.getUserName() + + "\npassword:" + mqttModel.getPassword()); + return ResponseEntity.status(401).body("Unauthorized"); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/UserSocialProfileServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/UserSocialProfileServiceImpl.java new file mode 100644 index 00000000..f23a5902 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/UserSocialProfileServiceImpl.java @@ -0,0 +1,105 @@ +package com.fastbee.iot.service.impl; + +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.SocialPlatformType; +import com.fastbee.iot.domain.SocialUser; +import com.fastbee.iot.domain.UserSocialProfile; +import com.fastbee.iot.model.login.BindIdValue; +import com.fastbee.iot.service.ISocialPlatformService; +import com.fastbee.iot.service.ISocialUserService; +import com.fastbee.iot.service.IUserSocialProfileService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +import static com.fastbee.iot.service.impl.SocialLoginServiceImpl.BIND_REDIS_KEY; + +@Service +public class UserSocialProfileServiceImpl implements IUserSocialProfileService { + + @Autowired + private RedisCache redisCache; + @Autowired + private ISocialUserService iSocialUserService; + @Autowired + private ISocialPlatformService iSocialPlatformService; + + @Override + public List selectUserSocialProfile(Long sysUserId) { + SocialUser selectSocialUser = new SocialUser(); + selectSocialUser.setSysUserId(sysUserId); + List socialUserList = iSocialUserService.selectSocialUserList(selectSocialUser); + List userSocialProfileList = new ArrayList<>(); + for (SocialUser socialUser : socialUserList) { + //如果是删除的标记 + if (socialUser.getDelFlag().equals("1")) { + continue; + } + UserSocialProfile userSocialProfile = new UserSocialProfile(); + userSocialProfile.setSocialUserId(socialUser.getSocialUserId()); + userSocialProfile.setAvatar(socialUser.getAvatar()); + userSocialProfile.setSource(socialUser.getSource()); + userSocialProfile.setUsername(socialUser.getUsername()); + userSocialProfile.setNickname(socialUser.getNickname()); + userSocialProfile.setStatus(socialUser.getStatus()); + userSocialProfile.setSourceClient(socialUser.getSourceClient()); + userSocialProfileList.add(userSocialProfile); + } + return userSocialProfileList; + } + + @Override + public AjaxResult bindUser(String bindId, Long sysUserId) { + BindIdValue bindValue = redisCache.getCacheObject(BIND_REDIS_KEY + bindId); + if (bindValue == null) { + //不作提示 + return AjaxResult.error(HttpStatus.NO_MESSAGE_ALERT, "未知异常"); + } + SocialUser socialUser = findSocialUser(bindValue.getUuid(), bindValue.getSource()); + SocialUser updateSocialUser = new SocialUser(); + updateSocialUser.setSocialUserId(socialUser.getSocialUserId()); + updateSocialUser.setSysUserId(sysUserId); + iSocialUserService.updateSocialUser(updateSocialUser); + redisCache.deleteObject(BIND_REDIS_KEY + bindId); + return AjaxResult.success("绑定成功!"); + } + + @Override + public AjaxResult bindSocialAccount(String platform) { + try { + SocialPlatformType.valueOf(platform); + } catch (Exception e) { + return AjaxResult.error("错误平台类型"); + } + return AjaxResult.success(); + } + + @Override + public AjaxResult unbindSocialAccount(Long socialUserId, Long sysUserId) { + SocialUser socialUser = iSocialUserService.selectSocialUserBySocialUserId(socialUserId); + if (socialUser == null) { + return AjaxResult.error("绑定账户不存在!"); + } else if (!socialUser.getSysUserId().equals(socialUserId)) { + return AjaxResult.error("用户账户和绑定账户不匹配!"); + } else { + SocialUser updateSocialUser = new SocialUser(); + updateSocialUser.setSocialUserId(socialUserId); + updateSocialUser.setSysUserId(-1L); + iSocialUserService.updateSocialUser(updateSocialUser); + return AjaxResult.success("解除绑定成功!"); + } + } + + public SocialUser findSocialUser(String uuid, String source) { + SocialUser socialUser = new SocialUser(); + socialUser.setSource(source); + socialUser.setUuid(uuid); + List socialUserList = iSocialUserService.selectSocialUserList(socialUser); + return socialUserList == null || socialUserList.isEmpty() ? null : socialUserList.get(0); + + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/ILogService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/ILogService.java new file mode 100644 index 00000000..05baa098 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/ILogService.java @@ -0,0 +1,35 @@ +package com.fastbee.iot.tdengine.service; + +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.domain.DeviceLog; + +import com.fastbee.iot.model.DeviceStatistic; +import com.fastbee.iot.model.HistoryModel; +import com.fastbee.iot.model.MonitorModel; +import com.fastbee.iot.tdengine.service.model.TdLogDto; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @package iot.iot.log + * 类名: LogService + * 描述: 设备日志记录接口 + * 时间: 2022/5/19,0019 18:04 + * 开发人: admin + */ +public interface ILogService { + + /** 根据设备编号删除设备日志 **/ + int deleteDeviceLogByDeviceNumber(String deviceNumber); + + /** 设备属性、功能、事件总数 **/ + DeviceStatistic selectCategoryLogCount(Device device); + + /** 查询监测数据列表 **/ + List selectMonitorList(DeviceLog deviceLog); + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/impl/MySqlLogServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/impl/MySqlLogServiceImpl.java new file mode 100644 index 00000000..80fe0bf8 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/impl/MySqlLogServiceImpl.java @@ -0,0 +1,55 @@ +package com.fastbee.iot.tdengine.service.impl; + +import com.fastbee.common.utils.DateUtils; +import com.fastbee.iot.domain.Device; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.model.DeviceStatistic; +import com.fastbee.iot.model.HistoryModel; +import com.fastbee.iot.tdengine.service.ILogService; +import com.fastbee.iot.mapper.DeviceLogMapper; +import com.fastbee.iot.model.MonitorModel; +import com.fastbee.iot.tdengine.service.model.TdLogDto; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class MySqlLogServiceImpl implements ILogService { + + private DeviceLogMapper deviceLogMapper; + + public MySqlLogServiceImpl(DeviceLogMapper _deviceLogMapper){ + this.deviceLogMapper=_deviceLogMapper; + } + + /*** + * 根据设备ID删除设备日志 + * @return + */ + @Override + public int deleteDeviceLogByDeviceNumber(String deviceNumber) { + return deviceLogMapper.deleteDeviceLogByDeviceNumber(deviceNumber); + } + + /*** + * 设备属性、功能、事件和监测数据总数 + * @return + */ + @Override + public DeviceStatistic selectCategoryLogCount(Device device){ + return deviceLogMapper.selectCategoryLogCount(device); + } + + + /*** + * 监测数据列表 + * @return + */ + @Override + public List selectMonitorList(DeviceLog deviceLog) { + return deviceLogMapper.selectMonitorList(deviceLog); + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/model/TdLogDto.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/model/TdLogDto.java new file mode 100644 index 00000000..54e1b91f --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/tdengine/service/model/TdLogDto.java @@ -0,0 +1,27 @@ +package com.fastbee.iot.tdengine.service.model; + +import com.fastbee.iot.domain.DeviceLog; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author gsb + * @date 2023/6/5 8:37 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TdLogDto { + + /** + * 设备编号 + */ + private String serialNumber; + /** + * 设备日志列表 + */ + private List list; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/AESUtils.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/AESUtils.java new file mode 100644 index 00000000..e42d99cb --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/AESUtils.java @@ -0,0 +1,120 @@ +package com.fastbee.iot.util; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import java.security.MessageDigest; + +/** + * + */ +public class AESUtils { + + /** + * 加密用的Key 可以用26个字母和数字组成 使用AES-128-CBC加密模式,key需要为16位。iv 偏移量,长度16 + */ + private static final String ivString = "wumei-smart-open"; + private static final String ENCRYPT_MODE = "CBC"; // ECB和CBC两种模式 + + // 加密 + public static String encrypt(String plainText, String key) { + // 判断Key是否正确 + if (key == null || key.length() != 16) { + System.out.print("Key不能为空,长度不是16位"); + return null; + } + try { + byte[] raw = key.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES/" + AESUtils.ENCRYPT_MODE + "/PKCS5Padding"); + if (AESUtils.ENCRYPT_MODE.equals("ECB")) { + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + } else { + IvParameterSpec iv = new IvParameterSpec(ivString.getBytes("utf-8"));//使用CBC模式,需要一个向量iv,可增加加密算法的强度 + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); + } + byte[] encrypted = cipher.doFinal(plainText.getBytes("utf-8")); + String encryptedStr = new String(new BASE64Encoder().encode(encrypted)); + //此处使用BASE64做转码功能,同时能起到2次加密的作用。 + return encryptedStr; + } catch (Exception ex) { + System.out.println(ex.toString()); + return null; + } + } + + // 解密 + public static String decrypt(String cipherText, String key) { + // 判断Key是否正确 + if (key == null || key.length() != 16) { + System.out.print("Key不能为空,长度不是16位"); + return null; + } + // 根据html规范,后端接口,接收参数包含+号会被替换为空格。所以这里需要还原回来,不然会造成解密失败 + cipherText=cipherText.replace(' ','+'); + + try { + byte[] raw = key.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES/" + AESUtils.ENCRYPT_MODE + "/PKCS5Padding"); + if (AESUtils.ENCRYPT_MODE.equals("ECB")) { + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + } else { + //使用CBC模式,需要一个向量iv,可增加加密算法的强度 + IvParameterSpec iv = new IvParameterSpec(ivString.getBytes("utf-8")); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + } + //先用base64解密 + byte[] encrypted = new BASE64Decoder().decodeBuffer(cipherText); + try { + byte[] original = cipher.doFinal(encrypted); + String originalString = new String(original, "utf-8"); + return originalString; + } catch (Exception e) { + System.out.println(e.toString()); + return null; + } + } catch (Exception ex) { + System.out.println(ex.toString()); + return null; + } + } + + /** + * 进行MD5加密 + * + * @param s 要进行MD5转换的字符串 + * @return 该字符串的MD5值的8-24位 + */ + public static String getMD5(String s) { + char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + + try { + byte[] btInput = s.getBytes(); + // 获得MD5摘要算法的 MessageDigest 对象 + MessageDigest mdInst = MessageDigest.getInstance("MD5"); + // 使用指定的字节更新摘要 + mdInst.update(btInput); + // 获得密文 + byte[] md = mdInst.digest(); + // 把密文转换成十六进制的字符串形式 + int j = md.length; + char str[] = new char[j * 2]; + int k = 0; + for (int i = 0; i < j; i++) { + byte byte0 = md[i]; + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str).substring(8, 24); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/SnowflakeIdWorker.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/SnowflakeIdWorker.java new file mode 100644 index 00000000..232cd4d4 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/SnowflakeIdWorker.java @@ -0,0 +1,104 @@ +package com.fastbee.iot.util; + +public class SnowflakeIdWorker { + /** + * 开始时间:2020-01-01 00:00:00 + */ + private final long beginTs = 1577808000000L; + + private final long workerIdBits = 10; + + /** + * 2^10 - 1 = 1023 + */ + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + + private final long sequenceBits = 12; + + /** + * 2^12 - 1 = 4095 + */ + private final long maxSequence = -1L ^ (-1L << sequenceBits); + + /** + * 时间戳左移22位 + */ + private final long timestampLeftOffset = workerIdBits + sequenceBits; + + /** + * 业务ID左移12位 + */ + private final long workerIdLeftOffset = sequenceBits; + + /** + * 合并了机器ID和数据标示ID,统称业务ID,10位 + */ + private long workerId; + + /** + * 毫秒内序列,12位,2^12 = 4096个数字 + */ + private long sequence = 0L; + + /** + * 上一次生成的ID的时间戳,同一个worker中 + */ + private long lastTimestamp = -1L; + + public SnowflakeIdWorker(long workerId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("WorkerId必须大于或等于0且小于或等于%d", maxWorkerId)); + } + + this.workerId = workerId; + } + + public synchronized long nextId() { + long ts = System.currentTimeMillis(); + if (ts < lastTimestamp) { + throw new RuntimeException(String.format("系统时钟回退了%d毫秒", (lastTimestamp - ts))); + } + + // 同一时间内,则计算序列号 + if (ts == lastTimestamp) { + // 序列号溢出 + if (++sequence > maxSequence) { + ts = tilNextMillis(lastTimestamp); + sequence = 0L; + } + } else { + // 时间戳改变,重置序列号 + sequence = 0L; + } + + lastTimestamp = ts; + + // 0 - 00000000 00000000 00000000 00000000 00000000 0 - 00000000 00 - 00000000 0000 + // 左移后,低位补0,进行按位或运算相当于二进制拼接 + // 本来高位还有个0<<63,0与任何数字按位或都是本身,所以写不写效果一样 + return (ts - beginTs) << timestampLeftOffset | workerId << workerIdLeftOffset | sequence; + } + + /** + * 阻塞到下一个毫秒 + * + * @param lastTimestamp + * @return + */ + private long tilNextMillis(long lastTimestamp) { + long ts = System.currentTimeMillis(); + while (ts <= lastTimestamp) { + ts = System.currentTimeMillis(); + } + + return ts; + } + + public static void main(String[] args) { + SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(1); + for (int i = 0; i < 10; i++) { + long id = snowflakeIdWorker.nextId(); + System.out.println(id); + } + } +} \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityInitializer.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityInitializer.java new file mode 100644 index 00000000..e21c3e4d --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityInitializer.java @@ -0,0 +1,35 @@ +package com.fastbee.iot.util; + +import com.fastbee.common.constant.Constants; +import org.apache.velocity.app.Velocity; + +import java.util.Properties; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +public class VelocityInitializer +{ + /** + * 初始化vm方法 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityUtils.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityUtils.java new file mode 100644 index 00000000..10a3c774 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/util/VelocityUtils.java @@ -0,0 +1,89 @@ +package com.fastbee.iot.util; + +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.constant.GenConstants; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import org.apache.velocity.VelocityContext; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +public class VelocityUtils +{ + /** 项目空间路径 */ + private static final String PROJECT_PATH = "main/java"; + + /** mybatis空间路径 */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** 默认上级菜单,系统工具 */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(int deviceChip) + { + + VelocityContext velocityContext = new VelocityContext(); + return velocityContext; + } + + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) + { + List templates = new ArrayList(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/controller.java.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + } + else if (GenConstants.TPL_TREE.equals(tplCategory)) + { + templates.add("vm/vue/index-tree.vue.vm"); + } + else if (GenConstants.TPL_SUB.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template) + { + // 文件名称 + String fileName = ""; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) + { + fileName = StringUtils.format("{}/domain/{}.java", "test", "test"); + } else if (template.contains("controller.java.vm")) + { + fileName = StringUtils.format("{}/controller/{}Controller.java", "test", "test"); + } + return fileName; + } + + + +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java new file mode 100644 index 00000000..ec3716f2 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java @@ -0,0 +1,68 @@ +package com.fastbee.iot.wechat; + +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.wechat.WeChatLoginBody; +import com.fastbee.common.wechat.WeChatLoginResult; +import com.fastbee.iot.wechat.vo.WxBindReqVO; +import com.fastbee.iot.wechat.vo.WxCancelBindReqVO; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 微信相关服务类 + * @author fastb + * @date 2023-07-31 11:34 + */ +public interface WeChatService { + + /** + * 移动应用微信登录 + * @param weChatLoginBody 微信登录参数 + * @return String + */ + WeChatLoginResult mobileLogin(WeChatLoginBody weChatLoginBody); + + /** + * 小程序微信登录 + * @param weChatLoginBody 微信登录参数 + * @return 登录结果 + */ + WeChatLoginResult miniLogin(WeChatLoginBody weChatLoginBody); + + /** + * 取消所有相关微信绑定 + * @param wxCancelBindReqVO 微信解绑传参类型 + * @return 结果 + */ + AjaxResult cancelBind(WxCancelBindReqVO wxCancelBindReqVO); + + /** + * 小程序、移动应用微信绑定 + * @param wxBindReqVO 微信绑定传参类型 + * @return 结果 + */ + AjaxResult bind(WxBindReqVO wxBindReqVO); + + /** + * 网站应用获取微信绑定二维码信息 + * @return 二维码信息 + */ + AjaxResult getWxBindQr(HttpServletRequest httpServletRequest); + + /** + * 网站应用内微信扫码绑定回调接口 + * @param code 用户凭证 + * @param state 时间戳 + * @param httpServletRequest 请求信息 + * @param httpServletResponse 响应信息 + */ + String wxBindCallback(String code, String state, String wxBindId, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse); + + /** + * 网站应用获取微信绑定结果信息 + * @param wxBindMsgId 微信绑定结果信息id + * @return msg + */ + AjaxResult getWxBindMsg(String wxBindMsgId); +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java new file mode 100644 index 00000000..3c33e17e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java @@ -0,0 +1,491 @@ +package com.fastbee.iot.wechat.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.SocialPlatformType; +import com.fastbee.common.enums.VerifyTypeEnum; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.DateUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.bean.BeanUtils; +import com.fastbee.common.utils.http.HttpUtils; +import com.fastbee.common.utils.uuid.IdUtils; +import com.fastbee.common.wechat.WeChatAppResult; +import com.fastbee.common.wechat.WeChatLoginBody; +import com.fastbee.common.wechat.WeChatLoginResult; +import com.fastbee.common.wechat.WeChatMiniProgramResult; +import com.fastbee.common.wechat.WeChatPhoneInfo; +import com.fastbee.common.wechat.WeChatUserInfo; +import com.fastbee.framework.web.service.SysLoginService; +import com.fastbee.iot.domain.SocialPlatform; +import com.fastbee.iot.domain.SocialUser; +import com.fastbee.iot.model.RegisterUserInput; +import com.fastbee.iot.model.RegisterUserOutput; +import com.fastbee.iot.model.login.WeChatLoginQrRes; +import com.fastbee.iot.service.ISocialLoginService; +import com.fastbee.iot.service.ISocialPlatformService; +import com.fastbee.iot.service.ISocialUserService; +import com.fastbee.iot.service.IToolService; +import com.fastbee.iot.wechat.WeChatService; +import com.fastbee.iot.wechat.vo.WxBindReqVO; +import com.fastbee.iot.wechat.vo.WxCancelBindReqVO; +import com.fastbee.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthUser; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +import static com.fastbee.common.core.domain.AjaxResult.error; +import static com.fastbee.common.core.domain.AjaxResult.success; +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; +import static com.fastbee.common.utils.SecurityUtils.getUserId; +import static com.fastbee.iot.service.impl.SocialLoginServiceImpl.LOGIN_ERROR_MSG_REDIS_KEY; +import static com.fastbee.iot.service.impl.SocialLoginServiceImpl.WX_BIND_REDIS_KEY; + +/** + * @author fastb + * @date 2023-08-14 9:16 + */ +@Slf4j +@Service +public class WeChatServiceImpl implements WeChatService { + + @Resource + private ISocialUserService socialUserService; + @Resource + private ISysUserService sysUserService; + @Resource + private SysLoginService sysLoginService; + @Resource + private ISocialPlatformService socialPlatformService; + @Resource + private ISocialLoginService socialLoginService; + @Resource + private IToolService toolService; + @Resource + private RedisCache redisCache; + + /** + * 移动应用登录获取用户access_token + */ + private static final String WE_CHAT_APP_API_CODE_TO_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token"; + + /** + * 小程序登录获取用户会话参数 + */ + private static final String WE_CHAT_MINI_PROGRAM_API_CODE_TO_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/jscode2session"; + + /** + * 微信小程序获取access_token + */ + private static final String WE_CHAT_MINI_PROGRAM_API_TO_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"; + + /** + * 获取用户信息 + */ + private static final String WE_CHAT_API_TO_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo"; + + /** + * 获取用户手机号信息 + */ + private static final String WE_CHAT_API_TO_USER_PHONE_INFO_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token="; + + /** + * 移动应用微信登录 + * @param weChatLoginBody 微信登录参数 + * @return String + */ + public WeChatLoginResult mobileLogin(WeChatLoginBody weChatLoginBody) { + WeChatLoginResult weChatLoginResult = new WeChatLoginResult(); + SocialPlatformType socialPlatformType = SocialPlatformType.WECHAT_OPEN_MOBILE; + // 查询微信平台信息 + SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(socialPlatformType.getSourceClient()); + if (socialPlatform == null) { + throw new ServiceException("请先配置微信开放平台移动应用信息"); + } + // 用户凭证code只能消费一次,前端调的uni.login有时会消费,然后直接就把获取到的信息传过来,不会消费的话就这里通过code拿 + if (StringUtils.isEmpty(weChatLoginBody.getAccessToken()) || StringUtils.isEmpty(weChatLoginBody.getOpenId()) || StringUtils.isEmpty(weChatLoginBody.getUnionId())) { + WeChatAppResult weChatResult = this.getAccessTokenOpenId(weChatLoginBody.getCode(), socialPlatform); + if (weChatResult == null || weChatResult.getErrCode() != null) { + throw new ServiceException("用户凭证获取失败,请重新登录!"); + } + weChatLoginBody.setAccessToken(weChatResult.getAccessToken()).setRefreshToken(weChatResult.getRefreshToken()).setExpiresIn(weChatResult.getExpiresIn()).setOpenId(weChatResult.getOpenId()).setUnionId(weChatResult.getUnionId()).setScope(weChatResult.getScope()); + } + Long bindSysUserId; + // 查询用户第三方信息 + SocialUser socialUser = socialUserService.selectOneByOpenIdAndUnionId(weChatLoginBody.getOpenId(), weChatLoginBody.getUnionId()); + if (socialUser != null && socialUser.getSysUserId() != null) { + bindSysUserId = socialUser.getSysUserId(); + } else { + bindSysUserId = socialUserService.selectSysUserIdByUnionId(weChatLoginBody.getUnionId()); + } + Date nowDate = DateUtils.getNowDate(); + String uuid = IdUtils.randomUUID(); + if (socialUser == null) { + SocialUser addSocialUser = new SocialUser(); + addSocialUser.setSysUserId(bindSysUserId).setStatus(bindSysUserId == null ? "0" : "1").setUuid(uuid).setSource(socialPlatform.getPlatform().toUpperCase(Locale.ROOT)).setAccessToken(weChatLoginBody.getAccessToken()).setExpireIn(weChatLoginBody.getExpiresIn()) + .setRefreshToken(weChatLoginBody.getRefreshToken()).setOpenId(weChatLoginBody.getOpenId()).setUnionId(weChatLoginBody.getUnionId()).setSourceClient(socialPlatform.getPlatform()) + .setCode(weChatLoginBody.getCode()); + addSocialUser.setCreateBy("System"); + addSocialUser.setCreateTime(nowDate); + // 获取微信用户信息 + WeChatUserInfo weChatUserInfo = getWeChatUserInfo(weChatLoginBody.getAccessToken(), weChatLoginBody.getOpenId()); + if (weChatUserInfo != null) { + addSocialUser.setUnionId(weChatUserInfo.getUnionId()).setUsername(weChatUserInfo.getNickname()) + .setNickname(weChatUserInfo.getNickname()).setAvatar(weChatUserInfo.getHeadImgUrl()).setGender(weChatUserInfo.getSex()); + } + socialUserService.insertSocialUser(addSocialUser); + } else { + SocialUser updateSocialUser = new SocialUser(); + BeanUtils.copyProperties(socialUser, updateSocialUser); + updateSocialUser.setUpdateBy("System"); + updateSocialUser.setSysUserId(bindSysUserId).setStatus(bindSysUserId == null ? "0" : "1").setAccessToken(weChatLoginBody.getAccessToken()) + .setRefreshToken(weChatLoginBody.getRefreshToken()).setUuid(uuid); + socialUserService.updateSocialUser(updateSocialUser); + } + // 没有绑定账号,需要去绑定系统账号,跳转到绑定页面 + if (bindSysUserId == null) { + AuthUser authUser = new AuthUser(); + authUser.setUuid(uuid); + authUser.setSource(socialPlatform.getPlatform()); + String bindId = socialLoginService.genBindId(authUser); + weChatLoginResult.setBindId(bindId); + } else { + SysUser sysUser = sysUserService.selectUserById(bindSysUserId); + if (sysUser == null) { + throw new ServiceException("用户不存在"); + } + String token = sysLoginService.redirectLogin(sysUser.getUserName(), sysUser.getPassword()); + weChatLoginResult.setToken(token); + } + return weChatLoginResult; + } + + /** + * 小程序微信登录 + * @param weChatLoginBody 微信登录参数 + * @return 登录结果 + */ + @Override + public WeChatLoginResult miniLogin(WeChatLoginBody weChatLoginBody) { + // 使用微信手机号去登录不绑定微信,没有用户则用手机号自动注册一个登录,密码是手机号 + SocialPlatformType socialPlatformType = SocialPlatformType.WECHAT_OPEN_MINI_PROGRAM; + // 查询微信平台信息 + SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(socialPlatformType.getSourceClient()); + if (socialPlatform == null) { + throw new ServiceException("请先配置微信公众平台小程序信息!"); + } + if (StringUtils.isEmpty(weChatLoginBody.getPhoneCode())) { + throw new ServiceException("用户手机号凭证获取失败,请重新登录!"); + } + // 先获取token + WeChatAppResult result = getAccessToken(socialPlatform); + if (result == null || StringUtils.isEmpty(result.getAccessToken())) { + throw new ServiceException("获取用户调用凭据失败,请重新登录!"); + } + // 根据phoneCode获取用户手机号 + WeChatPhoneInfo userPhoneInfo = getWechatUserPhoneInfo(weChatLoginBody.getPhoneCode(), result.getAccessToken()); + if (userPhoneInfo == null || !userPhoneInfo.getErrCode().equals("0")) { + throw new ServiceException("获取用户手机号失败,请重新登录!"); + } + String phoneNumber = userPhoneInfo.getPhoneInfo().getPhoneNumber(); + SysUser sysUser = sysUserService.selectUserByPhoneNumber(phoneNumber); + String token; + WeChatLoginResult weChatLoginResult = new WeChatLoginResult(); + if (sysUser == null) { + // 直接用手机号注册一个新用户,密码就是手机号 + RegisterUserInput registerUserInput = new RegisterUserInput(); + registerUserInput.setUsername(phoneNumber); + registerUserInput.setPhonenumber(phoneNumber); + registerUserInput.setPassword(phoneNumber); + RegisterUserOutput registerUserOutput = toolService.registerNoCaptcha(registerUserInput); + if (StringUtils.isNotEmpty(registerUserOutput.getMsg())) { + throw new ServiceException(registerUserOutput.getMsg()); + } + token = sysLoginService.redirectLogin(phoneNumber, phoneNumber); + } else { + token = sysLoginService.redirectLogin(sysUser.getUserName(), sysUser.getPassword()); + } + weChatLoginResult.setToken(token); + return weChatLoginResult; + } + + private void miniCreateOrUpdateSocialUser(SocialUser socialUser, SocialPlatform socialPlatform, WeChatLoginBody weChatLoginBody, WeChatMiniProgramResult weChatResult, String accessToken, Long bindSysUserId) { + Date nowDate = DateUtils.getNowDate(); + String uuid = IdUtils.randomUUID(); + if (socialUser == null) { + SocialUser insertSocialUser = new SocialUser(); + String sourceClient = socialPlatform.getPlatform(); + insertSocialUser.setSysUserId(bindSysUserId).setStatus("1").setUuid(uuid).setSource(sourceClient.toUpperCase(Locale.ROOT)).setSourceClient(sourceClient) + .setAccessToken(accessToken).setOpenId(weChatResult.getOpenId()).setUnionId(weChatResult.getUnionId()) + .setCode(weChatLoginBody.getCode()).setDelFlag("0"); + insertSocialUser.setCreateBy("System"); + insertSocialUser.setCreateTime(nowDate); + socialUserService.insertSocialUser(insertSocialUser); + } else { + SocialUser updateSocialUser = new SocialUser(); + updateSocialUser.setSocialUserId(socialUser.getSocialUserId()); + updateSocialUser.setSysUserId(bindSysUserId).setStatus("1").setCode(weChatLoginBody.getCode()); + updateSocialUser.setUpdateBy("System"); + socialUserService.updateSocialUser(updateSocialUser); + } + } + + /** + * 取消所有相关微信绑定 + * @param wxCancelBindReqVO 微信解绑传参类型 + * @return 结果 + */ + @Override + public AjaxResult cancelBind(WxCancelBindReqVO wxCancelBindReqVO) { + LoginUser loginUser = getLoginUser(); + if (loginUser == null || loginUser.getUserId() == null) { + throw new ServiceException("请先登录后重试"); + } + // 密码验证 + if (VerifyTypeEnum.PASSWORD.getVerifyType().equals(wxCancelBindReqVO.getVerifyType())) { + if (StringUtils.isEmpty(wxCancelBindReqVO.getPassword())) { + throw new ServiceException("请传入用户密码"); + } + Boolean validateResult = sysUserService.validatePassword(loginUser.getUser().getPassword(), wxCancelBindReqVO.getPassword()); + if (Boolean.FALSE.equals(validateResult)) { + throw new ServiceException("密码错误,请重新输入"); + } + } + // 解绑所有微信应用 + int cancelBind = socialUserService.cancelBind(loginUser.getUserId(), SocialPlatformType.listWechatPlatform); + return cancelBind >= 1 ? success("解绑成功") : AjaxResult.error("解绑失败"); + } + + /** + * 小程序、移动应用微信绑定 + * @param wxBindReqVO 微信绑定传参类型 + * @return 结果 + */ + @Override + public AjaxResult bind(WxBindReqVO wxBindReqVO) { + Long sysUserId = getUserId(); + if (sysUserId == null) { + throw new ServiceException("请登录后重试"); + } + String openId = ""; + String unionId = ""; + // 区分小程序绑定还是移动应用绑定 + if (SocialPlatformType.WECHAT_OPEN_MOBILE.sourceClient.equals(wxBindReqVO.getSourceClient())) { + if (StringUtils.isEmpty(wxBindReqVO.getOpenId()) || StringUtils.isEmpty(wxBindReqVO.getUnionId())) { + throw new ServiceException("请传入微信用户信息"); + } + openId = wxBindReqVO.getOpenId(); + unionId = wxBindReqVO.getUnionId(); + } else if (SocialPlatformType.WECHAT_OPEN_MINI_PROGRAM.sourceClient.equals(wxBindReqVO.getSourceClient())) { + if (StringUtils.isEmpty(wxBindReqVO.getCode())) { + throw new ServiceException("请传入用户凭证"); + } + // 查询微信平台信息 + SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(SocialPlatformType.WECHAT_OPEN_MINI_PROGRAM.sourceClient); + if (socialPlatform == null) { + throw new ServiceException("请先配置微信开放平台小程序信息!"); + } + WeChatMiniProgramResult weChatMiniProgramResult = this.codeToSession(wxBindReqVO.getCode(), socialPlatform); + if (weChatMiniProgramResult == null + || (StringUtils.isEmpty(weChatMiniProgramResult.getOpenId()) && StringUtils.isEmpty(weChatMiniProgramResult.getUnionId()))) { + throw new ServiceException("获取微信信息失败,请重试!"); + } + openId = weChatMiniProgramResult.getOpenId(); + unionId = weChatMiniProgramResult.getUnionId(); + } + + SocialUser socialUser = socialUserService.selectOneByOpenIdAndUnionId(openId, unionId); + int bindResult; + List socialUserList = socialUserService.selectBySysUserId(sysUserId); + if (CollectionUtils.isNotEmpty(socialUserList)) { + return success("绑定成功!"); + } + if (socialUser != null) { + if (socialUser.getSysUserId() != null && !sysUserId.equals(socialUser.getSysUserId())) { + throw new ServiceException("该微信已绑定其他账号,请先使用微信登录解绑后重试!"); + } + SocialUser updateSocialUser = new SocialUser(); + updateSocialUser.setSocialUserId(socialUser.getSocialUserId()); + updateSocialUser.setSysUserId(sysUserId).setStatus("1"); + updateSocialUser.setUpdateBy("System"); + bindResult = socialUserService.updateSocialUser(updateSocialUser); + } else { + Date nowDate = DateUtils.getNowDate(); + String uuid = IdUtils.randomUUID(); + SocialUser insertSocialUser = new SocialUser(); + insertSocialUser.setSysUserId(sysUserId).setStatus("1").setUuid(uuid).setSource(wxBindReqVO.getSourceClient().toUpperCase(Locale.ROOT)).setSourceClient(wxBindReqVO.getSourceClient()) + .setOpenId(openId).setUnionId(unionId) + .setDelFlag("0"); + insertSocialUser.setCreateBy("System"); + insertSocialUser.setCreateTime(nowDate); + bindResult = socialUserService.insertSocialUser(insertSocialUser); + } + // 绑定 + return bindResult >= 1 ? success("绑定成功!") : AjaxResult.error("绑定失败"); + } + + @Override + public AjaxResult getWxBindQr(HttpServletRequest httpServletRequest) { + Long sysUserId = getUserId(); + if (sysUserId == null) { + throw new ServiceException("请先登录后重试!"); + } + WeChatLoginQrRes weChatLoginQrRes = new WeChatLoginQrRes(); + SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(SocialPlatformType.WECHAT_OPEN_WEB_BIND.sourceClient); + if (socialPlatform == null) { + throw new ServiceException("请先配置微信开放平台网站应用个人中心绑定信息"); + } + weChatLoginQrRes.setAppid(socialPlatform.getClientId()); + weChatLoginQrRes.setScope("snsapi_login"); + weChatLoginQrRes.setState(String.valueOf(System.currentTimeMillis())); + String wxBindId = socialLoginService.genWxBindId(sysUserId); + String url = socialPlatform.getRedirectUri() + wxBindId; + weChatLoginQrRes.setRedirectUri(url); + return success(weChatLoginQrRes); + } + + @Override + public String wxBindCallback(String code, String state, String wxBindId, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(SocialPlatformType.WECHAT_OPEN_WEB_BIND.sourceClient); + if (socialPlatform == null) { + String serverName = httpServletRequest.getServerName(); + String msgId = socialLoginService.genErrorId("请先配置微信开放平台网站应用个人中心绑定信息"); + return "https://" + serverName + "/user/profile?wxBindMsgId=" + msgId; + } + String url = socialPlatform.getRedirectLoginUri(); + //获取临时票据 code + log.info("code:{}", code); + if (StringUtils.isEmpty(code)) { + String msgId = socialLoginService.genErrorId("您已取消授权或未获取到授权信息"); + return url + msgId; + } + Long sysUserId = redisCache.getCacheObject(WX_BIND_REDIS_KEY + wxBindId); + if (sysUserId == null) { + String msgId = socialLoginService.genErrorId("二维码已失效,请重新点击绑定"); + return url + msgId; + } + List socialUserList = socialUserService.selectBySysUserId(sysUserId); + if (CollectionUtils.isNotEmpty(socialUserList)) { + String msgId = socialLoginService.genErrorId("您的账号已绑定微信,请先解绑"); + return url + msgId; + } + // 组装获取accessToken的url + WeChatAppResult weChatAppResult = this.getAccessTokenOpenId(code, socialPlatform); + if (weChatAppResult == null || StringUtils.isEmpty(weChatAppResult.getAccessToken()) + || StringUtils.isEmpty(weChatAppResult.getOpenId()) || StringUtils.isEmpty(weChatAppResult.getUnionId())) { + String msgId = socialLoginService.genErrorId("获取微信信息失败,请重试"); + return url + msgId; + } + Long bindUserId = socialUserService.selectSysUserIdByUnionId(weChatAppResult.getUnionId()); + if (bindUserId != null && !bindUserId.equals(sysUserId)) { + String msgId = socialLoginService.genErrorId("您的微信已绑定其他账号,请先使用微信登录解绑后重试!"); + return url + msgId; + } + SocialUser socialUser = socialUserService.selectOneByOpenIdAndUnionId(weChatAppResult.getOpenId(), weChatAppResult.getUnionId()); + if (socialUser == null) { + socialUser = new SocialUser(); + } + WeChatUserInfo weChatUserInfo = this.getWeChatUserInfo(weChatAppResult.getAccessToken(), weChatAppResult.getOpenId()); + String uuid = IdUtils.randomUUID(); + Date nowDate = DateUtils.getNowDate(); + socialUser.setUuid(uuid).setAccessToken(weChatAppResult.getAccessToken()).setRefreshToken(weChatAppResult.getRefreshToken()) + .setOpenId(weChatUserInfo.getOpenId()).setUnionId(weChatUserInfo.getUnionId()).setSysUserId(sysUserId).setStatus("1") + .setNickname(weChatUserInfo.getNickname()).setUsername(weChatUserInfo.getNickname()).setAvatar(weChatUserInfo.getHeadImgUrl()); + // 个人中心绑定这个也做了一个配置,标识设为了 wechat_open_web_bind,但其实都属于网站应用,所以这里还是改为使用wechat_open_web这个来记录来源吧,统一为网站来源,方便查询 + socialUser.setSource(SocialPlatformType.WECHAT_OPEN_WEB.sourceClient).setSourceClient(SocialPlatformType.WECHAT_OPEN_WEB.sourceClient); + if (socialUser.getCreateTime() == null) { + socialUser.setCreateTime(nowDate); + socialUser.setCreateBy("System"); + } + socialUser.setUpdateTime(nowDate); + socialUser.setUpdateBy("System"); + int updateResult = socialUser.getSocialUserId() == null ? socialUserService.insertSocialUser(socialUser) : socialUserService.updateSocialUser(socialUser); + String msg = updateResult >= 1 ? "绑定成功" : "绑定失败"; + String msgId = socialLoginService.genErrorId(msg); + return url + msgId; + } + + @Override + public AjaxResult getWxBindMsg(String wxBindMsgId) { + String errorMsg = redisCache.getCacheObject(LOGIN_ERROR_MSG_REDIS_KEY + wxBindMsgId); + if (StringUtils.isEmpty(errorMsg)) { + return success(); + } else if ("绑定成功".equals(errorMsg)) { + return success(errorMsg); + } else { + return error(errorMsg); + } + } + + /** + * 移动应用获取微信用户accessToken + * @param code 用户登录code + * @return WeChatAppResult + */ + private WeChatAppResult getAccessTokenOpenId(String code, SocialPlatform socialPlatform) { + String url = WE_CHAT_APP_API_CODE_TO_ACCESS_TOKEN_URL + "?appid=" + socialPlatform.getClientId() + "&secret=" + socialPlatform.getSecretKey() + "&code=" + code + "&grant_type=authorization_code"; + String s = HttpUtils.sendGet(url); + return JSON.parseObject(s, WeChatAppResult.class); + } + + /** + * 移动应用获取微信用户信息 + * @param accessToken 接口调用凭证 + * @param openId 用户唯一标识 + * @return WeChatUserInfo + */ + private WeChatUserInfo getWeChatUserInfo(String accessToken, String openId) { + String url = WE_CHAT_API_TO_USER_INFO_URL + "?access_token=" + accessToken + "&openid=" + openId; + String s = HttpUtils.sendGet(url); + return JSON.parseObject(s, WeChatUserInfo.class); + } + + /** + * 小程序获取微信用户登录信息 + * @param code 用户凭证 + * @param socialPlatform 登录平台 + * @return 结果 + */ + private WeChatMiniProgramResult codeToSession(String code, SocialPlatform socialPlatform) { + String url = WE_CHAT_MINI_PROGRAM_API_CODE_TO_ACCESS_TOKEN_URL + "?appid=" + socialPlatform.getClientId() + "&secret=" + socialPlatform.getSecretKey() + "&js_code=" + code + "&grant_type=authorization_code"; + String s = HttpUtils.sendGet(url); + return JSON.parseObject(s, WeChatMiniProgramResult.class); + } + + /** + * 小程序获取微信用户手机号 + * @param code 凭证 + * @return 手机号信息 + */ + private WeChatPhoneInfo getWechatUserPhoneInfo(String code, String accessToken) { + String url = WE_CHAT_API_TO_USER_PHONE_INFO_URL + accessToken; + HashMap map = new HashMap<>(); + map.put("code", code); + String s = HttpUtils.sendPost(url, JSONObject.toJSONString(map)); + return JSON.parseObject(s, WeChatPhoneInfo.class); + } + + /** + * 小程序获取微信用户accessToken + * @param socialPlatform 用户登录code + * @return WeChatAppResult + */ + private WeChatAppResult getAccessToken(SocialPlatform socialPlatform) { + String url = WE_CHAT_MINI_PROGRAM_API_TO_ACCESS_TOKEN_URL + "&appid=" + socialPlatform.getClientId() + "&secret=" + socialPlatform.getSecretKey(); + String s = HttpUtils.sendGet(url); + return JSON.parseObject(s, WeChatAppResult.class); + } +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxBindReqVO.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxBindReqVO.java new file mode 100644 index 00000000..512a7ab4 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxBindReqVO.java @@ -0,0 +1,19 @@ +package com.fastbee.iot.wechat.vo; + +import lombok.Data; + +/** + * @author fastb + * @date 2023-08-30 17:21 + */ +@Data +public class WxBindReqVO { + + private String sourceClient; + + private String openId; + + private String unionId; + + private String code; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxCancelBindReqVO.java b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxCancelBindReqVO.java new file mode 100644 index 00000000..3536e827 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/vo/WxCancelBindReqVO.java @@ -0,0 +1,32 @@ +package com.fastbee.iot.wechat.vo; + +import lombok.Data; + +/** + * 微信解绑传参类 + * @author fastb + * @date 2023-08-30 15:10 + */ +@Data +public class WxCancelBindReqVO { + + /** + * 验证类型 + */ + private Integer verifyType; + + /** + * 用户密码 + */ + private String password; + + /** + * 手机号 + */ + private String userPhone; + + /** + * 短信验证码 + */ + private String smsCode; +} diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/CategoryMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/CategoryMapper.xml new file mode 100644 index 00000000..6cdcd20c --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/CategoryMapper.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + select category_id, category_name, tenant_id, tenant_name, is_sys,order_num, create_time, update_time, remark from iot_category + + + + + + + + + + insert into iot_category + + category_name, + tenant_id, + tenant_name, + is_sys, + order_num, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{categoryName}, + #{tenantId}, + #{tenantName}, + #{isSys}, + #{orderNum}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update iot_category + + category_name = #{categoryName}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + is_sys = #{isSys}, + order_num = #{orderNum}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where category_id = #{categoryId} + + + + delete from iot_category where category_id = #{categoryId} + + + + delete from iot_category where category_id in + + #{categoryId} + + + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceJobMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceJobMapper.xml new file mode 100644 index 00000000..b67a3519 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceJobMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group,serial_number, device_id,device_name,actions,alert_trigger,is_advance, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark, job_type, product_id, product_name, scene_id, alert_id + from iot_device_job + + + + + + + + + + + + + + + + delete from iot_device_job where job_id = #{jobId} + + + + delete from iot_device_job where job_id in + + #{jobId} + + + + + delete from iot_device_job where device_id in + + #{deviceId} + + + + + delete from iot_device_job where alert_id in + + #{alertId} + + + + + delete from iot_device_job where scene_id in + + #{sceneId} + + + + + update iot_device_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + device_id = #{deviceId}, + device_name = #{deviceName}, + serial_number = #{serialNumber}, + actions = #{actions}, + alert_trigger = #{alertTrigger}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + job_type = #{jobType}, + product_id = #{productId}, + product_name = #{productName}, + scene_id = #{sceneId}, + alert_id = #{alertId}, + is_advance =#{isAdvance}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into iot_device_job( + job_id, + job_name, + job_group, + device_id, + device_name, + serial_number, + actions, + alert_trigger, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + job_type, + product_id, + product_name, + scene_id, + alert_id, + is_advance, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{deviceId}, + #{deviceName}, + #{serialNumber}, + #{actions}, + #{alertTrigger}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + #{jobType}, + #{productId}, + #{productName}, + #{sceneId}, + #{alertId}, + #{isAdvance}, + sysdate() + ) + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceLogMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceLogMapper.xml new file mode 100644 index 00000000..540fd56c --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceLogMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select log_id, log_type, log_value, device_id, device_name,serial_number, identity, create_by, is_monitor,mode, user_id, user_name, tenant_id, tenant_name, create_time, remark from iot_device_log + + + + + + + + + + + + insert into iot_device_log (log_type,log_value,device_id,device_name,serial_number,identity,create_by, + is_monitor,mode,create_time,remark,user_id,user_name,tenant_id,tenant_name,model_name) + values + + (#{item.logType},#{item.logValue},#{item.deviceId},#{item.deviceName},#{item.serialNumber}, + #{item.identity},#{item.createBy},#{item.isMonitor},#{item.mode},#{item.createTime},#{item.remark}, + #{item.userId},#{item.userName},#{item.tenantId},#{item.tenantName},#{item.modelName}) + + + + + update iot_device_log + + log_type = #{logType}, + log_value = #{logValue}, + device_id = #{deviceId}, + device_name = #{deviceName}, + serial_number = #{serialNumber}, + identity = #{identity}, + create_by = #{createBy}, + is_monitor = #{isMonitor}, + mode = #{mode}, + create_time = #{createTime}, + remark = #{remark}, + user_id = #{userId}, + user_name = #{userName}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + + where log_id = #{logId} + + + + delete from iot_device_log where log_id = #{logId} + + + + delete from iot_device_log where log_id in + + #{logId} + + + + + delete from iot_device_log where serial_number = #{deviceNumber} + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml new file mode 100644 index 00000000..ce3b60d0 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml @@ -0,0 +1,639 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select device_id, device_name, product_id, product_name, user_id, user_name, tenant_id, tenant_name, serial_number,gw_dev_code, firmware_version, status, rssi,is_shadow ,is_simulate,location_way,things_model_value,network_address, network_ip, longitude, latitude, active_time, create_time, update_time, img_url,summary,remark,slave_id from iot_device + + + + select device_id, device_name, product_id, product_name, user_id, user_name, tenant_id, tenant_name, serial_number, firmware_version, status,rssi,is_shadow ,is_simulate,location_way,things_model_value, active_time,img_url,slave_id from iot_device + + + + select device_id, device_name,product_id, serial_number,user_id, user_name, tenant_id, tenant_name, status,is_shadow,is_simulate, rssi ,location_way,things_model_value, active_time from iot_device + + + + + + + + + + + + + + + + + + update iot_device set things_model_value=#{stringValue} where device_id = #{deviceId} + + + + + + + + + + + + + + + + + + + + insert into iot_device + + device_name, + product_id, + product_name, + user_id, + user_name, + tenant_id, + tenant_name, + serial_number, + firmware_version, + status, + rssi, + is_shadow, + location_way, + things_model_value, + network_address, + network_ip, + longitude, + latitude, + active_time, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + img_url, + summary, + gw_dev_code, + is_simulate, + slave_id, + + + #{deviceName}, + #{productId}, + #{productName}, + #{userId}, + #{userName}, + #{tenantId}, + #{tenantName}, + #{serialNumber}, + #{firmwareVersion}, + #{status}, + #{rssi}, + #{isShadow}, + #{locationWay}, + #{thingsModelValue}, + #{networkAddress}, + #{networkIp}, + #{longitude}, + #{latitude}, + #{activeTime}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{imgUrl}, + #{summary}, + #{gwDevCode}, + #{isSimulate}, + #{slaveId}, + + + + + update iot_device + + device_name = #{deviceName}, + product_id = #{productId}, + product_name = #{productName}, + user_id = #{userId}, + user_name = #{userName}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + serial_number = #{serialNumber}, + gw_dev_code = #{gwDevCode}, + firmware_version = #{firmwareVersion}, + status = #{status}, + rssi = #{rssi}, + is_shadow = #{isShadow}, + is_simulate = #{isSimulate}, + location_way = #{locationWay}, + things_model_value = #{thingsModelValue}, + network_address = #{networkAddress}, + network_ip = #{networkIp}, + longitude = #{longitude}, + latitude = #{latitude}, + active_time = #{activeTime}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + img_url = #{imgUrl}, + summary = #{summary}, + slave_id = #{slaveId}, + + where device_id = #{deviceId} + + + + update iot_device + + status = #{status}, + network_address = #{networkAddress}, + network_ip = #{networkIp}, + longitude = #{longitude}, + latitude = #{latitude}, + active_time = #{activeTime}, + update_time = #{updateTime,jdbcType=TIMESTAMP} + + where serial_number = #{serialNumber} or gw_dev_code = #{serialNumber} + + + + update iot_device + set firmware_version = #{firmwareVersion,jdbcType=DECIMAL} + where serial_number = #{serialNumber,jdbcType=VARCHAR} + + + + -- 设备状态(1-未激活,2-禁用,3-在线,4-离线) + update iot_device set status=4 + where serial_number = #{serialNumber} and status = 3 + + + + update iot_device + + device_name = #{deviceName}, + product_id = #{productId}, + product_name = #{productName}, + user_id = #{userId}, + user_name = #{userName}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + serial_number = #{serialNumber}, + firmware_version = #{firmwareVersion}, + status = #{status}, + rssi = #{rssi}, + is_shadow = #{isShadow}, + is_simulate = #{isSimulate}, + location_way = #{locationWay}, + things_model_value = #{thingsModelValue}, + network_address = #{networkAddress}, + network_ip = #{networkIp}, + longitude = #{longitude}, + latitude = #{latitude}, + active_time = #{activeTime}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + img_url = #{imgUrl}, + summary = #{summary}, + gw_dev_code = #{gwDevCode}, + + where serial_number = #{serialNumber} + + + + delete from iot_device where device_id = #{deviceId} + + + + delete from iot_device where device_id in + + #{deviceId} + + + + + + + delete from iot_device_group + + and device_id = #{deviceId} + and group_id in(select group_id from iot_group where user_id = #{userId}) + + + + + + + + + + + update iot_device d + set d.status = 3, + d.update_time = now() + where d.serial_number in + + #{item} + + + + + + update iot_device d + set d.status = 4, + d.update_time = now() + where d.serial_number in + + #{item} + + + + + + + + + + + + delete from iot_device where gw_dev_code = #{gwCode} + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceUserMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceUserMapper.xml new file mode 100644 index 00000000..fe043655 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceUserMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select device_id, user_id, device_name, user_name, is_owner,tenant_id,tenant_name,phonenumber,perms, create_time, update_time, remark from iot_device_user + + + + + + + + + + + + insert into iot_device_user + + device_id, + user_id, + device_name, + user_name, + is_owner, + tenant_id, + tenant_name, + phonenumber, + perms, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{deviceId}, + #{userId}, + #{deviceName}, + #{userName}, + #{isOwner}, + #{tenantId}, + #{tenantName}, + #{phonenumber}, + #{perms}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + insert into iot_device_user + (device_id, user_id, device_name, user_name, is_owner,tenant_id,tenant_name,phonenumber,perms, create_time) values + + (#{item.deviceId},#{item.userId},#{item.deviceName}, #{item.userName}, #{item.isOwner}, #{item.tenantId},#{item.tenantName},#{item.phonenumber},#{item.perms}, #{item.createTime}) + + + + + update iot_device_user + + user_id = #{userId}, + device_name = #{deviceName}, + user_name = #{userName}, + is_owner = #{isOwner}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + phonenumber = #{phonenumber}, + perms = #{perms}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where device_id = #{deviceId} and user_id = #{userId} + + + + delete from iot_device_user + + and device_id = #{deviceId} + and user_id = #{userId} + + + + + delete from iot_device_user where device_id in + + #{deviceId} + + + + delete from iot_device_user where device_id = #{deviceId} and is_owner !=1 and user_id = #{userId} + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/EventLogMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/EventLogMapper.xml new file mode 100644 index 00000000..6696c7ce --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/EventLogMapper.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select log_id, identity, model_name, log_type, log_value, device_id, device_name, serial_number, is_monitor, mode, user_id, user_name, tenant_id, tenant_name, create_by, create_time, remark from iot_event_log + + + + + + + + insert into iot_event_log + + identity, + model_name, + log_type, + log_value, + device_id, + device_name, + serial_number, + is_monitor, + mode, + user_id, + user_name, + tenant_id, + tenant_name, + create_by, + create_time, + remark, + + + #{identity}, + #{modelName}, + #{logType}, + #{logValue}, + #{deviceId}, + #{deviceName}, + #{serialNumber}, + #{isMonitor}, + #{mode}, + #{userId}, + #{userName}, + #{tenantId}, + #{tenantName}, + #{createBy}, + #{createTime}, + #{remark}, + + + + + insert into iot_event_log (identity,model_name,log_type,log_value,device_id,device_name,serial_number,is_monitor,mode,user_id, + user_name,tenant_id,tenant_name,create_by,create_time,remark) + values + + (#{item.identity},#{item.modelName},#{item.logType},#{item.logValue},#{item.deviceId},#{item.deviceName},#{item.serialNumber},#{item.isMonitor}, + #{item.mode},#{item.userId},#{item.userName},#{item.tenantId},#{item.tenantName},#{item.createBy},#{item.createTime},#{item.remark}) + + + + + update iot_event_log + + identity = #{identity}, + model_name = #{modelName}, + log_type = #{logType}, + log_value = #{logValue}, + device_id = #{deviceId}, + device_name = #{deviceName}, + serial_number = #{serialNumber}, + is_monitor = #{isMonitor}, + mode = #{mode}, + user_id = #{userId}, + user_name = #{userName}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + create_by = #{createBy}, + create_time = #{createTime}, + remark = #{remark}, + + where log_id = #{logId} + + + + delete from iot_event_log where log_id = #{logId} + + + + delete from iot_event_log where serial_number = #{serialNumber} + + + + delete from iot_event_log where log_id in + + #{logId} + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/FunctionLogMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/FunctionLogMapper.xml new file mode 100644 index 00000000..7a39efdf --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/FunctionLogMapper.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, identify, fun_type, fun_value, message_id, device_name, serial_number, mode, user_id, result_msg, result_code, create_by, + create_time, remark,show_value,model_name,reply_time from iot_function_log + + + + + + + + insert into iot_function_log + + identify, + fun_type, + fun_value, + message_id, + device_name, + serial_number, + mode, + user_id, + result_msg, + result_code, + create_by, + create_time, + remark, + show_value, + model_name, + reply_time, + + + #{identify}, + #{funType}, + #{funValue}, + #{messageId}, + #{deviceName}, + #{serialNumber}, + #{mode}, + #{userId}, + #{resultMsg}, + #{resultCode}, + #{createBy}, + #{createTime}, + #{remark}, + #{showValue}, + #{modelName}, + #{replyTime}, + + + + + insert into iot_function_log (identify,fun_type,fun_value,message_id,device_name,serial_number,mode,user_id, + result_msg,result_code,create_by,create_time,remark,show_value,model_name,reply_time) + values + + (#{item.identify},#{item.funType},#{item.funValue},#{item.messageId},#{item.deviceName},#{item.serialNumber},#{item.mode},#{item.userId}, + #{item.resultMsg},#{item.resultCode},#{item.createBy},#{item.createTime},#{item.remark},#{item.showValue},#{item.modelName},#{item.replyTime}) + + + + + update iot_function_log + + identify = #{identify}, + fun_type = #{funType}, + fun_value = #{funValue}, + message_id = #{messageId}, + device_name = #{deviceName}, + serial_number = #{serialNumber}, + mode = #{mode}, + user_id = #{userId}, + result_msg = #{resultMsg}, + result_code = #{resultCode}, + create_by = #{createBy}, + create_time = #{createTime}, + remark = #{remark}, + show_value=#{showValue}, + model_name=#{modelName}, + reply_time = #{replyTime}, + + where id = #{id} + + + + delete from iot_function_log where id = #{id} + + + delete from iot_function_log where serial_number = #{serialNumber} + + + + delete from iot_function_log where identify like concat(#{prefixIdentify},'%') and serial_number = #{serialNumber} + + + + delete from iot_function_log where id in + + #{id} + + + + + update iot_function_log l + set l.result_msg = #{resultMsg}, + l.result_code = #{resultCode}, + l.reply_time = #{replyTime} + where l.id in + + #{item} + + + + + update iot_function_log + + identify = #{identify}, + fun_type = #{funType}, + fun_value = #{funValue}, + device_name = #{deviceName}, + serial_number = #{serialNumber}, + mode = #{mode}, + user_id = #{userId}, + result_msg = #{resultMsg}, + result_code = #{resultCode}, + create_by = #{createBy}, + create_time = #{createTime}, + remark = #{remark}, + show_value=#{showValue}, + model_name=#{modelName}, + reply_time = #{replyTime}, + + where message_id = #{messageId} + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/GroupMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/GroupMapper.xml new file mode 100644 index 00000000..af808817 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/GroupMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + select group_id, group_name, group_order, user_id, user_name, create_time, update_time, remark from iot_group + + + + + + + + + + insert into iot_group + + group_name, + group_order, + user_id, + user_name, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{groupName}, + #{groupOrder}, + #{userId}, + #{userName}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + insert into iot_device_group (device_id,group_id) + values + + + #{deviceId},#{groupId}, + + + + + + update iot_group + + group_name = #{groupName}, + group_order = #{groupOrder}, + user_id = #{userId}, + user_name = #{userName}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where group_id = #{groupId} + + + + delete from iot_group where group_id = #{groupId} + + + + delete from iot_group where group_id in + + #{groupId} + + + + + delete from iot_device_group where group_id in + + #{groupId} + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsCategoryMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsCategoryMapper.xml new file mode 100644 index 00000000..3a6fed34 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsCategoryMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + select category_id, category_name, order_num, del_flag, create_by, create_time, update_by, update_time, remark from news_category + + + + + + + + + + insert into news_category + + category_name, + order_num, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{categoryName}, + #{orderNum}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update news_category + + category_name = #{categoryName}, + order_num = #{orderNum}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where category_id = #{categoryId} + + + + delete from news_category where category_id = #{categoryId} + + + + delete from news_category where category_id in + + #{categoryId} + + + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsMapper.xml new file mode 100644 index 00000000..c4eeb2a1 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/NewsMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select news_id, title, img_url, is_top, is_banner, category_id, category_name, status, author, del_flag, create_by, create_time, update_by, update_time, remark from news + + + + + + + + + + insert into news + + title, + content, + img_url, + is_top, + is_banner, + category_id, + category_name, + status, + author, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{title}, + #{content}, + #{imgUrl}, + #{isTop}, + #{isBanner}, + #{categoryId}, + #{categoryName}, + #{status}, + #{author}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update news + + title = #{title}, + content = #{content}, + img_url = #{imgUrl}, + is_top = #{isTop}, + is_banner = #{isBanner}, + category_id = #{categoryId}, + category_name = #{categoryName}, + status = #{status}, + author = #{author}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where news_id = #{newsId} + + + + delete from news where news_id = #{newsId} + + + + delete from news where news_id in + + #{newsId} + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/OauthClientDetailsMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/OauthClientDetailsMapper.xml new file mode 100644 index 00000000..05822fa7 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/OauthClientDetailsMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + select client_id, resource_ids, client_secret, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove, type from oauth_client_details + + + + + + + + insert into oauth_client_details + + client_id, + resource_ids, + client_secret, + scope, + authorized_grant_types, + web_server_redirect_uri, + authorities, + access_token_validity, + refresh_token_validity, + additional_information, + autoapprove, + type, + + + #{clientId}, + #{resourceIds}, + #{clientSecret}, + #{scope}, + #{authorizedGrantTypes}, + #{webServerRedirectUri}, + #{authorities}, + #{accessTokenValidity}, + #{refreshTokenValidity}, + #{additionalInformation}, + #{autoapprove}, + #{type}, + + + + + update oauth_client_details + + resource_ids = #{resourceIds}, + client_secret = #{clientSecret}, + scope = #{scope}, + authorized_grant_types = #{authorizedGrantTypes}, + web_server_redirect_uri = #{webServerRedirectUri}, + authorities = #{authorities}, + access_token_validity = #{accessTokenValidity}, + refresh_token_validity = #{refreshTokenValidity}, + additional_information = #{additionalInformation}, + autoapprove = #{autoapprove}, + type = #{type}, + + where client_id = #{clientId} + + + + delete from oauth_client_details where client_id = #{clientId} + + + + delete from oauth_client_details where client_id in + + #{clientId} + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductAuthorizeMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductAuthorizeMapper.xml new file mode 100644 index 00000000..d9b0500f --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductAuthorizeMapper.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + select authorize_id, authorize_code, product_id, device_id, serial_number, user_id, user_name,status, del_flag, create_by, create_time, update_by, update_time, remark from iot_product_authorize + + + + + + + + + + + + insert into iot_product_authorize + + authorize_code, + product_id, + device_id, + serial_number, + user_id, + user_name, + status, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{authorizeCode}, + #{productId}, + #{deviceId}, + #{serialNumber}, + #{userId}, + #{userName}, + #{status}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + insert into iot_product_authorize (authorize_code,product_id,create_by,create_time,status) + values + + + #{item.authorizeCode},#{item.productId},#{item.createBy},#{item.createTime},#{item.status} + + + + + + update iot_product_authorize + + user_id = #{userId}, + device_id = #{deviceId}, + authorize_code = #{authorizeCode}, + product_id = #{productId}, + serial_number = #{serialNumber}, + user_name = #{userName}, + status = #{status}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where authorize_id = #{authorizeId} + + + + delete from iot_product_authorize where authorize_id = #{authorizeId} + + + + delete from iot_product_authorize where authorize_id in + + #{authorizeId} + + + + + delete from iot_product_authorize where product_id in + + #{productId} + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductMapper.xml new file mode 100644 index 00000000..07de4bdf --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProductMapper.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select product_id, product_name,protocol_code,transport, category_id, category_name, tenant_id, tenant_name, is_sys, is_authorize, mqtt_account,mqtt_password,mqtt_secret ,status, device_type, network_method, vertificate_method, create_time, update_time, img_url,remark from iot_product + + + + + + + + + + insert into iot_product + + product_name, + category_id, + category_name, + tenant_id, + tenant_name, + is_sys, + is_authorize, + mqtt_account, + mqtt_password, + mqtt_secret, + status, + device_type, + network_method, + vertificate_method, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + img_url, + protocol_code, + transport, + + + #{productName}, + #{categoryId}, + #{categoryName}, + #{tenantId}, + #{tenantName}, + #{isSys}, + #{isAuthorize}, + #{mqttAccount}, + #{mqttPassword}, + #{mqttSecret}, + #{status}, + #{deviceType}, + #{networkMethod}, + #{vertificateMethod}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{imgUrl}, + #{protocolCode,jdbcType=VARCHAR}, + #{transport,jdbcType=VARCHAR}, + + + + + update iot_product + + product_name = #{productName}, + category_id = #{categoryId}, + category_name = #{categoryName}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + is_sys = #{isSys}, + is_authorize = #{isAuthorize}, + mqtt_account = #{mqttAccount}, + mqtt_password = #{mqttPassword}, + mqtt_secret = #{mqttSecret}, + status = #{status}, + device_type = #{deviceType}, + network_method = #{networkMethod}, + vertificate_method = #{vertificateMethod}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + img_url = #{imgUrl}, + protocol_code = #{protocolCode,jdbcType=VARCHAR}, + transport = #{transport,jdbcType=VARCHAR}, + + where product_id = #{productId} + + + + update iot_product set status=#{status} + where product_id = #{productId} + + + + update iot_product set things_models_json=#{thingsModelsJson} + where product_id = #{productId} + + + + delete from iot_product where product_id = #{productId} + + + + delete from iot_product where product_id in + + #{productId} + + + + + delete from iot_things_model where product_id in + + #{productId} + + + + + + + + + + + + + + + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProtocolMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProtocolMapper.xml new file mode 100644 index 00000000..b5dd6a46 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ProtocolMapper.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + id, protocol_code, protocol_name, protocol_file_url, protocol_type, + jar_sign, create_time, update_time, protocol_status, del_flag + + + + select id, protocol_code, protocol_name, protocol_file_url, protocol_type, + jar_sign, create_time, update_time, protocol_status, del_flag from iot_protocol + + + + + + + + + + + + + insert into iot_protocol + + protocol_code, + protocol_name, + protocol_file_url, + protocol_type, + jar_sign, + create_time, + update_time, + protocol_status, + del_flag, + + + #{protocolCode}, + #{protocolName}, + #{protocolFileUrl}, + #{protocolType}, + #{jarSign}, + #{createTime}, + #{updateTime}, + #{protocolStatus}, + #{delFlag}, + + + + + update iot_protocol + + protocol_code = #{protocolCode}, + protocol_name = #{protocolName}, + protocol_file_url = #{protocolFileUrl}, + protocol_type = #{protocolType}, + jar_sign = #{jarSign}, + create_time = #{createTime}, + update_time = #{updateTime}, + protocol_status = #{protocolStatus}, + del_flag = #{delFlag}, + + where id = #{id} + + + + delete from iot_protocol where id = #{id} + + + + delete from iot_protocol where id in + + #{id} + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialPlatformMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialPlatformMapper.xml new file mode 100644 index 00000000..30c30cb3 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialPlatformMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + select social_platform_id, + platform, + status, + client_id, + secret_key, + redirect_uri, + del_flag, + create_by, + create_time, + update_time, + update_by, + remark, + bind_uri, + redirect_login_uri, + error_msg_uri + from iot_social_platform + + + + + + + + + + insert into iot_social_platform + + platform, + status, + client_id, + secret_key, + redirect_uri, + del_flag, + create_by, + create_time, + update_time, + update_by, + remark, + bind_uri, + redirect_login_uri, + error_msg_uri, + + + #{platform}, + #{status}, + #{clientId}, + #{secretKey}, + #{redirectUri}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateTime}, + #{updateBy}, + #{remark}, + #{bindUri}, + #{redirectLoginUri}, + #{errorMsgUri}, + + + + + update iot_social_platform + + platform = #{platform}, + status = #{status}, + client_id = #{clientId}, + secret_key = #{secretKey}, + redirect_uri = #{redirectUri}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_time = #{updateTime}, + update_by = #{updateBy}, + remark = #{remark}, + bind_uri = #{bindUri}, + redirect_login_uri = #{redirectLoginUri}, + + error_msg_uri = #{errorMsgUri}, + + where social_platform_id = #{socialPlatformId} + + + + delete + from iot_social_platform + where social_platform_id = #{socialPlatformId} + + + + delete from iot_social_platform where social_platform_id in + + #{socialPlatformId} + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml new file mode 100644 index 00000000..0110ce38 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select social_user_id, + uuid, + source, + access_token, + expire_in, + refresh_token, + open_id, + uid, + access_code, + union_id, + scope, + token_type, + id_token, + mac_algorithm, + mac_key, + code, + oauth_token, + oauth_token_secret, + create_time, + create_by, + update_time, + update_by, + del_flag, + status, + sys_user_id, + username, + nickname, + avatar, + gender, + source_client + from iot_social_user + + + + + + + + + + + + + + + insert into iot_social_user + + uuid, + source, + access_token, + expire_in, + refresh_token, + open_id, + uid, + access_code, + union_id, + scope, + token_type, + id_token, + mac_algorithm, + mac_key, + code, + oauth_token, + oauth_token_secret, + create_time, + create_by, + update_time, + update_by, + del_flag, + status, + sys_user_id, + username, + nickname, + avatar, + gender, + source_client, + + + #{uuid}, + #{source}, + #{accessToken}, + #{expireIn}, + #{refreshToken}, + #{openId}, + #{uid}, + #{accessCode}, + #{unionId}, + #{scope}, + #{tokenType}, + #{idToken}, + #{macAlgorithm}, + #{macKey}, + #{code}, + #{oauthToken}, + #{oauthTokenSecret}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + #{delFlag}, + #{status}, + #{sysUserId}, + #{username}, + #{nickname}, + #{avatar}, + #{gender}, + #{sourceClient}, + + + + + update iot_social_user + + uuid = #{uuid}, + source = #{source}, + access_token = #{accessToken}, + expire_in = #{expireIn}, + refresh_token = #{refreshToken}, + open_id = #{openId}, + uid = #{uid}, + access_code = #{accessCode}, + union_id = #{unionId}, + scope = #{scope}, + token_type = #{tokenType}, + id_token = #{idToken}, + mac_algorithm = #{macAlgorithm}, + mac_key = #{macKey}, + code = #{code}, + oauth_token = #{oauthToken}, + oauth_token_secret = #{oauthTokenSecret}, + create_time = #{createTime}, + create_by = #{createBy}, + update_time = #{updateTime}, + update_by = #{updateBy}, + del_flag = #{delFlag}, + status = #{status}, + sys_user_id = #{sysUserId}, + username = #{username}, + nickname = #{nickname}, + avatar = #{avatar}, + gender = #{gender}, + source_client = #{sourceClient}, + + where social_user_id = #{socialUserId} + + + + delete + from iot_social_user + where social_user_id = #{socialUserId} + + + + delete from iot_social_user where social_user_id in + + #{socialUserId} + + + + + update iot_social_user + set del_flag = 1, + update_time = now() + where sys_user_id = #{sysUserId} + and source_client in + + #{sourceClient} + + + + + update iot_social_user + set del_flag = 1, + update_time = now() + where sys_user_id in + + #{sysUserId} + + and source_client in + + #{sourceClient} + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelMapper.xml new file mode 100644 index 00000000..b6486470 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelMapper.xml @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select model_id, + model_name, + product_id, + product_name, + tenant_id, + tenant_name, + identifier, + type, + datatype, + temp_slave_id, + formula, + specs, + is_chart, + is_share_perm, + is_history, + reverse_formula, + reg_addr, + is_monitor, + del_flag, + bit_option, + value_type, + create_by, + create_time, + update_by, + update_time, + remark, + is_readonly, + model_order, + quantity, + code, + parse_type + from iot_things_model + + + + + + + + + + + + + + + + insert into iot_things_model + + + model_name, + + + product_id, + + + product_name, + + + tenant_id, + + + tenant_name, + + + identifier, + + + type, + + + datatype, + + + temp_slave_id, + + + formula, + + + specs, + + + is_chart, + + + is_share_perm, + + + is_history, + + + reverse_formula, + + + reg_addr, + + + is_monitor, + + + del_flag, + + + bit_option, + + + value_type, + + + create_by, + + + create_time, + + + update_by, + + + update_time, + + + remark, + + + is_readonly, + + + model_order, + + + quantity, + + + code, + + + parse_type, + + + + + #{modelName}, + + + #{productId}, + + + #{productName}, + + + #{tenantId}, + + + #{tenantName}, + + + #{identifier}, + + + #{type}, + + + #{datatype}, + + + #{tempSlaveId}, + + + #{formula}, + + + #{specs}, + + + #{isChart}, + + + #{isSharePerm}, + + + #{isHistory}, + + + #{reverseFormula}, + + + #{regAddr}, + + + #{isMonitor}, + + + #{delFlag}, + + + #{bitOption}, + + + #{valueType}, + + + #{createBy}, + + + #{createTime}, + + + #{updateBy}, + + + #{updateTime}, + + + #{remark}, + + + #{isReadonly}, + + + #{modelOrder}, + + + #{quantity}, + + + #{code}, + + + #{parseType}, + + + + + + insert into iot_things_model ( + model_name,product_id,product_name,tenant_id,tenant_name,identifier,type, + datatype,specs,is_chart,is_share_perm,is_history,is_monitor,is_readonly,create_by,create_time,temp_slave_id,formula, + reverse_formula,reg_addr,bit_option,value_type,quantity,code,parse_type + ) + values + + + #{model.modelName},#{model.productId},#{model.productName},#{model.tenantId},#{model.tenantName} + ,#{model.identifier},#{model.type},#{model.datatype},#{model.specs} + ,#{model.isChart},#{model.isSharePerm},#{model.isHistory},#{model.isMonitor},#{model.isReadonly},#{model.createBy},#{model.createTime}, + #{model.tempSlaveId},#{model.formula},#{model.reverseFormula},#{model.regAddr}, + #{model.bitOption},#{model.valueType},#{model.quantity},#{model.code},#{model.parseType} + + + + + + update iot_things_model + + + model_name = #{modelName}, + + + product_id = #{productId}, + + + product_name = #{productName}, + + + tenant_id = #{tenantId}, + + + tenant_name = #{tenantName}, + + + identifier = #{identifier}, + + + type = #{type}, + + + datatype = #{datatype}, + + + temp_slave_id = #{tempSlaveId}, + + + formula = #{formula}, + + + specs = #{specs}, + + + is_chart = #{isChart}, + + + is_share_perm = #{isSharePerm}, + + + is_history = #{isHistory}, + + + reverse_formula = #{reverseFormula}, + + + reg_addr = #{regAddr}, + + + is_monitor = #{isMonitor}, + + + del_flag = #{delFlag}, + + + bit_option = #{bitOption}, + + + value_type = #{valueType}, + + + create_by = #{createBy}, + + + create_time = #{createTime}, + + + update_by = #{updateBy}, + + + update_time = #{updateTime}, + + + remark = #{remark}, + + + is_readonly = #{isReadonly}, + + + model_order = #{modelOrder}, + + + quantity =#{quantity}, + + + code = #{code}, + + + parse_type= #{parseType}, + + + where model_id = #{modelId} + + + + delete + from iot_things_model + where model_id = #{modelId} + + + + delete from iot_things_model where model_id in + + #{modelId} + + + + + + + + + delete from iot_things_model where product_id = #{productId} + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelTemplateMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelTemplateMapper.xml new file mode 100644 index 00000000..ebdf5249 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/ThingsModelTemplateMapper.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select template_id, template_name, tenant_id, tenant_name, identifier, type, datatype, specs, is_sys, is_readonly, is_chart,is_share_perm, is_history, temp_slave_id, is_monitor, formula, del_flag, reverse_formula, create_by, reg_addr, create_time, bit_option, update_by, value_type, update_time, remark, model_order,is_params,quantity,code,parse_type from iot_things_model_template + + + + + + + + + + insert into iot_things_model_template + + template_name, + tenant_id, + tenant_name, + identifier, + type, + datatype, + specs, + is_sys, + is_readonly, + is_chart, + is_share_perm, + is_history, + temp_slave_id, + is_monitor, + formula, + del_flag, + reverse_formula, + create_by, + reg_addr, + create_time, + bit_option, + update_by, + value_type, + update_time, + remark, + model_order, + is_params, + quantity, + code, + parse_type, + + + #{templateName}, + #{tenantId}, + #{tenantName}, + #{identifier}, + #{type}, + #{datatype}, + #{specs}, + #{isSys}, + #{isReadonly}, + #{isChart}, + #{isSharePerm}, + #{isHistory}, + #{tempSlaveId}, + #{isMonitor}, + #{formula}, + #{delFlag}, + #{reverseFormula}, + #{createBy}, + #{regAddr}, + #{createTime}, + #{bitOption}, + #{updateBy}, + #{valueType}, + #{updateTime}, + #{remark}, + #{modelOrder}, + #{isParams}, + #{quantity}, + #{code}, + #{parseType}, + + + + + update iot_things_model_template + + template_name = #{templateName}, + tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + identifier = #{identifier}, + type = #{type}, + datatype = #{datatype}, + specs = #{specs}, + is_sys = #{isSys}, + is_readonly = #{isReadonly}, + is_chart = #{isChart}, + is_share_perm = #{isSharePerm}, + is_history = #{isHistory}, + temp_slave_id = #{tempSlaveId}, + is_Monitor = #{isMonitor}, + formula = #{formula}, + del_flag = #{delFlag}, + reverse_formula = #{reverseFormula}, + create_by = #{createBy}, + reg_addr = #{regAddr}, + create_time = #{createTime}, + bit_option = #{bitOption}, + update_by = #{updateBy}, + value_type = #{valueType}, + update_time = #{updateTime}, + remark = #{remark}, + model_order = #{modelOrder}, + is_params = #{isParams}, + quantity=#{quantity}, + code = #{code}, + parse_type = #{parseType}, + + where template_id = #{templateId} + + + + update iot_things_model_template + + update_time = #{updateTime}, + temp_slave_id = #{tempSlaveId}, + old_temp_slave_id = #{oldTempSlaveId} + + where temp_slave_id = #{oldTempSlaveId} + + + + delete from iot_things_model_template where template_id = #{templateId} + + + + delete from iot_things_model_template + where temp_slave_id like concat(#{templateId},'#%') + + + + delete from iot_things_model_template where template_id in + + #{templateId} + + + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempMapper.xml new file mode 100644 index 00000000..87cdee16 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempMapper.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + select template_id, + template_name, + type, + polling_method, + slave_total, + point_total, + share, + create_time, + create_by, + update_time, + update_by, + user_id + from iot_var_temp + + + + + + + + insert into iot_var_temp + + + template_name, + + + type, + + + polling_method, + + + slave_total, + + + point_total, + + + share, + + + create_time, + + + create_by, + + + update_time, + + + update_by, + + + user_id, + + + + + #{templateName}, + + + #{type}, + + + #{pollingMethod}, + + + #{slaveTotal}, + + + #{pointTotal}, + + + #{share}, + + + #{createTime}, + + + #{createBy}, + + + #{updateTime}, + + + #{updateBy}, + + + #{userId}, + + + + + + update iot_var_temp + + + template_name = #{templateName}, + + + type = #{type}, + + + polling_method = #{pollingMethod}, + + + slave_total = #{slaveTotal}, + + + point_total = #{pointTotal}, + + + share = #{share}, + + + create_time = #{createTime}, + + + create_by = #{createBy}, + + + update_time = #{updateTime}, + + + update_by = #{updateBy}, + + + user_id = #{userId}, + + + where template_id = #{templateId} + + + + delete + from iot_var_temp + where template_id = #{templateId} + + + + delete from iot_var_temp where template_id in + + #{templateId} + + + + + + + diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempSalveMapper.xml b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempSalveMapper.xml new file mode 100644 index 00000000..d87db2be --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/VarTempSalveMapper.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, device_temp_id, slave_addr, slave_ip, slave_name, addr_start, addr_end,packet_length, timer, status, create_time, create_by, update_time, update_by, remark from iot_var_temp_salve + + + + + + + + insert into iot_var_temp_salve + + device_temp_id, + slave_addr, + slave_ip, + slave_name, + addr_start, + addr_end, + packet_length, + timer, + status, + create_time, + create_by, + update_time, + update_by, + remark, + + + #{deviceTempId}, + #{slaveAddr}, + #{slaveIp}, + #{slaveName}, + #{addrStart}, + #{addrEnd}, + #{packetLength}, + #{timer}, + #{status}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + #{remark}, + + + + + update iot_var_temp_salve + + device_temp_id = #{deviceTempId}, + slave_addr = #{slaveAddr}, + slave_ip = #{slaveIp}, + slave_name = #{slaveName}, + addr_start = #{addrStart}, + addr_end = #{addrEnd}, + packet_length = #{packetLength}, + timer = #{timer}, + status = #{status}, + create_time = #{createTime}, + create_by = #{createBy}, + update_time = #{updateTime}, + update_by = #{updateBy}, + remark = #{remark}, + + where id = #{id} + + + + delete from iot_var_temp_salve where id = #{id} + + + + delete from iot_var_temp_salve where id in + + #{id} + + + + + delete from iot_var_temp_salve where device_temp_id in + + #{id} + + + + + + + \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css new file mode 100644 index 00000000..ea33f76a --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + text-shadow: 0 1px 0 #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; + background-color: #e8e8e8; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + background-color: #2e6da4; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css.map b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css.map new file mode 100644 index 00000000..949d0973 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css new file mode 100644 index 00000000..2a69f48c --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css.map b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css.map new file mode 100644 index 00000000..5d75106e --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css new file mode 100644 index 00000000..fcab4155 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css @@ -0,0 +1,6834 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + -moz-text-decoration: underline dotted; + text-decoration: underline dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: "Glyphicons Halflings"; + src: url("../fonts/glyphicons-halflings-regular.eot"); + src: url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: "Glyphicons Halflings"; + font-style: normal; + font-weight: 400; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: 400; + line-height: 1; + color: #777777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: 700; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: "\2014 \00A0"; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eeeeee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ""; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: "\00A0 \2014"; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.row-no-gutters { + margin-right: 0; + margin-left: 0; +} +.row-no-gutters [class*="col-"] { + padding-right: 0; + padding-left: 0; +} +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11, + .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11, + .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11, + .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: 0.01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: 700; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + opacity: 0.65; + -webkit-box-shadow: none; + box-shadow: none; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + background-image: none; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + background-image: none; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + background-image: none; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + background-image: none; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + background-image: none; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + background-image: none; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: 400; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #777777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-right: 15px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-right: -15px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 8px; + margin-bottom: 8px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eeeeee; + border-color: #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: 0.2em 0.6em 0.3em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777777; + cursor: not-allowed; + background-color: #eeeeee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: 0.2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: 0.5; +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: 0.5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 12px; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: 0.9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: 0.5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + outline: 0; + filter: alpha(opacity=90); + opacity: 0.9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: "\2039"; +} +.carousel-control .icon-next:before { + content: "\203a"; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css.map b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css.map new file mode 100644 index 00000000..caac3e61 --- /dev/null +++ b/springboot/fastbee-service/fastbee-iot-service/src/main/resources/static/oauth/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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A;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;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rDA;EC8DG,oBAAA;CfwnDH;ActrDA;EC8DG,oBAAA;Cf2nDH;AczrDA;EC8DG,WAAA;Cf8nDH;Ac5rDA;EC8DG,oBAAA;CfioDH;Ac/rDA;EC8DG,oBAAA;CfooDH;AclsDA;EC8DG,WAAA;CfuoDH;AcrsDA;EC8DG,oBAAA;Cf0oDH;AcxsDA;EC8DG,oBAAA;Cf6oDH;Ac3sDA;EC8DG,WAAA;CfgpDH;Ac9sDA;EC8DG,oBAAA;CfmpDH;AcjtDA;EC8DG,mBAAA;CfspDH;AcptDA;ECmEG,YAAA;CfopDH;AcvtDA;ECoDG,WAAA;CfsqDH;Ac1tDA;ECoDG,mBAAA;CfyqDH;Ac7tDA;ECoDG,mBAAA;Cf4qDH;AchuDA;ECoDG,UAAA;Cf+qDH;AcnuDA;ECoDG,mBAAA;CfkrDH;ActuDA;ECoDG,mBAAA;CfqrDH;AczuDA;ECoDG,UAAA;CfwrDH;Ac5uDA;ECoDG,mBAAA;Cf2rDH;Ac/uDA;ECoDG,mBAAA;Cf8rDH;AclvDA;ECoDG,UAAA;CfisDH;AcrvDA;ECoDG,mBAAA;CfosDH;AcxvDA;ECoDG,kBAAA;CfusDH;Ac3vDA;ECyDG,WAAA;CfqsDH;Ac9vDA;ECwEG,kBAAA;CfyrDH;AcjwDA;ECwEG,0BAAA;Cf4rDH;AcpwDA;ECwEG,0BAAA;Cf+rDH;AcvwDA;ECwEG,iBAAA;CfksDH;Ac1wDA;ECwEG,0BAAA;CfqsDH;Ac7wDA;ECwEG,0BAAA;CfwsDH;AchxDA;ECwEG,iBAAA;Cf2sDH;AcnxDA;ECwEG,0BAAA;Cf8sDH;ActxDA;ECwEG,0BAAA;CfitDH;AczxDA;ECwEG,iBAAA;CfotDH;Ac5xDA;ECwEG,0BAAA;CfutDH;Ac/xDA;ECwEG,yBAAA;Cf0tDH;AclyDA;ECwEG,gBAAA;Cf6tDH;Aa5tDD;ECzEC;;;;;;;;;;;;ICuCK,YAAA;Gf6wDH;EcpzDF;IC+CG,YAAA;GfwwDD;EcvzDF;IC+CG,oBAAA;Gf2wDD;Ec1zDF;IC+CG,oBAAA;Gf8wDD;Ec7zDF;IC+CG,WAAA;GfixDD;Ech0DF;IC+CG,oBAAA;GfoxDD;Ecn0DF;IC+CG,oBAAA;GfuxDD;Ect0DF;IC+CG,WAAA;Gf0xDD;Ecz0DF;IC+CG,oBAAA;Gf6xDD;Ec50DF;IC+CG,oBAAA;GfgyDD;Ec/0DF;IC+CG,WAAA;GfmyDD;Ecl1DF;IC+CG,oBAAA;GfsyDD;Ecr1DF;IC+CG,mBAAA;GfyyDD;Ecx1DF;IC8DG,YAAA;Gf6xDD;Ec31DF;IC8DG,oBAAA;GfgyDD;Ec91DF;IC8DG,oBAAA;GfmyDD;Ecj2DF;IC8DG,WAAA;GfsyDD;Ecp2DF;IC8DG,oBAAA;GfyyDD;Ecv2DF;IC8DG,oBAAA;Gf4yDD;Ec12DF;IC8DG,WAAA;Gf+yDD;Ec72DF;IC8DG,oBAAA;GfkzDD;Ech3DF;IC8DG,oBAAA;GfqzDD;Ecn3DF;IC8DG,WAAA;GfwzDD;Ect3DF;IC8DG,oBAAA;Gf2zDD;Ecz3DF;IC8DG,mBAAA;Gf8zDD;Ec53DF;ICmEG,YAAA;Gf4zDD;Ec/3DF;ICoDG,WAAA;Gf80DD;Ecl4DF;ICoDG,mBAAA;Gfi1DD;Ecr4DF;ICoDG,mBAAA;Gfo1DD;Ecx4DF;ICoDG,UAAA;Gfu1DD;Ec34DF;ICoDG,mBAAA;Gf01DD;Ec94DF;ICoDG,mBAAA;Gf61DD;Ecj5DF;ICoDG,UAAA;Gfg2DD;Ecp5DF;ICoDG,mBAAA;Gfm2DD;Ecv5DF;ICoDG,mBAAA;Gfs2DD;Ec15DF;ICoDG,UAAA;Gfy2DD;Ec75DF;ICoDG,mBAAA;Gf42DD;Ech6DF;ICoDG,kBAAA;Gf+2DD;Ecn6DF;ICyDG,WAAA;Gf62DD;Ect6DF;ICwEG,kBAAA;Gfi2DD;Ecz6DF;ICwEG,0BAAA;Gfo2DD;Ec56DF;ICwEG,0BAAA;Gfu2DD;Ec/6DF;ICwEG,iBAAA;Gf02DD;Ecl7DF;ICwEG,0BAAA;Gf62DD;Ecr7DF;ICwEG,0BAAA;Gfg3DD;Ecx7DF;ICwEG,iBAAA;Gfm3DD;Ec37DF;ICwEG,0BAAA;Gfs3DD;Ec97DF;ICwEG,0BAAA;Gfy3DD;Ecj8DF;ICwEG,iBAAA;Gf43DD;Ecp8DF;ICwEG,0BAAA;Gf+3DD;Ecv8DF;ICwEG,yBAAA;Gfk4DD;Ec18DF;ICwEG,gBAAA;Gfq4DD;CACF;Aa53DD;EClFC;;;;;;;;;;;;ICuCK,YAAA;Gfs7DH;Ec79DF;IC+CG,YAAA;Gfi7DD;Ech+DF;IC+CG,oBAAA;Gfo7DD;Ecn+DF;IC+CG,oBAAA;Gfu7DD;Ect+DF;IC+CG,WAAA;Gf07DD;Ecz+DF;IC+CG,oBAAA;Gf67DD;Ec5+DF;IC+CG,oBAAA;Gfg8DD;Ec/+DF;IC+CG,WAAA;Gfm8DD;Ecl/DF;IC+CG,oBAAA;Gfs8DD;Ecr/DF;IC+CG,oBAAA;Gfy8DD;Ecx/DF;IC+CG,WAAA;Gf48DD;Ec3/DF;IC+CG,oBAAA;Gf+8DD;Ec9/DF;IC+CG,mBAAA;Gfk9DD;EcjgEF;IC8DG,YAAA;Gfs8DD;EcpgEF;IC8DG,oBAAA;Gfy8DD;EcvgEF;IC8DG,oBAAA;Gf48DD;Ec1gEF;IC8DG,WAAA;Gf+8DD;Ec7gEF;IC8DG,oBAAA;Gfk9DD;EchhEF;IC8DG,oBAAA;Gfq9DD;EcnhEF;IC8DG,WAAA;Gfw9DD;EcthEF;IC8DG,oBAAA;Gf29DD;EczhEF;IC8DG,oBAAA;Gf89DD;Ec5hEF;IC8DG,WAAA;Gfi+DD;Ec/hEF;IC8DG,oBAAA;Gfo+DD;EcliEF;IC8DG,mBAAA;Gfu+DD;EcriEF;ICmEG,YAAA;Gfq+DD;EcxiEF;ICoDG,WAAA;Gfu/DD;Ec3iEF;ICoDG,mBAAA;Gf0/DD;Ec9iEF;ICoDG,mBAAA;Gf6/DD;EcjjEF;ICoDG,UAAA;GfggED;EcpjEF;ICoDG,mBAAA;GfmgED;EcvjEF;ICoDG,mBAAA;GfsgED;Ec1jEF;ICoDG,UAAA;GfygED;Ec7jEF;ICoDG,mBAAA;Gf4gED;EchkEF;ICoDG,mBAAA;Gf+gED;EcnkEF;ICoDG,UAAA;GfkhED;EctkEF;ICoDG,mBAAA;GfqhED;EczkEF;ICoDG,kBAAA;GfwhED;Ec5kEF;ICyDG,WAAA;GfshED;Ec/kEF;ICwEG,kBAAA;Gf0gED;EcllEF;ICwEG,0BAAA;Gf6gED;EcrlEF;ICwEG,0BAAA;GfghED;EcxlEF;ICwEG,iBAAA;GfmhED;Ec3lEF;ICwEG,0BAAA;GfshED;Ec9lEF;ICwEG,0BAAA;GfyhED;EcjmEF;ICwEG,iBAAA;Gf4hED;EcpmEF;ICwEG,0BAAA;Gf+hED;EcvmEF;ICwEG,0BAAA;GfkiED;Ec1mEF;ICwEG,iBAAA;GfqiED;Ec7mEF;ICwEG,0BAAA;GfwiED;EchnEF;ICwEG,yBAAA;Gf2iED;EcnnEF;ICwEG,gBAAA;Gf8iED;CACF;Aa5hED;EC3FC;;;;;;;;;;;;ICuCK,YAAA;Gf+lEH;EctoEF;IC+CG,YAAA;Gf0lED;EczoEF;IC+CG,oBAAA;Gf6lED;Ec5oEF;IC+CG,oBAAA;GfgmED;Ec/oEF;IC+CG,WAAA;GfmmED;EclpEF;IC+CG,oBAAA;GfsmED;EcrpEF;IC+CG,oBAAA;GfymED;EcxpEF;IC+CG,WAAA;Gf4mED;Ec3pEF;IC+CG,oBAAA;Gf+mED;Ec9pEF;IC+CG,oBAAA;GfknED;EcjqEF;IC+CG,WAAA;GfqnED;EcpqEF;IC+CG,oBAAA;GfwnED;EcvqEF;IC+CG,mBAAA;Gf2nED;Ec1qEF;IC8DG,YAAA;Gf+mED;Ec7qEF;IC8DG,oBAAA;GfknED;EchrEF;IC8DG,oBAAA;GfqnED;EcnrEF;IC8DG,WAAA;GfwnED;EctrEF;IC8DG,oBAAA;Gf2nED;EczrEF;IC8DG,oBAAA;Gf8nED;Ec5rEF;IC8DG,WAAA;GfioED;Ec/rEF;IC8DG,oBAAA;GfooED;EclsEF;IC8DG,oBAAA;GfuoED;EcrsEF;IC8DG,WAAA;Gf0oED;EcxsEF;IC8DG,oBAAA;Gf6oED;Ec3sEF;IC8DG,mBAAA;GfgpED;Ec9sEF;ICmEG,YAAA;Gf8oED;EcjtEF;ICoDG,WAAA;GfgqED;EcptEF;ICoDG,mBAAA;GfmqED;EcvtEF;ICoDG,mBAAA;GfsqED;Ec1tEF;ICoDG,UAAA;GfyqED;Ec7tEF;ICoDG,mBAAA;Gf4qED;EchuEF;ICoDG,mBAAA;Gf+qED;EcnuEF;ICoDG,UAAA;GfkrED;EctuEF;ICoDG,mBAAA;GfqrED;EczuEF;ICoDG,mBAAA;GfwrED;Ec5uEF;ICoDG,UAAA;Gf2rED;Ec/uEF;ICoDG,mBAAA;Gf8rED;EclvEF;ICoDG,kBAAA;GfisED;EcrvEF;ICyDG,WAAA;Gf+rED;EcxvEF;ICwEG,kBAAA;GfmrED;Ec3vEF;ICwEG,0BAAA;GfsrED;Ec9vEF;ICwEG,0BAAA;GfyrED;EcjwEF;ICwEG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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n//\n\nabbr[title] {\n border-bottom: none; // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important; // Black prints faster: h5bp.com/s\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n}\n","// stylelint-disable value-list-comma-newline-after, value-list-comma-space-after, indentation, declaration-colon-newline-after, font-family-no-missing-generic-family-keyword\n\n//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"@{icon-font-path}@{icon-font-name}.eot\");\n src: url(\"@{icon-font-path}@{icon-font-name}.eot?#iefix\") format(\"embedded-opentype\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff2\") format(\"woff2\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff\") format(\"woff\"),\n url(\"@{icon-font-path}@{icon-font-name}.ttf\") format(\"truetype\"),\n url(\"@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}\") format(\"svg\");\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// stylelint-disable media-feature-name-no-vendor-prefix, media-feature-parentheses-space-inside, media-feature-name-no-unknown, indentation, at-rule-name-space-after\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","// stylelint-disable selector-list-comma-newline-after, selector-no-qualifying-type\n\n//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: 400;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n padding: .2em;\n background-color: @state-warning-bg;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: \"\"; }\n &:after {\n content: \"\\00A0 \\2014\"; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n color: @pre-color;\n word-break: break-all;\n word-wrap: break-word;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n padding-right: ceil((@gutter / 2));\n padding-left: floor((@gutter / 2));\n margin-right: auto;\n margin-left: auto;\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-right: floor((@gutter / -2));\n margin-left: ceil((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-right: floor((@grid-gutter-width / 2));\n padding-left: ceil((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-no-qualifying-type\n\n//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type, property-no-vendor-prefix, media-feature-name-no-vendor-prefix\n\n//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: 700;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\ninput[type=\"search\"] {\n // Override content-box in Normalize (* isn't specific enough)\n .box-sizing(border-box);\n\n // Search inputs in iOS\n //\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n -webkit-appearance: none;\n appearance: none;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n\n // Apply same disabled cursor tweak as for inputs\n // Some special care is needed because