package com.bonus.sgzb.largeScreen.service.impl;

import com.bonus.sgzb.common.core.utils.DateTimeHelper;
import com.bonus.sgzb.common.core.web.domain.AjaxResult;
import com.bonus.sgzb.largeScreen.domain.*;
import com.bonus.sgzb.largeScreen.mapper.LargeScreenMapper;
import com.bonus.sgzb.largeScreen.service.ILargeScreenService;
import com.bonus.sgzb.largeScreen.util.CommonUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author 10488
 * 大屏
 */
@Service("ILargeScreenService")
@Slf4j
public class LargeScreenServiceImpl implements ILargeScreenService {

    @Resource(name = "LargeScreenMapper")
    private LargeScreenMapper mapper;

    @Autowired
    private CommonUtil commonUtil;

    @Override
    public AjaxResult getMaterialReqData() {
        HashMap<Object, Object> map = new HashMap<>(2);
        // 施工机具、安全工器具数量
        int num = 0, num2 = 0;
        try {
            List<MaTypeDo> list = mapper.getMaterialReqData(DateTimeHelper.getNowDate());
            List<Integer> valueList = commonUtil.totalValue3(list);
            num = valueList.get(0);
            num2 = valueList.get(1);
        } catch (Exception e) {
            log.error("领料数据", e);
        }
        map.put("num", num);
        map.put("num2", num2);
        return AjaxResult.success(map);
    }

    @Override
    public AjaxResult getMaterialReturnData() {
        HashMap<Object, Object> map = new HashMap<>(2);
        // 施工机具、安全工器具数量
        int num = 0, num2 = 0;
        try {
            List<MaTypeDo> list = mapper.getMaterialReturnData(DateTimeHelper.getNowDate());
            List<Integer> valueList = commonUtil.totalValue3(list);
            num = valueList.get(0);
            num2 = valueList.get(1);
        } catch (Exception e) {
            log.error("退料数据", e);
        }
        map.put("num", num);
        map.put("num2", num2);
        return AjaxResult.success(map);
    }

    @Override
    public AjaxResult getEquipmentDisByMap(ParamsDto dto) {
        List<EquipmentDisVo> list = new ArrayList<>();
        try {

        } catch (Exception e) {
            log.error("设备分布", e);
        }
        return AjaxResult.success(list);
    }

    @Override
    public AjaxResult getTotalOwnershipByCompany() {
        List<TotalOwnershipVo> list = new ArrayList<>();
        try {
           //查询所有公司
            list=mapper.getCompany();
            if (list.size()>0){
                for (TotalOwnershipVo vo:list){
                    TotalOwnershipVo  vos=  countNum(null,null,vo.getCompanyId(), "2");
                    vo.setTotalOwnershipNum(vos.getTotalOwnershipNum());
                }
            }
        } catch (Exception e) {
            log.error("各公司机具保有量", e);
        }
        return AjaxResult.success(list);
    }

