From 188380e6459b0918c135b6cc669d90f872ecc641 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Mon, 17 Jun 2024 19:13:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/mybatis/DataScopeHandler.java | 21 +++ .../QualityInspectionRecordController.java | 2 +- .../xml/QualityInspectionRecordMapper.xml | 5 +- .../mapper/AiAnalyseHardWareRecordMapper.java | 2 + .../xml/AiAnalyseHardWareRecordMapper.xml | 9 + .../IAiAnalyseHardWareRecordService.java | 8 + .../AiAnalyseHardWareRecordServiceImpl.java | 5 + .../controller/EnterpriseInfoController.java | 19 ++ .../entity/vo/StatsEnterpriseWeekVo.java | 23 +++ .../worker/mapper/WorkerInfoMapper.java | 2 + .../worker/mapper/xml/WorkerInfoMapper.xml | 6 + .../service/IEnterpriseInfoService.java | 5 + .../worker/service/IWorkerInfoService.java | 1 + .../impl/EnterpriseInfoServiceImpl.java | 176 +++++++++++++++++- .../service/impl/WorkerInfoServiceImpl.java | 5 + src/main/resources/excel/人员导入模板.xlsx | Bin 12859 -> 12975 bytes 16 files changed, 283 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/StatsEnterpriseWeekVo.java diff --git a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java index 2f3b81fc2..1468153f9 100644 --- a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java +++ b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java @@ -202,6 +202,27 @@ public class DataScopeHandler implements DataPermissionHandler { } } + //解析ai视频预警 + List filterAis = getNeedFilterLeftExpression(plainSelect, getFieldAiTables(), ds, true); + if (CollUtil.isNotEmpty(filterAis)) { + List videoItems = aiAnalyseHardWareRecordService.getAiAnalyseHardIdsByEnterpriseId(id); + if (CollUtil.isEmpty(videoItems)) { + videoItems.add("0"); + } + videoItems = videoItems.stream().map(s -> "'" + s + "'").collect(Collectors.toList()); + for (String filterAi : filterAis) { + String sql = StrUtil.format(" ({}.hardware_id in ({}) OR ({}.quality_region_id in (select distinct quality_region_id from quality_region_to_user where user_id = {}))) ", + filterAi, StrUtil.join(",", videoItems), filterAi, SecurityUtils.getUser().getUserId()); + Expression expression = null; + try { + expression = CCJSqlParserUtil.parseCondExpression(sql); + expressions.add(expression); + } catch (JSQLParserException e) { + log.error(e.getMessage(), e); + } + } + } + } if (expressions.size() > 0) { Expression dataExpression; diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/controller/QualityInspectionRecordController.java b/src/main/java/com/zhgd/xmgl/modules/quality/controller/QualityInspectionRecordController.java index 9e8562d13..1fc343adf 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/controller/QualityInspectionRecordController.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/controller/QualityInspectionRecordController.java @@ -62,7 +62,7 @@ public class QualityInspectionRecordController { @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "regionId", value = "检查部位ID", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "itemId", value = "子任务ID", paramType = "body", required = false, dataType = "String"), - @ApiImplicitParam(name = "status", value = "状态,1无需整改,2待整改,3待复查,4待核验,5合格,6不合格,7超期未关闭", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "status", value = "状态,1无需整改,2待整改,3待复查,4待核验,5合格,60未合格,7超期未关闭", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "recordStatus", value = "查询类型,1排查记录,2已闭合,3未闭合,4超期未关闭,5待整改,6待复查,7待核验", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "urgentLevel", value = "紧急程度,1一般,2严重,3紧要", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "level", value = "问题等级,1一级,2二级,3三级,4四级", paramType = "body", required = false, dataType = "String"), diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityInspectionRecordMapper.xml b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityInspectionRecordMapper.xml index fb7067cba..1d25429dc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityInspectionRecordMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityInspectionRecordMapper.xml @@ -301,13 +301,16 @@ and a.level = #{param.level} - + and a.status = #{param.status} and a.change_limit_time current_date and a.status != 5 + + and a.status != 5 and a.status != 6 + and a.urgent_level = #{param.urgentLevel} diff --git a/src/main/java/com/zhgd/xmgl/modules/video/mapper/AiAnalyseHardWareRecordMapper.java b/src/main/java/com/zhgd/xmgl/modules/video/mapper/AiAnalyseHardWareRecordMapper.java index 7d7b53e9c..ed2cd0b31 100644 --- a/src/main/java/com/zhgd/xmgl/modules/video/mapper/AiAnalyseHardWareRecordMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/video/mapper/AiAnalyseHardWareRecordMapper.java @@ -17,6 +17,8 @@ public interface AiAnalyseHardWareRecordMapper extends BaseMapper getAiAnalyseHardIdsByUserId(Long userId); + List getAiAnalyseHardIdsByEnterpriseId(Long enterpriseId); + List getUserIdsByAiAnalyseHardId(String aiAnalyseHardId); List getUserIdsByQualityRegionId(String qualityRegionId); diff --git a/src/main/java/com/zhgd/xmgl/modules/video/mapper/xml/AiAnalyseHardWareRecordMapper.xml b/src/main/java/com/zhgd/xmgl/modules/video/mapper/xml/AiAnalyseHardWareRecordMapper.xml index 8932b9901..d0cd688de 100644 --- a/src/main/java/com/zhgd/xmgl/modules/video/mapper/xml/AiAnalyseHardWareRecordMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/video/mapper/xml/AiAnalyseHardWareRecordMapper.xml @@ -8,6 +8,15 @@ join quality_region_to_user qrtu on qrtaah.quality_region_id = qrtu.quality_region_id where qrtu.user_id = #{userId} + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IEnterpriseInfoService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IEnterpriseInfoService.java index da19d63cd..821df2a38 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IEnterpriseInfoService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IEnterpriseInfoService.java @@ -9,6 +9,7 @@ import com.zhgd.xmgl.base.CompanyVo; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; import com.baomidou.mybatisplus.extension.service.IService; import com.zhgd.xmgl.modules.worker.entity.SjEnterpriseInfo; +import com.zhgd.xmgl.modules.worker.entity.vo.StatsEnterpriseWeekVo; import java.util.HashMap; import java.util.List; @@ -58,4 +59,8 @@ public interface IEnterpriseInfoService extends IService { Page countSupplier(Map paramMap); List getEnterpriseInfoByRegionId(Long id); + + EnterpriseInfo getXzSupplierInfo(Map param); + + StatsEnterpriseWeekVo statsEnterpriseWeek(Map param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java index 8d78993cb..5f4ad427b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java @@ -168,4 +168,5 @@ public interface IWorkerInfoService extends IService { void deleteBatch(String ids); + double getAvgSafeScore(String enterpriseId, String projectSn); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java index b4f981ca9..6d14b0d76 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java @@ -1,38 +1,51 @@ package com.zhgd.xmgl.modules.worker.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.mybatis.EntityMap; +import com.zhgd.jeecg.common.system.query.QueryGenerator; import com.zhgd.xmgl.async.AsyncHikvision; import com.zhgd.xmgl.async.AsyncJiLianDa; import com.zhgd.xmgl.async.AsyncWorker; import com.zhgd.xmgl.base.CompanyVo; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; import com.zhgd.xmgl.modules.basicdata.service.impl.CompanyServiceImpl; +import com.zhgd.xmgl.modules.exam.entity.ExamTrain; +import com.zhgd.xmgl.modules.exam.entity.ExamTrainRecord; +import com.zhgd.xmgl.modules.exam.mapper.ExamTrainMapper; +import com.zhgd.xmgl.modules.exam.service.IExamTrainRecordService; +import com.zhgd.xmgl.modules.exam.service.IExamTrainService; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.entity.ProjectEnterprise; import com.zhgd.xmgl.modules.project.entity.XzUserToSupplier; import com.zhgd.xmgl.modules.project.mapper.ProjectEnterpriseMapper; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.service.impl.ProjectEnterpriseServiceImpl; -import com.zhgd.xmgl.modules.worker.entity.DepartmentInfo; -import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; -import com.zhgd.xmgl.modules.worker.entity.SjEnterpriseInfo; -import com.zhgd.xmgl.modules.worker.entity.TeamInfo; +import com.zhgd.xmgl.modules.quality.entity.QualityInspectionRecord; +import com.zhgd.xmgl.modules.quality.service.IQualityInspectionRecordService; +import com.zhgd.xmgl.modules.worker.entity.*; +import com.zhgd.xmgl.modules.worker.entity.vo.StatsEnterpriseWeekVo; import com.zhgd.xmgl.modules.worker.mapper.DepartmentInfoMapper; import com.zhgd.xmgl.modules.worker.mapper.EnterpriseInfoMapper; import com.zhgd.xmgl.modules.worker.mapper.TeamInfoMapper; import com.zhgd.xmgl.modules.worker.service.IEnterpriseInfoService; import com.zhgd.xmgl.modules.worker.service.IUserEnterpriseService; +import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService; +import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityQualityInspectionRecord; +import com.zhgd.xmgl.modules.xz.security.service.IXzSecurityQualityInspectionRecordService; import com.zhgd.xmgl.modules.xz.service.impl.XzSupplierQualificationApplyServiceImpl; +import com.zhgd.xmgl.modules.xz.special.entity.*; +import com.zhgd.xmgl.modules.xz.special.service.*; import com.zhgd.xmgl.security.entity.UserInfo; import com.zhgd.xmgl.security.util.SecurityUtils; import com.zhgd.xmgl.util.ListUtils; @@ -45,7 +58,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 劳务公司 @@ -60,6 +76,30 @@ public class EnterpriseInfoServiceImpl extends ServiceImpl getEnterpriseInfoList(Map map) { @@ -484,6 +528,130 @@ public class EnterpriseInfoServiceImpl extends ServiceImpl param) { + Long userId = SecurityUtils.getUser().getUserId(); + return baseMapper.getXzSupplierByUserId(userId); + } + + @Override + public StatsEnterpriseWeekVo statsEnterpriseWeek(Map param) { + StatsEnterpriseWeekVo vo = new StatsEnterpriseWeekVo(); + String enterpriseId = MapUtils.getString(param, "enterpriseId"); + String projectSn = MapUtils.getString(param, "projectSn"); + String beginOfWeek = DateUtil.formatDateTime(DateUtil.beginOfWeek(new Date())); + Integer inServiceNum = workerInfoService.count(new LambdaQueryWrapper() + .eq(WorkerInfo::getProjectSn, projectSn) + .eq(WorkerInfo::getEnterpriseId, enterpriseId) + .eq(WorkerInfo::getInserviceType, 1)); + vo.setInServiceNum(inServiceNum); + int securityNum = xzSecurityQualityInspectionRecordService.count(new LambdaQueryWrapper() + .eq(XzSecurityQualityInspectionRecord::getProjectSn, projectSn) + .eq(XzSecurityQualityInspectionRecord::getEnterpriseId, enterpriseId) + .ge(XzSecurityQualityInspectionRecord::getInspectTime, beginOfWeek) + ); + vo.setSecurityNum(securityNum); + int qualityNum = qualityInspectionRecordService.count(new LambdaQueryWrapper() + .eq(QualityInspectionRecord::getProjectSn, projectSn) + .eq(QualityInspectionRecord::getEnterpriseId, enterpriseId) + .ge(QualityInspectionRecord::getInspectTime, beginOfWeek) + ); + vo.setQualityNum(qualityNum); + int specialNum = countSpecialNumThisWeek(enterpriseId, projectSn, beginOfWeek); + double notPassRadio = getTrainNotPassRadio(enterpriseId, projectSn, beginOfWeek); + vo.setTrainNotPassRadio(notPassRadio); + vo.setSpecialNum(specialNum); + double safeScore = workerInfoService.getAvgSafeScore(enterpriseId, projectSn); + vo.setSafeScore(safeScore); + vo.setNum(0); + return vo; + } + + private double getTrainNotPassRadio(String enterpriseId, String projectSn, String beginOfWeek) { + QueryWrapper wrapper = QueryGenerator.initPageQueryWrapper(ExamTrain.class, new HashMap<>()); + Set trainIds = examTrainRecordService.list().stream().map(e -> e.getTrainId()).collect(Collectors.toSet()); + if (trainIds.size() == 0) { + return 0; + } + wrapper.lambda().in(ExamTrain::getId, trainIds); + Page examTrainPage = examTrainMapper.pageList(new Page(1, -1), wrapper); + List ids = examTrainPage.getRecords().stream().map(e -> e.getId()).collect(Collectors.toList()); + BigDecimal sum = new BigDecimal(0); + BigDecimal count = new BigDecimal(0); + if (ids.size() > 0) { + List examTrainRecordList = examTrainRecordService.list(Wrappers.lambdaQuery().in(ExamTrainRecord::getTrainId, ids) + .eq(ExamTrainRecord::getProjectSn, projectSn) + .eq(ExamTrainRecord::getEnterpriseId, enterpriseId) + .ge(ExamTrainRecord::getCreateTime, beginOfWeek) + ); + for (ExamTrain record : examTrainPage.getRecords()) { + if (record.getExamPaperId() != null) { + List trainRecordList = examTrainRecordList.stream().filter(e -> e.getTrainId().toString().equals(record.getId().toString())).collect(Collectors.toList()); + if (trainRecordList.size() > 0) { + int pass = trainRecordList.stream().filter(t -> t.getIsPass() == 1).collect(Collectors.toList()).size(); + record.setPassRadio(new BigDecimal(pass).divide(new BigDecimal(trainRecordList.size()), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100))); + sum.add(BigDecimal.valueOf(100).subtract(record.getPassRadio())); + count.add(new BigDecimal(1)); + } + } + } + } + return sum.divide(count, 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + private int countSpecialNumThisWeek(String enterpriseId, String projectSn, String beginOfWeek) { + String endOfWeek = DateUtil.formatDateTime(DateUtil.endOfWeek(new Date())); + int n1 = xzBlindPlatePlugSafeService.count(new LambdaQueryWrapper() + .eq(XzBlindPlatePlugSafe::getProjectSn, projectSn) + .eq(XzBlindPlatePlugSafe::getJobApplicationUnit, enterpriseId) + .le(XzBlindPlatePlugSafe::getWorkExecutionBeginTime, endOfWeek) + .ge(XzBlindPlatePlugSafe::getWorkExecutionEndTime, beginOfWeek) + ); + int n2 = iXzGroundSafetService.count(new LambdaQueryWrapper() + .eq(XzGroundSafet::getProjectSn, projectSn) + .eq(XzGroundSafet::getJobApplicationUnit, enterpriseId) + .le(XzGroundSafet::getWorkExecutionBeginTime, endOfWeek) + .ge(XzGroundSafet::getWorkExecutionEndTime, beginOfWeek) + ); + int n3 = iXzHighJobSafeService.count(new LambdaQueryWrapper() + .eq(XzHighJobSafe::getProjectSn, projectSn) + .eq(XzHighJobSafe::getJobApplicationUnit, enterpriseId) + .le(XzHighJobSafe::getWorkExecutionBeginTime, endOfWeek) + .ge(XzHighJobSafe::getWorkExecutionEndTime, beginOfWeek) + ); + int n4 = iXzHoistSafetyWorkService.count(new LambdaQueryWrapper() + .eq(XzHoistSafetyWork::getProjectSn, projectSn) + .eq(XzHoistSafetyWork::getJobApplicationUnit, enterpriseId) + .le(XzHoistSafetyWork::getWorkExecutionBeginTime, endOfWeek) + .ge(XzHoistSafetyWork::getWorkExecutionEndTime, beginOfWeek) + ); + int n5 = iXzLimitSpaceSafeService.count(new LambdaQueryWrapper() + .eq(XzLimitSpaceSafe::getProjectSn, projectSn) + .eq(XzLimitSpaceSafe::getJobApplicationUnit, enterpriseId) + .le(XzLimitSpaceSafe::getWorkExecutionBeginTime, endOfWeek) + .ge(XzLimitSpaceSafe::getWorkExecutionEndTime, beginOfWeek) + ); + int n6 = iXzOpenCircuitSafeService.count(new LambdaQueryWrapper() + .eq(XzOpenCircuitSafe::getProjectSn, projectSn) + .eq(XzOpenCircuitSafe::getJobApplicationUnit, enterpriseId) + .le(XzOpenCircuitSafe::getWorkExecutionBeginTime, endOfWeek) + .ge(XzOpenCircuitSafe::getWorkExecutionEndTime, beginOfWeek) + ); + int n7 = iXzSpecialOperationFireSafetyService.count(new LambdaQueryWrapper() + .eq(XzSpecialOperationFireSafety::getProjectSn, projectSn) + .eq(XzSpecialOperationFireSafety::getJobApplicationUnit, enterpriseId) + .le(XzSpecialOperationFireSafety::getHotWorkExecutionBeginTime, endOfWeek) + .ge(XzSpecialOperationFireSafety::getHotWorkExecutionEndTime, beginOfWeek) + ); + int n8 = xzTemporaryElectricitySafeService.count(new LambdaQueryWrapper() + .eq(XzTemporaryElectricitySafe::getProjectSn, projectSn) + .eq(XzTemporaryElectricitySafe::getJobApplicationUnit, enterpriseId) + .le(XzTemporaryElectricitySafe::getWorkExecutionBeginTime, endOfWeek) + .ge(XzTemporaryElectricitySafe::getWorkExecutionEndTime, beginOfWeek) + ); + return n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8; + } + private EnterpriseInfo getEnterpriseInfo(SjEnterpriseInfo e, String projectSn) { EnterpriseInfo enterpriseInfo = new EnterpriseInfo(); enterpriseInfo.setId(e.getId()); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index 50d8293b6..8922f188b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -2548,4 +2548,9 @@ public class WorkerInfoServiceImpl extends ServiceImpljxf6Yn*F%*UOg6}Y7Ka))V3DYU4bY(%X zqPPpmZ5^CRh9q{{r7PVEZhQfk1)rc#Q|n`xnf}Yg_2c1>`!7-$e zfwTsPL5P367IbF*T&R>iXO`Gm?mBJa?z077i#zw!Bs*hK6hTq1Vz~Svz8RcfR#p8( zmbc=7;z)4HH887moPtyn72&;6dA^hxe>-rO9wi`7X7T6q%h&tkYVomJye{WY%lTV` zf4dyFs!)YKK8kB3Z2F|-ljbn&(6CJjxh+E+?3Y2;gKQJ!Ut+CM z62tb8)G6uEMr)6_1;kbE!_N_a15ir?1QY-O00;nwPU1knlo2l~0RR9I0ssILlV$@L zf6q(9Fcin{g8xIwz0Hp;Yctx8rQJY0IB@PNB~7#)~cfnB_+iH~o93c=$C3M}YeFmPk>o5U0MiA;H{)ZSyDtpvSLMu5#}MAusB2sLWGlI&6cZo5De#L z0s>X_e)apu2al~s;rQ5g^-da(KDv1~yjW*)f+z_wiTn*CJY$5V@HUiSW13JpV|>bJGDYMWPks}E=WAVlnSTI~8k4{TK?)x3s#bjj z001Nolc5V4e=#n2ZEVF?%WmT~6x|o-Kd3^sqn8~&1lxnePC99mbkIzvYeu4NB9f?~ z=qTx~m=Bmufug%E2k0XEcKSDMk^DsuB~!Md#BtH06CfrhM|5G%`t&kVHJ8L-U$uf9CVir=JXRE-tb;rP6?hBpaG@ zDO2CJvtUkRl36^Z3EoV(h>66bnAuq>CDV!0iCKE^#Wp_pbjkuc;lU!N zi7cH68W9Qp*_@@B_I4F+4vShJVAh&B%IbLLv#}gun zIT{o*@KV^LLC8==HT8y|)1kTN`d_&w#tX!2M)Pc~Z%A@}Mk5+X8bT_jp(Jq5`Go== zVaQRw3xM)S0?97vm`2giJm^40Z;BY`B7j{*e^~G9XorPpUJ4_mQ?iKUm`C5TP|k;D z-_&DY^ZW&6v$+J7w&m?AuK|zX0>4Jgl$uQ=CRZiZ(%fxX9YCSz>j+|QnMP0)X6e1i zy)yTf=4kWM-197VYjZd+qN81!yIw7Ndt-FGEzHsC=#I6bzS$VK!Wiu;c6VjHIdM!@ ze_@Sw6}q*xd3R}!RtN7}+nZy|c zN^@#`EJfG19H-Z+{Mme*~(|b{2ZZT5B`rl_Z;i>~f1Kb}zM?js}9~ z22L6nXDLzVpz9-D>_TdEPYn-Eu*Wu)Vf1q34D3tndBGB~-$b}|#JEIYF;+gjI$}~H zu-+;}tByEmMrqd(hfTz89r1Y+(WxU|G!fl8;;4z})e&Db5&b&i%O=9TSJdMYe**PX z1#$0H_2dD_y|SJ@0J&FJoR(^Sq2g7bRbg#tLmzLYSVBnVHHjEnbzd<8zDQu%fimi^ z40)a6fQncqO@l-c&-WveT$DPS^ZY1D7xIK=8JPj5SYYr#2rg=a<&it~jB(2!clv$A zQ5UjBMBLGwg;WLoY-exB_3?xBf2)@RyUynkev)3vW17t5+%#~95kzvRp1xU-=wHyL zDvwu8sw4XL*I)kl?f2W8@BjMw!=E4C-Tm;>?ad9+Ei>B(bNoB)-fmYFvEuJSR@K9n z$^19Po_PMG-S!OpwERieQJ12M$=%!ccR#*I#Zm8%Mex}3kHKx7)=CPhf1o@2J6LiR z=l`{OC!T-uD7mpBH{QVl`#9uIJ^%DkauY>v@&vhis|uIZ6btx-h#A9f5YZ_%1INNf zF3Ov2(U&|eMsbRqbBSxbewyQJiekMv7B-+M=Tbl5Dy;mTQMpKslwe_=vG1^$aCUOR z@ZD5wKSML+LJGp9x;vN73l0k}>VjT<-;MqTvqK5_90ljJgk(ySK_)4Gh*RPyPL(vV zsMJ(d2q~PZLhVvAwh@}MdAeFL^*KafXD^)!l@wfXGq%q3&wVmnwFxR)-yZr z&CHuwH@2rys5~QFP!`)rFKb94vCBLfk8JdC;FM}e5faB94p~fW^qdH^-Mo9JF=71Z zDPuBuu0zzaIs)nX*sS&0z${Ff> z6AtG4)FmC}jw2GwoP?7QODJCiG!dxT@M%bfc}EIPl6@RO-O~^$Ar`XhQAs=-RlsBu za^d<&#p(CO$=d?bEFiPKipYR^#KRI7;-LYUxdhqZ(jzdUb>hnP#FwvT zmmg*YFerN)*t`yZK7aS^{Ks(tY}^jc1)6X5t$^Vt0-tVM8tt`?13w!|YG$b1aJHrhF zclLXO-iEPz-NBPXXVc(Tuia^F9^dNsTaO3bN2?U-KLu4`=J2*wlUG;2rsf}z8neJC za0CI(lQAto0vaikb1gCgJ}Hx@Es_cSR?P5Z0RRALlR_>w8^4qhFDd~501*NJ022TJ z000000096X00018lanq$2e=0%j_c1}`-MjgvetM*)zNgfBq> z-IK;IIsu`R0WdZK$P$xp5*3q9Fc2H(w1i|z0ssKs1ONaJ000000000103ZMW0Hc$6 zFgyX-leRD+93JkfR(%8j03;3o02lxO000000096X000051(Od28j}q%Dgw9(lV1rM qlT$G&0sfPIF+~E+4wDZB6_eUAF9M(tlMe+IlOQq`26`<30002wEdb{L delta 2610 zcmV-23eEMeWxHgs*Z~O~6Hnw)0RRA9li>jxe@#xqFc5|JNZcXvKCzwtP+3VT0qTlM zNECtCS@yJzNbJZq{W$__mK=l|A#n?wqz$P+EIsedH*ZExrn|BTHehV7Rf=dtPykA3 znX6Tb?iaIgf&%NflDyCgQnUw)rrG&fA}S`dfm@?1FfIohc#^VAR4H0JS22vOSVPHe zf8-s?i%V@v?)=lNaK*(lUjdE@8RHThm)vn&1H-B#q61Qj4q3gJq5(*Op@0&UvzSH{ z|9Bmk(*D`dC_QJHyM5(%I>ha>rD(;@y|Z~|+-|qgcF@G|`6+&!-`q8;hPkS5B>-iK z6igW4PMfR%r8hdky;6O?f?GHDmtN)|WH0yG=j+?o`$vL*E1uOvZ-F2KABMHjkIKW~ z>UuFlSxo3CB;$~b7Iebs1ta9C9(>YYhiePvVf??uco>plNa=#aY(UwN_J~J7*5p3@ z5ZO0SO9KQH000080EbTEKnP$&jgxN!A%9J4gFq05?}h#c*}LwC8r`6VxF%3~XrO7X zMRZLBcUN}Tw4wCBcSD+%9(rky!#h0l%uKd;6@z!=+Vo2100#(oTsErh5`<>3nT%D!AHQ(m!kZuMUy-e9&UR+EJ&jJc$UfmGuM@U!bMRKhtg2!Z z`(#C#j}b0?8q&l^DMF+qY)zM|ci@fZW&%7}3%C0H1i)ImzS+<_qfBb&=YGhl5Bw0)np3$lOL<{@P?8hG_ zB^UR_hEjiNfgvlV_D0G)bloD_(3BJo&uNAyD=tzZ@l&kbA{UgzIw(!t!1D%fN?2xB z452uMgRfRBq6;2vQ<}+&M9_pt=r1-bFAUpbd=g(QNQt=`J$n)t)svdf?|1a2EE2rn zE9pc$bt`GzS&rRtYo2M;A$q1*DG~SE{1u3EOzwY75E_B*(7GDqFQ=O(ACsF_rqU(8{-=BksylC-O_|c zlE$!#Z7B=fael9WR~YgXw+1Li5=r(z=QK&C_9B3b{?a+nMFO|Zu-`Y?F12Ys2rH&5 zvQ2;FoF{*>SZ=2F*fwLo@$wyI>y3nzz7xDwtPxK@fp05i%FVWwlE+GF74G+(0iba7 zQvx&hY%9`**|F=n*Wu8t!_k&icn~=L$>AW^;b?c^e$dL^Kbjp+bvRm+-E$i0$Af{> z!DyS@!zTLp#0R@*v`y;X$>GCYI9ii@?3{ldjsr()M{B|ddlNq{9sbb4Xif0wU#yvr z<4?z{PD60Ic)#|X+8;a9jUCS$_3F=w_VbPZRL4;DTa!6%0^c}Lbqs;uT8S43@VKf5 zI)>1&Ocw-h+OK>EaYpqvvXPYC}DasRE-9GjHNP;LMA5h>I@5ZzJXv z0-Les2-=86g}{ER5xq9zZ8uB5jkxS0UbhiHcM*d&;$0UpY$L9^h*2ByzKa;Q5x;a1 z{y|Z%D+t_E7sNlP>hc-LL0NB}fgFF-6>m$mzHo7qs41)qZz+7<%d+ zQ7ifS>C4y8Umy|^zn8%4AiRdQeOXQQE>!g{&fwBo^Z#1CWe_gEDQ>RB&ClS;?<4Le z2yebAZlT02UJ!R+MBMLkcz#L5nqdPabcOxnIXL@7bs5xs$#Xr5gZGY0+o z9L%1BJ-gyunjg45D&AWvx49>klbniM_BXZ`UN>AY{MFDqc53HbNI{rX*UgITQnRQ# zZT**M_7AhT3HclaxbzlNOOv)HDSt@P#8I3oX<|{Ssj3iCIHAQ}$E(_2Yj;CZAx;#D z6NnS#z<~oI7t{-goS)5V0a5}iWY?vVxE3mb$tL95Q9%kH$L%o<;MOc@22z{rCJ#6m zNw-5vCgR$kn977kE}I-uSAY5zGOA`7s50LJLPx#?S&dS)lJKcHj#LQXN>3$9tNeX_ zK7W5YKl?d<{be!xy!iAB)K3K4g`#w*uukEF@49-zmPcmMmtRljZ$4h0eP5iu%^}M< zWZG9A=~I`uSmInfGypS~ARAn|1V*$@T)LU~>ecM(!z>2|W$yx)Z-0U>-hI3HagqZY zcY`wl)5<|L2M5jpSCS*u#?&>#Oz6o}?g^Qm%9v9Ny=YfzZLMS)g|e;Ng|cpHg?4+Z zT&Q&HQl+YQcDfb&mgxTlK7@A~kPUhC8?zA?K zZ}t1FCxh=u!Ixso`ER%IGHUU$UtS}}UxbzlNO9B7@ z-UI*u4*&oF000000RSKX001tN?Jzt6$CD~CAslYx?^_xK0037F000;O0000000031 zAOHXW^8}M21saoqF)9K>36miO6_dg-F9L}RlOY8alP?SflMON|0$2`{Aq5qaPBJe7 UD-e?*1r?K&G8F~}EdT%j0E6?pUjP6A