|
@@ -133,7 +133,6 @@ public class MakrerApi {
|
|
|
@RequestMapping(value = "{marker}/stat/levels", method = RequestMethod.GET)
|
|
|
public List<LevelStatDTO> levelStats(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
|
|
|
List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
|
|
|
- long t1 = System.currentTimeMillis();
|
|
|
MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
|
|
|
List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
|
|
|
Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
|
|
@@ -143,8 +142,6 @@ public class MakrerApi {
|
|
|
if(levelShowAllPaper == 0){
|
|
|
batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
|
|
|
}
|
|
|
- long t2 = System.currentTimeMillis();
|
|
|
- System.out.println("l1:"+(t2-t1));
|
|
|
Long finalBatchNo = batchNo;
|
|
|
Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
|
|
|
|
|
@@ -153,15 +150,12 @@ public class MakrerApi {
|
|
|
Map<String, Long> map = new HashMap<>();
|
|
|
//当前老师当前批次试卷总数
|
|
|
long kdtotal;
|
|
|
- long t21 = System.currentTimeMillis();
|
|
|
if (levelShowAllPaper == 1) {
|
|
|
kdtotal = markTaskRepo.countByQuestionIdAll(questionId, marker.getId());
|
|
|
} else {
|
|
|
// kdtotal = markTaskRepo.countByQuestionId(questionId, finalBatchNo, marker.getId());
|
|
|
kdtotal = markTaskRepo.countByQuestionIdAndBatchNo(questionId, finalBatchNo, marker.getId());
|
|
|
}
|
|
|
- long t22 = System.currentTimeMillis();
|
|
|
- System.out.println("l61:"+(t22-t21));
|
|
|
//当前考区内试卷总数
|
|
|
long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
|
|
|
map.put("kdtotal", kdtotal);
|
|
@@ -169,38 +163,27 @@ public class MakrerApi {
|
|
|
return map;
|
|
|
}
|
|
|
});
|
|
|
- long t3 = System.currentTimeMillis();
|
|
|
- System.out.println("l2:"+(t3-t2));
|
|
|
//当前考区各档位定档数量
|
|
|
List<Object[]> list = paperRepo.countGroupByLevel(questionId);
|
|
|
- long t4 = System.currentTimeMillis();
|
|
|
- System.out.println("l3:"+(t4-t3));
|
|
|
list.forEach(o -> {
|
|
|
LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
|
|
|
levelStatDTO.setGcount(levelStatDTO.getCount());
|
|
|
if (Objects.isNull(levelStatDTO.getId())) {
|
|
|
//求任务数为null的条数
|
|
|
int count;
|
|
|
- long t41 = System.currentTimeMillis();
|
|
|
if (levelShowAllPaper == 1) {
|
|
|
count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
|
|
|
} else {
|
|
|
count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), finalBatchNo);
|
|
|
}
|
|
|
- long t42 = System.currentTimeMillis();
|
|
|
- System.out.println("l41:"+(t42-t41));
|
|
|
//查询当前老师打回个数
|
|
|
// int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
|
|
|
int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
|
|
|
- long t43 = System.currentTimeMillis();
|
|
|
- System.out.println("l42:"+(t43-t42));
|
|
|
levelStatDTO.setCount(count);
|
|
|
levelStatDTO.setRejected(rejectCount);
|
|
|
}
|
|
|
levelStatDTOs.add(levelStatDTO);
|
|
|
});
|
|
|
- long t5 = System.currentTimeMillis();
|
|
|
- System.out.println("l4:"+(t5-t4));
|
|
|
for (Level level : levels) {
|
|
|
//所有档位依次比较
|
|
|
long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
|
|
@@ -212,16 +195,12 @@ public class MakrerApi {
|
|
|
levelStatDTOs.add(dto);
|
|
|
}
|
|
|
}
|
|
|
- long t6 = System.currentTimeMillis();
|
|
|
- System.out.println("l5:"+(t6-t5));
|
|
|
long kdtotal = 0L, total = 0L;
|
|
|
if (Objects.nonNull(future) && Objects.nonNull(future.get())) {
|
|
|
Map<String, Long> map = (Map<String, Long>) future.get();
|
|
|
kdtotal = map.get("kdtotal");
|
|
|
total = map.get("total");
|
|
|
}
|
|
|
- long t7 = System.currentTimeMillis();
|
|
|
- System.out.println("l6:"+(t7-t6));
|
|
|
|
|
|
long finalKdtotal = kdtotal;
|
|
|
long finalTotal = total;
|
|
@@ -252,8 +231,121 @@ public class MakrerApi {
|
|
|
o.setGpercent(gbd.doubleValue());
|
|
|
}
|
|
|
});
|
|
|
- long t8 = System.currentTimeMillis();
|
|
|
- System.out.println("l7:"+(t8-t7));
|
|
|
+ Collections.sort(levelStatDTOs, (o1, o2) -> {
|
|
|
+ if (o1.getId() == null || o2.getId() == null) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return o1.getId().toString().compareTo(o2.getId().toString());
|
|
|
+ });
|
|
|
+ return levelStatDTOs;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 评卷员分档数量及占比数据
|
|
|
+ *
|
|
|
+ * @param marker 评卷员用户id
|
|
|
+ * @param questionId 试题id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @RequestMapping(value = "{marker}/stat/totalLevels", method = RequestMethod.GET)
|
|
|
+ public List<LevelStatDTO> totalLevels(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
|
|
|
+ List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
|
|
|
+ MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
|
|
|
+ List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
|
|
|
+ Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
|
|
|
+ Integer levelShowAllPaper = ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper();
|
|
|
+ Long batchNo = null;
|
|
|
+ if(levelShowAllPaper == 0){
|
|
|
+ batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
|
|
|
+ }
|
|
|
+ Long finalBatchNo = batchNo;
|
|
|
+ Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
|
|
|
+ @Override
|
|
|
+ public Map<String, Long> call() throws Exception {
|
|
|
+ Map<String, Long> map = new HashMap<>();
|
|
|
+ //当前老师当前批次试卷总数
|
|
|
+ long kdtotal;
|
|
|
+ if (levelShowAllPaper == 1) {
|
|
|
+ kdtotal = markTaskRepo.countByQuestionIdAll(questionId, marker.getId());
|
|
|
+ } else {
|
|
|
+ kdtotal = markTaskRepo.countByQuestionIdAndBatchNo(questionId, finalBatchNo, marker.getId());
|
|
|
+ }
|
|
|
+ //当前考区内试卷总数
|
|
|
+ long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
|
|
|
+ map.put("kdtotal", kdtotal);
|
|
|
+ map.put("total", total);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ //当前考区各档位定档数量
|
|
|
+ List<Object[]> list = paperRepo.countGroupByLevel(questionId);
|
|
|
+ list.forEach(o -> {
|
|
|
+ LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
|
|
|
+ levelStatDTO.setGcount(levelStatDTO.getCount());
|
|
|
+ if (Objects.isNull(levelStatDTO.getId())) {
|
|
|
+ //求任务数为null的条数
|
|
|
+ int count;
|
|
|
+ if (levelShowAllPaper == 1) {
|
|
|
+ count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
|
|
|
+ } else {
|
|
|
+ count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), finalBatchNo);
|
|
|
+ }
|
|
|
+ //查询当前老师打回个数
|
|
|
+// int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
|
|
|
+ int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
|
|
|
+ levelStatDTO.setCount(count);
|
|
|
+ levelStatDTO.setRejected(rejectCount);
|
|
|
+ }
|
|
|
+ levelStatDTOs.add(levelStatDTO);
|
|
|
+ });
|
|
|
+ for (Level level : levels) {
|
|
|
+ //所有档位依次比较
|
|
|
+ long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
|
|
|
+ if (count == 0) {
|
|
|
+ LevelStatDTO dto = new LevelStatDTO();
|
|
|
+ dto.setId(level.getCode());
|
|
|
+ dto.setCount(0);
|
|
|
+ dto.setPercent(0.0);
|
|
|
+ levelStatDTOs.add(dto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ long kdtotal = 0L, total = 0L;
|
|
|
+ if (Objects.nonNull(future) && Objects.nonNull(future.get())) {
|
|
|
+ Map<String, Long> map = (Map<String, Long>) future.get();
|
|
|
+ kdtotal = map.get("kdtotal");
|
|
|
+ total = map.get("total");
|
|
|
+ }
|
|
|
+
|
|
|
+ long finalKdtotal = kdtotal;
|
|
|
+ long finalTotal = total;
|
|
|
+ levelStatDTOs.forEach(o -> {
|
|
|
+ if (o.getId() != null) {
|
|
|
+ //当前老师各档位数量
|
|
|
+ int countNew;
|
|
|
+ if (levelShowAllPaper == 1) {
|
|
|
+ countNew = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), String.valueOf(o.getId()));
|
|
|
+ } else {
|
|
|
+ countNew = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), String.valueOf(o.getId()), finalBatchNo);
|
|
|
+ }
|
|
|
+ o.setCount(countNew);
|
|
|
+ //该档位考区内已定档数量
|
|
|
+ long gcountNew = paperRepo.countByQuestionIdAndLevelAndSubjectAndWorkId(questionId, String.valueOf(o.getId()), markSubject.getSubject(), marker.getWorkId());
|
|
|
+ o.setGcount((int) gcountNew);
|
|
|
+
|
|
|
+ o.setPt(levelMap.get(o.getId()).getPt());
|
|
|
+ o.setKdpt(levelMap.get(o.getId()).getKdpt());
|
|
|
+ double p = finalKdtotal == 0 ? 0 : (double) o.getCount() / finalKdtotal * 100;
|
|
|
+ BigDecimal bd = new BigDecimal(p).setScale(3, RoundingMode.HALF_EVEN);
|
|
|
+ o.setPercent(bd.doubleValue());
|
|
|
+ o.setFinalKdTotal(Math.toIntExact(finalKdtotal));
|
|
|
+
|
|
|
+ o.setGcount(Objects.isNull(o.getGcount()) ? 0 : o.getGcount());
|
|
|
+ double gp = finalTotal == 0 ? 0 : (double) o.getGcount() / finalTotal * 100;
|
|
|
+ BigDecimal gbd = new BigDecimal(gp).setScale(3, RoundingMode.HALF_EVEN);
|
|
|
+ o.setGpercent(gbd.doubleValue());
|
|
|
+ o.setFinalTotal(Math.toIntExact(finalTotal));
|
|
|
+ }
|
|
|
+ });
|
|
|
Collections.sort(levelStatDTOs, (o1, o2) -> {
|
|
|
if (o1.getId() == null || o2.getId() == null) {
|
|
|
return 1;
|
|
@@ -273,13 +365,10 @@ public class MakrerApi {
|
|
|
@RequestMapping(value = "{marker}/stat/scores", method = RequestMethod.GET)
|
|
|
public List<LevelStatDTO> scoreStats(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
|
|
|
List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
|
|
|
- long t1 = System.currentTimeMillis();
|
|
|
MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
|
|
|
List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
|
|
|
Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
|
|
|
Long batchNo = paperRepo.findMaxScoreBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
|
|
|
- long t2 = System.currentTimeMillis();
|
|
|
- System.out.println("s1:"+(t2-t1));
|
|
|
Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
|
|
|
|
|
|
@Override
|
|
@@ -292,27 +381,19 @@ public class MakrerApi {
|
|
|
return map;
|
|
|
}
|
|
|
});
|
|
|
- long t3 = System.currentTimeMillis();
|
|
|
- System.out.println("s2:"+(t3-t2));
|
|
|
LevelStatDTO levelStatDTO = new LevelStatDTO();
|
|
|
//求任务数为null的条数
|
|
|
// int totalCount = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.SCORE.ordinal(), false, batchNo);
|
|
|
int totalCount = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.SCORE.ordinal(), batchNo);
|
|
|
levelStatDTO.setCount(totalCount);
|
|
|
- long t4 = System.currentTimeMillis();
|
|
|
- System.out.println("s3:"+(t4-t3));
|
|
|
//查询改档
|
|
|
int shiftCount = markTaskRepo.countShiftByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
|
|
|
levelStatDTO.setShift(shiftCount);
|
|
|
- long t5 = System.currentTimeMillis();
|
|
|
- System.out.println("s4:"+(t5-t4));
|
|
|
//查询改档打分
|
|
|
// int shiftScoreCount = markTaskRepo.countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.SCORE.ordinal(), false);
|
|
|
int shiftScoreCount = markTaskRepo.countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.SCORE.ordinal());
|
|
|
levelStatDTO.setShiftScore(shiftScoreCount);
|
|
|
levelStatDTOs.add(levelStatDTO);
|
|
|
- long t6 = System.currentTimeMillis();
|
|
|
- System.out.println("s5:"+(t6-t5));
|
|
|
|
|
|
for (Level level : levels) {
|
|
|
//所有档位依次比较
|
|
@@ -328,15 +409,11 @@ public class MakrerApi {
|
|
|
levelStatDTOs.add(dto);
|
|
|
}
|
|
|
}
|
|
|
- long t7 = System.currentTimeMillis();
|
|
|
- System.out.println("s6:"+(t7-t6));
|
|
|
long total = 0L;
|
|
|
if (Objects.nonNull(future) && Objects.nonNull(future.get())) {
|
|
|
Map<String, Long> map = (Map<String, Long>) future.get();
|
|
|
total = map.get("total");
|
|
|
}
|
|
|
- long t8 = System.currentTimeMillis();
|
|
|
- System.out.println("s7:"+(t8-t7));
|
|
|
|
|
|
long finalTotal = total;
|
|
|
levelStatDTOs.forEach(o -> {
|
|
@@ -361,8 +438,90 @@ public class MakrerApi {
|
|
|
o.setCount(count);
|
|
|
}
|
|
|
});
|
|
|
- long t9 = System.currentTimeMillis();
|
|
|
- System.out.println("s8:"+(t9-t8));
|
|
|
+ return levelStatDTOs;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 评卷员打分数量
|
|
|
+ *
|
|
|
+ * @param marker 评卷员用户id
|
|
|
+ * @param questionId 试题id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @RequestMapping(value = "{marker}/stat/totalScores", method = RequestMethod.GET)
|
|
|
+ public List<LevelStatDTO> totalScores(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
|
|
|
+ List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
|
|
|
+ MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
|
|
|
+ List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
|
|
|
+ Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
|
|
|
+ Long batchNo = paperRepo.findMaxScoreBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
|
|
|
+ Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
|
|
|
+ @Override
|
|
|
+ public Map<String, Long> call() {
|
|
|
+ Map<String, Long> map = new HashMap<>();
|
|
|
+ //当前老师所有的评档次数(不分档位)
|
|
|
+// long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
|
|
|
+ long total = paperRepo.countByQuestionId(questionId);
|
|
|
+ map.put("total", total);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ LevelStatDTO levelStatDTO = new LevelStatDTO();
|
|
|
+ //求任务数为null的条数
|
|
|
+ int totalCount = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.SCORE.ordinal(), batchNo);
|
|
|
+ levelStatDTO.setCount(totalCount);
|
|
|
+ //查询改档
|
|
|
+ int shiftCount = markTaskRepo.countShiftByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
|
|
|
+ levelStatDTO.setShift(shiftCount);
|
|
|
+ //查询改档打分
|
|
|
+ int shiftScoreCount = markTaskRepo.countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.SCORE.ordinal());
|
|
|
+ levelStatDTO.setShiftScore(shiftScoreCount);
|
|
|
+ levelStatDTOs.add(levelStatDTO);
|
|
|
+
|
|
|
+ for (Level level : levels) {
|
|
|
+ //所有档位依次比较
|
|
|
+ long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
|
|
|
+ if (count == 0) {
|
|
|
+ LevelStatDTO dto = new LevelStatDTO();
|
|
|
+ dto.setId(level.getCode());
|
|
|
+ dto.setCount(0);
|
|
|
+ dto.setPercent(0.0);
|
|
|
+
|
|
|
+ //当前老师当前档位评档次数(所有考试)
|
|
|
+ dto.setCount(0);
|
|
|
+ levelStatDTOs.add(dto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ long total = 0L;
|
|
|
+ if (Objects.nonNull(future) && Objects.nonNull(future.get())) {
|
|
|
+ Map<String, Long> map = (Map<String, Long>) future.get();
|
|
|
+ total = map.get("total");
|
|
|
+ }
|
|
|
+
|
|
|
+ long finalTotal = total;
|
|
|
+ levelStatDTOs.forEach(o -> {
|
|
|
+ if (o.getId() != null) {
|
|
|
+ o.setPt(levelMap.get(o.getId()).getPt());
|
|
|
+ o.setKdpt(levelMap.get(o.getId()).getKdpt());
|
|
|
+ o.setCount(Objects.isNull(o.getCount()) ? 0 : o.getCount());
|
|
|
+ o.setPercent(0D);
|
|
|
+
|
|
|
+ o.setGcount(Objects.isNull(o.getGcount()) ? 0 : o.getGcount());
|
|
|
+ double gp = (double) o.getGcount() / finalTotal;
|
|
|
+ BigDecimal gbd = new BigDecimal(gp).setScale(3, RoundingMode.HALF_EVEN);
|
|
|
+ o.setGpercent(gbd.doubleValue());
|
|
|
+ o.setFinalTotal(Math.toIntExact(finalTotal));
|
|
|
+
|
|
|
+ int count;
|
|
|
+ if (ParamCache.paramMap.get(marker.getWorkId()).getScoreShowAllPaper() == 1) {
|
|
|
+ count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString());
|
|
|
+ } else {
|
|
|
+ count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString(), batchNo);
|
|
|
+ }
|
|
|
+ o.setPercent(count == 0 ? 0 : o.getPercent());
|
|
|
+ o.setCount(count);
|
|
|
+ }
|
|
|
+ });
|
|
|
return levelStatDTOs;
|
|
|
}
|
|
|
|