    /**
     * 领料数据详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getMaterialReqDetailData(ParamsDto dto) {
        extracted(dto);
        // 分页
        PageHelper.startPage(dto.getPageNum() == 0 ? 1 : dto.getPageNum(), dto.getPageSize());
        PageResultVo pageResult = new PageResultVo();
        List<MaterialDetailVo> result = mapper.getMaterialReqDetailData(dto);
        // 分页信息
        PageInfo<MaterialDetailVo> pageInfo = new PageInfo<>(result);
        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setTotalPageCount(pageInfo.getPages());
        pageResult.setRows(result);
        pageResult.setPageNum (dto.getPageNum());
        pageResult.setPageSize(dto.getPageSize());
        return pageResult;
    }

    /**
     * 退料数据详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getMaterialReturnDetailData(ParamsDto dto) {
        extracted(dto);
        // 分页
        PageHelper.startPage(dto.getPageNum() == 0 ? 1 : dto.getPageNum(), dto.getPageSize());
        PageResultVo pageResult = new PageResultVo();
        List<MaterialDetailVo> materialReturnDetailData = mapper.getMaterialReturnDetailData(dto);
        // 分页信息
        PageInfo<MaterialDetailVo> pageInfo = new PageInfo<>(materialReturnDetailData);
        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setTotalPageCount(pageInfo.getPages());
        pageResult.setRows(materialReturnDetailData);
        pageResult.setPageNum (dto.getPageNum());
        pageResult.setPageSize(dto.getPageSize());
        return pageResult;
    }

    /**
     * 施工机具/安全工器具总保有量详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getTotalOwnerDetailsShip(ParamsDto dto) {
        extracted(dto);
        // 分页
        PageHelper.startPage(dto.getPageNum() == 0 ? 1 : dto.getPageNum(), dto.getPageSize());
        PageResultVo pageResult = new PageResultVo();
        List<TotalOwnerVo> list = mapper.getTotalOwnerDetailsShip(dto);
        // 分页信息
        PageInfo<TotalOwnerVo> pageInfo = new PageInfo<>(list);
        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setTotalPageCount(pageInfo.getPages());
        pageResult.setRows(list);
        pageResult.setPageNum (dto.getPageNum());
        pageResult.setPageSize(dto.getPageSize());
        return pageResult;
    }

    /**
     * 新购验收入库分析详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getAcceptanceDetailStorage(ParamsDto dto) {
        extracted(dto);
        List<StorageDetailVo> result = mapper.getAcceptanceDetailStorage(dto);
        List<StorageDetailVo> filteredResult = result.stream()
                .filter(storageDetail -> storageDetail.getPurchaseNum() != 0 ||
                        storageDetail.getCheckNum() != 0 ||
                        storageDetail.getInputNum() != 0)
                .collect(Collectors.toList());
        // 手动计算分页信息
        int pageNum = dto.getPageNum() == 0 ? 1 : dto.getPageNum();
        int pageSize = dto.getPageSize();
        int total = filteredResult.size();
        int totalPages = (int) Math.ceil((double) total / pageSize);
        // 手动分页，获取当前页的数据
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, total);
        List<StorageDetailVo> currentPageData = filteredResult.subList(startIndex, endIndex);
        // 构建返回结果对象
        PageResultVo pageResult = new PageResultVo();
        pageResult.setTotal(total);
        pageResult.setTotalPageCount(totalPages);
        pageResult.setRows(currentPageData);
        pageResult.setPageNum(pageNum);
        pageResult.setPageSize(pageSize);
        return pageResult;
    }

    /**
     * 方法抽取，统一赋值
     * @param dto
     */
    private void extracted(ParamsDto dto) {
        if (dto.getMaType() != null && ("1").equals(dto.getMaType())) {
            dto.setMaTypeName(CommonConstants.JJ);
        }
        if (dto.getMaType() != null && ("2").equals(dto.getMaType())) {
            dto.setMaTypeName(CommonConstants.TS);
        }
    }

    /**
     * 当月报废分析详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getScrapAnalysisDetailByMonth(ParamsDto dto) {
        extracted(dto);
        Map<String, String> monthDayMap = DateTimeHelper.getNowOneMonthDay();
        try {
            dto.setStartDate(monthDayMap.get("beginDate"));
            dto.setEndDate(monthDayMap.get("endDate"));
            // 分页
            PageHelper.startPage(dto.getPageNum() == 0 ? 1 : dto.getPageNum(), dto.getPageSize());
            PageResultVo pageResult = new PageResultVo();
            List<ScrapVo> result = mapper.getScrapAnalysisDetailByMonth(dto);
            // 分页信息
            PageInfo<ScrapVo> pageInfo = new PageInfo<>(result);
            pageResult.setTotal(pageInfo.getTotal());
            pageResult.setTotalPageCount(pageInfo.getPages());
            pageResult.setRows(result);
            pageResult.setPageNum (dto.getPageNum());
            pageResult.setPageSize(dto.getPageSize());
            return pageResult;
        } catch (Exception e) {
            log.error("当月报废分析详情error:{}", e.getMessage());
            return null;
        }
    }


    /**
     * 当月领料分析详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getPickingAnalysisDetailByMonth(ParamsDto dto) {
        Map<String, String> monthDayMap = DateTimeHelper.getNowOneMonthDay();
        extracted(dto);
        try {
            dto.setStartDate(monthDayMap.get("beginDate"));
            dto.setEndDate(monthDayMap.get("endDate"));
            // 分页
            PageHelper.startPage(dto.getPageNum() == 0 ? 1 : dto.getPageNum(), dto.getPageSize());
            PageResultVo pageResult = new PageResultVo();
            List<MaterialDetailVo> result = mapper.getPickingAnalysisDetailByMonth(dto);
            // 分页信息
            PageInfo<MaterialDetailVo> pageInfo = new PageInfo<>(result);
            pageResult.setTotal(pageInfo.getTotal());
            pageResult.setTotalPageCount(pageInfo.getPages());
            pageResult.setRows(result);
            pageResult.setPageNum (dto.getPageNum());
            pageResult.setPageSize(dto.getPageSize());
            return pageResult;
        } catch (Exception e) {
            log.error("当月领料分析详情error:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 当月退料分析详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getMaterialReturnDetailByMonth(ParamsDto dto) {
        extracted(dto);
        try {
            Map<String, String> monthDayMap = DateTimeHelper.getNowOneMonthDay();
            dto.setStartDate(monthDayMap.get("beginDate"));
            dto.setEndDate(monthDayMap.get("endDate"));
            // 分页
            PageHelper.startPage(dto.getPageNum() == 0 ? 1 : dto.getPageNum(), dto.getPageSize());
            PageResultVo pageResult = new PageResultVo();
            List<MaterialDetailVo> result = mapper.getMaterialReturnDetailByMonth(dto);
            // 分页信息
            PageInfo<MaterialDetailVo> pageInfo = new PageInfo<>(result);
            pageResult.setTotal(pageInfo.getTotal());
            pageResult.setTotalPageCount(pageInfo.getPages());
            pageResult.setRows(result);
            pageResult.setPageNum (dto.getPageNum());
            pageResult.setPageSize(dto.getPageSize());
            return pageResult;
        } catch (Exception e) {
            log.error("当月退料分析详情error:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 当月维修分析详情
     * @param dto
     * @return
     */
    @Override
    public PageResultVo getMaintenanceDetailByMonth(ParamsDto dto) {
        extracted(dto);
        try {
            Map<String, String> monthDayMap = DateTimeHelper.getNowOneMonthDay();
            dto.setStartDate(monthDayMap.get("beginDate"));
            dto.setEndDate(monthDayMap.get("endDate"));
            // 分页
            PageResultVo pageResult = new PageResultVo<>();
            PageHelper.startPage(dto.getPageNum() == 0 ? 1 : dto.getPageNum(), dto.getPageSize());
            List<RepairDetailVo> repairDetailVoList = mapper.getMaintenanceDetailByMonth(dto);
            // 分页信息
            PageInfo<RepairDetailVo> pageInfo = new PageInfo<>(repairDetailVoList);
            pageResult.setTotal(pageInfo.getTotal());
            pageResult.setTotalPageCount(pageInfo.getPages());
            pageResult.setRows(repairDetailVoList);
            pageResult.setPageNum (dto.getPageNum());
            pageResult.setPageSize(dto.getPageSize());
            return pageResult;
        }catch (Exception e) {
            log.error("当月维修分析详情error:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 当月维修分析详情列表
     * @param dto
     * @return
     */
    @Override
    public AjaxResult getMaintenanceChartByMonth(ParamsDto dto) {
        HashMap<Object, Object> objectHashMap = getObjectHashMap(dto);
        List<AccessVo> accessVoList = mapper.getRepairList(dto);
        objectHashMap.put("accessVoList", accessVoList);
        return AjaxResult.success(objectHashMap);
    }

    @Override
    public AjaxResult getTotalOwnership() {
        List<TotalOwnershipVo> list = new ArrayList<>();
        ParamsDto dto = new ParamsDto();
        try {
            // 施工机具
            TotalOwnershipVo vo = countNum("1", CommonConstants.JJ,"","1");
            // 安全工器具
            TotalOwnershipVo vo2 = countNum("2", CommonConstants.TS,"","1");
            list.add(vo);
            list.add(vo2);
        } catch (Exception e) {
            list.removeAll(list);
            TotalOwnershipVo vo = new TotalOwnershipVo();
            TotalOwnershipVo vo2 = new TotalOwnershipVo();
            list.add(vo);
            list.add(vo2);
            log.error("施工机具总保有量/安全工器具总保有量", e);
        }
        return AjaxResult.success(list);
    }

    /**
     * @param maTypeName
     * @return TotalOwnershipVo
     * @description 保有量统计
     * @author cwchen
     * @date 2023/12/15 19:33
     */
    public TotalOwnershipVo countNum(String maType, String maTypeName,String companyId,String type) {
        TotalOwnershipVo vo = new TotalOwnershipVo();
        ParamsDto dto = new ParamsDto();
        dto.setMaType(maType);
        dto.setMaTypeName(maTypeName);
        if ("2".equals(type)){
            dto.setCompanyId(companyId);
        }else {
            dto.setCompanyId("");
        }
        // 在库数量
        dto.setType("1");
        List<ScrapAnalysisVo> zkValueList = mapper.getTotalOwnership(dto);
        Integer zkValue = commonUtil.setZKData(zkValueList);
        vo.setStockNum(zkValue);
        // 待入库数量
        dto.setType("2");
        List<ScrapAnalysisVo> drkValueList = mapper.getTotalOwnership(dto);
        Integer drkValue = commonUtil.setDRKData(drkValueList);
        vo.setStoredNum(drkValue);
        // 在用数量
        dto.setType("3");
        List<ScrapAnalysisVo> useValueList = mapper.getTotalOwnership(dto);
        Integer useValue = commonUtil.setUSEData(useValueList);
        vo.setUseNum(useValue);
        // 在修数量
        dto.setType("4");
        List<ScrapAnalysisVo> zxValueList = mapper.getTotalOwnership(dto);
        Integer zxValue = commonUtil.setZXData(zxValueList);
        vo.setRepairNum(zxValue);
        // 报废数量
        dto.setType("5");
        List<ScrapAnalysisVo> bfValueList = mapper.getTotalOwnership(dto);
        Integer bfValue = commonUtil.setBFData(bfValueList);
        vo.setScrapNum(bfValue);
        // 修饰待入库
        dto.setType("6");
        List<ScrapAnalysisVo> decoratedValueList = mapper.getTotalOwnership(dto);
        Integer decoratedValue = commonUtil.setDeData(decoratedValueList);
        // 总保有量 = 在库+在用+在修+修试后待入库
        vo.setTotalOwnershipNum(zkValue + decoratedValue + useValue + zxValue);
        return vo;
    }

    @Override
    public AjaxResult getScrapAnalysisByMonth(ParamsDto dto) {
        List<String> nameList = new ArrayList<>();
        List<Integer> valueList = new ArrayList<>();
        List<Integer> valueList2 = new ArrayList<>();
        HashMap<Object, Object> map = new HashMap<>(3);
        try {
            dto.setType("1");
            dto.setMaTypeName(Objects.equals("1", dto.getMaType()) ? CommonConstants.JJ : Objects.equals("2", dto.getMaType()) ? CommonConstants.TS : null);
            List<MaterialDataVo> lyList = mapper.getScrapAnalysisByMonth(dto);
            dto.setType("2");
            List<MaterialDataVo> bfList = mapper.getScrapAnalysisByMonth(dto);
            List<Object> objectList = commonUtil.setScrapAnalysisData(lyList, bfList);
            nameList = (List<String>) objectList.get(0);
            valueList = (List<Integer>) objectList.get(1);
            valueList2 = (List<Integer>) objectList.get(2);
        } catch (Exception e) {
            log.error("当月报废分析", e);
        }
        map.put("nameList", nameList);
        map.put("valueList", valueList);
        map.put("valueList2", valueList2);
        return AjaxResult.success(map);
    }

    @Override
    public AjaxResult getAcceptanceStorage(ParamsDto dto) {
        HashMap<Object, Object> map = new HashMap<>(3);
        List<String> yearMonthList = DateTimeHelper.getYearMonth();
        List<Integer> valueList = new ArrayList<>();
        List<Integer> valueList2 = new ArrayList<>();
        dto.setMaTypeName(Objects.equals("1", dto.getMaType()) ? CommonConstants.JJ : Objects.equals("2", dto.getMaType()) ? CommonConstants.TS : null);
        try {
            for (String date : yearMonthList) {
                String year = date.substring(0, 4);
                String month = date.substring(5, 7);
                // 验收数量
                dto.setType("1");
                dto.setDate(year + "-" + month);
                dto.setStartDate(DateTimeHelper.getFisrtDayOfMonth(Integer.parseInt(year), Integer.parseInt(month)));
                dto.setEndDate(DateTimeHelper.getLastDayOfMonth(Integer.parseInt(year), Integer.parseInt(month)));
                List<Map<String, String>> checkList = mapper.getAcceptanceStorage(dto);
                valueList.add(commonUtil.totalValue(checkList, dto.getMaType()));
                // 入库数量
                dto.setType("2");
                List<Map<String, String>> warehousingList = mapper.getAcceptanceStorage(dto);
                valueList2.add(commonUtil.totalValue(warehousingList, dto.getMaType()));
            }
        } catch (Exception e) {
            log.error("新购验收入库分析", e);
            valueList.removeAll(valueList);
            valueList2.removeAll(valueList2);
            yearMonthList.forEach(item -> {
                valueList.add(0);
                valueList2.add(0);
            });
        }
        map.put("nameList", yearMonthList);
        map.put("valueList", valueList);
        map.put("valueList2", valueList2);
        return AjaxResult.success(map);
    }

    @Override
    public AjaxResult getPickingAnalysisByMonth(ParamsDto dto) {
        HashMap<Object, Object> map = new HashMap<>(4);
        Map<String, String> monthDayMap = DateTimeHelper.getNowOneMonthDay();
        // 数量领料、编码领料
        int num = 0, num2 = 0;
        String rate = "0%", rate2 = "0%";
        try {
            dto.setMaTypeName(Objects.equals("1", dto.getMaType()) ? CommonConstants.JJ : Objects.equals("2", dto.getMaType()) ? CommonConstants.TS : null);
            dto.setStartDate(monthDayMap.get("beginDate"));
            dto.setEndDate(monthDayMap.get("endDate"));
            List<MaTypeDo> list = mapper.getPickingAnalysisByMonth(dto);
            List<Integer> valueList = commonUtil.totalValue2(list, dto.getMaType());
            num = valueList.get(0);
            num2 = valueList.get(1);
            rate = commonUtil.getRate(valueList.get(0), valueList.get(0) + valueList.get(1));
            rate2 = commonUtil.getRate(valueList.get(1), valueList.get(0) + valueList.get(1));
        } catch (Exception e) {
            log.error("当月领料分析", e);
        }
        map.put("num", num);
        map.put("num2", num2);
        map.put("rate", rate);
        map.put("rate2", rate2);
        return AjaxResult.success(map);
    }

    @Override
    public AjaxResult getMaterialReturnByMonth(ParamsDto dto) {
        HashMap<Object, Object> map = new HashMap<>(4);
        int num = 0, num2 = 0;
        String rate = "0%";
        Map<String, String> monthDayMap = DateTimeHelper.getNowOneMonthDay();
        dto.setStartDate(monthDayMap.get("beginDate"));
        dto.setEndDate(monthDayMap.get("endDate"));
        dto.setMaTypeName(Objects.equals("1", dto.getMaType()) ? CommonConstants.JJ : Objects.equals("2", dto.getMaType()) ? CommonConstants.TS : null);
        try {
            List<ScrapAnalysisVo> list = mapper.getMaterialReturnByMonth(dto);
            List<Integer> valueList = commonUtil.setMaterialReturnData(list);
            num = valueList.get(0);
            num2 = valueList.get(1);
            rate = commonUtil.getRate(num2, num);
        } catch (Exception e) {
            log.error("当月退料分析", e);
        }
        map.put("num", num);
        map.put("num2", num2);
        map.put("rate", rate);
        return AjaxResult.success(map);
    }

    @Override
    public AjaxResult getMaintenanceByMonth(ParamsDto dto) {
        HashMap<Object, Object> map = getObjectHashMap(dto);
        return AjaxResult.success(map);
    }

    /**
     * 方法抽取
     * @param dto
     * @return
     */
    private HashMap<Object, Object> getObjectHashMap(ParamsDto dto) {
        HashMap<Object, Object> map = new HashMap<>(6);
        int num = 0, num2 = 0, num3 = 0, num4 = 0;
        String rate = "0%", rate2 = "0%", rate3 = "0%";
        Map<String, String> monthDayMap = DateTimeHelper.getNowOneMonthDay();
        dto.setStartDate(monthDayMap.get("beginDate"));
        dto.setEndDate(monthDayMap.get("endDate"));
        dto.setMaTypeName(Objects.equals("1", dto.getMaType()) ? CommonConstants.JJ : Objects.equals("2", dto.getMaType()) ? CommonConstants.TS : null);
        try {
            List<ScrapAnalysisVo> list = mapper.getMaintenanceByMonth(dto);
            List<Integer> valueList = commonUtil.setMaintenanceData(list);
            num = valueList.get(0);
            num2 = valueList.get(1);
            num3 = valueList.get(2);
            num4 = valueList.get(3);
            rate = commonUtil.getRate(num4, num);
            rate2 = commonUtil.getRate(num2, num);
            rate3 = commonUtil.getRate(num3, num);
        } catch (Exception e) {
            log.error("当月维修分析", e);
        }
        map.put("num", num4);
        map.put("num2", num2);
        map.put("num3", num3);
        map.put("rate", rate);
        map.put("rate2", rate2);
        map.put("rate3", rate3);
        return map;
    }

    @Override
    public AjaxResult getCarUseByMonth() {
        List<CarUseVo> list = new ArrayList<>();
        CarUseVo carUseVo = new CarUseVo();
        carUseVo.setCarNo("鲁VL6562");
        carUseVo.setUseNum(24);
        carUseVo.setSquander(173.0);
        CarUseVo carUseVo2 = new CarUseVo();
        carUseVo2.setCarNo("宁CY33G7");
        carUseVo2.setUseNum(26);
        carUseVo2.setSquander(98.0);
        CarUseVo carUseVo3 = new CarUseVo();
        carUseVo3.setCarNo("黑LB686Y");
        carUseVo3.setUseNum(10);
        carUseVo3.setSquander(193.0);
        CarUseVo carUseVo4 = new CarUseVo();
        carUseVo4.setCarNo("川S03VT5");
        carUseVo4.setUseNum(12);
        carUseVo4.setSquander(282.0);
        CarUseVo carUseVo5 = new CarUseVo();
        carUseVo5.setCarNo("苏K2J2W6");
        carUseVo5.setUseNum(19);
        carUseVo5.setSquander(105.0);
        CarUseVo carUseVo6 = new CarUseVo();
        carUseVo6.setCarNo("川UYA990");
        carUseVo6.setUseNum(8);
        carUseVo6.setSquander(261.1);
        list.add(carUseVo);
        list.add(carUseVo2);
        list.add(carUseVo3);
        list.add(carUseVo4);
        list.add(carUseVo5);
        list.add(carUseVo6);
        return AjaxResult.success(list);
    }

    @Override
    public AjaxResult getMaintenanceWarning() {
        List<MaintenanceWarningVo> list = new ArrayList<>();
        try {
            ParamsDto dto = new ParamsDto();
            dto.setStartDate(DateTimeHelper.getNowTime());
            dto.setEndDate(DateTimeHelper.getTimeAfterThirtyDay());
            list = mapper.getMaintenanceWarning(dto);
        } catch (Exception e) {
            log.error("检修预警-查询失败",e);
        }
        return AjaxResult.success(list);
    }

}


